]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-5657 Added support in DB and services for disabled tenants. This is first...
authorPatrick Schmitz <pschmitz@berkeley.edu>
Fri, 7 Dec 2012 18:22:22 +0000 (10:22 -0800)
committerPatrick Schmitz <pschmitz@berkeley.edu>
Fri, 7 Dec 2012 18:22:22 +0000 (10:22 -0800)
services/JaxRsServiceProvider/src/main/webapp/WEB-INF/login.conf
services/account/jaxb/src/main/resources/accounts_common.xsd
services/account/pstore/src/main/resources/db/mysql/account.sql
services/account/pstore/src/main/resources/db/postgresql/account.sql
services/authentication/service/src/main/java/org/collectionspace/authentication/realm/CSpaceRealm.java
services/authentication/service/src/main/java/org/collectionspace/authentication/realm/db/CSpaceDbRealm.java
services/authentication/service/src/main/resources/config/login-config.xml
services/common/src/main/java/org/collectionspace/services/common/authorization_mgt/AuthorizationCommon.java
services/common/src/main/java/org/collectionspace/services/common/security/SecurityInterceptor.java

index 98ba006d2d3c9bb41f3098ce4846480ce5e26dd9..c8eddb09cf5a30011fd9ea376f26b6e249420371 100644 (file)
@@ -6,7 +6,8 @@ CSpaceJBossDBLoginModule {
        principalClass="org.collectionspace.authentication.CSpacePrincipal"\r
        principalsQuery="select passwd from users where username=?"\r
        rolesQuery="select r.rolename, 'Role' from roles as r, accounts_roles as ar where ar.user_id=? and ar.role_id=r.csid"\r
-       tenantsQuery="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id"\r
+       tenantsQueryWithDisabled="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id"\r
+       tenantsQueryNoDisabled="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id and NOT t.disabled"\r
        debug=true;\r
  };\r
  \r
@@ -18,6 +19,7 @@ CSpaceJBossDBLoginModule {
        principalClass="org.collectionspace.authentication.CSpacePrincipal"\r
        principalsQuery="select passwd from users where username=?"\r
        rolesQuery="select r.rolename, 'Role' from roles as r, accounts_roles as ar where ar.user_id=? and ar.role_id=r.csid"\r
-       tenantsQuery="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id"\r
+       tenantsQueryWithDisabled="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id"\r
+       tenantsQueryNoDisabled="select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id and NOT t.disabled"\r
        debug=true;\r
  };\r
index bde9eca831df96f88633322abdb43ced69664294..db61f45569d88e4247af2fe911a4656bbacfc562 100644 (file)
                     </xs:appinfo>
                 </xs:annotation>
             </xs:element>
+            <xs:element name="disabled" type="xs:boolean">
+                <xs:annotation>
+                    <xs:appinfo>
+                        <hj:basic>
+                            <orm:column name="disabled" nullable="false"/>
+                        </hj:basic>
+                    </xs:appinfo>
+                </xs:annotation>
+            </xs:element>
             <xs:element name="createdAt" type="xs:dateTime">
                 <xs:annotation>
                     <xs:appinfo>
index fd92a4110a2f3cb097228e9d3d10da87e74cac7c..b66c0949557bb7aa324ec98dd0dfaaf46bd1e24d 100644 (file)
@@ -4,5 +4,5 @@ drop table if exists accounts_tenants;
 drop table if exists tenants;
 create table accounts_common (csid varchar(128) not null, created_at datetime not null, email varchar(255) not null, metadata_protection varchar(255), mobile varchar(255), person_ref_name varchar(255), phone varchar(255), roles_protection varchar(255), screen_name varchar(128) not null, status varchar(15) not null, updated_at datetime, userid varchar(128) not null, primary key (csid));
 create table accounts_tenants (HJID bigint not null auto_increment, tenant_id varchar(128) not null, TENANTS_ACCOUNTSCOMMON_CSID varchar(128), primary key (HJID));
-create table tenants (id varchar(128) not null, created_at datetime not null, name varchar(255) not null, updated_at datetime, primary key (id));
+create table tenants (id varchar(128) not null, created_at datetime not null, name varchar(255) not null, disabled tinyint(1) not null, updated_at datetime, primary key (id));
 alter table accounts_tenants add index FKFDA649B05A9CEEB5 (TENANTS_ACCOUNTSCOMMON_CSID), add constraint FKFDA649B05A9CEEB5 foreign key (TENANTS_ACCOUNTSCOMMON_CSID) references accounts_common (csid);
index 49f81aede26f9b70ed9e7de328774b6f3afa36a9..ad9c8585b76cdbee8e1f513efdde0fc5789b510e 100644 (file)
@@ -5,6 +5,6 @@ DROP TABLE IF EXISTS tenants CASCADE;
 DROP SEQUENCE IF EXISTS hibernate_sequence;
 create table accounts_common (csid varchar(128) not null, created_at timestamp not null, email varchar(255) not null, mobile varchar(255), person_ref_name varchar(255), phone varchar(255), screen_name varchar(128) not null, status varchar(15) not null, updated_at timestamp, userid varchar(128) not null, metadata_protection varchar(255), roles_protection varchar(255), primary key (csid));
 create table accounts_tenants (HJID int8 not null, tenant_id varchar(128) not null, TENANTS_ACCOUNTSCOMMON_CSID varchar(128), primary key (HJID));
-create table tenants (id varchar(128) not null, created_at timestamp not null, name varchar(255) not null, updated_at timestamp, primary key (id));
+create table tenants (id varchar(128) not null, created_at timestamp not null, name varchar(255) not null, disabled boolean not null, updated_at timestamp, primary key (id));
 alter table accounts_tenants add constraint FKFDA649B05A9CEEB5 foreign key (TENANTS_ACCOUNTSCOMMON_CSID) references accounts_common;
 create sequence hibernate_sequence;
index d635916efb3e70a43521081e56153d62008ca3b5..c9336de06a5365baf752174453c5a6e367ab247f 100644 (file)
@@ -53,8 +53,14 @@ public interface CSpaceRealm {
 
     /**
      * Obtain the tenants for the authenticated user.
-     * @return collection containing the roles
+     * @return collection containing the tenants
      */
     public Collection<Group> getTenants(String username, String groupClassName) throws LoginException;
 
+    /**
+     * Obtain the tenants for the authenticated user, allowing access to disable tenants
+     * @return collection containing the tenants
+     */
+    public Collection<Group> getTenants(String username, String groupClassName, boolean includeDisabledTenants) throws LoginException;
+
 }
index 759de6a2b2483248733e90da8f8814803b74dfcb..3a3b6de485da8d8821a1f148bc7c333fc52ecf91 100644 (file)
@@ -88,7 +88,8 @@ public class CSpaceDbRealm implements CSpaceRealm {
     private String datasourceName;
     private String principalsQuery;
     private String rolesQuery;
-    private String tenantsQuery;
+    private String tenantsQueryNoDisabled;
+    private String tenantsQueryWithDisabled;
     private boolean suspendResume;
 
     /**
@@ -108,9 +109,13 @@ public class CSpaceDbRealm implements CSpaceRealm {
         if (tmp != null) {
             rolesQuery = tmp.toString();
         }
-        tmp = options.get("tenantsQuery");
+        tmp = options.get("tenantsQueryNoDisabled");
         if (tmp != null) {
-            tenantsQuery = tmp.toString();
+            tenantsQueryNoDisabled = tmp.toString();
+        }
+        tmp = options.get("tenantsQueryWithDisabled");
+        if (tmp != null) {
+               tenantsQueryWithDisabled = tmp.toString();
         }
         tmp = options.get("suspendResume");
         if (tmp != null) {
@@ -288,15 +293,21 @@ public class CSpaceDbRealm implements CSpaceRealm {
         return groupsMap.values();
 
     }
-
+    @Override
+    public Collection<Group> getTenants(String username, String groupClassName) throws LoginException {
+       return getTenants(username, groupClassName, false);
+    }
+    
     /**
      * Execute the tenantsQuery against the datasourceName to obtain the tenants for
      * the authenticated user.
      * @return collection containing the roles
      */
     @Override
-    public Collection<Group> getTenants(String username, String groupClassName) throws LoginException {
+    public Collection<Group> getTenants(String username, String groupClassName, boolean includeDisabledTenants) throws LoginException {
 
+       String tenantsQuery = getTenantQuery(includeDisabledTenants);
+       
         if (logger.isDebugEnabled()) {
             logger.debug("getTenants using tenantsQuery: " + tenantsQuery + ", username: " + username);
         }
@@ -308,10 +319,6 @@ public class CSpaceDbRealm implements CSpaceRealm {
 
         try {
             conn = getConnection();
-            // Get the user role names
-            if (logger.isDebugEnabled()) {
-                logger.debug("Executing query: " + tenantsQuery + ", with username: " + username);
-            }
 
             ps = conn.prepareStatement(tenantsQuery);
             try {
@@ -510,14 +517,14 @@ public class CSpaceDbRealm implements CSpaceRealm {
     /**
      * @return the tenantQuery
      */
-    public String getTenantQuery() {
-        return tenantsQuery;
+    public String getTenantQuery(boolean includeDisabledTenants) {
+        return includeDisabledTenants?tenantsQueryWithDisabled:tenantsQueryNoDisabled;
     }
 
     /**
      * @param tenantQuery the tenantQuery to set
-     */
     public void setTenantQuery(String tenantQuery) {
-        this.tenantsQuery = tenantQuery;
+        this.tenantsQueryNoDisabled = tenantQuery;
     }
+     */
 }
index 699cc5f6db20a179be993cc3a6a875692f3a0e30..948145332d31c3fff0c404b9c3b860f1ade2ba41 100644 (file)
@@ -147,7 +147,10 @@ $Revision: 64598 $
             <module-option name="rolesQuery">
                 select r.rolename, 'Role' from roles as r, accounts_roles as ar where ar.user_id=? and ar.role_id=r.csid
             </module-option>
-            <module-option name="tenantsQuery">
+            <module-option name="tenantsQueryNoDisabled">
+                select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id and NOT t.disabled
+            </module-option>
+            <module-option name="tenantsQueryWithDisabled">
                 select t.id, t.name, 'Tenants' from accounts_common as a, accounts_tenants as at, tenants as t where a.userid=? and a.csid = at.TENANTS_ACCOUNTSCOMMON_CSID and at.tenant_id = t.id
             </module-option>
         </login-module>
index 49975136b546f83cb11c094b2e22c041c52f1551..383d1466f7d1bd618138a84807d7d508d8f0773d 100644 (file)
@@ -401,7 +401,7 @@ public class AuthorizationCommon {
                        rs.close();\r
 \r
                String insertTenantSQL = \r
-                       "INSERT INTO tenants (id,name,created_at) VALUES (?,?, now())";\r
+                       "INSERT INTO tenants (id,name,disabled,created_at) VALUES (?,?,FALSE,now())";\r
                pstmt = conn.prepareStatement(insertTenantSQL); // create a statement\r
                for(String tId : tenantInfo.keySet()) {\r
                        if(existingTenants.contains(tId)) {\r
index 6cc1155053df2aa6eaf41438318d867d7f0ee44b..0b8c1839301020bdae09e31dae28f5bfb647ff0f 100644 (file)
@@ -180,7 +180,18 @@ public class SecurityInterceptor implements PreProcessInterceptor, PostProcessIn
         */
        private void checkActive() throws WebApplicationException {
                String userId = AuthN.get().getUserId();
-               String tenantId = AuthN.get().getCurrentTenantId(); //FIXME: REM - This variable 'tenantId' is never used.  Why?
+               try {
+                       // Need to ensure that user is associated to a tenant
+                       String tenantId = AuthN.get().getCurrentTenantId();
+               } catch (IllegalStateException ise) {
+                       String msg = "User's account is not associated to any active tenants, userId=" + userId;
+                       // Note the RFC on return types:
+                       // If the request already included Authorization credentials, then the 401 response 
+                       // indicates that authorization has been refused for those credentials.
+                       Response response = Response.status(
+                                       Response.Status.UNAUTHORIZED).entity(msg).type("text/plain").build();
+                       throw new WebApplicationException(ise, response);
+               }
                try {
                        //can't use JAXB here as this runs from the common jar which cannot
                        //depend upon the account service