diff --git a/classes/datalayer/UserDAO.php b/classes/datalayer/UserDAO.php index a91d6275c533887833f10825c1ecfc1c607f131e..da7064c583116bd843357f0ff7c212605f982fd2 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 14f8c0d283e118c7046821c260c7375f2a8fcbdf..cd533542abdb6f8756eb1ae8574ab10c1fcf5fa5 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 9ebdf218813fc5c4a75c31556d30e562734fbb1c..8403f655ac960758083f97a03c4dd45804a6305b 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 8f27e9c1a6627b31d705b7af90dcc663fdee83b6..6db4a514c497aca03a9e9af94e538cb9e9a1d3f4 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 49b10f7a071183b4b1ec29c92fd40d5567af0a30..0000000000000000000000000000000000000000 --- 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 5fd9f6db83a294a0fec9534fe1ad28f1439779be..3f0546170bc2db4d68382bc9d1e924d5caf63cf5 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;