From 86bb1d0dcfc07691dae8540b2543fd581f8ba377 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 4 May 2015 21:11:59 +0400 Subject: [PATCH] "virtualmin-change-password" code fixes abd refzctoring --- plugins/virtualmin-change-password/README | 2 +- plugins/virtualmin-change-password/VERSION | 2 +- .../VirtualminChangePasswordDriver.php | 313 +++++++----------- plugins/virtualmin-change-password/index.php | 20 +- 4 files changed, 131 insertions(+), 206 deletions(-) diff --git a/plugins/virtualmin-change-password/README b/plugins/virtualmin-change-password/README index 7488b2ac9..58f2e0378 100644 --- a/plugins/virtualmin-change-password/README +++ b/plugins/virtualmin-change-password/README @@ -1 +1 @@ -This plugin utilizes Virtualmin's remote API to change user passwords. The plugin requires the Admin user name and password to succesfully execute the password change. The host and port where Virtualmin listens on is also needed. See https://www.virtualmin.com/documentation/developer/http for more information. +This plugin utilizes Virtualmin's remote API to change user passwords. The plugin requires the Admin user name and password to succesfully execute the password change. The host and port where Virtualmin listens on is also needed. See https://www.virtualmin.com/documentation/developer/http for more information. \ No newline at end of file diff --git a/plugins/virtualmin-change-password/VERSION b/plugins/virtualmin-change-password/VERSION index d3827e75a..9f8e9b69a 100644 --- a/plugins/virtualmin-change-password/VERSION +++ b/plugins/virtualmin-change-password/VERSION @@ -1 +1 @@ -1.0 +1.0 \ No newline at end of file diff --git a/plugins/virtualmin-change-password/VirtualminChangePasswordDriver.php b/plugins/virtualmin-change-password/VirtualminChangePasswordDriver.php index 21397afb9..c4fbd72d6 100644 --- a/plugins/virtualmin-change-password/VirtualminChangePasswordDriver.php +++ b/plugins/virtualmin-change-password/VirtualminChangePasswordDriver.php @@ -1,35 +1,43 @@ sHost = $sHost; @@ -38,21 +46,24 @@ class VirtualminChangePasswordDriver implements \RainLoop\Providers\ChangePasswo return $this; } + /** - * @param string $sAllowedEmails - * - * @return \ChangePasswordExampleDriver - */ + * @param string $sAllowedEmails + * + * @return \VirtualminChangePasswordDriver + */ public function SetAllowedEmails($sAllowedEmails) { $this->sAllowedEmails = $sAllowedEmails; + return $this; } + /** - * @param \MailSo\Log\Logger $oLogger - * - * @return \HmailserverChangePasswordDriver - */ + * @param \MailSo\Log\Logger $oLogger + * + * @return \VirtualminChangePasswordDriver + */ public function SetLogger($oLogger) { if ($oLogger instanceof \MailSo\Log\Logger) @@ -62,226 +73,138 @@ class VirtualminChangePasswordDriver implements \RainLoop\Providers\ChangePasswo return $this; } - /** - * @param \RainLoop\Model\Account $oAccount - * - * @return bool - */ - - public function PasswordChangePossibility($oAccount) - { - return $oAccount && $oAccount->Email() && - \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); - } /** - * @param string $sUrl - * @param array $aPost = array() - * @param string $sCustomUserAgent = 'MailSo Http User Agent (v1)' - * @param int $iCode = 0 - * @param \MailSo\Log\Logger $oLogger = null - * @param int $iTimeout = 20 - * @param string $sProxy = '' - * @param string $sProxyAuth = '' - * - * @return string|bool - * - * Had to costumize use this as the builtin SendPostRequest in \MailSo\Base\Http had no way of setting CURLOPT_USERPWD - */ - public function PostRequest($sUrl, $aPost = array(), $sAdminUser, $sAdminPassword, $sCustomUserAgent = 'Rainloop Http User Agent (v1)', &$iCode = 0, - $oLogger = null, $iTimeout = 20, $sProxy = '', $sProxyAuth = '') - { - - $oLogger->Write('Virtualmin: Inside function: '); - $aOptions = array( - CURLOPT_URL => $sUrl, - CURLOPT_HEADER => false, - CURLOPT_FAILONERROR => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), - CURLOPT_TIMEOUT => (int) $iTimeout - ); - - if ($oLogger) - { - $oLogger->Write('Virtualmin: Inside function2: '); - } - - if (0 < \strlen($sAdminUser) && 0 < \strlen($sAdminPassword)) - { - $aOptions[CURLOPT_USERPWD] = $sAdminUser.':'.$sAdminPassword; - } - - if (0 < \strlen($sCustomUserAgent)) - { - $aOptions[CURLOPT_USERAGENT] = $sCustomUserAgent; - } - - if (0 < \strlen($sProxy)) - { - $aOptions[CURLOPT_PROXY] = $sProxy; - if (0 < \strlen($sProxyAuth)) - { - $aOptions[CURLOPT_PROXYUSERPWD] = $sProxyAuth; - } - } - if ($oLogger) - { - $oLogger->Write('Virtualmin: before init: '); - } - $oCurl = \curl_init(); - \curl_setopt_array($oCurl, $aOptions); - - if ($oLogger) - { - $oLogger->Write('cURL: Send post request: '.$sUrl); - } - - $mResult = \curl_exec($oCurl); - - $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); - $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); - - if ($oLogger) - { - $oLogger->Write('cURL: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); - if (false === $mResult || 200 !== $iCode) - { - $oLogger->Write('cURL: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); - } - } - - if (\is_resource($oCurl)) - { - \curl_close($oCurl); - } - - return $mResult; - } - - /** - * @param \RainLoop\Model\Account $oAccount - * @param string $sPrevPassword - * @param string $sNewPassword - * - * @return bool - */ - public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) + * @param string $sDesc + * @param int $iType = \MailSo\Log\Enumerations\Type::INFO + * + * @return \VirtualminChangePasswordDriver + */ + public function WriteLog($sDesc, $iType = \MailSo\Log\Enumerations\Type::INFO) { if ($this->oLogger) { - $this->oLogger->Write('Virtualmin: Try to change password for '.$oAccount->Email()); + $this->oLogger->Write($sDesc, $iType); } - + + return $this; + } + + /** + * @param \RainLoop\Model\Account $oAccount + * + * @return bool + */ + public function PasswordChangePossibility($oAccount) + { + return $oAccount && $oAccount->Email() && + \RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->sAllowedEmails); + } + + /** + * @param \RainLoop\Model\Account $oAccount + * @param string $sPrevPassword + * @param string $sNewPassword + * + * @return bool + */ + public function ChangePassword(\RainLoop\Account $oAccount, $sPrevPassword, $sNewPassword) + { + $this->WriteLog('Virtualmin: Try to change password for '.$oAccount->Email()); + $bResult = false; if (!empty($this->sHost) && !empty($this->sAdminUser) && !empty($this->sAdminPassword) && $oAccount) { - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin:[Check] Required Fields Present'); - } + $this->WriteLog('Virtualmin:[Check] Required Fields Present'); + $sEmail = \trim(\strtolower($oAccount->Email())); $sEmailUser = \MailSo\Base\Utils::GetAccountNameFromEmail($sEmail); $sEmailDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); - $sHost = \trim($this->sHost); + + $sHost = \rtrim(\trim($this->sHost), '/'); $sUrl = $sHost.'/virtual-server/remote.cgi'; + $sAdminUser = $this->sAdminUser; - $sAdminPassword=$this->sAdminPassword; + $sAdminPassword = $this->sAdminPassword; $iCode = 0; - + $aPost = array( - 'user' => $sEmailUser, - 'pass' => $sNewPassword, - 'domain' => $sEmailDomain, - 'program' => 'modify-user' + 'user' => $sEmailUser, + 'pass' => $sNewPassword, + 'domain' => $sEmailDomain, + 'program' => 'modify-user' ); - + $aOptions = array( - CURLOPT_URL => $sUrl, - CURLOPT_HEADER => false, - CURLOPT_FAILONERROR => true, - CURLOPT_SSL_VERIFYPEER => false, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POST => true, - CURLOPT_POSTFIELDS => http_build_query($aPost, '', '&'), - CURLOPT_TIMEOUT => 20, - CURLOPT_SSL_VERIFYHOST => false, - CURLOPT_USERPWD => $sAdminUser.':'.$sAdminPassword + CURLOPT_URL => $sUrl, + CURLOPT_HEADER => false, + CURLOPT_FAILONERROR => true, + CURLOPT_SSL_VERIFYPEER => false, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POST => true, + CURLOPT_POSTFIELDS => \http_build_query($aPost, '', '&'), + CURLOPT_TIMEOUT => 20, + CURLOPT_SSL_VERIFYHOST => false, + CURLOPT_USERPWD => $sAdminUser.':'.$sAdminPassword ); - + $oCurl = \curl_init(); \curl_setopt_array($oCurl, $aOptions); - - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin: Send post request: '.$sUrl); - } - + + $this->WriteLog('Virtualmin: Send post request: '.$sUrl); + $mResult = \curl_exec($oCurl); - + $iCode = (int) \curl_getinfo($oCurl, CURLINFO_HTTP_CODE); $sContentType = (string) \curl_getinfo($oCurl, CURLINFO_CONTENT_TYPE); - - if ($this->oLogger) + + $this->WriteLog('Virtualmin: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); + if (false === $mResult || 200 !== $iCode) { - $this->oLogger->Write('Virtualmin: Post request result: (Status: '.$iCode.', ContentType: '.$sContentType.')'); - if (false === $mResult || 200 !== $iCode) - { - $this->oLogger->Write('Virtualmin: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); - } + $this->WriteLog('Virtualmin: Error: '.\curl_error($oCurl), \MailSo\Log\Enumerations\Type::WARNING); } if (\is_resource($oCurl)) { \curl_close($oCurl); } - + if (false !== $mResult && 200 === $iCode) { $aRes = null; @\parse_str($mResult, $aRes); - if (is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) + if (\is_array($aRes) && (!isset($aRes['error']) || (int) $aRes['error'] !== 1)) { - $iPos = strpos($mResult, 'Exit status: '); - if ($iPos !== false) { - $sStatus = explode(' ', $mResult); - $sStatus=\trim(array_pop($sStatus)); - - if($sStatus=='0'){ - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin: Password Change Status: Success'); - } + $iPos = \strpos($mResult, 'Exit status: '); + + if ($iPos !== false) + { + $aStatus = \explode(' ', $mResult); + $sStatus = \trim(\array_pop($aStatus)); + + if ('0' === $sStatus) + { + $this->WriteLog('Virtualmin: Password Change Status: Success'); $bResult = true; - } + } else { - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin[Error]: Response: '.$mResult); - } + $this->WriteLog('Virtualmin[Error]: Response: '.$mResult); } } } else { - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin[Error]: Response: '.$mResult); - } + $this->WriteLog('Virtualmin[Error]: Response: '.$mResult); } } else { - if ($this->oLogger) - { - $this->oLogger->Write('Virtualmin[Error]: Empty Response: Code:'.$iCode); - } + $this->WriteLog('Virtualmin[Error]: Empty Response: Code: '.$iCode); } } + return $bResult; } } diff --git a/plugins/virtualmin-change-password/index.php b/plugins/virtualmin-change-password/index.php index 9414e9991..b4c0a86f6 100644 --- a/plugins/virtualmin-change-password/index.php +++ b/plugins/virtualmin-change-password/index.php @@ -18,12 +18,14 @@ class VirtualminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin case 'change-password': include_once __DIR__.'/VirtualminChangePasswordDriver.php'; + $sHost = \trim($this->Config()->Get('plugin', 'host', '')); $sAdminUser = (string) $this->Config()->Get('plugin', 'admin_user', ''); $sAdminPassword = (string) $this->Config()->Get('plugin', 'admin_password', ''); - $oProvider = new VirtualminChangePasswordDriver(); + + $oProvider = new \VirtualminChangePasswordDriver(); $oProvider->SetLogger($this->Manager()->Actions()->Logger()); - $oProvider->SetConfig($sHost,$sAdminUser, $sAdminPassword); + $oProvider->SetConfig($sHost, $sAdminUser, $sAdminPassword); $oProvider->SetAllowedEmails(\strtolower(\trim($this->Config()->Get('plugin', 'allowed_emails', '')))); break; @@ -36,13 +38,13 @@ class VirtualminChangePasswordPlugin extends \RainLoop\Plugins\AbstractPlugin public function configMapping() { return array( - \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Virtualmin Host') - ->SetDefaultValue('https://localhost:10000') - ->SetDescription('Virtualmin host URL. Example: https://example.com:10000'), - \RainLoop\Plugins\Property::NewInstance('admin_user')->SetLabel('Admin User') - ->SetDefaultValue(''), - \RainLoop\Plugins\Property::NewInstance('admin_password')->SetLabel('Admin Password') - ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('host')->SetLabel('Virtualmin Host') + ->SetDefaultValue('https://localhost:10000') + ->SetDescription('Virtualmin host URL. Example: https://example.com:10000'), + \RainLoop\Plugins\Property::NewInstance('admin_user')->SetLabel('Admin User') + ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('admin_password')->SetLabel('Admin Password') + ->SetDefaultValue(''), \RainLoop\Plugins\Property::NewInstance('allowed_emails')->SetLabel('Allowed emails') ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) ->SetDescription('Allowed emails, space as delimiter, wildcard supported. Example: user1@domain1.net user2@domain1.net *@domain2.net')