synergy/server/controller/UserCtrl.php (249 lines of code) (raw):

<?php namespace Synergy\Controller; use Synergy\DB\TribeDAO; use Synergy\DB\UserDAO; use Synergy\Model\CurlRequestResult; use Synergy\Model\Exception\CurlRequestException; use Synergy\Model\Exception\UserException; use Synergy\Model\User; use Synergy\Model\UsersResult; use Synergy\App\Synergy; /** * Description of UserCtrl * * @author lada */ class UserCtrl { private $tribeDao; private $speCtrl; private $userDao; private $runCtrl; function __construct() { $this->tribeDao = new TribeDAO(); $this->userDao = new UserDAO(); } private function getSpeCtrl() { if (is_null($this->speCtrl)) { $this->speCtrl = new SpecificationCtrl(); } return $this->speCtrl; } private function getRunCtrl() { if (is_null($this->runCtrl)) { $this->runCtrl = new RunCtrl(); } return $this->runCtrl; } /** * Removes specification from list of favorites of all users * @param int $id specification ID */ public function deleteFavoriteSpecification($id) { $this->userDao->deleteFavoriteSpecification($id); } /** * Returns user's id based on his username * @param String $username username * @return int User's ID or -1 if user was not found */ public function getUserIDbyUsername($username) { return $this->userDao->getUserIDbyUsername($username); } /** * Returns array of users with username matching %username% * @param string $username username * @return User[] */ public function findMatchingUsers($username) { return $this->userDao->findMatchingUsers($username); } /** * Returns true if user is member of tribe * @param int $uid User id * @param int $id Tribe id * @return boolean true if user is member of tribe */ public function isMemberOfTribe($uid, $id) { return $this->userDao->isMemberOfTribe($uid, $id); } /** * Add given specification to user's favorite list * @param int $userId user ID * @param int $specificationId specification ID */ public function addFavorite($userId, $specificationId) { $this->userDao->addFavorite($userId, $specificationId); } /** * Removes favorite specification for given user * @param int $userId user ID * @param int $specificationId specification ID */ public function removeFavorite($userId, $specificationId) { $this->userDao->removeFavorite($userId, $specificationId); } /** * Returns username for user given by id * @param int $id user ID * @return string */ public function getUsernameById($id) { return $this->userDao->getUsernameById($id); } /** * Returns list of users, results are paginated (first page is 1) * @param int $page page number * @return UsersResult */ public function findUsers($page) { return $this->userDao->findUsers($page); } /** * Removes all favorite specifications for given user * @param int $userId */ public function deleteFavorites($userId) { $this->userDao->deleteFavorites($userId); } /** * Removes user from system - membership, favorites, authorship, user, assignments * @param string $username username * @return boolean true if successful */ public function deleteUser($username) { $userId = $this->getUserIDbyUsername($username); $this->deleteFavorites($userId); $this->tribeDao->removeAllMemberships($userId); $this->tribeDao->removeLeader($userId); $this->getSpeCtrl()->deleteAuthorship($userId); $this->getSpeCtrl()->deleteOwnership($userId); $this->getRunCtrl()->deleteUsersAssignments($username); $this->userDao->deleteUser($userId, $username); return true; } /** * Updates user * @param string $firstName first name * @param string $lastName last name * @param string $role role * @param string $username username * @return boolean true if successful */ public function editUser($firstName, $lastName, $role, $username, $oldUsername, $emaiNotications, $email, $password) { $existingUser = $this->getUser($username); if ($username !== $oldUsername && !is_null($existingUser)) { throw new UserException('username already exists', '', ''); } $uid = $this->getUserIdByEmail($email); $uid2 = $this->getUserIDbyUsername($oldUsername); if ($uid > -1 && $uid !== $uid2) { throw new UserException("Wrong email", "email is already used"); } if (!isset($role) || strlen($role) < 1) { $role = $existingUser->role; } return $this->userDao->editUser($firstName, $lastName, $role, $username, $oldUsername, $emaiNotications, $email, $password); } /** * Creates new user * @param string $firstName first name * @param string $lastName last name * @param string $role role * @param string $username username * @return boolean true if successful */ public function createUser($firstName, $lastName, $role, $username, $email, $emailNotifications, $password) { $existingUser = $this->getUser($username); if (!is_null($existingUser)) { throw new UserException('username already exists', '', ''); } $uid = $this->getUserIdByEmail($email); if ($uid > -1) { throw new UserException("Wrong email", "email is already used"); } return $this->userDao->createUser($firstName, $lastName, $role, $username, $email, $emailNotifications, $password); } /** * Returns user * @param string $username username * @return User|null */ public function getUser($username) { return $this->userDao->getUser($username); } /** * Returns user for given user ID * @param int $userId * @return User|null */ public function getUserById($userId) { return $this->userDao->getUserById($userId); } /** * Returns list of all users inside single page result * @return UsersResult */ public function getAllUsers() { return $this->userDao->getAllUsers(); } /** * Edits username - only first and last name * @param type $firstName * @param type $lastName * @param type $username * @return boolean true if OK */ public function editUserSimple($firstName, $lastName, $username, $emailNotifications, $email, $password) { $uid = $this->getUserIdByEmail($email); $uid2 = $this->getUserIDbyUsername($username); if ($uid > -1 && $uid !== $uid2) { throw new UserException("Wrong email", "email is already used"); } return $this->userDao->editUserSimple($firstName, $lastName, $username, $emailNotifications, $email, $password); } /** * Imports users from given web service (endpoint) * @param String $url webservice URL to fetch data from * @return int number of imported users * @throws CurlRequestException */ public function importUsers($url) { $data = $this->requestUrlForUsers($url); if ($data->headers['http_code'] !== 200) { throw new CurlRequestException("Curl request failed", "Response from URL was " . $data->headers['http_code'], ""); } $users = json_decode($data->data); $createdUsers = 0; foreach ($users as $user) { if ($this->createImportedUser($user)) { $createdUsers++; } } return $createdUsers; } private function setRole($username, $role) { return $this->userDao->setRole($username, $role); } /** * Creates user from fetched data from web service. This actually only tries to * set firstName and lastName as good as possible and then call createUser() method * @param type $user * @return boolean true on user creation */ private function createImportedUser($user) { $u = new User($user->username); if (strlen($user->name) < 1 || strlen($user->username) < 1) { return false; } $existing = $this->getUser($u->username); if (!is_null($existing)) { $this->setRole($u->username, "tester"); return false; } $_t = explode(" ", $user->name); $u->firstName = $_t[0]; $namesCount = count($_t); switch ($namesCount) { case 1: $u->firstName = $_t[0]; $u->lastName = $_t[0]; break; case 2: $u->firstName = $_t[0]; $u->lastName = $_t[1]; break; default: $u->firstName = $_t[0]; $u->lastName = ""; for ($i = 0; $i < $namesCount - 1; $i++) { $u->lastName = $u->lastName . " " . $_t[$i + 1]; } break; } try { return $this->createUser($u->firstName, $u->lastName, "tester", $u->username); } catch (UserException $e) { // ignore return false; } } /** * Makes curl request to specified url * @param String $url * @return CurlRequestResult */ private function requestUrlForUsers($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); if (Synergy::hasProxy()) { curl_setopt($ch, CURLOPT_PROXY, Synergy::getProxy()); } // curl_setopt($ch, CURLOPT_PROXYPORT, 80); $data = curl_exec($ch); $result = new CurlRequestResult($data, curl_getinfo($ch)); curl_close($ch); return $result; } /** * Returns max 5 users with role "manager" * @return User */ public function getManagers() { return $this->userDao->getManagers(); } public function saveProfileImg($data, $fileName, $userId) { $currentImg = $this->getProfileImg($userId); try { date_default_timezone_set('UTC'); $timestamp = strtotime(date("Y-m-d H:i:s")); $fp = fopen(IMAGE_PATH . $timestamp . "_" . $fileName, 'w'); fwrite($fp, $data); fclose($fp); if (strlen($currentImg) > 1) { $this->userDao->removeProfileImg($userId); unlink(IMAGE_PATH . $currentImg); } $this->userDao->addProfileImg($userId, $timestamp . "_" . $fileName); return IMAGE_BASE . $timestamp . "_" . $fileName; } catch (Exception $e) { $er = print_r($e, true); $logger = Synergy::getProvider("logger"); $logger::log($er); return ""; } } public function deleteProfileImg($userId) { $currentImg = $this->getProfileImg($userId); if (strlen($currentImg) > 1) { $this->userDao->removeProfileImg($userId); unlink(IMAGE_PATH . $currentImg); } } public function retireUsers($roleToRetire) { return $this->userDao->retireUsers($roleToRetire); } public function getProfileImg($userId) { return $this->userDao->getProfileImgPath($userId); } public function getUserIdByEmail($email) { return $this->userDao->getUserIdByEmail($email); } public function resetPassword($username) { $s = $this->userDao->getUser($username); if (is_null($s)) { throw new UserException('User not found', 'User not found', ''); } if (is_null($s->email) || strlen($s->email) < 1) { throw new UserException('User does not have email address registered, please contact Synergy administrator', 'User does not have email address registered, please contact Synergy administrator', ''); } $newPassword = $this->generateRandomString(10); if ($this->userDao->changePassword($username, $newPassword)) { $emailProvider = Synergy::getProvider("email"); $b = "<div>Your password for Synergy account has been reset. Your new password is <strong>" . $newPassword . "</strong>. You can login <a href='http://netbeans-vm.apache.org/synergy/client/app/#/login'>here</a></div>"; $emailProvider->send($emailProvider->compose($b, "New Synergy password", $s->email)); return true; } return false; } private function generateRandomString($length) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } } ?>