Added features:
[mir.git] / source / mircoders / module / ModuleUsers.java
1 /*
2  * Copyright (C) 2001, 2002 The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with  any library licensed under the Apache Software License,
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library
23  * (or with modified versions of the above that use the same license as the above),
24  * and distribute linked combinations including the two.  You must obey the
25  * GNU General Public License in all respects for all of the code used other than
26  * the above mentioned libraries.  If you modify this file, you may extend this
27  * exception to your version of the file, but you are not obligated to do so.
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30
31 package mircoders.module;
32
33 import java.util.HashMap;
34 import java.util.Map;
35
36 import mir.entity.EntityList;
37 import mir.log.LoggerWrapper;
38 import mir.module.AbstractModule;
39 import mir.module.ModuleExc;
40 import mir.module.ModuleFailure;
41 import mir.storage.StorageObject;
42 import mir.util.JDBCStringRoutines;
43 import mircoders.entity.EntityUsers;
44 import mircoders.global.MirGlobal;
45
46
47 /*
48  *  Users Module -
49  *
50  *
51  * @author RK
52  */
53
54 public class ModuleUsers extends AbstractModule
55 {
56   static LoggerWrapper logger = new LoggerWrapper("Module.Users");
57
58   public ModuleUsers(StorageObject aStorage)
59   {
60     if (aStorage == null)
61       logger.warn("ModuleUsers(): StorageObject was null!");
62
63     theStorage = aStorage;
64   }
65
66   /**
67    * Authenticate and lookup a user
68    *
69    * @param user              The user to lookup
70    * @param password          The password
71    * @return                  The authenticated user, or <code>null</code> if the user
72    *                          doesn't exist, or the supplied password is invalid.
73    * @throws ModuleException
74    */
75
76   public EntityUsers getUserForLogin(String user, String password) throws ModuleExc, ModuleFailure {
77     try {
78       String whereString =
79           "login='" + JDBCStringRoutines.escapeStringLiteral(user) + "' " +
80           "and password='" + JDBCStringRoutines.escapeStringLiteral(
81           MirGlobal.localizer().adminInterface().makePasswordDigest(password)) +
82           "' " +
83           "and is_admin='1'";
84
85       EntityList userList = getByWhereClause(whereString, -1);
86
87       if (userList != null && userList.getCount() == 1) {
88         EntityUsers result = (EntityUsers) userList.elementAt(0);
89
90         if (result.getValue("is_disabled") == null ||
91             result.getValue("is_disabled").equals("0"))
92             return result;
93
94       }
95
96       return null;
97     }
98     catch (Throwable t) {
99       throw new ModuleFailure(t);
100     }
101   }
102
103   public boolean checkUserPassword(EntityUsers aUser, String aPassword) throws ModuleExc, ModuleFailure {
104     try {
105       return aUser.getValue("password").equals(MirGlobal.localizer().adminInterface().makePasswordDigest(aPassword));
106     }
107     catch (Throwable t) {
108       throw new ModuleFailure(t);
109     }
110   }
111
112   private Map digestPassword(Map aValues) throws ModuleExc, ModuleFailure {
113     Map result = aValues;
114
115     try {
116       if (aValues.containsKey("password")) {
117         result = new HashMap();
118         result.putAll(aValues);
119         result.put("password",
120             MirGlobal.localizer().adminInterface().
121             makePasswordDigest( (String) aValues.get("password")));
122       }
123     }
124     catch (Throwable t) {
125       throw new ModuleFailure("ModuleUsers.add: " + t.getMessage(), t);
126     }
127
128     return result;
129   }
130
131   /**
132    *
133    * @param theValues
134    * @return
135    * @throws ModuleExc
136    * @throws ModuleFailure
137    */
138
139   public String add (Map theValues) throws ModuleExc, ModuleFailure {
140     try {
141       return super.add(digestPassword(theValues));
142     }
143     catch (Throwable t) {
144       throw new ModuleFailure(t);
145     }
146   }
147
148   /**
149    *
150    * @param theValues
151    * @return
152    * @throws ModuleExc
153    * @throws ModuleFailure
154    */
155   public String set (Map theValues) throws ModuleExc, ModuleFailure {
156     try {
157       return super.set(digestPassword(theValues));
158     }
159     catch (Throwable t) {
160       throw new ModuleFailure(t);
161     }
162   }
163
164   public void recordLogin(EntityUsers aUser) throws ModuleExc, ModuleFailure {
165     try {
166       String sql = "update webdb_users set lastlogin=now() where id = " + aUser.getId();
167
168       theStorage.executeUpdate(sql);
169     }
170     catch (Throwable t) {
171       throw new ModuleFailure(t);
172     }
173   }
174 }