mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-07-13 03:27:39 +03:00
Revamp for #351
This commit is contained in:
parent
3522f76d37
commit
1dccfdba3b
4 changed files with 95 additions and 65 deletions
20
plugins/change-password-poppassd/LICENSE
Normal file
20
plugins/change-password-poppassd/LICENSE
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015 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.
|
||||
180
plugins/change-password-poppassd/driver.php
Normal file
180
plugins/change-password-poppassd/driver.php
Normal file
|
|
@ -0,0 +1,180 @@
|
|||
<?php
|
||||
|
||||
class ChangePasswordPoppassdDriver extends \MailSo\Net\NetClient
|
||||
{
|
||||
const
|
||||
NAME = 'Poppassd',
|
||||
DESCRIPTION = 'Change passwords using Poppassd.';
|
||||
|
||||
private
|
||||
$oConfig = null;
|
||||
|
||||
function __construct(\RainLoop\Config\Plugin $oConfig, \MailSo\Log\Logger $oLogger)
|
||||
{
|
||||
$this->oConfig = $oConfig;
|
||||
$this->oLogger = $oLogger;
|
||||
}
|
||||
|
||||
public static function isSupported() : bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public static function configMapping() : array
|
||||
{
|
||||
return array(
|
||||
\RainLoop\Plugins\Property::NewInstance('poppassd_host')->SetLabel('POPPASSD Host')
|
||||
->SetDefaultValue('127.0.0.1'),
|
||||
\RainLoop\Plugins\Property::NewInstance('poppassd_port')->SetLabel('POPPASSD Port')
|
||||
->SetType(\RainLoop\Enumerations\PluginPropertyType::INT)
|
||||
->SetDefaultValue(106),
|
||||
\RainLoop\Plugins\Property::NewInstance('poppassd_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')
|
||||
->SetDefaultValue('*')
|
||||
);
|
||||
}
|
||||
|
||||
public function ChangePassword(\RainLoop\Model\Account $oAccount, string $sPrevPassword, string $sNewPassword) : bool
|
||||
{
|
||||
if (!\RainLoop\Plugins\Helper::ValidateWildcardValues($oAccount->Email(), $this->oConfig->Get('plugin', 'poppassd_allowed_emails', ''))) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$this->Connect(
|
||||
$this->oConfig->Get('plugin', 'poppassd_host', ''),
|
||||
(int) $this->oConfig->Get('plugin', 'poppassd_port', 106)
|
||||
);
|
||||
|
||||
if ($this->bIsLoggined) {
|
||||
$this->writeLogException(
|
||||
new \RuntimeException('Already authenticated for this session'),
|
||||
\MailSo\Log\Enumerations\Type::ERROR, true);
|
||||
}
|
||||
|
||||
$sLogin = \trim($sLogin);
|
||||
|
||||
try
|
||||
{
|
||||
$this->sendRequestWithCheck('user', \trim($sLogin), true);
|
||||
$this->sendRequestWithCheck('pass', $sPassword, true);
|
||||
}
|
||||
catch (\Throwable $oException)
|
||||
{
|
||||
$this->writeLogException($oException, \MailSo\Log\Enumerations\Type::NOTICE, true);
|
||||
}
|
||||
|
||||
$this->bIsLoggined = true;
|
||||
|
||||
if ($this->bIsLoggined) {
|
||||
$this->sendRequestWithCheck('newpass', $sNewPassword);
|
||||
} else {
|
||||
$this->writeLogException(
|
||||
new \RuntimeException('Required login'),
|
||||
\MailSo\Log\Enumerations\Type::ERROR, true);
|
||||
}
|
||||
|
||||
|
||||
$this->Disconnect()
|
||||
;
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (\Throwable $oException)
|
||||
{
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private
|
||||
$bIsLoggined = false,
|
||||
$iRequestTime = 0;
|
||||
|
||||
public function Connect(string $sServerName, int $iPort,
|
||||
int $iSecurityType = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT,
|
||||
bool $bVerifySsl = false, bool $bAllowSelfSigned = true,
|
||||
string $sClientCert = '') : void
|
||||
{
|
||||
$this->iRequestTime = \microtime(true);
|
||||
parent::Connect($sServerName, $iPort, $iSecurityType, $bVerifySsl, $bAllowSelfSigned, $sClientCert);
|
||||
$this->validateResponse();
|
||||
}
|
||||
|
||||
public function Logout() : void
|
||||
{
|
||||
if ($this->bIsLoggined) {
|
||||
$this->sendRequestWithCheck('quit');
|
||||
}
|
||||
$this->bIsLoggined = false;
|
||||
}
|
||||
|
||||
private function secureRequestParams($sCommand, $sAddToCommand) : ?string
|
||||
{
|
||||
if (\strlen($sAddToCommand)) {
|
||||
switch (\strtolower($sCommand))
|
||||
{
|
||||
case 'pass':
|
||||
case 'newpass':
|
||||
return '********';
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private function sendRequestWithCheck(string $sCommand, string $sAddToCommand = '', bool $bAuthRequestValidate = false) : void
|
||||
{
|
||||
$sCommand = \trim($sCommand);
|
||||
if (!\strlen($sCommand)) {
|
||||
$this->writeLogException(
|
||||
new \MailSo\Base\Exceptions\InvalidArgumentException(),
|
||||
\MailSo\Log\Enumerations\Type::ERROR, true);
|
||||
}
|
||||
|
||||
$this->IsConnected(true);
|
||||
|
||||
$sRealCommand = $sCommand . (\strlen($sAddToCommand) ? ' '.$sAddToCommand : '');
|
||||
|
||||
$sFakeCommand = '';
|
||||
$sFakeAddToCommand = $this->secureRequestParams($sCommand, $sAddToCommand);
|
||||
if (\strlen($sFakeAddToCommand)) {
|
||||
$sFakeCommand = $sCommand . ' ' . $sFakeAddToCommand;
|
||||
}
|
||||
|
||||
$this->iRequestTime = \microtime(true);
|
||||
$this->sendRaw($sRealCommand, true, $sFakeCommand);
|
||||
|
||||
$this->validateResponse($bAuthRequestValidate);
|
||||
}
|
||||
|
||||
private function validateResponse(bool $bAuthRequestValidate = false) : self
|
||||
{
|
||||
$this->getNextBuffer();
|
||||
|
||||
$bResult = \preg_match($bAuthRequestValidate ? '/^[23]\d\d/' : '/^2\d\d/', trim($this->sResponseBuffer));
|
||||
|
||||
if (!$bResult) {
|
||||
// POP3 validation hack
|
||||
$bResult = '+OK ' === \substr(\trim($this->sResponseBuffer), 0, 4);
|
||||
}
|
||||
|
||||
if (!$bResult) {
|
||||
$this->writeLogException(
|
||||
new \MailSo\Base\Exceptions\Exception(),
|
||||
\MailSo\Log\Enumerations\Type::WARNING, true);
|
||||
}
|
||||
|
||||
$this->writeLog((\microtime(true) - $this->iRequestTime),
|
||||
\MailSo\Log\Enumerations\Type::TIME);
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
function getLogName() : string
|
||||
{
|
||||
return 'POPPASSD';
|
||||
}
|
||||
}
|
||||
19
plugins/change-password-poppassd/index.php
Normal file
19
plugins/change-password-poppassd/index.php
Normal file
|
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
use \RainLoop\Exceptions\ClientException;
|
||||
|
||||
class ChangePasswordPoppassdPlugin extends \RainLoop\Plugins\AbstractPlugin
|
||||
{
|
||||
const
|
||||
NAME = 'Change Password Poppassd',
|
||||
VERSION = '2.15.0',
|
||||
RELEASE = '2022-04-28',
|
||||
REQUIRED = '2.15.1',
|
||||
CATEGORY = 'Security',
|
||||
DESCRIPTION = 'Extension to allow users to change their passwords through Poppassd';
|
||||
|
||||
public function Supported() : string
|
||||
{
|
||||
return 'Use Change Password plugin';
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue