1: <?php
2:
3: /**
4: * This code is licensed under AGPLv3 license or Afterlogic Software License
5: * if commercial version of the product was purchased.
6: * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
7: */
8:
9: namespace Aurora\Modules\MailSignupPlesk;
10:
11: /**
12: * Allows users to create new email accounts for themselves on Plesk.
13: *
14: * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
15: * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
16: * @copyright Copyright (c) 2023, Afterlogic Corp.
17: *
18: * @package Modules
19: */
20: class Module extends \Aurora\System\Module\AbstractModule
21: {
22: /**
23: * @var
24: */
25: private $oClient;
26:
27: public function init()
28: {
29: $this->subscribeEvent('MailSignup::Signup::before', [$this, 'onAfterSignup']);
30:
31: $sPleskHost = $this->getConfig('PleskHostname', 'localhost');
32: $this->oClient = new \PleskX\Api\Client($sPleskHost);
33:
34: $sPleskUser = $this->getConfig('PleskAdminUser', '');
35: $sPleskPass = $this->getConfig('PleskAdminPassword', '');
36: $this->oClient->setCredentials($sPleskUser, $sPleskPass);
37: }
38:
39: /**
40: * Creates account with credentials specified in registration form
41: *
42: * @param array $aArgs New account credentials.
43: * @param type $mResult Is passed by reference.
44: */
45: public function onAfterSignup($aArgs, &$mResult)
46: {
47: if (isset($aArgs['Login']) && isset($aArgs['Password']) && !empty(trim($aArgs['Password'])) && !empty(trim($aArgs['Login']))) {
48: $sLogin = trim($aArgs['Login']);
49: $sPassword = trim($aArgs['Password']);
50: $sFriendlyName = isset($aArgs['Name']) ? trim($aArgs['Name']) : '';
51: $bSignMe = isset($aArgs['SignMe']) ? (bool) $aArgs['SignMe'] : false;
52:
53: $bPrevState = \Aurora\System\Api::skipCheckUserRole(true);
54: [$sUsername, $sDomain] = explode("@", $sLogin);
55: try {
56: $mResult = $this->oClient->site()->get("name", $sDomain);
57: } catch (\Exception $oException) {
58: throw new \Aurora\System\Exceptions\ApiException(0, null, $oException->getMessage());
59: }
60:
61: if (is_object($mResult) && isset($mResult->id) && is_numeric($mResult->id)) {
62: $iSiteId = intval($mResult->id);
63: $aResult = array();
64: try {
65: $mResult2 = $this->oClient->mail()->create($sUsername, $iSiteId, true, $sPassword);
66: } catch(\Exception $oException) {
67: throw new \Aurora\System\Exceptions\ApiException(0, $oException, $oException->getMessage());
68: }
69: try {
70: $iUserId = \Aurora\Modules\Core\Module::Decorator()->CreateUser(0, $sLogin);
71: $oUser = \Aurora\System\Api::getUserById((int) $iUserId);
72: $oAccount = \Aurora\Modules\Mail\Module::Decorator()->CreateAccount($oUser->Id, $sFriendlyName, $sLogin, $sLogin, $sPassword);
73: if ($oAccount instanceof \Aurora\Modules\Mail\Models\MailAccount) {
74: $iTime = $bSignMe ? 0 : time();
75: $sAuthToken = \Aurora\System\Api::UserSession()->Set(
76: [
77: 'token' => 'auth',
78: 'sign-me' => $bSignMe,
79: 'id' => $oAccount->IdUser,
80: 'account' => $oAccount->Id,
81: 'account_type' => $oAccount->getName()
82: ],
83: $iTime
84: );
85: $mResult = ['AuthToken' => $sAuthToken];
86: }
87: } catch (\Exception $oException) {
88: if ($oException instanceof \Aurora\Modules\Mail\Exceptions\Exception &&
89: $oException->getCode() === \Aurora\Modules\Mail\Enums\ErrorCodes::CannotLoginCredentialsIncorrect) {
90: \Aurora\Modules\Core\Module::Decorator()->DeleteUser($oUser->Id);
91: }
92: throw $oException;
93: }
94: } else {
95: throw new \Aurora\System\Exceptions\ApiException(0, null, "Site not found");
96: }
97: \Aurora\System\Api::skipCheckUserRole($bPrevState);
98: }
99: return true;
100: }
101: }
102: