diff options
-rw-r--r-- | app/Core/Session.php | 16 | ||||
-rw-r--r-- | app/Model/Notification.php | 12 | ||||
-rw-r--r-- | app/Model/User.php | 3 | ||||
-rw-r--r-- | tests/units/NotificationTest.php | 67 | ||||
-rw-r--r-- | vendor/PicoDb/Table.php | 4 |
5 files changed, 95 insertions, 7 deletions
diff --git a/app/Core/Session.php b/app/Core/Session.php index c824ba64..6028f0b9 100644 --- a/app/Core/Session.php +++ b/app/Core/Session.php @@ -20,6 +20,18 @@ class Session const SESSION_LIFETIME = 0; // Until the browser is closed /** + * Return true if the session is open + * + * @static + * @access public + * @return boolean + */ + public static function isOpen() + { + return session_id() !== ''; + } + + /** * Open a session * * @access public @@ -50,14 +62,14 @@ class Session ini_set('session.hash_bits_per_character', 6); // If session was autostarted with session.auto_start = 1 in php.ini destroy it, otherwise we cannot login - if (isset($_SESSION)) - { + if (isset($_SESSION)) { session_destroy(); } // Custom session name session_name('__S'); + // Start the session session_start(); // Regenerate the session id to avoid session fixation issue diff --git a/app/Model/Notification.php b/app/Model/Notification.php index 89439f37..a7dd7fc0 100644 --- a/app/Model/Notification.php +++ b/app/Model/Notification.php @@ -2,6 +2,7 @@ namespace Model; +use Core\Session; use Core\Translator; use Core\Template; use Event\TaskNotificationListener; @@ -30,15 +31,22 @@ class Notification extends Base * Get the list of users to send the notification for a given project * * @access public - * @param integer $project_id Project id + * @param integer $project_id Project id + * @param array $exlude_users List of user_id to exclude * @return array */ - public function getUsersList($project_id) + public function getUsersList($project_id, array $exclude_users = array()) { + // Exclude the connected user + if (Session::isOpen()) { + $exclude_users[] = $this->acl->getUserId(); + } + $users = $this->db->table(User::TABLE) ->columns('id', 'username', 'name', 'email') ->eq('notifications_enabled', '1') ->neq('email', '') + ->notin('id', $exclude_users) ->findAll(); foreach ($users as $index => $user) { diff --git a/app/Model/User.php b/app/Model/User.php index c1a9dcc9..54588cbe 100644 --- a/app/Model/User.php +++ b/app/Model/User.php @@ -4,6 +4,7 @@ namespace Model; use SimpleValidator\Validator; use SimpleValidator\Validators; +use Core\Session; /** * User model @@ -205,7 +206,7 @@ class User extends Base $result = $this->db->table(self::TABLE)->eq('id', $values['id'])->update($values); // If the user is connected refresh his session - if (session_id() !== '' && $_SESSION['user']['id'] == $values['id']) { + if (Session::isOpen() && $_SESSION['user']['id'] == $values['id']) { $this->updateSession(); } diff --git a/tests/units/NotificationTest.php b/tests/units/NotificationTest.php new file mode 100644 index 00000000..72575c80 --- /dev/null +++ b/tests/units/NotificationTest.php @@ -0,0 +1,67 @@ +<?php + +require_once __DIR__.'/Base.php'; + +use Model\User; +use Model\Project; +use Model\Notification; + +class NotificationTest extends Base +{ + public function testGetUserList() + { + $u = new User($this->registry); + $p = new Project($this->registry); + $n = new Notification($this->registry); + + $this->assertEquals(1, $p->create(array('name' => 'UnitTest1'))); + $this->assertEquals(2, $p->create(array('name' => 'UnitTest2'))); + + // Email + Notifications enabled + $this->assertTrue($u->create(array('username' => 'user1', 'email' => 'user1@here', 'notifications_enabled' => 1))); + + // No email + Notifications enabled + $this->assertTrue($u->create(array('username' => 'user2', 'email' => '', 'notifications_enabled' => 1))); + + // Email + Notifications enabled + $this->assertTrue($u->create(array('username' => 'user3', 'email' => 'user3@here', 'notifications_enabled' => 1))); + + // No email + notifications disabled + $this->assertTrue($u->create(array('username' => 'user4'))); + + $users = $n->getUsersList(1); + $this->assertNotEmpty($users); + $this->assertEquals(2, count($users)); + $this->assertEquals('user1@here', $users[0]['email']); + $this->assertEquals('user3@here', $users[1]['email']); + + $users = $n->getUsersList(2); + $this->assertNotEmpty($users); + $this->assertEquals(2, count($users)); + $this->assertEquals('user1@here', $users[0]['email']); + $this->assertEquals('user3@here', $users[1]['email']); + + // User 3 choose to receive notification only for project 2 + $n->saveSettings(4, array('notifications_enabled' => 1, 'projects' => array(2 => true))); + + $users = $n->getUsersList(1); + $this->assertNotEmpty($users); + $this->assertEquals(1, count($users)); + $this->assertEquals('user1@here', $users[0]['email']); + + $users = $n->getUsersList(2); + $this->assertNotEmpty($users); + $this->assertEquals(2, count($users)); + $this->assertEquals('user1@here', $users[0]['email']); + $this->assertEquals('user3@here', $users[1]['email']); + + // User 1 excluded + $users = $n->getUsersList(1, array(2)); + $this->assertEmpty($users); + + $users = $n->getUsersList(2, array(2)); + $this->assertNotEmpty($users); + $this->assertEquals(1, count($users)); + $this->assertEquals('user3@here', $users[0]['email']); + } +} diff --git a/vendor/PicoDb/Table.php b/vendor/PicoDb/Table.php index cc637434..f13b4e11 100644 --- a/vendor/PicoDb/Table.php +++ b/vendor/PicoDb/Table.php @@ -350,7 +350,7 @@ class Table switch (strtolower($name)) { case 'in': - if (isset($arguments[1]) && is_array($arguments[1])) { + if (isset($arguments[1]) && is_array($arguments[1]) && ! empty($arguments[1])) { $sql = sprintf( '%s IN (%s)', @@ -361,7 +361,7 @@ class Table break; case 'notin': - if (isset($arguments[1]) && is_array($arguments[1])) { + if (isset($arguments[1]) && is_array($arguments[1]) && ! empty($arguments[1])) { $sql = sprintf( '%s NOT IN (%s)', |