superedit-SYNC_LDAP_PERMS.php 30 KB

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