From 064d0f720b582a3a430b74df6120ff7bf68100f7 Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 11 Apr 2022 18:24:41 +0200 Subject: [PATCH] Add ppolicy LSaddon --- doc/conf/LSaddon.docbook | 1 + doc/conf/LSaddon/LSaddon.entities.xml | 1 + doc/conf/LSaddon/LSaddon_ppolicy.docbook | 175 +++++++ src/conf/LSaddons/config.LSaddons.ppolicy.php | 51 ++ src/includes/addons/LSaddons.ppolicy.php | 482 ++++++++++++++++++ src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo | Bin 76570 -> 77878 bytes src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po | 82 ++- src/lang/ldapsaisie.pot | 69 ++- 8 files changed, 842 insertions(+), 19 deletions(-) create mode 100644 doc/conf/LSaddon/LSaddon_ppolicy.docbook create mode 100644 src/conf/LSaddons/config.LSaddons.ppolicy.php create mode 100644 src/includes/addons/LSaddons.ppolicy.php diff --git a/doc/conf/LSaddon.docbook b/doc/conf/LSaddon.docbook index abf6bcd3..38720e94 100644 --- a/doc/conf/LSaddon.docbook +++ b/doc/conf/LSaddon.docbook @@ -16,6 +16,7 @@ &conf-LSaddon_maildir; &conf-LSaddon_mailquota; &conf-LSaddon_phpldapadmin; + &conf-LSaddon_ppolicy; &conf-LSaddon_showTechInfo; diff --git a/doc/conf/LSaddon/LSaddon.entities.xml b/doc/conf/LSaddon/LSaddon.entities.xml index ae231883..487ab68a 100644 --- a/doc/conf/LSaddon/LSaddon.entities.xml +++ b/doc/conf/LSaddon/LSaddon.entities.xml @@ -6,4 +6,5 @@ + diff --git a/doc/conf/LSaddon/LSaddon_ppolicy.docbook b/doc/conf/LSaddon/LSaddon_ppolicy.docbook new file mode 100644 index 00000000..bf81274a --- /dev/null +++ b/doc/conf/LSaddon/LSaddon_ppolicy.docbook @@ -0,0 +1,175 @@ + + LSaddon_ppolicy + Cet &LSaddon; fourni : + + + +une fonction ppolicy_extraDisplayColumn_password_expiration +pouvant être utilisée pour la génération d'une extraDisplayedColumn +affichant l'état d'expiration du mot de passe des objets d'une recherche. + + + Exemple d'utilisation + array ( + [...] + 'password_expiration' => array ( + 'label' => 'Password expiration', + 'generateFunction' => 'ppolicy_extraDisplayColumn_password_expiration', + 'additionalAttrs' => array('pwdChangedTime', 'pwdPolicySubentry'), + 'escape' => false, + ), + [...] + ), + [...] + );]]> + + + + +une fonction ppolicy_export_search_info +pouvant être utilisée comme actions +personnalisées sur les recherches d'&LSobjects; pour exporter au format CSV les +informations des politiques de mots de passe des objets retournés par la recherche. + + +Exemple d'utilisation + array ( + 'exportPpolicyInfo' => array ( + 'label' => 'Export password policy info', + 'icon' => 'export_csv', + 'function' => 'ppolicy_export_search_info', + 'noConfirmation' => true, + 'disableOnSuccessMsg' => true, + 'rights' => array ( + 'admin', + ), + ), + ), + [...] +);]]> + + + + +la méthode d'API exportPpolicyInfo permettant d'exporter +les informations des politiques de mots de passe de tous les objets d'un type donné. Cette méthode +est accessible via l'URL au format suivant : +/api/1.0/exportPpolicyInfo/[object type] + + +la commande CLI export_ppolicy_info permettant d'exporter +les informations des politiques de mots de passe de tous les objets d'un type donné. + +Utilisation +ldapsaisie export_ppolicy_info [object type] [-o|--output filepath] [-j|--json [-p|--pretty]] + + + + + + + + Des paramètres de configuration sont disponibles dans le fichier de + configuration config.LSaddons.ppolicy.php. + + +Structure du fichier + + + + +Paramètres de configuration + + + LS_PPOLICY_DEFAULT_DN + + Constante définissant le DN de la politique par défaut. Si aucune politique par défaut + n'est définie, ce paramètre doit valoir null. + + + + + LS_PPOLICY_WARNING_EXPIRATION_THRESHOLD + + Constante définissant le seuil d'alerte pour l'expiration des mots de passe (en + seconde). Par défaut : 7 jours. + + + + + LS_PPOLICY_CRITICAL_EXPIRATION_THRESHOLD + + Constante définissant le seuil critique pour l'expiration des mots de passe (en + seconde). Par défaut : 2 jours. + + + + + LS_PPOLICY_CSV_DELIMITER + + Constante définissant le caractère utilisé lors de la génération de l'export CSV + comme séparateur de champ. Par défaut : un point-virgule. + + + + + LS_PPOLICY_CSV_ENCLOSURE + + Constante définissant le caractère utilisé lors de la génération de l'export CSV + pour l'encadrement des champs. Par défaut : un guillemet double. + + + + + LS_PPOLICY_CSV_ESCAPE_CHAR + + Constante définissant le caractère utilisé lors de la génération de l'export CSV + pour l'échappement des champs. Par défaut : une barre oblique inverse. + + + + + $GLOBALS['LS_PPOLICY_API_GRANTED_PROFILES'] + + Tableau global listant les &LSprofiles; autorisés à utiliser la méthode d'API + exportPpolicyInfo. + + + + + $GLOBALS['LS_PPOLICY_INFO_EXPORT_EXTRA_ATTRS'] + + Tableau global listant les attributs supplémentaires à inclure lors de l'export des + informations de politique de mots de passe. + + + + + + diff --git a/src/conf/LSaddons/config.LSaddons.ppolicy.php b/src/conf/LSaddons/config.LSaddons.ppolicy.php new file mode 100644 index 00000000..1a32a509 --- /dev/null +++ b/src/conf/LSaddons/config.LSaddons.ppolicy.php @@ -0,0 +1,51 @@ + + * + * @return boolean true if Ppolicy is totally supported, false in other case + * + * @author Benjamin Renard + */ +function LSaddon_ppolicy_support() { + $retval = true; + + $MUST_DEFINE_CONST = array( + 'LS_PPOLICY_DEFAULT_DN', + 'LS_PPOLICY_WARNING_EXPIRATION_THRESHOLD', + 'LS_PPOLICY_CRITICAL_EXPIRATION_THRESHOLD', + 'LS_PPOLICY_CSV_DELIMITER', + 'LS_PPOLICY_CSV_ENCLOSURE', + 'LS_PPOLICY_CSV_ESCAPE_CHAR', + ); + + foreach($MUST_DEFINE_CONST as $const) { + if (!defined($const)) { + LSerror :: addErrorCode('PPOLICY_SUPPORT_01', $const); + $retval = false; + } + } + + $MUST_DEFINE_ARRAY= array( + 'LS_PPOLICY_API_GRANTED_PROFILES', + 'LS_PPOLICY_INFO_EXPORT_EXTRA_ATTRS', + ); + foreach($MUST_DEFINE_ARRAY as $array) { + if ( !isset($GLOBALS[$array]) || !is_array($GLOBALS[$array])) { + LSerror :: addErrorCode('PPOLICY_SUPPORT_02', $array); + $retval = false; + } + } + + // Init ppolicy objects cache + $GLOBALS['PPOLICY_OBJECTS_CACHE'] = array(); + + if ($retval) { + LSurl :: add_handler( + '#^api/1.0/exportPpolicyInfo/(?P[^/]+)/?$#', + 'handle/export_api_LSobject_exportPpolicyInfo', + true, false, true); + } + + return $retval; +} + +/** + * Retrieve ppolicy object (from cache if already loaded) + * + * @param[in] $dn string The DN of the ppolicy object + * + * @return array|false Array of ppolicy object's attributes on success, false otherwise + * + * @author Benjamin Renard + */ +function get_ppolicy_object($dn) { + if (array_key_exists($dn, $GLOBALS['PPOLICY_OBJECTS_CACHE'])) + return $GLOBALS['PPOLICY_OBJECTS_CACHE'][$dn]; + $GLOBALS['PPOLICY_OBJECTS_CACHE'][$dn] = LSldap :: getAttrs($dn, '(objectClass=pwdPolicy)'); + return $GLOBALS['PPOLICY_OBJECTS_CACHE'][$dn]; +} + +/** + * Retrieve ppolicy password max age + * + * @param[in] $ppolicy_dn string Optional DN of the ppolicy object to use + * + * @return int|null|false The ppolicy password max age (in second) if defined, null if no password max age is defined or false in case of error + * + * @author Benjamin Renard + */ +function get_ppolicy_password_max_age($ppolicy_dn=null) { + if (!$ppolicy_dn) + $ppolicy_dn = LS_PPOLICY_DEFAULT_DN; + if (!$ppolicy_dn) + return null; + $ppolicy = get_ppolicy_object($ppolicy_dn); + if (!$ppolicy) + return false; + if (isset($ppolicy['pwdMaxAge'])) + return intval($ppolicy['pwdMaxAge']); + return null; +} + +/** + * Format and return HTML code of a badge + * + * @param[in] $text string The text of the badge + * @param[in] $bg_color string The background color of the badge (optional, default: green) + * @param[in] $color string The text color of the badge (optional, default: white) + * + * @return string The HTML code of the badge + * + * @author Benjamin Renard + */ +function _ppolicy_badge($text, $bg_color='green', $color='white') { + // Disable HTML formating on PHP cli + if (php_sapi_name() == 'cli') return $text; + return sprintf( + '%s', + $bg_color, $color, $text + ); +} + + /** + * Retrieve Ppolicy extraDisplayedColumn password expiration + * + * @param[in] $entry An LSsearchEntry object + * + * @return string Ppolicy extraDisplayedColumn password expiration + * + * @author Benjamin Renard + */ +function ppolicy_extraDisplayColumn_password_expiration($entry) { + $change_time = $entry->pwdChangedTime; + if (!$change_time) + return _('Never'); + $change_time = ldapDate2Timestamp($change_time); + $max_age = get_ppolicy_password_max_age($entry->pwdPolicySubentry); + if ($max_age === false) + return _ppolicy_badge(__('Unknown'), 'gray'); + if (!$max_age) + return _('Never'); + $expiration_date = $change_time + $max_age; + $now = time(); + if ($expiration_date <= $now) + return _ppolicy_badge( + sprintf(_('Expired (since %s)'), date('Y-m-d H:i', $expiration_date)), + 'black'); + $delta = $expiration_date - $now; + if ($delta >= LS_PPOLICY_CRITICAL_EXPIRATION_THRESHOLD) + $badge_color = 'red'; + elseif ($delta >= LS_PPOLICY_WARNING_EXPIRATION_THRESHOLD) + $badge_color = 'orange'; + else + $badge_color = 'green'; + return _ppolicy_badge( + sprintf(_('Expire on %s'), date('Y-m-d H:i', $expiration_date)), + $badge_color); +} + +/** + * Write LSsearch result as CSV and force download of it. + * + * @param[in] $LSsearch The LSsearch object + * + * @author Benjamin Renard + * + * @return boolean Void if CSV file is successfully generated and upload, false in other case + */ +function ppolicy_export_search_info($LSsearch, $as_csv=true, $return=false) { + if ($as_csv) { + $csv = fopen('php://temp/maxmemory:'. (5*1024*1024), 'r+'); + + if ($csv === false) { + LSerror :: addErrorCode('PPOLICY_01'); + return false; + } + } + + $attrs = array_merge( + array( + 'pwdPolicySubentry', 'pwdChangedTime', 'pwdGraceUseTime', 'pwdFailureTime', + 'pwdAccountLockedTime', 'pwdReset', 'pwdHistory' + ), + $GLOBALS['LS_PPOLICY_INFO_EXPORT_EXTRA_ATTRS'] + ); + $LSsearch -> setParam('attributes', $attrs); + + if (!$LSsearch -> run()) { + LSerror :: addErrorCode('PPOLICY_02'); + return false; + } + + if ($as_csv) { + $headers = array($LSsearch->label_objectName, 'DN'); + foreach($attrs as $attr) { + $label = LSconfig::get("LSobjects.".$LSsearch->LSobject.".attrs.$attr.label", $attr, 'string'); + $headers[] = __($label); + } + + if (!_ppolicy_write_row_in_csv($csv, $headers)) { + LSerror :: addErrorCode('PPOLICY_03'); + return false; + } + } + else { + $data = array(); + } + + foreach ($LSsearch -> getSearchEntries() as $e) { + $row = array( + 'name' => $e -> displayName, + 'dn' => $e -> dn, + ); + + foreach($attrs as $attr) { + if ($as_csv) { + $values = ensureIsArray($e -> get($attr)); + if ($values) { + $row[] = ($as_json?$values:implode('|', $values)); + } + else { + $no_value_label = LSconfig::get( + "LSobjects.".$LSsearch->LSobject.".attrs.$attr.no_value_label", + ___('Not set'), 'string'); + $row[] = __($no_value_label); + } + } + else { + $row[$attr] = ensureIsArray($e -> get($attr)); + if (!LSconfig::get("LSobjects.".$LSsearch->LSobject.".attrs.$attr.multiple")) { + $row[$attr] = ($row[$attr]?$row[$attr][0]:null); + } + } + } + + if ($as_csv) { + if (!_ppolicy_write_row_in_csv($csv, $row)) { + LSerror :: addErrorCode('PPOLICY_04'); + return false; + } + } + else { + $data[] = $row; + } + } + + if (!$as_csv) { + if ($return) + return $data; + header("Content-disposition: attachment; filename=ppolicy-".$LSsearch->LSobject.".json"); + displayAjaxReturn($data); + exit(); + } + + rewind($csv); + if ($return) { + $data = stream_get_contents($csv); + @fclose($csv); + return $data; + } + header("Content-disposition: attachment; filename=ppolicy-".$LSsearch->LSobject.".csv"); + header("Content-type: text/csv"); + print stream_get_contents($csv); + @fclose($csv); + exit(); +} + +/** + * Write CSV row in file + * + * @param[in] $csv The CSV file description reference + * @param[in] $row An array of a CSV row fields to write + * + * @author Benjamin Renard + * + * @retval boolean True if CSV row is successfully writed, false in other case + */ +function _ppolicy_write_row_in_csv(&$csv, &$row) { + if (!defined('PHP_VERSION_ID') or PHP_VERSION_ID < 50504) { + return ( + fputcsv($csv, $row, LS_PPOLICY_CSV_DELIMITER, LS_PPOLICY_CSV_ENCLOSURE) !== false + ); + } + return ( + fputcsv( + $csv, $row, LS_PPOLICY_CSV_DELIMITER, LS_PPOLICY_CSV_ENCLOSURE, + LS_PPOLICY_CSV_ESCAPE_CHAR) !== false + ); +} + +/** + * Handle exportPpolicyInfo API request + * + * @param[in] $request LSurlRequest The request + * + * @return void + **/ +function handle_api_LSobject_exportPpolicyInfo($request) { + get_LSobject_from_API_request($request); + $container_dn = LSconfig::get( + "LSobjects.".$LSsearch->LSobject.".container_dn", + "", "string"); + $whoami = LSsession :: whoami( + $container_dn? + $container_dn.','.LSsession::getTopDn(): + LSsession::getTopDn() + ); + if (!array_intersect($GLOBALS['LS_PPOLICY_API_GRANTED_PROFILES'], $whoami)) { + LSerror :: addErrorCode('LSsession_11'); + LSsession :: displayAjaxReturn(); + return false; + } + + if (!LSsession :: loadLSclass('LSsearch')) { + LSerror :: addErrorCode('LSsession_05', 'LSsearch'); + LSsession :: displayAjaxReturn(); + return false; + } + + $search = new LSsearch( + $request->LSobject, + 'api' + ); + $search -> setParam('onlyAccessible', True); + + $data = ppolicy_export_search_info($search, false, true); + LSsession :: displayAjaxReturn($data); +} + +if (php_sapi_name() != 'cli') + return true; + +function cli_export_ppolicy_info($command_args) { + $objType = null; + $output = false; + $json = false; + $pretty = false; + for ($i=0; $i < count($command_args); $i++) { + switch($command_args[$i]) { + case '-o': + case '--output': + $i++; + $output = $command_args[$i]; + break; + + case '-j': + case '--json': + $json = true; + break; + + case '-p': + case '--pretty': + $pretty = true; + break; + + default: + if (is_null($objType)) + $objType = $command_args[$i]; + else + LScli :: usage("Invalid ".$command_args[$i]." parameter."); + break; + } + } + + if (is_null($objType)) + LScli :: usage('You must provide LSobject type.'); + + if (!LSsession :: loadLSobject($objType)) + return false; + + if (!LSsession :: loadLSclass('LSsearch')) { + LSerror :: addErrorCode('LSsession_05', 'LSsearch'); + LSsession :: displayAjaxReturn(); + return false; + } + + $search = new LSsearch($objType, 'cli_export_ppolicy_info'); + $search -> setParam('onlyAccessible', True); + + $data = ppolicy_export_search_info($search, !$json, true); + + if ($json) + $data = json_encode( + $data, + ($pretty?JSON_PRETTY_PRINT:0) + ); + + if (!$output) { + print($data); + exit(); + } + $fd = fopen($output, 'w') or fatal_error("Fail to open output file '$output'"); + fwrite($fd, $data) or fatal_error("Fail to write result in output file '$output'"); + @fclose($fd); +} + +/** + * Args autocompleter for CLI export_ppolicy_info command + * + * @param[in] $command_args array List of already typed words of the command + * @param[in] $comp_word_num int The command word number to autocomplete + * @param[in] $comp_word string The command word to autocomplete + * @param[in] $opts array List of global available options + * + * @retval array List of available options for the word to autocomplete + **/ +function cli_export_ppolicy_info_args_autocompleter($command_args, $comp_word_num, $comp_word, $opts) { + $opts = array_merge($opts, array ('-o', '--output', '-j', '--json', '-p', '--pretty')); + + // Handle positional args + $objType = null; + $objType_arg_num = null; + for ($i=0; $i < count($command_args); $i++) { + if (!in_array($command_args[$i], $opts)) { + // If object type not defined + if (is_null($objType)) { + // Defined it + $objType = $command_args[$i]; + LScli :: unquote_word($objType); + $objType_arg_num = $i; + + // Check object type exists + $objTypes = LScli :: autocomplete_LSobject_types($objType); + + // Load it if exist and not trying to complete it + if (in_array($objType, $objTypes) && $i != $comp_word_num) { + LSsession :: loadLSobject($objType, false); + } + } + } + } + + // If objType not already choiced (or currently autocomplete), add LSobject types to available options + if (!$objType || $objType_arg_num == $comp_word_num) + $opts = array_merge($opts, LScli :: autocomplete_LSobject_types($comp_word)); + + return LScli :: autocomplete_opts($opts, $comp_word); +} + +LScli :: add_command( + 'export_ppolicy_info', + 'cli_export_ppolicy_info', + 'Export password policy info of a all objects of a specified object type', + '[object type] [-o|--output filepath] [-j|--json [-p|--pretty]]', + false, // long desc + true, + 'cli_export_ppolicy_info_args_autocompleter' +); diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.mo index 86abcf6deb9318078ab743d48023fce6d19d33d9..f71aa389d8c9aca3415c28f7c09179696350e73b 100644 GIT binary patch delta 13514 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 delta 12763 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 G{r?Zh7rDy- diff --git a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po index 7011cea2..241e5f4f 100644 --- a/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po +++ b/src/lang/fr_FR.UTF8/LC_MESSAGES/ldapsaisie.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: LdapSaisie\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-02-22 18:24+0100\n" +"PO-Revision-Date: 2022-04-11 18:24+0200\n" "Last-Translator: Benjamin Renard \n" "Language-Team: LdapSaisie \n" @@ -21,6 +21,64 @@ msgstr "" "X-Generator: Poedit 2.4.2\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:26 +msgid "Password policy Support : The constant %{const} is not defined." +msgstr "" +"Support politique de mots de passe : La constante %{const} n'est pas définie." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:29 +msgid "Password policy Support : The global array %{array} is not defined." +msgstr "" +"Support politique de mots de passe : Le tableau global %{array} n'est pas " +"définie." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:32 +msgid "Password policy: An error occured generating CSV outfile memory space." +msgstr "" +"Politique de mots de passe : Une erreur est survenue en générant l'espace " +"mémoire pour le fichier CSV." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:35 +msgid "Password policy: An error occured executing the search." +msgstr "" +"Politique de mots de passe : Une erreur est survenue en exécutant la " +"recherche." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:38 +msgid "Password policy: An error occured writing CSV header." +msgstr "" +"Politique de mots de passe : Une erreur est survenue en écrivant les entêtes " +"CSV." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:41 +msgid "Password policy: An error occured writing a CSV row." +msgstr "" +"Politique de mots de passe : Une erreur est survenue en écrivant une ligne " +"CSV." + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:169 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:175 +msgid "Never" +msgstr "Jamais" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:173 +msgid "Unknown" +msgstr "Inconnu" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:180 +#, php-format +msgid "Expired (since %s)" +msgstr "Expiré (depuis %s)" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:190 +#, php-format +msgid "Expire on %s" +msgstr "Expirera le %s" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:258 +msgid "Not set" +msgstr "Non défini" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.samba.php:27 msgid "SAMBA Support: Unable to load smbHash class." msgstr "Support SAMBA : Impossible de charger la classe smbHash." @@ -434,6 +492,10 @@ msgstr "" "MAILDIR : Erreur durant la récupération du chemin distant du dossier des " "mails." +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.watermark.php:78 +msgid "PRE-PRODUCTION" +msgstr "PRÉ-PRODUCTION" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.showTechInfo.php:63 #: templates/default/showTechInfo.tpl:16 msgid "Structural object class" @@ -1628,39 +1690,39 @@ msgstr "" "LSformRule_password : Regex invalide configurée : %{regex}. Vous devez " "utiliser des regex de type PCRE (commencant par le caractère '/')." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:614 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:629 msgid "LSldap: Error during the LDAP server connection (%{msg})." msgstr "LSldap : Erreur durant la connexion au serveur LDAP (%{msg})." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:617 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:632 msgid "LSldap: Error during the LDAP search (%{msg})." msgstr "LSldap : Erreur pendant la recherche LDAP (%{msg})." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:620 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:635 msgid "LSldap: Object type unknown." msgstr "LSldap : Type d'objet inconnu." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:623 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:638 msgid "LSldap: Error while fetching the LDAP entry." msgstr "LSldap : Erreur durant la récupération de l'entrée LDAP." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:626 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:641 msgid "LSldap: Error while changing the LDAP entry (DN : %{dn})." msgstr "LSldap : Erreur durant la modification de l'entrée LDAP (DN : %{dn})." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:629 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:644 msgid "LSldap: Error while deleting empty attributes." msgstr "LSldap : Erreur durant la suppression des attributs vides." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:632 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:647 msgid "LSldap: Error while changing the DN of the object." msgstr "LSldap : Erreur pendant la modification du DN de l'objet." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:635 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:650 msgid "LSldap: LDAP server base DN not configured." msgstr "LSldap : Le base DN du serveur LDAP n'est pas configuré." -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:638 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:653 msgid "LSldap: Fail to set authz proxy option on LDAP server connection." msgstr "" "LSldap : Une erreur est survenue en appliquant l'option d'authz proxy sur la " diff --git a/src/lang/ldapsaisie.pot b/src/lang/ldapsaisie.pot index 980e6cfe..c66181ae 100644 --- a/src/lang/ldapsaisie.pot +++ b/src/lang/ldapsaisie.pot @@ -1,3 +1,50 @@ +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:26 +msgid "Password policy Support : The constant %{const} is not defined." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:29 +msgid "Password policy Support : The global array %{array} is not defined." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:32 +msgid "Password policy: An error occured generating CSV outfile memory space." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:35 +msgid "Password policy: An error occured executing the search." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:38 +msgid "Password policy: An error occured writing CSV header." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:41 +msgid "Password policy: An error occured writing a CSV row." +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:169 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:175 +msgid "Never" +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:173 +msgid "Unknown" +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:180 +#, php-format +msgid "Expired (since %s)" +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:190 +#, php-format +msgid "Expire on %s" +msgstr "" + +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.ppolicy.php:258 +msgid "Not set" +msgstr "" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.samba.php:27 msgid "SAMBA Support: Unable to load smbHash class." msgstr "" @@ -345,6 +392,10 @@ msgstr "" msgid "MAILDIR : Error retrieving remote path of the maildir." msgstr "" +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.watermark.php:78 +msgid "PRE-PRODUCTION" +msgstr "" + #: /home/brenard/dev/ldapsaisie_clean3/src/includes/addons/LSaddons.showTechInfo.php:63 #: templates/default/showTechInfo.tpl:16 msgid "Structural object class" @@ -1359,39 +1410,39 @@ msgid "" "(begining by '/' caracter)." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:614 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:629 msgid "LSldap: Error during the LDAP server connection (%{msg})." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:617 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:632 msgid "LSldap: Error during the LDAP search (%{msg})." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:620 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:635 msgid "LSldap: Object type unknown." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:623 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:638 msgid "LSldap: Error while fetching the LDAP entry." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:626 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:641 msgid "LSldap: Error while changing the LDAP entry (DN : %{dn})." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:629 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:644 msgid "LSldap: Error while deleting empty attributes." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:632 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:647 msgid "LSldap: Error while changing the DN of the object." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:635 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:650 msgid "LSldap: LDAP server base DN not configured." msgstr "" -#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:638 +#: /home/brenard/dev/ldapsaisie_clean3/src/includes/class/class.LSldap.php:653 msgid "LSldap: Fail to set authz proxy option on LDAP server connection." msgstr ""