superedit-SYNC_LDAP_PERMS.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678
  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 ('' !== ($usrLogin = V::get('syncUsr', '', $_GET))) {
  39. ?>
  40. <div class="alert alert-info">
  41. Narzędzie zostało przeniesione do <a class="btn btn-primary" href="index.php?_route=Users&_task=syncUser&usrLogin=<?php echo $usrLogin; ?>">Sync user '<?php echo $usrLogin; ?>'</a>
  42. </div>
  43. <?php
  44. return;
  45. }
  46. if ('' !== ($userName = V::get('syncUsrDisabled', '', $_GET))) {// TEST
  47. Lib::loadClass('UserStorageFactory');
  48. $usrStorageDB = UserStorageFactory::getStorage('DB');
  49. $usrStorageLdap = UserStorageFactory::getStorage('MacOSX');
  50. if (!$usrStorageDB || !$usrStorageLdap) {
  51. echo '<p>Error storage not exists</p>';
  52. }
  53. else {
  54. Lib::loadClass('SyncUsers');
  55. $synUsers = new SyncUsers($usrStorageDB, $usrStorageLdap);
  56. $synced = $synUsers->syncDisabled($userName);
  57. if (!$synced) {
  58. ?>
  59. <div class="alert alert-danger">
  60. Nie udało się zsynchronizować uprawnień użytkownika <?php echo $userName; ?>.
  61. </div>
  62. <?php
  63. 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>';
  64. }
  65. else {
  66. ?>
  67. <div class="alert alert-success">
  68. Synchronizacja uprawnień użytkownika <?php echo $userName; ?> zakończona powodzeniem.
  69. </div>
  70. <?php
  71. }
  72. }
  73. return;
  74. }
  75. if ('checkGroups' == V::get('TEST', '', $_GET)) {
  76. $DBG = 1;
  77. $zasobyGroupsTreeRoot = UsersHelper::getGroupsTreeRoot();
  78. $zasobyGroups = UsersHelper::getGroupsTreeItems();
  79. if($DBG){
  80. if($DBG > 1){
  81. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroups (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroups);echo'</pre>';
  82. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">zasobyGroupsTreeRoot (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($zasobyGroupsTreeRoot);echo'</pre>';
  83. }
  84. // print tree stanowiska
  85. function tmpPrintTreeItem($vGroup) {
  86. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  87. $userGroups = UsersHelper::getGroupByUserName($userName);
  88. }
  89. if (is_array($userGroups) && !empty($userGroups) && array_key_exists($vGroup->ID, $userGroups)) {
  90. echo '<span style="color:red">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  91. } else if (in_array($vGroup->TYPE, array('DZIAL', 'PODMIOT'))) {
  92. echo '<span style="color:silver">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  93. } else {
  94. echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}";
  95. }
  96. }
  97. function tmpPrintTreeRec($treeIds, $items, $callback) {
  98. echo '<ul>';
  99. foreach ($treeIds as $vID) {
  100. $vGroup = $items[$vID];
  101. echo '<li>';
  102. $callback($vGroup);
  103. if (!empty($vGroup->sub)) {
  104. tmpPrintTreeRec($vGroup->sub, $items, $callback);
  105. }
  106. echo '</li>';
  107. }
  108. echo '</ul>';
  109. }
  110. tmpPrintTreeRec($zasobyGroupsTreeRoot, $zasobyGroups, tmpPrintTreeItem);
  111. // tree flat
  112. }
  113. $groupsLdapAll = UsersLdapHelper::getGroupsAll($allAttrs = false);
  114. 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>';}
  115. }
  116. if (0 < ($syncGroupID = V::get('syncGroup', 0, $_GET, 'int'))) {
  117. ?>
  118. <div class="alert alert-info">
  119. Narzędzie zostało przeniesione do <a class="btn btn-primary" href="index.php?_route=Users&_task=syncGroup&idGroup=<?php echo $syncGroupID; ?>">Sync group '<?php echo $syncGroupID; ?>'</a>
  120. </div>
  121. <?php
  122. return;
  123. }
  124. if ('123' !== V::get('TEST', '', $_GET)) {// below is a test
  125. ?>
  126. <div class="alert alert-danger">
  127. <p>Brak dostępu</p>
  128. </div>
  129. <?php
  130. return;
  131. }
  132. Lib::loadClass('UsersHelper');
  133. Lib::loadClass('UsersLdapHelper');
  134. Lib::loadClass('LDAP');
  135. $ldap = LDAP::getInstance();
  136. 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>';}
  137. if ('createLdapUsr' == V::get('task', '', $_GET)) {
  138. if ('' !== ($userName = V::get('checkUser', '', $_GET))) {
  139. $usrLdap = UsersLdapHelper::getUser($userName, true);
  140. $usrDB = UsersHelper::getUserByName($userName);
  141. if ($usrDB && !$usrLdap) {
  142. ?>
  143. <div style="border:1px solid green;">OK jest DB i brak LDAP
  144. <?php
  145. Lib::loadClass('MacOSX');
  146. $mac = MacOSX::getInstance();
  147. $created = $mac->createUser($usrDB->ADM_ACCOUNT, $usrDB->EMPLOYEE_TYPE, $usrDB->ADM_NAME, $usrDB->EMAIL, $usrDB->ADM_PASSWD);
  148. if ($created) {
  149. $db = DB::getDB();
  150. $sql = "update `ADMIN_USERS` set `A_SYNC_LDAP_DATE`=NOW() where `ID`='{$usrDB->ID}'; ";
  151. $db->query($sql);
  152. }
  153. ?>
  154. </div>
  155. <?php
  156. } else {
  157. echo '<p>Error: TODO (L.' . __LINE__ . ') ???</p>';
  158. }
  159. }
  160. }
  161. if ('' !== ($userName = V::get('checkUser', '', $_GET))) {
  162. // checkUser
  163. $usrLdap = UsersLdapHelper::getUser($userName, true);
  164. $usrDB = UsersHelper::getUserByName($userName);
  165. ?>
  166. <table style="width:100%">
  167. <tr>
  168. <td style="width:50%;vertical-align:top;">
  169. <?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>'; ?>
  170. </td>
  171. <td style="width:50%;vertical-align:top;">
  172. <?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>'; ?>
  173. </td>
  174. </tr>
  175. </table>
  176. <?php
  177. Lib::loadClass('MacOSX');
  178. $mac = MacOSX::getInstance();
  179. $sysGroups = $mac->getUserGroups($userName);
  180. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">sysGroups (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($sysGroups);echo'</pre>';
  181. if ($usrDB && $usrLdap) {
  182. echo '<p>OK jest DB i LDAP</p>';
  183. } else if (!$usrDB) {
  184. echo '<p>Brak DB</p>';
  185. } else if (!$usrLdap) {
  186. ?>
  187. <p>Brak LDAP
  188. <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>
  189. </p>
  190. <?php
  191. }
  192. if (V::get('syncUser', '', $_GET) > 0) {
  193. $errorMsg = '';
  194. if (!$ldap->bindDiradmin($errorMsg)) {
  195. 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>';
  196. } else {
  197. $attr = array();
  198. $attr['telephoneNumber'] = $usrDB->ADM_PHONE;
  199. $ldap->mod_replace($userName, $attr);
  200. //$attr = array();
  201. //$attr['homePhone'] = $usrDB->ADM_PHONE;
  202. //$ret = $ldap->mod_del($userName, $attr);
  203. }
  204. }
  205. }
  206. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  207. $ldapUser = array();
  208. $filter = (false !== strpos($userName, '@'))? "(mail={$userName})" : "(uid={$userName})";
  209. //$filter = "cn=*";// show all ldap accounts
  210. $justthese = array();//array("uid", "givenName", "mail", "*");
  211. $res = $ldap->search($filter, 'cn=users', $justthese);
  212. if ($ldap->count_entries($res) > 0) {
  213. $entry = $ldap->first_entry($res);
  214. if ($entry) {
  215. $ldapUser['user_dn'] = $ldap->get_dn($entry);
  216. $val = $ldap->get_values($entry, 'uid');
  217. $ldapUser['uid'] = $val[0];
  218. $val = $ldap->get_values($entry, 'mail');
  219. $ldapUser['mail'] = $val[0];
  220. $val = $ldap->get_values($entry, 'cn');
  221. $ldapUser['cn'] = $val[0];
  222. } else {
  223. echo 'Login nie istnieje';
  224. return false;
  225. }
  226. }
  227. 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>';}
  228. $userLdapGroups = UsersLdapHelper::getUserGroups($userName);
  229. $userGroups = UsersHelper::getGroupByUserName($userName);
  230. $gidNumbers = array();
  231. if (!empty($userLdapGroups)) {
  232. foreach ($userLdapGroups as $vLdapGroup) {
  233. $gidNumbers[] = $vLdapGroup->gidNumber;
  234. }
  235. }
  236. $groupsAll = UsersHelper::getGroupsByLdapGids($gidNumbers);
  237. 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>';}
  238. $zasobyGroupsTreeRoot = UsersHelper::getGroupsTreeRoot();
  239. $zasobyGroups = UsersHelper::getGroupsTreeItems();
  240. 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>';}
  241. 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>';}
  242. 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>';}
  243. // print tree stanowiska
  244. function tmpPrintTreeItem($vGroup) {
  245. if ('' !== ($userName = V::get('userName', '', $_GET))) {
  246. $userGroups = UsersHelper::getGroupByUserName($userName);
  247. }
  248. if (array_key_exists($vGroup->ID, $userGroups)) {
  249. echo '<span style="color:red">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  250. } else if (in_array($vGroup->TYPE, array('DZIAL', 'PODMIOT'))) {
  251. echo '<span style="color:silver">' . "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}" . '</span>';
  252. } else {
  253. echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}";
  254. }
  255. }
  256. function tmpPrintTreeRec($treeIds, $items, $callback) {
  257. echo '<ul>';
  258. foreach ($treeIds as $vID) {
  259. $vGroup = $items[$vID];
  260. echo '<li>';
  261. $callback($vGroup);
  262. if (!empty($vGroup->sub)) {
  263. tmpPrintTreeRec($vGroup->sub, $items, $callback);
  264. }
  265. echo '</li>';
  266. }
  267. echo '</ul>';
  268. }
  269. tmpPrintTreeRec($zasobyGroupsTreeRoot, $zasobyGroups, tmpPrintTreeItem);
  270. // tree flat
  271. ?>
  272. <table>
  273. <tr><th>LDAP Groups (<?php echo $userName; ?>)</th><th>Zasoby Groups (<?php echo $userName; ?>)</th></tr>
  274. <tr>
  275. <td style="width:50%">
  276. <select size="5" class="span5">
  277. <?php $total = 0; foreach ($userLdapGroups as $vLDAPGroup) : ?>
  278. <?php if (true) : $total += 1; ?>
  279. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  280. <?php endif; ?>
  281. <?php endforeach; ?>
  282. </select>
  283. <?php echo $total; ?>
  284. </td>
  285. <td>
  286. <select size="5" class="span5">
  287. <?php $total = 0; foreach ($userGroups as $vGroup) : ?>
  288. <?php if (true) : $total += 1; ?>
  289. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}/{$vGroup->A_LDAP_GID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  290. <?php endif; ?>
  291. <?php endforeach; ?>
  292. </select>
  293. <?php echo $total; ?>
  294. </td>
  295. </tr>
  296. </table>
  297. <?php
  298. }
  299. if (1) {
  300. if (V::get('groups_connect', '', $_POST)) {
  301. $ldap_gid = V::get('ldap_gid', 0, $_POST);
  302. $zasob_id = V::get('zasob_id', 0, $_POST);
  303. if ($ldap_gid > 0 && $zasob_id > 0) {
  304. $sqlObj = new stdClass();
  305. $sqlObj->ID = $zasob_id;
  306. $sqlObj->A_LDAP_GID = $ldap_gid;
  307. $db = DB::getDB();
  308. $ret = $db->UPDATE_OBJ('CRM_LISTA_ZASOBOW', $sqlObj);
  309. if ($ret > 0) {
  310. echo '<div class="alert alert-success">';
  311. echo "Rekord zapisany pomyślnie";
  312. echo '</div>';
  313. } else if ($ret == 0) {
  314. echo '<div class="alert alert-info">';
  315. echo "Nie wprowadzono żadnych zmian";
  316. echo '</div>';
  317. } else {
  318. echo '<div class="alert alert-danger">';
  319. echo "Database Error";
  320. echo '</div>';
  321. 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>';
  322. }
  323. }
  324. }
  325. if (V::get('group_add', '', $_POST)) {
  326. $zasob_id = V::get('zasob_id', 0, $_POST);
  327. if ($zasob_id > 0) {
  328. $db = DB::getDB();
  329. $zasob = $db->get_by_id('CRM_LISTA_ZASOBOW', $zasob_id);
  330. if ($zasob) {
  331. if (in_array($zasob->TYPE, array('STANOWISKO', 'DZIAL', 'PODMIOT'))) {
  332. $ldap_gid = 0;
  333. // TODO: search for free GID
  334. $allLdapGroups = UsersLdapHelper::getGroupsAll();
  335. $ldapGids = array();
  336. foreach ($allLdapGroups as $vLdapGroup) {
  337. $ldapGids[] = $vLdapGroup->gidNumber;
  338. }
  339. $allGroups = UsersHelper::getGroupsAll();
  340. $dbGids = array_keys($allGroups);
  341. if ($zasob->ID > 1050 && !in_array($zasob->ID, $ldapGids)) {
  342. $ldap_gid = $zasob->ID;
  343. } else {
  344. for ($i = 10000 + $zasob->ID; $i < 20000 + $zasob->ID; $i++) {
  345. if (!in_array($i, $ldapGids) && !in_array($i, $dbGids)) {
  346. $ldap_gid = $i;
  347. break;
  348. }
  349. }
  350. }
  351. if ($ldap_gid) {
  352. $ldapUser = User::getName();
  353. $ldapPass = V::get('pass', '', $_POST);
  354. $newGroup = new stdClass();
  355. $newGroup->nameShort = mb_substr($zasob->DESC, 0, 50, 'utf8');
  356. $newGroup->name = $zasob->ID . '_' . $newGroup->nameShort;
  357. $newGroup->name = str_replace(' ' , '_', $newGroup->name);
  358. $pl_letters = array('ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ź', 'ż', 'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ź', 'Ż');
  359. $en_letters = array('a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z', 'A', 'C', 'E', 'L', 'N', 'O', 'S', 'Z', 'Z');
  360. $newGroup->name = str_replace($pl_letters , $en_letters, $newGroup->name);
  361. $newGroup->name = preg_replace('/[^a-z0-9-_]/i' , '', $newGroup->name);
  362. $newGroup->realName = "[{$zasob->ID}] {$zasob->TYPE} {$newGroup->nameShort}";
  363. $newGroup->gidNumber = $ldap_gid;
  364. $command1="dscl -u {$ldapUser} -P {$ldapPass} /LDAPv3/127.0.0.1 -create /Groups/{$newGroup->name} PrimaryGroupID {$newGroup->gidNumber}";
  365. $command2="dscl -u {$ldapUser} -P {$ldapPass} /LDAPv3/127.0.0.1 -create /Groups/{$newGroup->name} RealName \"{$newGroup->realName}\" ";
  366. $return_dscl1 = system($command1, $retVal1);
  367. $return_dscl2 = system($command2, $retVal2);
  368. 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>';
  369. if ($retVal1 === 0 && $retVal2 === 0) {
  370. echo '<div class="alert alert-success">';
  371. echo "Grupę utworzono pomyślnie";
  372. echo '</div>';
  373. $sqlObj = new stdClass();
  374. $sqlObj->ID = $zasob->ID;
  375. $sqlObj->A_LDAP_GID = $newGroup->gidNumber;
  376. $db = DB::getDB();
  377. $ret = $db->UPDATE_OBJ('CRM_LISTA_ZASOBOW', $sqlObj);
  378. if ($ret > 0) {
  379. echo '<div class="alert alert-success">';
  380. echo "Grupę LDAP ({$newGroup->gidNumber}) przypisano pomyślnie do zasobu {$zasob->ID}";
  381. echo '</div>';
  382. } else if ($ret < 0) {
  383. echo '<div class="alert alert-danger">';
  384. echo "Database Error";
  385. echo '</div>';
  386. 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>';
  387. }
  388. }
  389. else {
  390. echo '<div class="alert alert-danger">';
  391. echo "Error Cant create LDAP Group";
  392. echo '</div>';
  393. }
  394. } else {
  395. echo '<div class="alert alert-danger">';
  396. echo "Error Cant find free Ldap GID";
  397. echo '</div>';
  398. }
  399. $zasob->DESC;// TODO: clean from bad chars
  400. } else {
  401. echo '<div class="alert alert-danger">';
  402. echo "Error TYPE {$zasob->TYPE}";
  403. echo '</div>';
  404. }
  405. }
  406. }
  407. }
  408. Lib::loadClass('UsersHelper');
  409. $allLdapGroups = UsersLdapHelper::getGroupsAll();
  410. $allGroups = UsersHelper::getGroupsAll();
  411. $groupsConnected = array();
  412. foreach ($allGroups as $vGroup) {
  413. if ($vGroup->A_LDAP_GID > 0) {
  414. $groupsConnected[] = $vGroup->A_LDAP_GID;
  415. }
  416. }
  417. ?>
  418. <table style="border-bottom:2px solid #eee;">
  419. <tr><th>All LDAP Groups</th><th>All Zasoby Groups</th></tr>
  420. <tr>
  421. <td style="width:50%">
  422. <select class="span5">
  423. <?php $total = 0; foreach ($allLdapGroups as $vLDAPGroup) : ?>
  424. <?php if (true) : $total += 1; ?>
  425. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  426. <?php endif; ?>
  427. <?php endforeach; ?>
  428. </select>
  429. (<?php echo $total; ?>)
  430. </td>
  431. <td>
  432. <select class="span5">
  433. <?php $total = 0; foreach ($allGroups as $vGroup) : ?>
  434. <?php if (true) : $total += 1; ?>
  435. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  436. <?php endif; ?>
  437. <?php endforeach; ?>
  438. </select>
  439. (<?php echo $total; ?>)
  440. </td>
  441. </tr>
  442. <tr style="display:none">
  443. <td style="width:50%">
  444. <?php
  445. 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>';
  446. ?>
  447. </td>
  448. <td>
  449. <?php
  450. 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>';
  451. ?>
  452. </td>
  453. </tr>
  454. <tr>
  455. <th colspan="2" style="border-top:2px solid #eee;">
  456. Połącz Zasoby z Grupami na serwerze LDAP
  457. </th>
  458. </tr>
  459. <tr>
  460. <td colspan="2">
  461. <div class="span10 offset2">
  462. <form class="form form-horizontal" method="post">
  463. <label for="zasob_id">Zasób: </label>
  464. <select name="zasob_id" class="span5">
  465. <option value=""> [ wybierz ] </option>
  466. <?php $total = 0; foreach ($allGroups as $vGroup) : ?>
  467. <?php if ($vGroup->A_LDAP_GID == 0) : $total += 1; ?>
  468. <option value="<?php echo $vGroup->ID; ?>"><?php echo "[{$vGroup->ID}] {$vGroup->TYPE} {$vGroup->DESC}"; ?></option>
  469. <?php endif; ?>
  470. <?php endforeach; ?>
  471. </select>
  472. (<?php echo $total; ?>)
  473. <input type="password" name="pass" placeholder="hasło" class="span2">
  474. <input type="submit" class="btn btn-primary" name="group_add" value="Utwórz grupę w LDAP">
  475. <label for="ldap_gid">Grupa LDAP: </label>
  476. <select name="ldap_gid" class="span5">
  477. <option value=""> [ wybierz ] </option>
  478. <?php $total = 0; foreach ($allLdapGroups as $vLDAPGroup) : ?>
  479. <?php if (!in_array($vLDAPGroup->gidNumber, $groupsConnected)) : $total += 1; ?>
  480. <option value="<?php echo $vLDAPGroup->gidNumber; ?>"><?php echo "[{$vLDAPGroup->gidNumber}] {$vLDAPGroup->cn}"; ?></option>
  481. <?php endif; ?>
  482. <?php endforeach; ?>
  483. </select>
  484. (<?php echo $total; ?>)
  485. <input type="submit" class="btn btn-primary" name="groups_connect" value="Połącz">
  486. </form>
  487. </div>
  488. </td>
  489. </tr>
  490. </table>
  491. <?php
  492. }
  493. if (1) {
  494. $allLdapUsers = UsersLdapHelper::getUsersAll();
  495. $allUsers = UsersHelper::getUsersAll();
  496. //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>';}
  497. // ldap.uid == db.ADM_ACCOUNT
  498. $usersDB = array();
  499. $usersLDAP = array();
  500. $usersConnected = array();
  501. foreach ($allUsers as $vDBUser) {
  502. $usersDB[] = $vDBUser->ADM_ACCOUNT;
  503. }
  504. foreach ($allLdapUsers as $vLDAPUser) {
  505. $usersLDAP[] = $vLDAPUser->uid;
  506. }
  507. // array czesc wspolna
  508. foreach ($usersDB as $vLogin) {
  509. if (in_array($vLogin, $usersLDAP)) {
  510. $usersConnected[] = $vLogin;
  511. }
  512. }
  513. //echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">$usersConnected (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($usersConnected);echo'</pre>';
  514. ?>
  515. <table>
  516. <tr><th>LDAP Users (ok)</th><th>DB Users (ok)</th></tr>
  517. <tr>
  518. <td style="width:50%">
  519. <select class="span5">
  520. <?php $total = 0; foreach ($allLdapUsers as $vLDAPUser) : ?>
  521. <?php if (in_array($vLDAPUser->uid, $usersConnected)) : $total += 1; ?>
  522. <option value="<?php echo $vLDAPUser->uid; ?>"><?php echo "[{$vLDAPUser->uidNumber}] {$vLDAPUser->uid}: {$vLDAPUser->cn}"; ?></option>
  523. <?php endif; ?>
  524. <?php endforeach; ?>
  525. </select>
  526. <?php echo $total; ?>
  527. </td>
  528. <td>
  529. <form method="get">
  530. <select class="span4">
  531. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  532. <?php if (in_array($vDBUser->ADM_ACCOUNT, $usersConnected)) : $total += 1; ?>
  533. <option value="<?php echo $vDBUser->ADM_ACCOUNT; ?>"><?php echo "[{$vDBUser->ID}] {$vDBUser->ADM_ACCOUNT}: {$vDBUser->ADM_NAME}"; ?></option>
  534. <?php endif; ?>
  535. <?php endforeach; ?>
  536. </select>
  537. <?php echo $total; ?>
  538. </form>
  539. </td>
  540. </tr>
  541. <tr><th>LDAP Users (todo)</th><th>DB Users (todo)</th></tr>
  542. <tr>
  543. <td style="width:50%">
  544. <select size="10" class="span5">
  545. <?php $total = 0; foreach ($allLdapUsers as $vLDAPUser) : ?>
  546. <?php if (!in_array($vLDAPUser->uid, $usersConnected)) : $total += 1; ?>
  547. <option value="<?php echo $vLDAPUser->uid; ?>"><?php echo "[{$vLDAPUser->uidNumber}] {$vLDAPUser->uid}: {$vLDAPUser->cn}"; ?></option>
  548. <?php endif; ?>
  549. <?php endforeach; ?>
  550. </select>
  551. <?php echo $total; ?>
  552. </td>
  553. <td>
  554. <select size="10" class="span5">
  555. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  556. <?php if (!in_array($vDBUser->ADM_ACCOUNT, $usersConnected) && $vDBUser->ADM_ADMIN_LEVEL < 6) : $total += 1; ?>
  557. <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>
  558. <?php endif; ?>
  559. <?php endforeach; ?>
  560. </select>
  561. <?php echo $total; ?>
  562. </td>
  563. </tr>
  564. <tr><th></th><th>konta bez możliwości zalogwania się</th></tr>
  565. <tr>
  566. <td style="width:50%">
  567. </td>
  568. <td>
  569. <select size="10" class="span5">
  570. <?php $total = 0; foreach ($allUsers as $vDBUser) : ?>
  571. <?php if (!in_array($vDBUser->ADM_ACCOUNT, $usersConnected) && $vDBUser->ADM_ADMIN_LEVEL == 6) : $total += 1; ?>
  572. <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>
  573. <?php endif; ?>
  574. <?php endforeach; ?>
  575. </select>
  576. <?php echo $total; ?>
  577. </td>
  578. </tr>
  579. <tr>
  580. <td style="width:50%">
  581. <?php
  582. 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>';
  583. ?>
  584. </td>
  585. <td>
  586. <?php
  587. 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>';
  588. ?>
  589. </td>
  590. </tr>
  591. </table>
  592. <?php
  593. }
  594. if ('' !== ($addLdapGroup = V::get('addLdapGroup', '', $_GET))) {
  595. echo'<pre style="max-height:200px;overflow:auto;border:1px solid red;text-align:left;">addLdapGroup (' . __CLASS__ . '::' . __FUNCTION__ . ':' . __LINE__ . '): ';print_r($addLdapGroup);echo'</pre>';
  596. $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' ");
  597. while($h=DB::fetch($res)) {
  598. if(!isset($_SESSION['AUTH_LDAP_CLIENT__LDAP_GROUPS_ID_NAME'][$h->ID])) {
  599. echo "<font size=-3> Brak grupy [".$h->ID."] ".$h->TYPE." ".$h->DESC." , </font>";
  600. if (in_array($ADM_ACCOUNT,$_SESSION['AUTH_LDAP_CLIENT__LDAP_GROUPS']['admin'])) {
  601. $BAD_SIGNS = array(" ", "/", "\\", "!","(",")");
  602. if ($h->ID>1000) $PrimaryGroupID=$h->ID;
  603. else $PrimaryGroupID="99".$h->ID;
  604. $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."";
  605. $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)."\" ";
  606. $return_dscl1=system($command1);
  607. $return_dscl2=system($command2);
  608. echo "\n<br><font size=-2>".$command1." return : ".$return_dscl1."</font>";
  609. echo "\n<br><font size=-2>".$command2." return : ".$return_dscl2."</font>";
  610. flush();
  611. $AKTUALIZOWALEM=true;
  612. }
  613. $BRAKI_W_LDAP=true;
  614. } else {
  615. unset($AUTH_LDAP_CLIENT__LDAP_GROUPS_ID_NAME[$h->ID]);
  616. }
  617. }
  618. }
  619. echo '</div>';// .container
  620. }