/** * group given notification records per user * @param array &$recs * @return array */ function groupPerUsers(&$recs) { $rez = array(); foreach ($recs as $r) { $uid = $r['to_user_id']; if (!isset($rez[$uid])) { $rez[$uid] = User::getPreferences($uid); } $rez[$uid]['mails'][$r['id']] = $r; } return $rez; }
/** * test notifications module * * @return [type] [description] */ public function testNotifications() { //check if everything is prepeared $this->assertTrue(sizeof($this->userIds) > 3, 'Less than 4 users created'); $this->assertTrue(sizeof($this->objectIds) > 2, 'Less than 3 tasks created'); //add a comment to obj 1 with user 1 referencing user 2 $firstUserId = $this->userIds[0]; $secondUserId = $this->userIds[1]; $thirdUserId = $this->userIds[2]; $forthUserId = $this->userIds[3]; $rootUserId = $this->oldValues['user_id']; $pid = $this->objectIds[0]; $commentData = array('pid' => $pid, 'template_id' => 9, 'data' => array('_title' => 'Hello to user @bow!')); $_SESSION['user']['id'] = $firstUserId; /* make a check - user should be denied to add comments */ try { $commentId = $this->createObject($commentData); } catch (\Exception $e) { $msg = $e->getMessage(); $this->assertTrue($msg == 'Access is denied', $msg); } $_SESSION['user']['id'] = $rootUserId; $this->addAllowSecurityRule(); // try again adding a comment, // now it should work without access exceptions $_SESSION['user']['id'] = $firstUserId; $commentId = $this->createObject($commentData); $this->assertTrue(is_numeric($commentId), 'Wrong comment ID.'); //check notifications for user bow, //he should receive 2 new notifications from root and andrew $this->assertTrue($this->checkLastNotification($secondUserId, array('user_id' => $firstUserId, 'object_id' => $pid, 'read' => 0)), 'Wrong last notification'); //check notifications for root user, he also should receive a new notification from andrew //as owner of the object $this->assertTrue($this->checkLastNotification($rootUserId, array('user_id' => $firstUserId, 'object_id' => $pid, 'read' => 0)), 'No notification for root (owner) user.'); //add comments with all 4 users and check notifications to cover //code for 3 and more users notifications grouping //and check root notifications with each comment for ($i = 0; $i < 4; $i++) { $_SESSION['user']['id'] = $this->userIds[$i]; $commentData['data']['_title'] = 'Comment from user #' . $i . '.'; $this->createObject($commentData); $this->assertTrue($this->checkLastNotification($rootUserId, array('user_id' => $this->userIds[$i], 'object_id' => $pid, 'read' => 0)), 'Wrong last notification for root from user #' . $i . '.'); } $_SESSION['user']['id'] = $rootUserId; /*-------- answer back to previous comment with root and see if notifications are created */ $commentData['data']['_title'] = 'Reply to Hellow comment.'; $commentId = $this->createObject($commentData); //check notifications for all 4 users for ($i = 0; $i < 3; $i++) { $this->assertTrue($this->checkLastNotification($this->userIds[$i], array('object_id' => $pid, 'read' => 0)), 'Wrong last notification from root for user #' . $i . '.'); } $this->checkMarkingNotificationsAsRead(); //end of big testing schema //cover for now some simple code from Notifications $this->assertTrue(\CB\Notifications::getActionDeclination('reopen', 'en') == 'reopened', 'Declination not correct for reopen.'); $this->assertTrue(\CB\Notifications::getActionDeclination('SomeWrongValue!>', 'en') == 'SomeWrongValue!>', 'Declination not correct for a wrong value.'); $this->assertTrue(\CB\Notifications::getActionDeclination('file_upload', 'en') == 'uploaded a file to', 'Declination not correct for file_upload.'); $this->assertTrue(\CB\Notifications::getActionDeclination('file_update', 'en') == 'updated a file in', 'Declination not correct for file_update.'); //update a task and delete them all $obj = \CB\Objects::getCachedObject($pid); $data = $obj->getData(); $data['data']['due_date'] = '2012-12-17T00:00:00Z'; unset($data['data']['importance']); $data['data']['description'] .= ' *update* '; $obj->update($data); foreach ($this->objectIds as $id) { $obj->delete(false); } //get unset notifications and and access functions for preparing email $recs = DM\Notifications::getUnsent(); foreach ($recs as $action) { $userData = \CB\User::getPreferences($action['to_user_id']); $sender = \CB\Notifications::getSender($action['from_user_id']); $body = \CB\Notifications::getMailBodyForAction($action, $userData); } }
/** * Check if user_id (or current loged user) can add groups * * @param int $userId * @return boolean */ public static function canAddGroup($userId = false) { if (Security::isAdmin($userId)) { return true; } $userData = $userId === false ? $_SESSION['user'] : User::getPreferences($userId); return !empty($userData['cfg']['canAddGroups']); }
/** * get timezone for a given user id * @param int $userId * @return varchar */ public static function getTimezone($userId = false) { $rez = 'UTC'; $pref = @$_SESSION['user']; if ($userId !== false) { $pref = User::getPreferences($userId); } if (!empty($pref['cfg']['timezone']) && System::isValidTimezone($pref['cfg']['timezone'])) { $rez = $pref['cfg']['timezone']; } return $rez; }
/** * send recovery password email for given user id * so that the user can set new password and enter the system * @param int $userId * @return boolean */ public static function sendResetPasswordMail($userId, $template = 'recover') { if (!is_numeric($userId) || User::isLoged() && !Security::canEditUser($userId)) { return false; } $mail = ''; $subject = ''; switch ($template) { case 'invite': $mail = System::getEmailTemplate('email_invite'); $subject = L\get('MailInviteSubject'); break; case 'recover': $mail = System::getEmailTemplate('password_recovery_email'); $subject = L\get('MailRecoverSubject'); break; default: return false; } if (empty($mail)) { return false; } $userData = User::getPreferences($userId); $userEmail = User::getEmail($userData); if (empty($userEmail)) { return false; } /* generating invite hash and sending mail */ $hash = User::generateRecoveryHash($userId, $userId . $userEmail . date(DATE_ISO8601)); $href = Util\getCoreHost() . 'recover/reset-password/?h=' . $hash; /* replacing placeholders in template and subject */ $replacements = array('{projectTitle}' => Config::getProjectName(), '{fullName}' => User::getDisplayName($userData), '{username}' => User::getUsername($userData), '{userEmail}' => $userEmail, '{creatorFullName}' => User::getDisplayName(), '{creatorUsername}' => User::getUsername(), '{creatorEmail}' => User::getEmail(), '{href}' => $href, '{link}' => '<a href="' . $href . '" >' . $href . '</a>'); $search = array_keys($replacements); $replace = array_values($replacements); $mail = str_replace($search, $replace, $mail); $subject = str_replace($search, $replace, $subject); return @System::sendMail($userEmail, $subject, $mail); }
if (empty($user_id)) { $_SESSION['e_msg'] = L\get('EmailNotFound'); header('location: ' . $coreUrl . 'recover/forgot-password/'); exit(0); } } else { $_SESSION['e_msg'] = L\get('InvalidEmail'); } } elseif (!empty($u)) { $user_id = DM\Users::getIdByName($u); if (empty($user_id)) { $_SESSION['u_msg'] = L\get('UsernameNotFound'); header('location: ' . $coreUrl . 'recover/forgot-password/'); exit(0); } else { $user = User::getPreferences($user_id); $user_mail = empty($user['cfg']['security']['recovery_email']) ? $user['email'] : $user['cfg']['security']['recovery_email']; if (empty($user_mail)) { $_SESSION['u_msg'] = L\get('UserHasNoMail'); header('location: ' . $coreUrl . 'recover/forgot-password/'); exit(0); } } } if (!UsersGroups::sendResetPasswordMail($user_id)) { $_SESSION['msg'] = '<div class="alert alert-error">Error occured. Administrator has been notified by mail. Please retry later.</div>'; header('location: ' . $coreUrl . 'recover/forgot-password/'); exit(0); } $_SESSION['msg'] = '<div class="alert alert-success">' . L\get('RecoverMessageSent') . '</div>'; break;
exit; } L\initTranslations(); $users = array(); $coreName = Config::get('core_name'); $coreUrl = Config::get('core_url'); $languages = Config::get('languages'); $adminEmail = Config::get('ADMIN_EMAIL'); //send notification mails only if not in dev mode or _dev_sent_mails not set to 0 $sendNotificationMails = Config::get('_dev_mode', 0) == 0 || Config::get('_dev_send_mail', 1) == 1; //collect notifications to be sent $recs = DM\Notifications::getUnsent(); foreach ($recs as $r) { $uid = $r['to_user_id']; if (!isset($users[$uid])) { $users[$uid] = User::getPreferences($uid); } $users[$uid]['mails'][$r['id']] = $r; } //iterate mails for each user and send them foreach ($users as $u) { if (empty($u['email'])) { continue; } $lang = $languages[$u['language_id'] - 1]; if (filter_var($u['email'], FILTER_VALIDATE_EMAIL)) { foreach ($u['mails'] as $notificationId => $action) { //[$core #$nodeId] $action_type $template_name: $object_title $templateId = Objects::getTemplateId($action['object_id']); $templateName = Objects::getName($templateId); $subject = '[' . $coreName . ' #' . $action['object_id'] . '] ' . Notifications::getActionDeclination($action['action_type'], $lang) . ' ' . $templateName . ' "' . htmlspecialchars_decode($action['data']['name']) . '"';