From a7ab192274690a3b146d2a0abdb1e2947d70cd54 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Wed, 2 Dec 2020 18:12:00 +0100 Subject: [PATCH] Add LSldap_attr::pwdHistory --- doc/conf/LSattribute/LSattr_ldap.docbook | 1 + .../LSattr_ldap/LSattr_ldap.entities.xml | 1 + .../LSattr_ldap_pwdHistory.docbook | 74 +++++++++++ .../class/class.LSattr_ldap_pwdHistory.php | 115 ++++++++++++++++++ 4 files changed, 191 insertions(+) create mode 100644 doc/conf/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory.docbook create mode 100644 src/includes/class/class.LSattr_ldap_pwdHistory.php diff --git a/doc/conf/LSattribute/LSattr_ldap.docbook b/doc/conf/LSattribute/LSattr_ldap.docbook index deeb97fb..56f82601 100644 --- a/doc/conf/LSattribute/LSattr_ldap.docbook +++ b/doc/conf/LSattribute/LSattr_ldap.docbook @@ -12,6 +12,7 @@ &conf-LSattr_ldap_numeric; &conf-LSattr_ldap_password; &conf-LSattr_ldap_postaladdress; + &conf-LSattr_ldap_pwdHistory; &conf-LSattr_ldap_sambaAcctFlags; &conf-LSattr_ldap_shadowExpire; diff --git a/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap.entities.xml b/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap.entities.xml index f8ea992e..d7b17854 100644 --- a/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap.entities.xml +++ b/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap.entities.xml @@ -8,6 +8,7 @@ + diff --git a/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory.docbook b/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory.docbook new file mode 100644 index 00000000..a3bbc5c0 --- /dev/null +++ b/doc/conf/LSattribute/LSattr_ldap/LSattr_ldap_pwdHistory.docbook @@ -0,0 +1,74 @@ + + LSattr_ldap_pwdHistory + Ce type est utilisé pour la gestion de l'attribut standard pwdHistory. + Cet attribut, accessible en lecture uniquement, stocke dans un format prédéfini l'historique des + mots de passe d'une utilisateur avec pour chaque entrée : + + la date et heure de l'ajout du mot de passe dans l'historique + l'OID de la syntaxe du mot de passe + la longueur du mot de passe + le mot de passe (hâché) + + + Ce type d'attribut LDAP permettra de convertir la valeur en son équivalent JSON + pour pouvoir être traité à l'aide du type d'attribut HTML &LSattr_html_jsonCompositeAttribute;. + +Exemple de valeur de l'attribut pwdHistory + + + +Exemple de valeur tranformée + + + +Exemple de configuration complète de l'attribut + array ( + 'label' => 'Passwords in history', + 'ldap_type' => 'pwdHistory', + 'html_type' => 'jsonCompositeAttribute', + 'html_options' => array ( + 'components' => array ( + 'time' => array ( + 'label' => 'Date added to history', + 'type' => 'text', + 'required' => true, + 'multiple' => false, + ), + 'syntaxOID' => array ( + 'label' => 'Syntax OID', + 'type' => 'text', + 'required' => true, + 'multiple' => false, + ), + 'length' => array ( + 'label' => 'Length', + 'type' => 'text', + 'required' => true, + 'multiple' => false, + ), + 'hashed_password' => array ( + 'label' => 'Hashed password', + 'type' => 'text', + 'required' => true, + 'multiple' => false, + ), + ), + ), + 'no_value_label' => 'History is empty.', + 'multiple' => 1, + 'rights' => array( + 'admin' => 'r', + ), + 'view' => 1, +),]]> + + La date et heure de l'ajout du mot de passe dans l'historique est convertie dans un format lisible. + Par défaut, ce format est AAAA/MM/JJ HH:MM:SS, mais il peut aussi est personnalisé via + le paramètre date_format. Ce format est composé à partir des motifs clés gérés par la + fonction date() de &php;. Pour plus d'information, consulter + la documentation officielle. + La valeur par défaut est YmdHisO, correspondant à la syntaxe + Generalized Time telle que définie dans la RFC4517 + et prévu par le + Draft-behera-ldap-password-policy spécifiant cet attribut standard. + diff --git a/src/includes/class/class.LSattr_ldap_pwdHistory.php b/src/includes/class/class.LSattr_ldap_pwdHistory.php new file mode 100644 index 00000000..b71f5217 --- /dev/null +++ b/src/includes/class/class.LSattr_ldap_pwdHistory.php @@ -0,0 +1,115 @@ + $val) + $ret[$key] = json_encode($this -> parseValue($val)); + return $ret; + } + + /** + * Return the values for saving + * + * @param[in] $data mixed Array of timestamp + * + * @retval mixed LDAP attribute values + */ + public function getUpdateData($data) { + $ret = array(); + foreach(ensureIsArray($data) as $key => $val) + $ret[$key] = $this -> encodeValue(json_decode($val, true)); + return $ret; + } + + public function parseValue($value) { + $parts = explode('#', $value); + if (!is_array($parts) || count($parts) != 4) { + self :: log_warning($this."->parseValue($value): Invalid value (parts count != 4)."); + return; + } + $datetime = date_create_from_format('YmdHisO', $parts[0]); + if ($datetime instanceof DateTime) { + $time = $datetime -> format($this -> getFormat()); + } + else { + self :: log_warning($this."->parseValue($value): Fail to parse time '".$parts[0]."'."); + $time = getFData(_('Unknown (%{raw_value})'), $parts[0]); + } + return array( + "time" => $time, + "syntaxOID" => $parts[1], + "length" => intval($parts[2]), + "hashed_password" => $parts[3], + ); + } + + public function encodeValue($value) { + if (!is_array($value)) { + self :: log_warning($this."->encodeValue($value): Provided value is not an array."); + return; + } + $datetime = date_create_from_format('YmdHisO', $value['time']); + $datetime -> setTimezone('UTC'); + $datetime_string = $datetime -> format('YmdHisO'); + $datetime_string = preg_replace('/[\+\-]0000$/', 'Z', $datetime_string); + return implode( + "#", + array ( + $datetime_string, + $value['syntaxOID'], + $value['length'], + $value['hashed_password'], + ) + ); + } + + /** + * Return date format + * + * @retval string The date format (as accept by Datetime :: format() and date_create_from_format()) + **/ + public function getFormat() { + return $this -> getConfig('ldap_options.date_format', 'Y/m/d H:i:s'); + } + +}