diff --git a/plugins/login-autoconfig/LICENSE b/plugins/login-autoconfig/LICENSE new file mode 100644 index 000000000..61aa05084 --- /dev/null +++ b/plugins/login-autoconfig/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2024 SnappyMail + +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/login-autoconfig/index.php b/plugins/login-autoconfig/index.php new file mode 100644 index 000000000..01bac9249 --- /dev/null +++ b/plugins/login-autoconfig/index.php @@ -0,0 +1,78 @@ +addHook('login.credentials.step-1', 'detect'); + } + + public function detect(string $sEmail) : void + { + if (\str_contains($sEmail, '@')) { + $oProvider = $this->Manager()->Actions()->DomainProvider(); + $sDomain = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); + $oDomain = $oProvider->Load($sDomain, false); + if (!$oDomain) { + $result = \RainLoop\Providers\Domain\Autoconfig::discover($sEmail); + if ($result) { + $typeIMAP = ConnectionSecurityType::AUTO_DETECT; + if ('STARTTLS' === $result['incomingServer'][0]['socketType']) { + $typeIMAP = ConnectionSecurityType::STARTTLS; + } else if ('SSL' === $result['incomingServer'][0]['socketType']) { + $typeIMAP = ConnectionSecurityType::SSL; + } + $typeSMTP = ConnectionSecurityType::AUTO_DETECT; + if ('STARTTLS' === $result['outgoingServer'][0]['socketType']) { + $typeSMTP = ConnectionSecurityType::STARTTLS; + } else if ('SSL' === $result['outgoingServer'][0]['socketType']) { + $typeSMTP = ConnectionSecurityType::SSL; + } + $oDomain = \RainLoop\Model\Domain::fromArray($sDomain, [ + 'IMAP' => [ + 'host' => $result['incomingServer'][0]['hostname'], + 'port' => $result['incomingServer'][0]['port'], + 'type' => $typeIMAP, + 'shortLogin' => '%EMAILADDRESS%' !== $result['incomingServer'][0]['username'], +// 'ssl' => [] + ], + 'SMTP' => [ + 'host' => $result['outgoingServer'][0]['hostname'], + 'port' => $result['outgoingServer'][0]['port'], + 'type' => $typeSMTP, + 'shortLogin' => '%EMAILADDRESS%' !== $result['outgoingServer'][0]['username'], +// 'useAuth' => !empty($result['authentication']), + ], + 'Sieve' => [ + 'host' => $result['incomingServer'][0]['hostname'], + 'port' => $result['incomingServer'][0]['port'], + 'type' => $typeIMAP, + 'shortLogin' => '%EMAILADDRESS%' !== $result['incomingServer'][0]['username'], + 'enabled' => false + ], + 'whiteList' => '' + ]); + $oProvider->Save($oDomain); + \SnappyMail\Log::notice("Domain setup for '{$sDomain}' is created and active"); + } + } + } + } + +}