diff --git a/server/controllers/system/get-setting.php b/server/controllers/system/get-setting.php new file mode 100644 index 00000000..daa46300 --- /dev/null +++ b/server/controllers/system/get-setting.php @@ -0,0 +1,30 @@ + 'any', + 'requestData' => [ + 'name' => [ + 'validation' => DataValidator::length(4), + 'error' => ERRORS::INVALID_SETTING + ] + ] + ]; + } + + public function handler() { + $setting = Setting::getSetting(Controller::request('name')); + + if (!$setting->isNull()) { + Response::respondSuccess([ + 'setting' => $setting->value + ]); + } else { + Response::respondError(ERRORS::INVALID_SETTING); + } + } +} \ No newline at end of file diff --git a/server/controllers/system/set-setting.php b/server/controllers/system/set-setting.php new file mode 100644 index 00000000..d142d578 --- /dev/null +++ b/server/controllers/system/set-setting.php @@ -0,0 +1,35 @@ + 'any', + 'requestData' => [ + 'name' => [ + 'validation' => DataValidator::length(4), + 'error' => ERRORS::INVALID_SETTING + ], + 'value' => [ + 'validation' => DataValidator::length(4), + 'error' => ERRORS::INVALID_SETTING + ] + ] + ]; + } + + public function handler() { + $setting = Setting::getSetting(Controller::request('name')); + + if (!$setting->isNull()) { + $setting->value = Controller::request('value'); + $setting->store(); + + Response::respondSuccess(); + } else { + Response::respondError(ERRORS::INVALID_SETTING); + } + } +} \ No newline at end of file diff --git a/server/controllers/ticket/create.php b/server/controllers/ticket/create.php index 7aeaa6e9..0fa2ccda 100644 --- a/server/controllers/ticket/create.php +++ b/server/controllers/ticket/create.php @@ -1,5 +1,4 @@ areCredentialsValid() || $this->isRememberTokenValid()) { + if ($this->checkInputCredentials() || $this->checkRememberToken()) { $this->createUserSession(); $this->createSessionCookie(); @@ -31,61 +30,61 @@ class LoginController extends Controller { } private function isAlreadyLoggedIn() { - return $this->getSession()->sessionExists(); + return Session::getInstance()->sessionExists(); } - private function areCredentialsValid() { - return ($this->getUserByInputCredentials() !== null); + private function checkInputCredentials() { + $this->userInstance = $this->getUserByInputCredentials(); + + return !$this->userInstance->isNull(); } - private function isRememberTokenValid() { - $rememberToken = Controller::request('rememberToken'); - - if ($rememberToken) { - $sessionCookie = SessionCookie::getDataStore($rememberToken, 'token'); - $userid = Controller::request('userId'); - - if ($sessionCookie !== null && $userid === $sessionCookie->user->id) { - $this->userInstance = $sessionCookie->user; - return true; - } - } + private function checkRememberToken() { + $this->userInstance = $this->getUserByRememberToken(); + + return !$this->userInstance->isNull(); } private function createUserSession() { - $this->getSession()->createSession($this->userInstance->id); + Session::getInstance()->createSession($this->userInstance->id); } private function getUserData() { - $userInstance = $this->getUserByInputCredentials(); + $userInstance = $this->userInstance; return array( 'userId' => $userInstance->id, 'userEmail' => $userInstance->email, - 'token' => $this->getSession()->getToken(), + 'token' => Session::getInstance()->getToken(), 'rememberToken' => $this->rememberToken ); } private function getUserByInputCredentials() { - if ($this->userInstance === null) { - $email = Controller::request('email'); - $password = Controller::request('password'); + $email = Controller::request('email'); + $password = Controller::request('password'); - $this->userInstance = User::authenticate($email, $password); + return User::authenticate($email, $password); + } + + private function getUserByRememberToken() { + $rememberToken = Controller::request('rememberToken'); + $userInstance = new NullDataStore(); + + if ($rememberToken) { + $sessionCookie = SessionCookie::getDataStore($rememberToken, 'token'); + $userId = Controller::request('userId'); + + if (!$sessionCookie->isNull() && $userId === $sessionCookie->user->id) { + $userInstance = new User($sessionCookie->user); + $sessionCookie->trash(); + } } - - return $this->userInstance; + + return $userInstance; } - private function getSession() { - if ($this->session === null) { - $this->session = Session::getInstance(); - } - - return $this->session; - } - private function createSessionCookie(){ + private function createSessionCookie() { $remember = Controller::request('remember'); if ($remember) { $this->rememberToken = Hashing::generateRandomToken(); diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 52e5ad95..0c01f73f 100644 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -8,5 +8,6 @@ class ERRORS { const INVALID_EMAIL = 'Invalid email'; const INVALID_PASSWORD = 'Invalid password'; const INVALID_NAME = 'Invalid name'; + const INVALID_SETTING = 'Invalid setting'; const INIT_SETTINGS_DONE = 'Settings already initialized'; } diff --git a/server/libs/MailSender.php b/server/libs/MailSender.php index 869b97c2..a2d5017d 100644 --- a/server/libs/MailSender.php +++ b/server/libs/MailSender.php @@ -4,12 +4,12 @@ class MailSender { private $mailOptions = []; public function __construct() { - $this->mailOptions['from'] = Setting::getSetting('no-reply-email'); + $this->mailOptions['from'] = Setting::getSetting('no-reply-email')->value; - $this->mailOptions['smtp-host'] = Setting::getSetting('smtp-host'); - $this->mailOptions['smtp-port'] = Setting::getSetting('smtp-host'); - $this->mailOptions['smtp-user'] = Setting::getSetting('smtp-host'); - $this->mailOptions['smtp-pass'] = Setting::getSetting('smtp-host'); + $this->mailOptions['smtp-host'] = Setting::getSetting('smtp-host')->value; + $this->mailOptions['smtp-port'] = Setting::getSetting('smtp-host')->value; + $this->mailOptions['smtp-user'] = Setting::getSetting('smtp-host')->value; + $this->mailOptions['smtp-pass'] = Setting::getSetting('smtp-host')->value; } public function setTemplate($type, $config) { diff --git a/server/models/DataStore.php b/server/models/DataStore.php index b2ce2d64..91c8750d 100644 --- a/server/models/DataStore.php +++ b/server/models/DataStore.php @@ -13,7 +13,7 @@ abstract class DataStore { ':value' => $value )); - return ($bean) ? new static($bean) : null; + return ($bean) ? new static($bean) : new NullDataStore(); } public function __construct($beanInstance = null) { @@ -80,4 +80,8 @@ abstract class DataStore { public function trash() { RedBean::trash($this->_bean); } + + public function isNull() { + return false; + } } diff --git a/server/models/MailTemplate.php b/server/models/MailTemplate.php index 14bf7fa0..bacab951 100644 --- a/server/models/MailTemplate.php +++ b/server/models/MailTemplate.php @@ -8,14 +8,14 @@ class MailTemplate extends DataStore { const USER_PASSWORD = 'USER_PASSWORD'; public static function getTemplate($type) { - $globalLanguage = Setting::getSetting('language'); + $globalLanguage = Setting::getSetting('language')->value; $bean = RedBean::findOne(MailTemplate::TABLE, 'type = :type AND language = :language', array( ':type' => $type, ':language' => $globalLanguage )); - return ($bean) ? new MailTemplate($bean) : null; + return ($bean) ? new MailTemplate($bean) : new NullDataStore(); } public static function getProps() { diff --git a/server/models/NullDataStore.php b/server/models/NullDataStore.php new file mode 100644 index 00000000..cef6a849 --- /dev/null +++ b/server/models/NullDataStore.php @@ -0,0 +1,21 @@ +_bean = null; + } + + public function isNull() { + return true; + } + + public function getProps() { + return []; + } + + public function store() { + return null; + } +} \ No newline at end of file diff --git a/server/models/Setting.php b/server/models/Setting.php index c6015d8d..0df2404b 100644 --- a/server/models/Setting.php +++ b/server/models/Setting.php @@ -4,9 +4,7 @@ class Setting extends DataStore { const TABLE = 'setting'; public static function getSetting($name) { - $dataStore = parent::getDataStore($name, 'name'); - - return ($dataStore !== null) ? $dataStore->value : null; + return parent::getDataStore($name, 'name'); } public static function getProps() { diff --git a/server/models/User.php b/server/models/User.php index 72359bca..186091c0 100644 --- a/server/models/User.php +++ b/server/models/User.php @@ -7,7 +7,7 @@ class User extends DataStore { public static function authenticate($userEmail, $userPassword) { $user = User::getUser($userEmail, 'email'); - return ($user && Hashing::verifyPassword($userPassword, $user->password)) ? $user : null; + return ($user && Hashing::verifyPassword($userPassword, $user->password)) ? $user : new NullDataStore(); } public static function getProps() { diff --git a/server/tests/__mocks__/BeanMock.php b/server/tests/__mocks__/BeanMock.php new file mode 100644 index 00000000..56d7568a --- /dev/null +++ b/server/tests/__mocks__/BeanMock.php @@ -0,0 +1,41 @@ +properties = $array; + } + + public function offsetSet($offset, $value) { + $this->__set($offset, $value); + } + + public function offsetExists($offset) { + return $this->__isset($offset); + } + + public function offsetUnset($offset) { + $this->__unset($offset); + } + + public function &offsetGet($offset) { + return $this->__get($offset); + } + + public function &__get($property) { + return $this->properties[$property]; + } + + public function __set($property, $value) { + $this->properties[$property] = $value; + } + + public function __isset($property) { + return isset($this->properties[$property]); + } + + public function __unset($property) { + unset($this->properties[$property]); + } +} \ No newline at end of file diff --git a/server/tests/__mocks__/NullDataStoreMock.php b/server/tests/__mocks__/NullDataStoreMock.php new file mode 100644 index 00000000..336afb06 --- /dev/null +++ b/server/tests/__mocks__/NullDataStoreMock.php @@ -0,0 +1,7 @@ + parent::stub(), 'store' => parent::stub(), - 'dispense' => parent::stub()->returns(array()) + 'dispense' => parent::stub()->returns(new \BeanMock()) )); } } diff --git a/server/tests/__mocks__/SettingMock.php b/server/tests/__mocks__/SettingMock.php new file mode 100644 index 00000000..8ea84900 --- /dev/null +++ b/server/tests/__mocks__/SettingMock.php @@ -0,0 +1,26 @@ + parent::stub()->returns(self::getSettingInstanceMock()), + 'setSetting' => parent::stub() + )); + } + + public function isNull() { + return false; + } + + private static function getSettingInstanceMock() { + $mockUserInstance = new BeanMock(); + + $mockUserInstance->name = 'MOCK_SETTING_NAME'; + $mockUserInstance->value = 'MOCK_SETTING_VALUE'; + + return $mockUserInstance; + } +} \ No newline at end of file diff --git a/server/tests/__mocks__/UserMock.php b/server/tests/__mocks__/UserMock.php index 112f7c6e..c8edb25a 100644 --- a/server/tests/__mocks__/UserMock.php +++ b/server/tests/__mocks__/UserMock.php @@ -7,9 +7,13 @@ class User extends \Mock { 'authenticate' => parent::stub()->returns(self::getUserInstanceMock()), )); } + + public function isNull() { + return false; + } private static function getUserInstanceMock() { - $mockUserInstance = new \stdClass(); + $mockUserInstance = new User(); $mockUserInstance->id = 'MOCK_ID'; $mockUserInstance->email = 'MOCK_EMAIL'; diff --git a/server/tests/controllers/user/loginTest.php b/server/tests/controllers/user/loginTest.php index 13d29800..0f78bc03 100644 --- a/server/tests/controllers/user/loginTest.php +++ b/server/tests/controllers/user/loginTest.php @@ -1,6 +1,7 @@ \Mock::stub()->returns(null) + 'authenticate' => \Mock::stub()->returns(new NullDataStore()) )); $this->loginController->handler(); diff --git a/server/tests/models/DataStoreTest.php b/server/tests/models/DataStoreTest.php index ebccd886..608ea9a3 100644 --- a/server/tests/models/DataStoreTest.php +++ b/server/tests/models/DataStoreTest.php @@ -1,5 +1,6 @@ \Mock::stub()->returns(array('TEST_PROP' => 'TEST_VALUE')) + 'findOne' => \Mock::stub()->returns(new BeanMock(['TEST_PROP' => 'TEST_VALUE'])) )); $dataStoreIntance = DataStoreMock::getDataStore('ID_VALUE'); diff --git a/server/tests/models/MailTemplateTest.php b/server/tests/models/MailTemplateTest.php index 95cdd476..db4ffbfe 100644 --- a/server/tests/models/MailTemplateTest.php +++ b/server/tests/models/MailTemplateTest.php @@ -1,12 +1,31 @@ \Mock::stub()->returns($this->getMockTemplateBean()) + ]); + } + public function testGetTemplateShouldReturnSpecifiedTemplate() { $mailTemplate = MailTemplate::getTemplate(MailTemplate::USER_SIGNUP); - $this->assertEquals(MailTemplate::USER_SIGNUP, $mailTemplate->type); + $this->assertEquals('TEST_TYPE', $mailTemplate->type); + $this->assertTrue(Redbean::get('findOne')->hasBeenCalledWithArgs('mailtemplate', 'type = :type AND language = :language', array( + ':type' => 'USER_SIGNUP', + ':language' => 'MOCK_SETTING_VALUE' + ))); } public function testCompilation() { @@ -24,4 +43,14 @@ class MailTemplateTest extends PHPUnit_Framework_TestCase { $this->assertEquals($result['subject'], 'Welcoming to cersei@opensupports.com'); $this->assertEquals($result['body'], 'Welcome, Cersei Lannister to our team'); } + + private function getMockTemplateBean() { + $mailTemplateBean = new BeanMock(); + $mailTemplateBean->type = 'TEST_TYPE'; + $mailTemplateBean->body = 'Some body'; + $mailTemplateBean->subject = 'Some subject'; + $mailTemplateBean->language = 'en'; + + return $mailTemplateBean; + } }