From bdc70710855a1bfbb68f720c846427f8c0941c4d Mon Sep 17 00:00:00 2001 From: Saket Patel Date: Fri, 20 Dec 2013 01:21:43 +0530 Subject: [PATCH 01/25] add new release --- CHANGELOG.md | 6 +++++- builds/passwd-1.1.zip | Bin 0 -> 11657 bytes 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 builds/passwd-1.1.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index c7aa45c..bb351c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ ## 1.0 (17th Dec 2013) - - Password change functionality when using DB or LDAP plugin \ No newline at end of file + - Password change functionality when using DB or LDAP plugin + +## 1.1 (19th Dec 2013) + + - Bug fixes for LDAP plugin \ No newline at end of file diff --git a/builds/passwd-1.1.zip b/builds/passwd-1.1.zip new file mode 100644 index 0000000000000000000000000000000000000000..6f28c72d2019809a933919854406dc9f81157c97 GIT binary patch literal 11657 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 literal 0 HcmV?d00001 From dead7d6955c8f2b79ff0ba99b2df699a61bcaa9d Mon Sep 17 00:00:00 2001 From: Saket Patel Date: Mon, 23 Dec 2013 00:57:31 +0530 Subject: [PATCH 02/25] fix setting name copy paste issue #1 --- php/plugin.passwd.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/php/plugin.passwd.php b/php/plugin.passwd.php index ef8fe17..729815b 100644 --- a/php/plugin.passwd.php +++ b/php/plugin.passwd.php @@ -42,7 +42,7 @@ class Pluginpasswd extends Plugin { 'zarafa' => Array( 'v1' => Array( 'plugins' => Array( - 'sugarcrm' => Array( + 'passwd' => Array( 'enable' => PLUGIN_PASSWD_USER_DEFAULT_ENABLE, ) From 4a3d715321602253e58fd5b7f5422792f68f3b18 Mon Sep 17 00:00:00 2001 From: Sander Hoentjen Date: Mon, 3 Mar 2014 12:18:53 +0100 Subject: [PATCH 03/25] fix typo --- php/class.passwdmodule.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index e11e638..17399f6 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -109,7 +109,7 @@ class PasswdModule extends Module ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); // login with current password if that fails then current password is wrong - $bind = ldap_bind($ladpconn, $userdn, $data['current_password']); + $bind = ldap_bind($ldapconn, $userdn, $data['current_password']); if(ldap_errno($ldapconn) === 0) { $passwd = $data['new_password']; @@ -245,4 +245,4 @@ class PasswdModule extends Module return $hash; } } -?> \ No newline at end of file +?> From 6f047d4c7fa29f53b902e81b49b8d45eb9149904 Mon Sep 17 00:00:00 2001 From: Sander Hoentjen Date: Mon, 3 Mar 2014 12:19:22 +0100 Subject: [PATCH 04/25] add option to not strip everything after the @ Usefull if you use email-adress as login --- config.php | 6 +++++- php/class.passwdmodule.php | 8 ++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/config.php b/config.php index 2ad5e02..133f679 100644 --- a/config.php +++ b/config.php @@ -10,4 +10,8 @@ define('PLUGIN_PASSWD_LDAP_BASEDN', 'dc=example,dc=com'); /** URI to access LDAP server **/ define('PLUGIN_PASSWD_LDAP_URI', 'localhost'); -?> \ No newline at end of file + +/** Set to true if you login with username@tenantname **/ +define('PLUGIN_PASSWD_LOGIN_WITH_TENANT', false); + +?> diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index 17399f6..f33d18e 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -90,8 +90,12 @@ class PasswdModule extends Module // check connection is successfull if(ldap_errno($ldapconn) === 0) { // get the users uid, if we have a multi tenant installation then remove company name from user name - $parts = explode('@', $data['username']); - $uid = $parts[0]; + if (PLUGIN_PASSWD_LOGIN_WITH_TENANT){ + $parts = explode('@', $data['username']); + $uid = $parts[0]; + } else { + $uid = $data['username']; + } // search for the user dn that will be used to do login into LDAP $userdn = ldap_search ( From 739b1da2acfedf5d662dc5bc2b44693299bb40dc Mon Sep 17 00:00:00 2001 From: Sander Hoentjen Date: Tue, 4 Mar 2014 14:52:00 +0100 Subject: [PATCH 05/25] Add dutch translation Needs the generation of .mo in the build --- js/PasswdPlugin.js | 2 +- js/data/PasswdResponseHandler.js | 10 +-- js/settings/SettingsPasswdCategory.js | 2 +- js/settings/SettingsPasswdWidget.js | 2 +- .../nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po | 78 +++++++++++++++++++ manifest.xml | 5 ++ php/class.passwdmodule.php | 24 +++--- 7 files changed, 103 insertions(+), 20 deletions(-) create mode 100644 languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po diff --git a/js/PasswdPlugin.js b/js/PasswdPlugin.js index 40fb570..66116ed 100644 --- a/js/PasswdPlugin.js +++ b/js/PasswdPlugin.js @@ -47,7 +47,7 @@ Zarafa.plugins.passwd.PasswdPlugin = Ext.extend(Zarafa.core.Plugin, { Zarafa.onReady(function() { container.registerPlugin(new Zarafa.core.PluginMetaData({ name : 'passwd', - displayName : _('Password Change Plugin'), + displayName : dgettext("plugin_passwd", 'Password Change Plugin'), about : Zarafa.plugins.passwd.ABOUT, pluginConstructor : Zarafa.plugins.passwd.PasswdPlugin })); diff --git a/js/data/PasswdResponseHandler.js b/js/data/PasswdResponseHandler.js index 0577515..dae1c28 100644 --- a/js/data/PasswdResponseHandler.js +++ b/js/data/PasswdResponseHandler.js @@ -24,13 +24,13 @@ Zarafa.plugins.passwd.data.PasswdResponseHandler = Ext.extend(Zarafa.core.data.A */ doError : function(response) { - var displayMessage = _('An unknown error occurred while changing password.'); + var displayMessage = dgettext("plugin_passwd", 'An unknown error occurred while changing password.'); if(response.info) { displayMessage = response.info.display_message; } - Ext.MessageBox.alert(_('Error'), displayMessage); + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), displayMessage); this.callbackFn.apply(this.scope || this, [ false, response ]); }, @@ -41,14 +41,14 @@ Zarafa.plugins.passwd.data.PasswdResponseHandler = Ext.extend(Zarafa.core.data.A */ doSuccess : function(response) { - var displayMessage = _('Password is changed successfully.'); + var displayMessage = dgettext("plugin_passwd", 'Password is changed successfully.'); if(response.info) { displayMessage = response.info.display_message; } - Ext.MessageBox.alert(_('Success'), displayMessage); + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Success'), displayMessage); this.callbackFn.apply(this.scope || this, [ true, response ]); } -}); \ No newline at end of file +}); diff --git a/js/settings/SettingsPasswdCategory.js b/js/settings/SettingsPasswdCategory.js index 87f3753..6cd21d0 100644 --- a/js/settings/SettingsPasswdCategory.js +++ b/js/settings/SettingsPasswdCategory.js @@ -17,7 +17,7 @@ Zarafa.plugins.passwd.settings.SettingsPasswdCategory = Ext.extend(Zarafa.settin config = config || {}; Ext.applyIf(config, { - title : _('Change Password'), + title : dgettext("plugin_passwd", 'Change Password'), categoryIndex : 9997, xtype : 'zarafa.settingspasswdcategory', items : [{ diff --git a/js/settings/SettingsPasswdWidget.js b/js/settings/SettingsPasswdWidget.js index ed2debb..c8b473b 100644 --- a/js/settings/SettingsPasswdWidget.js +++ b/js/settings/SettingsPasswdWidget.js @@ -21,7 +21,7 @@ Zarafa.plugins.passwd.settings.SettingsPasswdWidget = Ext.extend(Zarafa.settings Ext.applyIf(config, { height : 175, width : 400, - title : _('Change Password'), + title : dgettext("plugin_passwd", 'Change Password'), xtype : 'zarafa.settingspasswdwidget', layout : { // override from SettingsWidget diff --git a/languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po b/languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po new file mode 100644 index 0000000..4128c05 --- /dev/null +++ b/languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -0,0 +1,78 @@ +msgid "" +msgstr "" +"Project-Id-Version: zarafa-webap-plugin-passwd\n" +"POT-Creation-Date: 2014-03-04 13:53+0100\n" +"PO-Revision-Date: 2014-03-04 14:34+0100\n" +"Last-Translator: Sander Hoentjen \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.5.4\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: nl\n" + +# php/class.passwdmodule.php:44: +msgid "No data received." +msgstr "Geen data ontvangen." + +# php/class.passwdmodule.php:48: +msgid "User name is empty." +msgstr "Gebruikersnaam is leeg." + +# php/class.passwdmodule.php:52: +msgid "Current password is empty." +msgstr "Huidig wachtwoord is leeg." + +# php/class.passwdmodule.php:56: +msgid "New password is empty." +msgstr "Nieuw wachtwoord is leeg." + +# php/class.passwdmodule.php:60: +msgid "New passwords do not match." +msgstr "Nieuwe wachtwoorden zijn niet gelijk." + +# php/class.passwdmodule.php:137: +# php/class.passwdmodule.php:196: +# js/data/PasswdResponseHandler.js:44: +msgid "Password is changed successfully." +msgstr "Wachtwoord succesvol gewijzigd." + +# php/class.passwdmodule.php:141: +# php/class.passwdmodule.php:200: +msgid "Password is not changed." +msgstr "Wachtwoord is niet aangepast." + +# php/class.passwdmodule.php:144: +# php/class.passwdmodule.php:203: +msgid "" +"Password is weak. Password should contain capital, non capital letters and " +"numbers. Password shuold have 8 to 20 characters." +msgstr "" +"Wachtwoord is zwak. Een wachtwoord moet hoofdletters, kleine letters en " +"cijfers bevatten. Een wachtwoord moet 8 tot 20 karakters bevatten." + +# php/class.passwdmodule.php:147: +msgid "Current password does not match." +msgstr "Huidig wachtwoord klopt niet." + +# js/data/PasswdResponseHandler.js:27: +msgid "An unknown error occurred while changing password." +msgstr "Er is een onbekende fout opgetreden tijdens de wachtwoord wijziging." + +# js/data/PasswdResponseHandler.js:33: +msgid "Error" +msgstr "Fout" + +# js/data/PasswdResponseHandler.js:50: +msgid "Success" +msgstr "Succes" + +# js/settings/SettingsPasswdWidget.js:24: +# js/settings/SettingsPasswdCategory.js:20: +msgid "Change Password" +msgstr "Wijzig wachtwoord" + +# js/PasswdPlugin.js:50: +msgid "Password Change Plugin" +msgstr "Wachtwoord wijzigen plugin" diff --git a/manifest.xml b/manifest.xml index eecb0ea..614a6ee 100644 --- a/manifest.xml +++ b/manifest.xml @@ -12,6 +12,11 @@ config.php + + languages + + + + + + @@ -156,8 +161,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -193,6 +230,7 @@ + diff --git a/languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po similarity index 100% rename from languages/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po rename to language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po diff --git a/manifest.xml b/manifest.xml index 614a6ee..56d418c 100644 --- a/manifest.xml +++ b/manifest.xml @@ -13,7 +13,7 @@ config.php - languages + language From 4f16e8cdc03bc0464b602dc99d2dbafc08ba37dc Mon Sep 17 00:00:00 2001 From: Sander Hoentjen Date: Wed, 5 Mar 2014 14:51:13 +0100 Subject: [PATCH 07/25] fix one string and add some translatable items --- js/settings/PasswdPanel.js | 12 ++++++------ .../nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po | 17 +++++++++++++++++ php/class.passwdmodule.php | 2 +- 3 files changed, 24 insertions(+), 7 deletions(-) diff --git a/js/settings/PasswdPanel.js b/js/settings/PasswdPanel.js index a9c9f70..6083906 100644 --- a/js/settings/PasswdPanel.js +++ b/js/settings/PasswdPanel.js @@ -18,7 +18,7 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { Ext.applyIf(config, { xtype : 'zarafa.passwdpanel', - labelWidth : 150, + labelWidth : 200, defaults : { width : 200 }, @@ -26,11 +26,11 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { items : [{ xtype : 'displayfield', name : 'username', - fieldLabel : 'User name' + fieldLabel : dgettext("plugin_passwd", 'User name') }, { xtype : 'textfield', name : 'current_password', - fieldLabel : 'Current password', + fieldLabel : dgettext("plugin_passwd", 'Current password'), inputType : 'password', listeners : { change : this.onFieldChange, @@ -39,7 +39,7 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { }, { xtype : 'textfield', name : 'new_password', - fieldLabel : 'New password', + fieldLabel : dgettext("plugin_passwd", 'New password'), inputType : 'password', listeners : { change : this.onFieldChange, @@ -48,7 +48,7 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { }, { xtype : 'textfield', name : 'new_password_repeat', - fieldLabel : 'Retype new password', + fieldLabel : dgettext("plugin_passwd", 'Retype new password'), inputType : 'password', listeners : { change : this.onFieldChange, @@ -92,4 +92,4 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { } }); -Ext.reg('zarafa.passwdpanel', Zarafa.plugins.passwd.settings.PasswdPanel); \ No newline at end of file +Ext.reg('zarafa.passwdpanel', Zarafa.plugins.passwd.settings.PasswdPanel); diff --git a/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po index 4128c05..948c1ac 100644 --- a/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po +++ b/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -76,3 +76,20 @@ msgstr "Wijzig wachtwoord" # js/PasswdPlugin.js:50: msgid "Password Change Plugin" msgstr "Wachtwoord wijzigen plugin" + +# js/settings/PasswdPanel.js:29: +msgid "User name" +msgstr "Gebruikersnaam" + +# js/settings/PasswdPanel.js:33: +msgid "Current password" +msgstr "Huidig wachtwoord" + +# js/settings/PasswdPanel.js:42: +msgid "New password" +msgstr "Nieuw wachtwoord" + +#js/settings/PasswdPanel.js:51: +msgid "Retype new password" +msgstr "Herhaal nieuw wachtwoord" + diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index b2ec6b1..b9af00a 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -57,7 +57,7 @@ class PasswdModule extends Module } if($data['new_password'] !== $data['new_password_repeat']) { - $errorMessage = dgettext("plugin_passwd", 'New passwords does not match.'); + $errorMessage = dgettext("plugin_passwd", 'New passwords do not match.'); } if(empty($errorMessage)) { From 95615a68c4d15491327d1b9ba478fa639647d6f3 Mon Sep 17 00:00:00 2001 From: Bastiaan Visser Date: Tue, 1 Apr 2014 13:19:53 +0200 Subject: [PATCH 08/25] fixed error reporing --- php/class.passwdmodule.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index b9af00a..1223940 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -156,8 +156,8 @@ class PasswdModule extends Module $this->sendFeedback(false, array( 'type' => ERROR_ZARAFA, 'info' => array( - 'ldap_error' => ldap_errno(), - 'ldap_error_name' => ldap_error(), + 'ldap_error' => ldap_errno($ldapconn), + 'ldap_error_name' => ldap_error($ldapconn), 'display_message' => $errorMessage ) )); From 2aea28c4f955571d56fc69ef7104809b493c63ff Mon Sep 17 00:00:00 2001 From: Robert Scheck Date: Fri, 13 Feb 2015 01:06:54 +0100 Subject: [PATCH 09/25] Security fix to avoid arbitrary code execution when using Zarafa database user backend Without this patch the following works: - Set PLUGIN_PASSWD_USER_DEFAULT_ENABLE in passwd/config.php to true - Logon at Zarafa WebApp, go to "Settings", choose "Change Password" - Change the password successfully to e.g. "password; touch /tmp/abc" - Result: -rw-r--r--. 1 apache apache 0 Feb 13 01:06 /tmp/abc --- php/class.passwdmodule.php | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index 1223940..cc1a842 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -165,8 +165,7 @@ class PasswdModule extends Module } /** - * Function will execute zarafa-passwd command and will try to change user's password, - * this method is unsecure and unreliable. + * Function will try to change user's password via MAPI in SOAP connection. * @param {Array} $data data sent by client. */ public function saveInDB($data) @@ -176,13 +175,11 @@ class PasswdModule extends Module $passwdRepeat = $data['new_password_repeat']; if($this->checkPasswordStrenth($passwd)) { - $passwd_cmd = '/usr/bin/zarafa-passwd -u %s -o %s -p %s'; - // all information correct, change password - $cmd = sprintf($passwd_cmd, $data['username'], $data['current_password'], $passwd); - exec($cmd, $arrayout, $retval); + $store = $GLOBALS['mapisession']->getDefaultMessageStore(); + $userinfo = mapi_zarafa_getuser_by_name($store, $data['username']); - if ($retval === 0) { + if (mapi_zarafa_setuser($store, $userinfo['userid'], $data['username'], $userinfo['fullname'], $userinfo['emailaddress'], $passwd, 0, $userinfo['admin'])) { // password changed successfully // write new password to session because we don't want user to re-authenticate From e177d9a30a7feed12f80c31e115b179efe201bde Mon Sep 17 00:00:00 2001 From: Robert Scheck Date: Fri, 13 Feb 2015 01:26:43 +0100 Subject: [PATCH 10/25] Corrected typing mistakes and added German translation --- .../de_DE.UTF-8/LC_MESSAGES/plugin_passwd.po | 93 +++++++++++++++++++ .../nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po | 6 +- php/class.passwdmodule.php | 4 +- 3 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 language/de_DE.UTF-8/LC_MESSAGES/plugin_passwd.po diff --git a/language/de_DE.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/de_DE.UTF-8/LC_MESSAGES/plugin_passwd.po new file mode 100644 index 0000000..4de5989 --- /dev/null +++ b/language/de_DE.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -0,0 +1,93 @@ +msgid "" +msgstr "" +"Project-Id-Version: zarafa-webapp-plugin-passwd\n" +"POT-Creation-Date: 2014-03-04 13:53+0100\n" +"PO-Revision-Date: 2014-03-04 14:34+0100\n" +"Last-Translator: Robert Scheck \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" + +# php/class.passwdmodule.php:44: +msgid "No data received." +msgstr "Keine Daten empfangen!" + +# php/class.passwdmodule.php:48: +msgid "User name is empty." +msgstr "Benutzername ist leer!" + +# php/class.passwdmodule.php:52: +msgid "Current password is empty." +msgstr "Aktuelles Passwort ist leer!" + +# php/class.passwdmodule.php:56: +msgid "New password is empty." +msgstr "Neues Passwort ist leer!" + +# php/class.passwdmodule.php:60: +msgid "New passwords do not match." +msgstr "Neue Passwörter stimmen nicht überein!" + +# php/class.passwdmodule.php:137: +# php/class.passwdmodule.php:196: +# js/data/PasswdResponseHandler.js:44: +msgid "Password is changed successfully." +msgstr "Passwort wurde erfolgreich geändert!" + +# php/class.passwdmodule.php:141: +# php/class.passwdmodule.php:200: +msgid "Password is not changed." +msgstr "Passwort wurde nicht geändert!" + +# php/class.passwdmodule.php:144: +# php/class.passwdmodule.php:203: +msgid "" +"Password is weak. Password should contain capital, non-capital letters and " +"numbers. Password should have 8 to 20 characters." +msgstr "" +"Das eingegebene Passwort ist schwach; es sollte große und kleine Buchstaben " +"sowie Ziffern enthalten und zwischen 8 und 20 Zeichen lang sein!" + +# php/class.passwdmodule.php:147: +msgid "Current password does not match." +msgstr "Aktuelles Passwort ist falsch!" + +# js/data/PasswdResponseHandler.js:27: +msgid "An unknown error occurred while changing password." +msgstr "Beim Ändern des Passworts ist ein unbekannter Fehler aufgetreten!" + +# js/data/PasswdResponseHandler.js:33: +msgid "Error" +msgstr "Fehler" + +# js/data/PasswdResponseHandler.js:50: +msgid "Success" +msgstr "Erfolg" + +# js/settings/SettingsPasswdWidget.js:24: +# js/settings/SettingsPasswdCategory.js:20: +msgid "Change Password" +msgstr "Passwort ändern" + +# js/PasswdPlugin.js:50: +msgid "Password Change Plugin" +msgstr "Passwortänderungsplugin" + +# js/settings/PasswdPanel.js:29: +msgid "User name" +msgstr "Benutzername" + +# js/settings/PasswdPanel.js:33: +msgid "Current password" +msgstr "Aktuelles Passwort" + +# js/settings/PasswdPanel.js:42: +msgid "New password" +msgstr "Neues Passwort" + +#js/settings/PasswdPanel.js:51: +msgid "Retype new password" +msgstr "Wiederholung" diff --git a/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po index 948c1ac..6f7ed98 100644 --- a/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po +++ b/language/nl_NL.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"Project-Id-Version: zarafa-webap-plugin-passwd\n" +"Project-Id-Version: zarafa-webapp-plugin-passwd\n" "POT-Creation-Date: 2014-03-04 13:53+0100\n" "PO-Revision-Date: 2014-03-04 14:34+0100\n" "Last-Translator: Sander Hoentjen \n" @@ -46,8 +46,8 @@ msgstr "Wachtwoord is niet aangepast." # php/class.passwdmodule.php:144: # php/class.passwdmodule.php:203: msgid "" -"Password is weak. Password should contain capital, non capital letters and " -"numbers. Password shuold have 8 to 20 characters." +"Password is weak. Password should contain capital, non-capital letters and " +"numbers. Password should have 8 to 20 characters." msgstr "" "Wachtwoord is zwak. Een wachtwoord moet hoofdletters, kleine letters en " "cijfers bevatten. Een wachtwoord moet 8 tot 20 karakters bevatten." diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index cc1a842..cda26dd 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -141,7 +141,7 @@ class PasswdModule extends Module $errorMessage = dgettext("plugin_passwd", 'Password is not changed.'); } } else { - $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non capital letters and numbers. Password shuold have 8 to 20 characters.'); + $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.'); } } else { $errorMessage = dgettext("plugin_passwd", 'Current password does not match.'); @@ -197,7 +197,7 @@ class PasswdModule extends Module $errorMessage = dgettext("plugin_passwd", 'Password is not changed.'); } } else { - $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non capital letters and numbers. Password shuold have 8 to 20 characters.'); + $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.'); } if(!empty($errorMessage)) { From ceebc4174e6f67998dc4ec1d06a425248bedb06c Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 20 May 2015 01:34:29 +0200 Subject: [PATCH 11/25] LDAP bugfixes, allow non anonymous binds and ssl/tls --- config.php | 11 +++- php/class.passwdmodule.php | 112 ++++++++++++++++++++++++++----------- 2 files changed, 90 insertions(+), 33 deletions(-) diff --git a/config.php b/config.php index 133f679..0dcc16f 100644 --- a/config.php +++ b/config.php @@ -9,7 +9,16 @@ define('PLUGIN_PASSWD_LDAP', false); define('PLUGIN_PASSWD_LDAP_BASEDN', 'dc=example,dc=com'); /** URI to access LDAP server **/ -define('PLUGIN_PASSWD_LDAP_URI', 'localhost'); +define('PLUGIN_PASSWD_LDAP_URI', 'ldap://localhost'); + +/** Use TLS to access LDAP server **/ +define('PLUGIN_PASSWD_LDAP_USE_TLS', true); + +/** Bind DN to access LDAP server (keep empty for anonymous bind) **/ +define('PLUGIN_PASSWD_LDAP_BIND_DN', ""); + +/** Bind password to access LDAP server (keep empty for anonymous bind) **/ +define('PLUGIN_PASSWD_LDAP_BIND_PW', ""); /** Set to true if you login with username@tenantname **/ define('PLUGIN_PASSWD_LOGIN_WITH_TENANT', false); diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index cda26dd..f2f4a02 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -97,11 +97,23 @@ class PasswdModule extends Module $uid = $data['username']; } + // check if we should use tls! + if(strrpos(PLUGIN_PASSWD_LDAP_URI, "ldaps://", -strlen(PLUGIN_PASSWD_LDAP_URI)) === FALSE && PLUGIN_PASSWD_LDAP_USE_TLS === true) { + ldap_start_tls($ldapconn); + } + + // set connection parametes + ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); + ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0); + + // now bind to the ldap server to search the user dn + ldap_bind($ldapconn, PLUGIN_PASSWD_LDAP_BIND_DN, PLUGIN_PASSWD_LDAP_BIND_PW); + // search for the user dn that will be used to do login into LDAP $userdn = ldap_search ( $ldapconn, // connection-identify PLUGIN_PASSWD_LDAP_BASEDN, // basedn - 'uid=' . $uid, // search filter + 'uid=' . $uid, // search filter array('dn') // needed attributes. we need the dn ); @@ -110,25 +122,34 @@ class PasswdModule extends Module $userdn = $userdn[0]['dn']; // bind to ldap directory - ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3); - // login with current password if that fails then current password is wrong - $bind = ldap_bind($ldapconn, $userdn, $data['current_password']); + ldap_bind($ldapconn, $userdn, $data['current_password']); if(ldap_errno($ldapconn) === 0) { - $passwd = $data['new_password']; - $passwdRepeat = $data['new_password_repeat']; - if($this->checkPasswordStrenth($passwd)) { + $passwd = $data['new_password']; + + if ($this->checkPasswordStrenth($passwd)) { $password_hash = $this->sshaEncode($passwd); $entry = array('userPassword' => $password_hash); - $return_mod = ldap_modify($ldapconn, $userdn, $entry); + ldap_modify($ldapconn, $userdn, $entry); if (ldap_errno($ldapconn) === 0) { // password changed successfully // write new password to session because we don't want user to re-authenticate session_start(); - $_SESSION['password'] = $passwd; + // if user has openssl module installed + if(function_exists("openssl_encrypt")) { + // In PHP 5.3.3 the iv parameter was added + if(version_compare(phpversion(), "5.3.3", "<")) { + $_SESSION['password'] = openssl_encrypt($passwd,"des-ede3-cbc",PASSWORD_KEY,0); + } else { + $_SESSION['password'] = openssl_encrypt($passwd,"des-ede3-cbc",PASSWORD_KEY,0,PASSWORD_IV); + } + } + else { + $_SESSION['password'] = $passwd; + } session_write_close(); // send feedback to client @@ -172,32 +193,60 @@ class PasswdModule extends Module { $errorMessage = ''; $passwd = $data['new_password']; - $passwdRepeat = $data['new_password_repeat']; - if($this->checkPasswordStrenth($passwd)) { - // all information correct, change password - $store = $GLOBALS['mapisession']->getDefaultMessageStore(); - $userinfo = mapi_zarafa_getuser_by_name($store, $data['username']); - - if (mapi_zarafa_setuser($store, $userinfo['userid'], $data['username'], $userinfo['fullname'], $userinfo['emailaddress'], $passwd, 0, $userinfo['admin'])) { - // password changed successfully - - // write new password to session because we don't want user to re-authenticate - session_start(); - $_SESSION['password'] = $passwd; - session_write_close(); - - // send feedback to client - $this->sendFeedback(true, array( - 'info' => array( - 'display_message' => dgettext("plugin_passwd", 'Password is changed successfully.') - ) - )); + // get current session password + $sessionPass = $_SESSION['password']; + // if user has openssl module installed + if (function_exists("openssl_decrypt")) { + if (version_compare(phpversion(), "5.3.3", "<")) { + $sessionPass = openssl_decrypt($sessionPass, "des-ede3-cbc", PASSWORD_KEY, 0); } else { - $errorMessage = dgettext("plugin_passwd", 'Password is not changed.'); + $sessionPass = openssl_decrypt($sessionPass, "des-ede3-cbc", PASSWORD_KEY, 0, PASSWORD_IV); + } + + if (!$sessionPass) { + $sessionPass = $_SESSION['password']; + } + } + + if($data['current_password'] === $sessionPass) { + if ($this->checkPasswordStrenth($passwd)) { + // all information correct, change password + $store = $GLOBALS['mapisession']->getDefaultMessageStore(); + $userinfo = mapi_zarafa_getuser_by_name($store, $data['username']); + + if (mapi_zarafa_setuser($store, $userinfo['userid'], $data['username'], $userinfo['fullname'], $userinfo['emailaddress'], $passwd, 0, $userinfo['admin'])) { + // password changed successfully + + // write new password to session because we don't want user to re-authenticate + session_start(); + // if user has openssl module installed + if (function_exists("openssl_encrypt")) { + // In PHP 5.3.3 the iv parameter was added + if (version_compare(phpversion(), "5.3.3", "<")) { + $_SESSION['password'] = openssl_encrypt($passwd, "des-ede3-cbc", PASSWORD_KEY, 0); + } else { + $_SESSION['password'] = openssl_encrypt($passwd, "des-ede3-cbc", PASSWORD_KEY, 0, PASSWORD_IV); + } + } else { + $_SESSION['password'] = $passwd; + } + session_write_close(); + + // send feedback to client + $this->sendFeedback(true, array( + 'info' => array( + 'display_message' => dgettext("plugin_passwd", 'Password is changed successfully.') + ) + )); + } else { + $errorMessage = dgettext("plugin_passwd", 'Password is not changed.'); + } + } else { + $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.'); } } else { - $errorMessage = dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.'); + $errorMessage = dgettext("plugin_passwd", 'Current password does not match.'); } if(!empty($errorMessage)) { @@ -222,7 +271,6 @@ class PasswdModule extends Module */ public function checkPasswordStrenth($password) { - // @FIXME should be moved to client side if (preg_match("#.*^(?=.{8,20})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$#", $password)) { return true; } else { From 33d35759a3561daa208af8a0fb4b96dab7e95658 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 20 May 2015 01:39:42 +0200 Subject: [PATCH 12/25] Improved UI, added password strength meter, frontend checks and an password change icon. --- CHANGELOG.md | 7 +- builds/passwd-1.2.zip | Bin 0 -> 18750 bytes js/external/PasswordMeter.js | 191 ++++++++++++++++++++++++++ js/settings/PasswdPanel.js | 12 +- js/settings/SettingsPasswdCategory.js | 5 +- js/settings/SettingsPasswdWidget.js | 44 +++++- lib/PasswordMeter.js | 158 --------------------- manifest.xml | 22 ++- resources/css/passwd-main.css | 27 ++++ resources/images/icon_lock.png | Bin 0 -> 452 bytes resources/images/icon_lock.xcf | Bin 0 -> 1268 bytes 11 files changed, 281 insertions(+), 185 deletions(-) create mode 100644 builds/passwd-1.2.zip create mode 100644 js/external/PasswordMeter.js delete mode 100644 lib/PasswordMeter.js create mode 100644 resources/css/passwd-main.css create mode 100644 resources/images/icon_lock.png create mode 100644 resources/images/icon_lock.xcf diff --git a/CHANGELOG.md b/CHANGELOG.md index bb351c5..a66252f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,4 +4,9 @@ ## 1.1 (19th Dec 2013) - - Bug fixes for LDAP plugin \ No newline at end of file + - Bug fixes for LDAP plugin + +## 1.2 (20th May 2015) + + - Bug fixes for LDAP plugin + - Improved UI \ No newline at end of file diff --git a/builds/passwd-1.2.zip b/builds/passwd-1.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..1706ae5326bb95af022d2c350993e1935828844b GIT binary patch literal 18750 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 + * @version 0.1 + * @license MIT License: http://www.opensource.org/licenses/mit-license.php + * + * This implementation of the password fields shows a nice graph of how + * secure the password is. + * Original implementation for ExtJS 1.1 from http://testcases.pagebakers.com/PasswordMeter/. + */ +Ext.ux.form.field.PasswordMeter = Ext.extend(Ext.form.TextField, { + + /** + * @constructor + * @param {Object} config configuration object + */ + constructor : function(config) + { + config = config || {}; + + Ext.applyIf(config, { + xtype : 'ux.passwordmeterfield', + inputType: 'password', + enableKeyEvents: true + }); + + Ext.ux.form.field.PasswordMeter.superclass.constructor.call(this, config); + }, + + // private + initComponent:function() + { + Ext.ux.form.field.PasswordMeter.superclass.initComponent.apply(this, arguments); + }, + + // private + reset: function() + { + Ext.ux.form.field.PasswordMeter.superclass.reset.call(this); + this.updateMeter(); + }, + + // private + onKeyUp : function(event) + { + Ext.ux.form.field.PasswordMeter.superclass.onKeyUp.call(this); + + this.updateMeter(this.getValue()); + + this.fireEvent('keyup', this, event); + }, + + // private + afterRender: function() + { + Ext.ux.form.field.PasswordMeter.superclass.afterRender.call(this); + + + var width = this.getEl().getWidth(); + this.strengthMeterID = newID = Ext.id(); + this.scoreBarID = Ext.id(); + var objMeter = Ext.DomHelper.insertAfter(this.getEl(), { + tag: "div", + 'class': "x-form-strengthmeter", + 'id': this.strengthMeterID, + 'style' : { + width: width + 'px' + } + }); + Ext.DomHelper.append(objMeter, { + tag: "div", + 'class': "x-form-strengthmeter-scorebar", + 'id': this.scoreBarID + }); + + this.fireEvent('afterrender', this); + }, + + /** + * Return the score of the entered password. + * It is a number between 0 and 100 where 100 is a very safe password. + * + * @returns {Number} + */ + getScore : function() + { + return this.calcStrength(this.getValue()); + }, + + /** + * Sets the width of the meter, based on the score + * + * @param {String} val The current password + */ + updateMeter : function(val) + { + var maxWidth, score, scoreWidth, objMeter, scoreBar; + + objMeter = Ext.get(this.strengthMeterID); + scoreBar = Ext.get(this.scoreBarID); + + maxWidth = objMeter.getWidth(); + if (val){ + score = this.calcStrength(val); + scoreWidth = maxWidth - (maxWidth / 100) * score; + scoreBar.applyStyles({margin: "0 0 0 " + (maxWidth - scoreWidth) + "px"}); // move the overlay to the right + scoreBar.setWidth(scoreWidth, false); // downsize the overlay + } else { + scoreBar.applyStyles({margin: "0"}); + scoreBar.setWidth(maxWidth, false); + } + }, + + /** + * Calculates the strength of a password + * + * @param {Object} p The password that needs to be calculated + * @return {int} intScore The strength score of the password + */ + calcStrength: function(p) + { + // PASSWORD LENGTH + var len = p.length, score = len; + + if (len > 0 && len <= 4) { // length 4 or + // less + score += len + } else if (len >= 5 && len <= 7) { + // length between 5 and 7 + score += 6; + } else if (len >= 8 && len <= 15) { + // length between 8 and 15 + score += 12; + } else if (len >= 16) { // length 16 or more + score += 18; + } + + // LETTERS (Not exactly implemented as dictacted above + // because of my limited understanding of Regex) + if (p.match(/[a-z]/)) { + // [verified] at least one lower case letter + score += 1; + } + if (p.match(/[A-Z]/)) { // [verified] at least one upper + // case letter + score += 5; + } + // NUMBERS + if (p.match(/\d/)) { // [verified] at least one + // number + score += 5; + } + if (p.match(/(?:.*?\d){3}/)) { + // [verified] at least three numbers + score += 5; + } + + // SPECIAL CHAR + if (p.match(/[\!,@,#,$,%,\^,&,\*,\?,_,~]/)) { + // [verified] at least one special character + score += 5; + } + // [verified] at least two special characters + if (p.match(/(?:.*?[\!,@,#,$,%,\^,&,\*,\?,_,~]){2}/)) { + score += 5; + } + + // COMBOS + if (p.match(/(?=.*[a-z])(?=.*[A-Z])/)) { + // [verified] both upper and lower case + score += 2; + } + if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)) { + // [verified] both letters and numbers + score += 2; + } + // [verified] letters, numbers, and special characters + if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\!,@,#,$,%,\^,&,\*,\?,_,~])/)) { + score += 2; + } + + return Math.min(Math.round(score * 2), 100); + } +}); + +Ext.reg('ux.passwordmeterfield', Ext.ux.form.field.PasswordMeter); \ No newline at end of file diff --git a/js/settings/PasswdPanel.js b/js/settings/PasswdPanel.js index 6083906..730d695 100644 --- a/js/settings/PasswdPanel.js +++ b/js/settings/PasswdPanel.js @@ -30,26 +30,30 @@ Zarafa.plugins.passwd.settings.PasswdPanel = Ext.extend(Ext.form.FormPanel, { }, { xtype : 'textfield', name : 'current_password', + ref : 'current_password', fieldLabel : dgettext("plugin_passwd", 'Current password'), inputType : 'password', + allowBlank : false, listeners : { change : this.onFieldChange, scope : this } }, { - xtype : 'textfield', + xtype : 'ux.passwordmeterfield', name : 'new_password', + ref : 'new_password', + allowBlank : false, fieldLabel : dgettext("plugin_passwd", 'New password'), - inputType : 'password', listeners : { change : this.onFieldChange, scope : this } }, { - xtype : 'textfield', + xtype : 'ux.passwordmeterfield', name : 'new_password_repeat', + allowBlank : false, + ref : 'new_password_repeat', fieldLabel : dgettext("plugin_passwd", 'Retype new password'), - inputType : 'password', listeners : { change : this.onFieldChange, scope : this diff --git a/js/settings/SettingsPasswdCategory.js b/js/settings/SettingsPasswdCategory.js index 6cd21d0..fd73c68 100644 --- a/js/settings/SettingsPasswdCategory.js +++ b/js/settings/SettingsPasswdCategory.js @@ -19,11 +19,14 @@ Zarafa.plugins.passwd.settings.SettingsPasswdCategory = Ext.extend(Zarafa.settin Ext.applyIf(config, { title : dgettext("plugin_passwd", 'Change Password'), categoryIndex : 9997, + iconCls : 'zarafa-settings-category-passwd', xtype : 'zarafa.settingspasswdcategory', items : [{ xtype : 'zarafa.settingspasswdwidget', settingsContext : config.settingsContext - }] + }, + container.populateInsertionPoint('context.settings.category.passwd', this) + ] }); Zarafa.plugins.passwd.settings.SettingsPasswdCategory.superclass.constructor.call(this, config); diff --git a/js/settings/SettingsPasswdWidget.js b/js/settings/SettingsPasswdWidget.js index c8b473b..59a93b6 100644 --- a/js/settings/SettingsPasswdWidget.js +++ b/js/settings/SettingsPasswdWidget.js @@ -19,14 +19,9 @@ Zarafa.plugins.passwd.settings.SettingsPasswdWidget = Ext.extend(Zarafa.settings config = config || {}; Ext.applyIf(config, { - height : 175, - width : 400, title : dgettext("plugin_passwd", 'Change Password'), xtype : 'zarafa.settingspasswdwidget', - layout : { - // override from SettingsWidget - type : 'fit' - }, + layout: 'form', items : [{ xtype : 'zarafa.passwdpanel', ref : 'passwdPanel', @@ -51,10 +46,42 @@ Zarafa.plugins.passwd.settings.SettingsPasswdWidget = Ext.extend(Zarafa.settings // listen to savesettings and discardsettings to save/discard delegation data var contextModel = this.settingsContext.getModel(); + this.mon(contextModel, 'beforesavesettings', this.onBeforeSaveSettings, this); this.mon(contextModel, 'savesettings', this.onSaveSettings, this); this.mon(contextModel, 'discardsettings', this.onDiscardSettings, this); }, + /** + * Event handler will be called when {@link Zarafa.settings.SettingsContextModel#beforesavesettings} event is fired. + * This function will validate the formdata. + * + * @private + */ + onBeforeSaveSettings : function() + { + // do some quick checks before submitting + if(this.passwdPanel.new_password.getValue() != this.passwdPanel.new_password_repeat.getValue()) { + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), dgettext("plugin_passwd", 'New passwords do not match.')); + return false; + } else if(Ext.isEmpty(this.passwdPanel.current_password.getValue())) { + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), dgettext("plugin_passwd", 'Current password is empty.')); + return false; + } else if(Ext.isEmpty(this.passwdPanel.new_password.getValue()) || Ext.isEmpty(this.passwdPanel.new_password_repeat.getValue())) { + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), dgettext("plugin_passwd", 'New password is empty.')); + return false; + } else if(!this.passwdPanel.getForm().isValid()) { + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), dgettext("plugin_passwd", 'One or more fields does contain errors.')); + return false; + } else { + // do a quick score check: + if(this.passwdPanel.new_password.getScore() < 70) { + Ext.MessageBox.alert(dgettext("plugin_passwd", 'Error'), dgettext("plugin_passwd", 'Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.')); + return false; + } + return true; + } + }, + /** * Event handler will be called when {@link Zarafa.settings.SettingsContextModel#savesettings} event is fired. * This will relay this event to {@link Zarafa.plugins.passwd.settings.PasswdPanel PasswdPanel} so it can @@ -71,8 +98,11 @@ Zarafa.plugins.passwd.settings.SettingsPasswdWidget = Ext.extend(Zarafa.settings // send request container.getRequest().singleRequest('passwdmodule', 'save', data, new Zarafa.plugins.passwd.data.PasswdResponseHandler({ - callbackFn : function(success, response) { + callbackFn: function (success, response) { this.ownerCt.hideSavingMask(success); + if(success) { + this.passwdPanel.getForm().reset(); + } }, scope : this })); diff --git a/lib/PasswordMeter.js b/lib/PasswordMeter.js deleted file mode 100644 index 7406beb..0000000 --- a/lib/PasswordMeter.js +++ /dev/null @@ -1,158 +0,0 @@ -// Create user extensions namespace (Ext.ux) -Ext.namespace('Ext.ux'); - -/** - * Ext.ux.PasswordMeter Extension Class - * - * @author Eelco Wiersma - * @version 0.2 - * - * Algorithm based on code of Tane - * http://digitalspaghetti.me.uk/index.php?q=jquery-pstrength - * and Steve Moitozo - * http://www.geekwisdom.com/dyn/passwdmeter - * - * @license MIT License: http://www.opensource.org/licenses/mit-license.php - * - * @class Ext.ux.PasswordMeter - * @extends Ext.form.TextField - * @constructor - * Creates new Ext.ux.PasswordMeter - */ -Ext.ux.PasswordMeter = function(config) { - - // call parent constructor - Ext.ux.PasswordMeter.superclass.constructor.call(this, config); - -}; - -Ext.extend(Ext.ux.PasswordMeter, Ext.form.TextField, { - /** - * @cfg {String} inputType The type attribute for input fields -- e.g. text, password (defaults to "password"). - */ - inputType: 'text', - // private - onRender: function(ct, position) { - Ext.ux.PasswordMeter.superclass.onRender.call(this, ct, position); - - var elp = this.el.findParent('.x-form-element', 5, true); - this.objMeter = ct.createChild({tag: "div", 'class': "strengthMeter"}); - - this.objMeter.setWidth(elp.getWidth(true)-17); - this.scoreBar = this.objMeter.createChild({tag: "div", 'class': "scoreBar"}); - - if(Ext.isIE && !Ext.isIE7) { // Fix style for IE6 - this.objMeter.setStyle('margin-left', '3px'); - } - }, - // private - initEvents: function() { - Ext.ux.PasswordMeter.superclass.initEvents.call(this); - - this.el.on('keyup', this.updateMeter, this); - }, - /** - * Sets the width of the meter, based on the score - * @param {Object} e - * Private function - */ - updateMeter: function(e) { - var score = 0 - var p = e.target.value; - - var maxWidth = this.objMeter.getWidth() - 2; - - var nScore = this.calcStrength(p); - - // Set new width - var nRound = Math.round(nScore * 2); - - if (nRound > 100) { - nRound = 100; - } - - var scoreWidth = (maxWidth / 100) * nRound; - this.scoreBar.setWidth(scoreWidth, true); - }, - /** - * Calculates the strength of a password - * @param {Object} p The password that needs to be calculated - * @return {int} intScore The strength score of the password - */ - calcStrength: function(p) { - var intScore = 0; - - // PASSWORD LENGTH - intScore += p.length; - - if(p.length > 0 && p.length <= 4) { // length 4 or less - intScore += p.length; - } - else if (p.length >= 5 && p.length <= 7) { // length between 5 and 7 - intScore += 6; - } - else if (p.length >= 8 && p.length <= 15) { // length between 8 and 15 - intScore += 12; - //alert(intScore); - } - else if (p.length >= 16) { // length 16 or more - intScore += 18; - //alert(intScore); - } - - // LETTERS (Not exactly implemented as dictacted above because of my limited understanding of Regex) - if (p.match(/[a-z]/)) { // [verified] at least one lower case letter - intScore += 1; - } - if (p.match(/[A-Z]/)) { // [verified] at least one upper case letter - intScore += 5; - } - // NUMBERS - if (p.match(/\d/)) { // [verified] at least one number - intScore += 5; - } - if (p.match(/.*\d.*\d.*\d/)) { // [verified] at least three numbers - intScore += 5; - } - - // SPECIAL CHAR - if (p.match(/[!,@,#,$,%,^,&,*,?,_,~]/)) { // [verified] at least one special character - intScore += 5; - } - // [verified] at least two special characters - if (p.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)) { - intScore += 5; - } - - // COMBOS - if (p.match(/(?=.*[a-z])(?=.*[A-Z])/)) { // [verified] both upper and lower case - intScore += 2; - } - if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)) { // [verified] both letters and numbers - intScore += 2; - } - // [verified] letters, numbers, and special characters - if (p.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)) { - intScore += 2; - } - - return intScore; - - }, - // private - onFocus: function() { - Ext.ux.PasswordMeter.superclass.onFocus.call(this); - - if(!Ext.isOpera) { // don't touch in Opera - this.objMeter.addClass('strengthMeter-focus'); - } - }, - // private - onBlur: function() { - Ext.ux.PasswordMeter.superclass.onBlur.call(this); - - if(!Ext.isOpera) { // don't touch in Opera - this.objMeter.removeClass('strengthMeter-focus'); - } - } -}); \ No newline at end of file diff --git a/manifest.xml b/manifest.xml index 56d418c..c9e6440 100644 --- a/manifest.xml +++ b/manifest.xml @@ -2,7 +2,7 @@ - 1.0 + 1.2 Passwd Password Change Plugin Saket Patel @@ -18,19 +18,6 @@ - @@ -40,13 +27,20 @@ js/passwd.js js/passwd-debug.js + js/PasswdPlugin.js js/settings/SettingsPasswdCategory.js js/settings/SettingsPasswdWidget.js js/settings/PasswdPanel.js js/data/PasswdResponseHandler.js js/ABOUT.js + js/external/PasswordMeter.js + + resources/css/passwd.css + resources/css/passwd.css + resources/css/passwd-main.css + diff --git a/resources/css/passwd-main.css b/resources/css/passwd-main.css new file mode 100644 index 0000000..7091cd7 --- /dev/null +++ b/resources/css/passwd-main.css @@ -0,0 +1,27 @@ +.zarafa-settings-category-passwd { + background-image: url(../images/icon_lock.png) !important; +} + +/* STYLES FOR THE PASSWORD METER */ +.x-form-strengthmeter { + width : 100%; + height: 5px; + /*float: right;*/ + background: #ff4c00; /* Old browsers */ + /* IE9 SVG, needs conditional override of 'filter' to 'none' */ + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmNGMwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2VkZDcxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxYWZmMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(left, #ff4c00 0%, #edd712 50%, #1aff00 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%,#ff4c00), color-stop(50%,#edd712), color-stop(100%,#1aff00)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* IE10+ */ + background: linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff4c00', endColorstr='#1aff00',GradientType=1 ); /* IE6-8 */ +} + +.x-form-strengthmeter-scorebar { + background-color: white; + opacity: 0.7; + height: 5px; + width: 100%; +} \ No newline at end of file diff --git a/resources/images/icon_lock.png b/resources/images/icon_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..be4689ed8a7099009fbab6d3780b66e12fb1b190 GIT binary patch literal 452 zcmV;#0XzPQP)vTV86&O7uagGmQ?k@rhO6F23CQ409Cz;qG+QsP*qp#^BGu= zrE3n(`I^fWzAKv?)wR*GhU@#cee+7z2_Of1c5_q5Znr%67 zG#UX6C)wv!WMV2JTG}>I6m44JL(?IUX6zK0H67dfUJwL#y5Lp6n!sAwN6_)qIFXjSx%9Wj^YPW5nL+B3!@7~D$_KH!E{n4BeW|Et_2q& zC@yp*1?yfa?)(9Yze8F?N{z|&+)SR0IK@BUh4b#YU+>-An;=|TwpU!=_QS{%kfSA- z9|okvaReB>{MdTI0OuqNFo9zw=e#N8ABV07xV9NCbpo#$^uk5B1maROlKyJs*-0FQ zi!-%`AGmQ8_v}WYn!RA5W6z$PEo2C3m7y7wE(|HvaeIHlr7OvD#|^uI-O_KtxjM{Q z`kMEKxv6UFX5PB8d@ z8~}LY1dNuPCw{2pP=Y7VIV?3m^RWsaukeWqp9JT7`8~e(AfW5@wskL@b`b}Q?i{&> zGjM62(P7&Z*}S7nl{@%`+));@5oQt$fe~RULl`RW;qg3y+hnWFR$p7!*^0Gw11(Od ztS!{I%5E0tt$&|CZwp6_DbfDl63=a)iB+bwV_f)1^!b{_o0}tx@_B6T`xMcaxf7d2 zXYq%mr|6S~b)*}lB$kvK&*(ktr}U;?*w5(|>os~iu%FONwja>?BtHr+y0N3t`QDwaIImnYW-e1q@&V2abw`BnJ~ DKW0Xm literal 0 HcmV?d00001 From bc3800e6185363cbb04208b63c9919fa384a4f48 Mon Sep 17 00:00:00 2001 From: Saket Patel Date: Fri, 29 May 2015 01:42:28 +0530 Subject: [PATCH 13/25] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 825fe92..34c0cbc 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,4 @@ For his original work check this [link](https://community.zarafa.com/pg/plugins/ ## Notes - Feedback/Bug Reports are welcome -- If anyone is good at creating icons then please help me add a good icon to change password tab (credits will be given) - -## Todo -- Add password strength meter on client side, so user can create complex passwords -- Check on client side for empty fields \ No newline at end of file +- thanks to h44z for adding password meter and icon for the plugin From eefb5fbc96d93532b4d2bb6cff59cd48fd04ced3 Mon Sep 17 00:00:00 2001 From: David Horvath Date: Fri, 8 Apr 2016 21:24:06 +0200 Subject: [PATCH 14/25] add hungarian language --- .../hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo | Bin 0 -> 1877 bytes .../hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po | 94 ++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo create mode 100644 language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po diff --git a/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo new file mode 100644 index 0000000000000000000000000000000000000000..20613f38b9519f87194df8c2e40ca9cec65bf326 GIT binary patch literal 1877 zcmZ{kO>ZMb5QYZ`U*>xe-@B+5IDoP<*vS%%Ll99&mZ04wBwpa!nW@;5nd!E=d+fv@ z@dvm>0wHlg%Fzc75a56~EE?q>aN)uMiGRRtCA4pk9oyN6mfBBGb#>KSHPim<+|1V= z#*>)mF@M6mfO+*U{9xP!=fK~=$H0HV$HAGqJ&(Yrz~{jQ@LupE@L}*1@M$mtUjRP? zp8&rZ*$3c7Jl_PL1^)&=2XBE+%icYncR%dXHc_eJ&*YOPv@qrb`B*hQT9Ex^gI)@iQRs8wgHbMU(=jP;vZNRtYybb~e( zinp{CwmD4b?V*@=b!qiYX$>NN2M1*<7cKUiEV2ewuB~5NozzeZs+AQq9ABc}L~j~o zdC$JyN%002%ibBbOE;QpetqKSRP3k>*;Y{+iO6X^=!i@MxCi z7HPO#dR5ZJC91u)I2P5Qh%2A^S6H$hmbIZciY?WGdhljYt9a`sW6d^YN$q%BkS%`E zwiw{z2-@Y;^ot|PxYaEVQ>*$`*y7NLMCri$;Qw~r4$G8V@ks=4*{x37@RejP@(woA z5qAQXz6SwxcFF6Tti!&+) zI^jOPbrQId<62HtNlDDDVt@{OZ;ua#CAfB2GI4^Q8MG`bjv{5?psW?a#AjGsxtXVk zU)Ept5;E{N6;M-XT)s^7Wh^M+G$m{wX3F9|iq^gli3SSHHrwMLY(SF;SuEo$&!~P0 ze_VUz64x-nWl3-gaf4loV7gV1IcULb`mDXJp?GhN)3z{ui5FWO$zsqwYdPK4+usW^ AS^xk5 literal 0 HcmV?d00001 diff --git a/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po new file mode 100644 index 0000000..0ba79d5 --- /dev/null +++ b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -0,0 +1,94 @@ +msgid "" +msgstr "" +"Project-Id-Version: zarafa-webapp-plugin-passwd\n" +"POT-Creation-Date: 2014-03-04 13:53+0100\n" +"PO-Revision-Date: 2016-04-08 21:10+0200\n" +"Last-Translator: Robert Scheck \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" +"X-Generator: Poedit 1.8.7.1\n" + +# php/class.passwdmodule.php:44: +msgid "No data received." +msgstr "Nem érkezett adat." + +# php/class.passwdmodule.php:48: +msgid "User name is empty." +msgstr "Felhasználónév mező üres." + +# php/class.passwdmodule.php:52: +msgid "Current password is empty." +msgstr "Jelenlegi jelszó mező üres." + +# php/class.passwdmodule.php:56: +msgid "New password is empty." +msgstr "Új jelszó mező üres." + +# php/class.passwdmodule.php:60: +msgid "New passwords do not match." +msgstr "Az új jelszavak nem egyeznek." + +# php/class.passwdmodule.php:137: +# php/class.passwdmodule.php:196: +# js/data/PasswdResponseHandler.js:44: +msgid "Password is changed successfully." +msgstr "A jelszót sikeresen módosította." + +# php/class.passwdmodule.php:141: +# php/class.passwdmodule.php:200: +msgid "Password is not changed." +msgstr "A jelszó nem módosult." + +# php/class.passwdmodule.php:144: +# php/class.passwdmodule.php:203: +msgid "" +"Password is weak. Password should contain capital, non-capital letters and " +"numbers. Password should have 8 to 20 characters." +msgstr "" +"A jelszó gyenge. Tartalmaznia kell számot, nagy- és kisbetűt. A jelszó " +"minimum 8, maximum 20 karakter legyen." + +# php/class.passwdmodule.php:147: +msgid "Current password does not match." +msgstr "A jelenlegi jelszó nem megfelelő." + +# js/data/PasswdResponseHandler.js:27: +msgid "An unknown error occurred while changing password." +msgstr "Ismeretlen hiba történt a jelszó megváltoztatásakor." + +# js/data/PasswdResponseHandler.js:33: +msgid "Error" +msgstr "Hiba" + +# js/data/PasswdResponseHandler.js:50: +msgid "Success" +msgstr "Sikeres" + +# js/settings/SettingsPasswdWidget.js:24: +# js/settings/SettingsPasswdCategory.js:20: +msgid "Change Password" +msgstr "Jelszó megváltoztatása" + +# js/PasswdPlugin.js:50: +msgid "Password Change Plugin" +msgstr "Jelszóváltoztatás kiegészítő" + +# js/settings/PasswdPanel.js:29: +msgid "User name" +msgstr "Felhasználónév" + +# js/settings/PasswdPanel.js:33: +msgid "Current password" +msgstr "Jelenlegi jelszó" + +# js/settings/PasswdPanel.js:42: +msgid "New password" +msgstr "Új jelszó" + +# js/settings/PasswdPanel.js:51: +msgid "Retype new password" +msgstr "Új jelszó mégegyszer" From f0756b10ceacc3c177f338459bca7374d20218cd Mon Sep 17 00:00:00 2001 From: David Horvath Date: Fri, 8 Apr 2016 21:29:03 +0200 Subject: [PATCH 15/25] add translator information --- .../hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo | Bin 1877 -> 1866 bytes .../hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.mo index 20613f38b9519f87194df8c2e40ca9cec65bf326..e9141a1e651ea17b3fb69133d4f1c96592fad868 100644 GIT binary patch delta 209 zcmcc0cZzSqmik;q28K<{3=EbG3=9ga3=EP$ItoY&0_hSUtqi2wfV3QtUInCCfb>Zq z%?+f_0ci;!eG4l88AuBQ`9f?A3`#&+4M>CZdje^Yx?CV#1f<)5v^bFd$;KeYzz$>x z0tt|Xl0X_{k@jX!#z#y{Mi!HGS;VDX63a4E6g={a$`VU56l_uwlZzZcgkDDJ10 znj1*p1kw^f`YBZYACMLX@@3f=7?gmtA&>^?4*}93brnFm2uM!^(&9jxg`Gi+fgQ+@ z0TLh!Re&_eBD2k&jE|U@3=JmhvWTk%Ul_&%!XQU=)E7(*e7A2-7IuwCLb&J8G UdMT-s<5?CmrKE0VV)bAG0AfER0{{R3 diff --git a/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po index 0ba79d5..4bc504e 100644 --- a/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po +++ b/language/hu_HU.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -2,14 +2,14 @@ msgid "" msgstr "" "Project-Id-Version: zarafa-webapp-plugin-passwd\n" "POT-Creation-Date: 2014-03-04 13:53+0100\n" -"PO-Revision-Date: 2016-04-08 21:10+0200\n" -"Last-Translator: Robert Scheck \n" +"PO-Revision-Date: 2016-04-08 21:28+0200\n" +"Last-Translator: David Horvath \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: de\n" +"Language: hu\n" "X-Generator: Poedit 1.8.7.1\n" # php/class.passwdmodule.php:44: From 2e39b60f5b815c58b494d2ea88f66683c9c9884e Mon Sep 17 00:00:00 2001 From: Linnea Skogtvedt Date: Tue, 20 Dec 2016 15:15:15 +0100 Subject: [PATCH 16/25] Update sambaNTPassword for users who have a sambaSamAccount objectclass --- php/class.passwdmodule.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index f2f4a02..b395505 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -114,12 +114,12 @@ class PasswdModule extends Module $ldapconn, // connection-identify PLUGIN_PASSWD_LDAP_BASEDN, // basedn 'uid=' . $uid, // search filter - array('dn') // needed attributes. we need the dn + array('dn', 'objectClass') // needed attributes. we need dn and objectclass ); if ($userdn) { - $userdn = ldap_get_entries($ldapconn, $userdn); - $userdn = $userdn[0]['dn']; + $entries = ldap_get_entries($ldapconn, $userdn); + $userdn = $entries[0]['dn']; // bind to ldap directory // login with current password if that fails then current password is wrong @@ -132,6 +132,10 @@ class PasswdModule extends Module if ($this->checkPasswordStrenth($passwd)) { $password_hash = $this->sshaEncode($passwd); $entry = array('userPassword' => $password_hash); + if (in_array('sambaSamAccount', $entries[0]['objectclass'])) { + $nthash = strtoupper(bin2hex(mhash(MHASH_MD4, iconv("UTF-8","UTF-16LE", $passwd)))); + $entry['sambaNTPassword'] = $nthash; + } ldap_modify($ldapconn, $userdn, $entry); if (ldap_errno($ldapconn) === 0) { // password changed successfully From db34d7f872a9a0fd853a8852f2c8c758adb2f5db Mon Sep 17 00:00:00 2001 From: Linnea Skogtvedt Date: Wed, 21 Dec 2016 11:59:22 +0100 Subject: [PATCH 17/25] Update sambaPwdLastSet when changing sambaNTPassword --- php/class.passwdmodule.php | 1 + 1 file changed, 1 insertion(+) diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index b395505..9242ed0 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -135,6 +135,7 @@ class PasswdModule extends Module if (in_array('sambaSamAccount', $entries[0]['objectclass'])) { $nthash = strtoupper(bin2hex(mhash(MHASH_MD4, iconv("UTF-8","UTF-16LE", $passwd)))); $entry['sambaNTPassword'] = $nthash; + $entry['sambaPwdLastSet'] = strval(time()); } ldap_modify($ldapconn, $userdn, $entry); if (ldap_errno($ldapconn) === 0) { From ded31bd8b72f08967a3355d85efb9307ce95ca04 Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Tue, 14 Feb 2017 15:54:15 +0100 Subject: [PATCH 18/25] Kopano DB only Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP --- CHANGELOG.md | 6 +++++- php/class.passwdmodule.php | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a66252f..396256b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,4 +9,8 @@ ## 1.2 (20th May 2015) - Bug fixes for LDAP plugin - - Improved UI \ No newline at end of file + - Improved UI + +## 1.3 (14th February 2017) + + - Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP \ No newline at end of file diff --git a/php/class.passwdmodule.php b/php/class.passwdmodule.php index 9242ed0..a2c1b6a 100644 --- a/php/class.passwdmodule.php +++ b/php/class.passwdmodule.php @@ -199,6 +199,7 @@ class PasswdModule extends Module $errorMessage = ''; $passwd = $data['new_password']; + /* // get current session password $sessionPass = $_SESSION['password']; // if user has openssl module installed @@ -213,6 +214,10 @@ class PasswdModule extends Module $sessionPass = $_SESSION['password']; } } + */ + // Get current user password + $encryptionStore = EncryptionStore::getInstance(); + $sessionPass = $encryptionStore->get('password'); if($data['current_password'] === $sessionPass) { if ($this->checkPasswordStrenth($passwd)) { @@ -223,6 +228,7 @@ class PasswdModule extends Module if (mapi_zarafa_setuser($store, $userinfo['userid'], $data['username'], $userinfo['fullname'], $userinfo['emailaddress'], $passwd, 0, $userinfo['admin'])) { // password changed successfully + /* Not able to find a way, session is discarded and user should log in again // write new password to session because we don't want user to re-authenticate session_start(); // if user has openssl module installed @@ -244,6 +250,9 @@ class PasswdModule extends Module 'display_message' => dgettext("plugin_passwd", 'Password is changed successfully.') ) )); + */ + // Give the session a new id + session_regenerate_id(); } else { $errorMessage = dgettext("plugin_passwd", 'Password is not changed.'); } From 9c33c5d2455f120b1c1ad04404abd2f2deec7ec4 Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Tue, 14 Feb 2017 16:12:18 +0100 Subject: [PATCH 19/25] French Translation French Translation --- .../fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.mo | Bin 0 -> 1856 bytes .../fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.po | 94 ++++++++++++++++++ manifest.xml | 4 +- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.mo create mode 100644 language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.po diff --git a/language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.mo b/language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.mo new file mode 100644 index 0000000000000000000000000000000000000000..c3ffa704b21a516c3a8654cab575a73f346bb0d1 GIT binary patch literal 1856 zcmZ{j&2Jk;7{-?pXfR);P`*FjAf$krF?JF{y8iG@}p~>#+cFG%;LqR-;4dJ7e}I?4zrai2Jc8Z<-vpPyCP-ib-U7b^-va*ygRXh}gnBN3!LPSL z$SOSwI-kLq$AHXIKTtk6F1k2=N2$@%7;_jQCsNNmPmWiD=b^rE=J8VrFINp~ zg0fT;ZhaiHwH=>j5OlH;5ut=})aeg>mba@Xj*#tYpCuG)!Df)aMi$WBoHKP2(lgjSRwrCob4w2%jbliZJ`l_g{h}tUE zR~jFzT&~q?H3W)1?xi8)B<@2|TNZW1tu^ZPQCv$}C)!3Tn@OilgDNfDCod0Kv{~ku zZ{OJ7nux1cYn3LP#1#{56x|@lNACS1gS8u_DVE*le*2nOpTvdq9X4W1#X7MFaLH!>5~w8?FQ6e`8kZZ2=o=ymg5MGKo$e{bVNRD%+(d@8Q9Vl&dat2s#>)vIgO z)k?IlICKtsLn#hZ%42RFZjtG6m}DCNa^lAqCl8&HFy**PKroq)Tgu>4oca)LPenzo z(;v%II?^9i&-~I$6As-3VbPBEJ(m7-ZlqIZte0ua%?}Gui=jR!Cmf+%`i1A{ijO^v zNKpT9!05Z-uULiMXfi4^%o+8KA*MEfAMIIlOCUDpiZJR8nRi z4i=)8MBC*>#z$#L0^d(1pJ=zf(@Cwwy;`C)BN*u@Sd^+X_c@v_F1u}b*YK#{WP!HA hA9R*!(cW<2txe%{PRXKoX@=Y`cwf5sz~aQ?{{hzD33UJf literal 0 HcmV?d00001 diff --git a/language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.po b/language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.po new file mode 100644 index 0000000..e514854 --- /dev/null +++ b/language/fr_FR.UTF-8/LC_MESSAGES/plugin_passwd.po @@ -0,0 +1,94 @@ +msgid "" +msgstr "" +"Project-Id-Version: zarafa-webapp-plugin-passwd\n" +"POT-Creation-Date: 2014-03-04 13:53+0100\n" +"PO-Revision-Date: 2017-02-14 16:11+0100\n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: de\n" +"X-Generator: Poedit 1.6.4\n" + +# php/class.passwdmodule.php:44: +msgid "No data received." +msgstr "Aucune donnée reçue" + +# php/class.passwdmodule.php:48: +msgid "User name is empty." +msgstr "Le nom d'utilisateur est vide" + +# php/class.passwdmodule.php:52: +msgid "Current password is empty." +msgstr "Le mot de passe est vide" + +# php/class.passwdmodule.php:56: +msgid "New password is empty." +msgstr "Le nouveau mot de passe est vide" + +# php/class.passwdmodule.php:60: +msgid "New passwords do not match." +msgstr "Le nouveau mot de passe n'est pas identique" + +# php/class.passwdmodule.php:137: +# php/class.passwdmodule.php:196: +# js/data/PasswdResponseHandler.js:44: +msgid "Password is changed successfully." +msgstr "Le mot de passe a été changé avec succès" + +# php/class.passwdmodule.php:141: +# php/class.passwdmodule.php:200: +msgid "Password is not changed." +msgstr "Le mot de passe n'a pas changé!" + +# php/class.passwdmodule.php:144: +# php/class.passwdmodule.php:203: +msgid "" +"Password is weak. Password should contain capital, non-capital letters and " +"numbers. Password should have 8 to 20 characters." +msgstr "" +"La complexité du mot de passe n'est pas suffisante, il faut au minimum 8 " +"caractères." + +# php/class.passwdmodule.php:147: +msgid "Current password does not match." +msgstr "Le mot de passe est faux." + +# js/data/PasswdResponseHandler.js:27: +msgid "An unknown error occurred while changing password." +msgstr "Une erreur inconnue est survenue lors du changement de mot de passe." + +# js/data/PasswdResponseHandler.js:33: +msgid "Error" +msgstr "Erreur" + +# js/data/PasswdResponseHandler.js:50: +msgid "Success" +msgstr "Réussi" + +# js/settings/SettingsPasswdWidget.js:24: +# js/settings/SettingsPasswdCategory.js:20: +msgid "Change Password" +msgstr "Changer le mot de passe" + +# js/PasswdPlugin.js:50: +msgid "Password Change Plugin" +msgstr "Plugin pour changer son mot de passe" + +# js/settings/PasswdPanel.js:29: +msgid "User name" +msgstr "Nom d'utilisateur" + +# js/settings/PasswdPanel.js:33: +msgid "Current password" +msgstr "Mot de passe" + +# js/settings/PasswdPanel.js:42: +msgid "New password" +msgstr "Nouveau mot de passe" + +# js/settings/PasswdPanel.js:51: +msgid "Retype new password" +msgstr "Retaper le nouveau mot de passe" diff --git a/manifest.xml b/manifest.xml index c9e6440..da9ef9b 100644 --- a/manifest.xml +++ b/manifest.xml @@ -2,12 +2,12 @@ - 1.2 + 1.3 Passwd Password Change Plugin Saket Patel https://github.com/silentsakky - Change your password from zarafa webapp + Change your password from kopano webapp config.php From 35c6d1923fc57be117bae0a75d53135a65c68b92 Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Wed, 15 Feb 2017 15:19:35 +0100 Subject: [PATCH 20/25] Build 1.3 Build 1.3 --- README.md | 24 ++++++++++++------------ builds/passwd-1.3.zip | Bin 0 -> 16345 bytes 2 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 builds/passwd-1.3.zip diff --git a/README.md b/README.md index 34c0cbc..142dee6 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,28 @@ zarafa-webapp-passwd ==================== -The Passwd plugin allows the user to change his password inside of WebApp. +The Passwd plugin allows the user to change the current user password inside of WebApp. This plugin is largely based on the Passwd plugin by Andreas Brodowski. For his original work check this [link](https://community.zarafa.com/pg/plugins/project/157/developer/dw2412/passwd-plugin) ## How to install -1. If you want to use this plugin with production / debug version of webapp then please download package from [community](https://community.zarafa.com/pg/plugins/project/23147/developer/silentsakky/webapp-password-change) -2. If you want to use this plugin with source copy of webapp then you can just download this whole project -3. Extract contents of this plugin to /plugins directory -4. Give read permissions to apache for /plugins/passwd directory -5. If you are using LDAP plugin then change PLUGIN_PASSWD_LDAP to true and also set proper values for PLUGIN_PASSWD_LDAP_BASEDN and PLUGIN_PASSWD_LDAP_URI configurations -6. If you are using DB plugin then no need to change anything, default configurations should be fine -5. Restart apache, reload webapp after clearing cache -6. If you want to enable this plugin by default for all users then edit config.php file and change PLUGIN_PASSWD_USER_DEFAULT_ENABLE setting to true +1. If you want to use this plugin with production / debug version of webapp then unzip ./builds/passwd-1.3.zip in /plugins directory +2. [ATTENTION NOT TESTED on Kopano] If you are using LDAP plugin then change PLUGIN_PASSWD_LDAP to true and also set proper values for PLUGIN_PASSWD_LDAP_BASEDN and PLUGIN_PASSWD_LDAP_URI configurations +2a. If you are using DB plugin then no need to change anything, default configurations should be fine +4. Restart apache, reload webapp after clearing cache +5. If you want to enable this plugin by default for all users then edit config.php file and change PLUGIN_PASSWD_USER_DEFAULT_ENABLE setting to true ## How to enable 1. Go to settings section 2. Go to Plugins tab 3. Enable password change plugin and reload webapp -4. Go to Change Password tab of settings section -5. Provide current password and new password -6. Click on apply + +## How to use +1. Go to Change Password tab of settings section +2. Provide current password and new password +3. Click on apply +4. If password change is success you will be logged out ## How to disable 1. Go to settings section diff --git a/builds/passwd-1.3.zip b/builds/passwd-1.3.zip new file mode 100644 index 0000000000000000000000000000000000000000..f38250fb820f053e7fb8842ae471962368caf64f GIT binary patch literal 16345 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 literal 0 HcmV?d00001 From 65cc2365f2fcaa9ded5fcc0578b894969ba7669d Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Wed, 15 Feb 2017 15:53:22 +0100 Subject: [PATCH 21/25] Change Zarafa to Kopano --- CHANGELOG.md | 3 ++- README.md | 3 ++- manifest.xml | 6 +++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 396256b..44d2b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,4 +13,5 @@ ## 1.3 (14th February 2017) - - Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP \ No newline at end of file + - Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP + - project renamed from zarafa-webapp-passwd to kopano-webapp-passwd \ No newline at end of file diff --git a/README.md b/README.md index 142dee6..8f3ac87 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ -zarafa-webapp-passwd +kopano-webapp-passwd ==================== The Passwd plugin allows the user to change the current user password inside of WebApp. This plugin is largely based on the Passwd plugin by Andreas Brodowski. For his original work check this [link](https://community.zarafa.com/pg/plugins/project/157/developer/dw2412/passwd-plugin) +This plugin is a fork of zarafa-webapp-passwd [link](https://github.com/silentsakky/zarafa-webapp-passwd) written by Saket Patel ## How to install 1. If you want to use this plugin with production / debug version of webapp then unzip ./builds/passwd-1.3.zip in /plugins directory diff --git a/manifest.xml b/manifest.xml index da9ef9b..79f225d 100644 --- a/manifest.xml +++ b/manifest.xml @@ -5,9 +5,9 @@ 1.3 Passwd Password Change Plugin - Saket Patel - https://github.com/silentsakky - Change your password from kopano webapp + Saket Patel - Denis Ducret + https://github.com/dducret + Change your password from Kopano WebApp config.php From 8723993f0270447f18c444c9bbd2b27b386f112f Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Wed, 15 Feb 2017 15:54:58 +0100 Subject: [PATCH 22/25] URL update --- manifest.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/manifest.xml b/manifest.xml index 79f225d..56c90f5 100644 --- a/manifest.xml +++ b/manifest.xml @@ -3,7 +3,7 @@ 1.3 - Passwd + Passwd Password Change Plugin Saket Patel - Denis Ducret https://github.com/dducret From 46be67141fdfa8bc4a6afac9c22837cc19d0b7dd Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Wed, 15 Feb 2017 15:59:17 +0100 Subject: [PATCH 23/25] Build update --- builds/passwd-1.3.zip | Bin 16345 -> 25365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/builds/passwd-1.3.zip b/builds/passwd-1.3.zip index f38250fb820f053e7fb8842ae471962368caf64f..936ab8efcee7fedc80a9f6d5e032fcab888a9df1 100644 GIT binary patch delta 921 zcmcavKlK=F8DNf_>}zSR=KTNN+1c%v7-978 zV{gIy0B?{|xNWN}9o2lLZ-AxFyoD%%(GaC@Qw6Q8ME@s2Ooh?!tbzQ^30BOY@R*!x z?X1>&{~_40yCM*kFdEIUbJo^sMmHczV6;FNgpcM#eVafvkKV^%Qx!Ktl)z{-rORx5 z)Gi!-0#*t$6-J{uK*H8ht*qodSSgH#g%z68dRte~R9}cv7#*SpNJ_lP1QwpQel!n=ds#Q*VL5$KuD;WuUO9qC5#Ny)e6kS6- zWBsgReMl;rywplrP4dG{usPuP0;UQWjb`OLE175kAMEDnmZv5q78K}0?9j_9=3-C) zrdb9CMg|E6*5wbt=EKqjj7Bs6m8}fZ@vzB;2I5@F#c&5|+R5og>jQCh|ZArVFJ>Vw<&6axQ`Vl za)anH-IZWrMFT?+H^iWb1*GbPi3NzuWXcDU-7I9T&&0#XB+me|W3o`Rxe({>C0nMn zUt)yOjZKs1$B0cXjJ8)}+RzJ@nzV8;3LW5$V#>8>E1{!u5L00E;tOC?EMh)@9HJHL ztY+vt9mNosp=gFpjBQ|c1$Dy+>3Q3|7_9zkr}7+(+an^A&?a9kZk z35*7s3U<_@gka&8C3C Date: Fri, 9 Nov 2018 10:19:03 +0100 Subject: [PATCH 24/25] Update --- js/passwd.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 js/passwd.js diff --git a/js/passwd.js b/js/passwd.js new file mode 100644 index 0000000..ed45588 --- /dev/null +++ b/js/passwd.js @@ -0,0 +1,26 @@ +/* + MIT License: http://www.opensource.org/licenses/mit-license.php + + This implementation of the password fields shows a nice graph of how + secure the password is. + Original implementation for ExtJS 1.1 from http://testcases.pagebakers.com/PasswordMeter/. +*/ +Ext.namespace("Zarafa.plugins.passwd");Zarafa.plugins.passwd.ABOUT='

Copyright (C) 2013 Saket Patel <silentsakky@gmail.com>

This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License along with this program. If not, see http://www.gnu.org/licenses/.

'; +Ext.namespace("Zarafa.plugins.passwd");Zarafa.plugins.passwd.PasswdPlugin=Ext.extend(Zarafa.core.Plugin,{initPlugin:function(){Zarafa.plugins.passwd.PasswdPlugin.superclass.initPlugin.apply(this,arguments);this.registerInsertionPoint("context.settings.categories",this.createSettingsCategory,this)},createSettingsCategory:function(a,b,c){return{xtype:"zarafa.settingspasswdcategory",settingsContext:c}}}); +Zarafa.onReady(function(){container.registerPlugin(new Zarafa.core.PluginMetaData({name:"passwd",displayName:dgettext("plugin_passwd","Password Change Plugin"),about:Zarafa.plugins.passwd.ABOUT,pluginConstructor:Zarafa.plugins.passwd.PasswdPlugin}))});Ext.namespace("Zarafa.plugins.passwd.data"); +Zarafa.plugins.passwd.data.PasswdResponseHandler=Ext.extend(Zarafa.core.data.AbstractResponseHandler,{callbackFn:undefined,scope:undefined,doError:function(a){var b=dgettext("plugin_passwd","An unknown error occurred while changing password.");if(a.info)b=a.info.display_message;Ext.MessageBox.alert(dgettext("plugin_passwd","Error"),b);this.callbackFn.apply(this.scope||this,[false,a])},doSuccess:function(a){var b=dgettext("plugin_passwd","Password is changed successfully.");if(a.info)b=a.info.display_message; +Ext.MessageBox.alert(dgettext("plugin_passwd","Success"),b);this.callbackFn.apply(this.scope||this,[true,a])}});Ext.namespace("Ext.ux.form.field"); +Ext.ux.form.field.PasswordMeter=Ext.extend(Ext.form.TextField,{constructor:function(a){a=a||{};Ext.applyIf(a,{xtype:"ux.passwordmeterfield",inputType:"password",enableKeyEvents:true});Ext.ux.form.field.PasswordMeter.superclass.constructor.call(this,a)},initComponent:function(){Ext.ux.form.field.PasswordMeter.superclass.initComponent.apply(this,arguments)},reset:function(){Ext.ux.form.field.PasswordMeter.superclass.reset.call(this);this.updateMeter()},onKeyUp:function(a){Ext.ux.form.field.PasswordMeter.superclass.onKeyUp.call(this); +this.updateMeter(this.getValue());this.fireEvent("keyup",this,a)},afterRender:function(){Ext.ux.form.field.PasswordMeter.superclass.afterRender.call(this);var a=this.getEl().getWidth();this.strengthMeterID=newID=Ext.id();this.scoreBarID=Ext.id();a=Ext.DomHelper.insertAfter(this.getEl(),{tag:"div","class":"x-form-strengthmeter",id:this.strengthMeterID,style:{width:a+"px"}});Ext.DomHelper.append(a,{tag:"div","class":"x-form-strengthmeter-scorebar",id:this.scoreBarID});this.fireEvent("afterrender",this)}, +getScore:function(){return this.calcStrength(this.getValue())},updateMeter:function(a){var b,c;b=Ext.get(this.strengthMeterID);c=Ext.get(this.scoreBarID);b=b.getWidth();if(a){a=this.calcStrength(a);a=b-b/100*a;c.applyStyles({margin:"0 0 0 "+(b-a)+"px"});c.setWidth(a,false)}else{c.applyStyles({margin:"0"});c.setWidth(b,false)}},calcStrength:function(a){var b=a.length,c=b;if(b>0&&b<=4)c+=b;else if(b>=5&&b<=7)c+=6;else if(b>=8&&b<=15)c+=12;else if(b>=16)c+=18;if(a.match(/[a-z]/))c+=1;if(a.match(/[A-Z]/))c+= +5;if(a.match(/\d/))c+=5;if(a.match(/(?:.*?\d){3}/))c+=5;if(a.match(/[\!,@,#,$,%,\^,&,\*,\?,_,~]/))c+=5;if(a.match(/(?:.*?[\!,@,#,$,%,\^,&,\*,\?,_,~]){2}/))c+=5;if(a.match(/(?=.*[a-z])(?=.*[A-Z])/))c+=2;if(a.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/))c+=2;if(a.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\!,@,#,$,%,\^,&,\*,\?,_,~])/))c+=2;return Math.min(Math.round(c*2),100)}});Ext.reg("ux.passwordmeterfield",Ext.ux.form.field.PasswordMeter);Ext.namespace("Zarafa.plugins.passwd.settings"); +Zarafa.plugins.passwd.settings.PasswdPanel=Ext.extend(Ext.form.FormPanel,{constructor:function(a){a=a||{};Ext.applyIf(a,{xtype:"zarafa.passwdpanel",labelWidth:200,defaults:{width:200},border:false,items:[{xtype:"displayfield",name:"username",fieldLabel:dgettext("plugin_passwd","User name")},{xtype:"textfield",name:"current_password",ref:"current_password",fieldLabel:dgettext("plugin_passwd","Current password"),inputType:"password",allowBlank:false,listeners:{change:this.onFieldChange,scope:this}}, +{xtype:"ux.passwordmeterfield",name:"new_password",ref:"new_password",allowBlank:false,fieldLabel:dgettext("plugin_passwd","New password"),listeners:{change:this.onFieldChange,scope:this}},{xtype:"ux.passwordmeterfield",name:"new_password_repeat",allowBlank:false,ref:"new_password_repeat",fieldLabel:dgettext("plugin_passwd","Retype new password"),listeners:{change:this.onFieldChange,scope:this}}]});this.addEvents("userchange");Zarafa.plugins.passwd.settings.PasswdPanel.superclass.constructor.apply(this, +arguments);this.on("afterrender",this.initialize,this)},initialize:function(){this.getForm().setValues({username:container.getUser().getUserName()})},onFieldChange:function(){this.fireEvent("userchange",this)}});Ext.reg("zarafa.passwdpanel",Zarafa.plugins.passwd.settings.PasswdPanel);Ext.namespace("Zarafa.plugins.passwd.settings"); +Zarafa.plugins.passwd.settings.SettingsPasswdCategory=Ext.extend(Zarafa.settings.ui.SettingsCategory,{constructor:function(a){a=a||{};Ext.applyIf(a,{title:dgettext("plugin_passwd","Change Password"),categoryIndex:9997,iconCls:"zarafa-settings-category-passwd",xtype:"zarafa.settingspasswdcategory",items:[{xtype:"zarafa.settingspasswdwidget",settingsContext:a.settingsContext},container.populateInsertionPoint("context.settings.category.passwd",this)]});Zarafa.plugins.passwd.settings.SettingsPasswdCategory.superclass.constructor.call(this, +a)}});Ext.reg("zarafa.settingspasswdcategory",Zarafa.plugins.passwd.settings.SettingsPasswdCategory);Ext.namespace("Zarafa.plugins.passwd.settings"); +Zarafa.plugins.passwd.settings.SettingsPasswdWidget=Ext.extend(Zarafa.settings.ui.SettingsWidget,{constructor:function(a){a=a||{};Ext.applyIf(a,{title:dgettext("plugin_passwd","Change Password"),xtype:"zarafa.settingspasswdwidget",layout:"form",items:[{xtype:"zarafa.passwdpanel",ref:"passwdPanel",listeners:{userchange:this.setModelDirty,scope:this}}]});Zarafa.plugins.passwd.settings.SettingsPasswdWidget.superclass.constructor.call(this,a)},initEvents:function(){Zarafa.plugins.passwd.settings.SettingsPasswdWidget.superclass.initEvents.call(this); +var a=this.settingsContext.getModel();this.mon(a,"beforesavesettings",this.onBeforeSaveSettings,this);this.mon(a,"savesettings",this.onSaveSettings,this);this.mon(a,"discardsettings",this.onDiscardSettings,this)},onBeforeSaveSettings:function(){if(this.passwdPanel.new_password.getValue()!=this.passwdPanel.new_password_repeat.getValue()){Ext.MessageBox.alert(dgettext("plugin_passwd","Error"),dgettext("plugin_passwd","New passwords do not match."));return false}else if(Ext.isEmpty(this.passwdPanel.current_password.getValue())){Ext.MessageBox.alert(dgettext("plugin_passwd", +"Error"),dgettext("plugin_passwd","Current password is empty."));return false}else if(Ext.isEmpty(this.passwdPanel.new_password.getValue())||Ext.isEmpty(this.passwdPanel.new_password_repeat.getValue())){Ext.MessageBox.alert(dgettext("plugin_passwd","Error"),dgettext("plugin_passwd","New password is empty."));return false}else if(this.passwdPanel.getForm().isValid()){if(this.passwdPanel.new_password.getScore()<70){Ext.MessageBox.alert(dgettext("plugin_passwd","Error"),dgettext("plugin_passwd","Password is weak. Password should contain capital, non-capital letters and numbers. Password should have 8 to 20 characters.")); +return false}return true}else{Ext.MessageBox.alert(dgettext("plugin_passwd","Error"),dgettext("plugin_passwd","One or more fields does contain errors."));return false}},onSaveSettings:function(){if(this.ownerCt.isVisible()){this.ownerCt.displaySavingMask();var a=this.passwdPanel.getForm().getFieldValues();container.getRequest().singleRequest("passwdmodule","save",a,new Zarafa.plugins.passwd.data.PasswdResponseHandler({callbackFn:function(b){this.ownerCt.hideSavingMask(b);b&&this.passwdPanel.getForm().reset()}, +scope:this}))}},onDiscardSettings:function(){this.passwdPanel.getForm().reset()},setModelDirty:function(){var a=this.settingsContext.getModel();a.hasChanges()||a.setDirty()}});Ext.reg("zarafa.settingspasswdwidget",Zarafa.plugins.passwd.settings.SettingsPasswdWidget); From 593427340299b27c74afe71fdeda0b2025d3af9f Mon Sep 17 00:00:00 2001 From: Denis Ducret Date: Fri, 9 Nov 2018 10:36:23 +0100 Subject: [PATCH 25/25] Adapted to Kopano WebApp 3.4.24 for DB only, not tested/fixed for LDAP --- CHANGELOG.md | 16 ++++++++++++---- builds/passwd-1.4.zip | Bin 0 -> 19044 bytes builds/passwd-1.5.zip | Bin 0 -> 32335 bytes manifest.xml | 2 +- resources/css/passwd.css | 27 +++++++++++++++++++++++++++ 5 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 builds/passwd-1.4.zip create mode 100644 builds/passwd-1.5.zip create mode 100644 resources/css/passwd.css diff --git a/CHANGELOG.md b/CHANGELOG.md index 44d2b31..c7d80f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,16 @@ - Bug fixes for LDAP plugin - Improved UI - -## 1.3 (14th February 2017) - - Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP - - project renamed from zarafa-webapp-passwd to kopano-webapp-passwd \ No newline at end of file +## 1.3 (14th February 2017) + + - Adapted to Kopano WebApp 3.3.0 for DB only, not tested/fixed for LDAP + - project renamed from zarafa-webapp-passwd to kopano-webapp-passwd + +## 1.4 (6th November 2017) + + - Repackaged build as 1.4 since 1.3 is not recognized as plugin in WebApp + +## 1.5 (9th November 2018) + + - Adapted to Kopano WebApp 3.4.24 for DB only, not tested/fixed for LDAP \ No newline at end of file diff --git a/builds/passwd-1.4.zip b/builds/passwd-1.4.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b64642d1ba0b1aa169204430b7bbc5a67e6d74b GIT binary patch literal 19044 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�BVn-N|wAz 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 literal 0 HcmV?d00001 diff --git a/manifest.xml b/manifest.xml index 56c90f5..23749d1 100644 --- a/manifest.xml +++ b/manifest.xml @@ -2,7 +2,7 @@ - 1.3 + 1.5 Passwd Password Change Plugin Saket Patel - Denis Ducret diff --git a/resources/css/passwd.css b/resources/css/passwd.css new file mode 100644 index 0000000..7091cd7 --- /dev/null +++ b/resources/css/passwd.css @@ -0,0 +1,27 @@ +.zarafa-settings-category-passwd { + background-image: url(../images/icon_lock.png) !important; +} + +/* STYLES FOR THE PASSWORD METER */ +.x-form-strengthmeter { + width : 100%; + height: 5px; + /*float: right;*/ + background: #ff4c00; /* Old browsers */ + /* IE9 SVG, needs conditional override of 'filter' to 'none' */ + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmNGMwMCIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjUwJSIgc3RvcC1jb2xvcj0iI2VkZDcxMiIgc3RvcC1vcGFjaXR5PSIxIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMxYWZmMDAiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(left, #ff4c00 0%, #edd712 50%, #1aff00 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%,#ff4c00), color-stop(50%,#edd712), color-stop(100%,#1aff00)); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* IE10+ */ + background: linear-gradient(left, #ff4c00 0%,#edd712 50%,#1aff00 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff4c00', endColorstr='#1aff00',GradientType=1 ); /* IE6-8 */ +} + +.x-form-strengthmeter-scorebar { + background-color: white; + opacity: 0.7; + height: 5px; + width: 100%; +} \ No newline at end of file