. * --------------------------------------------------------------------- */ /** * Class used to manage Auth LDAP config */ class AuthLDAP extends CommonDBTM { const SIMPLE_INTERFACE = 'simple'; const EXPERT_INTERFACE = 'expert'; const ACTION_IMPORT = 0; const ACTION_SYNCHRONIZE = 1; const ACTION_ALL = 2; const USER_IMPORTED = 0; const USER_SYNCHRONIZED = 1; const USER_DELETED_LDAP = 2; //Import user by giving his login const IDENTIFIER_LOGIN = 'login'; //Import user by giving his email const IDENTIFIER_EMAIL = 'email'; const GROUP_SEARCH_USER = 0; const GROUP_SEARCH_GROUP = 1; const GROUP_SEARCH_BOTH = 2; /** * Deleted user strategy: preserve user. * @var integer */ const DELETED_USER_PRESERVE = 0; /** * Deleted user strategy: put user in trashbin. * @var integer */ const DELETED_USER_DELETE = 1; /** * Deleted user strategy: withdraw dynamic authorizations and groups. * @var integer */ const DELETED_USER_WITHDRAWDYNINFO = 2; /** * Deleted user strategy: disable user. * @var integer */ const DELETED_USER_DISABLE = 3; /** * Deleted user strategy: disable user and withdraw dynamic authorizations and groups. * @var integer */ const DELETED_USER_DISABLEANDWITHDRAWDYNINFO = 4; // From CommonDBTM public $dohistory = true; static $rightname = 'config'; //connection caching stuff static $conn_cache = []; static function getTypeName($nb = 0) { return _n('LDAP directory', 'LDAP directories', $nb); } static function canCreate() { return static::canUpdate(); } static function canPurge() { return static::canUpdate(); } function post_getEmpty() { $this->fields['port'] = '389'; $this->fields['condition'] = ''; $this->fields['login_field'] = 'uid'; $this->fields['sync_field'] = null; $this->fields['use_tls'] = 0; $this->fields['group_field'] = ''; $this->fields['group_condition'] = ''; $this->fields['group_search_type'] = self::GROUP_SEARCH_USER; $this->fields['group_member_field'] = ''; $this->fields['email1_field'] = 'mail'; $this->fields['email2_field'] = ''; $this->fields['email3_field'] = ''; $this->fields['email4_field'] = ''; $this->fields['realname_field'] = 'sn'; $this->fields['firstname_field'] = 'givenname'; $this->fields['phone_field'] = 'telephonenumber'; $this->fields['phone2_field'] = ''; $this->fields['mobile_field'] = ''; $this->fields['registration_number_field'] = ''; $this->fields['comment_field'] = ''; $this->fields['title_field'] = ''; $this->fields['use_dn'] = 0; $this->fields['picture_field'] = ''; $this->fields['responsible_field'] = ''; } static public function unsetUndisclosedFields(&$fields) { unset($fields['rootdn_passwd']); } /** * Preconfig datas for standard system * * @param string $type type of standard system : AD * * @return void */ function preconfig($type) { switch ($type) { case 'AD' : $this->fields['port'] = "389"; $this->fields['condition'] = '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; $this->fields['login_field'] = 'samaccountname'; $this->fields['sync_field'] = 'objectguid'; $this->fields['use_tls'] = 0; $this->fields['group_field'] = 'memberof'; $this->fields['group_condition'] = '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'; $this->fields['group_search_type'] = self::GROUP_SEARCH_USER; $this->fields['group_member_field'] = ''; $this->fields['email1_field'] = 'mail'; $this->fields['email2_field'] = ''; $this->fields['email3_field'] = ''; $this->fields['email4_field'] = ''; $this->fields['realname_field'] = 'sn'; $this->fields['firstname_field'] = 'givenname'; $this->fields['phone_field'] = 'telephonenumber'; $this->fields['phone2_field'] = 'othertelephone'; $this->fields['mobile_field'] = 'mobile'; $this->fields['registration_number_field'] = 'employeenumber'; $this->fields['comment_field'] = 'info'; $this->fields['title_field'] = 'title'; $this->fields['entity_field'] = 'ou'; $this->fields['entity_condition'] = '(objectclass=organizationalUnit)'; $this->fields['use_dn'] = 1; $this->fields['can_support_pagesize'] = 1; $this->fields['pagesize'] = '1000'; $this->fields['picture_field'] = ''; $this->fields['responsible_field'] = 'manager'; break; default: $this->post_getEmpty(); } } function prepareInputForUpdate($input) { if (isset($input["rootdn_passwd"])) { if (empty($input["rootdn_passwd"])) { unset($input["rootdn_passwd"]); } else { $input["rootdn_passwd"] = Toolbox::encrypt(stripslashes($input["rootdn_passwd"]), GLPIKEY); } } if (isset($input["_blank_passwd"]) && $input["_blank_passwd"]) { $input['rootdn_passwd'] = ''; } // Set attributes in lower case if (count($input)) { foreach ($input as $key => $val) { if (preg_match('/_field$/', $key)) { $input[$key] = Toolbox::strtolower($val); } } } //do not permit to override sync_field if ($this->isSyncFieldEnabled() && isset($input['sync_field']) && $this->isSyncFieldUsed() ) { if ($input['sync_field'] == $this->fields['sync_field']) { unset($input['sync_field']); } else { Session::addMessageAfterRedirect( __('Synchronization field cannot be changed once in use.'), false, ERROR ); return false; }; } return $input; } static function getSpecificValueToDisplay($field, $values, array $options = []) { if (!is_array($values)) { $values = [$field => $values]; } switch ($field) { case 'group_search_type' : return self::getGroupSearchTypeName($values[$field]); } return parent::getSpecificValueToDisplay($field, $values, $options); } static function getSpecificValueToSelect($field, $name = '', $values = '', array $options = []) { if (!is_array($values)) { $values = [$field => $values]; } $options['display'] = false; switch ($field) { case 'group_search_type' : $options['value'] = $values[$field]; $options['name'] = $name; return self::dropdownGroupSearchType($options); } return parent::getSpecificValueToSelect($field, $name, $values, $options); } static function processMassiveActionsForOneItemtype(MassiveAction $ma, CommonDBTM $item, array $ids) { $input = $ma->getInput(); switch ($ma->getAction()) { case 'import_group' : $group = new Group; if (!Session::haveRight("user", User::UPDATEAUTHENT) || !$group->canGlobal(UPDATE)) { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_NORIGHT); $ma->addMessage($item->getErrorMessage(ERROR_RIGHT)); return; } foreach ($ids as $id) { if (isset($input["dn"][$id])) { $group_dn = $input["dn"][$id]; if (isset($input["ldap_import_entities"][$id])) { $entity = $input["ldap_import_entities"][$id]; } else { $entity = $_SESSION["glpiactive_entity"]; } // Is recursive is in the main form and thus, don't pass through // zero_on_empty mechanism inside massive action form ... $is_recursive = (empty($input['ldap_import_recursive'][$id]) ? 0 : 1); $options = ['authldaps_id' => $_SESSION['ldap_server'], 'entities_id' => $entity, 'is_recursive' => $is_recursive, 'type' => $input['ldap_import_type'][$id]]; if (AuthLdap::ldapImportGroup($group_dn, $options)) { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_OK); } else { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_KO); $ma->addMessage($item->getErrorMessage(ERROR_ON_ACTION, $group_dn)); } } // Clean history as id does not correspond to group $_SESSION['glpimassiveactionselected'] = []; } return; case 'import' : case 'sync' : if (!Session::haveRight("user", User::IMPORTEXTAUTHUSERS)) { $ma->itemDone($item->getType(), $ids, MassiveAction::ACTION_NORIGHT); $ma->addMessage($item->getErrorMessage(ERROR_RIGHT)); return; } foreach ($ids as $id) { if (AuthLdap::ldapImportUserByServerId(['method' => AuthLDAP::IDENTIFIER_LOGIN, 'value' => $id], $_SESSION['ldap_import']['mode'], $_SESSION['ldap_import']['authldaps_id'], true)) { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_OK); } else { $ma->itemDone($item->getType(), $id, MassiveAction::ACTION_KO); $ma->addMessage($item->getErrorMessage(ERROR_ON_ACTION, $id)); } } return; } parent::processMassiveActionsForOneItemtype($ma, $item, $ids); } /** * Print the auth ldap form * * @param integer $ID ID of the item * @param array $options Options * - target for the form * * @return void (display) */ function showForm($ID, $options = []) { if (!Config::canUpdate()) { return false; } if (empty($ID)) { $this->getEmpty(); if (isset($options['preconfig'])) { $this->preconfig($options['preconfig']); } } else { $this->getFromDB($ID); } if (Toolbox::canUseLdap()) { $this->showFormHeader($options); if (empty($ID)) { $target = $this->getFormURL(); echo "".__('Preconfiguration')." "; echo ""; echo "".__('Active Directory').""; echo "  /  "; echo "".__('Default values'); echo ""; } echo ""; echo ""; if ($ID > 0) { echo "".__('Last update')."".Html::convDateTime($this->fields["date_mod"]); } else { echo " "; } echo ""; $defaultrand = mt_rand(); echo ""; echo ""; Dropdown::showYesNo('is_default', $this->fields['is_default'], -1, ['rand' => $defaultrand]); echo ""; $activerand = mt_rand(); echo ""; echo ""; Dropdown::showYesNo('is_active', $this->fields['is_active'], -1, ['rand' => $activerand]); echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo "fields["basedn"]."\">"; echo ""; echo ""; echo "fields["rootdn"]."\">"; echo ""; echo ""; echo ""; if ($ID) { echo " " . ""; } echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; echo ""; $info_message = __s('Synchronization field cannot be changed once in use.'); echo ""; echo "