From 947955ef0b1438aeb8c43c7318bde2e48dc5b4d7 Mon Sep 17 00:00:00 2001 From: Sonia Zorba Date: Mon, 28 Sep 2020 17:50:24 +0200 Subject: [PATCH] Added identity update at login --- classes/datalayer/UserDAO.php | 2 + classes/datalayer/mysql/MySQLUserDAO.php | 24 ++++++- classes/login/LoginHandler.php | 8 +++ classes/model/User.php | 9 +++ config-example.php | 86 ------------------------ index.php | 5 ++ 6 files changed, 46 insertions(+), 88 deletions(-) delete mode 100644 config-example.php diff --git a/classes/datalayer/UserDAO.php b/classes/datalayer/UserDAO.php index a91d627..da7064c 100644 --- a/classes/datalayer/UserDAO.php +++ b/classes/datalayer/UserDAO.php @@ -77,4 +77,6 @@ interface UserDAO { function joinUsers($userId1, $userId2); function isAdmin($userId): bool; + + function updateIdentity(Identity $identity): void; } diff --git a/classes/datalayer/mysql/MySQLUserDAO.php b/classes/datalayer/mysql/MySQLUserDAO.php index 14f8c0d..cd53354 100644 --- a/classes/datalayer/mysql/MySQLUserDAO.php +++ b/classes/datalayer/mysql/MySQLUserDAO.php @@ -159,17 +159,20 @@ class MySQLUserDAO extends BaseMySQLDAO implements UserDAO { . " WHERE i.user_id IN" . " (SELECT user_id FROM identity" . " WHERE `email` LIKE :email OR `email` LIKE :emailPart" - . " OR `eppn` = :eppn" + . " OR `eppn` LIKE :eppn" . " OR `name` LIKE :name OR `surname` LIKE :surname" . " OR CONCAT(`name`,' ',`surname`) LIKE :namesurname)"; $stmt = $dbh->prepare($query); $searchParam = $searchText . '%'; + if (count_chars($searchText) > 4) { + $searchParam = '%' . $searchParam; + } $emailPartSearchParam = '%.' . $searchText . '%'; $stmt->bindParam(':email', $searchParam); $stmt->bindParam(':emailPart', $emailPartSearchParam); - $stmt->bindParam(':eppn', $searchText); + $stmt->bindParam(':eppn', $searchParam); $stmt->bindParam(':name', $searchParam); $stmt->bindParam(':surname', $searchParam); $stmt->bindParam(':namesurname', $searchParam); @@ -281,4 +284,21 @@ class MySQLUserDAO extends BaseMySQLDAO implements UserDAO { return count($result) === 1; } + function updateIdentity(Identity $identity): void { + + $dbh = $this->getDBHandler(); + + $query = "UPDATE identity SET email = :email, name = :name, surname = :surname, institution = :institution" + . " WHERE id = :id"; + + $stmt = $dbh->prepare($query); + $stmt->bindParam(':email', $identity->email); + $stmt->bindParam(':name', $identity->name); + $stmt->bindParam(':surname', $identity->surname); + $stmt->bindParam(':institution', $identity->institution); + $stmt->bindParam(':id', $identity->id); + + $stmt->execute(); + } + } diff --git a/classes/login/LoginHandler.php b/classes/login/LoginHandler.php index 9ebdf21..8403f65 100644 --- a/classes/login/LoginHandler.php +++ b/classes/login/LoginHandler.php @@ -18,6 +18,8 @@ class LoginHandler { if ($user === null) { return $this->handleNewIdentity($typedId, $fillIdentityData); + } else { + $this->updateUser($user, $typedId, $fillIdentityData); } return $this->getAfterLoginRedirect($user); @@ -68,6 +70,12 @@ class LoginHandler { return $this->locator->getBasePath() . '/tou-check'; } + private function updateUser(User $user, string $typedId, \Closure $fillIdentityData): void { + $identity = $user->getIdentityByTypedId($typedId); + $fillIdentityData($identity); + $this->locator->getUserDAO()->updateIdentity($identity); + } + public function getAfterLoginRedirect(User $user): string { $session = $this->locator->getSession(); diff --git a/classes/model/User.php b/classes/model/User.php index 8f27e9c..6db4a51 100644 --- a/classes/model/User.php +++ b/classes/model/User.php @@ -42,6 +42,15 @@ class User { array_push($this->identities, $identity); } + public function getIdentityByTypedId(string $typedId): Identity { + foreach ($this->identities as $identity) { + if ($identity->typedId === $typedId) { + return $identity; + } + } + throw new \Exception("Identity not found for typed id " . $typedId); + } + public function getPrimaryEmail() { foreach ($this->identities as $identity) { if ($identity->primary) { diff --git a/config-example.php b/config-example.php deleted file mode 100644 index 49b10f7..0000000 --- a/config-example.php +++ /dev/null @@ -1,86 +0,0 @@ - 'http://localhost:8087/grouper', - 'title' => 'Login to Grouper', - 'logo' => 'grouper.png' - ), - array( - 'url' => 'http://localhost/rap-ia2/', - 'title' => 'Account Management', - 'logo' => 'account-manager.png' - ) -]; - -$DATABASE = array( - 'dbtype' => 'MySQL', - 'hostname' => 'localhost', - 'port' => 3306, - 'username' => 'XXXXXX', - 'password' => 'XXXXXX', - 'dbname' => 'rap' -); - -$AUTHENTICATION_METHODS = array( - 'eduGAIN' => array(), - 'Google' => array( - 'id' => "XXXXXX", - 'secret' => "XXXXXX", - 'callback' => $BASE_PATH . "/auth/social/google_token.php"), - 'Facebook' => array( - 'id' => "XXXXXX", - 'secret' => "XXXXXX", - 'version' => "v3.0", - 'callback' => $BASE_PATH . "/auth/social/facebook_token.php"), - 'LinkedIn' => array( - 'id' => 'XXXXXX', - 'secret' => 'XXXXXX', - 'callback' => $BASE_PATH . '/auth/social/linkedin_token.php' - ), - 'X.509' => array(), - 'DirectIdP' => array( - 'url' => 'https://sso.ia2.inaf.it/Shibboleth.sso/Login?entityID=https://sso.ia2.inaf.it/idp/shibboleth&target=https://sso.ia2.inaf.it/rap-ia2/auth/saml2/aai.php', - 'logo' => 'img/ia2-logo-60x60.png', - 'logo_alt' => 'IA2 logo', - 'description' => 'Use the IA2 Logo to Login if you have an account provided by IA2 or self registered' - ) -); - -$GROUPER = array( - 'wsURL' => 'http://hostname/grouper-ws/', - 'user' => 'XXXXXX', - 'password' => 'XXXXXX' -); diff --git a/index.php b/index.php index 5fd9f6d..3f05461 100644 --- a/index.php +++ b/index.php @@ -28,8 +28,13 @@ include './include/front-controller.php'; include './include/gui-backend.php'; include './include/rest-web-service.php'; +Flight::set('flight.log_errors', true); + // Error handling Flight::map('error', function($ex) { + if ($ex instanceof \Exception) { + error_log($ex->getTraceAsString()); + } if ($ex instanceof \RAP\BadRequestException) { http_response_code(400); echo "Bad request: " . $ex->message; -- GitLab