From 8ce9dc8abe9e2fcba275d08ad5ac7f2957a38f72 Mon Sep 17 00:00:00 2001 From: Clark Andrianasolo Date: Mon, 19 Feb 2024 18:21:17 +0100 Subject: [PATCH] Work in progress --- .../main/scala/com/normation/rudder/users/User.scala | 2 +- .../com/normation/rudder/users/UserRepository.scala | 7 ++++++- .../liftweb/checks/migration/CheckTableUsers.scala | 12 +++++++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/User.scala b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/User.scala index 0009ad50501..90ef8fe30b2 100644 --- a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/User.scala +++ b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/User.scala @@ -115,7 +115,7 @@ case class UserSession( creationDate: DateTime, authMethod: String, permissions: List[String], - tenants: String, + tenants: String, // TODO: once https://github.com/Normation/rudder/pull/5391 is merged, change to List[TenantId] endDate: Option[DateTime], endCause: Option[String] ) diff --git a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/UserRepository.scala b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/UserRepository.scala index 41374503450..1941ab2e80a 100644 --- a/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/UserRepository.scala +++ b/webapp/sources/rudder/rudder-core/src/main/scala/com/normation/rudder/users/UserRepository.scala @@ -515,6 +515,7 @@ class InMemoryUserRepository(userBase: Ref[Map[String, UserInfo]], sessionBase: * endCause text */ class JdbcUserRepository(doobie: Doobie) extends UserRepository { + import JdbcUserRepository._ import com.normation.rudder.db.Doobie.DateTimeMeta import com.normation.rudder.db.json.implicits._ import com.normation.rudder.users.UserSerialization._ @@ -603,7 +604,7 @@ class JdbcUserRepository(doobie: Doobie) extends UserRepository { override def getLastPreviousLogin(userId: String): IOResult[Option[UserSession]] = { val sql = - sql"""select * from usersessions where userid = ${userId} and enddate is not null order by creationdate desc limit 1""" + sql"""select ${userSessionsAll} from usersessions where userid = ${userId} and enddate is not null order by creationdate desc limit 1""" transactIOResult(s"Error when retrieving information for previous session for '${userId}'")(xa => sql.query[UserSession].option.transact(xa) @@ -846,3 +847,7 @@ class JdbcUserRepository(doobie: Doobie) extends UserRepository { } } } + +object JdbcUserRepository { + val userSessionsAll: Fragment = fr"userid, sessionid, creationdate, authmethod, permissions, tenants, enddate, endcause" +} diff --git a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/checks/migration/CheckTableUsers.scala b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/checks/migration/CheckTableUsers.scala index 00c727953fa..db4e1754e6c 100644 --- a/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/checks/migration/CheckTableUsers.scala +++ b/webapp/sources/rudder/rudder-web/src/main/scala/bootstrap/liftweb/checks/migration/CheckTableUsers.scala @@ -48,6 +48,7 @@ import zio.interop.catz._ * During 7.3 cycle, we added the registration of users and their sessions in base. * This is to allows better security logs on user sessions + allows to de-correlate rudder * users from the `rudder-user.xml` file. + * In 8.1 we add the tenants column to the UserSessions table. */ class CheckTableUsers( doobie: Doobie @@ -55,7 +56,8 @@ class CheckTableUsers( import doobie._ - override def description: String = "Check if database tables Users and UserSessions exist" + override def description: String = + "Check if database tables Users and UserSessions exist and tenants column is present in UserSessions table." def createUserTables: IOResult[Unit] = { val sql1 = sql"""CREATE TABLE IF NOT EXISTS Users ( @@ -85,10 +87,18 @@ class CheckTableUsers( transactIOResult(s"Error with 'UserSessions' table creation")(xa => sql2.update.run.transact(xa)).unit } + def addTenantsColumn: IOResult[Unit] = { + val sql = sql"""ALTER TABLE UserSessions ADD COLUMN IF NOT EXISTS tenants text; + UPDATE UserSessions SET tenants = '' WHERE tenants IS NULL; + """ + transactIOResult(s"Error with 'UserSessions' table adding 'tenants' column")(xa => sql.update.run.transact(xa)).unit + } + override def checks(): Unit = { val prog = { for { _ <- createUserTables + _ <- addTenantsColumn } yield () }