TLS client certs in RainLoop.

This commit is contained in:
Michael Barnathan 2017-08-17 18:13:01 -04:00
parent 4cd86ede0b
commit 02561e8acf
3 changed files with 33 additions and 12 deletions

View file

@ -1261,11 +1261,12 @@ class Actions
* @param string $sLogin * @param string $sLogin
* @param string $sPassword * @param string $sPassword
* @param string $sSignMeToken = '' * @param string $sSignMeToken = ''
* @param string $sClientCert = ''
* @param bool $bThrowProvideException = false * @param bool $bThrowProvideException = false
* *
* @return \RainLoop\Model\Account|null * @return \RainLoop\Model\Account|null
*/ */
public function LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken = '', $bThrowProvideException = false) public function LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken = '', $sClientCert = '', $bThrowProvideException = false)
{ {
$oAccount = null; $oAccount = null;
if (0 < \strlen($sEmail) && 0 < \strlen($sLogin) && 0 < \strlen($sPassword)) if (0 < \strlen($sEmail) && 0 < \strlen($sLogin) && 0 < \strlen($sPassword))
@ -1275,7 +1276,7 @@ class Actions
{ {
if ($oDomain->ValidateWhiteList($sEmail, $sLogin)) if ($oDomain->ValidateWhiteList($sEmail, $sLogin))
{ {
$oAccount = \RainLoop\Model\Account::NewInstance($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken); $oAccount = \RainLoop\Model\Account::NewInstance($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken, '', '', $sClientCert);
$this->Plugins()->RunHook('filter.acount', array(&$oAccount)); $this->Plugins()->RunHook('filter.acount', array(&$oAccount));
if ($bThrowProvideException && !($oAccount instanceof \RainLoop\Model\Account)) if ($bThrowProvideException && !($oAccount instanceof \RainLoop\Model\Account))
@ -1320,7 +1321,7 @@ class Actions
) )
{ {
$oAccount = $this->LoginProvide($aAccountHash[1], $aAccountHash[2], $aAccountHash[3], $oAccount = $this->LoginProvide($aAccountHash[1], $aAccountHash[2], $aAccountHash[3],
empty($aAccountHash[5]) ? '' : $aAccountHash[5], $bThrowExceptionOnFalse); empty($aAccountHash[5]) ? '' : $aAccountHash[5], empty($aAccountHash[11]) ? '' : $aAccountHash[11], $bThrowExceptionOnFalse);
if ($oAccount instanceof \RainLoop\Model\Account) if ($oAccount instanceof \RainLoop\Model\Account)
{ {
@ -2241,10 +2242,10 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$this->Plugins()->RunHook('event.login-pre-login-provide', array()); $this->Plugins()->RunHook('event.login-pre-login-provide', array());
$oAccount = null; $oAccount = null;
$sClientCert = \trim($this->Config()->Get('ssl', 'client_cert', ''));
try try
{ {
$oAccount = $this->LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken, true); $oAccount = $this->LoginProvide($sEmail, $sLogin, $sPassword, $sSignMeToken, $sClientCert, true);
if (!($oAccount instanceof \RainLoop\Model\Account)) if (!($oAccount instanceof \RainLoop\Model\Account))
{ {
@ -4137,7 +4138,8 @@ NewThemeLink IncludeCss LoadingDescriptionEsc TemplatesLink LangLink IncludeBack
$iTime = \microtime(true); $iTime = \microtime(true);
$oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(), $oDomain->IncSecure(), $oImapClient->Connect($oDomain->IncHost(), $oDomain->IncPort(), $oDomain->IncSecure(),
!!$this->Config()->Get('ssl', 'verify_certificate', false), !!$this->Config()->Get('ssl', 'verify_certificate', false),
!!$this->Config()->Get('ssl', 'allow_self_signed', true) !!$this->Config()->Get('ssl', 'allow_self_signed', true),
$this->Config()->Get('ssl', 'client_cert', '')
); );
$iImapTime = \microtime(true) - $iTime; $iImapTime = \microtime(true) - $iTime;

View file

@ -217,6 +217,7 @@ class Application extends \RainLoop\Config\AbstractConfig
'allow_self_signed' => array(true, 'Allow self-signed certificates. Requires verify_certificate.'), 'allow_self_signed' => array(true, 'Allow self-signed certificates. Requires verify_certificate.'),
'cafile' => array('', 'Location of Certificate Authority file on local filesystem (/etc/ssl/certs/ca-certificates.crt)'), 'cafile' => array('', 'Location of Certificate Authority file on local filesystem (/etc/ssl/certs/ca-certificates.crt)'),
'capath' => array('', 'capath must be a correctly hashed certificate directory. (/etc/ssl/certs/)'), 'capath' => array('', 'capath must be a correctly hashed certificate directory. (/etc/ssl/certs/)'),
'client_cert' => array('', 'Location of client certificate file (pem format with private key) on local filesystem'),
), ),
'capa' => array( 'capa' => array(

View file

@ -29,6 +29,11 @@ class Account extends \RainLoop\Account // for backward compatibility
*/ */
private $sProxyAuthPassword; private $sProxyAuthPassword;
/**
* @var string
*/
private $sClientCert;
/** /**
* @var string * @var string
*/ */
@ -56,7 +61,7 @@ class Account extends \RainLoop\Account // for backward compatibility
* @return void * @return void
*/ */
protected function __construct($sEmail, $sLogin, $sPassword, \RainLoop\Model\Domain $oDomain, protected function __construct($sEmail, $sLogin, $sPassword, \RainLoop\Model\Domain $oDomain,
$sSignMeToken = '', $sProxyAuthUser = '', $sProxyAuthPassword = '') $sSignMeToken = '', $sProxyAuthUser = '', $sProxyAuthPassword = '', $sClientCert = '')
{ {
$this->sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true); $this->sEmail = \MailSo\Base\Utils::IdnToAscii($sEmail, true);
$this->sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin); $this->sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin);
@ -65,6 +70,7 @@ class Account extends \RainLoop\Account // for backward compatibility
$this->sSignMeToken = $sSignMeToken; $this->sSignMeToken = $sSignMeToken;
$this->sProxyAuthUser = $sProxyAuthUser; $this->sProxyAuthUser = $sProxyAuthUser;
$this->sProxyAuthPassword = $sProxyAuthPassword; $this->sProxyAuthPassword = $sProxyAuthPassword;
$this->sClientCert = $sClientCert;
$this->sParentEmail = ''; $this->sParentEmail = '';
} }
@ -80,9 +86,9 @@ class Account extends \RainLoop\Account // for backward compatibility
* @return \RainLoop\Model\Account * @return \RainLoop\Model\Account
*/ */
public static function NewInstance($sEmail, $sLogin, $sPassword, \RainLoop\Model\Domain $oDomain, public static function NewInstance($sEmail, $sLogin, $sPassword, \RainLoop\Model\Domain $oDomain,
$sSignMeToken = '', $sProxyAuthUser = '', $sProxyAuthPassword = '') $sSignMeToken = '', $sProxyAuthUser = '', $sProxyAuthPassword = '', $sClientCert = '')
{ {
return new self($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken, $sProxyAuthUser, $sProxyAuthPassword); return new self($sEmail, $sLogin, $sPassword, $oDomain, $sSignMeToken, $sProxyAuthUser, $sProxyAuthPassword, $sClientCert);
} }
/** /**
@ -185,6 +191,14 @@ class Account extends \RainLoop\Account // for backward compatibility
return $this->IncPassword(); return $this->IncPassword();
} }
/**
* @return string
*/
public function ClientCert()
{
return $this->sClientCert;
}
/** /**
* @return bool * @return bool
*/ */
@ -362,7 +376,8 @@ class Account extends \RainLoop\Account // for backward compatibility
\RainLoop\Utils::GetShortToken(), // 7 \RainLoop\Utils::GetShortToken(), // 7
$this->sProxyAuthUser, // 8 $this->sProxyAuthUser, // 8
$this->sProxyAuthPassword, // 9 $this->sProxyAuthPassword, // 9
0 // 10 // timelife 0, // 10 // timelife
$this->sClientCert // 11
)); ));
} }
@ -382,7 +397,8 @@ class Account extends \RainLoop\Account // for backward compatibility
\RainLoop\Utils::GetShortToken(), // 7 \RainLoop\Utils::GetShortToken(), // 7
$this->sProxyAuthUser, // 8 $this->sProxyAuthUser, // 8
$this->sProxyAuthPassword, // 9 $this->sProxyAuthPassword, // 9
0 // 10 // timelife 0, // 10 // timelife
$this->sClientCert // 11
)); ));
} }
@ -408,6 +424,7 @@ class Account extends \RainLoop\Account // for backward compatibility
'ProxyAuthUser' => $this->ProxyAuthUser(), 'ProxyAuthUser' => $this->ProxyAuthUser(),
'ProxyAuthPassword' => $this->ProxyAuthPassword(), 'ProxyAuthPassword' => $this->ProxyAuthPassword(),
'VerifySsl' => !!$oConfig->Get('ssl', 'verify_certificate', false), 'VerifySsl' => !!$oConfig->Get('ssl', 'verify_certificate', false),
'ClientCert' => $this->ClientCert(),
'AllowSelfSigned' => !!$oConfig->Get('ssl', 'allow_self_signed', true), 'AllowSelfSigned' => !!$oConfig->Get('ssl', 'allow_self_signed', true),
'UseAuthPlainIfSupported' => !!$oConfig->Get('labs', 'imap_use_auth_plain', true), 'UseAuthPlainIfSupported' => !!$oConfig->Get('labs', 'imap_use_auth_plain', true),
'UseAuthCramMd5IfSupported' => !!$oConfig->Get('labs', 'imap_use_auth_cram_md5', true) 'UseAuthCramMd5IfSupported' => !!$oConfig->Get('labs', 'imap_use_auth_cram_md5', true)
@ -421,7 +438,8 @@ class Account extends \RainLoop\Account // for backward compatibility
{ {
$oMailClient $oMailClient
->Connect($aImapCredentials['Host'], $aImapCredentials['Port'], ->Connect($aImapCredentials['Host'], $aImapCredentials['Port'],
$aImapCredentials['Secure'], $aImapCredentials['VerifySsl'], $aImapCredentials['AllowSelfSigned']); $aImapCredentials['Secure'], $aImapCredentials['VerifySsl'],
$aImapCredentials['AllowSelfSigned'], $aImapCredentials['ClientCert']);
} }