From 0d964a3f0bf6500bd4878dae3b7d09c28f345bf2 Mon Sep 17 00:00:00 2001
From: ribeaudc <ribeaudc>
Date: Tue, 25 Nov 2008 21:19:59 +0000
Subject: [PATCH] change: - Make 'tryToAuthenticate' more robust.

SVN: 9100
---
 .../generic/server/AbstractServer.java        | 34 ++++++++++++++-----
 .../generic/server/GenericServerTest.java     | 13 +++++--
 2 files changed, 35 insertions(+), 12 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index dee839b2b81..bd726b7360e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -109,6 +109,19 @@ public abstract class AbstractServer<T extends IServer> implements IServer,
         return person;
     }
 
+    private final static PersonPE getSystemUser(final List<PersonPE> persons)
+    {
+        for (final PersonPE personPE : persons)
+        {
+            if (personPE.isSystemUser())
+            {
+                return personPE;
+            }
+        }
+        throw new IllegalStateException(String.format(
+                "No system user could be found in given list '%s'.", persons));
+    }
+
     protected final IGenericBusinessObjectFactory getBusinessObjectFactory()
     {
         return businessObjectFactory;
@@ -174,25 +187,28 @@ public abstract class AbstractServer<T extends IServer> implements IServer,
         }
         final Session session = sessionManager.getSession(sessionToken);
         final List<PersonPE> persons = daoFactory.getPersonDAO().listPersons();
+        assert persons.size() > 0 : "At least system user should be in the database";
+        // If only one user (system user), then this is the first logged user.
         final boolean isFirstLoggedUser = persons.size() == 1;
-        final PersonPE registrator = persons.get(0);
-        PersonPE personPE = daoFactory.getPersonDAO().tryFindPersonByUserId(user);
-        if (personPE == null)
+        final PersonPE systemUser = getSystemUser(persons);
+        PersonPE person = daoFactory.getPersonDAO().tryFindPersonByUserId(user);
+        if (person == null)
         {
-            personPE = createPerson(session.getPrincipal(), registrator);
+            person = createPerson(session.getPrincipal(), systemUser);
         } else
         {
-            HibernateUtils.initialize(personPE.getRoleAssignments());
+            HibernateUtils.initialize(person.getRoleAssignments());
         }
         if (session.tryGetPerson() == null)
         {
-            session.setPerson(personPE);
+            session.setPerson(person);
         }
         if (isFirstLoggedUser)
         {
-            final PersonPE person = session.tryGetPerson();
-            final RoleAssignmentPE roleAssignmentPE = createRoleAssigment(registrator, person);
-            person.setRoleAssignments(Collections.singleton(roleAssignmentPE));
+            // First logged user does have any role assignment yet. Make him database instance
+            // administrator.
+            final RoleAssignmentPE roleAssignment = createRoleAssigment(systemUser, person);
+            person.setRoleAssignments(Collections.singleton(roleAssignment));
             daoFactory.getPersonDAO().updatePerson(person);
         }
         return session;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
index ce9fa3a2e9e..7ea868bf873 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerTest.java
@@ -50,6 +50,13 @@ public final class GenericServerTest extends AbstractServerTestCase
         return new GenericServer(authenticationService, sessionManager, daoFactory, boFactory);
     }
 
+    private final static PersonPE createSystemUser()
+    {
+        final PersonPE systemPerson = new PersonPE();
+        systemPerson.setUserId(PersonPE.SYSTEM_USER_ID);
+        return systemPerson;
+    }
+
     @Test
     public void testLogout()
     {
@@ -88,7 +95,7 @@ public final class GenericServerTest extends AbstractServerTestCase
         final String user = "user";
         final String password = "password";
         final Session session = createExampleSession();
-        final PersonPE systemPerson = new PersonPE();
+        final PersonPE systemPerson = createSystemUser();
         final PersonPE person = createPersonFromPrincipal(PRINCIPAL);
         final RoleAssignmentPE roleAssignment = new RoleAssignmentPE();
         roleAssignment.setPerson(person);
@@ -129,7 +136,7 @@ public final class GenericServerTest extends AbstractServerTestCase
         final String user = "user";
         final String password = "password";
         final Session session = createExampleSession();
-        final PersonPE systemPerson = new PersonPE();
+        final PersonPE systemPerson = createSystemUser();
         final PersonPE person = createPersonFromPrincipal(PRINCIPAL);
         context.checking(new Expectations()
             {
@@ -163,7 +170,7 @@ public final class GenericServerTest extends AbstractServerTestCase
         final String user = "user";
         final String password = "password";
         final Session session = createExampleSession();
-        final PersonPE systemPerson = new PersonPE();
+        final PersonPE systemPerson = createSystemUser();
         final PersonPE person = createPersonFromPrincipal(PRINCIPAL);
         context.checking(new Expectations()
             {
-- 
GitLab