Author: ivol37 at gmail.com
Date: Tue Feb  1 10:07:35 2011
New Revision: 736

Log:
[AMDATU-84] Fixed proper tenant awareness of login service, login gadget and 
useradmin REST services

Modified:
   
branches/amdatu-dispatcher/amdatu-authorization/login-gadget/src/main/resources/jsp/LoginGadget.jsp
   
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/osgi/Activator.java
   
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/service/LoginServiceImpl.java
   
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/osgi/Activator.java
   
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/service/ResourceBase.java
   
branches/amdatu-dispatcher/amdatu-core/tenantuseradmindecorator/src/main/java/org/amdatu/core/tenantuseradmindecorator/service/TenantUserAdminDecorator.java

Modified: 
branches/amdatu-dispatcher/amdatu-authorization/login-gadget/src/main/resources/jsp/LoginGadget.jsp
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-authorization/login-gadget/src/main/resources/jsp/LoginGadget.jsp
 (original)
+++ 
branches/amdatu-dispatcher/amdatu-authorization/login-gadget/src/main/resources/jsp/LoginGadget.jsp
 Tue Feb  1 10:07:35 2011
@@ -71,14 +71,14 @@
         gadgets.window.adjustHeight();
       }
 
-      function showLogoutBox(username, hostname, hostip) {
+      function showLogoutBox(username, hostname, tenantid, tenantname) {
         document.getElementById("login").style.visibility = "hidden";
         document.getElementById("login").style.display = "none";
         document.getElementById("logout").style.visibility = "";
         document.getElementById("logout").style.display = "";
         var userdiv = document.getElementById("logout");
         userdiv.innerHTML = "<p>You are currently logged in as " + username +
-          " on " + hostname + " (" + hostip + ")<br/><br/>" +
+          " on tenant '" + tenantname + "' (id: '" + tenantid + "')<br/><br/>" 
+
           "<input type='submit' value='Logout' onclick='javascript:logout()' 
/></p>";
         gadgets.window.adjustHeight();
       }
@@ -98,7 +98,7 @@
           async:true,
           success: function(response) {
               if (response.result != null && response.result == 'ok') {
-                showLogoutBox(response.username, response.hostname, 
response.hostid);
+                showLogoutBox(response.username, response.hostname, 
response.tenantid, response.tenantname);
               } else {
                 var errorMsg = "An unexpected error occurred";
                 if (response.msg) {
@@ -147,7 +147,7 @@
           async:true,
           success: function(response) {
               if (response.username != null) {
-                showLogoutBox(response.username, response.hostname, 
response.hostid);
+                showLogoutBox(response.username, response.hostname, 
response.tenantid, response.tenantname);
               } else {
                 showLoginBox();
               }

Modified: 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/osgi/Activator.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/osgi/Activator.java
      (original)
+++ 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/osgi/Activator.java
      Tue Feb  1 10:07:35 2011
@@ -20,6 +20,7 @@
 import org.amdatu.authorization.login.service.LoginService;
 import org.amdatu.authorization.login.service.service.LoginServiceImpl;
 import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.libraries.utilities.osgi.ServiceDependentActivator;
 import org.amdatu.web.httpcontext.HttpContextServiceFactory;
 import org.amdatu.web.rest.jaxrs.JaxRsSpi;
@@ -57,7 +58,7 @@
                 
.add(createServiceDependency().setService(HttpContextServiceFactory.class).setRequired(true))
                 
.add(createServiceDependency().setService(TokenProvider.class).setRequired(true))
                 
.add(createServiceDependency().setService(LogService.class).setRequired(true))
-                
.add(createServiceDependency().setService(UserAdmin.class).setRequired(true))); 
       
+                
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true)));
        
     }
 
     @Override

Modified: 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/service/LoginServiceImpl.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/service/LoginServiceImpl.java
    (original)
+++ 
branches/amdatu-dispatcher/amdatu-authorization/login-service/src/main/java/org/amdatu/authorization/login/service/service/LoginServiceImpl.java
    Tue Feb  1 10:07:35 2011
@@ -42,6 +42,9 @@
 import org.amdatu.authentication.tokenprovider.TokenProviderException;
 import org.amdatu.authorization.login.service.LoginService;
 import org.amdatu.authorization.login.service.osgi.Activator;
+import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.tenant.TenantException;
+import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.web.httpcontext.HttpContextServiceFactory;
 import org.amdatu.web.httpcontext.ResourceProvider;
 import org.apache.felix.dm.Component;
@@ -61,229 +64,242 @@
  */
 @Path("authorization")
 public class LoginServiceImpl implements ResourceProvider, LoginService {
-    // Default Administrator user credentials
-    private static final String DEFAULT_USERNAME = "Administrator";
-    private static final String DEFAULT_PASSWORD = "Administrator";
-    private static final String DEFAULT_ADMIN_GROUP = "Administrators";
-
-    // Service dependencies, injected by the Felix dependency manager
-    private volatile LogService m_logService;
-    private volatile BundleContext m_bundleContext;
-    private volatile HttpContextServiceFactory m_httpContextServiceFactory;
-    private volatile UserAdmin m_userAdmin;
-    private volatile TokenProvider m_tokenProvider;
-
-    // The private HTTP context service for this bundle
-    private Component m_httpContextComponent;
-
-    // Disable HTTP caching in this REST interface
-    private static CacheControl m_cacheControl;
-    static {
-        m_cacheControl = new CacheControl();
-        m_cacheControl.setNoCache(true);
-    }
-
-    /**
-     * The init() method is invoked by the Felix dependency manager.
-     */
-    public void init() {
-        // Create our own http context service which registers static 
resources and JSPs automatically
-        m_httpContextComponent = 
m_httpContextServiceFactory.create(m_bundleContext, this);
-
-        m_logService.log(LogService.LOG_INFO, getClass().getName() + " service 
initialized");
-    }
-
-    @SuppressWarnings("unchecked")
-    public void start() {
-        // If we don't have a user named 'Administrator' for this tenant, we 
create one now.
-        if (m_userAdmin.getRole(DEFAULT_USERNAME) == null) {
-            User adminUser = (User) m_userAdmin.createRole(DEFAULT_USERNAME, 
Role.USER);
-            if (adminUser != null) {
-                adminUser.getCredentials().put(PASSWORD_CREDENTIAL_KEY, 
DEFAULT_PASSWORD);
-                adminUser.getProperties().put(USER_NAME_CREDENTIAL_KEY, 
DEFAULT_USERNAME);
-                Group adminGroup = (Group) 
m_userAdmin.createRole(DEFAULT_ADMIN_GROUP, Role.GROUP);
-                adminGroup.addMember(adminUser);
-            }
-            else {
-                m_logService.log(LogService.LOG_ERROR, "Failed to create 
initial user " + DEFAULT_USERNAME);
-            }
-        }
-    }
-
-    // The destroy() method is automatically invoked by the Felix dependency 
manager
-    public void destroy() {
-        // Stop the HTTP context service we created ourselves
-        m_httpContextComponent.stop();
-    }
-
-    /**
-     * This method can be used to check the availability of the Login Service.
-     * 
-     * @return The text "Login service online"
-     */
-    @GET
-    @Produces( { MediaType.TEXT_PLAIN })
-    public String status() {
-        return "Login service online";
-    }
-
-    /**
-     * This REST service returns the current login status. Returns the 
username of the current user is logged in or an
-     * empty string if the user is not logged in.
-     */
-    @GET
-    @Path("status")
-    @Produces( { MediaType.APPLICATION_JSON })
-    public Response getLoginStatus(@Context final HttpServletRequest request) {
-        // TODO: here we have the authorization of this user, but to which 
context should we bind
-        // it? And what about oAuth? For now we just bind it to the http 
session and use the
-        // session info in the container. Note that we use our own http 
session implementation
-        // because of issue AMDATU-67.
-        JSONObject jsonObject = new JSONObject();
-        try {
-            String userName = getUserName(request);
-            if (userName != null) {
-                jsonObject.append("username", userName);
-                jsonObject.append("hostname", request.getServerName());
-                jsonObject.append("hostid", request.getLocalAddr());
-                return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl)
-                .build();
-            }
-        }
-        catch (JSONException e) {
-            m_logService.log(LogService.LOG_ERROR, "Could not retrieve current 
login status", e);
-        }
-        catch (TokenProviderException e) {
-            // If the token is invalid, the user is not logged in anymore, 
ignore this error
-        }
-        catch (InvalidTokenException e) {
-            // If the token is invalid, the user is not logged in anymore, 
ignore this error
-        }
-        return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl).build();
-    }
-
-    /**
-     * REST based login service with username/password.
-     */
-    @POST
-    @Path("login")
-    @Consumes("application/x-www-form-urlencoded")
-    @Produces( { MediaType.APPLICATION_JSON })
-    public Response login(@FormParam("username") final String username, 
@FormParam("password") final String password,
-        @Context final HttpServletRequest request) {
-        m_logService.log(LogService.LOG_INFO, "Login requested for user: " + 
username);
-
-        // First retrieve the user with this username
-        JSONObject jsonObject = new JSONObject();
-        NewCookie cookie = null;
-        try {
-            Role userRole = m_userAdmin.getRole(username);
-            if (userRole != null && userRole.getType() == Role.USER) {
-                User user = (User) userRole;
-                if (user.hasCredential(PASSWORD_CREDENTIAL_KEY, password)) {
-                    // Now generate a token for this user and write it to a 
Set-Cookie header
-                    String token = generateToken(request, user);
-                    cookie = new NewCookie(TokenProvider.TOKEN_COOKIE_NAME, 
token, "/", null, "Amdatu session", -1, false);
-
-                    m_logService.log(LogService.LOG_INFO, "User '" + username 
+ "' logged in successfully");
-                    jsonObject.append("result", "ok");
-                    jsonObject.append("username", username);
-                    jsonObject.append("hostname", request.getServerName());
-                    jsonObject.append("hostid", request.getLocalAddr());
-                    jsonObject.append("msg", "User '" + username + "' logged 
in successfully");
-
-                }
-                else {
-                    m_logService.log(LogService.LOG_INFO, "Incorrect password 
provided for user '" + username + "'");
-                    jsonObject.append("result", "failed");
-                    jsonObject.append("msg", "Password is incorrect");
-                }
-            }
-            else {
-                m_logService.log(LogService.LOG_INFO, "Username '" + username 
+ "' unknown");
-                jsonObject.append("result", "failed");
-                jsonObject.append("msg", "Username is unknown");
-            }
-        }
-        catch (JSONException e) {
-            m_logService.log(LogService.LOG_ERROR, "Could not retrieve current 
login status", e);
-            throw new WebApplicationException(e, 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        }
-        catch (TokenProviderException e) {
-            m_logService.log(LogService.LOG_ERROR, "Could not retrieve current 
login status", e);
-            throw new WebApplicationException(e, 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
-        }
-
-        ResponseBuilder builder = Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE);
-        builder.cacheControl(m_cacheControl);
-        if (cookie != null) {
-            builder.cookie(cookie);
-        }
-        return builder.build();
-    }
-
-    /**
-     * REST based logout service with username/password.
-     * 
-     * @return The result of the SPARQL query.
-     */
-    @POST
-    @Path("logout")
-    @Produces( { MediaType.APPLICATION_JSON })
-    public Response logout(@Context final HttpServletRequest request) {
-        // TODO: here we have the authorization of this user, but to which 
context should we bind
-        // it? And what about oAuth? For now we just bind it to the http 
session and use the
-        // session info in the container. Note that we use our own http 
session implementation
-        // because of issue AMDATU-67.
-        JSONObject jsonObject = new JSONObject();
-        String userName = null;
-        try {
-            userName = getUserName(request);
-            invalidateToken(request);
-            m_logService.log(LogService.LOG_INFO, "User '" + userName + "' 
logged out successfully");
-            jsonObject.append("result", "ok");
-        }
-        catch (JSONException e) {
-            m_logService.log(LogService.LOG_ERROR, "Could not retrieve current 
login status", e);
-        }
-        catch (TokenProviderException e) {
-            m_logService.log(LogService.LOG_INFO, "User '" + userName + "' 
could not be logged out");
-        }
-        catch (InvalidTokenException e) {
-            m_logService.log(LogService.LOG_INFO, "User '" + userName + "' not 
logged out, token was already invalid");
-        }
-        return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl).build();
-    }
-
-    public URL getResource(String name) {
-        return null;
-    }
-
-    public String getResourceId() {
-        return Activator.RESOURCE_ID;
-    }
-
-    private String generateToken(HttpServletRequest request, User user) throws 
TokenProviderException {
-        SortedMap<String, String> attributes = new TreeMap<String, String>();
-        attributes.put("ip", request.getRemoteAddr());
-        attributes.put(TokenProvider.USERNAME, user.getName());
-        return m_tokenProvider.generateToken(attributes);
-    }
-
-    private String getUserName(HttpServletRequest request) throws 
TokenProviderException, InvalidTokenException {
-        String token = m_tokenProvider.getTokenFromRequest(request);
-        if (token != null) {
-            // Now decrypt to get the username and signature
-            Map<String, String> attributes = 
m_tokenProvider.verifyToken(token);
-            if (attributes != null) {
-                return attributes.get(TokenProvider.USERNAME);
-            }
-        }
-
-        return null;
-    }
-
-    private void invalidateToken(HttpServletRequest request) {
-        
m_tokenProvider.invalidateToken(m_tokenProvider.getTokenFromRequest(request));
-    }
+       // Default Administrator user credentials
+       private static final String DEFAULT_USERNAME = "Administrator";
+       private static final String DEFAULT_PASSWORD = "Administrator";
+       private static final String DEFAULT_ADMIN_GROUP = "Administrators";
+
+       // Service dependencies, injected by the Felix dependency manager
+       private volatile LogService m_logService;
+       private volatile BundleContext m_bundleContext;
+       private volatile HttpContextServiceFactory m_httpContextServiceFactory;
+       private volatile UserAdmin m_userAdmin;
+       private volatile TokenProvider m_tokenProvider;
+       protected volatile TenantManagementService m_tenantManagementService;
+
+       // The private HTTP context service for this bundle
+       private Component m_httpContextComponent;
+       private  Tenant m_tenant;
+
+       // Disable HTTP caching in this REST interface
+       private static CacheControl m_cacheControl;
+       static {
+               m_cacheControl = new CacheControl();
+               m_cacheControl.setNoCache(true);
+       }
+
+       /**
+        * The init() method is invoked by the Felix dependency manager.
+        * @throws TenantException 
+        */
+       public void init(Component component) throws TenantException {
+               // Create our own http context service which registers static 
resources and JSPs automatically
+               m_httpContextComponent = 
m_httpContextServiceFactory.create(m_bundleContext, this);
+
+               // Retrieve the tenant
+               String tenantId = (String) 
component.getServiceProperties().get("tenant_id");
+               m_tenant = m_tenantManagementService.getTenantById(tenantId);
+
+               m_logService.log(LogService.LOG_INFO, getClass().getName() + " 
service initialized for tenant '" + tenantId + "'");
+       }
+
+       @SuppressWarnings("unchecked")
+       public void start() {
+               // If we don't have a user named 'Administrator' for this 
tenant, we create one now.
+               if (m_userAdmin.getRole(DEFAULT_USERNAME) == null) {
+                       User adminUser = (User) 
m_userAdmin.createRole(DEFAULT_USERNAME, Role.USER);
+                       if (adminUser != null) {
+                               
adminUser.getCredentials().put(PASSWORD_CREDENTIAL_KEY, DEFAULT_PASSWORD);
+                               
adminUser.getProperties().put(USER_NAME_CREDENTIAL_KEY, DEFAULT_USERNAME);
+                               Group adminGroup = (Group) 
m_userAdmin.createRole(DEFAULT_ADMIN_GROUP, Role.GROUP);
+                               adminGroup.addMember(adminUser);
+                               m_logService.log(LogService.LOG_INFO, "No users 
available in tenant '" + m_tenant.getId() 
+                                               + "'. Default user created!");
+                       }
+                       else {
+                               m_logService.log(LogService.LOG_ERROR, "Failed 
to create initial user " + DEFAULT_USERNAME);
+                       }
+               }
+       }
+
+       // The destroy() method is automatically invoked by the Felix 
dependency manager
+       public void destroy() {
+               // Stop the HTTP context service we created ourselves
+               m_httpContextComponent.stop();
+       }
+
+       /**
+        * This method can be used to check the availability of the Login 
Service.
+        * 
+        * @return The text "Login service online"
+        */
+       @GET
+       @Produces( { MediaType.TEXT_PLAIN })
+       public String status() {
+               return "Login service for tenant '" + m_tenant.getName() + "' 
online";
+       }
+
+       /**
+        * This REST service returns the current login status. Returns the 
username of the current user is logged in or an
+        * empty string if the user is not logged in.
+        */
+       @GET
+       @Path("status")
+       @Produces( { MediaType.APPLICATION_JSON })
+       public Response getLoginStatus(@Context final HttpServletRequest 
request) {
+               // TODO: here we have the authorization of this user, but to 
which context should we bind
+               // it? And what about oAuth? For now we just bind it to the 
http session and use the
+               // session info in the container. Note that we use our own http 
session implementation
+               // because of issue AMDATU-67.
+               JSONObject jsonObject = new JSONObject();
+               try {
+                       String userName = getUserName(request);
+                       if (userName != null) {
+                               jsonObject.append("username", userName);
+                               jsonObject.append("hostname", 
request.getServerName());
+                               jsonObject.append("hostid", 
request.getLocalAddr());
+                               jsonObject.append("tenantid", m_tenant.getId());
+                               jsonObject.append("tenantname", 
m_tenant.getName());
+                               return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl)
+                               .build();
+                       }
+               }
+               catch (JSONException e) {
+                       m_logService.log(LogService.LOG_ERROR, "Could not 
retrieve current login status", e);
+               }
+               catch (TokenProviderException e) {
+                       // If the token is invalid, the user is not logged in 
anymore, ignore this error
+               }
+               catch (InvalidTokenException e) {
+                       // If the token is invalid, the user is not logged in 
anymore, ignore this error
+               }
+               return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl).build();
+       }
+
+       /**
+        * REST based login service with username/password.
+        */
+       @POST
+       @Path("login")
+       @Consumes("application/x-www-form-urlencoded")
+       @Produces( { MediaType.APPLICATION_JSON })
+       public Response login(@FormParam("username") final String username, 
@FormParam("password") final String password,
+                       @Context final HttpServletRequest request) {
+               m_logService.log(LogService.LOG_INFO, "Login requested for 
user: " + username);
+
+               // First retrieve the user with this username
+               JSONObject jsonObject = new JSONObject();
+               NewCookie cookie = null;
+               try {
+                       Role userRole = m_userAdmin.getRole(username);
+                       if (userRole != null && userRole.getType() == 
Role.USER) {
+                               User user = (User) userRole;
+                               if (user.hasCredential(PASSWORD_CREDENTIAL_KEY, 
password)) {
+                                       // Now generate a token for this user 
and write it to a Set-Cookie header
+                                       String token = generateToken(request, 
user);
+                                       cookie = new 
NewCookie(TokenProvider.TOKEN_COOKIE_NAME, token, "/", null, "Amdatu session", 
-1, false);
+
+                                       m_logService.log(LogService.LOG_INFO, 
"User '" + username + "' logged in successfully");
+                                       jsonObject.append("result", "ok");
+                                       jsonObject.append("username", username);
+                                       jsonObject.append("hostname", 
request.getServerName());
+                                       jsonObject.append("hostid", 
request.getLocalAddr());
+                                       jsonObject.append("tenantid", 
m_tenant.getId());
+                                       jsonObject.append("tenantname", 
m_tenant.getName());
+                                       jsonObject.append("msg", "User '" + 
username + "' logged in successfully");
+
+                               }
+                               else {
+                                       m_logService.log(LogService.LOG_INFO, 
"Incorrect password provided for user '" + username + "'");
+                                       jsonObject.append("result", "failed");
+                                       jsonObject.append("msg", "Password is 
incorrect");
+                               }
+                       }
+                       else {
+                               m_logService.log(LogService.LOG_INFO, "Username 
'" + username + "' unknown");
+                               jsonObject.append("result", "failed");
+                               jsonObject.append("msg", "Username is unknown");
+                       }
+               }
+               catch (JSONException e) {
+                       m_logService.log(LogService.LOG_ERROR, "Could not 
retrieve current login status", e);
+                       throw new WebApplicationException(e, 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+               }
+               catch (TokenProviderException e) {
+                       m_logService.log(LogService.LOG_ERROR, "Could not 
retrieve current login status", e);
+                       throw new WebApplicationException(e, 
HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+               }
+
+               ResponseBuilder builder = Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE);
+               builder.cacheControl(m_cacheControl);
+               if (cookie != null) {
+                       builder.cookie(cookie);
+               }
+               return builder.build();
+       }
+
+       /**
+        * REST based logout service with username/password.
+        * 
+        * @return The result of the SPARQL query.
+        */
+       @POST
+       @Path("logout")
+       @Produces( { MediaType.APPLICATION_JSON })
+       public Response logout(@Context final HttpServletRequest request) {
+               // TODO: here we have the authorization of this user, but to 
which context should we bind
+               // it? And what about oAuth? For now we just bind it to the 
http session and use the
+               // session info in the container. Note that we use our own http 
session implementation
+               // because of issue AMDATU-67.
+               JSONObject jsonObject = new JSONObject();
+               String userName = null;
+               try {
+                       userName = getUserName(request);
+                       invalidateToken(request);
+                       m_logService.log(LogService.LOG_INFO, "User '" + 
userName + "' logged out successfully");
+                       jsonObject.append("result", "ok");
+               }
+               catch (JSONException e) {
+                       m_logService.log(LogService.LOG_ERROR, "Could not 
retrieve current login status", e);
+               }
+               catch (TokenProviderException e) {
+                       m_logService.log(LogService.LOG_INFO, "User '" + 
userName + "' could not be logged out");
+               }
+               catch (InvalidTokenException e) {
+                       m_logService.log(LogService.LOG_INFO, "User '" + 
userName + "' not logged out, token was already invalid");
+               }
+               return Response.ok(jsonObject.toString(), 
MediaType.APPLICATION_JSON_TYPE).cacheControl(m_cacheControl).build();
+       }
+
+       public URL getResource(String name) {
+               return null;
+       }
+
+       public String getResourceId() {
+               return Activator.RESOURCE_ID;
+       }
+
+       private String generateToken(HttpServletRequest request, User user) 
throws TokenProviderException {
+               SortedMap<String, String> attributes = new TreeMap<String, 
String>();
+               attributes.put("ip", request.getRemoteAddr());
+               attributes.put(TokenProvider.USERNAME, user.getName());
+               return m_tokenProvider.generateToken(attributes);
+       }
+
+       private String getUserName(HttpServletRequest request) throws 
TokenProviderException, InvalidTokenException {
+               String token = m_tokenProvider.getTokenFromRequest(request);
+               if (token != null) {
+                       // Now decrypt to get the username and signature
+                       Map<String, String> attributes = 
m_tokenProvider.verifyToken(token);
+                       if (attributes != null) {
+                               return attributes.get(TokenProvider.USERNAME);
+                       }
+               }
+
+               return null;
+       }
+
+       private void invalidateToken(HttpServletRequest request) {
+               
m_tokenProvider.invalidateToken(m_tokenProvider.getTokenFromRequest(request));
+       }
 }

Modified: 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/osgi/Activator.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/osgi/Activator.java
    (original)
+++ 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/osgi/Activator.java
    Tue Feb  1 10:07:35 2011
@@ -21,6 +21,7 @@
 import org.amdatu.authorization.useradmin.rest.service.RolesResource;
 import org.amdatu.authorization.useradmin.rest.service.UsersResource;
 import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.libraries.utilities.osgi.ServiceDependentActivator;
 import org.amdatu.web.rest.jaxrs.JaxRsSpi;
 import org.amdatu.web.rest.jaxrs.RESTService;
@@ -53,6 +54,7 @@
             .setInterface(RESTService.class.getName(), null)
             .setImplementation(UsersResource.class)
             
.add(createServiceDependency().setService(LogService.class).setRequired(true))
+            
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true))
             
.add(createServiceDependency().setService(TokenProvider.class).setRequired(true)));
 
         // Create the groups resource service and register it as REST service
@@ -61,7 +63,7 @@
             .setImplementation(GroupsResource.class)
             
.add(createServiceDependency().setService(LogService.class).setRequired(true))
             
.add(createServiceDependency().setService(TokenProvider.class).setRequired(true))
-            
.add(createServiceDependency().setService(UserAdmin.class).setRequired(true)));
+            
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true)));
 
         // Create the groups resource service and register it as REST service
         manager.add(createAdapterService(UserAdmin.class, filter)
@@ -69,7 +71,7 @@
             .setImplementation(RolesResource.class)
             
.add(createServiceDependency().setService(LogService.class).setRequired(true))
             
.add(createServiceDependency().setService(TokenProvider.class).setRequired(true))
-            
.add(createServiceDependency().setService(UserAdmin.class).setRequired(true)));
+            
.add(createServiceDependency().setService(TenantManagementService.class).setRequired(true)));
     }
 
     @Override

Modified: 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/service/ResourceBase.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/service/ResourceBase.java
      (original)
+++ 
branches/amdatu-dispatcher/amdatu-authorization/useradmin-rest/src/main/java/org/amdatu/authorization/useradmin/rest/service/ResourceBase.java
      Tue Feb  1 10:07:35 2011
@@ -34,8 +34,12 @@
 import org.amdatu.authentication.tokenprovider.TokenProviderException;
 import org.amdatu.authorization.useradmin.rest.bean.RoleBean;
 import org.amdatu.authorization.useradmin.rest.bean.SearchResultBean;
+import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.tenant.TenantException;
+import org.amdatu.core.tenant.TenantManagementService;
 import org.amdatu.libraries.utilities.rest.AtomSyndicationLink;
 import org.amdatu.web.rest.jaxrs.RESTService;
+import org.apache.felix.dm.Component;
 import org.json.JSONObject;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.log.LogService;
@@ -52,6 +56,9 @@
     protected volatile LogService m_logService;
     protected volatile UserAdmin m_userAdmin;
     protected volatile TokenProvider m_tokenProvider;
+    protected volatile TenantManagementService m_tenantManagementService;
+    
+    protected Tenant m_tenant;
 
     // Disable HTTP caching in this REST interface
     private static CacheControl m_cacheControl;
@@ -59,6 +66,12 @@
         m_cacheControl = new CacheControl();
         m_cacheControl.setNoCache(true);
     }
+    
+    public void init(Component component) throws TenantException {
+       // Retrieve the tenant
+       String tenantId = (String) 
component.getServiceProperties().get("tenant_id");
+       m_tenant = m_tenantManagementService.getTenantById(tenantId);
+    }
 
     /**
      * Returns the roles (users or groups) for the specified filter options.

Modified: 
branches/amdatu-dispatcher/amdatu-core/tenantuseradmindecorator/src/main/java/org/amdatu/core/tenantuseradmindecorator/service/TenantUserAdminDecorator.java
==============================================================================
--- 
branches/amdatu-dispatcher/amdatu-core/tenantuseradmindecorator/src/main/java/org/amdatu/core/tenantuseradmindecorator/service/TenantUserAdminDecorator.java
        (original)
+++ 
branches/amdatu-dispatcher/amdatu-core/tenantuseradmindecorator/src/main/java/org/amdatu/core/tenantuseradmindecorator/service/TenantUserAdminDecorator.java
        Tue Feb  1 10:07:35 2011
@@ -30,9 +30,13 @@
 import org.osgi.service.useradmin.UserAdmin;
 
 public class TenantUserAdminDecorator implements UserAdmin {
+       // Service dependencies injected by the dependency manager
     private volatile UserAdmin m_userAdmin;
     private volatile TenantManagementService m_tenantManagementService;
     private volatile LogService m_logService;
+    
+    // Private members
+    private Tenant m_tenant;
 
     @SuppressWarnings("unchecked")
     public void init(Component component) {
@@ -44,9 +48,9 @@
             // by convention we postfix the storage provider id by _[tenant 
id]. So we can retrieve the tenant id from
             // this property.
             String tenantId = pid.substring(pid.lastIndexOf("_") + 1);
-            Tenant tenant = m_tenantManagementService.getTenantById(tenantId);
-            properties.put(Tenant.SERVICE_PREFIX + "id", tenant.getId());
-            properties.put(Tenant.SERVICE_PREFIX + "name", tenant.getName());
+            m_tenant = m_tenantManagementService.getTenantById(tenantId);
+            properties.put(Tenant.SERVICE_PREFIX + "id", m_tenant.getId());
+            properties.put(Tenant.SERVICE_PREFIX + "name", m_tenant.getName());
             component.setServiceProperties(properties);
         }
         catch (TenantException e) {

Reply via email to