'ct_auto_mail_hooks']; public function __construct( ILogger $logger, Config $config, IUserManager $userManager) { $this->logger = $logger; $this->config = $config; $this->userManager = $userManager; } public function register() { $this->userManager->listen( '\OC\User', 'postCreateUser',$this->createUserCB()); $this->userManager->listen( '\OC\User', 'preDelete', $this->deleteUserCB()); $this->userManager->listen( '\OC\User', 'postSetPassword', $this->updateEmailPasswordCB()); $this->userManager->listen( '\OC\User', 'changeUser', $this->changeUserCB()); } private function createUserCB() { return function (\OC\User\User $user, string $password) { $uid = $user->getUID(); $name = $user->getDisplayName(); $email_suffix = $this->config->getEmailAddressSuffix(); $quota = $this->config->getEmailQuotaMB(); $newuser = array( 'userid' => $uid, 'password' => $password, 'name' => $name, 'email' => $uid . $email_suffix, 'quota' => $quota // in MB ); if($this->createEmailAccount($newuser)) { $this->logger->warning( "Automatically created mail account for uid " . $uid . " with e-mail address \"" . $newuser["email"] . " e-mail address suffix was \"". $email_suffix . "\"." , $this->logContext); } else { $this->logger->error( "Error creating mail account OR mail folders for uid " . $uid); } }; } private function deleteUserCB() { return function (\OC\User\User $user) { $uid = $user->getUID(); $email_suffix = $this->config->getEmailAddressSuffix(); $email = $uid . $email_suffix; $user_data = array('email' => $email); if($this->deleteEmailAccount($user_data)) $this->logger->warning( "Deleted mail account: " . $email, $this->logContext); else $this->logger->error("Error deleting mail account" . $uid); }; } private function updateEmailPasswordCB() { return function (\OC\User\User $user, string $password) { $uid = $user->getUID(); $email_suffix = $this->config->getEmailAddressSuffix(); $email = $uid . $email_suffix; $user_data = array( 'email' => $email, 'password' => $password ); if($this->updateEmailPassword($user_data)) $this->logger->warning( "Updated glesys password for account: " . $email, $this->logContext); else $this->logger->error( "Error updating mail password for account" . $uid); }; } private function changeUserCB() { return function (\OC\User\User $user, $feature, $value) { $this->logger->warning( "User: " . print_r($user, 1), $this->logContext); $this->logger->warning( "Feature: " . print_r($feature, 1), $this->logContext); $this->logger->warning( "Value: " . print_r($value, 1), $this->logContext); }; } private function createImapFolders($user_data) { $server = 'mail.glesys.se'; $email = $user_data['email']; $passw = $user_data['password']; $folders = array('Sent', 'Drafts', 'Trash', 'Junk', 'Archive'); $mbox = \imap_open("{" . $server . "}", $email, $passw, OP_HALFOPEN); if(!$mbox){ $message = "can't connect: " . \imap_last_error(); $this->logger->error($message); return false; } foreach ($folders as $folder) { if (! @\imap_createmailbox( $mbox, \imap_utf7_encode("{".$server."}INBOX.".$folder))) { $message = 'Error creating ' . $folder . ' folder: ' . \imap_last_error(); $this->logger->error($message); } } \imap_close($mbox); return true; } private function createEmailAccount($user_data) { $keys = $this->config->getGlesysKeys(); $fields = array( 'emailaccount' => $user_data['email'], 'password' => $user_data['password'], 'quota' => $user_data['quota'] ); $query = http_build_query($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.glesys.com/email/createaccount/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_USERPWD, $keys); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); $result = curl_exec($ch); if (curl_errno($ch)) { $message = 'Error:' . curl_error($ch); $this->logger->error($message); return false; } curl_close($ch); $xml = simplexml_load_string($result); $code = $xml->status->code; if ($code == 200) return $this->createImapFolders($user_data); else $this->logger->warning( "Error: non-200 status: " . $xml->status->text); return false; } private function deleteEmailAccount($user_data){ $ch = curl_init(); $keys = $this->config->getGlesysKeys(); curl_setopt($ch, CURLOPT_URL, 'https://api.glesys.com/email/delete/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "email=" . $user_data["email"]); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_USERPWD, $keys); $result = curl_exec($ch); if (curl_errno($ch)) { $message = 'Error: ' . curl_error($ch); $this->logger->error($message); return false; } curl_close($ch); return true; } private function updateEmailPassword($user_data) { $keys = $this->config->getGlesysKeys(); $fields = array( 'emailaccount' => $user_data['email'], 'password' => $user_data['password'] ); $query = http_build_query($fields); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://api.glesys.com/email/editaccount/'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_USERPWD, $keys); curl_setopt($ch, CURLOPT_POSTFIELDS, $query); $result = curl_exec($ch); if (curl_errno($ch)) { $message = 'Error:' . curl_error($ch); $this->logger->error($message); return false; } curl_close($ch); $xml = simplexml_load_string($result); $code = $xml->status->code; if ($code != 200){ $this->logger->warning( "Error: non-200 status: " . $xml->status->text); return false; } return true; } }