interface_50_modLdap_Ldapsynchro.class.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760
  1. <?php
  2. /* Copyright (C) 2005-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  3. * Copyright (C) 2005-2021 Regis Houssin <regis.houssin@inodbox.com>
  4. * Copyright (C) 2014 Marcos García <marcosgdf@gmail.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  18. */
  19. /**
  20. * \file htdocs/core/triggers/interface_50_modLdap_Ldapsynchro.class.php
  21. * \ingroup core
  22. * \brief Fichier de gestion des triggers LDAP
  23. */
  24. require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php';
  25. /**
  26. * Class of triggers for ldap module
  27. */
  28. class InterfaceLdapsynchro extends DolibarrTriggers
  29. {
  30. /**
  31. * Constructor
  32. *
  33. * @param DoliDB $db Database handler
  34. */
  35. public function __construct($db)
  36. {
  37. $this->db = $db;
  38. $this->name = preg_replace('/^Interface/i', '', get_class($this));
  39. $this->family = "ldap";
  40. $this->description = "Triggers of this module allows to synchronize Dolibarr toward a LDAP database.";
  41. // 'development', 'experimental', 'dolibarr' or version
  42. $this->version = self::VERSION_DOLIBARR;
  43. $this->picto = 'technic';
  44. }
  45. /**
  46. * Function called when a Dolibarrr business event is done.
  47. * All functions "runTrigger" are triggered if file is inside directory htdocs/core/triggers or htdocs/module/code/triggers (and declared)
  48. *
  49. * @param string $action Event action code
  50. * @param Object $object Object
  51. * @param User $user Object user
  52. * @param Translate $langs Object langs
  53. * @param conf $conf Object conf
  54. * @return int Return integer <0 if KO, 0 if no triggered ran, >0 if OK
  55. */
  56. public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf)
  57. {
  58. if (empty($conf->ldap) || empty($conf->ldap->enabled)) {
  59. return 0; // Module not active, we do nothing
  60. }
  61. if (defined('DISABLE_LDAP_SYNCHRO')) {
  62. return 0; // If constant defined, we do nothing
  63. }
  64. if (!function_exists('ldap_connect')) {
  65. dol_syslog("Warning, module LDAP is enabled but LDAP functions not available in this PHP", LOG_WARNING);
  66. return 0;
  67. }
  68. require_once DOL_DOCUMENT_ROOT."/core/class/ldap.class.php";
  69. require_once DOL_DOCUMENT_ROOT."/user/class/usergroup.class.php";
  70. $result = 0;
  71. // Users
  72. if ($action == 'USER_CREATE') {
  73. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  74. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  75. $ldap = new Ldap();
  76. $result = $ldap->connect_bind();
  77. if ($result > 0) {
  78. $info = $object->_load_ldap_info();
  79. $dn = $object->_load_ldap_dn($info);
  80. //For compatibility with Samba 4 AD
  81. if ($ldap->serverType == "activedirectory") {
  82. $info['userAccountControl'] = $conf->global->LDAP_USERACCOUNTCONTROL;
  83. }
  84. $result = $ldap->add($dn, $info, $user);
  85. }
  86. if ($result < 0) {
  87. $this->error = "ErrorLDAP ".$ldap->error;
  88. }
  89. }
  90. } elseif ($action == 'USER_MODIFY') {
  91. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  92. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  93. $ldap = new Ldap();
  94. $result = $ldap->connect_bind();
  95. if ($result > 0) {
  96. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  97. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  98. $object->oldcopy = clone $object;
  99. }
  100. $oldinfo = $object->oldcopy->_load_ldap_info();
  101. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  102. // Verify if entry exist
  103. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  104. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  105. $records = $ldap->search($container, $search);
  106. if (count($records) && $records['count'] == 0) {
  107. $olddn = '';
  108. }
  109. $info = $object->_load_ldap_info();
  110. $dn = $object->_load_ldap_dn($info);
  111. $newrdn = $object->_load_ldap_dn($info, 2);
  112. $newparent = $object->_load_ldap_dn($info, 1);
  113. $result = $ldap->update($dn, $info, $user, $olddn, $newrdn, $newparent);
  114. if ($result > 0 && !empty($object->context['newgroupid'])) { // We are in context of adding a new group to user
  115. $usergroup = new UserGroup($this->db);
  116. $usergroup->fetch($object->context['newgroupid'], '', true);
  117. $oldinfo = $usergroup->_load_ldap_info();
  118. $olddn = $usergroup->_load_ldap_dn($oldinfo);
  119. // Verify if entry exist
  120. $container = $usergroup->_load_ldap_dn($oldinfo, 1);
  121. $search = "(".$usergroup->_load_ldap_dn($oldinfo, 2).")";
  122. $records = $ldap->search($container, $search);
  123. if (count($records) && $records['count'] == 0) {
  124. $olddn = '';
  125. }
  126. $info = $usergroup->_load_ldap_info(); // Contains all members, included the new one (insert already done before trigger call)
  127. $dn = $usergroup->_load_ldap_dn($info);
  128. $result = $ldap->update($dn, $info, $user, $olddn);
  129. }
  130. if ($result > 0 && !empty($object->context['oldgroupid'])) { // We are in context of removing a group from user
  131. $usergroup = new UserGroup($this->db);
  132. $usergroup->fetch($object->context['oldgroupid'], '', true);
  133. $oldinfo = $usergroup->_load_ldap_info();
  134. $olddn = $usergroup->_load_ldap_dn($oldinfo);
  135. // Verify if an entry exists
  136. $container = $usergroup->_load_ldap_dn($oldinfo, 1);
  137. $search = "(".$usergroup->_load_ldap_dn($oldinfo, 2).")";
  138. $records = $ldap->search($container, $search);
  139. if (count($records) && $records['count'] == 0) {
  140. $olddn = '';
  141. }
  142. $info = $usergroup->_load_ldap_info(); // Contains all members, except the old one (remove already done before trigger call)
  143. $dn = $usergroup->_load_ldap_dn($info);
  144. $result = $ldap->update($dn, $info, $user, $olddn);
  145. }
  146. }
  147. if ($result < 0) {
  148. $this->error = "ErrorLDAP ".$ldap->error;
  149. }
  150. }
  151. } elseif ($action == 'USER_NEW_PASSWORD') {
  152. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  153. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  154. $ldap = new Ldap();
  155. $result = $ldap->connect_bind();
  156. if ($result > 0) {
  157. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  158. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  159. $object->oldcopy = clone $object;
  160. }
  161. $oldinfo = $object->oldcopy->_load_ldap_info();
  162. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  163. // Verify if entry exist
  164. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  165. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  166. $records = $ldap->search($container, $search);
  167. if (count($records) && $records['count'] == 0) {
  168. $olddn = '';
  169. }
  170. $info = $object->_load_ldap_info();
  171. $dn = $object->_load_ldap_dn($info);
  172. $result = $ldap->update($dn, $info, $user, $olddn);
  173. }
  174. if ($result < 0) {
  175. $this->error = "ErrorLDAP ".$ldap->error;
  176. }
  177. }
  178. } elseif ($action == 'USER_ENABLEDISABLE') {
  179. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  180. if (getDolGlobalInt("LDAP_SYNCHRO_ACTIVE") === Ldap::SYNCHRO_DOLIBARR_TO_LDAP && getDolGlobalString('LDAP_SERVER_TYPE') == "activedirectory") {
  181. $ldap = new Ldap();
  182. $result = $ldap->connect_bind();
  183. if ($result > 0) {
  184. $info = $object->_load_ldap_info();
  185. $dn = $object->_load_ldap_dn($info);
  186. $search = "(" . $object->_load_ldap_dn($info, 2) . ")";
  187. $uAC = $ldap->getAttributeValues($search, "userAccountControl");
  188. if ($uAC["count"] == 1) {
  189. $userAccountControl = intval($uAC[0]);
  190. $enabledBitMask = 0x2;
  191. $isEnabled = ($userAccountControl & $enabledBitMask) === 0;
  192. if ($isEnabled && intval($object->statut) === 1) {
  193. $userAccountControl += 2;
  194. } elseif (!$isEnabled && intval($object->statut) === 0) {
  195. $userAccountControl -= 2;
  196. }
  197. $info['userAccountControl'] = $userAccountControl;
  198. $resUpdate = $ldap->update($dn, $info, $user, $dn);
  199. if ($resUpdate < 0) {
  200. $this->error = "ErrorLDAP " . $ldap->error;
  201. }
  202. }
  203. } else {
  204. $this->error = "ErrorLDAP " . $ldap->error;
  205. }
  206. }
  207. } elseif ($action == 'USER_DELETE') {
  208. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  209. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  210. $ldap = new Ldap();
  211. $result = $ldap->connect_bind();
  212. if ($result > 0) {
  213. $info = $object->_load_ldap_info();
  214. $dn = $object->_load_ldap_dn($info);
  215. $result = $ldap->delete($dn);
  216. }
  217. if ($result < 0) {
  218. $this->error = "ErrorLDAP ".$ldap->error;
  219. }
  220. }
  221. } elseif ($action == 'USERGROUP_CREATE') {
  222. // Groupes
  223. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  224. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  225. $ldap = new Ldap();
  226. $result = $ldap->connect_bind();
  227. if ($result > 0) {
  228. $info = $object->_load_ldap_info();
  229. $dn = $object->_load_ldap_dn($info);
  230. // Get a gid number for objectclass PosixGroup if none was provided
  231. if (empty($info[getDolGlobalString('LDAP_GROUP_FIELD_GROUPID')]) && in_array('posixGroup', $info['objectclass'])) {
  232. $info['gidNumber'] = $ldap->getNextGroupGid('LDAP_KEY_GROUPS');
  233. }
  234. // Avoid Ldap error due to empty member
  235. if (isset($info['member']) && empty($info['member'])) {
  236. unset($info['member']);
  237. }
  238. $result = $ldap->add($dn, $info, $user);
  239. }
  240. if ($ldap->serverType == "activedirectory") {
  241. $info['sAMAccountName'] = $object->name;
  242. }
  243. if ($result < 0) {
  244. $this->error = "ErrorLDAP ".$ldap->error;
  245. }
  246. }
  247. } elseif ($action == 'USERGROUP_MODIFY') {
  248. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  249. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  250. $ldap = new Ldap();
  251. $result = $ldap->connect_bind();
  252. if ($result > 0) {
  253. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  254. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  255. $object->oldcopy = clone $object;
  256. }
  257. $oldinfo = $object->oldcopy->_load_ldap_info();
  258. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  259. // Verify if entry exist
  260. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  261. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  262. $records = $ldap->search($container, $search);
  263. if (count($records) && $records['count'] == 0) {
  264. $olddn = '';
  265. }
  266. $info = $object->_load_ldap_info();
  267. $dn = $object->_load_ldap_dn($info);
  268. $result = $ldap->update($dn, $info, $user, $olddn);
  269. }
  270. if ($result < 0) {
  271. $this->error = "ErrorLDAP ".$ldap->error;
  272. }
  273. }
  274. } elseif ($action == 'USERGROUP_DELETE') {
  275. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  276. if (getDolGlobalString('LDAP_SYNCHRO_ACTIVE') && getDolGlobalInt('LDAP_SYNCHRO_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  277. $ldap = new Ldap();
  278. $result = $ldap->connect_bind();
  279. if ($result > 0) {
  280. $info = $object->_load_ldap_info();
  281. $dn = $object->_load_ldap_dn($info);
  282. $result = $ldap->delete($dn);
  283. }
  284. if ($result < 0) {
  285. $this->error = "ErrorLDAP ".$ldap->error;
  286. }
  287. }
  288. } elseif ($action == 'CONTACT_CREATE') {
  289. // Contacts
  290. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  291. if (getDolGlobalString('LDAP_CONTACT_ACTIVE')) {
  292. $ldap = new Ldap();
  293. $result = $ldap->connect_bind();
  294. if ($result > 0) {
  295. $info = $object->_load_ldap_info();
  296. $dn = $object->_load_ldap_dn($info);
  297. $result = $ldap->add($dn, $info, $user);
  298. }
  299. if ($result < 0) {
  300. $this->error = "ErrorLDAP ".$ldap->error;
  301. }
  302. }
  303. } elseif ($action == 'CONTACT_MODIFY') {
  304. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  305. if (getDolGlobalString('LDAP_CONTACT_ACTIVE')) {
  306. $ldap = new Ldap();
  307. $result = $ldap->connect_bind();
  308. if ($result > 0) {
  309. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  310. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  311. $object->oldcopy = clone $object;
  312. }
  313. $oldinfo = $object->oldcopy->_load_ldap_info();
  314. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  315. // Verify if entry exist
  316. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  317. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  318. $records = $ldap->search($container, $search);
  319. if (count($records) && $records['count'] == 0) {
  320. $olddn = '';
  321. }
  322. $info = $object->_load_ldap_info();
  323. $dn = $object->_load_ldap_dn($info);
  324. $result = $ldap->update($dn, $info, $user, $olddn);
  325. }
  326. if ($result < 0) {
  327. $this->error = "ErrorLDAP ".$ldap->error;
  328. }
  329. }
  330. } elseif ($action == 'CONTACT_DELETE') {
  331. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  332. if (getDolGlobalString('LDAP_CONTACT_ACTIVE')) {
  333. $ldap = new Ldap();
  334. $result = $ldap->connect_bind();
  335. if ($result > 0) {
  336. $info = $object->_load_ldap_info();
  337. $dn = $object->_load_ldap_dn($info);
  338. $result = $ldap->delete($dn);
  339. }
  340. if ($result < 0) {
  341. $this->error = "ErrorLDAP ".$ldap->error;
  342. }
  343. }
  344. } elseif ($action == 'MEMBER_CREATE') {
  345. // Members
  346. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  347. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  348. $ldap = new Ldap();
  349. $result = $ldap->connect_bind();
  350. if ($result > 0) {
  351. $info = $object->_load_ldap_info();
  352. $dn = $object->_load_ldap_dn($info);
  353. $result = $ldap->add($dn, $info, $user);
  354. // For member type
  355. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  356. if ($object->typeid > 0) {
  357. require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php";
  358. $membertype = new AdherentType($this->db);
  359. $membertype->fetch($object->typeid);
  360. $membertype->listMembersForMemberType('', 1);
  361. $oldinfo = $membertype->_load_ldap_info();
  362. $olddn = $membertype->_load_ldap_dn($oldinfo);
  363. // Verify if entry exist
  364. $container = $membertype->_load_ldap_dn($oldinfo, 1);
  365. $search = "(".$membertype->_load_ldap_dn($oldinfo, 2).")";
  366. $records = $ldap->search($container, $search);
  367. if (count($records) && $records['count'] == 0) {
  368. $olddn = '';
  369. }
  370. $info = $membertype->_load_ldap_info(); // Contains all members, included the new one (insert already done before trigger call)
  371. $dn = $membertype->_load_ldap_dn($info);
  372. $result = $ldap->update($dn, $info, $user, $olddn);
  373. }
  374. }
  375. }
  376. if ($result < 0) {
  377. $this->error = "ErrorLDAP ".$ldap->error;
  378. }
  379. }
  380. } elseif ($action == 'MEMBER_VALIDATE') {
  381. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  382. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  383. // If status field is setup to be synchronized
  384. if (getDolGlobalString('LDAP_FIELD_MEMBER_STATUS')) {
  385. $ldap = new Ldap();
  386. $result = $ldap->connect_bind();
  387. if ($result > 0) {
  388. $info = $object->_load_ldap_info();
  389. $dn = $object->_load_ldap_dn($info);
  390. $olddn = $dn; // We know olddn=dn as we change only status
  391. $result = $ldap->update($dn, $info, $user, $olddn);
  392. }
  393. if ($result < 0) {
  394. $this->error = "ErrorLDAP ".$ldap->error;
  395. }
  396. }
  397. }
  398. } elseif ($action == 'MEMBER_SUBSCRIPTION') {
  399. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  400. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  401. // If subscriptions fields are setup to be synchronized
  402. if (getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_DATE')
  403. || getDolGlobalString('LDAP_FIELD_MEMBER_FIRSTSUBSCRIPTION_AMOUNT')
  404. || getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_DATE')
  405. || getDolGlobalString('LDAP_FIELD_MEMBER_LASTSUBSCRIPTION_AMOUNT')
  406. || getDolGlobalString('LDAP_FIELD_MEMBER_END_LASTSUBSCRIPTION')) {
  407. $ldap = new Ldap();
  408. $result = $ldap->connect_bind();
  409. if ($result > 0) {
  410. $info = $object->_load_ldap_info();
  411. $dn = $object->_load_ldap_dn($info);
  412. $olddn = $dn; // We know olddn=dn as we change only subscriptions
  413. $result = $ldap->update($dn, $info, $user, $olddn);
  414. }
  415. if ($result < 0) {
  416. $this->error = "ErrorLDAP ".$ldap->error;
  417. }
  418. }
  419. }
  420. } elseif ($action == 'MEMBER_MODIFY') {
  421. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  422. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  423. $ldap = new Ldap();
  424. $result = $ldap->connect_bind();
  425. if ($result > 0) {
  426. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  427. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  428. $object->oldcopy = clone $object;
  429. }
  430. $oldinfo = $object->oldcopy->_load_ldap_info();
  431. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  432. // Verify if entry exist
  433. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  434. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  435. $records = $ldap->search($container, $search);
  436. if (count($records) && $records['count'] == 0) {
  437. $olddn = '';
  438. }
  439. $info = $object->_load_ldap_info();
  440. $dn = $object->_load_ldap_dn($info);
  441. $newrdn = $object->_load_ldap_dn($info, 2);
  442. $newparent = $object->_load_ldap_dn($info, 1);
  443. $result = $ldap->update($dn, $info, $user, $olddn, $newrdn, $newparent);
  444. // For member type
  445. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  446. require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php";
  447. /*
  448. * Change member info
  449. */
  450. $newmembertype = new AdherentType($this->db);
  451. $newmembertype->fetch($object->typeid);
  452. $newmembertype->listMembersForMemberType('', 1);
  453. $oldinfo = $newmembertype->_load_ldap_info();
  454. $olddn = $newmembertype->_load_ldap_dn($oldinfo);
  455. // Verify if entry exist
  456. $container = $newmembertype->_load_ldap_dn($oldinfo, 1);
  457. $search = "(".$newmembertype->_load_ldap_dn($oldinfo, 2).")";
  458. $records = $ldap->search($container, $search);
  459. if (count($records) && $records['count'] == 0) {
  460. $olddn = '';
  461. }
  462. $info = $newmembertype->_load_ldap_info(); // Contains all members, included the new one (insert already done before trigger call)
  463. $dn = $newmembertype->_load_ldap_dn($info);
  464. $result = $ldap->update($dn, $info, $user, $olddn);
  465. if ($object->oldcopy->typeid != $object->typeid) {
  466. /*
  467. * Remove member in old member type
  468. */
  469. $oldmembertype = new AdherentType($this->db);
  470. $oldmembertype->fetch($object->oldcopy->typeid);
  471. $oldmembertype->listMembersForMemberType('', 1);
  472. $oldinfo = $oldmembertype->_load_ldap_info();
  473. $olddn = $oldmembertype->_load_ldap_dn($oldinfo);
  474. // Verify if entry exist
  475. $container = $oldmembertype->_load_ldap_dn($oldinfo, 1);
  476. $search = "(".$oldmembertype->_load_ldap_dn($oldinfo, 2).")";
  477. $records = $ldap->search($container, $search);
  478. if (count($records) && $records['count'] == 0) {
  479. $olddn = '';
  480. }
  481. $info = $oldmembertype->_load_ldap_info(); // Contains all members, included the new one (insert already done before trigger call)
  482. $dn = $oldmembertype->_load_ldap_dn($info);
  483. $result = $ldap->update($dn, $info, $user, $olddn);
  484. }
  485. }
  486. }
  487. if ($result <= 0) {
  488. $this->errors[] = "ErrorLDAP ".$ldap->error;
  489. }
  490. }
  491. } elseif ($action == 'MEMBER_NEW_PASSWORD') {
  492. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  493. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  494. // If password field is setup to be synchronized
  495. if (getDolGlobalString('LDAP_FIELD_PASSWORD') || getDolGlobalString('LDAP_FIELD_PASSWORD_CRYPTED')) {
  496. $ldap = new Ldap();
  497. $result = $ldap->connect_bind();
  498. if ($result > 0) {
  499. $info = $object->_load_ldap_info();
  500. $dn = $object->_load_ldap_dn($info);
  501. $olddn = $dn; // We know olddn=dn as we change only password
  502. $result = $ldap->update($dn, $info, $user, $olddn);
  503. }
  504. if ($result <= 0) {
  505. $this->errors[] = "ErrorLDAP ".$ldap->error;
  506. }
  507. }
  508. }
  509. } elseif ($action == 'MEMBER_RESILIATE') {
  510. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  511. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  512. // If status field is setup to be synchronized
  513. if (getDolGlobalString('LDAP_FIELD_MEMBER_STATUS')) {
  514. $ldap = new Ldap();
  515. $result = $ldap->connect_bind();
  516. if ($result > 0) {
  517. $info = $object->_load_ldap_info();
  518. $dn = $object->_load_ldap_dn($info);
  519. $olddn = $dn; // We know olddn=dn as we change only status
  520. $result = $ldap->update($dn, $info, $user, $olddn);
  521. }
  522. if ($result <= 0) {
  523. $this->errors[] = "ErrorLDAP ".$ldap->error;
  524. }
  525. }
  526. }
  527. } elseif ($action == 'MEMBER_DELETE') {
  528. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  529. if (getDolGlobalString('LDAP_MEMBER_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_ACTIVE') == Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  530. $ldap = new Ldap();
  531. $result = $ldap->connect_bind();
  532. if ($result > 0) {
  533. $info = $object->_load_ldap_info();
  534. $dn = $object->_load_ldap_dn($info);
  535. $result = $ldap->delete($dn);
  536. // For member type
  537. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  538. if ($object->typeid > 0) {
  539. require_once DOL_DOCUMENT_ROOT."/adherents/class/adherent_type.class.php";
  540. /*
  541. * Remove member in member type
  542. */
  543. $membertype = new AdherentType($this->db);
  544. $membertype->fetch($object->typeid);
  545. $membertype->listMembersForMemberType('a.rowid != '.$object->id, 1); // remove deleted member from the list
  546. $oldinfo = $membertype->_load_ldap_info();
  547. $olddn = $membertype->_load_ldap_dn($oldinfo);
  548. // Verify if entry exist
  549. $container = $membertype->_load_ldap_dn($oldinfo, 1);
  550. $search = "(".$membertype->_load_ldap_dn($oldinfo, 2).")";
  551. $records = $ldap->search($container, $search);
  552. if (count($records) && $records['count'] == 0) {
  553. $olddn = '';
  554. }
  555. $info = $membertype->_load_ldap_info(); // Contains all members, included the new one (insert already done before trigger call)
  556. $dn = $membertype->_load_ldap_dn($info);
  557. $result = $ldap->update($dn, $info, $user, $olddn);
  558. }
  559. }
  560. }
  561. if ($result <= 0) {
  562. $this->errors[] = "ErrorLDAP ".$ldap->error;
  563. }
  564. }
  565. } elseif ($action == 'MEMBER_TYPE_CREATE') {
  566. // Members types
  567. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  568. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  569. $ldap = new Ldap();
  570. $result = $ldap->connect_bind();
  571. if ($result > 0) {
  572. $info = $object->_load_ldap_info();
  573. $dn = $object->_load_ldap_dn($info);
  574. // Get a gid number for objectclass PosixGroup
  575. if (in_array('posixGroup', $info['objectclass'])) {
  576. $info['gidNumber'] = $ldap->getNextGroupGid('LDAP_KEY_MEMBERS_TYPE');
  577. }
  578. $result = $ldap->add($dn, $info, $user);
  579. }
  580. if ($result <= 0) {
  581. $this->errors[] = "ErrorLDAP ".$ldap->error;
  582. }
  583. }
  584. } elseif ($action == 'MEMBER_TYPE_MODIFY') {
  585. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  586. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  587. $ldap = new Ldap();
  588. $result = $ldap->connect_bind();
  589. if ($result > 0) {
  590. if (empty($object->oldcopy) || !is_object($object->oldcopy)) {
  591. dol_syslog("Trigger ".$action." was called by a function that did not set previously the property ->oldcopy onto object", LOG_WARNING);
  592. $object->oldcopy = clone $object;
  593. }
  594. $object->oldcopy->listMembersForMemberType('', 1);
  595. $oldinfo = $object->oldcopy->_load_ldap_info();
  596. $olddn = $object->oldcopy->_load_ldap_dn($oldinfo);
  597. // Verify if entry exist
  598. $container = $object->oldcopy->_load_ldap_dn($oldinfo, 1);
  599. $search = "(".$object->oldcopy->_load_ldap_dn($oldinfo, 2).")";
  600. $records = $ldap->search($container, $search);
  601. if (count($records) && $records['count'] == 0) {
  602. $olddn = '';
  603. }
  604. $object->listMembersForMemberType('', 1);
  605. $info = $object->_load_ldap_info();
  606. $dn = $object->_load_ldap_dn($info);
  607. $result = $ldap->update($dn, $info, $user, $olddn);
  608. }
  609. if ($result <= 0) {
  610. $this->errors[] = "ErrorLDAP ".$ldap->error;
  611. }
  612. }
  613. } elseif ($action == 'MEMBER_TYPE_DELETE') {
  614. dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
  615. if (getDolGlobalString('LDAP_MEMBER_TYPE_ACTIVE') && getDolGlobalInt('LDAP_MEMBER_TYPE_ACTIVE') === Ldap::SYNCHRO_DOLIBARR_TO_LDAP) {
  616. $ldap = new Ldap();
  617. $result = $ldap->connect_bind();
  618. if ($result > 0) {
  619. $info = $object->_load_ldap_info();
  620. $dn = $object->_load_ldap_dn($info);
  621. $result = $ldap->delete($dn);
  622. }
  623. if ($result <= 0) {
  624. $this->errors[] = "ErrorLDAP ".$ldap->error;
  625. }
  626. }
  627. }
  628. return $result;
  629. }
  630. }