1 /*
2  * @(#) $Id: UserAccountManager.java,v 1.2 2003/07/08 08:13:53 pankaj Exp $
3  *
4  * Copyright (c) 2002-03 by Pankaj Kumar (http://www.pankaj-k.net). 
5  * All rights reserved.
6  *
7  * The license governing the use of this file can be found in the 
8  * root directory of the containing software.
9  */
10package org.jstk.uam;
11
12import java.util.HashMap;
13import java.util.Vector;
14import java.util.Iterator;
15import java.security.Principal;
16
17public class UserAccountManager implements java.io.Serializable {
18    public static class NoSuchUserException extends Exception { }
19    public static class NoSuchRoleException extends Exception { }
20    public static class RoleNotFreeException extends Exception { }
21    public static class InvalidPasswordException extends Exception { }
22
23    private HashMap users = null;
24    private HashMap roles = null;
25    private transient UAMPersistenceManagerIntf pmi;
26
27    private static UserAccountManager instance = null;
28
29    public UserAccountManager(){
30        users = new HashMap();
31        roles = new HashMap();
32    }
33
34    public static UserAccountManager getInstance(UAMPersistenceManagerIntf pmi) throws Exception {
35        if (instance == null)
36            instance = pmi.load();
37        instance.pmi = pmi;
38        return instance;
39    }
40
41    public void addUser(String loginName, String userName, String passWord){
42        JSTKUser user = (JSTKUser)users.get(loginName);
43        if (user != null){
44            user.setUserName(userName);
45            user.setPassWord(passWord);
46        } else {
47            user = new JSTKUser(loginName, userName, passWord);
48            users.put(loginName, user);
49        }
50        pmi.addUser(loginName, userName, passWord);
51    }
52    public void changePassWord(String loginName, String passWord) throws
53            NoSuchUserException {
54        JSTKUser user = (JSTKUser)users.get(loginName);
55        if (user == null)
56            throw new NoSuchUserException();
57        user.setPassWord(passWord);
58        pmi.changePassWord(loginName, passWord);
59    }
60    // Returns a copy and not a reference.
61    public Principal getUser(String loginName){
62        JSTKUser user = (JSTKUser)users.get(loginName);
63        if (user == null)
64            return null;
65        else
66            return new JSTKUserPrincipal(user.getLoginName(), user.getUserName());
67    }
68    public void remUser(String loginName){
69        JSTKUser user = (JSTKUser)users.get(loginName);
70        if (user == null)   // Nothing to remove.
71            return;
72
73        // Remove from all roles
74        Iterator itr = user.roles();
75        while (itr.hasNext()){
76            String roleName = (String)itr.next();
77            JSTKRole role = (JSTKRole)roles.get(roleName);
78            role.remUser(loginName);
79        }
80
81        // Remove the user.
82        users.remove(loginName);
83        pmi.remUser(loginName);
84    }
85    // Iterator of user Principals
86    public Iterator users(){
87        Iterator itr = users.values().iterator();
88        Vector v = new Vector();
89        while (itr.hasNext()){
90            JSTKUser user = (JSTKUser)itr.next();
91            v.add(new JSTKUserPrincipal(user.getLoginName(), user.getUserName()));
92        }
93        return v.iterator();
94    }
95
96    public void addRole(String roleName, String desc){
97        JSTKRole role = (JSTKRole)roles.get(roleName);
98        if (role != null){
99            role.setRoleDesc(desc);
00        } else {
01            role = new JSTKRole(roleName, desc);
02            roles.put(roleName, role);
03        }
04        pmi.addRole(roleName, desc);
05    }
06    // Returns a copy and not a reference.
07    public Principal getRole(String roleName){
08        JSTKRole role = (JSTKRole)roles.get(roleName);
09        if (role == null)
10            return null;
11        else
12            return new JSTKRolePrincipal(role.getRoleName(), role.getRoleDesc());
13    }
14    public void remRole(String roleName) throws RoleNotFreeException {
15        JSTKRole role = (JSTKRole)roles.get(roleName);
16        if (role == null)
17            return;
18        if (role.hasUsers())
19            throw new RoleNotFreeException();
20        roles.remove(roleName);
21        pmi.remRole(roleName);
22    }
23    // Iterator over role Principals
24    public Iterator roles(){
25        Iterator itr = roles.values().iterator();
26        Vector v = new Vector();
27        while (itr.hasNext()){
28            JSTKRole role = (JSTKRole)itr.next();
29            v.add(new JSTKRolePrincipal(role.getRoleName(), role.getRoleDesc()));
30        }
31        return v.iterator();
32    }
33
34    // Iterator over user Principals of a given role
35    public Iterator roleUsers(String roleName) throws NoSuchRoleException {
36        JSTKRole role = (JSTKRole)roles.get(roleName);
37        if (role == null)   // Nothing to remove.
38            throw new NoSuchRoleException();
39
40        Iterator itr = role.users();
41        Vector v = new Vector();
42        while (itr.hasNext()){
43            String loginName = (String)itr.next();
44            JSTKUser user = (JSTKUser)users.get(loginName);
45            v.add(new JSTKUserPrincipal(user.getLoginName(), user.getUserName()));
46        }
47        return v.iterator();
48    }
49
50    // Iterator over role Principals of a given user
51    public Iterator userRoles(String loginName) throws NoSuchUserException {
52        JSTKUser user = (JSTKUser)users.get(loginName);
53        if (user == null)   // Nothing to remove.
54            throw new NoSuchUserException();
55
56        Iterator itr = user.roles();
57        Vector v = new Vector();
58        while (itr.hasNext()){
59            String roleName = (String)itr.next();
60            JSTKRole role = (JSTKRole)roles.get(roleName);
61            v.add(new JSTKRolePrincipal(role.getRoleName(), role.getRoleDesc()));
62        }
63        return v.iterator();
64    }
65
66    public void addRoleToUser(String roleName, String loginName) throws
67            NoSuchUserException, NoSuchRoleException {
68        JSTKRole role = (JSTKRole)roles.get(roleName);
69        if (role == null)
70            throw new NoSuchRoleException();
71
72        JSTKUser user = (JSTKUser)users.get(loginName);
73        if (user == null)
74            throw new NoSuchUserException();
75
76        if (user.isUserInRole(roleName))    // Nothing to do.
77            return;
78
79        role.addUser(loginName);
80        user.addRole(roleName);
81        pmi.addRoleToUser(roleName, loginName);
82    }
83
84    public void remRoleFromUser(String roleName, String loginName) throws
85            NoSuchUserException, NoSuchRoleException {
86        JSTKRole role = (JSTKRole)roles.get(roleName);
87        if (role == null)
88            throw new NoSuchRoleException();
89
90        JSTKUser user = (JSTKUser)users.get(loginName);
91        if (user == null)
92            throw new NoSuchUserException();
93
94        if (!user.isUserInRole(roleName))   // Nothing to do.
95            return;
96
97        role.remUser(loginName);
98        user.remRole(roleName);
99        pmi.remRoleFromUser(roleName, loginName);
00    }
01
02    public void validate(String loginName, String passWord) throws
03            NoSuchUserException, InvalidPasswordException {
04        JSTKUser user = (JSTKUser)users.get(loginName);
05        if (user == null)
06            throw new NoSuchUserException();
07        if (!passWord.equals(user.getPassWord()))
08            throw new InvalidPasswordException();
09        return;
10    }
11}