fixed / clean ups
[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     storage = 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 ModuleExc
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.getFieldValue("is_disabled") == null ||
91             result.getFieldValue("is_disabled").equals("0"))
92             return result;
93       }
94
95       return null;
96     }
97     catch (Throwable t) {
98       throw new ModuleFailure(t);
99     }
100   }
101
102   public boolean checkUserPassword(EntityUsers aUser, String aPassword) throws ModuleExc, ModuleFailure {
103     try {
104       return aUser.getFieldValue("password").equals(MirGlobal.localizer().adminInterface().makePasswordDigest(aPassword));
105     }
106     catch (Throwable t) {
107       throw new ModuleFailure(t);
108     }
109   }
110
111   private Map digestPassword(Map aValues) throws ModuleExc, ModuleFailure {
112     Map result = aValues;
113
114     try {
115       if (aValues.containsKey("password")) {
116         result = new HashMap();
117         result.putAll(aValues);
118         result.put("password",
119             MirGlobal.localizer().adminInterface().
120             makePasswordDigest( (String) aValues.get("password")));
121       }
122     }
123     catch (Throwable t) {
124       throw new ModuleFailure("ModuleUsers.add: " + t.getMessage(), t);
125     }
126
127     return result;
128   }
129
130   /**
131    *
132    * @param theValues
133    * @return
134    * @throws ModuleExc
135    * @throws ModuleFailure
136    */
137
138   public String add (Map theValues) throws ModuleExc, ModuleFailure {
139     try {
140       return super.add(digestPassword(theValues));
141     }
142     catch (Throwable t) {
143       throw new ModuleFailure(t);
144     }
145   }
146
147   /**
148    *
149    * @param theValues
150    * @return
151    * @throws ModuleExc
152    * @throws ModuleFailure
153    */
154   public String set (Map theValues) throws ModuleExc, ModuleFailure {
155     try {
156       return super.set(digestPassword(theValues));
157     }
158     catch (Throwable t) {
159       throw new ModuleFailure(t);
160     }
161   }
162
163   public void recordLogin(EntityUsers aUser) throws ModuleExc, ModuleFailure {
164     try {
165       String sql = "update webdb_users set lastlogin=now() where id = " + aUser.getId();
166
167       storage.executeUpdate(sql);
168     }
169     catch (Throwable t) {
170 //      no propagation of this error for now, to allow mir to still function
171 //      with older db schemas
172 //      throw new ModuleFailure(t);
173     }
174   }
175 }