mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-08-25 10:09:20 +03:00
"virtualmin-change-password" code fixes abd refzctoring
This commit is contained in:
parent
aed686bcdf
commit
86bb1d0dcf
4 changed files with 131 additions and 206 deletions
|
|
@ -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.
|
||||
|
|
@ -1 +1 @@
|
|||
1.0
|
||||
1.0
|
||||
|
|
@ -1,35 +1,43 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
This Virtualmin Password Change Plugin was developed by Icedman21
|
||||
http://icedman21.com
|
||||
*/
|
||||
* This Virtualmin Password Change Plugin was developed by Icedman21
|
||||
* http://icedman21.com
|
||||
*/
|
||||
class VirtualminChangePasswordDriver implements \RainLoop\Providers\ChangePassword\ChangePasswordInterface
|
||||
{
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
* @var string
|
||||
*/
|
||||
private $sAllowedEmails = '';
|
||||
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
* @var string
|
||||
*/
|
||||
private $sHost = '';
|
||||
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
* @var string
|
||||
*/
|
||||
private $sAdminUser = '';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
* @var string
|
||||
*/
|
||||
private $sAdminPassword = '';
|
||||
|
||||
/**
|
||||
* @param string $sUser
|
||||
* @param string $sPassword
|
||||
*
|
||||
* @return \DirectAdminChangePasswordDriver
|
||||
*/
|
||||
* @var \MailSo\Log\Logger
|
||||
*/
|
||||
private $oLogger = null;
|
||||
|
||||
/**
|
||||
* @param string $sHost
|
||||
* @param string $sAdminUser
|
||||
* @param string $sAdminPassword
|
||||
*
|
||||
* @return \VirtualminChangePasswordDriver
|
||||
*/
|
||||
public function SetConfig($sHost, $sAdminUser, $sAdminPassword)
|
||||
{
|
||||
$this->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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue