/** * @NoAdminRequired * @NoCSRFRequired */ public function index() { $key = Helper::post('key'); $data = Helper::post('data', false); $pid = Helper::post('pid'); $uid = Helper::post('uid'); if (method_exists($this, $key)) { return $this->{$key}($data); } else { return new DataResponse(); } }
/** * @PublicPage * @NoAdminRequired * @NoCSRFRequired * @return DataResponse */ public function parseManager() { $returned = ['to' => null, 'from' => null, 'type' => 'fail', 'error' => null]; $shareUIds = []; $insertResult = false; if (!$this->mailDomain) { $returned['error'] = 'mailDomain not find!'; return new DataResponse($returned); } $params = Helper::post(); $to = explode('@', $params['to']); $idhash = explode('+', $to[0]); $userDataFrom = $this->connect->users()->getByEmail(trim($params['from'])); if (!is_array($userDataFrom)) { $returned['error'] = "User with email '{$params['from']}' not find!"; return new DataResponse($returned); } $shareUIds[] = $params['author'] = $userDataFrom['userid']; // Work with static mail name and groups if (count($idhash) == 1) { // Groups emails if (strpos($to[0], '-group') !== false) { $group = trim(explode('-group', $to[0])[0]); $usersGroup = false; $usersGroupList = $this->connect->users()->getGroupsUsersList(); foreach ($usersGroupList as $_group => $_users) { if (strtolower($_group) == strtolower($group)) { $usersGroup = $_users; break; } } if (is_array($usersGroup)) { $users = array_map(function ($item) { return $item['uid']; }, $usersGroup); $shareUIds = array_merge($shareUIds, $users); $subscribers = ['groups' => [$group], 'users' => $users]; if (!empty($users)) { $builder = $this->saveTalkBuilder($params, $subscribers, $group . '-group'); if ($builder === true) { $returned['type'] = 'ok'; } else { $returned['error'] = 'Save task failed!'; } } else { $returned['error'] = "Users in group '{$group}' not find."; } } else { $returned['error'] = "Group {$group} not find!"; } } else { // Static emails switch ($idhash[0]) { case 'team': $saved = $this->saveTalkTeam($params); $users = $this->connect->users()->getAll(); $shareUIds = array_merge($shareUIds, array_map(function ($item) { return $item['uid']; }, $users)); if (!$saved) { $returned['type'] = 'ok'; } else { $returned['type'] = 'error_team'; } break; case 'support': // for the future realization break; } } } else { // Users emails $uid = $idhash[0]; $hash = $idhash[1]; // checked message by hash key if ($message = $this->connect->messages()->getByHash(trim($hash))) { // added users for shared file if (!empty($message['subscribers'])) { try { $subscribers = json_decode($message['subscribers'], true); if ($subscribers['groups']) { $users = []; $_groupsUsers = $this->connect->users()->getGroupsUsers(); foreach ($subscribers['groups'] as $group) { if (!empty($_groupsUsers[$group])) { $users = array_merge($users, array_map(function ($item) { return $item['uid']; }, $_groupsUsers[$group])); } } $shareUIds = array_merge($shareUIds, $users); } if ($subscribers['users']) { $shareUIds = array_merge($shareUIds, $subscribers['users']); } } catch (\Exception $e) { } } $userSender = $this->connect->users()->getByEmail($params['from']); if ($userSender) { $data['rid'] = $message['id']; $data['date'] = date("Y-m-d H:i:s", time()); $data['title'] = 'RE: ' . $message['title']; $data['text'] = $params['content']; $data['attachements'] = ''; $data['author'] = $userSender['userid']; $data['subscribers'] = $message['subscribers']; $data['hash'] = TalkMail::createHash($data['date']); $data['status'] = TalkMail::SEND_STATUS_REPLY; $insertResult = $this->connect->messages()->insertTask($data); if ($insertResult) { $returned['type'] = 'ok'; } } else { $returned['error'] = "User sender '{$userSender}' not find."; } } } //mail to if (!empty($idhash[1]) && !empty($shareUIds) && is_array($shareUIds)) { $message = $this->connect->messages()->getByHash($idhash[1]); $mailUser = $message['author']; if ($message['rid'] > 0) { $parentMessage = $this->connect->messages()->getById($message['rid']); if ($parentMessage) { array_push($shareUIds, $parentMessage['author']); } } $shareUIds = array_unique($shareUIds); foreach ($shareUIds as $uId) { if ($userDataFrom['userid'] == $uId) { continue; } $_userData = $this->connect->users()->getUserData($uId); if (!empty($_userData['email'])) { $subject = 'RE: ' . $message['title']; $body = Helper::renderPartial($this->appName, 'emails/answer_from_post', ['userName' => $mailUser, 'messageTitle' => 'Answer, RE: ' . $message['title'], 'messageAuthor' => $userDataFrom['userid'], 'messageBody' => $params['content'], 'mailDomain' => $this->mailDomain]); $error = TalkMail::send(['address' => $mailUser . '@' . $this->mailDomain, 'name' => $mailUser], ['address' => $mailUser . '+' . $idhash[1] . '@' . $this->mailDomain, 'name' => $mailUser], ['address' => $_userData['email'], 'name' => $_userData['displayname']], $subject, $body); } } } // Work with files if (isset($params['files']) && is_array($params['files']) && !empty($shareUIds) && $insertResult) { $saveFiles = $this->parserFileHandler($params['files'], $shareUIds); if (!empty($saveFiles)) { $returned['shared_with'] = $saveFiles['shared_with']; $returned['file_fileid'] = $saveFiles['file_fileid']; if (!empty($saveFiles['file_fileid'])) { $this->connect->update('*PREFIX*collab_messages', ['attachements' => json_encode($saveFiles['file_fileid'])], 'id = ?', [$insertResult]); } } else { $returned['shared'] = 'failed'; } } return new DataResponse($returned); }