superedit-SYNC_LDAP_PERMS.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. <?php
  2. /**
  3. * Synchronizacja kont z bazy danych do servera LDAP
  4. *
  5. * $rcmail_config['address_book_type'] = 'sql';
  6. $rcmail_config['ldap_public'] = array();
  7. $rcmail_config['ldap_public']['localhost'] = array(
  8. 'name' => 'localhost',
  9. 'hosts' => array('127.0.0.1'),
  10. 'port' => 389,
  11. 'base_dn' => 'cn=users,dc=biall,dc=pl',
  12. 'search_base_dn' => '',
  13. 'required_fields' => array('cn', 'sn', 'mail'),
  14. 'filter' => '(&(!(uid=_*))(mail=*@*))',
  15. 'search_dn_default' => '',
  16. 'LDAP_Object_Classes' => array('top', 'inetOrgPerson'),
  17. 'search_fields' => array('givenName', 'cn', 'sn', 'mail'),
  18. 'fieldmap' => array(
  19. // Roundcube => LDAP
  20. 'name' => 'cn',
  21. 'surname' => 'sn',
  22. 'firstname' => 'givenName',
  23. 'email' => 'mail',
  24. 'phone:work' => 'telephoneNumber'
  25. ),
  26. 'LDAP_rdn' => 'mail',
  27. 'ldap_version' => 3,
  28. 'scope' => 'sub',
  29. 'fuzzy_search' => true
  30. );
  31. *
  32. */
  33. function SYNC_LDAP_PERMS() {
  34. SE_Layout::menu();
  35. echo '<div class="container">';
  36. echo '<h1>' . "Synchronizacja uprawnień do bazy LDAP" . '</h1>';
  37. $DBG = ('1' == V::get('DBG_SLP', '', $_GET));
  38. if ('' !== ($userName = V::get('syncUsr', '', $_GET))) {
  39. Lib::loadClass('UserStorageFactory');
  40. $usrStorageDB = UserStorageFactory::getStorage('DB');
  41. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  42. if (!$usrStorageDB || !$usrStorageLdap) {
  43. echo '<p>Error storage not exists</p>';
  44. }
  45. else {
  46. echo '<h4>Synchronizacja użytkownika '.$userName.'</h4>';
  47. $usrFrom = $usrStorageDB->getUser($userName);
  48. if ($usrFrom) {
  49. Lib::loadClass('ProcesHelper');
  50. $zasobUprawnienia = ProcesHelper::getZasobTableID('CRM_AUTH_PROFILE');
  51. if ($zasobUprawnienia > 0) {
  52. echo '<p>' . "Ustal stanowisko: ";
  53. echo '<a href="index.php?MENU_INIT=USER_ADD_GROUP&usrLogin='.$usrFrom->login.'">ustal stanowisko</a>';
  54. echo '</p>';
  55. }
  56. }
  57. Lib::loadClass('SyncUsers');
  58. $synUsers = new SyncUsers($usrStorageDB, $usrStorageLdap);
  59. $syncTodoList = $synUsers->getSyncUserTodoList($userName, $syncGroups = true, $syncDisabled = true);
  60. ?>
  61. <?php if (empty($syncTodoList)) : ?>
  62. <div class="alert alert-info">Brak zadań do wykonania - użytkownik zsynchronizowany</div>
  63. <?php else : ?>
  64. <div class="well">
  65. <p>Lista zadań do wykonania:</p>
  66. <ul>
  67. <?php foreach ($syncTodoList as $vTask) : ?>
  68. <li><?php echo $vTask; ?></li>
  69. <?php endforeach; ?>
  70. </ul>
  71. </div>
  72. <?php endif; ?>
  73. <?php
  74. if ('1' == V::get('_runSync', '', $_POST)) {
  75. $synced = $synUsers->syncUser($userName, $syncGroups = true, $syncDisabled = true);
  76. if (!$synced) {
  77. ?>
  78. <div class="alert alert-danger">
  79. Nie udało się zsynchronizować uprawnień użytkownika <?php echo $userName; ?>.
  80. </div>
  81. <?php
  82. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;display:none;">errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($synUsers->getErrorsMsgListWithDbg());echo'</pre>';
  83. }
  84. else {
  85. ?>
  86. <div class="alert alert-success">
  87. Synchronizacja uprawnień użytkownika <?php echo $userName; ?> zakończona powodzeniem.
  88. </div>
  89. <?php
  90. }
  91. }
  92. else {
  93. ?>
  94. <form action="" method="POST">
  95. <input type="hidden" name="_runSync" value="1">
  96. <input type="submit" value="Synchronizuj" class="btn btn-primary btn-big">
  97. </form>
  98. <?php
  99. }
  100. }
  101. return;
  102. }
  103. if ('' !== ($userName = V::get('syncUsrDisabled', '', $_GET))) {// TEST
  104. Lib::loadClass('UserStorageFactory');
  105. $usrStorageDB = UserStorageFactory::getStorage('DB');
  106. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  107. if (!$usrStorageDB || !$usrStorageLdap) {
  108. echo '<p>Error storage not exists</p>';
  109. }
  110. else {
  111. Lib::loadClass('SyncUsers');
  112. $synUsers = new SyncUsers($usrStorageDB, $usrStorageLdap);
  113. $synced = $synUsers->syncDisabled($userName);
  114. if (!$synced) {
  115. ?>
  116. <div class="alert alert-danger">
  117. Nie udało się zsynchronizować uprawnień użytkownika <?php echo $userName; ?>.
  118. </div>
  119. <?php
  120. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;display:none;">errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($synUsers->getErrorsMsgListWithDbg());echo'</pre>';
  121. }
  122. else {
  123. ?>
  124. <div class="alert alert-success">
  125. Synchronizacja uprawnień użytkownika <?php echo $userName; ?> zakończona powodzeniem.
  126. </div>
  127. <?php
  128. }
  129. }
  130. return;
  131. }
  132. if ('checkGroups' == V::get('TEST', '', $_GET)) {
  133. $DBG = 1;
  134. $zasobyGroupsTreeRoot = UsersHelper::getGroupsTreeRoot();
  135. $zasobyGroups = UsersHelper::getGroupsTreeItems();
  136. if($DBG){
  137. if($DBG > 1){
  138. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroups (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroups);echo'</pre>';
  139. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroupsTreeRoot (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroupsTreeRoot);echo'</pre>';
  140. }
  141. // print tree stanowiska
  142. function tmpPrintTreeItem($vGroup) {
  143. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  144. $userGroups = UsersHelper::getGroupByUserName($userName);
  145. }
  146. if (is_array($userGroups) && !empty($userGroups) && array_key_exists($vGroup->ID, $userGroups)) {
  147. echo '<span style="color:red">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  148. } else if (in_array($vGroup->TYPE, array('DZIAL', 'PODMIOT'))) {
  149. echo '<span style="color:silver">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  150. } else {
  151. echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}";
  152. }
  153. }
  154. function tmpPrintTreeRec($treeIds, $items, $callback) {
  155. echo '<ul>';
  156. foreach ($treeIds as $vID) {
  157. $vGroup = $items[$vID];
  158. echo '<li>';
  159. $callback($vGroup);
  160. if (!empty($vGroup->sub)) {
  161. tmpPrintTreeRec($vGroup->sub, $items, $callback);
  162. }
  163. echo '</li>';
  164. }
  165. echo '</ul>';
  166. }
  167. tmpPrintTreeRec($zasobyGroupsTreeRoot, $zasobyGroups, tmpPrintTreeItem);
  168. // tree flat
  169. }
  170. $groupsLdapAll = UsersLdapHelper::getGroupsAll($allAttrs = false);
  171. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">groupsLdapAll (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($groupsLdapAll);echo'</pre>';}
  172. }
  173. if (0 < ($syncGroupID = V::get('syncGroup', 0, $_GET, 'int'))) {
  174. Lib::loadClass('UserStorageFactory');
  175. $usrStorageDB = UserStorageFactory::getStorage('DB');
  176. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  177. if (!$usrStorageDB || !$usrStorageLdap) {
  178. echo '<div class="alert alert-danger">' . "Error storage not exists" . '</div>';
  179. }
  180. else {
  181. $groupFrom = $usrStorageDB->getGroup($syncGroupID);
  182. if (!$groupFrom) {
  183. $db = DB::getDB();
  184. $zasob = $db->get_by_id('CRM_LISTA_ZASOBOW', $syncGroupID);
  185. if (!$zasob) {
  186. echo '<div class="alert alert-danger">' . "Zasób {$syncGroupID} nie istnieje" . '</div>';
  187. } else {
  188. echo '<div class="alert alert-danger">' . "Zasób {$syncGroupID} nie jest grupą tylko {$zasob->TYPE}" . '</div>';
  189. }
  190. }
  191. else {
  192. ?>
  193. <h4>Synchronizacja grupy: <?php echo $syncGroupID; ?></h4>
  194. <p>Ustal powiązania między grupami uprawnień - <a href="index.php?MENU_INIT=GROUP_ADD_NESTEDGROUPS&groupID=<?php echo $syncGroupID; ?>">grupy uprawnień</a></p>
  195. <?php
  196. Lib::loadClass('SyncUsers');
  197. $synUsers = new SyncUsers($usrStorageDB, $usrStorageLdap);
  198. $syncTodoList = $synUsers->getSyncGroupTodoList($syncGroupID, $syncNestedGroups = true);
  199. ?>
  200. <?php if (empty($syncTodoList)) : ?>
  201. <div class="alert alert-info">Brak zadań do wykonania - grupa zsynchronizowana</div>
  202. <?php else : ?>
  203. <div class="well">
  204. <p>Lista zadań do wykonania:</p>
  205. <ul>
  206. <?php foreach ($syncTodoList as $vTask) : ?>
  207. <li><?php echo $vTask; ?></li>
  208. <?php endforeach; ?>
  209. </ul>
  210. </div>
  211. <?php endif; ?>
  212. <?php
  213. if ('1' == V::get('_runSync', '', $_POST)) {
  214. $synced = $synUsers->syncGroup($syncGroupID, $syncNestedGroups = true);
  215. if (!$synced) {
  216. ?>
  217. <div class="alert alert-danger">
  218. Nie udało się zsynchronizować grupy [<?php echo $syncGroupID; ?>].
  219. </div>
  220. <?php
  221. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;display:none;">errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($synUsers->getErrorsMsgListWithDbg());echo'</pre>';
  222. }
  223. else {
  224. ?>
  225. <div class="alert alert-success">
  226. Synchronizacja grupy [<?php echo $syncGroupID; ?>] zakończona powodzeniem.
  227. </div>
  228. <?php
  229. }
  230. }
  231. else {
  232. ?>
  233. <form action="" method="POST">
  234. <input type="hidden" name="_runSync" value="1">
  235. <input type="submit" value="Synchronizuj" class="btn btn-primary btn-big">
  236. </form>
  237. <?php
  238. }
  239. }
  240. }
  241. return;
  242. }
  243. if ('123' !== V::get('TEST', '', $_GET)) {// below is a test
  244. ?>
  245. <div class="alert alert-danger">
  246. <p>Brak dostępu</p>
  247. </div>
  248. <?php
  249. return;
  250. }
  251. Lib::loadClass('UsersHelper');
  252. Lib::loadClass('UsersLdapHelper');
  253. Lib::loadClass('LDAP');
  254. $ldap = LDAP::getInstance();
  255. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">ldap (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($ldap);echo'</pre>';}
  256. if ('createLdapUsr' == V::get('task', '', $_GET)) {
  257. if ('' !== ($userName = V::get('checkUser', '', $_GET))) {
  258. $usrLdap = UsersLdapHelper::getUser($userName, true);
  259. $usrDB = UsersHelper::getUserByName($userName);
  260. if ($usrDB && !$usrLdap) {
  261. ?>
  262. <div style="border:1px solid green;">OK jest DB i brak LDAP
  263. <?php
  264. Lib::loadClass('MacOSX');
  265. $mac = MacOSX::getInstance();
  266. $created = $mac->createUser($usrDB->ADM_ACCOUNT, $usrDB->EMPLOYEE_TYPE, $usrDB->ADM_NAME, $usrDB->EMAIL, $usrDB->ADM_PASSWD);
  267. if ($created) {
  268. $db = DB::getDB();
  269. $sql = "update `ADMIN_USERS` set `A_SYNC_LDAP_DATE`=NOW() where `ID`='{$usrDB->ID}'; ";
  270. $db->query($sql);
  271. }
  272. ?>
  273. </div>
  274. <?php
  275. } else {
  276. echo '<p>Error: TODO (L.' . __LINE__ . ') ???</p>';
  277. }
  278. }
  279. }
  280. if ('' !== ($userName = V::get('checkUser', '', $_GET))) {
  281. // checkUser
  282. $usrLdap = UsersLdapHelper::getUser($userName, true);
  283. $usrDB = UsersHelper::getUserByName($userName);
  284. ?>
  285. <table style="width:100%">
  286. <tr>
  287. <td style="width:50%;vertical-align:top;">
  288. <?php echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">usrDB (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($usrDB);echo'</pre>'; ?>
  289. </td>
  290. <td style="width:50%;vertical-align:top;">
  291. <?php echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">usrLdap (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($usrLdap);echo'</pre>'; ?>
  292. </td>
  293. </tr>
  294. </table>
  295. <?php
  296. Lib::loadClass('MacOSX');
  297. $mac = MacOSX::getInstance();
  298. $sysGroups = $mac->getUserGroups($userName);
  299. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sysGroups (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sysGroups);echo'</pre>';
  300. if ($usrDB && $usrLdap) {
  301. echo '<p>OK jest DB i LDAP</p>';
  302. } else if (!$usrDB) {
  303. echo '<p>Brak DB</p>';
  304. } else if (!$usrLdap) {
  305. ?>
  306. <p>Brak LDAP
  307. <a href="index.php?MENU_INIT=SYNC_LDAP_PERMS&checkUser=<?php echo $userName; ?>&task=createLdapUsr">utwórz usera ldap na podstawie danych w bazie</a>
  308. </p>
  309. <?php
  310. }
  311. if (V::get('syncUser', '', $_GET) > 0) {
  312. $errorMsg = '';
  313. if (!$ldap->bindDiradmin($errorMsg)) {
  314. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">Error: cant bind as diradmin (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($errorMsg);echo'</pre>';
  315. } else {
  316. $attr = array();
  317. $attr['telephoneNumber'] = $usrDB->ADM_PHONE;
  318. $ldap->mod_replace($userName, $attr);
  319. //$attr = array();
  320. //$attr['homePhone'] = $usrDB->ADM_PHONE;
  321. //$ret = $ldap->mod_del($userName, $attr);
  322. }
  323. }
  324. }
  325. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  326. $ldapUser = array();
  327. $filter = (false !== strpos($userName, '@'))? "(mail={$userName})" : "(uid={$userName})";
  328. //$filter = "cn=*";// show all ldap accounts
  329. $justthese = array();//array("uid", "givenName", "mail", "*");
  330. $res = $ldap->search($filter, 'cn=users', $justthese);
  331. if ($ldap->count_entries($res) > 0) {
  332. $entry = $ldap->first_entry($res);
  333. if ($entry) {
  334. $ldapUser['user_dn'] = $ldap->get_dn($entry);
  335. $val = $ldap->get_values($entry, 'uid');
  336. $ldapUser['uid'] = $val[0];
  337. $val = $ldap->get_values($entry, 'mail');
  338. $ldapUser['mail'] = $val[0];
  339. $val = $ldap->get_values($entry, 'cn');
  340. $ldapUser['cn'] = $val[0];
  341. } else {
  342. echo 'Login nie istnieje';
  343. return false;
  344. }
  345. }
  346. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">ldapUser (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($ldapUser);echo'</pre>';}
  347. $userLdapGroups = UsersLdapHelper::getUserGroups($userName);
  348. $userGroups = UsersHelper::getGroupByUserName($userName);
  349. $gidNumbers = array();
  350. if (!empty($userLdapGroups)) {
  351. foreach ($userLdapGroups as $vLdapGroup) {
  352. $gidNumbers[] = $vLdapGroup->gidNumber;
  353. }
  354. }
  355. $groupsAll = UsersHelper::getGroupsByLdapGids($gidNumbers);
  356. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">groupsAll (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($groupsAll);echo'</pre>';}
  357. $zasobyGroupsTreeRoot = UsersHelper::getGroupsTreeRoot();
  358. $zasobyGroups = UsersHelper::getGroupsTreeItems();
  359. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">treeZasoby (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($treeZasoby);echo'</pre>';}
  360. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroups (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroups);echo'</pre>';}
  361. if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroupsTreeRoot (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroupsTreeRoot);echo'</pre>';}
  362. // print tree stanowiska
  363. function tmpPrintTreeItem($vGroup) {
  364. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  365. $userGroups = UsersHelper::getGroupByUserName($userName);
  366. }
  367. if (array_key_exists($vGroup->ID, $userGroups)) {
  368. echo '<span style="color:red">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  369. } else if (in_array($vGroup->TYPE, array('DZIAL', 'PODMIOT'))) {
  370. echo '<span style="color:silver">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  371. } else {
  372. echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}";
  373. }
  374. }
  375. function tmpPrintTreeRec($treeIds, $items, $callback) {
  376. echo '<ul>';
  377. foreach ($treeIds as $vID) {
  378. $vGroup = $items[$vID];
  379. echo '<li>';
  380. $callback($vGroup);
  381. if (!empty($vGroup->sub)) {
  382. tmpPrintTreeRec($vGroup->sub, $items, $callback);
  383. }
  384. echo '</li>';
  385. }
  386. echo '</ul>';
  387. }
  388. tmpPrintTreeRec($zasobyGroupsTreeRoot, $zasobyGroups, tmpPrintTreeItem);
  389. // tree flat
  390. ?>
  391. <table>
  392. <tr><th>LDAP Groups (<?php echo $userName; ?>)</th><th>Zasoby Groups (<?php echo $userName; ?>)</th></tr>
  393. <tr>
  394. <td style="width:50%">
  395. <select size="5" class="span5">
  396. <?php $total = 0; foreach ($userLdapGroups as $vLDAPGroup) : ?>
  397. <?php if (true) : $total += 1; ?>
  398. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  399. <?php endif; ?>
  400. <?php endforeach; ?>
  401. </select>
  402. <?php echo $total; ?>
  403. </td>
  404. <td>
  405. <select size="5" class="span5">
  406. <?php $total = 0; foreach ($userGroups as $vGroup) : ?>
  407. <?php if (true) : $total += 1; ?>
  408. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}/{$vGroup->A_LDAP_GID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  409. <?php endif; ?>
  410. <?php endforeach; ?>
  411. </select>
  412. <?php echo $total; ?>
  413. </td>
  414. </tr>
  415. </table>
  416. <?php
  417. }
  418. if (1) {
  419. if (V::get('groups_connect', '', $_POST)) {
  420. $ldap_gid = V::get('ldap_gid', 0, $_POST);
  421. $zasob_id = V::get('zasob_id', 0, $_POST);
  422. if ($ldap_gid > 0 && $zasob_id > 0) {
  423. $sqlObj = new stdClass();
  424. $sqlObj->ID = $zasob_id;
  425. $sqlObj->A_LDAP_GID = $ldap_gid;
  426. $db = DB::getDB();
  427. $ret = $db->UPDATE_OBJ('CRM_LISTA_ZASOBOW', $sqlObj);
  428. if ($ret > 0) {
  429. echo '<div class="alert alert-success">';
  430. echo "Rekord zapisany pomyślnie";
  431. echo '</div>';
  432. } else if ($ret == 0) {
  433. echo '<div class="alert alert-info">';
  434. echo "Nie wprowadzono żadnych zmian";
  435. echo '</div>';
  436. } else {
  437. echo '<div class="alert alert-danger">';
  438. echo "Database Error";
  439. echo '</div>';
  440. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($db->get_errors());echo'</pre>';
  441. }
  442. }
  443. }
  444. if (V::get('group_add', '', $_POST)) {
  445. $zasob_id = V::get('zasob_id', 0, $_POST);
  446. if ($zasob_id > 0) {
  447. $db = DB::getDB();
  448. $zasob = $db->get_by_id('CRM_LISTA_ZASOBOW', $zasob_id);
  449. if ($zasob) {
  450. if (in_array($zasob->TYPE, array('STANOWISKO', 'DZIAL', 'PODMIOT'))) {
  451. $ldap_gid = 0;
  452. // TODO: search for free GID
  453. $allLdapGroups = UsersLdapHelper::getGroupsAll();
  454. $ldapGids = array();
  455. foreach ($allLdapGroups as $vLdapGroup) {
  456. $ldapGids[] = $vLdapGroup->gidNumber;
  457. }
  458. $allGroups = UsersHelper::getGroupsAll();
  459. $dbGids = array_keys($allGroups);
  460. if ($zasob->ID > 1050 && !in_array($zasob->ID, $ldapGids)) {
  461. $ldap_gid = $zasob->ID;
  462. } else {
  463. for ($i = 10000 + $zasob->ID; $i < 20000 + $zasob->ID; $i++) {
  464. if (!in_array($i, $ldapGids) && !in_array($i, $dbGids)) {
  465. $ldap_gid = $i;
  466. break;
  467. }
  468. }
  469. }
  470. if ($ldap_gid) {
  471. $ldapUser = User::getName();
  472. $ldapPass = V::get('pass', '', $_POST);
  473. $newGroup = new stdClass();
  474. $newGroup->nameShort = mb_substr($zasob->DESC, 0, 50, 'utf8');
  475. $newGroup->name = $zasob->ID . '_' . $newGroup->nameShort;
  476. $newGroup->name = str_replace(' ' , '_', $newGroup->name);
  477. $pl_letters = array('ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż', 'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż');
  478. $en_letters = array('a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z', 'A', 'C', 'E', 'L', 'N', 'O', 'S', 'Z', 'Z');
  479. $newGroup->name = str_replace($pl_letters , $en_letters, $newGroup->name);
  480. $newGroup->name = preg_replace('/[^a-z0-9-_]/i' , '', $newGroup->name);
  481. $newGroup->realName = "[{$zasob->ID}] {$zasob->TYPE} {$newGroup->nameShort}";
  482. $newGroup->gidNumber = $ldap_gid;
  483. $command1="dscl -u {$ldapUser} -P {$ldapPass} /LDAPv3/127.0.0.1 -create /Groups/{$newGroup->name} PrimaryGroupID {$newGroup->gidNumber}";
  484. $command2="dscl -u {$ldapUser} -P {$ldapPass} /LDAPv3/127.0.0.1 -create /Groups/{$newGroup->name} RealName \"{$newGroup->realName}\" ";
  485. $return_dscl1 = system($command1, $retVal1);
  486. $return_dscl2 = system($command2, $retVal2);
  487. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;"> (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r(array($command1, $command2));echo'</pre>';
  488. if ($retVal1 === 0 && $retVal2 === 0) {
  489. echo '<div class="alert alert-success">';
  490. echo "Grupę utworzono pomyślnie";
  491. echo '</div>';
  492. $sqlObj = new stdClass();
  493. $sqlObj->ID = $zasob->ID;
  494. $sqlObj->A_LDAP_GID = $newGroup->gidNumber;
  495. $db = DB::getDB();
  496. $ret = $db->UPDATE_OBJ('CRM_LISTA_ZASOBOW', $sqlObj);
  497. if ($ret > 0) {
  498. echo '<div class="alert alert-success">';
  499. echo "Grupę LDAP ({$newGroup->gidNumber}) przypisano pomyślnie do zasobu {$zasob->ID}";
  500. echo '</div>';
  501. } else if ($ret < 0) {
  502. echo '<div class="alert alert-danger">';
  503. echo "Database Error";
  504. echo '</div>';
  505. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">db errors: (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($db->get_errors());echo'</pre>';
  506. }
  507. }
  508. else {
  509. echo '<div class="alert alert-danger">';
  510. echo "Error Cant create LDAP Group";
  511. echo '</div>';
  512. }
  513. } else {
  514. echo '<div class="alert alert-danger">';
  515. echo "Error Cant find free Ldap GID";
  516. echo '</div>';
  517. }
  518. $zasob->DESC;// TODO: clean from bad chars
  519. } else {
  520. echo '<div class="alert alert-danger">';
  521. echo "Error TYPE {$zasob->TYPE}";
  522. echo '</div>';
  523. }
  524. }
  525. }
  526. }
  527. Lib::loadClass('UsersHelper');
  528. $allLdapGroups = UsersLdapHelper::getGroupsAll();
  529. $allGroups = UsersHelper::getGroupsAll();
  530. $groupsConnected = array();
  531. foreach ($allGroups as $vGroup) {
  532. if ($vGroup->A_LDAP_GID > 0) {
  533. $groupsConnected[] = $vGroup->A_LDAP_GID;
  534. }
  535. }
  536. ?>
  537. <table style="border-bottom:2px solid #eee;">
  538. <tr><th>All LDAP Groups</th><th>All Zasoby Groups</th></tr>
  539. <tr>
  540. <td style="width:50%">
  541. <select class="span5">
  542. <?php $total = 0; foreach ($allLdapGroups as $vLDAPGroup) : ?>
  543. <?php if (true) : $total += 1; ?>
  544. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  545. <?php endif; ?>
  546. <?php endforeach; ?>
  547. </select>
  548. (<?php echo $total; ?>)
  549. </td>
  550. <td>
  551. <select class="span5">
  552. <?php $total = 0; foreach ($allGroups as $vGroup) : ?>
  553. <?php if (true) : $total += 1; ?>
  554. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  555. <?php endif; ?>
  556. <?php endforeach; ?>
  557. </select>
  558. (<?php echo $total; ?>)
  559. </td>
  560. </tr>
  561. <tr style="display:none">
  562. <td style="width:50%">
  563. <?php
  564. echo'<pre style="max-height:200px;overflow:auto;border:1px solid yellow;text-align:left;">allLdapGroups('.count($allLdapGroups).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($allLdapGroups);echo'</pre>';
  565. ?>
  566. </td>
  567. <td>
  568. <?php
  569. echo'<pre style="max-height:200px;overflow:auto;border:1px solid yellow;text-align:left;">allGroups('.count($allGroups).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($allGroups);echo'</pre>';
  570. ?>
  571. </td>
  572. </tr>
  573. <tr>
  574. <th colspan="2" style="border-top:2px solid #eee;">
  575. Połącz Zasoby z Grupami na serwerze LDAP
  576. </th>
  577. </tr>
  578. <tr>
  579. <td colspan="2">
  580. <div class="span10 offset2">
  581. <form class="form form-horizontal" method="post">
  582. <label for="zasob_id">Zasób: </label>
  583. <select name="zasob_id" class="span5">
  584. <option value=""> [ wybierz ] </option>
  585. <?php $total = 0; foreach ($allGroups as $vGroup) : ?>
  586. <?php if ($vGroup->A_LDAP_GID == 0) : $total += 1; ?>
  587. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  588. <?php endif; ?>
  589. <?php endforeach; ?>
  590. </select>
  591. (<?php echo $total; ?>)
  592. <input type="password" name="pass" placeholder="hasło" class="span2">
  593. <input type="submit" class="btn btn-primary" name="group_add" value="Utwórz grupę w LDAP">
  594. <label for="ldap_gid">Grupa LDAP: </label>
  595. <select name="ldap_gid" class="span5">
  596. <option value=""> [ wybierz ] </option>
  597. <?php $total = 0; foreach ($allLdapGroups as $vLDAPGroup) : ?>
  598. <?php if (!in_array($vLDAPGroup->gidNumber, $groupsConnected)) : $total += 1; ?>
  599. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  600. <?php endif; ?>
  601. <?php endforeach; ?>
  602. </select>
  603. (<?php echo $total; ?>)
  604. <input type="submit" class="btn btn-primary" name="groups_connect" value="Połącz">
  605. </form>
  606. </div>
  607. </td>
  608. </tr>
  609. </table>
  610. <?php
  611. }
  612. if (1) {
  613. $allLdapUsers = UsersLdapHelper::getUsersAll();
  614. $allUsers = UsersHelper::getUsersAll();
  615. //if($DBG){echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">allLdapUsers (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($allLdapUsers);echo'</pre>';}
  616. // ldap.uid == db.ADM_ACCOUNT
  617. $usersDB = array();
  618. $usersLDAP = array();
  619. $usersConnected = array();
  620. foreach ($allUsers as $vDBUser) {
  621. $usersDB[] = $vDBUser->ADM_ACCOUNT;
  622. }
  623. foreach ($allLdapUsers as $vLDAPUser) {
  624. $usersLDAP[] = $vLDAPUser->uid;
  625. }
  626. // array czesc wspolna
  627. foreach ($usersDB as $vLogin) {
  628. if (in_array($vLogin, $usersLDAP)) {
  629. $usersConnected[] = $vLogin;
  630. }
  631. }
  632. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">$usersConnected (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($usersConnected);echo'</pre>';
  633. ?>
  634. <table>
  635. <tr><th>LDAP Users (ok)</th><th>DB Users (ok)</th></tr>
  636. <tr>
  637. <td style="width:50%">
  638. <select class="span5">
  639. <?php $total = 0; foreach ($allLdapUsers as $vLDAPUser) : ?>
  640. <?php if (in_array($vLDAPUser->uid, $usersConnected)) : $total += 1; ?>
  641. <option value="<?php echo $vLDAPUser->uid; ?>"><?php echo "[{$vLDAPUser->uidNumber}] {$vLDAPUser->uid}: {$vLDAPUser->cn}"; ?></option>
  642. <?php endif; ?>
  643. <?php endforeach; ?>
  644. </select>
  645. <?php echo $total; ?>
  646. </td>
  647. <td>
  648. <form method="get">
  649. <select class="span4">
  650. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  651. <?php if (in_array($vDBUser->ADM_ACCOUNT, $usersConnected)) : $total += 1; ?>
  652. <option value="<?php echo $vDBUser->ADM_ACCOUNT; ?>"><?php echo "[{$vDBUser->ID}] {$vDBUser->ADM_ACCOUNT}: {$vDBUser->ADM_NAME}"; ?></option>
  653. <?php endif; ?>
  654. <?php endforeach; ?>
  655. </select>
  656. <?php echo $total; ?>
  657. </form>
  658. </td>
  659. </tr>
  660. <tr><th>LDAP Users (todo)</th><th>DB Users (todo)</th></tr>
  661. <tr>
  662. <td style="width:50%">
  663. <select size="10" class="span5">
  664. <?php $total = 0; foreach ($allLdapUsers as $vLDAPUser) : ?>
  665. <?php if (!in_array($vLDAPUser->uid, $usersConnected)) : $total += 1; ?>
  666. <option value="<?php echo $vLDAPUser->uid; ?>"><?php echo "[{$vLDAPUser->uidNumber}] {$vLDAPUser->uid}: {$vLDAPUser->cn}"; ?></option>
  667. <?php endif; ?>
  668. <?php endforeach; ?>
  669. </select>
  670. <?php echo $total; ?>
  671. </td>
  672. <td>
  673. <select size="10" class="span5">
  674. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  675. <?php if (!in_array($vDBUser->ADM_ACCOUNT, $usersConnected) && $vDBUser->ADM_ADMIN_LEVEL < 6) : $total += 1; ?>
  676. <option value="<?php echo $vDBUser->ADM_ACCOUNT; ?>"><?php echo "[{$vDBUser->ID}] {$vDBUser->ADM_ACCOUNT}: {$vDBUser->ADM_NAME} ({$vDBUser->A_STATUS}:{$vDBUser->ADM_ADMIN_LEVEL})"; ?></option>
  677. <?php endif; ?>
  678. <?php endforeach; ?>
  679. </select>
  680. <?php echo $total; ?>
  681. </td>
  682. </tr>
  683. <tr><th></th><th>konta bez możliwości zalogwania się</th></tr>
  684. <tr>
  685. <td style="width:50%">
  686. </td>
  687. <td>
  688. <select size="10" class="span5">
  689. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  690. <?php if (!in_array($vDBUser->ADM_ACCOUNT, $usersConnected) && $vDBUser->ADM_ADMIN_LEVEL == 6) : $total += 1; ?>
  691. <option value="<?php echo $vDBUser->ADM_ACCOUNT; ?>"><?php echo "[{$vDBUser->ID}] {$vDBUser->ADM_ACCOUNT}: {$vDBUser->ADM_NAME} ({$vDBUser->A_STATUS}:{$vDBUser->ADM_ADMIN_LEVEL})"; ?></option>
  692. <?php endif; ?>
  693. <?php endforeach; ?>
  694. </select>
  695. <?php echo $total; ?>
  696. </td>
  697. </tr>
  698. <tr>
  699. <td style="width:50%">
  700. <?php
  701. echo'<pre style="max-height:200px;overflow:auto;border:1px solid yellow;text-align:left;">allLdapUsers('.count($allLdapUsers).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($allLdapUsers);echo'</pre>';
  702. ?>
  703. </td>
  704. <td>
  705. <?php
  706. echo'<pre style="max-height:200px;overflow:auto;border:1px solid yellow;text-align:left;">allUsers('.count($allUsers).') (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($allUsers);echo'</pre>';
  707. ?>
  708. </td>
  709. </tr>
  710. </table>
  711. <?php
  712. }
  713. if ('' !== ($addLdapGroup = V::get('addLdapGroup', '', $_GET))) {
  714. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">addLdapGroup (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($addLdapGroup);echo'</pre>';
  715. $res=DB::query("select ID,`TYPE`,`DESC` from CRM_LISTA_ZASOBOW where A_STATUS!='DELETED' and `TYPE` in ('STANOWISKO','DZIAL','PODMIOT') and PARENT_ID!='-1' ");
  716. while($h=DB::fetch($res)) {
  717. if(!isset($_SESSION['AUTH_LDAP_CLIENT__LDAP_GROUPS_ID_NAME'][$h->ID])) {
  718. echo "<font size=-3> Brak grupy [".$h->ID."] ".$h->TYPE." ".$h->DESC." , </font>";
  719. if (in_array($ADM_ACCOUNT,$_SESSION['AUTH_LDAP_CLIENT__LDAP_GROUPS']['admin'])) {
  720. $BAD_SIGNS = array(" ", "/", "\\", "!","(",")");
  721. if ($h->ID>1000) $PrimaryGroupID=$h->ID;
  722. else $PrimaryGroupID="99".$h->ID;
  723. $command1="dscl -u ".$ADM_ACCOUNT." -P ".$ADM_PASSWD." /LDAPv3/127.0.0.1 -create /Groups/".$h->ID."_".str_replace($_SESSION['CONFIG']['BAD_FILE_SIGNS_LETTERS'],$_SESSION['CONFIG']['OK_FILE_SIGNS_LETTERS'],str_replace($BAD_SIGNS,"_",substr($h->DESC,0,40)))." PrimaryGroupID ".$PrimaryGroupID."";
  724. $command2="dscl -u ".$ADM_ACCOUNT." -P ".$ADM_PASSWD." /LDAPv3/127.0.0.1 -create /Groups/".$h->ID."_".str_replace($_SESSION['CONFIG']['BAD_FILE_SIGNS_LETTERS'],$_SESSION['CONFIG']['OK_FILE_SIGNS_LETTERS'],str_replace($BAD_SIGNS,"_",substr($h->DESC,0,40)))." RealName \"[".$h->ID."] ".$h->TYPE." ".substr($h->DESC,0,50)."\" ";
  725. $return_dscl1=system($command1);
  726. $return_dscl2=system($command2);
  727. echo "\n<br><font size=-2>".$command1." return : ".$return_dscl1."</font>";
  728. echo "\n<br><font size=-2>".$command2." return : ".$return_dscl2."</font>";
  729. flush();
  730. $AKTUALIZOWALEM=true;
  731. }
  732. $BRAKI_W_LDAP=true;
  733. } else {
  734. unset($AUTH_LDAP_CLIENT__LDAP_GROUPS_ID_NAME[$h->ID]);
  735. }
  736. }
  737. }
  738. echo '</div>';// .container
  739. }