diff --git a/build/plugin.xml b/build/plugin.xml index 3c385394a..f9a944426 100644 --- a/build/plugin.xml +++ b/build/plugin.xml @@ -72,6 +72,11 @@ + + + + + diff --git a/plugins/hmailserver-change-password/HmailserverChangePasswordDriver.php b/plugins/hmailserver-change-password/HmailserverChangePasswordDriver.php new file mode 100644 index 000000000..8abc08489 --- /dev/null +++ b/plugins/hmailserver-change-password/HmailserverChangePasswordDriver.php @@ -0,0 +1,142 @@ +sLogin = $sLogin; + $this->sPassword = $sPassword; + + return $this; + } + + /** + * @param array $aDomains + * + * @return \CpanleChangePasswordDriver + */ + public function SetAllowedDomains($aDomains) + { + if (\is_array($aDomains) && 0 < \count($aDomains)) + { + $this->aDomains = $aDomains; + } + + return $this; + } + + /** + * @param \MailSo\Log\Logger $oLogger + * + * @return \CpanleChangePasswordDriver + */ + public function SetLogger($oLogger) + { + if ($oLogger instanceof \MailSo\Log\Logger) + { + $this->oLogger = $oLogger; + } + + return $this; + } + + /** + * @param \RainLoop\Account $oAccount + * + * @return bool + */ + public function PasswordChangePossibility($oAccount) + { + return $oAccount && $oAccount->Domain() && + \in_array(\strtolower($oAccount->Domain()->Name()), $this->aDomains); + } + + /** + * @param \RainLoop\Account $oHmailAccount + * @param string $sPrevPassword + * @param string $sNewPassword + * + * @return bool + */ + public function ChangePassword(\RainLoop\Account $oHmailAccount, $sPrevPassword, $sNewPassword) + { + if ($this->oLogger) + { + $this->oLogger->Write('Try to change password for '.$oHmailAccount->Email()); + } + + $bResult = false; + + try + { + $oHmailApp = new COM("hMailServer.Application"); + $oHmailApp->Connect(); + + if ($this->oBaseApp->Authenticate($this->sLogin, $this->sPassword)) + { + $sEmail = $oHmailAccount->Email(); + $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); + + $oHmailDomain = $oHmailApp->Domains->ItemByName($sDomain); + if ($oHmailDomain) + { + $oHmailAccount = $oHmailDomain->Accounts->ItemByAddress($sEmail); + if ($oHmailAccount) + { + $oHmailAccount->Password = $sNewPassword; + $oHmailAccount->Save(); + + $bResult = true; + } + else + { + $this->oLogger->Write('HMAILSERVER: Unknown account ('.$sEmail.')', \MailSo\Log\Enumerations\Type::ERROR); + } + } + else + { + $this->oLogger->Write('HMAILSERVER: Unknown domain ('.$sDomain.')', \MailSo\Log\Enumerations\Type::ERROR); + } + } + else + { + $this->oLogger->Write('HMAILSERVER: Auth error', \MailSo\Log\Enumerations\Type::ERROR); + } + } + catch (\Exception $oException) + { + if ($this->oLogger) + { + $this->oLogger->WriteException($oException); + } + } + + return $bResult; + } +} \ No newline at end of file diff --git a/plugins/hmailserver-change-password/LICENSE b/plugins/hmailserver-change-password/LICENSE new file mode 100644 index 000000000..4a4ca8d81 --- /dev/null +++ b/plugins/hmailserver-change-password/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2014 RainLoop Team + +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. diff --git a/plugins/hmailserver-change-password/VERSION b/plugins/hmailserver-change-password/VERSION new file mode 100644 index 000000000..9f8e9b69a --- /dev/null +++ b/plugins/hmailserver-change-password/VERSION @@ -0,0 +1 @@ +1.0 \ No newline at end of file diff --git a/plugins/hmailserver-change-password/index.php b/plugins/hmailserver-change-password/index.php new file mode 100644 index 000000000..b1864088b --- /dev/null +++ b/plugins/hmailserver-change-password/index.php @@ -0,0 +1,75 @@ +addHook('main.fabrica', 'MainFabrica'); + } + + /** + * @return string + */ + public function Supported() + { + if (!class_exists('COM')) + { + return 'The PHP exention COM must be installed to use this plugin'; + } + + return ''; + } + + /** + * @param string $sName + * @param mixed $oProvider + */ + public function MainFabrica($sName, &$oProvider) + { + switch ($sName) + { + case 'change-password': + + $sLogin = (string) $this->Config()->Get('plugin', 'login', ''); + $sPassword = (string) $this->Config()->Get('plugin', 'password', ''); + + if (0 < \strlen($sLogin) && 0 < \strlen($sPassword)) + { + include_once __DIR__.'/HmailserverChangePasswordDriver.php'; + + $oProvider = new HmailserverChangePasswordDriver(); + $oProvider->SetLogger($this->Manager()->Actions()->Logger()); + $oProvider->SetConfig($sLogin, $sPassword); + + $sDomains = \strtolower(\trim(\preg_replace('/[\s;,]+/', ' ', + $this->Config()->Get('plugin', 'domains', '')))); + + if (0 < \strlen($sDomains)) + { + $aDomains = \explode(' ', $sDomains); + $oProvider->SetAllowedDomains($aDomains); + } + } + + break; + } + } + + /** + * @return array + */ + public function configMapping() + { + return array( + \RainLoop\Plugins\Property::NewInstance('login')->SetLabel('HmailServer Admin Login') + ->SetDefaultValue('Administrator'), + \RainLoop\Plugins\Property::NewInstance('password')->SetLabel('HmailServer Admin Password') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::PASSWORD) + ->SetDefaultValue(''), + \RainLoop\Plugins\Property::NewInstance('domains')->SetLabel('Allowed Domains') + ->SetType(\RainLoop\Enumerations\PluginPropertyType::STRING_TEXT) + ->SetDescription('Allowed domains, space as delimiter') + ->SetDefaultValue('domain1.com domain2.com') + ); + } +} \ No newline at end of file