Update postfixadmin-change-password plugin.
https://github.com/RainLoop/rainloop-webmail/tree/master/plugins/postfixadmin-change-password
This commit is contained in:
		| @@ -2,6 +2,11 @@ | |||||||
|  |  | ||||||
| class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface | class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface | ||||||
| { | { | ||||||
|  |   /** | ||||||
|  | 	* @var string | ||||||
|  | 	*/ | ||||||
|  | 	private $sEngine = 'MySQL'; | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @var string | 	 * @var string | ||||||
| 	 */ | 	 */ | ||||||
| @@ -57,6 +62,17 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass | |||||||
| 	 */ | 	 */ | ||||||
| 	private $oLogger = null; | 	private $oLogger = null; | ||||||
|  |  | ||||||
|  | 	/** | ||||||
|  | 	 * @param string $sEngine | ||||||
|  | 	 * | ||||||
|  | 	 * @return \ChangePasswordPostfixAdminDriver | ||||||
|  | 	 */ | ||||||
|  | 	 public function SetEngine($sEngine) | ||||||
|  | 	 { | ||||||
|  | 		 $this->sEngine = $sEngine; | ||||||
|  | 		 return $this; | ||||||
|  | 	 } | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * @param string $sHost | 	 * @param string $sHost | ||||||
| 	 * | 	 * | ||||||
| @@ -215,7 +231,19 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass | |||||||
| 		{ | 		{ | ||||||
| 			try | 			try | ||||||
| 			{ | 			{ | ||||||
| 				$sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; | 				$sDsn = ''; | ||||||
|  | 				switch($this->sEngine){ | ||||||
|  | 					case 'MySQL': | ||||||
|  | 				  		$sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; | ||||||
|  | 						break; | ||||||
|  | 				  	case 'PostgreSQL': | ||||||
|  | 				 		$sDsn = 'pgsql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; | ||||||
|  | 						break; | ||||||
|  | 				  	default: | ||||||
|  | 				    		$sDsn = 'mysql:host='.$this->sHost.';port='.$this->iPort.';dbname='.$this->sDatabase; | ||||||
|  | 					  	break; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  |  | ||||||
| 				$oPdo = new \PDO($sDsn, $this->sUser, $this->sPassword); | 				$oPdo = new \PDO($sDsn, $this->sUser, $this->sPassword); | ||||||
| 				$oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); | 				$oPdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); | ||||||
| @@ -267,6 +295,11 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass | |||||||
| 				$sResult = '{PLAIN}' . $sPassword; | 				$sResult = '{PLAIN}' . $sPassword; | ||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
|  | 			case 'md5crypt': | ||||||
|  | 				include_once __DIR__.'/md5crypt.php'; | ||||||
|  | 				$sResult = '{MD5-CRYPT}' . md5crypt($sPassword); | ||||||
|  | 				break; | ||||||
|  |  | ||||||
| 			case 'md5': | 			case 'md5': | ||||||
| 				$sResult = '{PLAIN-MD5}' . md5($sPassword); | 				$sResult = '{PLAIN-MD5}' . md5($sPassword); | ||||||
| 				break; | 				break; | ||||||
| @@ -284,7 +317,8 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass | |||||||
| 				break; | 				break; | ||||||
|  |  | ||||||
| 			case 'mysql_encrypt': | 			case 'mysql_encrypt': | ||||||
| 				$oStmt = $oPdo->prepare('SELECT ENCRYPT(?) AS encpass'); | 			  if($this->sEngine == 'MySQL'){ | ||||||
|  | 			  	$oStmt = $oPdo->prepare('SELECT ENCRYPT(?) AS encpass'); | ||||||
| 				if ($oStmt->execute(array($sPassword))) | 				if ($oStmt->execute(array($sPassword))) | ||||||
| 				{ | 				{ | ||||||
| 					$aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); | 					$aFetchResult = $oStmt->fetchAll(\PDO::FETCH_ASSOC); | ||||||
| @@ -293,7 +327,10 @@ class ChangePasswordPostfixAdminDriver implements \RainLoop\Providers\ChangePass | |||||||
| 						$sResult = $aFetchResult[0]['encpass']; | 						$sResult = $aFetchResult[0]['encpass']; | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				break; | 			}else{ | ||||||
|  | 				throw new \RainLoop\Exceptions\ClientException(\RainLoop\Notifications::CouldNotSaveNewPassword); | ||||||
|  | 			} | ||||||
|  | 			break; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return $sResult; | 		return $sResult; | ||||||
|   | |||||||
| @@ -0,0 +1,20 @@ | |||||||
|  | The MIT License (MIT) | ||||||
|  |  | ||||||
|  | Copyright (c) 2015 RainLoop Team, @zaffkea | ||||||
|  |  | ||||||
|  | Permission is hereby granted, free of charge, to any person obtaining a copy of | ||||||
|  | this software and associated documentation files (the "Software"), to deal in | ||||||
|  | the Software without restriction, including without limitation the rights to | ||||||
|  | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | ||||||
|  | the Software, and to permit persons to whom the Software is furnished to do so, | ||||||
|  | subject to the following conditions: | ||||||
|  |  | ||||||
|  | The above copyright notice and this permission notice shall be included in all | ||||||
|  | copies or substantial portions of the Software. | ||||||
|  |  | ||||||
|  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | ||||||
|  | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | ||||||
|  | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | ||||||
|  | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | ||||||
|  | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | Plugin that adds functionality to change the email account password (PostfixAdmin). | ||||||
| @@ -0,0 +1 @@ | |||||||
|  | 1.3 | ||||||
| @@ -14,13 +14,13 @@ class PostfixadminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin | |||||||
| 	{ | 	{ | ||||||
| 		if (!extension_loaded('pdo') || !class_exists('PDO')) | 		if (!extension_loaded('pdo') || !class_exists('PDO')) | ||||||
| 		{ | 		{ | ||||||
| 			return 'The PHP exention PDO (mysql) must be installed to use this plugin'; | 			return 'The PHP extension PDO must be installed to use this plugin'; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		$aDrivers = \PDO::getAvailableDrivers(); | 		$aDrivers = \PDO::getAvailableDrivers(); | ||||||
| 		if (!is_array($aDrivers) || !in_array('mysql', $aDrivers)) | 		if (!is_array($aDrivers) || (!in_array('mysql', $aDrivers) && !in_array('pgsql', $aDrivers))) | ||||||
| 		{ | 		{ | ||||||
| 			return 'The PHP exention PDO (mysql) must be installed to use this plugin'; | 			return 'The PHP extension PDO (mysql or pgsql) must be installed to use this plugin'; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		return ''; | 		return ''; | ||||||
| @@ -41,6 +41,7 @@ class PostfixadminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin | |||||||
| 				$oProvider = new ChangePasswordPostfixAdminDriver(); | 				$oProvider = new ChangePasswordPostfixAdminDriver(); | ||||||
|  |  | ||||||
| 				$oProvider | 				$oProvider | ||||||
|  | 				  ->SetEngine($this->Config()->Get('plugin', 'engine','')) | ||||||
| 					->SetHost($this->Config()->Get('plugin', 'host', '')) | 					->SetHost($this->Config()->Get('plugin', 'host', '')) | ||||||
| 					->SetPort((int) $this->Config()->Get('plugin', 'port', 3306)) | 					->SetPort((int) $this->Config()->Get('plugin', 'port', 3306)) | ||||||
| 					->SetDatabase($this->Config()->Get('plugin', 'database', '')) | 					->SetDatabase($this->Config()->Get('plugin', 'database', '')) | ||||||
| @@ -64,27 +65,31 @@ class PostfixadminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin | |||||||
| 	public function configMapping() | 	public function configMapping() | ||||||
| 	{ | 	{ | ||||||
| 		return array( | 		return array( | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('host')->SetLabel('MySQL Host') | 			\RainLoop\Plugins\Property::NewInstance('engine')->SetLabel('Engine') | ||||||
| 				->SetDefaultValue('mariadb'), | 				->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('port')->SetLabel('MySQL Port') | 				->SetDefaultValue(array('MySQL', 'PostgreSQL')) | ||||||
|  | 				->SetDescription('Database Engine'), | ||||||
|  | 			\RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Host') | ||||||
|  | 				->SetDefaultValue('127.0.0.1'), | ||||||
|  | 			\RainLoop\Plugins\Property::NewInstance('port')->SetLabel('Port') | ||||||
| 				->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) | 				->SetType(\RainLoop\Enumerations\PluginPropertyType::INT) | ||||||
| 				->SetDefaultValue(3306), | 				->SetDefaultValue(3306), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('database')->SetLabel('MySQL Database') | 			\RainLoop\Plugins\Property::NewInstance('database')->SetLabel('Database') | ||||||
| 				->SetDefaultValue('postfix'), | 				->SetDefaultValue('postfixadmin'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('table')->SetLabel('MySQL table') | 			\RainLoop\Plugins\Property::NewInstance('table')->SetLabel('table') | ||||||
| 				->SetDefaultValue('mailbox'), | 				->SetDefaultValue('mailbox'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('usercol')->SetLabel('MySQL username column') | 			\RainLoop\Plugins\Property::NewInstance('usercol')->SetLabel('username column') | ||||||
| 				->SetDefaultValue('username'), | 				->SetDefaultValue('username'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('passcol')->SetLabel('MySQL password column') | 			\RainLoop\Plugins\Property::NewInstance('passcol')->SetLabel('password column') | ||||||
| 				->SetDefaultValue('password'), | 				->SetDefaultValue('password'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('MySQL User') | 			\RainLoop\Plugins\Property::NewInstance('user')->SetLabel('User') | ||||||
| 				->SetDefaultValue('postfix'), | 				->SetDefaultValue('postfixadmin'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('password')->SetLabel('MySQL Password') | 			\RainLoop\Plugins\Property::NewInstance('password')->SetLabel('Password') | ||||||
| 				->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) | 				->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) | ||||||
| 				->SetDefaultValue(''), | 				->SetDefaultValue(''), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('encrypt')->SetLabel('Encrypt') | 			\RainLoop\Plugins\Property::NewInstance('encrypt')->SetLabel('Encrypt') | ||||||
| 				->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) | 				->SetType(\RainLoop\Enumerations\PluginPropertyType::SELECTION) | ||||||
| 				->SetDefaultValue(array('SHA512-CRYPT','SHA256-CRYPT','md5', 'system', 'cleartext', 'mysql_encrypt')) | 				->SetDefaultValue(array('md5crypt', 'md5', 'system', 'cleartext', 'mysql_encrypt', 'SHA256-CRYPT', 'SHA512-CRYPT')) | ||||||
| 				->SetDescription('In what way do you want the passwords to be crypted ?'), | 				->SetDescription('In what way do you want the passwords to be crypted ?'), | ||||||
| 			\RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') | 			\RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') | ||||||
| 				->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) | 				->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) | ||||||
|   | |||||||
| @@ -0,0 +1,139 @@ | |||||||
|  | <?php | ||||||
|  |  | ||||||
|  | // md5crypt | ||||||
|  | // Action: Creates MD5 encrypted password | ||||||
|  | // Call: md5crypt (string cleartextpassword) | ||||||
|  |  | ||||||
|  | function md5crypt($pw, $salt = "", $magic = "") | ||||||
|  | { | ||||||
|  |     $MAGIC = "$1$"; | ||||||
|  |  | ||||||
|  |     if ($magic == "") | ||||||
|  | 	{ | ||||||
|  | 		$magic = $MAGIC; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |     if ($salt == "") | ||||||
|  | 	{ | ||||||
|  | 		$salt = create_salt(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |     $slist = explode("$", $salt); | ||||||
|  |     if (isset($slist[0]) && $slist[0] == "1") | ||||||
|  | 	{ | ||||||
|  | 		$salt = $slist[1]; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |     $salt = substr($salt, 0, 8); | ||||||
|  |     $ctx = $pw.$magic.$salt; | ||||||
|  |     $final = hex2bin(md5($pw.$salt.$pw)); | ||||||
|  |  | ||||||
|  |     for ($i = strlen($pw); $i > 0; $i -= 16) | ||||||
|  |     { | ||||||
|  |         if ($i > 16) | ||||||
|  |         { | ||||||
|  |             $ctx .= substr($final,0,16); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             $ctx .= substr($final,0,$i); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $i = strlen($pw); | ||||||
|  |  | ||||||
|  |     while ($i > 0) | ||||||
|  |     { | ||||||
|  |         if ($i & 1) | ||||||
|  | 		{ | ||||||
|  | 			$ctx .= chr(0); | ||||||
|  | 		} | ||||||
|  |         else | ||||||
|  | 		{ | ||||||
|  | 			$ctx .= $pw[0]; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  |         $i = $i >> 1; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $final = hex2bin(md5($ctx)); | ||||||
|  |  | ||||||
|  |     for ($i=0; $i<1000; $i++) | ||||||
|  |     { | ||||||
|  |         $ctx1 = ""; | ||||||
|  |         if ($i & 1) | ||||||
|  |         { | ||||||
|  |             $ctx1 .= $pw; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             $ctx1 .= substr($final,0,16); | ||||||
|  |         } | ||||||
|  |         if ($i % 3) | ||||||
|  | 		{ | ||||||
|  | 			$ctx1 .= $salt; | ||||||
|  | 		} | ||||||
|  |         if ($i % 7) | ||||||
|  | 		{ | ||||||
|  | 			$ctx1 .= $pw; | ||||||
|  | 		} | ||||||
|  |         if ($i & 1) | ||||||
|  |         { | ||||||
|  |             $ctx1 .= substr($final, 0, 16); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             $ctx1 .= $pw; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         $final = hex2bin(md5($ctx1)); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     $passwd = ""; | ||||||
|  |     $passwd .= to64(((ord($final[0]) << 16) | (ord($final[6]) << 8) | (ord($final[12]))), 4); | ||||||
|  |     $passwd .= to64(((ord($final[1]) << 16) | (ord($final[7]) << 8) | (ord($final[13]))), 4); | ||||||
|  |     $passwd .= to64(((ord($final[2]) << 16) | (ord($final[8]) << 8) | (ord($final[14]))), 4); | ||||||
|  |     $passwd .= to64(((ord($final[3]) << 16) | (ord($final[9]) << 8) | (ord($final[15]))), 4); | ||||||
|  |     $passwd .= to64(((ord($final[4]) << 16) | (ord($final[10]) << 8) | (ord($final[5]))), 4); | ||||||
|  |     $passwd .= to64(ord($final[11]), 2); | ||||||
|  |  | ||||||
|  |     return $magic.$salt.'$'.$passwd; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function create_salt() | ||||||
|  | { | ||||||
|  |     srand((double) microtime() * 1000000); | ||||||
|  |     return substr(md5(rand(0,9999999)), 0, 8); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // PHP around 5.3.8 includes hex2bin as native function - http://php.net/hex2bin | ||||||
|  | if (!function_exists('hex2bin')) | ||||||
|  | { | ||||||
|  | 	function hex2bin($str) | ||||||
|  | 	{ | ||||||
|  | 		$len = strlen($str); | ||||||
|  | 		$nstr = ""; | ||||||
|  | 		for ($i = 0; $i < $len; $i += 2) | ||||||
|  | 		{ | ||||||
|  | 			$num = sscanf(substr($str, $i, 2), "%x"); | ||||||
|  | 			$nstr .= chr($num[0]); | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return $nstr; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function to64($v, $n) | ||||||
|  | { | ||||||
|  |     $ITOA64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; | ||||||
|  |     $ret = ""; | ||||||
|  |  | ||||||
|  |     while (($n - 1) >= 0) | ||||||
|  |     { | ||||||
|  |         $n--; | ||||||
|  |         $ret .= $ITOA64[$v & 0x3f]; | ||||||
|  |         $v = $v >> 6; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return $ret; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Rafael Cossovan
					Rafael Cossovan