%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/ProjectSeven/ |
Current File : /www/varak.net/mail2.varak.net_old/libraries/ProjectSeven/Actions.php |
<?php /* * Copyright 2004-2014, AfterLogic Corp. * Licensed under AGPLv3 license or AfterLogic license * if commercial version of the product was purchased. * See the LICENSE file for a full license statement. */ namespace ProjectSeven; /** * @category ProjectSeven */ class Actions extends ActionsBase { /** * @var \CApiUsersManager */ protected $oApiUsers; /** * @var \CApiTenantsManager */ protected $oApiTenants; /** * @var \CApiWebmailManager */ protected $oApiWebMail; /** * @var \CApiIntegratorManager */ protected $oApiIntegrator; /** * @var \CApiMailManager */ protected $oApiMail; /** * @var \CApiFilecacheManager */ protected $oApiFileCache; /** * @var \CApiSieveManager */ protected $oApiSieve; /** * @var \CApiFilestorageManager */ protected $oApiFilestorage; /** * @var \CApiFetchersManager */ protected $oApiFetchers; /** * @var \CApiCalendarManager */ protected $oApiCalendar; /** * @var \CApiCapabilityManager */ protected $oApiCapability; /** * @var \CApiHelpdeskManager */ protected $oApiHelpdesk; protected $oApiTwilio; /** * @return void */ protected function __construct() { $this->oHttp = null; $this->oApiUsers = \CApi::Manager('users'); $this->oApiTenants = \CApi::Manager('tenants'); $this->oApiWebMail = \CApi::Manager('webmail'); $this->oApiIntegrator = \CApi::Manager('integrator'); $this->oApiMail = \CApi::Manager('mail'); $this->oApiFileCache = \CApi::Manager('filecache'); $this->oApiSieve = \CApi::Manager('sieve'); $this->oApiFilestorage = \CApi::Manager('filestorage'); $this->oApiCalendar = \CApi::Manager('calendar'); $this->oApiCapability = \CApi::Manager('capability'); $this->oApiFetchers = null; $this->oApiHelpdesk = null; $this->oApiTwilio = \api_Twilio::NewInstance(); } /** * @return \ProjectSeven\Actions */ public static function NewInstance() { return new self(); } /** * @return \CApiFetchersManager */ public function ApiFetchers() { if (null === $this->oApiFetchers) { $this->oApiFetchers = \CApi::Manager('fetchers'); } return $this->oApiFetchers; } /** * @return \CApiFilecacheManager */ public function ApiFileCache() { return $this->oApiFileCache; } /** * @return \CApiHelpdeskManager */ public function ApiHelpdesk() { if (null === $this->oApiHelpdesk) { $this->oApiHelpdesk = \CApi::Manager('helpdesk'); } return $this->oApiHelpdesk; } /** * @return \CApiSieveManager */ public function ApiSieve() { return $this->oApiSieve; } /** * @param string $sToken * * @return bool */ public function ValidateCsrfToken($sToken) { return $this->oApiIntegrator->ValidateCsrfToken($sToken); } /** * @param int $iAccountId * @param bool $bVerifyLogginedUserId = true * @return CAccount | null */ public function GetAccount($iAccountId, $bVerifyLogginedUserId = true) { $oResult = null; $iUserId = $bVerifyLogginedUserId ? $this->oApiIntegrator->GetLogginedUserId() : 1; if (0 < $iUserId) { $oAccount = $this->oApiUsers->GetAccountById($iAccountId); if ($oAccount instanceof \CAccount && ($bVerifyLogginedUserId && $oAccount->IdUser === $iUserId || !$bVerifyLogginedUserId) && !$oAccount->IsDisabled) { $oResult = $oAccount; } } return $oResult; } /** * @return \CAccount | null */ public function GetDefaultAccount() { $oResult = null; $iUserId = $this->oApiIntegrator->GetLogginedUserId(); if (0 < $iUserId) { $iAccountId = $this->oApiUsers->GetDefaultAccountId($iUserId); if (0 < $iAccountId) { $oAccount = $this->oApiUsers->GetAccountById($iAccountId); if ($oAccount instanceof \CAccount && !$oAccount->IsDisabled) { $oResult = $oAccount; } } } return $oResult; } /** * @return \CAccount|null */ public function GetCurrentAccount($bThrowAuthExceptionOnFalse = true) { return $this->getAccountFromParam($bThrowAuthExceptionOnFalse); } /** * @param \CAccount $oAccount * * @return \CHelpdeskUser|null */ public function GetHelpdeskAccountFromMainAccount(&$oAccount) { $oResult = null; $oApiHelpdesk = $this->ApiHelpdesk(); if ($oAccount && $oAccount->IsDefaultAccount && $oApiHelpdesk && $this->oApiCapability->IsHelpdeskSupported($oAccount)) { if (0 < $oAccount->User->IdHelpdeskUser) { $oHelpdeskUser = $oApiHelpdesk->GetUserById($oAccount->IdTenant, $oAccount->User->IdHelpdeskUser); $oResult = $oHelpdeskUser instanceof \CHelpdeskUser ? $oHelpdeskUser : null; } if (!($oResult instanceof \CHelpdeskUser)) { $oHelpdeskUser = $oApiHelpdesk->GetUserByEmail($oAccount->IdTenant, $oAccount->Email); $oResult = $oHelpdeskUser instanceof \CHelpdeskUser ? $oHelpdeskUser : null; if ($oResult instanceof \CHelpdeskUser) { $oAccount->User->IdHelpdeskUser = $oHelpdeskUser->IdHelpdeskUser; $this->oApiUsers->UpdateAccount($oAccount); } } if (!($oResult instanceof \CHelpdeskUser)) { $oHelpdeskUser = new \CHelpdeskUser(); $oHelpdeskUser->Email = $oAccount->Email; $oHelpdeskUser->Name = $oAccount->FriendlyName; $oHelpdeskUser->IdSystemUser = $oAccount->IdUser; $oHelpdeskUser->IdTenant = $oAccount->IdTenant; $oHelpdeskUser->Activated = true; $oHelpdeskUser->IsAgent = true; $oHelpdeskUser->Language = $oAccount->User->DefaultLanguage; $oHelpdeskUser->DateFormat = $oAccount->User->DefaultDateFormat; $oHelpdeskUser->TimeFormat = $oAccount->User->DefaultTimeFormat; $oHelpdeskUser->SetPassword($oAccount->IncomingMailPassword); if ($oApiHelpdesk->CreateUser($oHelpdeskUser)) { $oAccount->User->IdHelpdeskUser = $oHelpdeskUser->IdHelpdeskUser; $this->oApiUsers->UpdateAccount($oAccount); $oResult = $oHelpdeskUser; } } } return $oResult; } /** * @return \CHelpdeskUser|null */ public function GetHelpdeskAccount($iTenantID) { $oResult = null; if ($this->oApiCapability->IsHelpdeskSupported()) { $iIdHelpdeskUser = $this->oApiIntegrator->GetLogginedHelpdeskUserId(); if (0 < $iIdHelpdeskUser) { $oHelpdeskUser = $this->ApiHelpdesk()->GetUserById($iTenantID, $iIdHelpdeskUser); $oResult = $oHelpdeskUser instanceof \CHelpdeskUser ? $oHelpdeskUser : null; } } return $oResult; } /** * @param bool $bThrowAuthExceptionOnFalse = true * @param bool $bVerifyLogginedUserId = true * @return \CAccount|null */ protected function getAccountFromParam($bThrowAuthExceptionOnFalse = true, $bVerifyLogginedUserId = true) { $sAccountID = (string) $this->getParamValue('AccountID', ''); if (0 === strlen($sAccountID) || !is_numeric($sAccountID)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oResult = $this->GetAccount((int) $sAccountID, $bVerifyLogginedUserId); if ($bThrowAuthExceptionOnFalse && !($oResult instanceof \CAccount)) { $oExc = $this->oApiUsers->GetLastException(); throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError, $oExc ? $oExc : null, $oExc ? $oExc->getMessage() : ''); } return $oResult; } /** * @return \CAccount|null */ protected function getDefaultAccountFromParam($bThrowAuthExceptionOnFalse = true) { $oResult = $this->GetDefaultAccount(); if ($bThrowAuthExceptionOnFalse && !($oResult instanceof \CAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError); } return $oResult; } /** * @return \CHelpdeskUser|null */ protected function getHelpdeskAccountFromParam($oAccount, $bThrowAuthExceptionOnFalse = true) { $oResult = null; $oAccount = null; if ('0' === (string) $this->getParamValue('IsExt', '1')) { $oAccount = $this->getDefaultAccountFromParam($bThrowAuthExceptionOnFalse); if ($oAccount && $this->oApiCapability->IsHelpdeskSupported($oAccount)) { $oResult = $this->GetHelpdeskAccountFromMainAccount($oAccount); } } else { $mTenantID = $this->oApiIntegrator->GetTenantIdByHash($this->getParamValue('TenantHash', '')); if (is_int($mTenantID)) { $oResult = $this->GetHelpdeskAccount($mTenantID); } } if (!$oResult && $bThrowAuthExceptionOnFalse) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::UnknownError); } return $oResult; } /** * @return \CHelpdeskUser|null */ protected function getExtHelpdeskAccountFromParam($bThrowAuthExceptionOnFalse = true) { $oResult = $this->GetExtHelpdeskAccount(); if (!$oResult) { $oResult = null; if ($bThrowAuthExceptionOnFalse) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError); } } return $oResult; } /** * @return array */ public function AjaxNoop() { return $this->TrueResponse(null, __FUNCTION__); } /** * @return array */ public function AjaxPing() { return $this->DefaultResponse(null, __FUNCTION__, 'Pong'); } /** * @return array */ public function AjaxCheckUrl() { $oAccount = $this->GetDefaultAccount(); $mResult = false; if ($oAccount) { $sUrl = trim($this->getParamValue('Url', '')); if (!empty($sUrl)) { if (\api_Utils::GetLinkType($sUrl) === \EFileStorageLinkType::GoogleDrive) { if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } $oInfo = \api_Utils::GetGoogleDriveFileInfo($sUrl, $oTenant->SocialGoogleApiKey); if ($oInfo) { $mResult['Size'] = 0; if (isset($oInfo->fileSize)) { $mResult['Size'] = $oInfo->fileSize; } else { $aRemoteFileInfo = \api_Utils::GetRemoteFileInfo($sUrl); $mResult['Size'] = $aRemoteFileInfo['size']; } $mResult['Name'] = isset($oInfo->title) ? $oInfo->title : ''; $mResult['Thumb'] = isset($oInfo->thumbnailLink) ? $oInfo->thumbnailLink : null; } } else { if (\api_Utils::GetLinkType($sUrl) === \EFileStorageLinkType::DropBox) { $sUrl = str_replace('?dl=0', '', $sUrl); } if (\api_Utils::RemoteFileExists($sUrl)) { $aRemoteFileInfo = \api_Utils::GetRemoteFileInfo($sUrl); $sFileExtension = \api_Utils::GetFileExtensionFromMimeContentType($aRemoteFileInfo['content-type']); $sFileName = basename($sUrl); $sFileExtension = \api_Utils::GetFileExtension($sFileName); if (empty($sFileExtension)) { $sFileExtension = \api_Utils::GetFileExtensionFromMimeContentType($aRemoteFileInfo['content-type']); $sFileName .= '.'.$sFileExtension; } $mResult['Name'] = urldecode($sFileName); $mResult['Size'] = $aRemoteFileInfo['size']; } } } } return $this->DefaultResponse(null, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxSocialCreate() { $oAccount = $this->GetDefaultAccount(); $mResult = false; if ($oAccount) { $iType = (int) trim($this->getParamValue('Type', \ESocialType::Unknown)); $sAccessToken = trim($this->getParamValue('AccessToken', '')); if (\ESocialType::Unknown !== $iType && !empty($sAccessToken)) { $oTenant = null; if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } $oUserInfo = null; if (\ESocialType::Google === $iType && $oTenant) { $oUserInfo = \api_Utils::GetGoogleUserInfo($oTenant->SocialGoogleApiKey, $sAccessToken); } if ($oUserInfo) { $oApiSocial = /* @var $oApiSocial \CApiSocialManager */ \CApi::Manager('social'); $oSocial = new \CSocial(); $oSocial->IdAccount = $oAccount->IdAccount; $oSocial->Type = $iType; $oSocial->IdSocial = $oUserInfo->id; $oSocial->Name = $oUserInfo->name; $mResult = $oApiSocial->CreateSocial($oSocial); } } } return $this->DefaultResponse(null, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxIsAuth() { $mResult = false; $oAccount = $this->getAccountFromParam(false); if ($oAccount) { $sClientTimeZone = trim($this->getParamValue('ClientTimeZone', '')); if ('' !== $sClientTimeZone) { $oAccount->User->ClientTimeZone = $sClientTimeZone; $this->oApiUsers->UpdateAccount($oAccount); } $mResult = array(); $mResult['Extensions'] = array(); // extensions if ($oAccount->IsEnabledExtension(\CAccount::IgnoreSubscribeStatus) && !$oAccount->IsEnabledExtension(\CAccount::DisableManageSubscribe)) { $oAccount->EnableExtension(\CAccount::DisableManageSubscribe); } $aExtensions = $oAccount->GetExtensions(); foreach ($aExtensions as $sExtensionName) { if ($oAccount->IsEnabledExtension($sExtensionName)) { $mResult['Extensions'][] = $sExtensionName; } } } return $this->DefaultResponse(null, __FUNCTION__, $mResult); } /** * @param \CAccount $oAccount * @param \CFetcher $oFetcher * @param bool $bUpdate = false */ private function populateFetcherFromHttpPost($oAccount, &$oFetcher, $bUpdate = false) { if ($oFetcher) { $oFetcher->IdAccount = $oAccount->IdAccount; $oFetcher->IdUser = $oAccount->IdUser; $oFetcher->IdDomain = $oAccount->IdDomain; $oFetcher->IdTenant = $oAccount->IdTenant; if (!$bUpdate) { $oFetcher->IncomingMailServer = (string) $this->oHttp->GetPost('IncomingMailServer', $oFetcher->IncomingMailServer); $oFetcher->IncomingMailPort = (int) $this->oHttp->GetPost('IncomingMailPort', $oFetcher->IncomingMailPort); $oFetcher->IncomingMailLogin = (string) $this->oHttp->GetPost('IncomingMailLogin', $oFetcher->IncomingMailLogin); $oFetcher->IncomingMailSecurity = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT; $oFetcher->IncomingMailSecurity = 995 ===$oFetcher->IncomingMailPort ? \MailSo\Net\Enumerations\ConnectionSecurityType::SSL : \MailSo\Net\Enumerations\ConnectionSecurityType::NONE; } $sIncomingMailPassword = (string) $this->oHttp->GetPost('IncomingMailPassword', $oFetcher->IncomingMailPassword); if ('******' !== $sIncomingMailPassword) { $oFetcher->IncomingMailPassword = $sIncomingMailPassword; } $oFetcher->Folder = (string) $this->oHttp->GetPost('Folder', $oFetcher->Folder); $oFetcher->IsEnabled = '1' === (string) $this->oHttp->GetPost('IsEnabled', $oFetcher->IsEnabled ? '1' : '0'); $oFetcher->LeaveMessagesOnServer = '1' === (string) $this->oHttp->GetPost('LeaveMessagesOnServer', $oFetcher->LeaveMessagesOnServer ? '1' : '0'); $oFetcher->Name = (string) $this->oHttp->GetPost('Name', $oFetcher->Name); $oFetcher->Email = (string) $this->oHttp->GetPost('Email', $oFetcher->Email); $oFetcher->Signature = (string) $this->oHttp->GetPost('Signature', $oFetcher->Signature); $oFetcher->SignatureOptions = (string) $this->oHttp->GetPost('SignatureOptions', $oFetcher->SignatureOptions); $oFetcher->IsOutgoingEnabled = '1' === (string) $this->oHttp->GetPost('IsOutgoingEnabled', $oFetcher->IsOutgoingEnabled ? '1' : '0'); $oFetcher->OutgoingMailServer = (string) $this->oHttp->GetPost('OutgoingMailServer', $oFetcher->OutgoingMailServer); $oFetcher->OutgoingMailPort = (int) $this->oHttp->GetPost('OutgoingMailPort', $oFetcher->OutgoingMailPort); $oFetcher->OutgoingMailAuth = '1' === (string) $this->oHttp->GetPost('OutgoingMailAuth', $oFetcher->OutgoingMailAuth ? '1' : '0'); $oFetcher->OutgoingMailSecurity = \MailSo\Net\Enumerations\ConnectionSecurityType::AUTO_DETECT; $oFetcher->OutgoingMailSecurity = 465 ===$oFetcher->OutgoingMailPort ? \MailSo\Net\Enumerations\ConnectionSecurityType::SSL : (587 === $oFetcher->OutgoingMailPort ? \MailSo\Net\Enumerations\ConnectionSecurityType::STARTTLS : \MailSo\Net\Enumerations\ConnectionSecurityType::NONE); } } /** * @return array */ public function AjaxFetcherList() { $oAccount = $this->getAccountFromParam(); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiFetchers()->GetFetchers($oAccount)); } /** * @return array */ public function AjaxFetcherCreate() { $oAccount = $this->getAccountFromParam(); $oFetcher = null; $this->ApiFetchers(); $oFetcher = new \CFetcher($oAccount); $this->populateFetcherFromHttpPost($oAccount, $oFetcher); $bResult = $this->ApiFetchers()->CreateFetcher($oAccount, $oFetcher); if ($bResult) { $sStartScript = '/opt/afterlogic/scripts/webshell-mailfetch-on-create.sh'; // TODO if (@\file_exists($sStartScript)) { @\shell_exec($sStartScript.' '.$oAccount->Email.' '.$oFetcher->IdFetcher); } return $this->TrueResponse($oAccount, __FUNCTION__); } $oExc = $this->ApiFetchers()->GetLastException(); if ($oExc && $oExc instanceof \CApiBaseException) { switch ($oExc->getCode()) { case \CApiErrorCodes::Fetcher_ConnectToMailServerFailed: throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FetcherConnectError); case \CApiErrorCodes::Fetcher_AuthError: throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FetcherAuthError); } return $this->ExceptionResponse($oAccount, __FUNCTION__, $oExc); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxFetcherUpdate() { $oAccount = $this->getAccountFromParam(); $oFetcher = null; $this->ApiFetchers(); $iFetcherID = (int) $this->getParamValue('FetcherID', 0); if (0 < $iFetcherID) { $aFetchers = $this->ApiFetchers()->GetFetchers($oAccount); if (is_array($aFetchers) && 0 < count($aFetchers)) { foreach ($aFetchers as /* @var $oFetcherItem \CFetcher */ $oFetcherItem) { if ($oFetcherItem && $iFetcherID === $oFetcherItem->IdFetcher && $oAccount->IdUser === $oFetcherItem->IdUser) { $oFetcher = $oFetcherItem; break; } } } } if ($oFetcher && $iFetcherID === $oFetcher->IdFetcher) { $this->populateFetcherFromHttpPost($oAccount, $oFetcher, true); } $bResult = $oFetcher ? $this->ApiFetchers()->UpdateFetcher($oAccount, $oFetcher) : false; if ($bResult || !$oFetcher) { return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } $oExc = $this->ApiFetchers()->GetLastException(); if ($oExc && $oExc instanceof \CApiBaseException) { switch ($oExc->getCode()) { case \CApiErrorCodes::Fetcher_ConnectToMailServerFailed: throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FetcherConnectError); case \CApiErrorCodes::Fetcher_AuthError: throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FetcherAuthError); } return $this->ExceptionResponse($oAccount, __FUNCTION__, $oExc); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxFetcherDelete() { $oAccount = $this->getAccountFromParam(); $iFetcherID = (int) $this->getParamValue('FetcherID', 0); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiFetchers()->DeleteFetcher($oAccount, $iFetcherID)); } /** * @return array */ public function AjaxEmailDomainData() { $oAccount = $this->getAccountFromParam(); $sEmail = (string) $this->getParamValue('Email', ''); $sDomainName = \MailSo\Base\Utils::GetDomainFromEmail($sEmail); if (empty($sEmail) || empty($sDomainName)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oApiDomains = /* @var $oApiDomains \CApiDomainsManager */ \CApi::Manager('domains'); $oDomain = $oApiDomains->GetDomainByName($sDomainName); return $this->DefaultResponse($oAccount, __FUNCTION__, $oDomain ? array( 'IsInternal' => $oDomain->IsInternal, 'IncomingMailServer' => $oDomain->IncomingMailServer, 'IncomingMailPort' => $oDomain->IncomingMailPort, 'OutgoingMailServer' => $oDomain->OutgoingMailServer, 'OutgoingMailPort' => $oDomain->OutgoingMailPort, 'OutgoingMailAuth' => $oDomain->OutgoingMailAuth ) : false); } /** * @return array */ public function AjaxFolderList() { $oAccount = $this->getAccountFromParam(); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiMail->Folders($oAccount)); } /** * @return array */ public function AjaxExpandAttachment() { $self = $this; $mResult = false; $oAccount = null; $sHash = \md5(\microtime(true).\rand(1000, 9999)); $this->rawCallback((string) $this->getParamValue('RawKey', ''), function ($oAccount, $sContentType, $sFileName, $rResource) use ($self, $sHash, &$mResult) { if ($self->ApiFileCache()->PutFile($oAccount, $sHash, $rResource)) { $sFullFilePath = $self->ApiFileCache()->GenerateFullFilePath($oAccount, $sHash); $aExpand = array(); \CApi::Plugin()->RunHook('webmail.expand-attachment', array($oAccount, $sContentType, $sFileName, $sFullFilePath, &$aExpand, $self->ApiFileCache())); if (is_array($aExpand) && 0 < \count($aExpand)) { foreach ($aExpand as $aItem) { if ($aItem && isset($aItem['FileName'], $aItem['MimeType'], $aItem['Size'], $aItem['TempName'])) { $mResult[] = array( 'FileName' => $aItem['FileName'], 'MimeType' => $aItem['MimeType'], 'EstimatedSize' => $aItem['Size'], 'CID' => '', 'Thumb' => \CApi::GetConf('labs.allow-thumbnail', true) && \api_Utils::IsGDImageMimeTypeSuppoted($aItem['MimeType'], $aItem['FileName']), 'Expand' => \CApi::isExpandMimeTypeSupported($aItem['MimeType'], $aItem['FileName']), 'Iframed' =>\CApi::isIframedMimeTypeSupported($aItem['MimeType'], $aItem['FileName']), 'IsInline' => false, 'IsLinked' => false, 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'Iframed' =>\CApi::isIframedMimeTypeSupported($aItem['MimeType'], $aItem['FileName']), 'AccountID' => $oAccount->IdAccount, 'Name' => $aItem['FileName'], 'TempName' => $aItem['TempName'] )) ); } } } $self->ApiFileCache()->Clear($oAccount, $sHash); } }, false, $oAccount); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxSetupSystemFolders() { $oAccount = $this->getAccountFromParam(); $sSent = (string) $this->getParamValue('Sent', ''); $sDrafts = (string) $this->getParamValue('Drafts', ''); $sTrash = (string) $this->getParamValue('Trash', ''); $sSpam = (string) $this->getParamValue('Spam', ''); $aData = array(); if (0 < strlen(trim($sSent))) { $aData[$sSent] = \EFolderType::Sent; } if (0 < strlen(trim($sDrafts))) { $aData[$sDrafts] = \EFolderType::Drafts; } if (0 < strlen(trim($sTrash))) { $aData[$sTrash] = \EFolderType::Trash; } if (0 < strlen(trim($sSpam))) { $aData[$sSpam] = \EFolderType::Spam; } return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiMail->SetSystemFolderNames($oAccount, $aData)); } /** * @return array */ public function AjaxFolderCounts() { $aFolders = $this->getParamValue('Folders', ''); $sInboxUidnext = $this->getParamValue('InboxUidnext', ''); if (!is_array($aFolders) || 0 === count($aFolders)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $aResult = array(); $oAccount = $this->getAccountFromParam(); try { $aInboxNewData = array(); $aResult = $this->oApiMail->FolderCountsFromArray($oAccount, $aFolders, $aInboxNewData, $sInboxUidnext); } catch (\MailSo\Net\Exceptions\ConnectionException $oException) { throw $oException; } catch (\MailSo\Imap\Exceptions\LoginException $oException) { throw $oException; } catch (\Exception $oException) { \CApi::Log((string) $oException); } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Counts' => $aResult, 'New' => $aInboxNewData )); } /** * @return array */ public function AjaxFolderCreate() { $sFolderNameInUtf8 = trim((string) $this->getParamValue('FolderNameInUtf8', '')); $sDelimiter = trim((string) $this->getParamValue('Delimiter', '')); $sFolderParentFullNameRaw = (string) $this->getParamValue('FolderParentFullNameRaw', ''); if (0 === strlen($sFolderNameInUtf8) || 1 !== strlen($sDelimiter)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->FolderCreate($oAccount, $sFolderNameInUtf8, $sDelimiter, $sFolderParentFullNameRaw); if (!$oAccount->IsEnabledExtension(\CAccount::DisableFoldersManualSort)) { $aFoldersOrderList = $this->oApiMail->FoldersOrder($oAccount); if (is_array($aFoldersOrderList) && 0 < count($aFoldersOrderList)) { $aFoldersOrderListNew = $aFoldersOrderList; $sFolderNameInUtf7Imap = \MailSo\Base\Utils::ConvertEncoding($sFolderNameInUtf8, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP); $sFolderFullNameRaw = (0 < strlen($sFolderParentFullNameRaw) ? $sFolderParentFullNameRaw.$sDelimiter : ''). $sFolderNameInUtf7Imap; $sFolderFullNameUtf8 = \MailSo\Base\Utils::ConvertEncoding($sFolderFullNameRaw, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, \MailSo\Base\Enumerations\Charset::UTF_8); $aFoldersOrderListNew[] = $sFolderFullNameRaw; $aFoldersOrderListUtf8 = array_map(function ($sValue) { return \MailSo\Base\Utils::ConvertEncoding($sValue, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP, \MailSo\Base\Enumerations\Charset::UTF_8); }, $aFoldersOrderListNew); usort($aFoldersOrderListUtf8, 'strnatcasecmp'); $iKey = array_search($sFolderFullNameUtf8, $aFoldersOrderListUtf8, true); if (is_int($iKey) && 0 < $iKey && isset($aFoldersOrderListUtf8[$iKey - 1])) { $sUpperName = $aFoldersOrderListUtf8[$iKey - 1]; $iUpperKey = array_search(\MailSo\Base\Utils::ConvertEncoding($sUpperName, \MailSo\Base\Enumerations\Charset::UTF_8, \MailSo\Base\Enumerations\Charset::UTF_7_IMAP), $aFoldersOrderList, true); if (is_int($iUpperKey) && isset($aFoldersOrderList[$iUpperKey])) { \CApi::Log('insert order index:'.$iUpperKey); array_splice($aFoldersOrderList, $iUpperKey + 1, 0, $sFolderFullNameRaw); $this->oApiMail->FoldersOrderUpdate($oAccount, $aFoldersOrderList); } } } } return $this->TrueResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxFolderRename() { $sPrevFolderFullNameRaw = (string) $this->getParamValue('PrevFolderFullNameRaw', ''); $sNewFolderNameInUtf8 = trim($this->getParamValue('NewFolderNameInUtf8', '')); if (0 === strlen($sPrevFolderFullNameRaw) || 0 === strlen($sNewFolderNameInUtf8)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $mResult = $this->oApiMail->FolderRename($oAccount, $sPrevFolderFullNameRaw, $sNewFolderNameInUtf8); return $this->DefaultResponse($oAccount, __FUNCTION__, 0 < strlen($mResult) ? array( 'FullName' => $mResult, 'FullNameHash' => md5($mResult) ) : false); } /** * @return array */ public function AjaxFolderDelete() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); if (0 === strlen(trim($sFolderFullNameRaw))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->FolderDelete($oAccount, $sFolderFullNameRaw); return $this->TrueResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxFolderSubscribe() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $bSetAction = '1' === (string) $this->getParamValue('SetAction', '0'); if (0 === strlen(trim($sFolderFullNameRaw))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); if (!$oAccount->IsEnabledExtension(\CAccount::DisableManageSubscribe)) { $this->oApiMail->FolderSubscribe($oAccount, $sFolderFullNameRaw, $bSetAction); return $this->TrueResponse($oAccount, 'FolderSubscribe'); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxFolderListOrderUpdate() { $aFolderList = $this->getParamValue('FolderList', null); if (!is_array($aFolderList)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); if ($oAccount->IsEnabledExtension(\CAccount::DisableFoldersManualSort)) { return $this->FalseResponse($oAccount, __FUNCTION__); } return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiMail->FoldersOrderUpdate($oAccount, $aFolderList)); } /** * @return array */ public function AjaxFolderClear() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); if (0 === strlen(trim($sFolderFullNameRaw))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->FolderClear($oAccount, $sFolderFullNameRaw); return $this->TrueResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxMessageList() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $sOffset = trim((string) $this->getParamValue('Offset', '')); $sLimit = trim((string) $this->getParamValue('Limit', '')); $sSearch = trim((string) $this->getParamValue('Search', '')); $bUseThreads = '1' === (string) $this->getParamValue('UseThreads', '0'); $sInboxUidnext = $this->getParamValue('InboxUidnext', ''); $aFilters = array(); $sFilters = strtolower(trim((string) $this->getParamValue('Filters', ''))); if (0 < strlen($sFilters)) { $aFilters = array_filter(explode(',', $sFilters), function ($sValue) { return '' !== trim($sValue); }); } $iOffset = 0 < strlen($sOffset) && is_numeric($sOffset) ? (int) $sOffset : 0; $iLimit = 0 < strlen($sLimit) && is_numeric($sLimit) ? (int) $sLimit : 0; if (0 === strlen(trim($sFolderFullNameRaw)) || 0 > $iOffset || 0 >= $iLimit || 200 < $sLimit) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $oMessageList = $this->oApiMail->MessageList( $oAccount, $sFolderFullNameRaw, $iOffset, $iLimit, $sSearch, $bUseThreads, $aFilters, $sInboxUidnext); return $this->DefaultResponse($oAccount, __FUNCTION__, $oMessageList); } /** * @return array */ public function AjaxMessageListByUids() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $aUids = $this->getParamValue('Uids', array()); if (0 === strlen(trim($sFolderFullNameRaw)) || !is_array($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $oMessageList = $this->oApiMail->MessageListByUids($oAccount, $sFolderFullNameRaw, $aUids); return $this->DefaultResponse($oAccount, __FUNCTION__, $oMessageList); } /** * @return array */ public function AjaxMessageFlags() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $aUids = $this->getParamValue('Uids', array()); if (0 === strlen(trim($sFolderFullNameRaw)) || !is_array($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $aMessageFlags = $this->oApiMail->MessageFlags($oAccount, $sFolderFullNameRaw, $aUids); return $this->DefaultResponse($oAccount, __FUNCTION__, $aMessageFlags); } /** * @return array */ public function AjaxMessageZipAttachments() { $aHashes = $this->getParamValue('Hashes', null); if (!is_array($aHashes) || 0 === count($aHashes) || !class_exists('ZipArchive')) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mResult = false; $oAccount = $this->getAccountFromParam(); $self = $this; $aAdd = array(); foreach ($aHashes as $sHash) { $this->rawCallback($sHash, function ($oAccount, $sContentType, $sFileName, $rResource) use ($self, $sHash, &$aAdd) { $sHash = md5($sHash.rand(1000, 9999)); if ($self->ApiFileCache()->PutFile($oAccount, $sHash, $rResource)) { $sFullFilePath = $self->ApiFileCache()->GenerateFullFilePath($oAccount, $sHash); $aAdd[] = array($sFullFilePath, $sFileName, $sContentType); } }, false, $oAccount); } if (0 < count($aAdd)) { include_once PSEVEN_APP_ROOT_PATH.'libraries/other/Zip.php'; $oZip = new \Zip(); $sZipHash = md5(implode(',', $aHashes).rand(1000, 9999)); foreach ($aAdd as $aItem) { $oZip->addFile(fopen($aItem[0], 'r'), $aItem[1]); } $self->ApiFileCache()->PutFile($oAccount, $sZipHash, $oZip->getZipFile()); $mResult = \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => 'attachments.zip', 'TempName' => $sZipHash )); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxMessageMove() { $sFromFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $sToFolderFullNameRaw = (string) $this->getParamValue('ToFolder', ''); $aUids = \ProjectSeven\Base\Utils::ExplodeIntUids((string) $this->getParamValue('Uids', '')); if (0 === strlen(trim($sFromFolderFullNameRaw)) || 0 === strlen(trim($sToFolderFullNameRaw)) || !is_array($aUids) || 0 === count($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); try { $this->oApiMail->MessageMove( $oAccount, $sFromFolderFullNameRaw, $sToFolderFullNameRaw, $aUids); } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { $oResponse = /* @var $oResponse \MailSo\Imap\Response */ $oException->GetLastResponse(); throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotMoveMessageQuota, $oException, $oResponse instanceof \MailSo\Imap\Response ? $oResponse->Tag.' '.$oResponse->StatusOrIndex.' '.$oResponse->HumanReadable : ''); } catch (\Exception $oException) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotMoveMessage, $oException, $oException->getMessage()); } return $this->TrueResponse($oAccount, __FUNCTION__); } public function AjaxMessageCopy() { $sFromFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $sToFolderFullNameRaw = (string) $this->getParamValue('ToFolder', ''); $aUids = \ProjectSeven\Base\Utils::ExplodeIntUids((string) $this->getParamValue('Uids', '')); if (0 === strlen(trim($sFromFolderFullNameRaw)) || 0 === strlen(trim($sToFolderFullNameRaw)) || !is_array($aUids) || 0 === count($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); try { $this->oApiMail->MessageCopy( $oAccount, $sFromFolderFullNameRaw, $sToFolderFullNameRaw, $aUids); } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { $oResponse = /* @var $oResponse \MailSo\Imap\Response */ $oException->GetLastResponse(); throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotCopyMessageQuota, $oException, $oResponse instanceof \MailSo\Imap\Response ? $oResponse->Tag.' '.$oResponse->StatusOrIndex.' '.$oResponse->HumanReadable : ''); } catch (\Exception $oException) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotCopyMessage, $oException, $oException->getMessage()); } return $this->TrueResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxMessageDelete() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $aUids = \ProjectSeven\Base\Utils::ExplodeIntUids((string) $this->getParamValue('Uids', '')); if (0 === strlen(trim($sFolderFullNameRaw)) || !is_array($aUids) || 0 === count($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->MessageDelete($oAccount, $sFolderFullNameRaw, $aUids); return $this->TrueResponse($oAccount, __FUNCTION__); } /** * @param \CAccount $oAccount * @param \CFetcher $oFetcher = null * @param bool $bWithDraftInfo = true * @param \CIdentity $oIdentity = null * * @return \MailSo\Mime\Message */ private function buildMessage($oAccount, $oFetcher = null, $bWithDraftInfo = true, $oIdentity = null) { $sTo = $this->getParamValue('To', ''); $sCc = $this->getParamValue('Cc', ''); $sBcc = $this->getParamValue('Bcc', ''); $sSubject = $this->getParamValue('Subject', ''); $bTextIsHtml = '1' === $this->getParamValue('IsHtml', '0'); $sText = $this->getParamValue('Text', ''); $aAttachments = $this->getParamValue('Attachments', null); $aDraftInfo = $this->getParamValue('DraftInfo', null); $sInReplyTo = $this->getParamValue('InReplyTo', ''); $sReferences = $this->getParamValue('References', ''); $sImportance = $this->getParamValue('Importance', ''); // 1 3 5 $sSensivity = $this->getParamValue('Sensivity', ''); // 0 1 2 3 4 $bReadingConfirmation = '1' === $this->getParamValue('ReadingConfirmation', '0'); $oMessage = \MailSo\Mime\Message::NewInstance(); $oMessage->RegenerateMessageId(); $sXMailer = \CApi::GetConf('webmail.xmailer-value', ''); if (0 < strlen($sXMailer)) { $oMessage->SetXMailer($sXMailer); } if ($oIdentity) { $oFrom = \MailSo\Mime\Email::NewInstance($oIdentity->Email, $oIdentity->FriendlyName); } else { $oFrom = $oFetcher ? \MailSo\Mime\Email::NewInstance($oFetcher->Email, $oFetcher->Name) : \MailSo\Mime\Email::NewInstance($oAccount->Email, $oAccount->FriendlyName); } $oMessage ->SetFrom($oFrom) ->SetSubject($sSubject) ; $oToEmails = \MailSo\Mime\EmailCollection::NewInstance($sTo); if ($oToEmails && $oToEmails->Count()) { $oMessage->SetTo($oToEmails); } $oCcEmails = \MailSo\Mime\EmailCollection::NewInstance($sCc); if ($oCcEmails && $oCcEmails->Count()) { $oMessage->SetCc($oCcEmails); } $oBccEmails = \MailSo\Mime\EmailCollection::NewInstance($sBcc); if ($oBccEmails && $oBccEmails->Count()) { $oMessage->SetBcc($oBccEmails); } if ($bWithDraftInfo && is_array($aDraftInfo) && !empty($aDraftInfo[0]) && !empty($aDraftInfo[1]) && !empty($aDraftInfo[2])) { $oMessage->SetDraftInfo($aDraftInfo[0], $aDraftInfo[1], $aDraftInfo[2]); } if (0 < strlen($sInReplyTo)) { $oMessage->SetInReplyTo($sInReplyTo); } if (0 < strlen($sReferences)) { $oMessage->SetReferences($sReferences); } if (0 < strlen($sImportance) && in_array((int) $sImportance, array( \MailSo\Mime\Enumerations\MessagePriority::HIGH, \MailSo\Mime\Enumerations\MessagePriority::NORMAL, \MailSo\Mime\Enumerations\MessagePriority::LOW ))) { $oMessage->SetPriority((int) $sImportance); } if (0 < strlen($sSensivity) && in_array((int) $sSensivity, array( \MailSo\Mime\Enumerations\Sensitivity::NOTHING, \MailSo\Mime\Enumerations\Sensitivity::CONFIDENTIAL, \MailSo\Mime\Enumerations\Sensitivity::PRIVATE_, \MailSo\Mime\Enumerations\Sensitivity::PERSONAL, ))) { $oMessage->SetSensitivity((int) $sSensivity); } if ($bReadingConfirmation) { $oMessage->SetReadConfirmation($oFetcher ? $oFetcher->Email : $oAccount->Email); } $aFoundCids = array(); \CApi::Plugin()->RunHook('webmail.message-text-html-raw', array($oAccount, &$oMessage, &$sText, &$bTextIsHtml)); if ($bTextIsHtml) { $sTextConverted = \MailSo\Base\HtmlUtils::ConvertHtmlToPlain($sText); \CApi::Plugin()->RunHook('webmail.message-plain-part', array($oAccount, &$oMessage, &$sTextConverted)); $oMessage->AddText($sTextConverted, false); } $mFoundDataURL = array(); $aFoundedContentLocationUrls = array(); $sTextConverted = $bTextIsHtml ? \MailSo\Base\HtmlUtils::BuildHtml($sText, $aFoundCids, $mFoundDataURL, $aFoundedContentLocationUrls) : $sText; \CApi::Plugin()->RunHook($bTextIsHtml ? 'webmail.message-html-part' : 'webmail.message-plain-part', array($oAccount, &$oMessage, &$sTextConverted)); $oMessage->AddText($sTextConverted, $bTextIsHtml); if (is_array($aAttachments)) { foreach ($aAttachments as $sTempName => $aData) { if (is_array($aData) && isset($aData[0], $aData[1], $aData[2], $aData[3])) { $sFileName = (string) $aData[0]; $sCID = (string) $aData[1]; $bIsInline = '1' === (string) $aData[2]; $bIsLinked = '1' === (string) $aData[3]; $sContentLocation = isset($aData[4]) ? (string) $aData[4] : ''; $rResource = $this->ApiFileCache()->GetFile($oAccount, $sTempName); if (is_resource($rResource)) { $iFileSize = $this->ApiFileCache()->FileSize($oAccount, $sTempName); $sCID = trim(trim($sCID), '<>'); $bIsFounded = 0 < strlen($sCID) ? in_array($sCID, $aFoundCids) : false; if (!$bIsLinked || $bIsFounded) { $oMessage->Attachments()->Add( \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, $bIsInline, $bIsLinked, $bIsLinked ? '<'.$sCID.'>' : '', array(), $sContentLocation) ); } } } } } if ($mFoundDataURL && \is_array($mFoundDataURL) && 0 < \count($mFoundDataURL)) { foreach ($mFoundDataURL as $sCidHash => $sDataUrlString) { $aMatch = array(); $sCID = '<'.$sCidHash.'>'; if (\preg_match('/^data:(image\/[a-zA-Z0-9]+);base64,(.+)$/i', $sDataUrlString, $aMatch) && !empty($aMatch[1]) && !empty($aMatch[2])) { $sRaw = \MailSo\Base\Utils::Base64Decode($aMatch[2]); $iFileSize = \strlen($sRaw); if (0 < $iFileSize) { $sFileName = \preg_replace('/[^a-z0-9]+/i', '.', $aMatch[1]); $rResource = \MailSo\Base\ResourceRegistry::CreateMemoryResourceFromString($sRaw); $sRaw = ''; unset($sRaw); unset($aMatch); $oMessage->Attachments()->Add( \MailSo\Mime\Attachment::NewInstance($rResource, $sFileName, $iFileSize, true, true, $sCID) ); } } } } \CApi::Plugin()->RunHook('webmail.build-message', array(&$oMessage)); return $oMessage; } /** * @param \CAccount $oAccount * * @return \MailSo\Mime\Message * * @throws \MailSo\Base\Exceptions\InvalidArgumentException */ private function buildConfirmationMessage($oAccount) { $sConfirmation = $this->getParamValue('Confirmation', ''); $sSubject = $this->getParamValue('Subject', ''); $sText = $this->getParamValue('Text', ''); if (0 === strlen($sConfirmation) || 0 === strlen($sSubject) || 0 === strlen($sText)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $oMessage = \MailSo\Mime\Message::NewInstance(); $oMessage->RegenerateMessageId(); $sXMailer = \CApi::GetConf('webmail.xmailer-value', ''); if (0 < strlen($sXMailer)) { $oMessage->SetXMailer($sXMailer); } $oTo = \MailSo\Mime\EmailCollection::Parse($sConfirmation); if (!$oTo || 0 === $oTo->Count()) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } $sFrom = 0 < strlen($oAccount->FriendlyName) ? '"'.$oAccount->FriendlyName.'"' : ''; if (0 < strlen($sFrom)) { $sFrom .= ' <'.$oAccount->Email.'>'; } else { $sFrom .= $oAccount->Email; } $oMessage ->SetFrom(\MailSo\Mime\Email::NewInstance($sFrom)) ->SetTo($oTo) ->SetSubject($sSubject) ; $oMessage->AddText($sText, false); return $oMessage; } /** * @return array */ public function AjaxMessageSend() { $oAccount = $this->getAccountFromParam(); $sSentFolder = $this->getParamValue('SentFolder', ''); $sDraftFolder = $this->getParamValue('DraftFolder', ''); $sDraftUid = $this->getParamValue('DraftUid', ''); $aDraftInfo = $this->getParamValue('DraftInfo', null); $sFetcherID = $this->getParamValue('FetcherID', ''); $sIdIdentity = $this->getParamValue('IdentityID', ''); $oFetcher = null; if (!empty($sFetcherID) && is_numeric($sFetcherID) && 0 < (int) $sFetcherID) { $iFetcherID = (int) $sFetcherID; $oApiFetchers = $this->ApiFetchers(); $aFetchers = $oApiFetchers->GetFetchers($oAccount); if (is_array($aFetchers) && 0 < count($aFetchers)) { foreach ($aFetchers as /* @var $oFetcherItem \CFetcher */ $oFetcherItem) { if ($oFetcherItem && $iFetcherID === $oFetcherItem->IdFetcher && $oAccount->IdUser === $oFetcherItem->IdUser) { $oFetcher = $oFetcherItem; break; } } } } $oIdentity = null; if (!empty($sIdIdentity) && is_numeric($sIdIdentity) && 0 < (int) $sIdIdentity) { $oIdentity = $this->oApiUsers->GetIdentity((int) $sIdIdentity); } $oMessage = $this->buildMessage($oAccount, $oFetcher, true, $oIdentity); if ($oMessage) { \CApi::Plugin()->RunHook('webmail.validate-message-for-send', array(&$oAccount, &$oMessage)); try { \CApi::Plugin()->RunHook('webmail.build-message-for-send', array(&$oMessage)); $mResult = $this->oApiMail->MessageSend($oAccount, $oMessage, $oFetcher, $sSentFolder, $sDraftFolder, $sDraftUid); } catch (\CApiManagerException $oException) { $iCode = \ProjectSeven\Notifications::CanNotSendMessage; switch ($oException->getCode()) { case \Errs::Mail_InvalidRecipients: $iCode = \ProjectSeven\Notifications::InvalidRecipients; break; case \Errs::Mail_CannotSendMessage: $iCode = \ProjectSeven\Notifications::CanNotSendMessage; break; case \Errs::Mail_CannotSaveMessageInSentItems: $iCode = \ProjectSeven\Notifications::CannotSaveMessageInSentItems; break; case \Errs::Mail_MailboxUnavailable: $iCode = \ProjectSeven\Notifications::MailboxUnavailable; break; } throw new \ProjectSeven\Exceptions\ClientException($iCode, $oException, $oException->GetPreviousMessage(), $oException->GetObjectParams()); } if ($mResult) { \CApi::Plugin()->RunHook('webmail.message-success-send', array(&$oAccount, &$oMessage)); $oApiContacts = $this->ApiContacts(); if ($oApiContacts) { $aCollection = $oMessage->GetRcpt(); $aEmails = array(); $aCollection->ForeachList(function ($oEmail) use (&$aEmails) { $aEmails[strtolower($oEmail->GetEmail())] = trim($oEmail->GetDisplayName()); }); if (is_array($aEmails)) { \CApi::Plugin()->RunHook('webmail.message-suggest-email', array(&$oAccount, &$aEmails)); $oApiContacts->UpdateSuggestTable($oAccount->IdUser, $aEmails); } } } if (is_array($aDraftInfo) && 3 === count($aDraftInfo)) { $sDraftInfoType = $aDraftInfo[0]; $sDraftInfoUid = $aDraftInfo[1]; $sDraftInfoFolder = $aDraftInfo[2]; try { switch (strtolower($sDraftInfoType)) { case 'reply': case 'reply-all': $this->oApiMail->MessageFlag($oAccount, $sDraftInfoFolder, array($sDraftInfoUid), \MailSo\Imap\Enumerations\MessageFlag::ANSWERED, \EMailMessageStoreAction::Add); break; case 'forward': $this->oApiMail->MessageFlag($oAccount, $sDraftInfoFolder, array($sDraftInfoUid), '$Forwarded', \EMailMessageStoreAction::Add); break; } } catch (\Exception $oException) {} } } \CApi::LogEvent(\EEvents::MessageSend, $oAccount); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxMessageSendConfirmation() { $oAccount = $this->getAccountFromParam(); $oMessage = $this->buildConfirmationMessage($oAccount); if ($oMessage) { try { $mResult = $this->oApiMail->MessageSend($oAccount, $oMessage); } catch (\CApiManagerException $oException) { $iCode = \ProjectSeven\Notifications::CanNotSendMessage; switch ($oException->getCode()) { case \Errs::Mail_InvalidRecipients: $iCode = \ProjectSeven\Notifications::InvalidRecipients; break; case \Errs::Mail_CannotSendMessage: $iCode = \ProjectSeven\Notifications::CanNotSendMessage; break; } throw new \ProjectSeven\Exceptions\ClientException($iCode, $oException); } $sConfirmFolderFullNameRaw = $this->getParamValue('ConfirmFolder', ''); $sConfirmUid = $this->getParamValue('ConfirmUid', ''); if (0 < \strlen($sConfirmFolderFullNameRaw) && 0 < \strlen($sConfirmUid)) { try { $mResult = $this->oApiMail->MessageFlag($oAccount, $sConfirmFolderFullNameRaw, array($sConfirmUid), '$ReadConfirm', \EMailMessageStoreAction::Add, false, true); } catch (\Exception $oException) {} } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxMessageAttachmentsSaveToFiles() { $oDefAccount = null; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsDefaultAccount) { $oDefAccount = $oAccount; } else { $oDefAccount = $this->getDefaultAccountFromParam(); } if (!$this->oApiCapability->IsFilesSupported($oDefAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $mResult = false; $self = $this; $oApiFilestorage = $self->oApiFilestorage; try { $aAttachments = $this->getParamValue('Attachments', array()); if (is_array($aAttachments) && 0 < count($aAttachments) && $oApiFilestorage) { $mResult = array(); foreach ($aAttachments as $sAttachment) { $aValues = \CApi::DecodeKeyValues($sAttachment); if (is_array($aValues)) { $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; $this->oApiMail->MessageMimeStream($oAccount, function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oDefAccount, &$mResult, $sAttachment, $self, $oApiFilestorage) { $sTempName = \md5(\time().\rand(1000, 9999).$sFileName); if (is_resource($rResource) && $self->ApiFileCache()->PutFile($oDefAccount, $sTempName, $rResource)) { $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $self->clearFileName($sFileName, $sContentType, $sMimeIndex); $rSubResource = $self->ApiFileCache()->GetFile($oDefAccount, $sTempName); if (is_resource($rSubResource)) { $mResult[$sAttachment] = $oApiFilestorage->CreateFile( $oDefAccount, \EFileStorageType::Personal, '', $sFileName, $rSubResource, false); } $self->ApiFileCache()->Clear($oDefAccount, $sTempName); } }, $sFolder, $iUid, $sMimeIndex); } } } } catch (\Exception $oException) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::MailServerError, $oException); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxMessageUploadAttachments() { $oAccount = $this->getAccountFromParam(); $mResult = false; $self = $this; try { $aAttachments = $this->getParamValue('Attachments', array()); if (is_array($aAttachments) && 0 < count($aAttachments)) { $mResult = array(); foreach ($aAttachments as $sAttachment) { $aValues = \CApi::DecodeKeyValues($sAttachment); if (is_array($aValues)) { $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) isset($aValues['Uid']) ? $aValues['Uid'] : 0; $sMimeIndex = (string) isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''; $sTempName = md5($sAttachment); if (!$this->ApiFileCache()->FileExists($oAccount, $sTempName)) { $this->oApiMail->MessageMimeStream($oAccount, function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($oAccount, &$mResult, $sTempName, $sAttachment, $self) { if (is_resource($rResource)) { $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $self->clearFileName($sFileName, $sContentType, $sMimeIndex); if ($self->ApiFileCache()->PutFile($oAccount, $sTempName, $rResource)) { $mResult[$sTempName] = $sAttachment; } } }, $sFolder, $iUid, $sMimeIndex); } else { $mResult[$sTempName] = $sAttachment; } } } } } catch (\Exception $oException) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::MailServerError, $oException); } return $this->DefaultResponse($oAccount, 'MessageUploadAttachments', $mResult); } /** * @return array */ public function AjaxMessageSave() { $mResult = false; $oAccount = $this->getAccountFromParam(); $sDraftFolder = $this->getParamValue('DraftFolder', ''); $sDraftUid = $this->getParamValue('DraftUid', ''); $sFetcherID = $this->getParamValue('FetcherID', ''); $sIdIdentity = $this->getParamValue('IdentityID', ''); if (0 === strlen($sDraftFolder)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oFetcher = null; if (!empty($sFetcherID) && is_numeric($sFetcherID) && 0 < (int) $sFetcherID) { $iFetcherID = (int) $sFetcherID; $oApiFetchers = $this->ApiFetchers(); $aFetchers = $oApiFetchers->GetFetchers($oAccount); if (is_array($aFetchers) && 0 < count($aFetchers)) { foreach ($aFetchers as /* @var $oFetcherItem \CFetcher */ $oFetcherItem) { if ($oFetcherItem && $iFetcherID === $oFetcherItem->IdFetcher && $oAccount->IdUser === $oFetcherItem->IdUser) { $oFetcher = $oFetcherItem; break; } } } } $oIdentity = null; if (!empty($sIdIdentity) && is_numeric($sIdIdentity) && 0 < (int) $sIdIdentity) { $oIdentity = $this->oApiUsers->GetIdentity((int) $sIdIdentity); } $oMessage = $this->buildMessage($oAccount, $oFetcher, true, $oIdentity); if ($oMessage) { try { \CApi::Plugin()->RunHook('webmail.build-message-for-save', array(&$oMessage)); $mResult = $this->oApiMail->MessageSave($oAccount, $oMessage, $sDraftFolder, $sDraftUid); } catch (\CApiManagerException $oException) { $iCode = \ProjectSeven\Notifications::CanNotSaveMessage; throw new \ProjectSeven\Exceptions\ClientException($iCode, $oException); } } return $this->DefaultResponse($oAccount, 'MessageSave', $mResult); } /** * @return array */ private function ajaxMessageSetFlag($sFlagName, $sFunctionName) { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $bSetAction = '1' === (string) $this->getParamValue('SetAction', '0'); $aUids = \ProjectSeven\Base\Utils::ExplodeIntUids((string) $this->getParamValue('Uids', '')); if (0 === strlen(trim($sFolderFullNameRaw)) || !is_array($aUids) || 0 === count($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->MessageFlag($oAccount, $sFolderFullNameRaw, $aUids, $sFlagName, $bSetAction ? \EMailMessageStoreAction::Add : \EMailMessageStoreAction::Remove); return $this->TrueResponse($oAccount, $sFunctionName); } /** * @return array */ public function AjaxMessageSetFlagged() { return $this->ajaxMessageSetFlag(\MailSo\Imap\Enumerations\MessageFlag::FLAGGED, 'MessageSetFlagged'); } /** * @return array */ public function AjaxMessageSetSeen() { return $this->ajaxMessageSetFlag(\MailSo\Imap\Enumerations\MessageFlag::SEEN, 'MessageSetSeen'); } /** * @return array */ public function AjaxMessageSetAllSeen() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $bSetAction = '1' === (string) $this->getParamValue('SetAction', '0'); if (0 === strlen(trim($sFolderFullNameRaw))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiMail->MessageFlag($oAccount, $sFolderFullNameRaw, array('1'), \MailSo\Imap\Enumerations\MessageFlag::SEEN, $bSetAction ? \EMailMessageStoreAction::Add : \EMailMessageStoreAction::Remove, true); return $this->TrueResponse($oAccount, 'MessageSetAllSeen'); } /** * @return array */ public function AjaxQuota() { $oAccount = $this->getAccountFromParam(); return $this->DefaultResponse($oAccount, 'Quota', $this->oApiMail->Quota($oAccount)); } /** * @return bool */ public function AjaxPdfFromHtml() { $oAccount = $this->getAccountFromParam(); if ($oAccount) { $sSubject = (string) $this->getParamValue('Subject', ''); $sHtml = (string) $this->getParamValue('Html', ''); $sFileName = $sSubject.'.pdf'; $sMimeType = 'application/pdf'; $sSavedName = 'pdf-'.$oAccount->IdAccount.'-'.md5($sFileName.microtime(true)).'.pdf'; include_once PSEVEN_APP_ROOT_PATH.'libraries/other/CssToInlineStyles.php'; $oCssToInlineStyles = new \TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($sHtml); $oCssToInlineStyles->setEncoding('utf-8'); $oCssToInlineStyles->setUseInlineStylesBlock(true); $sExec = \CApi::DataPath().'/system/wkhtmltopdf/linux/wkhtmltopdf'; if (!file_exists($sExec)) { $sExec = \CApi::DataPath().'/system/wkhtmltopdf/win/wkhtmltopdf.exe'; if (!file_exists($sExec)) { $sExec = ''; } } if (0 < strlen($sExec)) { $oSnappy = new \Knp\Snappy\Pdf($sExec); $oSnappy->setOption('quiet', true); $oSnappy->setOption('disable-javascript', true); $oSnappy->generateFromHtml($oCssToInlineStyles->convert(), $this->ApiFileCache()->GenerateFullFilePath($oAccount, $sSavedName), array(), true); return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Name' => $sFileName, 'TempName' => $sSavedName, 'MimeType' => $sMimeType, 'Size' => (int) $this->ApiFileCache()->FileSize($oAccount, $sSavedName), 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $sFileName, 'TempName' => $sSavedName )) )); } } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxEmailSafety() { $sEmail = (string) $this->getParamValue('Email', ''); if (0 === strlen(trim($sEmail))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $this->oApiUsers->SetSafetySender($oAccount->IdUser, $sEmail); return $this->DefaultResponse($oAccount, 'EmailSafety', true); } /** * @return array */ public function AjaxMessage() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $sUid = trim((string) $this->getParamValue('Uid', '')); $sRfc822SubMimeIndex = trim((string) $this->getParamValue('Rfc822MimeIndex', '')); $iUid = 0 < strlen($sUid) && is_numeric($sUid) ? (int) $sUid : 0; if (0 === strlen(trim($sFolderFullNameRaw)) || 0 >= $iUid) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $oMessage = $this->oApiMail->Message($oAccount, $sFolderFullNameRaw, $iUid, $sRfc822SubMimeIndex, true, true, 600000); if (!($oMessage instanceof \CApiMailMessage)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotGetMessage); } return $this->DefaultResponse($oAccount, 'Message', $oMessage); } /** * @return array */ public function AjaxMessages() { $sFolderFullNameRaw = (string) $this->getParamValue('Folder', ''); $aUids = $this->getParamValue('Uids', null); if (0 === strlen(trim($sFolderFullNameRaw)) || !is_array($aUids) || 0 === count($aUids)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->getAccountFromParam(); $aList = array(); foreach ($aUids as $iUid) { if (is_numeric($iUid)) { $oMessage = $this->oApiMail->Message($oAccount, $sFolderFullNameRaw, (int) $iUid, '', true, true, 600000); if ($oMessage instanceof \CApiMailMessage) { $aList[] = $oMessage; } unset($oMessage); } } return $this->DefaultResponse($oAccount, 'Messages', $aList); } /** * @return array */ public function AjaxLoginLanguageUpdate() { $bResult = false; $sLanguage = (string) $this->getParamValue('Language', ''); if (!empty($sLanguage)) { $oApiIntegrator = \CApi::Manager('integrator'); if ($oApiIntegrator) { $oApiIntegrator->SetLoginLanguage($sLanguage); $bResult = true; } } return $this->DefaultResponse(null, __FUNCTION__, $bResult); } /** * @return array */ public function AjaxAccountSignature() { $oAccount = $this->getAccountFromParam(); return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Type' => $oAccount->SignatureType, 'Options' => $oAccount->SignatureOptions, 'Signature' => $oAccount->Signature )); } /** * @return array */ public function AjaxUpdateAccountSignature() { $oAccount = $this->getAccountFromParam(); $oAccount->Signature = (string) $this->oHttp->GetPost('Signature', $oAccount->Signature); $oAccount->SignatureType = (string) $this->oHttp->GetPost('Type', $oAccount->SignatureType); $oAccount->SignatureOptions = (string) $this->oHttp->GetPost('Options', $oAccount->SignatureOptions); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->UpdateAccount($oAccount)); } /** * @return array */ public function AjaxAccountDelete() { $bResult = false; $oAccount = $this->getDefaultAccountFromParam(); $iAccountIDToDelete = (int) $this->oHttp->GetPost('AccountIDToDelete', 0); if (0 < $iAccountIDToDelete) { $oAccountToDelete = null; if ($oAccount->IdAccount === $iAccountIDToDelete) { $oAccountToDelete = $oAccount; } else { $oAccountToDelete = $this->oApiUsers->GetAccountById($iAccountIDToDelete); } if ($oAccountToDelete instanceof \CAccount && $oAccountToDelete->IdUser === $oAccount->IdUser && !$oAccountToDelete->IsInternal && ((0 < $oAccount->IdDomain && $oAccount->Domain->AllowUsersChangeEmailSettings) || !$oAccount->IsDefaultAccount || 0 === $oAccount->IdDomain || -1 === $oAccount->IdDomain) ) { $bResult = $this->oApiUsers->DeleteAccount($oAccountToDelete); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } /** * @param bool $bIsUpdate * @param \CAccount $oAccount */ private function populateAccountFromHttpPost($bIsUpdate, &$oAccount) { if ($bIsUpdate && $oAccount->IsDefaultAccount && !$oAccount->Domain->AllowUsersChangeEmailSettings) { $oAccount->FriendlyName = (string) $this->oHttp->GetPost('FriendlyName', $oAccount->FriendlyName); } else { $oAccount->FriendlyName = (string) $this->oHttp->GetPost('FriendlyName', $oAccount->FriendlyName); if (!$oAccount->IsInternal) { $oAccount->IncomingMailPort = (int) $this->oHttp->GetPost('IncomingMailPort'); $oAccount->OutgoingMailPort = (int) $this->oHttp->GetPost('OutgoingMailPort'); $oAccount->OutgoingMailAuth = ('2' === (string) $this->oHttp->GetPost('OutgoingMailAuth', '2')) ? \ESMTPAuthType::AuthCurrentUser : \ESMTPAuthType::NoAuth; $oAccount->IncomingMailServer = (string) $this->oHttp->GetPost('IncomingMailServer', ''); $oAccount->IncomingMailLogin = (string) $this->oHttp->GetPost('IncomingMailLogin', ''); $oAccount->OutgoingMailServer = (string) $this->oHttp->GetPost('OutgoingMailServer', ''); $sIncomingMailPassword = (string) $this->oHttp->GetPost('IncomingMailPassword', ''); $sIncomingMailPassword = trim($sIncomingMailPassword); if (API_DUMMY !== $sIncomingMailPassword && !empty($sIncomingMailPassword)) { $oAccount->IncomingMailPassword = $sIncomingMailPassword; } if (!$bIsUpdate) { $oAccount->IncomingMailProtocol = \EMailProtocol::IMAP4; $oAccount->OutgoingMailLogin = (string) $this->oHttp->GetPost('OutgoingMailLogin', ''); $sOutgoingMailPassword = (string) $this->oHttp->GetPost('OutgoingMailPassword', ''); if (API_DUMMY !== $sOutgoingMailPassword) { $oAccount->OutgoingMailPassword = $sOutgoingMailPassword; } } } if (!$bIsUpdate) { $oAccount->Email = (string) $this->oHttp->GetPost('Email', ''); } } } /** * @return array */ public function AjaxUpdateAccountPassword() { $bResult = false; $oAccount = $this->getAccountFromParam(); $sCurrentIncomingMailPassword = (string) $this->oHttp->GetPost('CurrentIncomingMailPassword', ''); $sNewIncomingMailPassword = (string) $this->oHttp->GetPost('NewIncomingMailPassword', ''); if ($oAccount->IsEnabledExtension(\CAccount::ChangePasswordExtension) && 0 < strlen($sNewIncomingMailPassword) && $sCurrentIncomingMailPassword === $oAccount->IncomingMailPassword) { $oAccount->PreviousMailPassword = $oAccount->IncomingMailPassword; $oAccount->IncomingMailPassword = $sNewIncomingMailPassword; try { $bResult = $this->oApiUsers->UpdateAccount($oAccount); } catch (\Exception $oException) { if ($oException && $oException instanceof \CApiErrorCodes && \CApiErrorCodes::UserManager_AccountOldPasswordNotCorrect === $oException->getCode()) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccountOldPasswordNotCorrect, $oException); } throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotChangePassword, $oException); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } /** * @return array */ public function AjaxAccountCreate() { $mResult = false; $oNewAccount = null; $oAccount = $this->getDefaultAccountFromParam(); $oApiDomains = \CApi::Manager('domains'); $oDomain = $oApiDomains->GetDefaultDomain(); if ($oDomain) { $oNewAccount = new \CAccount($oDomain); $oNewAccount->IdUser = $oAccount->IdUser; $oNewAccount->IsDefaultAccount = false; $this->populateAccountFromHttpPost(false, $oNewAccount); // TODO $oNewAccount->IncomingMailUseSSL = in_array($oNewAccount->IncomingMailPort, array(993, 995)); $oNewAccount->OutgoingMailUseSSL = in_array($oNewAccount->OutgoingMailPort, array(465)); if ($this->oApiUsers->CreateAccount($oNewAccount)) { $mResult = true; } else { $iClientErrorCode = \ProjectSeven\Notifications::CanNotCreateAccount; $oException = $this->oApiUsers->GetLastException(); if ($oException) { switch ($oException->getCode()) { case \Errs::WebMailManager_AccountDisabled: case \Errs::UserManager_AccountAuthenticationFailed: case \Errs::WebMailManager_AccountAuthentication: case \Errs::WebMailManager_NewUserRegistrationDisabled: case \Errs::WebMailManager_AccountWebmailDisabled: $iClientErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::UserManager_AccountConnectToMailServerFailed: case \Errs::WebMailManager_AccountConnectToMailServerFailed: $iClientErrorCode = \ProjectSeven\Notifications::MailServerError; break; case \Errs::UserManager_LicenseKeyInvalid: case \Errs::UserManager_AccountCreateUserLimitReached: case \Errs::UserManager_LicenseKeyIsOutdated: $iClientErrorCode = \ProjectSeven\Notifications::LicenseProblem; break; case \Errs::Db_ExceptionError: $iClientErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } return $this->FalseResponse($oAccount, __FUNCTION__, $iClientErrorCode); } } if ($mResult && $oNewAccount) { $aExtensions = $oAccount->GetExtensions(); $mResult = array( 'IdAccount' => $oNewAccount->IdAccount, 'Extensions' => $aExtensions ); } else { $mResult = false; } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxAccountSettings() { $oAccount = $this->getAccountFromParam(); $aResult = array(); $aResult['IsLinked'] = 0 < $oAccount->IdDomain; $aResult['IsInternal'] = (bool) $oAccount->IsInternal; $aResult['IsDefault'] = (bool) $oAccount->IsDefaultAccount; $aResult['FriendlyName'] = $oAccount->FriendlyName; $aResult['Email'] = $oAccount->Email; $aResult['IncomingMailServer'] = $oAccount->IncomingMailServer; $aResult['IncomingMailPort'] = $oAccount->IncomingMailPort; $aResult['IncomingMailLogin'] = $oAccount->IncomingMailLogin; $aResult['OutgoingMailServer'] = $oAccount->OutgoingMailServer; $aResult['OutgoingMailPort'] = $oAccount->OutgoingMailPort; $aResult['OutgoingMailLogin'] = $oAccount->OutgoingMailLogin; $aResult['OutgoingMailAuth'] = $oAccount->OutgoingMailAuth; $aResult['Extensions'] = array(); // extensions if ($oAccount->IsEnabledExtension(\CAccount::IgnoreSubscribeStatus) && !$oAccount->IsEnabledExtension(\CAccount::DisableManageSubscribe)) { $oAccount->EnableExtension(\CAccount::DisableManageSubscribe); } $aExtensions = $oAccount->GetExtensions(); foreach ($aExtensions as $sExtensionName) { if ($oAccount->IsEnabledExtension($sExtensionName)) { $aResult['Extensions'][] = $sExtensionName; } } return $this->DefaultResponse($oAccount, __FUNCTION__, $aResult); } /** * @return array */ public function AjaxAppData() { $oApiIntegratorManager = \CApi::Manager('integrator'); return $this->DefaultResponse(null, __FUNCTION__, $oApiIntegratorManager ? $oApiIntegratorManager->AppData() : false); } /** * @return array */ public function AjaxSetMobile() { $oApiIntegratorManager = \CApi::Manager('integrator'); return $this->DefaultResponse(null, __FUNCTION__, $oApiIntegratorManager ? $oApiIntegratorManager->SetMobile('1' === (string) $this->getParamValue('Mobile', '0')) : false); } /** * @return array */ public function AjaxSyncSettings() { $oAccount = $this->getDefaultAccountFromParam(); $aResult = array( 'Mobile' => $this->mobileSyncSettings($oAccount), 'Outlook' => $this->outlookSyncSettings($oAccount) ); return $this->DefaultResponse($oAccount, 'SyncSettings', $aResult); } /** * @return array */ public function AjaxUpdateAccountSettings() { $oAccount = $this->getAccountFromParam(); $this->populateAccountFromHttpPost(true, $oAccount); return $this->DefaultResponse($oAccount, 'UpdateAccountSettings', $this->oApiUsers->UpdateAccount($oAccount)); } /** * @return array */ public function AjaxUpdateUserSettings() { $oAccount = $this->getAccountFromParam(); $iMailsPerPage = (int) $this->oHttp->GetPost('MailsPerPage', $oAccount->User->MailsPerPage); if ($iMailsPerPage < 1) { $iMailsPerPage = 1; } $iContactsPerPage = (int) $this->oHttp->GetPost('ContactsPerPage', $oAccount->User->ContactsPerPage); if ($iContactsPerPage < 1) { $iContactsPerPage = 1; } $iAutoCheckMailInterval = (int) $this->oHttp->GetPost('AutoCheckMailInterval', $oAccount->User->AutoCheckMailInterval); if (!in_array($iAutoCheckMailInterval, array(0, 1, 3, 5, 10, 15, 20, 30))) { $iAutoCheckMailInterval = 0; } $iLayout = (int) $this->oHttp->GetPost('Layout', $oAccount->User->Layout); $iDefaultEditor = (int) $this->oHttp->GetPost('DefaultEditor', $oAccount->User->DefaultEditor); $bUseThreads = '1' === (string) $this->oHttp->GetPost('UseThreads', $oAccount->User->UseThreads ? '1' : '0'); $bSaveRepliedMessagesToCurrentFolder = '1' === (string) $this->oHttp->GetPost('SaveRepliedMessagesToCurrentFolder', $oAccount->User->SaveRepliedMessagesToCurrentFolder ? '1' : '0'); $bDesktopNotifications = '1' === (string) $this->oHttp->GetPost('DesktopNotifications', $oAccount->User->DesktopNotifications ? '1' : '0'); $bAllowChangeInputDirection = '1' === (string) $this->oHttp->GetPost('AllowChangeInputDirection', $oAccount->User->AllowChangeInputDirection ? '1' : '0'); $bFilesEnable = '1' === (string) $this->oHttp->GetPost('FilesEnable', $oAccount->User->FilesEnable ? '1' : '0'); $sTheme = (string) $this->oHttp->GetPost('DefaultTheme', $oAccount->User->DefaultSkin); // $sTheme = $this->validateTheme($sTheme); $sLang = (string) $this->oHttp->GetPost('DefaultLanguage', $oAccount->User->DefaultLanguage); // $sLang = $this->validateLang($sLang); $sDateFormat = (string) $this->oHttp->GetPost('DefaultDateFormat', $oAccount->User->DefaultDateFormat); $iTimeFormat = (int) $this->oHttp->GetPost('DefaultTimeFormat', $oAccount->User->DefaultTimeFormat); $oAccount->User->MailsPerPage = $iMailsPerPage; $oAccount->User->ContactsPerPage = $iContactsPerPage; $oAccount->User->Layout = $iLayout; $oAccount->User->DefaultSkin = $sTheme; $oAccount->User->DefaultEditor = $iDefaultEditor; $oAccount->User->DefaultLanguage = $sLang; $oAccount->User->DefaultDateFormat = $sDateFormat; $oAccount->User->DefaultTimeFormat = $iTimeFormat; $oAccount->User->AutoCheckMailInterval = $iAutoCheckMailInterval; $oAccount->User->UseThreads = $bUseThreads; $oAccount->User->SaveRepliedMessagesToCurrentFolder = $bSaveRepliedMessagesToCurrentFolder; $oAccount->User->DesktopNotifications = $bDesktopNotifications; $oAccount->User->AllowChangeInputDirection = $bAllowChangeInputDirection; $oAccount->User->EnableOpenPgp = '1' === (string) $this->oHttp->GetPost('EnableOpenPgp', $oAccount->User->EnableOpenPgp ? '1' : '0'); $oAccount->User->AllowAutosaveInDrafts = '1' === (string) $this->oHttp->GetPost('AllowAutosaveInDrafts', $oAccount->User->AllowAutosaveInDrafts ? '1' : '0'); $oAccount->User->AutosignOutgoingEmails = '1' === (string) $this->oHttp->GetPost('AutosignOutgoingEmails', $oAccount->User->AutosignOutgoingEmails ? '1' : '0'); $oAccount->User->FilesEnable = $bFilesEnable; // calendar $oCalUser = $this->oApiUsers->GetOrCreateCalUserByUserId($oAccount->IdUser); if ($oCalUser) { $oCalUser->ShowWeekEnds = (bool) $this->oHttp->GetPost('ShowWeekEnds', $oCalUser->ShowWeekEnds); $oCalUser->ShowWorkDay = (bool) $this->oHttp->GetPost('ShowWorkDay', $oCalUser->ShowWorkDay); $oCalUser->WorkDayStarts = (int) $this->oHttp->GetPost('WorkDayStarts', $oCalUser->WorkDayStarts); $oCalUser->WorkDayEnds = (int) $this->oHttp->GetPost('WorkDayEnds', $oCalUser->WorkDayEnds); $oCalUser->WeekStartsOn = (int) $this->oHttp->GetPost('WeekStartsOn', $oCalUser->WeekStartsOn); $oCalUser->DefaultTab = (int) $this->oHttp->GetPost('DefaultTab', $oCalUser->DefaultTab); } return $this->DefaultResponse($oAccount, 'UpdateUserSettings', $this->oApiUsers->UpdateAccount($oAccount) && $oCalUser && $this->oApiUsers->UpdateCalUser($oCalUser)); } /** * @return array */ public function AjaxUpdateHelpdeskUserSettings() { $oAccount = $this->getAccountFromParam(); $oAccount->User->AllowHelpdeskNotifications = (bool) $this->oHttp->GetPost('AllowHelpdeskNotifications', $oAccount->User->AllowHelpdeskNotifications); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->UpdateAccount($oAccount)); } /** * @return array */ public function AjaxLogin() { $sEmail = trim((string) $this->getParamValue('Email', '')); $sIncLogin = (string) $this->getParamValue('IncLogin', ''); $sIncPassword = (string) $this->getParamValue('IncPassword', ''); $sLanguage = (string) $this->getParamValue('Language', ''); $bSignMe = '1' === (string) $this->getParamValue('SignMe', '0'); try { \CApi::Plugin()->RunHook('webmail-login-custom-data', array($this->getParamValue('CustomRequestData', null))); } catch (\Exception $oException) { \CApi::LogEvent(\EEvents::LoginFailed, $sEmail); throw $oException; } $oSettings =& \CApi::GetSettings(); $sAtDomain = trim($oSettings->GetConf('WebMail/LoginAtDomainValue')); if (\ELoginFormType::Login === (int) $oSettings->GetConf('WebMail/LoginFormType') && 0 < strlen($sAtDomain)) { $sEmail = \api_Utils::GetAccountNameFromEmail($sIncLogin).'@'.$sAtDomain; $sIncLogin = $sEmail; } if (0 === strlen($sIncPassword) || 0 === strlen($sEmail.$sIncLogin)) { \CApi::LogEvent(\EEvents::LoginFailed, $sEmail); throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } try { if (0 === strlen($sLanguage)) { $sLanguage = $this->oApiIntegrator->GetLoginLanguage(); } $oAccount = $this->oApiIntegrator->LoginToAccount( $sEmail, $sIncPassword, $sIncLogin, $sLanguage ); } catch (\Exception $oException) { $iErrorCode = \ProjectSeven\Notifications::UnknownError; if ($oException instanceof \CApiManagerException) { switch ($oException->getCode()) { case \Errs::WebMailManager_AccountDisabled: case \Errs::WebMailManager_AccountWebmailDisabled: $iErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::UserManager_AccountAuthenticationFailed: case \Errs::WebMailManager_AccountAuthentication: case \Errs::WebMailManager_NewUserRegistrationDisabled: case \Errs::WebMailManager_AccountCreateOnLogin: case \Errs::Mail_AccountAuthentication: case \Errs::Mail_AccountLoginFailed: $iErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::UserManager_AccountConnectToMailServerFailed: case \Errs::WebMailManager_AccountConnectToMailServerFailed: case \Errs::Mail_AccountConnectToMailServerFailed: $iErrorCode = \ProjectSeven\Notifications::MailServerError; break; case \Errs::UserManager_LicenseKeyInvalid: case \Errs::UserManager_AccountCreateUserLimitReached: case \Errs::UserManager_LicenseKeyIsOutdated: case \Errs::TenantsManager_AccountCreateUserLimitReached: $iErrorCode = \ProjectSeven\Notifications::LicenseProblem; break; case \Errs::Db_ExceptionError: $iErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } \CApi::LogEvent(\EEvents::LoginFailed, $sEmail); throw new \ProjectSeven\Exceptions\ClientException($iErrorCode, $oException, $oException instanceof \CApiBaseException ? $oException->GetPreviousMessage() : ($oException ? $oException->getMessage() : '')); } if ($oAccount instanceof \CAccount) { \CApi::LogEvent(\EEvents::LoginSuccess, $oAccount); $this->oApiIntegrator->SetAccountAsLoggedIn($oAccount, $bSignMe); return $this->TrueResponse($oAccount, __FUNCTION__); } \CApi::LogEvent(\EEvents::LoginFailed, $oAccount); throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError); } /** * @return array */ public function AjaxRegisterAccount() { $sName = trim((string) $this->getParamValue('Name', '')); $sEmail = trim((string) $this->getParamValue('Email', '')); $sPassword = trim((string) $this->getParamValue('Password', '')); $sQuestion = trim((string) $this->getParamValue('Question', '')); $sAnswer = trim((string) $this->getParamValue('Answer', '')); \CApi::Plugin()->RunHook('webmail-register-custom-data', array($this->getParamValue('CustomRequestData', null))); $oSettings =& \CApi::GetSettings(); if (!$oSettings || !$oSettings->GetConf('Common/AllowRegistration')) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } if (0 === strlen($sPassword) || 0 === strlen($sEmail) || 0 === strlen($sQuestion) || 0 === strlen($sAnswer)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->oApiUsers->GetAccountOnLogin($sEmail); if ($oAccount instanceof \CAccount) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); // TODO } try { $oAccount = $this->oApiWebMail->CreateAccountProcess($sEmail, $sPassword, '', array( 'FriendlyName' => $sName, 'Question1' => $sQuestion, 'Answer1' => $sAnswer ), true); if ($oAccount instanceof \CAccount) { \CApi::Plugin()->RunHook('api-integrator-login-success-post-create-account-call', array(&$oAccount)); } else { $oException = $this->oApiWebMail->GetLastException(); \CApi::Plugin()->RunHook('api-integrator-login-error-post-create-account-call', array(&$oException)); throw (is_object($oException)) ? $oException : new \CApiManagerException(Errs::WebMailManager_AccountCreateOnLogin); } } catch (\Exception $oException) { $iErrorCode = \ProjectSeven\Notifications::UnknownError; if ($oException instanceof \CApiManagerException) { switch ($oException->getCode()) { case \Errs::WebMailManager_AccountDisabled: case \Errs::WebMailManager_AccountWebmailDisabled: $iErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::UserManager_AccountAuthenticationFailed: case \Errs::WebMailManager_AccountAuthentication: case \Errs::WebMailManager_NewUserRegistrationDisabled: case \Errs::WebMailManager_AccountCreateOnLogin: case \Errs::Mail_AccountAuthentication: case \Errs::Mail_AccountLoginFailed: $iErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::UserManager_AccountConnectToMailServerFailed: case \Errs::WebMailManager_AccountConnectToMailServerFailed: case \Errs::Mail_AccountConnectToMailServerFailed: $iErrorCode = \ProjectSeven\Notifications::MailServerError; break; case \Errs::UserManager_LicenseKeyInvalid: case \Errs::UserManager_AccountCreateUserLimitReached: case \Errs::UserManager_LicenseKeyIsOutdated: case \Errs::TenantsManager_AccountCreateUserLimitReached: $iErrorCode = \ProjectSeven\Notifications::LicenseProblem; break; case \Errs::Db_ExceptionError: $iErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } throw new \ProjectSeven\Exceptions\ClientException($iErrorCode, $oException, $oException instanceof \CApiBaseException ? $oException->GetPreviousMessage() : ($oException ? $oException->getMessage() : '')); } if ($oAccount instanceof \CAccount) { $this->oApiIntegrator->SetAccountAsLoggedIn($oAccount); return $this->TrueResponse($oAccount, __FUNCTION__); } throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError); } /** * @return array */ public function AjaxGetForgotAccountQuestion() { $sEmail = trim((string) $this->getParamValue('Email', '')); \CApi::Plugin()->RunHook('webmail-forgot-custom-data', array($this->getParamValue('CustomRequestData', null))); $oSettings =& \CApi::GetSettings(); if (!$oSettings || !$oSettings->GetConf('Common/AllowPasswordReset') || 0 === strlen($sEmail)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->oApiUsers->GetAccountOnLogin($sEmail); if (!($oAccount instanceof \CAccount) || !$oAccount->IsInternal) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); // TODO } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Email' => $oAccount->Email, 'Question' => $oAccount->User->Question1 )); } /** * @return array */ public function AjaxValidateForgotAccountQuestion() { $sEmail = trim((string) $this->getParamValue('Email', '')); $sQuestion = trim((string) $this->getParamValue('Question', '')); $sAnswer = trim((string) $this->getParamValue('Answer', '')); $oSettings =& \CApi::GetSettings(); if (!$oSettings || !$oSettings->GetConf('Common/AllowPasswordReset') || 0 === strlen($sEmail) || 0 === strlen($sAnswer) || 0 === strlen($sQuestion)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->oApiUsers->GetAccountOnLogin($sEmail); if (!($oAccount instanceof \CAccount) || !$oAccount->IsInternal) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); // TODO } return $this->DefaultResponse($oAccount, __FUNCTION__, $oAccount->User->Question1 === $sQuestion && $oAccount->User->Answer1 === $sAnswer); } /** * @return array */ public function AjaxChangeForgotAccountPassword() { $sEmail = trim((string) $this->getParamValue('Email', '')); $sQuestion = trim((string) $this->getParamValue('Question', '')); $sAnswer = trim((string) $this->getParamValue('Answer', '')); $sPassword = trim((string) $this->getParamValue('Password', '')); $oSettings =& \CApi::GetSettings(); if (!$oSettings || !$oSettings->GetConf('Common/AllowPasswordReset') || 0 === strlen($sEmail) || 0 === strlen($sAnswer) || 0 === strlen($sQuestion) || 0 === strlen($sPassword)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oAccount = $this->oApiUsers->GetAccountOnLogin($sEmail); if (!($oAccount instanceof \CAccount) || !$oAccount->IsInternal || $oAccount->User->Question1 !== $sQuestion || $oAccount->User->Answer1 !== $sAnswer) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); // TODO } $oAccount->PreviousMailPassword = $oAccount->IncomingMailPassword; $oAccount->IncomingMailPassword = $sPassword; return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->UpdateAccount($oAccount)); } /** * @return array */ public function AjaxFilesUploadByLink() { $oAccount = $this->getDefaultAccountFromParam(); $oTenant = null; if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } $mResult = false; $rFile = null; if ($oTenant) { $aLinks = $this->getParamValue('Links', null); $bLinksAsIds = $this->getParamValue('LinksAsIds', false); $sAccessToken = $this->getParamValue('AccessToken', ''); if (is_array($aLinks) && 0 < count($aLinks)) { $mResult = array(); foreach ($aLinks as $sLink) { $bFileSaveResult = false; $sTempName = ''; $aData = array( 'Type' => 0, 'Size' => 0, 'Path' => '', 'Name' => '', 'Hash' => '' ); if ($sLink) { $iLinkType = \api_Utils::GetLinkType($sLink); if (\EFileStorageLinkType::GoogleDrive === $iLinkType || $bLinksAsIds) { $oInfo = \api_Utils::GetGoogleDriveFileInfo($sLink, $oTenant->SocialGoogleApiKey, $sAccessToken, $bLinksAsIds); if ($oInfo) { $aData['Name'] = isset($oInfo->title) ? $oInfo->title : $aData['Name']; $aData['Size'] = isset($oInfo->fileSize) ? $oInfo->fileSize : $aData['Size']; $aData['Hash'] = isset($oInfo->id) ? $oInfo->id : $aData['Hash']; if (isset($oInfo->downloadUrl)) { $sTempName = md5('Files/Tmp/'.$aData['Type'].$aData['Path'].$aData['Name'].microtime(true).rand(1000, 9999)); $rFile = $this->ApiFileCache()->GetTempFile($oAccount, $sTempName, 'wb+'); $aHeaders = array(); if ($sAccessToken) { $aHeaders = array( 'Authorization: Bearer '. $sAccessToken ); } $sContentType = ''; $iCode = 0; $bFileSaveResult = $this->oHttp->SaveUrlToFile($oInfo->downloadUrl, $rFile, '', $sContentType, $iCode, null, 10, '', '', $aHeaders); if (is_resource($rFile)) { @fclose($rFile); } $aData['Size'] = $this->ApiFileCache()->FileSize($oAccount, $sTempName); } } } else/* if (\EFileStorageLinkType::DropBox === $iLinkType)*/ { $aData['Name'] = urldecode(basename($sLink)); $aData['Hash'] = $sLink; $sTempName = md5('Files/Tmp/'.$aData['Type'].$aData['Path'].$aData['Name'].microtime(true).rand(1000, 9999)); $rFile = $this->ApiFileCache()->GetTempFile($oAccount, $sTempName, 'wb+'); $bFileSaveResult = $this->oHttp->SaveUrlToFile($sLink, $rFile); if (is_resource($rFile)) { @fclose($rFile); } $aData['Size'] = $this->ApiFileCache()->FileSize($oAccount, $sTempName); } } if ($bFileSaveResult) { $mResult[] = array( 'Name' => $aData['Name'], 'TempName' => $sTempName, 'Size' => (int) $aData['Size'], 'MimeType' => '', 'Hash' => $aData['Hash'], 'MimeType' => \MailSo\Base\Utils::MimeContentType($aData['Name']), 'NewHash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $aData['Name'], 'TempName' => $sTempName )) ); } } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxFilesUpload() { $oAccount = $this->getDefaultAccountFromParam(); $oTenant = null; if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } $mResult = false; if ($this->oApiCapability->IsFilesSupported($oAccount) && $oTenant) { $aFiles = $this->getParamValue('Hashes', null); if (is_array($aFiles) && 0 < count($aFiles)) { $mResult = array(); foreach ($aFiles as $sHash) { $aData = \CApi::DecodeKeyValues($sHash); if (\is_array($aData) && 0 < \count($aData)) { $oFileInfo = $this->oApiFilestorage->GetFileInfo($oAccount, $aData['Type'], $aData['Path'], $aData['Name']); $rFile = null; if ($oFileInfo->IsLink) { if (\EFileStorageLinkType::GoogleDrive === $oFileInfo->LinkType) { $oInfo = \api_Utils::GetGoogleDriveFileInfo($oFileInfo->LinkUrl, $oTenant->SocialGoogleApiKey); $aData['Name'] = isset($oInfo->title) ? $oInfo->title : $aData['Name']; $aData['Size'] = isset($oInfo->fileSize) ? $oInfo->fileSize : $aData['Size']; if (isset($oInfo->downloadUrl)) { $rFile = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $this->oHttp->SaveUrlToFile($oInfo->downloadUrl, $rFile); rewind($rFile); } } else /*if (\EFileStorageLinkType::DropBox === (int)$aFileInfo['LinkType'])*/ { $rFile = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $aData['Name'] = basename($oFileInfo->LinkUrl); $aRemoteFileInfo = \api_Utils::GetRemoteFileInfo($oFileInfo->LinkUrl); $aData['Size'] = $aRemoteFileInfo['size']; $this->oHttp->SaveUrlToFile($oFileInfo->LinkUrl, $rFile); rewind($rFile); } } else { $rFile = $this->oApiFilestorage->GetFile($oAccount, $aData['Type'], $aData['Path'], $aData['Name']); } $sTempName = md5('Files/Tmp/'.$aData['Type'].$aData['Path'].$aData['Name'].microtime(true).rand(1000, 9999)); if (is_resource($rFile) && $this->ApiFileCache()->PutFile($oAccount, $sTempName, $rFile)) { $aItem = array( 'Name' => $oFileInfo->Name, 'TempName' => $sTempName, 'Size' => (int) $aData['Size'], 'Hash' => $sHash, 'MimeType' => '' ); $aItem['MimeType'] = \MailSo\Base\Utils::MimeContentType($aItem['Name']); $aItem['NewHash'] = \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $aItem['Name'], 'TempName' => $sTempName )); $mResult[] = $aItem; if (is_resource($rFile)) { @fclose($rFile); } } } } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxGetTwilioLogs() { $oAccount = $this->getAccountFromParam(); $oTenant = null; if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } if ($oTenant && $this->oApiCapability->IsTwilioSupported($oAccount) && $oTenant->IsTwilioSupported() && file_exists(PSEVEN_APP_ROOT_PATH.'libraries/Services/Twilio.php')) { try { include PSEVEN_APP_ROOT_PATH.'libraries/Services/Twilio.php'; $sStatus = (string) $this->getParamValue('Status', ''); $sStartTime = (string) $this->getParamValue('StartTime', ''); $sAccountSid = $oTenant->TwilioAccountSID; $sAuthToken = $oTenant->TwilioAuthToken; $sAppSid = $oTenant->TwilioAppSID; $bTwilioEnable = $oAccount->User->TwilioEnable; //$sTwilioPhoneNumber = $oTenant->TwilioPhoneNumber; $sUserPhoneNumber = $oAccount->User->TwilioNumber; $aResult = array(); $aNumbers = array(); $aNames = array(); //\CApi::Log('PPPPPPPPP'); //\CApi::Log($sUserPhoneNumber); $client = new \Services_Twilio($sAccountSid, $sAuthToken); //$sUserPhoneNumber = '7333'; if ($sUserPhoneNumber) { foreach ($client->account->calls->getIterator(0, 50, array ( "Status" => $sStatus, "StartTime>" => $sStartTime, "From" => "client:".$sUserPhoneNumber, )) as $call) { //$aResult[$call->status]["outgoing"][] = array $aResult[] = array ( "Status" => $call->status, "To" => $call->to, "ToFormatted" => $call->to_formatted, "From" => $call->from, "FromFormatted" => $call->from_formatted, "StartTime" => $call->start_time, "EndTime" => $call->end_time, "Duration" => $call->duration, "Price" => $call->price, "PriceUnit" => $call->price_unit, "Direction" => $call->direction, "UserDirection" => "outgoing", "UserStatus" => $this->oApiTwilio->getCallSimpleStatus($call->status, "outgoing"), "UserPhone" => $sUserPhoneNumber, "UserName" => '', "UserDisplayName" => '', "UserEmail" => '' ); $aNumbers[] = $call->to_formatted; } foreach ($client->account->calls->getIterator(0, 50, array ( "Status" => $sStatus, "StartTime>" => $sStartTime, "To" => "client:".$sUserPhoneNumber )) as $call) { //$aResult[$call->status]["incoming"][] = array $aResult[] = array ( "Status" => $call->status, "To" => $call->to, "ToFormatted" => $call->to_formatted, "From" => $call->from, "FromFormatted" => $call->from_formatted, "StartTime" => $call->start_time, "EndTime" => $call->end_time, "Duration" => $call->duration, "Price" => $call->price, "PriceUnit" => $call->price_unit, "Direction" => $call->direction, "UserDirection" => "incoming", "UserStatus" => $this->oApiTwilio->getCallSimpleStatus($call->status, "incoming"), "UserPhone" => $sUserPhoneNumber, "UserName" => '', "UserDisplayName" => '', "UserEmail" => '' ); $aNumbers[] = $call->from_formatted; } $oApiVoiceManager = \CApi::Manager('voice'); if ($aResult && $oApiVoiceManager) { $aNames = $oApiVoiceManager->GetNamesByCallersNumbers($oAccount, $aNumbers); foreach ($aResult as &$aCall) { if ($aCall['UserDirection'] === 'outgoing') { $aCall['UserDisplayName'] = isset($aNames[$aCall['ToFormatted']]) ? $aNames[$aCall['ToFormatted']] : ''; } else if ($aCall['UserDirection'] === 'incoming') { $aCall['UserDisplayName'] = isset($aNames[$aCall['FromFormatted']]) ? $aNames[$aCall['FromFormatted']] : ''; } } } } } catch (\Exception $oE) { \CApi::LogException($oE); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::VoiceNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $aResult); } /** * @return array */ public function AjaxGetTwilioToken() { $oAccount = $this->getAccountFromParam(); $oTenant = null; if ($this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } $mToken = false; if ($oTenant && $this->oApiCapability->IsTwilioSupported($oAccount) && $oTenant->IsTwilioSupported() && file_exists(PSEVEN_APP_ROOT_PATH.'libraries/Services/Twilio.php')) { try { include PSEVEN_APP_ROOT_PATH.'libraries/Services/Twilio.php'; // put your Twilio API credentials here $sAccountSid = $oTenant->TwilioAccountSID; $sAuthToken = $oTenant->TwilioAuthToken; // put your Twilio Application Sid here $sAppSid = $oTenant->TwilioAppSID; /*\CApi::Log('twilio_calls_log'); $client = new \Services_Twilio($sAccountSid, $sAuthToken); foreach ($client->account->calls->getIterator(0, 50, array( //"From" => "client:7333", "StartTime>" => "2014-01-01" )) as $call ) { \CApi::Log('status-'.$call->status.' to-'.$call->to .' from-'.$call->from); } \CApi::Log('twilio_calls_log_end');*/ //$sTwilioPhoneNumber = $oTenant->TwilioPhoneNumber; $sUserPhoneNumber = $oAccount->User->TwilioNumber; $oCapability = new \Services_Twilio_Capability($sAccountSid, $sAuthToken); $oCapability->allowClientOutgoing($sAppSid); \CApi::Log('twilio_debug'); \CApi::Log('twilio_account_sid-'.$sAccountSid); \CApi::Log('twilio_auth_token-'.$sAuthToken); \CApi::Log('twilio_app_sid-'.$sAppSid); \CApi::Log('twilio_number-'.$sUserPhoneNumber); \CApi::Log('twilio_enable-'.$oAccount->User->TwilioEnable); \CApi::Log('twilio_default_number-'.($oAccount->User->TwilioDefaultNumber ? 'true' : 'false')); \CApi::Log('twilio_debug_end'); //$oCapability->allowClientIncoming('TwilioAftId_'.$oAccount->User->TwilioNumber); $oCapability->allowClientIncoming($sUserPhoneNumber ? $sUserPhoneNumber : 'default'); //$oCapability->allowClientIncoming('TwilioAftId_'.$oAccount->IdTenant.'_'.$oAccount->User->TwilioNumber); $mToken = $oCapability->generateToken(86400000); //Token lifetime set to 24hr (default 1hr) } catch (\Exception $oE) { \CApi::LogException($oE); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::VoiceNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mToken); } /** * @return array */ public function AjaxContactVCardUpload() { $oAccount = $this->getDefaultAccountFromParam(); $mResult = false; if ($this->oApiCapability->IsContactsSupported($oAccount)) { $bGlobal = '1' === (string) $this->getParamValue('Global', '0'); $sContactId = (string) $this->getParamValue('ContactId', ''); if ($bGlobal) { if (!$this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } } else { if (!$this->oApiCapability->IsPersonalContactsSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } } $oApiContacts = $this->ApiContacts(); $oApiGContacts = $this->ApiGContacts(); $oContact = $bGlobal ? $oApiGContacts->GetContactById($oAccount, $sContactId) : $oApiContacts->GetContactById($oAccount->IdUser, $sContactId); if ($oContact) { $sTempName = md5('VCARD/'.$oAccount->IdUser.'/'.$oContact->IdContact.'/'.($bGlobal ? '1' : '0').'/'); $oVCard = new \Sabre\VObject\Component\VCard(); \CApiContactsVCardHelper::UpdateVCardFromContact($oContact, $oVCard); $sData = $oVCard->serialize(); if ($this->ApiFileCache()->Put($oAccount, $sTempName, $sData)) { $mResult = array( 'Name' => 'contact-'.$oContact->IdContact.'.vcf', 'TempName' => $sTempName, 'MimeType' => 'text/vcard', 'Size' => strlen($sData), 'Hash' => '' ); $mResult['MimeType'] = \MailSo\Base\Utils::MimeContentType($mResult['Name']); $mResult['Hash'] = \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $mResult['Name'], 'TempName' => $sTempName )); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } } throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotGetContact); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxContact() { $oContact = false; $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $sContactId = (string) $this->getParamValue('ContactId', ''); $bSharedToAll = '1' === (string) $this->getParamValue('SharedToAll', '0'); $iTenantId = $bSharedToAll ? $oAccount->IdTenant : null; $oContact = $oApiContacts->GetContactById($oAccount->IdUser, $sContactId, false, $iTenantId); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oContact); } /** * @return array */ public function AjaxContactsPhoneNames() { $oAccount = $this->getDefaultAccountFromParam(); $aPhones = $this->getParamValue('Phones', null); if ($oAccount && is_array($aPhones) && 0 < count($aPhones)) { $oApiVoiceManager = CApi::Manager('voice'); if ($oApiVoiceManager) { return $this->DefaultResponse($oAccount, __FUNCTION__, $oApiVoiceManager->GetNamesByCallersNumbers($oAccount, $aPhones)); } } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxContactByEmail() { $oContact = false; $oAccount = $this->getDefaultAccountFromParam(); $sEmail = (string) $this->getParamValue('Email', ''); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); if ($oApiContacts) { $oContact = $oApiContacts->GetContactByEmail($oAccount->IdUser, $sEmail); } } if (!$oContact && $this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $oApiGContacts = $this->ApiGContacts(); if ($oApiGContacts) { $oContact = $oApiGContacts->GetContactByEmail($oAccount, $sEmail); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $oContact); } /** * @return array */ public function AjaxContactByEmails() { $aResult = array(); $oAccount = $this->getDefaultAccountFromParam(); $sEmails = (string) $this->getParamValue('Emails', ''); $aEmails = explode(',', $sEmails); if (0 < count($aEmails)) { $oApiContacts = $this->ApiContacts(); $oApiGContacts = $this->ApiGContacts(); $bPab = $oApiContacts && $this->oApiCapability->IsPersonalContactsSupported($oAccount); $bGab = $oApiGContacts && $this->oApiCapability->IsGlobalContactsSupported($oAccount, true); foreach ($sEmails as $sEmail) { $oContact = false; $sEmail = trim($sEmail); if ($bPab) { $oContact = $oApiContacts->GetContactByEmail($oAccount->IdUser, $sEmail); } if (!$oContact && $bGab) { $oContact = $oApiGContacts->GetContactByEmail($oAccount, $sEmail); } if ($oContact) { $aResult[$sEmail] = $oContact; } } } return $this->DefaultResponse($oAccount, __FUNCTION__, $aResult); } /** * @return array */ public function AjaxAddContactsToGroup() { $oAccount = $this->getAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $sGroupId = (string) $this->getParamValue('GroupId', ''); $aContactsId = $this->getParamValue('ContactsId', null); if (!is_array($aContactsId)) { return $this->DefaultResponse($oAccount, __FUNCTION__, false); } $oApiContacts = $this->ApiContacts(); $oGroup = $oApiContacts->GetGroupById($oAccount->IdUser, $sGroupId); if ($oGroup) { $aLocalContacts = array(); $aGlobalContacts = array(); foreach ($aContactsId as $aItem) { if (is_array($aItem) && 2 === count($aItem)) { if ('1' === $aItem[1]) { $aGlobalContacts[] = $aItem[0]; } else { $aLocalContacts[] = $aItem[0]; } } } $bRes1 = true; if (0 < count($aGlobalContacts)) { $bRes1 = false; if (!$this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } $bRes1 = $oApiContacts->AddGlobalContactsToGroup($oAccount, $oGroup, $aGlobalContacts); } $bRes2 = true; if (0 < count($aLocalContacts)) { $bRes2 = $oApiContacts->AddContactsToGroup($oGroup, $aLocalContacts); } return $this->DefaultResponse($oAccount, __FUNCTION__, $bRes1 && $bRes2); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, false); } /** * @return array */ public function AjaxRemoveContactsFromGroup() { $oAccount = $this->getAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount) || $this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $oApiContacts = $this->ApiContacts(); $sGroupId = (string) $this->getParamValue('GroupId', ''); $aContactsId = explode(',', $this->getParamValue('ContactsId', '')); $aContactsId = array_map('trim', $aContactsId); $oGroup = $oApiContacts->GetGroupById($oAccount->IdUser, $sGroupId); if ($oGroup) { return $this->DefaultResponse($oAccount, __FUNCTION__, $oApiContacts->RemoveContactsFromGroup($oGroup, $aContactsId)); } return $this->DefaultResponse($oAccount, __FUNCTION__, false); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, false); } /** * @return array */ public function AjaxDoServerInitializations() { $oAccount = $this->getAccountFromParam(); $bResult = false; $oApiIntegrator = \CApi::Manager('integrator'); if ($oAccount && $oApiIntegrator) { $oApiIntegrator->ResetCookies(); } $oApiHelpdesk = \CApi::Manager('helpdesk'); if ($this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $oApiContacts = $this->ApiContacts(); if ($oApiContacts && method_exists($oApiContacts, 'SynchronizeExternalContacts')) { $bResult = $oApiContacts->SynchronizeExternalContacts($oAccount); } } $oCacher = \CApi::Cacher(); $bDoGC = false; $bDoHepdeskClear = false; if ($oCacher && $oCacher->IsInited()) { $iTime = $oCacher->GetTimer('Cache/ClearFileCache'); if (0 === $iTime || $iTime + 60 * 60 * 24 < time()) { if ($oCacher->SetTimer('Cache/ClearFileCache')) { $bDoGC = true; } } if ($oApiHelpdesk) { $iTime = $oCacher->GetTimer('Cache/ClearHelpdeskUsers'); if (0 === $iTime || $iTime + 60 * 60 * 24 < time()) { if ($oCacher->SetTimer('Cache/ClearHelpdeskUsers')) { $bDoHepdeskClear = true; } } } } if ($bDoGC) { \CApi::Log('GC: FileCache / Start'); $this->ApiFileCache()->GC(); $oCacher->GC(); \CApi::Log('GC: FileCache / End'); } if ($bDoHepdeskClear && $oApiHelpdesk) { \CApi::Log('GC: Clear Unregistred Users'); $oApiHelpdesk->ClearUnregistredUsers(); \CApi::Log('GC: Clear Online'); $oApiHelpdesk->ClearAllOnline(); } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } public function AjaxUpdateAttendeeStatus() { $oAccount = $this->getAccountFromParam(); $mResult = false; $sTempFile = (string) $this->getParamValue('File', ''); $sFromEmail = (string) $this->getParamValue('FromEmail', ''); if (empty($sTempFile) || empty($sFromEmail)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } if ($this->oApiCapability->IsCalendarAppointmentsSupported($oAccount)) { $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $sData = $oApiFileCache->Get($oAccount, $sTempFile); if (!empty($sData)) { $oCalendarApi = \CApi::Manager('calendar'); if ($oCalendarApi) { $mResult = $oCalendarApi->ProcessICS($oAccount, $sData, $sFromEmail, true); } } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxAppointmentAction() { $oAccount = $this->getAccountFromParam(); $oDefaultAccount = $this->getDefaultAccountFromParam(); $mResult = false; $sCalendarId = (string) $this->getParamValue('CalendarId', ''); $sEventId = (string) $this->getParamValue('EventId', ''); $sTempFile = (string) $this->getParamValue('File', ''); $sAction = (string) $this->getParamValue('AppointmentAction', ''); $sAttendee = (string) $this->getParamValue('Attendee', ''); if (empty($sAction) || empty($sCalendarId)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } if ($this->oApiCapability->IsCalendarAppointmentsSupported($oDefaultAccount)) { $sData = ''; if (!empty($sEventId)) { $aEventData = $this->oApiCalendar->GetEvent($oDefaultAccount, $sCalendarId, $sEventId); if (isset($aEventData) && isset($aEventData['vcal']) && $aEventData['vcal'] instanceof \Sabre\VObject\Component\VCalendar) { $oVCal = $aEventData['vcal']; $oVCal->METHOD = 'REQUEST'; $sData = $oVCal->serialize(); } } else if (!empty($sTempFile)) { $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $sData = $oApiFileCache->Get($oAccount, $sTempFile); } if (!empty($sData)) { $oCalendarApi = \CApi::Manager('calendar'); if ($oCalendarApi) { $mProcessResult = $oCalendarApi->AppointmentAction($oDefaultAccount, $sAttendee, $sAction, $sCalendarId, $sData); if ($mProcessResult) { $mResult = array( 'Uid' => $mProcessResult ); } } } } return $this->DefaultResponse($oDefaultAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxSaveIcs() { $oAccount = $this->getAccountFromParam(); $mResult = false; if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sCalendarId = (string) $this->getParamValue('CalendarId', ''); $sTempFile = (string) $this->getParamValue('File', ''); if (empty($sCalendarId) || empty($sTempFile)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $sData = $oApiFileCache->Get($oAccount, $sTempFile); if (!empty($sData)) { $oCalendarApi = \CApi::Manager('calendar'); if ($oCalendarApi) { $mCreateEventResult = $oCalendarApi->CreateEventFromRaw($oAccount, $sCalendarId, null, $sData); if ($mCreateEventResult) { $mResult = array( 'Uid' => (string) $mCreateEventResult ); } } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxSaveVcf() { $oAccount = $this->getAccountFromParam(); $mResult = false; if (!$this->oApiCapability->IsPersonalContactsSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } $sTempFile = (string) $this->getParamValue('File', ''); if (empty($sTempFile)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oApiFileCache = /* @var $oApiFileCache \CApiFilecacheManager */ \CApi::Manager('filecache'); $sData = $oApiFileCache->Get($oAccount, $sTempFile); if (!empty($sData)) { $oContactsApi = $this->ApiContacts(); if ($oContactsApi) { $oContact = new \CContact(); $oContact->InitFromVCardStr($oAccount->IdUser, $sData); if ($oContactsApi->CreateContact($oContact)) { $mResult = array( 'Uid' => $oContact->IdContact ); } } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxGlobalContact() { $oContact = false; $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $oApiGContacts = $this->ApiGContacts(); $sContactId = (string) $this->getParamValue('ContactId', ''); $oContact = $oApiGContacts->GetContactById($oAccount, $sContactId); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oContact); } /** * @return array */ public function AjaxGroup() { $oGroup = false; $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $sGroupId = (string) $this->getParamValue('GroupId', ''); $oGroup = $oApiContacts->GetGroupById($oAccount->IdUser, $sGroupId); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oGroup); } /** * @return array */ public function AjaxGroupFullList() { $oAccount = $this->getDefaultAccountFromParam(); $aList = false; if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $aList = $oApiContacts->GetGroupItems($oAccount->IdUser, \EContactSortField::Name, \ESortOrder::ASC, 0, 999); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $aList); } /** * @return array */ public function AjaxGroupEvents() { $aEvents = array(); $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $sGroupId = (string) $this->getParamValue('GroupId', ''); $aEvents = $oApiContacts->GetGroupEvents($oAccount->IdUser, $sGroupId); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, $aEvents); } private function populateSortParams(&$iSortField, &$iSortOrder) { $sSortField = (string) $this->getParamValue('SortField', 'Email'); $iSortOrder = '1' === (string) $this->getParamValue('SortOrder', '0') ? \ESortOrder::ASC : \ESortOrder::DESC; switch (strtolower($sSortField)) { case 'email': $iSortField = \EContactSortField::EMail; break; case 'name': $iSortField = \EContactSortField::Name; break; case 'frequency': $iSortField = \EContactSortField::Frequency; break; } } /** * @return array */ public function AjaxContactSuggestions() { $oAccount = $this->getDefaultAccountFromParam(); $oApiContacts = $this->ApiContacts(); $sSearch = (string) $this->getParamValue('Search', ''); $bGlobalOnly = '1' === (string) $this->getParamValue('GlobalOnly', '0'); $bPhoneOnly = '1' === (string) $this->getParamValue('PhoneOnly', '0'); $aList = array(); $iSharedTenantId = null; if ($this->oApiCapability->IsSharedContactsSupported($oAccount) && !$bPhoneOnly) { $iSharedTenantId = $oAccount->IdTenant; } if ($this->oApiCapability->IsContactsSupported($oAccount)) { $aContacts = $oApiContacts ? $oApiContacts->GetSuggestItems($oAccount, $sSearch, \CApi::GetConf('webmail.suggest-contacts-limit', 20), $bGlobalOnly, $bPhoneOnly, $iSharedTenantId) : null; if (is_array($aContacts)) { $aList = $aContacts; } } $aCounts = array(0, 0); \CApi::Plugin()->RunHook('webmail.change-suggest-list', array($oAccount, $sSearch, &$aList, &$aCounts)); return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Search' => $sSearch, 'List' => $aList )); } /** * @return array */ public function AjaxContactList() { $oAccount = $this->getDefaultAccountFromParam(); $oApiContacts = $this->ApiContacts(); $iOffset = (int) $this->getParamValue('Offset', 0); $iLimit = (int) $this->getParamValue('Limit', 20); $sGroupId = (string) $this->getParamValue('GroupId', ''); $sSearch = (string) $this->getParamValue('Search', ''); $sFirstCharacter = (string) $this->getParamValue('FirstCharacter', ''); $bSharedToAll = '1' === (string) $this->getParamValue('SharedToAll', '0'); $bAll = '1' === (string) $this->getParamValue('All', '0'); $iSortField = \EContactSortField::Name; $iSortOrder = \ESortOrder::ASC; $iTenantId = $bSharedToAll ? $oAccount->IdTenant : null; $this->populateSortParams($iSortField, $iSortOrder); $bAllowContactsSharing = $this->oApiCapability->IsSharedContactsSupported($oAccount); if ($bAll && !$bAllowContactsSharing && !$this->oApiCapability->IsGlobalContactsSupported($oAccount)) { $bAll = false; } $iCount = 0; if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $iGroupId = ('' === $sGroupId) ? 0 : (int) $sGroupId; if ($bAllowContactsSharing && 0 < $iGroupId) { $iTenantId = $oAccount->IdTenant; } $iCount = $oApiContacts->GetContactItemsCount( $oAccount->IdUser, $sSearch, $sFirstCharacter, $iGroupId, $iTenantId, $bAll); $aList = array(); if (0 < $iCount) { $aContacts = $oApiContacts->GetContactItems( $oAccount->IdUser, $iSortField, $iSortOrder, $iOffset, $iLimit, $sSearch, $sFirstCharacter, $sGroupId, $iTenantId, $bAll); if (is_array($aContacts)) { $aList = $aContacts; } } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'ContactCount' => $iCount, 'GroupId' => $sGroupId, 'Search' => $sSearch, 'FirstCharacter' => $sFirstCharacter, 'All' => $bAll, 'List' => $aList )); } /** * @return array */ public function AjaxGlobalContactList() { $oAccount = $this->getDefaultAccountFromParam(); $oApiGContacts = $this->ApiGContacts(); $iOffset = (int) $this->getParamValue('Offset', 0); $iLimit = (int) $this->getParamValue('Limit', 20); $sSearch = (string) $this->getParamValue('Search', ''); $iSortField = \EContactSortField::EMail; $iSortOrder = \ESortOrder::ASC; $this->populateSortParams($iSortField, $iSortOrder); $iCount = 0; $aList = array(); if ($this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $iCount = $oApiGContacts->GetContactItemsCount($oAccount, $sSearch); if (0 < $iCount) { $aContacts = $oApiGContacts->GetContactItems( $oAccount, $iSortField, $iSortOrder, $iOffset, $iLimit, $sSearch); $aList = (is_array($aContacts)) ? $aContacts : array(); } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'ContactCount' => $iCount, 'Search' => $sSearch, 'List' => $aList )); } /** * @return array */ public function AjaxGetIdentities() { $oAccount = $this->getAccountFromParam(); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->GetIdentitiesByUserID($oAccount)); } /** * @return array */ public function AjaxCreateIdentity() { $oAccount = $this->getAccountFromParam(); $sEmail = trim((string) $this->getParamValue('Email', '')); if (empty($sEmail)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oIdentity = new \CIdentity(); $oIdentity->IdAccount = $oAccount->IdAccount; $oIdentity->IdUser = $oAccount->IdUser; $oIdentity->Enabled = '1' === (string) $this->getParamValue('Enabled', '1'); $oIdentity->Email = $sEmail; $oIdentity->Signature = (string) $this->getParamValue('Signature', ''); $oIdentity->UseSignature = '1' === (string) $this->getParamValue('UseSignature', '0'); $oIdentity->FriendlyName = (string) $this->getParamValue('FriendlyName', ''); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->CreateIdentity($oIdentity)); } /** * @return array */ public function AjaxUpdateIdentity() { $oAccount = $this->getAccountFromParam(); $iIdentityId = (int) $this->getParamValue('IdIdentity', 0); $oIdentity = $this->oApiUsers->GetIdentity($iIdentityId); if (0 >= $iIdentityId || !$oIdentity || $oIdentity->IdUser !== $oAccount->IdUser || $oIdentity->IdAccount !== $oAccount->IdAccount) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oIdentity->Enabled = '1' === (string) $this->getParamValue('Enabled', '1'); $oIdentity->Email = trim((string) $this->getParamValue('Email', '')); $oIdentity->Signature = (string) $this->getParamValue('Signature', ''); $oIdentity->UseSignature = '1' === (string) $this->getParamValue('UseSignature', '0'); $oIdentity->FriendlyName = (string) $this->getParamValue('FriendlyName', ''); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->UpdateIdentity($oIdentity)); } /** * @return array */ public function AjaxDeleteIdentity() { $oAccount = $this->getAccountFromParam(); $iIdentityId = (int) $this->getParamValue('IdIdentity', 0); $oIdentity = $this->oApiUsers->GetIdentity($iIdentityId); if (0 >= $iIdentityId || !$oIdentity || $oIdentity->IdUser !== $oAccount->IdUser || $oIdentity->IdAccount !== $oAccount->IdAccount) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } return $this->DefaultResponse($oAccount, __FUNCTION__, $this->oApiUsers->DeleteIdentity($iIdentityId)); } /** * @return array */ public function AjaxGetAutoresponder() { $mResult = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::AutoresponderExtension)) { $aAutoResponderValue = $this->ApiSieve()->GetAutoresponder($oAccount); if (isset($aAutoResponderValue['subject'], $aAutoResponderValue['body'], $aAutoResponderValue['enabled'])) { $mResult = array( 'Enable' => (bool) $aAutoResponderValue['enabled'], 'Subject' => (string) $aAutoResponderValue['subject'], 'Message' => (string) $aAutoResponderValue['body'] ); } } return $this->DefaultResponse($oAccount, 'GetAutoresponder', $mResult); } /** * @return array */ public function AjaxUpdateAutoresponder() { $bIsDemo = false; $mResult = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::AutoresponderExtension)) { \CApi::Plugin()->RunHook('plugin-is-demo-account', array(&$oAccount, &$bIsDemo)); if (!$bIsDemo) { $bIsEnabled = '1' === $this->getParamValue('Enable', '0'); $sSubject = (string) $this->getParamValue('Subject', ''); $sMessage = (string) $this->getParamValue('Message', ''); $mResult = $this->ApiSieve()->SetAutoresponder($oAccount, $sSubject, $sMessage, $bIsEnabled); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::DemoAccount); } } return $this->DefaultResponse($oAccount, 'UpdateAutoresponder', $mResult); } /** * @return array */ public function AjaxGetForward() { $mResult = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::ForwardExtension)) { $aForwardValue = /* @var $aForwardValue array */ $this->ApiSieve()->GetForward($oAccount); if (isset($aForwardValue['email'], $aForwardValue['enabled'])) { $mResult = array( 'Enable' => (bool) $aForwardValue['enabled'], 'Email' => (string) $aForwardValue['email'] ); } } return $this->DefaultResponse($oAccount, 'GetForward', $mResult); } /** * @return array */ public function AjaxUpdateForward() { $mResult = false; $bIsDemo = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::ForwardExtension)) { \CApi::Plugin()->RunHook('plugin-is-demo-account', array(&$oAccount, &$bIsDemo)); if (!$bIsDemo) { $bIsEnabled = '1' === $this->getParamValue('Enable', '0'); $sForwardEmail = (string) $this->getParamValue('Email', ''); $mResult = $this->ApiSieve()->SetForward($oAccount, $sForwardEmail, $bIsEnabled); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::DemoAccount); } } return $this->DefaultResponse($oAccount, 'UpdateForward', $mResult); } /** * @return array */ public function AjaxGetSieveFilters() { $mResult = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::SieveFiltersExtension)) { $mResult = $this->ApiSieve()->GetSieveFilters($oAccount); } return $this->DefaultResponse($oAccount, 'GetSieveFilters', $mResult); } /** * @return array */ public function AjaxUpdateSieveFilters() { $mResult = false; $oAccount = $this->getAccountFromParam(); if ($oAccount && $oAccount->IsEnabledExtension(\CAccount::SieveFiltersExtension)) { $aFilters = $this->getParamValue('Filters', array()); $aFilters = is_array($aFilters) ? $aFilters : array(); $mResult = array(); foreach ($aFilters as $aItem) { $oFilter = new \CFilter($oAccount); $oFilter->Enable = '1' === (string) (isset($aItem['Enable']) ? $aItem['Enable'] : '1'); $oFilter->Field = (int) (isset($aItem['Field']) ? $aItem['Field'] : \EFilterFiels::From); $oFilter->Filter = (string) (isset($aItem['Filter']) ? $aItem['Filter'] : ''); $oFilter->Condition = (int) (isset($aItem['Condition']) ? $aItem['Condition'] : \EFilterCondition::ContainSubstring); $oFilter->Action = (int) (isset($aItem['Action']) ? $aItem['Action'] : \EFilterAction::DoNothing); $oFilter->FolderFullName = (string) (isset($aItem['FolderFullName']) ? $aItem['FolderFullName'] : ''); $mResult[] = $oFilter; } $mResult = $this->ApiSieve()->UpdateSieveFilters($oAccount, $mResult); } return $this->DefaultResponse($oAccount, 'UpdateSieveFilters', $mResult); } /** * @param string $sParamName * @param mixed $oObject * * @return void */ private function paramToObject($sParamName, &$oObject, $sType = 'string') { switch ($sType) { default: case 'string': $oObject->{$sParamName} = (string) $this->getParamValue($sParamName, $oObject->{$sParamName}); break; case 'int': $oObject->{$sParamName} = (int) $this->getParamValue($sParamName, $oObject->{$sParamName}); break; case 'bool': $oObject->{$sParamName} = '1' === (string) $this->getParamValue($sParamName, $oObject->{$sParamName} ? '1' : '0'); break; } } /** * @param mixed $oObject * @param array $aParamsNames */ private function paramsStrToObjectHelper(&$oObject, $aParamsNames) { foreach ($aParamsNames as $sName) { $this->paramToObject($sName, $oObject); } } /** * @param \CContact $oContact * @param bool $bItsMe = false */ private function populateContactObject(&$oContact, $bItsMe = false) { $iPrimaryEmail = $oContact->PrimaryEmail; switch (strtolower($this->getParamValue('PrimaryEmail', ''))) { case 'home': case 'personal': $iPrimaryEmail = \EPrimaryEmailType::Home; break; case 'business': $iPrimaryEmail = \EPrimaryEmailType::Business; break; case 'other': $iPrimaryEmail = \EPrimaryEmailType::Other; break; } $oContact->PrimaryEmail = $iPrimaryEmail; $this->paramToObject('UseFriendlyName', $oContact, 'bool'); $this->paramsStrToObjectHelper($oContact, array( 'Title', 'FullName', 'FirstName', 'LastName', 'NickName', 'Skype', 'Facebook', 'HomeEmail', 'HomeStreet', 'HomeCity', 'HomeState', 'HomeZip', 'HomeCountry', 'HomeFax', 'HomePhone', 'HomeMobile', 'HomeWeb', 'BusinessCompany', 'BusinessJobTitle', 'BusinessDepartment', 'BusinessOffice', 'BusinessStreet', 'BusinessCity', 'BusinessState', 'BusinessZip', 'BusinessCountry', 'BusinessFax','BusinessPhone', 'BusinessMobile', 'BusinessWeb', 'OtherEmail', 'Notes', 'ETag' )); if (!$bItsMe) { $this->paramToObject('BusinessEmail', $oContact); } $this->paramToObject('BirthdayDay', $oContact, 'int'); $this->paramToObject('BirthdayMonth', $oContact, 'int'); $this->paramToObject('BirthdayYear', $oContact, 'int'); $aGroupsIds = $this->getParamValue('GroupsIds'); $aGroupsIds = is_array($aGroupsIds) ? array_map('trim', $aGroupsIds) : array(); $oContact->GroupsIds = array_unique($aGroupsIds); } /** * @param \CGroup $oGroup */ private function populateGroupObject(&$oGroup) { $this->paramToObject('IsOrganization', $oGroup, 'bool'); $this->paramsStrToObjectHelper($oGroup, array( 'Name', 'Email', 'Country', 'City', 'Company', 'Fax', 'Phone', 'State', 'Street', 'Web', 'Zip' )); } /** * @return array */ public function AjaxContactCreate() { $oAccount = $this->getDefaultAccountFromParam(); $bSharedToAll = '1' === $this->getParamValue('SharedToAll', '0'); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $oContact = new \CContact(); $oContact->IdUser = $oAccount->IdUser; $oContact->IdTenant = $oAccount->IdTenant; $oContact->SharedToAll = $bSharedToAll; $this->populateContactObject($oContact); $oApiContacts->CreateContact($oContact); return $this->DefaultResponse($oAccount, __FUNCTION__, $oContact ? array( 'IdContact' => $oContact->IdContact ) : false); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxGroupCreate() { $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $oGroup = new \CGroup(); $oGroup->IdUser = $oAccount->IdUser; $this->populateGroupObject($oGroup); $oApiContacts->CreateGroup($oGroup); return $this->DefaultResponse($oAccount, __FUNCTION__, $oGroup ? array( 'IdGroup' => $oGroup->IdGroup ) : false); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxContactDelete() { $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $aContactsId = explode(',', $this->getParamValue('ContactsId', '')); $aContactsId = array_map('trim', $aContactsId); $bSharedToAll = '1' === (string) $this->getParamValue('SharedToAll', '0'); $iTenantId = $bSharedToAll ? $oAccount->IdTenant : null; return $this->DefaultResponse($oAccount, __FUNCTION__, $oApiContacts->DeleteContacts($oAccount->IdUser, $aContactsId, $iTenantId)); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxGroupDelete() { $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); $sGroupId = $this->getParamValue('GroupId', ''); return $this->DefaultResponse($oAccount, __FUNCTION__, $oApiContacts->DeleteGroup($oAccount->IdUser, $sGroupId)); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxContactUpdate() { $oAccount = $this->getDefaultAccountFromParam(); $bGlobal = '1' === $this->getParamValue('Global', '0'); $sContactId = $this->getParamValue('ContactId', ''); $bSharedToAll = '1' === $this->getParamValue('SharedToAll', '0'); $iTenantId = $bSharedToAll ? $oAccount->IdTenant : null; if ($bGlobal && $this->oApiCapability->IsGlobalContactsSupported($oAccount, true)) { $oApiContacts = $this->ApiGContacts(); } else if (!$bGlobal && $this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); } if ($oApiContacts) { $oContact = $oApiContacts->GetContactById($bGlobal ? $oAccount : $oAccount->IdUser, $sContactId, false, $iTenantId); if ($oContact) { $this->populateContactObject($oContact, $oContact->ItsMe); if ($oApiContacts->UpdateContact($oContact)) { return $this->TrueResponse($oAccount, __FUNCTION__); } else { switch ($oApiContacts->GetLastErrorCode()) { case \Errs::Sabre_PreconditionFailed: throw new \ProjectSeven\Exceptions\ClientException( \ProjectSeven\Notifications::ContactDataHasBeenModifiedByAnotherApplication); } } } } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxContactUpdateSharedToAll() { $oAccount = $this->getDefaultAccountFromParam(); $aContactsId = explode(',', $this->getParamValue('ContactsId', '')); $aContactsId = array_map('trim', $aContactsId); $bSharedToAll = '1' === $this->getParamValue('SharedToAll', '0'); $iTenantId = $bSharedToAll ? $oAccount->IdTenant : null; if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oApiContacts = $this->ApiContacts(); } if ($oApiContacts && $this->oApiCapability->IsSharedContactsSupported($oAccount)) { foreach ($aContactsId as $sContactId) { $oContact = $oApiContacts->GetContactById($oAccount->IdUser, $sContactId, false, $iTenantId); if ($oContact) { if ($oContact->SharedToAll) { $oApiContacts->UpdateContactUserId($oContact, $oAccount->IdUser); } $oContact->SharedToAll = !$oContact->SharedToAll; $oContact->IdUser = $oAccount->IdUser; $oContact->IdDomain = $oAccount->IdDomain; $oContact->IdTenant = $oAccount->IdTenant; if (!$oApiContacts->UpdateContact($oContact)) { switch ($oApiContacts->GetLastErrorCode()) { case \Errs::Sabre_PreconditionFailed: throw new \ProjectSeven\Exceptions\ClientException( \ProjectSeven\Notifications::ContactDataHasBeenModifiedByAnotherApplication); } } } } return $this->TrueResponse($oAccount, __FUNCTION__); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } /** * @return array */ public function AjaxGroupUpdate() { $oAccount = $this->getDefaultAccountFromParam(); $oApiContacts = $this->ApiContacts(); $sGroupId = $this->getParamValue('GroupId', ''); if ($this->oApiCapability->IsPersonalContactsSupported($oAccount)) { $oGroup = $oApiContacts->GetGroupById($oAccount->IdUser, $sGroupId); if ($oGroup) { $this->populateGroupObject($oGroup); if ($oApiContacts->UpdateGroup($oGroup)) { return $this->TrueResponse($oAccount, __FUNCTION__); } else { switch ($oApiContacts->GetLastErrorCode()) { case \Errs::Sabre_PreconditionFailed: throw new \ProjectSeven\Exceptions\ClientException( \ProjectSeven\Notifications::ContactDataHasBeenModifiedByAnotherApplication); } } } } else { throw new \ProjectSeven\Exceptions\ClientException( \ProjectSeven\Notifications::ContactsNotAllowed); } return $this->FalseResponse($oAccount, __FUNCTION__); } public function AjaxExternalFileStorages() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $oResult = array(); \CApi::Plugin()->RunHook('filestorage.get-external-storages', array($oAccount, &$oResult)); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFiles() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $sPath = $this->getParamValue('Path'); $iType = (int) $this->getParamValue('Type'); $sPattern = $this->getParamValue('Pattern'); $oResult = array( 'Items' => $this->oApiFilestorage->GetFiles($oAccount, $iType, $sPath, $sPattern), 'Quota' => $this->oApiFilestorage->GetQuota($oAccount) ); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesPub() { $oAccount = null; $oResult = array(); $oMin = \CApi::Manager('min'); $sHash = $this->getParamValue('Hash'); $sPath = $this->getParamValue('Path', ''); $mMin = $oMin->GetMinByHash($sHash); if (!empty($mMin['__hash__'])) { $oAccount = $this->oApiUsers->GetAccountById($mMin['Account']); if ($oAccount) { if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $mMin['Type']; $sPath = implode('/', array($mMin['Path'], $mMin['Name'])) . $sPath; $oResult['Items'] = $this->oApiFilestorage->GetFiles($oAccount, $iType, $sPath); $oResult['Quota'] = $this->oApiFilestorage->GetQuota($oAccount); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesQuota() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $oResult = array( 'Quota' => $this->oApiFilestorage->GetQuota($oAccount) ); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesFolderCreate() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $sPath = $this->getParamValue('Path'); $sFolderName = $this->getParamValue('FolderName'); $oResult = null; $oResult = $this->oApiFilestorage->CreateFolder($oAccount, $iType, $sPath, $sFolderName); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesLinkCreate() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $sPath = $this->getParamValue('Path'); $sLink = $this->getParamValue('Link'); $sName = $this->getParamValue('Name'); $oResult = $this->oApiFilestorage->CreateLink($oAccount, $iType, $sPath, $sLink, $sName); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesDelete() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $aItems = @json_decode($this->getParamValue('Items'), true); $oResult = false; foreach ($aItems as $oItem) { $oResult = $this->oApiFilestorage->Delete($oAccount, $iType, $oItem['Path'], $oItem['Name']); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesRename() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $sPath = $this->getParamValue('Path'); $sName = $this->getParamValue('Name'); $sNewName = $this->getParamValue('NewName'); $oResult = null; $sNewName = \trim(\MailSo\Base\Utils::ClearFileName($sNewName)); $sNewName = $this->oApiFilestorage->GetNonExistingFileName($oAccount, $iType, $sPath, $sNewName); $oResult = $this->oApiFilestorage->Rename($oAccount, $iType, $sPath, $sName, $sNewName); return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesCopy() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iFromType = (int) $this->getParamValue('FromType'); $iToType = (int) $this->getParamValue('ToType'); $sFromPath = $this->getParamValue('FromPath'); $sToPath = $this->getParamValue('ToPath'); $aItems = @json_decode($this->getParamValue('Files'), true); $oResult = null; foreach ($aItems as $aItem) { $sNewName = $this->oApiFilestorage->GetNonExistingFileName($oAccount, $iToType, $sToPath, $aItem['Name']); $oResult = $this->oApiFilestorage->Copy($oAccount, $iFromType, $iToType, $sFromPath, $sToPath, $aItem['Name'], $sNewName); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesMove() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iFromType = (int) $this->getParamValue('FromType'); $iToType = (int) $this->getParamValue('ToType'); $sFromPath = $this->getParamValue('FromPath'); $sToPath = $this->getParamValue('ToPath'); $aItems = @json_decode($this->getParamValue('Files'), true); $oResult = null; foreach ($aItems as $aItem) { $sNewName = $this->oApiFilestorage->GetNonExistingFileName($oAccount, $iToType, $sToPath, $aItem['Name']); $oResult = $this->oApiFilestorage->Move($oAccount, $iFromType, $iToType, $sFromPath, $sToPath, $aItem['Name'], $sNewName); } return $this->DefaultResponse($oAccount, __FUNCTION__, $oResult); } public function AjaxFilesCreatePublicLink() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $sPath = $this->getParamValue('Path'); $sName = $this->getParamValue('Name'); $sSize = $this->getParamValue('Size'); $bIsFolder = $this->getParamValue('IsFolder', '0') === '1' ? true : false; $mResult = $this->oApiFilestorage->CreatePublicLink($oAccount, $iType, $sPath, $sName, $sSize, $bIsFolder); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } public function AjaxFilesDeletePublicLink() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $iType = (int) $this->getParamValue('Type'); $sPath = $this->getParamValue('Path'); $sName = $this->getParamValue('Name'); $mResult = $this->oApiFilestorage->DeletePublicLink($oAccount, $iType, $sPath, $sName); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarList() { $mResult = false; $bIsPublic = (bool) $this->getParamValue('IsPublic'); $sPublicCalendarId = $this->getParamValue('PublicCalendarId'); $oAccount = null; if ($bIsPublic) { $oCalendar = $this->oApiCalendar->GetPublicCalendar($sPublicCalendarId); $mResult = array(); if ($oCalendar) { $aCalendar = $this->oApiCalendar->GetCalendarAsArray($oAccount, $oCalendar); $mResult = array($aCalendar); } } else { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $mResult = $this->oApiCalendar->GetCalendars($oAccount); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarCreate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sName = $this->getParamValue('Name'); $sDescription = $this->getParamValue('Description'); $sColor = $this->getParamValue('Color'); $mCalendarId = $this->oApiCalendar->CreateCalendar($oAccount, $sName, $sDescription, 0, $sColor); if ($mCalendarId) { $oCalendar = $this->oApiCalendar->GetCalendar($oAccount, $mCalendarId); if ($oCalendar) { $mResult = $this->oApiCalendar->GetCalendarAsArray($oAccount, $oCalendar); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarUpdate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sName = $this->getParamValue('Name'); $sDescription = $this->getParamValue('Description'); $sColor = $this->getParamValue('Color'); $sId = $this->getParamValue('Id'); $mResult = $this->oApiCalendar->UpdateCalendar($oAccount, $sId, $sName, $sDescription, 0, $sColor); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarUpdateColor() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sColor = $this->getParamValue('Color'); $sId = $this->getParamValue('Id'); $mResult = $this->oApiCalendar->UpdateCalendarColor($oAccount, $sId, $sColor); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarDelete() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); $sCalendarId = $this->getParamValue('Id'); $mResult = $this->oApiCalendar->DeleteCalendar($oAccount, $sCalendarId); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarShareUpdate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); $sCalendarId = $this->getParamValue('Id'); $bIsPublic = (bool) $this->getParamValue('IsPublic'); $aShares = @json_decode($this->getParamValue('Shares'), true); $bShareToAll = (bool) $this->getParamValue('ShareToAll', false); $iShareToAllAccess = (int) $this->getParamValue('ShareToAllAccess', \ECalendarPermission::Read); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } // Share calendar to all users $aShares[] = array( 'email' => $this->oApiCalendar->GetTenantUser($oAccount), 'access' => $bShareToAll ? $iShareToAllAccess : \ECalendarPermission::RemovePermission ); // Public calendar $aShares[] = array( 'email' => $this->oApiCalendar->GetPublicUser(), 'access' => $bIsPublic ? \ECalendarPermission::Read : \ECalendarPermission::RemovePermission ); $mResult = $this->oApiCalendar->UpdateCalendarShares($oAccount, $sCalendarId, $aShares); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxCalendarPublicUpdate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); $sCalendarId = $this->getParamValue('Id'); $bIsPublic = (bool) $this->getParamValue('IsPublic'); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $mResult = $this->oApiCalendar->PublicCalendar($oAccount, $sCalendarId, $bIsPublic); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventList() { $mResult = false; $oAccount = null; $aCalendarIds = @json_decode($this->getParamValue('CalendarIds'), true); $iStart = $this->getParamValue('Start'); $iEnd = $this->getParamValue('End'); $bIsPublic = (bool) $this->getParamValue('IsPublic'); $iTimezoneOffset = $this->getParamValue('TimezoneOffset'); $sTimezone = $this->getParamValue('Timezone'); if ($bIsPublic) { $oPublicAccount = $this->oApiCalendar->GetPublicAccount(); $oPublicAccount->User->DefaultTimeZone = $iTimezoneOffset; $oPublicAccount->User->ClientTimeZone = $sTimezone; $mResult = $this->oApiCalendar->GetEvents($oPublicAccount, $aCalendarIds, $iStart, $iEnd); } else { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $mResult = $this->oApiCalendar->GetEvents($oAccount, $aCalendarIds, $iStart, $iEnd); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventBase() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sCalendarId = $this->getParamValue('calendarId'); $sEventId = $this->getParamValue('uid'); $mResult = $this->oApiCalendar->GetBaseEvent($oAccount, $sCalendarId, $sEventId); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventCreate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $oEvent = new \CEvent(); $oEvent->IdCalendar = $this->getParamValue('newCalendarId'); $oEvent->Name = $this->getParamValue('subject'); $oEvent->Description = $this->getParamValue('description'); $oEvent->Location = $this->getParamValue('location'); $oEvent->Start = $this->getParamValue('startTS'); $oEvent->End = $this->getParamValue('endTS'); $oEvent->AllDay = (bool) $this->getParamValue('allDay'); $oEvent->Alarms = @json_decode($this->getParamValue('alarms'), true); $oEvent->Attendees = @json_decode($this->getParamValue('attendees'), true); $aRRule = @json_decode($this->getParamValue('rrule'), true); if ($aRRule) { $oRRule = new \CRRule($oAccount); $oRRule->Populate($aRRule); $oEvent->RRule = $oRRule; } $mResult = $this->oApiCalendar->CreateEvent($oAccount, $oEvent); if ($mResult) { $iStart = $this->getParamValue('selectStart'); $iEnd = $this->getParamValue('selectEnd'); $mResult = $this->oApiCalendar->GetExpandedEvent($oAccount, $oEvent->IdCalendar, $mResult, $iStart, $iEnd); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventUpdate() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sNewCalendarId = $this->getParamValue('newCalendarId'); $oEvent = new \CEvent(); $oEvent->IdCalendar = $this->getParamValue('calendarId'); $oEvent->Id = $this->getParamValue('uid'); $oEvent->Name = $this->getParamValue('subject'); $oEvent->Description = $this->getParamValue('description'); $oEvent->Location = $this->getParamValue('location'); $oEvent->Start = $this->getParamValue('startTS'); $oEvent->End = $this->getParamValue('endTS'); $oEvent->AllDay = (bool) $this->getParamValue('allDay'); $oEvent->Alarms = @json_decode($this->getParamValue('alarms'), true); $oEvent->Attendees = @json_decode($this->getParamValue('attendees'), true); $aRRule = @json_decode($this->getParamValue('rrule'), true); if ($aRRule) { $oRRule = new \CRRule($oAccount); $oRRule->Populate($aRRule); $oEvent->RRule = $oRRule; } $iAllEvents = (int) $this->getParamValue('allEvents'); $sRecurrenceId = $this->getParamValue('recurrenceId'); if ($iAllEvents && $iAllEvents === 1) { $mResult = $this->oApiCalendar->UpdateExclusion($oAccount, $oEvent, $sRecurrenceId); } else { $mResult = $this->oApiCalendar->UpdateEvent($oAccount, $oEvent); if ($mResult && $sNewCalendarId !== $oEvent->IdCalendar) { $mResult = $this->oApiCalendar->MoveEvent($oAccount, $oEvent->IdCalendar, $sNewCalendarId, $oEvent->Id); $oEvent->IdCalendar = $sNewCalendarId; } } if ($mResult) { $iStart = $this->getParamValue('selectStart'); $iEnd = $this->getParamValue('selectEnd'); $mResult = $this->oApiCalendar->GetExpandedEvent($oAccount, $oEvent->IdCalendar, $oEvent->Id, $iStart, $iEnd); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventUpdateAppointment() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsCalendarSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CalendarsNotAllowed); } $sCalendarId = $this->getParamValue('calendarId'); $sEventId = $this->getParamValue('uid'); $sAttendee = $this->getParamValue('attendee'); $iAction = (int)$this->getParamValue('actionAppointment'); $sAction = ''; if ($iAction === \EAttendeeStatus::Accepted) { $sAction = 'ACCEPTED'; } else if ($iAction === \EAttendeeStatus::Declined) { $sAction = 'DECLINED'; } else if ($iAction === \EAttendeeStatus::Tentative) { $sAction = 'TENTATIVE'; } $mResult = $this->oApiCalendar->UpdateAppointment($oAccount, $sCalendarId, $sEventId, $sAttendee, $sAction); return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxEventDelete() { $mResult = false; $oAccount = $this->getDefaultAccountFromParam(); $sCalendarId = $this->getParamValue('calendarId'); $sId = $this->getParamValue('uid'); $iAllEvents = (int) $this->getParamValue('allEvents'); if ($iAllEvents && $iAllEvents === 1) { $oEvent = new \CEvent(); $oEvent->IdCalendar = $sCalendarId; $oEvent->Id = $sId; $sRecurrenceId = $this->getParamValue('recurrenceId'); $mResult = $this->oApiCalendar->UpdateExclusion($oAccount, $oEvent, $sRecurrenceId, true); } else { $mResult = $this->oApiCalendar->DeleteEvent($oAccount, $sCalendarId, $sId); } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } /** * @return array */ public function AjaxLogout() { $oAccount = $this->getAccountFromParam(false); if ($oAccount && $oAccount->User && 0 < $oAccount->User->IdHelpdeskUser && $this->oApiCapability->IsHelpdeskSupported($oAccount)) { $this->oApiIntegrator->LogoutHelpdeskUser(); } $sLastErrorCode = $this->getParamValue('LastErrorCode'); if (0 < strlen($sLastErrorCode) && $this->oApiIntegrator && 0 < (int) $sLastErrorCode) { $this->oApiIntegrator->SetLastErrorCode((int) $sLastErrorCode); } \CApi::LogEvent(\EEvents::Logout, $oAccount); return $this->DefaultResponse($oAccount, 'Logout', $this->oApiIntegrator->LogoutAccount()); } /** * @param string $iError * * @return string */ public function convertUploadErrorToString($iError) { $sError = 'unknown'; switch ($iError) { case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: $sError = 'size'; break; } return $sError; } /** * @return bool */ private function rawFiles($bDownload = true, $bThumbnail = false) { $sRawKey = (string) $this->getParamValue('RawKey', ''); $aValues = \CApi::DecodeKeyValues($sRawKey); if ($bThumbnail) { $this->verifyCacheByKey($sRawKey); } $sHash = (string) $this->getParamValue('TenantHash', ''); $oMin = \CApi::Manager('min'); $mMin = $oMin->GetMinByHash($sHash); $oAccount = null; if (!empty($mMin['__hash__'])) { $oAccount = $this->oApiUsers->GetAccountById($mMin['Account']); } else { if (isset($aValues['Iframed'], $aValues['Time']) && $aValues['Iframed'] && $aValues['Time']) { $oAccount = $this->getAccountFromParam(true, !($aValues['Time'] > \ProjectSeven\Base\Utils::iframedTimestamp()) ); if (!$oAccount->IsDefaultAccount) { $iAccountId = $this->oApiUsers->GetDefaultAccountId($oAccount->IdUser); if (0 < $iAccountId) { $oAccount = $this->oApiUsers->GetAccountById($iAccountId); } else { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AuthError); } } } else { $oAccount = $this->getDefaultAccountFromParam(); } } $oTenant = null; if ($oAccount && $this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } if ($this->oApiCapability->IsFilesSupported($oAccount) && $oTenant && isset($aValues['Type'], $aValues['Path'], $aValues['Name'])) { $mResult = false; $sFileName = $aValues['Name']; $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $oFileInfo = $this->oApiFilestorage->GetFileInfo($oAccount, $aValues['Type'], $aValues['Path'], $aValues['Name']); if ($oFileInfo->IsLink) { $iLinkType = \api_Utils::GetLinkType($oFileInfo->LinkUrl); if (isset($iLinkType)) { if (\EFileStorageLinkType::GoogleDrive === $iLinkType) { $oInfo = \api_Utils::GetGoogleDriveFileInfo($oFileInfo->LinkUrl, $oTenant->SocialGoogleApiKey); $sFileName = isset($oInfo->title) ? $oInfo->title : $sFileName; $sContentType = \MailSo\Base\Utils::MimeContentType($sFileName); if (isset($oInfo->downloadUrl)) { $mResult = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $this->oHttp->SaveUrlToFile($oInfo->downloadUrl, $mResult); rewind($mResult); } } else/* if (\EFileStorageLinkType::DropBox === (int)$aFileInfo['LinkType'])*/ { if (\EFileStorageLinkType::DropBox === $iLinkType) { $oFileInfo->LinkUrl = str_replace('www.dropbox.com', 'dl.dropboxusercontent.com', $oFileInfo->LinkUrl); } $mResult = \MailSo\Base\ResourceRegistry::CreateMemoryResource(); $sFileName = basename($oFileInfo->LinkUrl); $sContentType = \MailSo\Base\Utils::MimeContentType($sFileName); $this->oHttp->SaveUrlToFile($oFileInfo->LinkUrl, $mResult); rewind($mResult); } } } else { $mResult = $this->oApiFilestorage->GetFile($oAccount, $aValues['Type'], $aValues['Path'], $aValues['Name']); } if (false !== $mResult) { if (is_resource($mResult)) { $sFileName = $this->clearFileName($oFileInfo->Name, $sContentType); $this->RawOutputHeaders($bDownload, $sContentType, $sFileName); if ($bThumbnail) { $this->cacheByKey($sRawKey); $this->thumbResource($oAccount, $mResult, $sFileName); } else { \MailSo\Base\Utils::FpassthruWithTimeLimitReset($mResult); } @fclose($mResult); } return true; } } return false; } /** * @return array */ public function RawFilesDownload() { return $this->rawFiles(true); } /** * @return array */ public function RawFilesThumbnail() { return $this->rawFiles(false, true); } /** * @return array */ public function RawFilesView() { return $this->rawFiles(false); } /** * @return array */ public function RawFilesPub() { return $this->rawFiles(true); } /** * @return array */ public function WindowPublicCalendar() { // $sRawKey = (string) $this->getParamValue('RawKey', ''); // $aValues = \CApi::DecodeKeyValues($sRawKey); // print_r($aValues); $sUrlRewriteBase = (string) \CApi::GetConf('labs.server-url-rewrite-base', ''); if (!empty($sUrlRewriteBase)) { $sUrlRewriteBase = '<base href="'.$sUrlRewriteBase.'" />'; } return array( 'Template' => 'templates/CalendarPub.html', '{{BaseUrl}}' => $sUrlRewriteBase ); } /** * @return array */ public function MinInfo() { $mData = $this->getParamValue('Result', false); var_dump($mData); return true; } /** * @return array */ public function MinShare() { $mData = $this->getParamValue('Result', false); if ($mData && isset($mData['__hash__'], $mData['Name'], $mData['Size'])) { $bUseUrlRewrite = (bool) \CApi::GetConf('labs.server-use-url-rewrite', false); $sUrl = '?/Min/Download/'; if ($bUseUrlRewrite) { $sUrl = '/download/'; } $sUrlRewriteBase = (string) \CApi::GetConf('labs.server-url-rewrite-base', ''); if (!empty($sUrlRewriteBase)) { $sUrlRewriteBase = '<base href="'.$sUrlRewriteBase.'" />'; } return array( 'Template' => 'templates/FilesPub.html', '{{Url}}' => $sUrl.$mData['__hash__'], '{{FileName}}' => $mData['Name'], '{{FileSize}}' => \api_Utils::GetFriendlySize($mData['Size']), '{{FileType}}' => \api_Utils::GetFileExtension($mData['Name']), '{{BaseUrl}}' => $sUrlRewriteBase ); } return false; } public function MinDownload() { $mData = $this->getParamValue('Result', false); if (isset($mData['AccountType']) && 'wm' !== $mData['AccountType']) { return true; } $oAccount = $this->oApiUsers->GetAccountById((int) $mData['Account']); $mResult = false; if ($oAccount && $this->oApiCapability->IsFilesSupported($oAccount)) { $mResult = $this->oApiFilestorage->GetSharedFile($oAccount, $mData['Type'], $mData['Path'], $mData['Name']); } if (false !== $mResult) { if (is_resource($mResult)) { $sFileName = $mData['Name']; $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $this->clearFileName($sFileName, $sContentType); $this->RawOutputHeaders(true, $sContentType, $sFileName); \MailSo\Base\Utils::FpassthruWithTimeLimitReset($mResult); @fclose($mResult); } } return true; } public function PathInfoDav() { set_error_handler(function ($errno, $errstr, $errfile, $errline ) { throw new ErrorException($errstr, 0, $errno, $errfile, $errline); }); @set_time_limit(3000); $sBaseUri = '/'; if (false !== \strpos($this->oHttp->GetUrl(), 'index.php/dav/')) { $aPath = \trim($this->oHttp->GetPath(), '/\\ '); $sBaseUri = (0 < \strlen($aPath) ? '/'.$aPath : '').'/index.php/dav/'; } $server = \afterlogic\DAV\Server::NewInstance($sBaseUri); $server->exec(); } /** * @return array */ public function _rawContacts($sSyncType) { $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsContactsSupported($oAccount)) { $oApiContactsManager = $this->ApiContacts(); if ($oApiContactsManager) { $sOutput = $oApiContactsManager->Export($oAccount->IdUser, $sSyncType); if (false !== $sOutput) { header('Pragma: public'); header('Content-Type: text/csv'); header('Content-Disposition: attachment; filename="export.' . $sSyncType . '";'); header('Content-Transfer-Encoding: binary'); echo $sOutput; return true; } } } return false; } /** * @return array */ public function RawContactscsv() { return $this->_rawContacts('csv'); } /** * @return array */ public function RawContactsvcf() { return $this->_rawContacts('vcf'); } /** * @todo * @return array */ public function RawCalendars() { $oAccount = $this->getDefaultAccountFromParam(); if ($this->oApiCapability->IsCalendarSupported($oAccount)) { $sRawKey = (string) $this->getParamValue('RawKey', ''); $aValues = \CApi::DecodeKeyValues($sRawKey); if (isset($aValues['CalendarId'])) { $sCalendarId = $aValues['CalendarId']; $oApiCalendarManager = /* @var $oApiCalendarManager \CApiCalendarManager */ \CApi::Manager('calendar'); $sOutput = $oApiCalendarManager->ExportCalendarToIcs($oAccount, $sCalendarId); if (false !== $sOutput) { header('Pragma: public'); header('Content-Type: text/calendar'); header('Content-Disposition: attachment; filename="'.$sCalendarId.'.ics";'); header('Content-Transfer-Encoding: binary'); echo $sOutput; return true; } } } return false; } /** * @return array */ public function UploadContacts() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsPersonalContactsSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::ContactsNotAllowed); } $aFileData = $this->getParamValue('FileData', null); $sError = ''; $aResponse = array( 'ImportedCount' => 0, 'ParsedCount' => 0 ); if (is_array($aFileData)) { $sSavedName = 'import-post-'.md5($aFileData['name'].$aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oAccount, $sSavedName, $aFileData['tmp_name'])) { $oApiContactsManager = $this->ApiContacts(); if ($oApiContactsManager) { $iParsedCount = 0; $sFileType = \api_Utils::GetFileExtension($aFileData['name']); $iImportedCount = $oApiContactsManager->Import( $oAccount->IdUser, $sFileType, $this->ApiFileCache()->GenerateFullFilePath($oAccount, $sSavedName), $iParsedCount ); } if (false !== $iImportedCount && -1 !== $iImportedCount) { $aResponse['ImportedCount'] = $iImportedCount; $aResponse['ParsedCount'] = $iParsedCount; } else { $sError = 'unknown'; } $this->ApiFileCache()->Clear($oAccount, $sSavedName); } else { $sError = 'unknown'; } } else { $sError = 'unknown'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'UploadContacts', $aResponse); } /** * @return array */ public function UploadCalendars() { $oAccount = $this->getDefaultAccountFromParam(); $aFileData = $this->getParamValue('FileData', null); $sAdditionalData = $this->getParamValue('AdditionalData', '{}'); $aAdditionalData = @json_decode($sAdditionalData, true); $sCalendarId = isset($aAdditionalData['CalendarID']) ? $aAdditionalData['CalendarID'] : ''; $sError = ''; $aResponse = array( 'ImportedCount' => 0 ); if (is_array($aFileData)) { $sSavedName = 'import-post-'.md5($aFileData['name'].$aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oAccount, $sSavedName, $aFileData['tmp_name'])) { $oApiCalendarManager = $this->oApiCalendar; if ($oApiCalendarManager) { $iImportedCount = $oApiCalendarManager->ImportToCalendarFromIcs($oAccount, $sCalendarId, $this->ApiFileCache()->GenerateFullFilePath($oAccount, $sSavedName)); } if (false !== $iImportedCount && -1 !== $iImportedCount) { $aResponse['ImportedCount'] = $iImportedCount; } else { $sError = 'unknown'; } $this->ApiFileCache()->Clear($oAccount, $sSavedName); } else { $sError = 'unknown'; } } else { $sError = 'unknown'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'UploadCalendars', $aResponse); } /** * @return array */ public function UploadAttachment() { $oAccount = $this->getAccountFromParam(); $oSettings =& \CApi::GetSettings(); $aFileData = $this->getParamValue('FileData', null); $iSizeLimit = !!$oSettings->GetConf('WebMail/EnableAttachmentSizeLimit', false) ? (int) $oSettings->GetConf('WebMail/AttachmentSizeLimit', 0) : 0; $sError = ''; $aResponse = array(); if ($oAccount) { if (is_array($aFileData)) { if (0 < $iSizeLimit && $iSizeLimit < (int) $aFileData['size']) { $sError = 'size'; } else { $sSavedName = 'upload-post-'.md5($aFileData['name'].$aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oAccount, $sSavedName, $aFileData['tmp_name'])) { $sUploadName = $aFileData['name']; $iSize = $aFileData['size']; $sMimeType = \MailSo\Base\Utils::MimeContentType($sUploadName); $bIframed = \CApi::isIframedMimeTypeSupported($sMimeType, $sUploadName); $aResponse['Attachment'] = array( 'Name' => $sUploadName, 'TempName' => $sSavedName, 'MimeType' => $sMimeType, 'Size' => (int) $iSize, 'Iframed' => $bIframed, 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Iframed' => $bIframed, 'Name' => $sUploadName, 'TempName' => $sSavedName )) ); } else { $sError = 'unknown'; } } } else { $sError = 'unknown'; } } else { $sError = 'auth'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'UploadAttachment', $aResponse); } /** * @return array */ public function UploadFile() { $oAccount = $this->getDefaultAccountFromParam(); if (!$this->oApiCapability->IsFilesSupported($oAccount)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::FilesNotAllowed); } $aFileData = $this->getParamValue('FileData', null); $sAdditionalData = $this->getParamValue('AdditionalData', '{}'); $aAdditionalData = @json_decode($sAdditionalData, true); $sError = ''; $aResponse = array(); if ($oAccount) { if (is_array($aFileData)) { $sUploadName = $aFileData['name']; $iSize = (int) $aFileData['size']; $iType = isset($aAdditionalData['Type']) ? (int) $aAdditionalData['Type'] : \EFileStorageType::Personal; $sPath = isset($aAdditionalData['Path']) ? $aAdditionalData['Path'] : ''; $sMimeType = \MailSo\Base\Utils::MimeContentType($sUploadName); $sSavedName = 'upload-post-'.md5($aFileData['name'].$aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oAccount, $sSavedName, $aFileData['tmp_name'])) { $rData = $this->ApiFileCache()->GetFile($oAccount, $sSavedName); $this->oApiFilestorage->CreateFile($oAccount, $iType, $sPath, $sUploadName, $rData, false); $aResponse['File'] = array( 'Name' => $sUploadName, 'TempName' => $sSavedName, 'MimeType' => $sMimeType, 'Size' => (int) $iSize, 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $sUploadName, 'TempName' => $sSavedName )) ); } } } else { $sError = 'auth'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'UploadFile', $aResponse); } public function UploadMessage() { $oAccount = $this->getDefaultAccountFromParam(); $aFileData = $this->getParamValue('FileData', null); $sAdditionalData = $this->getParamValue('AdditionalData', '{}'); $aAdditionalData = @json_decode($sAdditionalData, true); $sError = ''; $aResponse = array(); if ($oAccount) { if (is_array($aFileData)) { $sUploadName = $aFileData['name']; $bIsEmlExtension = pathinfo($sUploadName, PATHINFO_EXTENSION) === 'eml'; if ($bIsEmlExtension) { $sFolder = isset($aAdditionalData['Folder']) ? $aAdditionalData['Folder'] : ''; $sMimeType = \MailSo\Base\Utils::MimeContentType($sUploadName); $sSavedName = 'upload-post-' . md5($aFileData['name'] . $aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oAccount, $sSavedName, $aFileData['tmp_name'])) { $sSavedFullName = $this->ApiFileCache()->GenerateFullFilePath($oAccount, $sSavedName); $this->oApiMail->MessageAppendFile($oAccount, $sSavedFullName, $sFolder); //$aResponse['File'] = $bIsMessage; } else { $sError = 'unknown'; } } else { $sError = 'The file must have .EML extension.'; } } } else { $sError = 'auth'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'UploadMessage', $aResponse); } /** * @return array */ public function AjaxDataAsAttachmentUpload() { $oAccount = $this->getAccountFromParam(); $oSettings =& \CApi::GetSettings(); $sData = $this->getParamValue('Data', ''); $sFileName = $this->getParamValue('FileName', ''); $sError = ''; $aResponse = array(); if ($oAccount) { $iSizeLimit = !!$oSettings->GetConf('WebMail/EnableAttachmentSizeLimit', false) ? (int) $oSettings->GetConf('WebMail/AttachmentSizeLimit', 0) : 0; $iSize = strlen($sData); if (0 < $iSizeLimit && $iSizeLimit < $iSize) { $sError = 'size'; } else { $sSavedName = 'data-upload-'.md5($sFileName.microtime(true).rand(10000, 99999)); if ($this->ApiFileCache()->Put($oAccount, $sSavedName, $sData)) { $aResponse['Attachment'] = array( 'Name' => $sFileName, 'TempName' => $sSavedName, 'MimeType' => \MailSo\Base\Utils::MimeContentType($sFileName), 'Size' => $iSize, 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'AccountID' => $oAccount->IdAccount, 'Name' => $sFileName, 'TempName' => $sSavedName )) ); } else { $sError = 'unknown'; } } } else { $sError = 'auth'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, __FUNCTION__, $aResponse); } /** * @param bool $bDownload * @param string $sContentType * @param string $sFileName * * @return bool */ public function RawOutputHeaders($bDownload, $sContentType, $sFileName) { if ($bDownload) { header('Content-Type: '.$sContentType, true); } else { $aParts = explode('/', $sContentType, 2); if (in_array(strtolower($aParts[0]), array('image', 'video', 'audio')) || in_array(strtolower($sContentType), array('application/pdf', 'application/x-pdf', 'text/html'))) { header('Content-Type: '.$sContentType, true); } else { header('Content-Type: text/plain', true); } } header('Content-Disposition: '.($bDownload ? 'attachment' : 'inline' ).'; '. \trim(\MailSo\Base\Utils::EncodeHeaderUtf8AttributeValue('filename', $sFileName)), true); header('Accept-Ranges: none', true); header('Content-Transfer-Encoding: binary'); } public function thumbResource($oAccount, $rResource, $sFileName) { $sMd5Hash = md5(rand(1000, 9999)); $this->ApiFileCache()->PutFile($oAccount, 'Raw/Thumbnail/'.$sMd5Hash, $rResource, '_'.$sFileName); if ($this->ApiFileCache()->FileExists($oAccount, 'Raw/Thumbnail/'.$sMd5Hash, '_'.$sFileName)) { try { $oThumb = new \PHPThumb\GD( $this->ApiFileCache()->GenerateFullFilePath($oAccount, 'Raw/Thumbnail/'.$sMd5Hash, '_'.$sFileName) ); $oThumb->adaptiveResize(120, 100)->show(); } catch (\Exception $oE) {} } $this->ApiFileCache()->Clear($oAccount, 'Raw/Thumbnail/'.$sMd5Hash, '_'.$sFileName); } /** * @return bool */ private function rawCallback($sRawKey, $fCallback, $bCache = true, &$oAccount = null, &$oHelpdeskUser = null) { $aValues = \CApi::DecodeKeyValues($sRawKey); $sFolder = ''; $iUid = 0; $sMimeIndex = ''; $oAccount = null; $oHelpdeskUser = null; $oHelpdeskUserFromAttachment = null; if (isset($aValues['HelpdeskUserID'], $aValues['HelpdeskTenantID'])) { $oAccount = null; $oHelpdeskUser = $this->getHelpdeskAccountFromParam($oAccount); if ($oHelpdeskUser && $oHelpdeskUser->IdTenant === $aValues['HelpdeskTenantID']) { $oApiHelpdesk = $this->ApiHelpdesk(); if ($oApiHelpdesk) { if ($oHelpdeskUser->IdHelpdeskUser === $aValues['HelpdeskUserID']) { $oHelpdeskUserFromAttachment = $oHelpdeskUser; } else if ($oHelpdeskUser->IsAgent) { $oHelpdeskUserFromAttachment = $oApiHelpdesk->GetUserById($aValues['HelpdeskTenantID'], $aValues['HelpdeskUserID']); } } } } else if (isset($aValues['AccountID'])) { $oAccount = $this->getAccountFromParam(true, !(isset($aValues['Iframed'], $aValues['Time']) && $aValues['Iframed'] && $aValues['Time'] > \ProjectSeven\Base\Utils::iframedTimestamp()) ); if (!$oAccount || $aValues['AccountID'] !== $oAccount->IdAccount) { return false; } } if ($oHelpdeskUserFromAttachment && isset($aValues['FilestorageFile'], $aValues['StorageType'], $aValues['Path'], $aValues['Name'])) { if ($bCache) { $this->verifyCacheByKey($sRawKey); } $bResult = false; $mResult = false; if ($this->oApiFilestorage->FileExists( $oHelpdeskUserFromAttachment, $aValues['StorageType'], $aValues['Path'], $aValues['Name'] )) { $mResult = $this->oApiFilestorage->GetFile( $oHelpdeskUserFromAttachment, $aValues['StorageType'], $aValues['Path'], $aValues['Name'] ); } if (is_resource($mResult)) { if ($bCache) { $this->cacheByKey($sRawKey); } $bResult = true; $sFileName = $aValues['Name']; $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $this->clearFileName($sFileName, $sContentType); call_user_func_array($fCallback, array( $oAccount, $sContentType, $sFileName, $mResult, $oHelpdeskUser )); } return $bResult; } else if (isset($aValues['TempFile'], $aValues['TempName'], $aValues['Name']) && ($oHelpdeskUserFromAttachment || $oAccount)) { if ($bCache) { $this->verifyCacheByKey($sRawKey); } $bResult = false; $mResult = $this->ApiFileCache()->GetFile($oHelpdeskUserFromAttachment ? $oHelpdeskUserFromAttachment : $oAccount, $aValues['TempName']); if (is_resource($mResult)) { if ($bCache) { $this->cacheByKey($sRawKey); } $bResult = true; $sFileName = $aValues['Name']; $sContentType = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); $sFileName = $this->clearFileName($sFileName, $sContentType); call_user_func_array($fCallback, array( $oAccount, $sContentType, $sFileName, $mResult, $oHelpdeskUser )); } return $bResult; } else { $sFolder = isset($aValues['Folder']) ? $aValues['Folder'] : ''; $iUid = (int) (isset($aValues['Uid']) ? $aValues['Uid'] : 0); $sMimeIndex = (string) (isset($aValues['MimeIndex']) ? $aValues['MimeIndex'] : ''); } if ($bCache && 0 < strlen($sFolder) && 0 < $iUid) { $this->verifyCacheByKey($sRawKey); } $sContentTypeIn = (string) (isset($aValues['MimeType']) ? $aValues['MimeType'] : ''); $sFileNameIn = (string) (isset($aValues['FileName']) ? $aValues['FileName'] : ''); if (!$oAccount) { return false; } $self = $this; return $this->oApiMail->MessageMimeStream($oAccount, function($rResource, $sContentType, $sFileName, $sMimeIndex = '') use ($self, $oAccount, $fCallback, $sRawKey, $bCache, $sContentTypeIn, $sFileNameIn) { if (is_resource($rResource)) { $sContentTypeOut = $sContentTypeIn; if (empty($sContentTypeOut)) { $sContentTypeOut = $sContentType; if (empty($sContentTypeOut)) { $sContentTypeOut = (empty($sFileName)) ? 'text/plain' : \MailSo\Base\Utils::MimeContentType($sFileName); } } $sFileNameOut = $sFileNameIn; if (empty($sFileNameOut) || '.' === $sFileNameOut{0}) { $sFileNameOut = $sFileName; } $sFileNameOut = $self->clearFileName($sFileNameOut, $sContentType, $sMimeIndex); if ($bCache) { $self->cacheByKey($sRawKey); } call_user_func_array($fCallback, array( $oAccount, $sContentTypeOut, $sFileNameOut, $rResource )); } }, $sFolder, $iUid, $sMimeIndex); } /** * @return bool */ private function raw($bDownload = true, $bThumbnail = false) { $self = $this; return $this->rawCallback((string) $this->getParamValue('RawKey', ''), function ($oAccount, $sContentType, $sFileName, $rResource, $oHelpdeskUser = null) use ($self, $bDownload, $bThumbnail) { $self->RawOutputHeaders($bDownload, $sContentType, $sFileName); if (!$bDownload && 'text/html' === $sContentType) { $sHtml = stream_get_contents($rResource); if ($sHtml) { $sCharset = ''; $aMacth = array(); if (preg_match('/charset[\s]?=[\s]?([^\s"\']+)/i', $sHtml, $aMacth) && !empty($aMacth[1])) { $sCharset = $aMacth[1]; } if ('' !== $sCharset && \MailSo\Base\Enumerations\Charset::UTF_8 !== $sCharset) { $sHtml = \MailSo\Base\Utils::ConvertEncoding($sHtml, \MailSo\Base\Utils::NormalizeCharset($sCharset, true), \MailSo\Base\Enumerations\Charset::UTF_8); } include_once PSEVEN_APP_ROOT_PATH.'libraries/other/CssToInlineStyles.php'; $oCssToInlineStyles = new \TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($sHtml); $oCssToInlineStyles->setEncoding('utf-8'); $oCssToInlineStyles->setUseInlineStylesBlock(true); echo '<html><head></head><body>'. \MailSo\Base\HtmlUtils::ClearHtmlSimple($oCssToInlineStyles->convert(), true, true). '</body></html>'; } } else { if ($bThumbnail && !$bDownload) { $self->thumbResource($oAccount ? $oAccount : $oHelpdeskUser, $rResource, $sFileName); } else { \MailSo\Base\Utils::FpassthruWithTimeLimitReset($rResource); } } }, !$bDownload); } /** * @return bool */ public function RawIframe() { $sEncodedUrl = $this->getParamValue('RawKey', ''); $sUrl = urldecode($sEncodedUrl); $sUrl = trim(trim($sUrl), '/\\?'); $aParts = null; if (!empty($sUrl)) { $aParts = explode('/', $sUrl); } if (is_array($aParts) && isset($aParts[0], $aParts[1], $aParts[2], $aParts[3])) { $aValues = \CApi::DecodeKeyValues($aParts[3]); if (isset($aValues['Iframed'], $aValues['Name'], $aValues['AccountID']) && (!isset($aValues['MimeType']) || !isset($aValues['FileName'])) ) { $aValues['FileName'] = $aValues['Name']; $aValues['MimeType'] = \api_Utils::MimeContentType($aValues['FileName']); } if (isset($aValues['Iframed'], $aValues['MimeType'], $aValues['FileName']) && $aValues['Iframed'] && \CApi::isIframedMimeTypeSupported($aValues['MimeType'], $aValues['FileName'])) { $oAccount = $this->getAccountFromParam(false); if ($oAccount) { $sNewUrl = ''; $sNewHash = ''; $sResultUrl = ''; $aSubParts = \CApi::DecodeKeyValues($aParts[3]); if (isset($aSubParts['Iframed']) && (int) $aParts[2] === (int) $oAccount->IdAccount && 0 < $oAccount->IdAccount) { $aSubParts['Time'] = \time(); $sNewHash = \CApi::EncodeKeyValues($aSubParts); } if (!empty($sNewHash)) { $aParts[3] = $sNewHash; $sNewUrl = rtrim(trim($this->oHttp->GetFullUrl()), '/').'/?/'.implode('/', $aParts); \CApi::Plugin()->RunHook('webmail.filter.iframed-attachments-url', array(&$sResultUrl, $sNewUrl, $aValues['MimeType'], $aValues['FileName'])); if (empty($sResultUrl) && \CApi::GetConf('labs.allow-officeapps-viewer', true)) { $sResultUrl = 'https://view.officeapps.live.com/op/view.aspx?src='.urlencode($sNewUrl); } } if (!empty($sResultUrl)) { header('Content-Type: text/html', true); echo '<html style="height: 100%; width: 100%; margin: 0; padding: 0"><head></head><body'. ' style="height: 100%; width: 100%; margin: 0; padding: 0">'. '<iframe style="height: 100%; width: 100%; margin: 0; padding: 0; border: 0" src="'.$sResultUrl.'"></iframe></body></html>'; return true; } } } } return false; } /** * @return bool */ public function RawView() { return $this->raw(false); } /** * @return bool */ public function RawDownload() { return $this->raw(true); } /** * @return bool */ public function RawThumbnail() { return $this->raw(false, true); } /** * @return bool */ public function PostPdfFromHtml() { $oAccount = $this->getAccountFromParam(); if ($oAccount) { $sSubject = (string) $this->getParamValue('Subject', ''); $sHtml = (string) $this->getParamValue('Html', ''); include_once PSEVEN_APP_ROOT_PATH.'libraries/other/CssToInlineStyles.php'; $oCssToInlineStyles = new \TijsVerkoyen\CssToInlineStyles\CssToInlineStyles($sHtml); $oCssToInlineStyles->setEncoding('utf-8'); $oCssToInlineStyles->setUseInlineStylesBlock(true); $this->RawOutputHeaders(true, 'application/pdf', $sSubject.'.pdf'); include_once PSEVEN_APP_ROOT_PATH.'libraries/dompdf/dompdf_config.inc.php'; $oDomPdf = new \DOMPDF(); $oDomPdf->load_html('<html><head></head><body>'. \MailSo\Base\HtmlUtils::ClearHtmlSimple($oCssToInlineStyles->convert(), true, true). '</body></html>'); $oDomPdf->render(); $oDomPdf->stream($sSubject.'.pdf', array('Attachment' => false)); return true; } return false; } /** * @param string $sFileName * @param string $sContentType * @param string $sMimeIndex = '' * * @return string */ public function clearFileName($sFileName, $sContentType, $sMimeIndex = '') { $sFileName = 0 === strlen($sFileName) ? preg_replace('/[^a-zA-Z0-9]/', '.', (empty($sMimeIndex) ? '' : $sMimeIndex.'.').$sContentType) : $sFileName; $sClearedFileName = preg_replace('/[\s]+/', ' ', preg_replace('/[\.]+/', '.', $sFileName)); $sExt = \MailSo\Base\Utils::GetFileExtension($sClearedFileName); $iSize = 100; if ($iSize < strlen($sClearedFileName) - strlen($sExt)) { $sClearedFileName = substr($sClearedFileName, 0, $iSize).(empty($sExt) ? '' : '.'.$sExt); } return \MailSo\Base\Utils::ClearFileName(\MailSo\Base\Utils::Utf8Clear($sClearedFileName)); } /** * @param string $sKey * * @return void */ public function cacheByKey($sKey) { if (!empty($sKey)) { $iUtcTimeStamp = time(); $iExpireTime = 3600 * 24 * 5; header('Cache-Control: private', true); header('Pragma: private', true); header('Etag: '.md5('Etag:'.md5($sKey)), true); header('Last-Modified: '.gmdate('D, d M Y H:i:s', $iUtcTimeStamp - $iExpireTime).' UTC', true); header('Expires: '.gmdate('D, j M Y H:i:s', $iUtcTimeStamp + $iExpireTime).' UTC', true); } } /** * @param string $sKey * * @return void */ public function verifyCacheByKey($sKey) { if (!empty($sKey)) { $sIfModifiedSince = $this->oHttp->GetHeader('If-Modified-Since', ''); if (!empty($sIfModifiedSince)) { $this->oHttp->StatusHeader(304); $this->cacheByKey($sKey); exit(); } } } /** * @param CAccount $oAccount * * @return array|null */ private function mobileSyncSettings($oAccount) { $mResult = null; $oApiDavManager = \CApi::Manager('dav'); if ($oAccount && $oApiDavManager) { $oApiCapabilityManager = \CApi::Manager('capability'); /* @var $oApiCapabilityManager \CApiCapabilityManager */ $oApiCalendarManager = \CApi::Manager('calendar'); $bEnableMobileSync = $oApiCapabilityManager->IsMobileSyncSupported($oAccount); $mResult = array(); $mResult['EnableDav'] = $bEnableMobileSync; $sDavLogin = $oApiDavManager->GetLogin($oAccount); $sDavServer = $oApiDavManager->GetServerUrl(); $mResult['Dav'] = null; $mResult['ActiveSync'] = null; $mResult['DavError'] = ''; $oException = $oApiDavManager->GetLastException(); if (!$oException) { if ($bEnableMobileSync) { $mResult['Dav'] = array(); $mResult['Dav']['Login'] = $sDavLogin; $mResult['Dav']['Server'] = $sDavServer; $mResult['Dav']['PrincipalUrl'] = ''; $sPrincipalUrl = $oApiDavManager->GetPrincipalUrl($oAccount); if ($sPrincipalUrl) { $mResult['Dav']['PrincipalUrl'] = $sPrincipalUrl; } $mResult['Dav']['Calendars'] = array(); $aCalendars = $oApiCalendarManager ? $oApiCalendarManager->GetCalendars($oAccount) : null; // if (isset($aCalendars['user']) && is_array($aCalendars['user'])) // { // foreach($aCalendars['user'] as $aCalendar) // { // if (isset($aCalendar['name']) && isset($aCalendar['url'])) // { // $mResult['Dav']['Calendars'][] = array( // 'Name' => $aCalendar['name'], // 'Url' => $sDavServer.$aCalendar['url'] // ); // } // } // } if (is_array($aCalendars) && 0 < count($aCalendars)) { foreach($aCalendars as $aCalendar) { if (isset($aCalendar['Name']) && isset($aCalendar['Url'])) { $mResult['Dav']['Calendars'][] = array( 'Name' => $aCalendar['Name'], 'Url' => $sDavServer.$aCalendar['Url'] ); } } } $mResult['Dav']['PersonalContactsUrl'] = $sDavServer.'/addressbooks/'.$sDavLogin.'/'.\afterlogic\DAV\Constants::ADDRESSBOOK_DEFAULT_NAME; $mResult['Dav']['CollectedAddressesUrl'] = $sDavServer.'/addressbooks/'.$sDavLogin.'/'.\afterlogic\DAV\Constants::ADDRESSBOOK_COLLECTED_NAME; $mResult['Dav']['SharedWithAllUrl'] = $sDavServer.'/addressbooks/'.$sDavLogin.'/'.\afterlogic\DAV\Constants::ADDRESSBOOK_SHARED_WITH_ALL_NAME; $mResult['Dav']['GlobalAddressBookUrl'] = $sDavServer.'/gab'; } } else { $mResult['DavError'] = $oException->getMessage(); } } return $mResult; } /** * @param CAccount $oAccount * * @return array|null */ private function outlookSyncSettings($oAccount) { $mResult = null; if ($oAccount && $this->oApiCapability->IsOutlookSyncSupported($oAccount)) { /* @var $oApiDavManager \CApiDavManager */ $oApiDavManager = \CApi::Manager('dav'); $sLogin = $oApiDavManager->GetLogin($oAccount); $sServerUrl = $oApiDavManager->GetServerUrl(); $mResult = array(); $mResult['Login'] = ''; $mResult['Server'] = ''; $mResult['DavError'] = ''; $oException = $oApiDavManager->GetLastException(); if (!$oException) { $mResult['Login'] = $sLogin; $mResult['Server'] = $sServerUrl; } else { $mResult['DavError'] = $oException->getMessage(); } } return $mResult; } /** * @return array */ public function AjaxHelpdeskThreadsList() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $iFilter = (int) $this->getParamValue('Filter', \EHelpdeskThreadFilterType::All); $sSearch = (string) $this->getParamValue('Search', ''); $iOffset = (int) $this->getParamValue('Offset', 0); $iLimit = (int) $this->getParamValue('Limit', 10); $bIsAgent = $oUser->IsAgent; if (0 > $iOffset || 1 > $iLimit) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $aList = array(); $iCount = $this->ApiHelpdesk()->GetThreadsCount($oUser, $iFilter, $sSearch); if ($iCount) { $aList = $this->ApiHelpdesk()->GetThreads($oUser, $iOffset, $iLimit, $iFilter, $sSearch); } $aOwnerIdList = array(); if (is_array($aList) && 0 < count($aList)) { foreach ($aList as &$oItem) { $aOwnerIdList[$oItem->IdOwner] = (int) $oItem->IdOwner; } } if (0 < count($aOwnerIdList)) { $aOwnerIdList = array_values($aOwnerIdList); $aUserInfo = $this->ApiHelpdesk()->UserInformation($oUser, $aOwnerIdList); if (is_array($aUserInfo) && 0 < count($aUserInfo)) { foreach ($aList as &$oItem) { if ($oItem && isset($aUserInfo[$oItem->IdOwner]) && is_array($aUserInfo[$oItem->IdOwner])) { $sEmail = isset($aUserInfo[$oItem->IdOwner][0]) ? $aUserInfo[$oItem->IdOwner][0] : ''; $sName = isset($aUserInfo[$oItem->IdOwner][1]) ? $aUserInfo[$oItem->IdOwner][1] : ''; if (empty($sEmail) && !empty($aUserInfo[$oItem->IdOwner][3])) { $sEmail = $aUserInfo[$oItem->IdOwner][3]; } if (!$bIsAgent && 0 < strlen($sName)) { $sEmail = ''; } $oItem->Owner = array($sEmail, $sName); } } } } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'Search' => $sSearch, 'Filter' => $iFilter, 'List' => $aList, 'Offset' => $iOffset, 'Limit' => $iLimit, 'ItemsCount' => $iCount )); } /** * @return array */ public function AjaxHelpdeskThreadPosts() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $bIsAgent = $oUser->IsAgent; $iThreadId = (int) $this->getParamValue('ThreadId', 0); $iStartFromId = (int) $this->getParamValue('StartFromId', 0); $iLimit = (int) $this->getParamValue('Limit', 10); if (1 > $iThreadId || 0 > $iStartFromId || 1 > $iLimit) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); if (!$oThread) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $aList = $this->ApiHelpdesk()->GetPosts($oUser, $oThread, $iStartFromId, $iLimit); $aIdList = array(); if (is_array($aList) && 0 < count($aList)) { foreach ($aList as &$oItem) { if ($oItem) { $aIdList[$oItem->IdOwner] = (int) $oItem->IdOwner; } } } $aIdList[$oThread->IdOwner] = (int) $oThread->IdOwner; if (0 < count($aIdList)) { $aIdList = array_values($aIdList); $aUserInfo = $this->ApiHelpdesk()->UserInformation($oUser, $aIdList); if (is_array($aUserInfo) && 0 < count($aUserInfo)) { foreach ($aList as &$oItem) { if ($oItem && isset($aUserInfo[$oItem->IdOwner]) && is_array($aUserInfo[$oItem->IdOwner])) { $oItem->Owner = array( isset($aUserInfo[$oItem->IdOwner][0]) ? $aUserInfo[$oItem->IdOwner][0] : '', isset($aUserInfo[$oItem->IdOwner][1]) ? $aUserInfo[$oItem->IdOwner][1] : '' ); if (empty($oItem->Owner[0])) { $oItem->Owner[0] = isset($aUserInfo[$oItem->IdOwner][3]) ? $aUserInfo[$oItem->IdOwner][3] : ''; } if (!$bIsAgent && 0 < strlen($oItem->Owner[1])) { $oItem->Owner[0] = ''; } $oItem->IsThreadOwner = $oThread->IdOwner === $oItem->IdOwner; } if ($oItem) { $oItem->ItsMe = $oUser->IdHelpdeskUser === $oItem->IdOwner; } } if (isset($aUserInfo[$oThread->IdOwner]) && is_array($aUserInfo[$oThread->IdOwner])) { $sEmail = isset($aUserInfo[$oThread->IdOwner][0]) ? $aUserInfo[$oThread->IdOwner][0] : ''; $sName = isset($aUserInfo[$oThread->IdOwner][1]) ? $aUserInfo[$oThread->IdOwner][1] : ''; if (!$bIsAgent && 0 < strlen($sName)) { $sEmail = ''; } $oThread->Owner = array($sEmail, $sName); } } } if ($oThread->HasAttachments) { $aAttachments = $this->ApiHelpdesk()->GetAttachments($oUser, $oThread); if (is_array($aAttachments)) { foreach ($aList as &$oItem) { if (isset($aAttachments[$oItem->IdHelpdeskPost]) && is_array($aAttachments[$oItem->IdHelpdeskPost]) && 0 < count($aAttachments[$oItem->IdHelpdeskPost])) { $oItem->Attachments = $aAttachments[$oItem->IdHelpdeskPost]; foreach ($oItem->Attachments as $oAttachment) { if ($oAttachment && '.asc' === \strtolower(\substr(\trim($oAttachment->FileName), -4))) { $oAttachment->PopulateContent($oUser, $this->oApiHelpdesk, $this->oApiFilestorage); } } } } } } return $this->DefaultResponse($oAccount, __FUNCTION__, array( 'ThreadId' => $oThread->IdHelpdeskThread, 'StartFromId' => $iStartFromId, 'Limit' => $iLimit, 'ItemsCount' => $oThread->PostCount > count($aList) ? $oThread->PostCount : count($aList), 'List' => $aList )); } /** * @return array */ public function AjaxHelpdeskGetThreadByHash() { $oAccount = null; $oThread = false; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $bIsAgent = $oUser->IsAgent; $sThreadHash = (string) $this->getParamValue('ThreadHash', ''); if (empty($sThreadHash)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oApiHelpdesk = \CApi::Manager('helpdesk'); if ($oApiHelpdesk) { $mHelpdeskIdTenant = $oApiHelpdesk->GetThreadIdByHash($oUser->IdTenant, $sThreadHash); if (!is_int($mHelpdeskIdTenant) || 1 > $mHelpdeskIdTenant) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $mHelpdeskIdTenant); if (!$oThread) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $aUserInfo = $this->ApiHelpdesk()->UserInformation($oUser, array($oThread->IdOwner)); if (is_array($aUserInfo) && 0 < count($aUserInfo)) { if (isset($aUserInfo[$oThread->IdOwner]) && is_array($aUserInfo[$oThread->IdOwner])) { $sEmail = isset($aUserInfo[$oThread->IdOwner][0]) ? $aUserInfo[$oThread->IdOwner][0] : ''; $sName = isset($aUserInfo[$oThread->IdOwner][1]) ? $aUserInfo[$oThread->IdOwner][1] : ''; if (empty($sEmail) && !empty($aUserInfo[$oThread->IdOwner][3])) { $sEmail = $aUserInfo[$oThread->IdOwner][3]; } if (!$bIsAgent && 0 < strlen($sName)) { $sEmail = ''; } $oThread->Owner = array($sEmail, $sName); } } } return $this->DefaultResponse($oAccount, __FUNCTION__, $oThread); } /** * @return array */ public function AjaxHelpdeskPostDelete() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); if (!$oUser) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } $iThreadId = (int) $this->getParamValue('ThreadId', 0); $iPostId = (int) $this->getParamValue('PostId', 0); if (0 >= $iThreadId || 0 >= $iPostId) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); if (!$oThread) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } if (!$this->ApiHelpdesk()->VerifyPostIdsBelongToUser($oUser, array($iPostId))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiHelpdesk()->DeletePosts($oUser, $oThread, array($iPostId))); } /** * @return array */ public function AjaxHelpdeskThreadDelete() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); if (!$oUser) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } $iThreadId = (int) $this->getParamValue('ThreadId', ''); if (0 < $iThreadId && !$oUser->IsAgent && !$this->ApiHelpdesk()->VerifyThreadIdsBelongToUser($oUser, array($iThreadId))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } $bResult = false; if (0 < $iThreadId) { $bResult = $this->ApiHelpdesk()->ArchiveThreads($oUser, array($iThreadId)); } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } /** * @return array */ public function AjaxHelpdeskThreadChangeState() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $iThreadId = (int) $this->getParamValue('ThreadId', 0); $iThreadType = (int) $this->getParamValue('Type', \EHelpdeskThreadType::None); if (1 > $iThreadId || !in_array($iThreadType, array( \EHelpdeskThreadType::Pending, \EHelpdeskThreadType::Waiting, \EHelpdeskThreadType::Answered, \EHelpdeskThreadType::Resolved, \EHelpdeskThreadType::Deferred ))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } if (!$oUser || ($iThreadType !== \EHelpdeskThreadType::Resolved && !$oUser->IsAgent)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } $bResult = false; $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); if ($oThread) { $oThread->Type = $iThreadType; $bResult = $this->ApiHelpdesk()->UpdateThread($oUser, $oThread); } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } /** * @return array */ public function AjaxHelpdeskIsAgent() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); return $this->DefaultResponse($oAccount, __FUNCTION__, $oUser && $oUser->IsAgent); } /** * @return array */ public function AjaxHelpdeskUpdateSettings() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $sName = (string) $this->oHttp->GetPost('Name', $oUser->Name); $sLanguage = (string) $this->oHttp->GetPost('Language', $oUser->Language); // $sLanguage = $this->validateLang($sLanguage); $sDateFormat = (string) $this->oHttp->GetPost('DateFormat', $oUser->DateFormat); $iTimeFormat = (int) $this->oHttp->GetPost('TimeFormat', $oUser->TimeFormat); $oUser->Name = trim($sName); $oUser->Language = trim($sLanguage); $oUser->DateFormat = $sDateFormat; $oUser->TimeFormat = $iTimeFormat; return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiHelpdesk()->UpdateUser($oUser)); } /** * @return array */ public function AjaxHelpdeskUpdateUserPassword() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $sCurrentPassword = (string) $this->oHttp->GetPost('CurrentPassword', ''); $sNewPassword = (string) $this->oHttp->GetPost('NewPassword', ''); $bResult = false; if ($oUser && $oUser->ValidatePassword($sCurrentPassword) && 0 < strlen($sNewPassword)) { $oUser->SetPassword($sNewPassword); if (!$this->ApiHelpdesk()->UpdateUser($oUser)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::CanNotChangePassword); } } return $this->DefaultResponse($oAccount, __FUNCTION__, $bResult); } public function AjaxHelpdeskPostCreate() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); /* @var $oAccount CAccount */ $iThreadId = (int) $this->getParamValue('ThreadId', 0); $sSubject = trim((string) $this->getParamValue('Subject', '')); $sText = trim((string) $this->getParamValue('Text', '')); $bIsInternal = '1' === (string) $this->getParamValue('IsInternal', '0'); $mAttachments = $this->getParamValue('Attachments', null); if (0 === strlen($sText) || (0 === $iThreadId && 0 === strlen($sSubject))) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mResult = false; $bIsNew = false; $oThread = null; if (0 === $iThreadId) { $bIsNew = true; $oThread = new \CHelpdeskThread(); $oThread->IdTenant = $oUser->IdTenant; $oThread->IdOwner = $oUser->IdHelpdeskUser; $oThread->Type = \EHelpdeskThreadType::Pending; $oThread->Subject = $sSubject; if (!$this->ApiHelpdesk()->CreateThread($oUser, $oThread)) { $oThread = null; } } else { $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); } if ($oThread && 0 < $oThread->IdHelpdeskThread) { $oPost = new \CHelpdeskPost(); $oPost->IdTenant = $oUser->IdTenant; $oPost->IdOwner = $oUser->IdHelpdeskUser; $oPost->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oPost->Type = $bIsInternal ? \EHelpdeskPostType::Internal : \EHelpdeskPostType::Normal; $oPost->SystemType = \EHelpdeskPostSystemType::None; $oPost->Text = $sText; $aResultAttachment = array(); if (is_array($mAttachments) && 0 < count($mAttachments)) { foreach ($mAttachments as $sTempName => $sHash) { $aDecodeData = \CApi::DecodeKeyValues($sHash); if (!isset($aDecodeData['HelpdeskUserID'])) { continue; } $rData = $this->ApiFileCache()->GetFile($oUser, $sTempName); if ($rData) { $iFileSize = $this->ApiFileCache()->FileSize($oUser, $sTempName); $sThreadID = (string) $oThread->IdHelpdeskThread; $sThreadID = str_pad($sThreadID, 2, '0', STR_PAD_LEFT); $sThreadIDSubFolder = substr($sThreadID, 0, 2); $sThreadFolderName = API_HELPDESK_PUBLIC_NAME.'/'.$sThreadIDSubFolder.'/'.$sThreadID; $this->oApiFilestorage->CreateFolder($oUser, \EFileStorageType::Corporate, '', $sThreadFolderName); $sUploadName = isset($aDecodeData['Name']) ? $aDecodeData['Name'] : $sTempName; $this->oApiFilestorage->CreateFile($oUser, \EFileStorageType::Corporate, $sThreadFolderName, $sUploadName, $rData, false); $oAttachment = new \CHelpdeskAttachment(); $oAttachment->IdHelpdeskThread = $oThread->IdHelpdeskThread; $oAttachment->IdHelpdeskPost = $oPost->IdHelpdeskPost; $oAttachment->IdOwner = $oUser->IdHelpdeskUser; $oAttachment->IdTenant = $oUser->IdTenant; $oAttachment->FileName = $sUploadName; $oAttachment->SizeInBytes = $iFileSize; $oAttachment->EncodeHash($oUser, $sThreadFolderName); $aResultAttachment[] = $oAttachment; } } if (is_array($aResultAttachment) && 0 < count($aResultAttachment)) { $oPost->Attachments = $aResultAttachment; } } $mResult = $this->ApiHelpdesk()->CreatePost($oUser, $oThread, $oPost, $bIsNew); if ($mResult) { $mResult = $oThread->IdHelpdeskThread; } } return $this->DefaultResponse($oAccount, __FUNCTION__, $mResult); } public function AjaxHelpdeskThreadPing() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $iThreadId = (int) $this->getParamValue('ThreadId', 0); if (0 === $iThreadId) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $this->ApiHelpdesk()->SetOnline($oUser, $iThreadId); return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiHelpdesk()->GetOnline($oUser, $iThreadId)); } public function AjaxHelpdeskThreadSeen() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); $iThreadId = (int) $this->getParamValue('ThreadId', 0); if (0 === $iThreadId) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oThread = $this->ApiHelpdesk()->GetThreadById($oUser, $iThreadId); if (!$oThread) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } return $this->DefaultResponse($oAccount, __FUNCTION__, $this->ApiHelpdesk()->SetThreadSeen($oUser, $oThread)); } public function AjaxHelpdeskLogin() { $sTenantHash = trim($this->getParamValue('TenantHash', '')); if ($this->oApiCapability->IsHelpdeskSupported()) { $sEmail = trim($this->getParamValue('Email', '')); $sPassword = trim($this->getParamValue('Password', '')); $bSignMe = '1' === (string) $this->getParamValue('SignMe', '0'); if (0 === strlen($sEmail) || 0 === strlen($sPassword)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mIdTenant = $this->oApiIntegrator->GetTenantIdByHash($sTenantHash); if (!is_int($mIdTenant)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } try { $oHelpdeskUser = $this->oApiIntegrator->LoginToHelpdeskAccount($mIdTenant, $sEmail, $sPassword); if ($oHelpdeskUser && !$oHelpdeskUser->Blocked) { $this->oApiIntegrator->SetHelpdeskUserAsLoggedIn($oHelpdeskUser, $bSignMe); return $this->TrueResponse(null, __FUNCTION__); } } catch (\Exception $oException) { $iErrorCode = \ProjectSeven\Notifications::UnknownError; if ($oException instanceof \CApiManagerException) { switch ($oException->getCode()) { case \Errs::HelpdeskManager_AccountSystemAuthentication: $iErrorCode = \ProjectSeven\Notifications::HelpdeskSystemUserExists; break; case \Errs::HelpdeskManager_AccountAuthentication: $iErrorCode = \ProjectSeven\Notifications::AuthError; break; case \Errs::HelpdeskManager_UnactivatedUser: $iErrorCode = \ProjectSeven\Notifications::HelpdeskUnactivatedUser; break; case \Errs::Db_ExceptionError: $iErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } throw new \ProjectSeven\Exceptions\ClientException($iErrorCode); } } return $this->FalseResponse(null, __FUNCTION__); } public function AjaxHelpdeskLogout() { if ($this->oApiCapability->IsHelpdeskSupported()) { $this->oApiIntegrator->LogoutHelpdeskUser(); } return $this->TrueResponse(null, __FUNCTION__); } public function AjaxHelpdeskRegister() { $sTenantHash = trim($this->getParamValue('TenantHash', '')); if ($this->oApiCapability->IsHelpdeskSupported()) { $sEmail = trim($this->getParamValue('Email', '')); $sName = trim($this->getParamValue('Name', '')); $sPassword = trim($this->getParamValue('Password', '')); if (0 === strlen($sEmail) || 0 === strlen($sPassword)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mIdTenant = $this->oApiIntegrator->GetTenantIdByHash($sTenantHash); if (!is_int($mIdTenant)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $bResult = false; try { $bResult = !!$this->oApiIntegrator->RegisterHelpdeskAccount($mIdTenant, $sEmail, $sName, $sPassword); } catch (\Exception $oException) { $iErrorCode = \ProjectSeven\Notifications::UnknownError; if ($oException instanceof \CApiManagerException) { switch ($oException->getCode()) { case \Errs::HelpdeskManager_UserAlreadyExists: $iErrorCode = \ProjectSeven\Notifications::HelpdeskUserAlreadyExists; break; case \Errs::HelpdeskManager_UserCreateFailed: $iErrorCode = \ProjectSeven\Notifications::CanNotCreateHelpdeskUser; break; case \Errs::Db_ExceptionError: $iErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } throw new \ProjectSeven\Exceptions\ClientException($iErrorCode); } return $this->DefaultResponse(null, __FUNCTION__, $bResult); } return $this->FalseResponse(null, __FUNCTION__); } public function AjaxSocialRegister() { $sTenantHash = trim($this->getParamValue('TenantHash', '')); if ($this->oApiCapability->IsHelpdeskSupported()) { $sNotificationEmail = trim($this->getParamValue('NotificationEmail', '')); if(isset($_COOKIE["Social"])) { $aSocial = \CApi::DecodeKeyValues($_COOKIE["Social"]); } else { $aSocial = array( 'type' => '', 'id' => '', 'name' => '', 'email' => '' ); } $sSocialType = $aSocial['type']; $sSocialId = $aSocial['id']; $sSocialName = $aSocial['name']; $sSocialEmail = $aSocial['email']; if (0 !== strlen($sSocialEmail)) { $sNotificationEmail = $sSocialEmail; } if (0 === strlen($sNotificationEmail)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mIdTenant = $this->oApiIntegrator->GetTenantIdByHash($sTenantHash); if (!is_int($mIdTenant)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $bResult = false; try { $bResult = $this->oApiIntegrator->RegisterSocialAccount($mIdTenant, $sTenantHash, $sNotificationEmail, $sSocialId, $sSocialType, $sSocialName); } catch (\Exception $oException) { $iErrorCode = \ProjectSeven\Notifications::UnknownError; if ($oException instanceof \CApiManagerException) { switch ($oException->getCode()) { case \Errs::HelpdeskManager_UserAlreadyExists: $iErrorCode = \ProjectSeven\Notifications::HelpdeskUserAlreadyExists; break; case \Errs::HelpdeskManager_UserCreateFailed: $iErrorCode = \ProjectSeven\Notifications::CanNotCreateHelpdeskUser; break; case \Errs::Db_ExceptionError: $iErrorCode = \ProjectSeven\Notifications::DataBaseError; break; } } throw new \ProjectSeven\Exceptions\ClientException($iErrorCode); } if ($bResult) { $bResult = false; $oUser = \CApi::Manager('integrator')->GetAhdSocialUser($sTenantHash, $sSocialId); if ($oUser) { \CApi::Manager('integrator')->SetHelpdeskUserAsLoggedIn($oUser, false); $bResult = true; } } return $this->DefaultResponse(null, __FUNCTION__, $bResult); } return $this->FalseResponse(null, __FUNCTION__); } public function AjaxSocialAccount() { $mResult = false; $oTenant = null; $oAccount = $this->GetDefaultAccount(); $iType = (int) trim($this->getParamValue('Type', 0)); if ($oAccount && $this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } if ($oTenant) { $oApiSocial /* @var $oApiSocial \CApiSocialManager */ = \CApi::Manager('social'); $mResult = $oApiSocial->GetSocial($oAccount->IdAccount, $iType); } return $this->DefaultResponse(null, __FUNCTION__, $mResult); } public function AjaxSocialAccountDelete() { $mResult = false; $oTenant = null; $oAccount = $this->GetDefaultAccount(); if ($oAccount && $this->oApiTenants) { $oTenant = (0 < $oAccount->IdTenant) ? $this->oApiTenants->GetTenantById($oAccount->IdTenant) : $this->oApiTenants->GetDefaultGlobalTenant(); } if ($oTenant) { $iType = (int) trim($this->getParamValue('Type', 0)); $oApiSocial /* @var $oApiSocial \CApiSocialManager */ = \CApi::Manager('social'); $mResult = $oApiSocial->DeleteSocial($oAccount->IdAccount, $iType); } return $this->DefaultResponse(null, __FUNCTION__, $mResult); } public function AjaxHelpdeskForgot() { $sTenantHash = trim($this->getParamValue('TenantHash', '')); if ($this->oApiCapability->IsHelpdeskSupported()) { $sEmail = trim($this->getParamValue('Email', '')); if (0 === strlen($sEmail)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mIdTenant = $this->oApiIntegrator->GetTenantIdByHash($sTenantHash); if (!is_int($mIdTenant)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oHelpdesk = $this->ApiHelpdesk(); if ($oHelpdesk) { $oUser = $oHelpdesk->GetUserByEmail($mIdTenant, $sEmail); if (!($oUser instanceof \CHelpdeskUser)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::HelpdeskUnknownUser); } return $this->DefaultResponse(null, __FUNCTION__, $oHelpdesk->ForgotUser($oUser)); } } return $this->FalseResponse(null, __FUNCTION__); } public function AjaxHelpdeskForgotChangePassword() { $sTenantHash = trim($this->getParamValue('TenantHash', '')); if ($this->oApiCapability->IsHelpdeskSupported()) { $sActivateHash = \trim($this->getParamValue('ActivateHash', '')); $sNewPassword = \trim($this->getParamValue('NewPassword', '')); if (0 === strlen($sNewPassword) || 0 === strlen($sActivateHash)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $mIdTenant = $this->oApiIntegrator->GetTenantIdByHash($sTenantHash); if (!is_int($mIdTenant)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::InvalidInputParameter); } $oHelpdesk = $this->ApiHelpdesk(); if ($oHelpdesk) { $oUser = $oHelpdesk->GetUserByActivateHash($mIdTenant, $sActivateHash); if (!($oUser instanceof \CHelpdeskUser)) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::HelpdeskUnknownUser); } $oUser->Activated = true; $oUser->SetPassword($sNewPassword); $oUser->RegenerateActivateHash(); return $this->DefaultResponse(null, __FUNCTION__, $oHelpdesk->UpdateUser($oUser)); } } return $this->FalseResponse(null, __FUNCTION__); } /** * @return array */ public function UploadHelpdeskFile() { $oAccount = null; $oUser = $this->getHelpdeskAccountFromParam($oAccount); if (!$this->oApiCapability->IsHelpdeskSupported() || !$this->oApiCapability->IsFilesSupported()) { throw new \ProjectSeven\Exceptions\ClientException(\ProjectSeven\Notifications::AccessDenied); } $aFileData = $this->getParamValue('FileData', null); $iSizeLimit = 0; $sError = ''; $aResponse = array(); if ($oUser) { if (is_array($aFileData)) { if (0 < $iSizeLimit && $iSizeLimit < (int) $aFileData['size']) { $sError = 'size'; } else { $sSavedName = 'upload-post-'.md5($aFileData['name'].$aFileData['tmp_name']); if ($this->ApiFileCache()->MoveUploadedFile($oUser, $sSavedName, $aFileData['tmp_name'])) { $sUploadName = $aFileData['name']; $iSize = $aFileData['size']; $sMimeType = \MailSo\Base\Utils::MimeContentType($sUploadName); $aResponse['HelpdeskFile'] = array( 'Name' => $sUploadName, 'TempName' => $sSavedName, 'MimeType' => $sMimeType, 'Size' => (int) $iSize, 'Hash' => \CApi::EncodeKeyValues(array( 'TempFile' => true, 'HelpdeskTenantID' => $oUser->IdTenant, 'HelpdeskUserID' => $oUser->IdHelpdeskUser, 'Name' => $sUploadName, 'TempName' => $sSavedName )) ); } else { $sError = 'unknown'; } } } else { $sError = 'unknown'; } } else { $sError = 'auth'; } if (0 < strlen($sError)) { $aResponse['Error'] = $sError; } return $this->DefaultResponse($oAccount, 'HelpdeskFile', $aResponse); } public function GetTwilio() { return $this->oApiTwilio; } }