some db code rewriting
[mir.git] / source / mircoders / servlet / ServletModuleUsers.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.servlet;
32
33 import mir.entity.adapter.EntityAdapterEngine;
34 import mir.entity.adapter.EntityAdapterModel;
35 import mir.log.LoggerWrapper;
36 import mir.servlet.ServletModule;
37 import mir.servlet.ServletModuleExc;
38 import mir.servlet.ServletModuleFailure;
39 import mir.servlet.ServletModuleUserExc;
40 import mir.util.HTTPRequestParser;
41 import mir.util.URLBuilder;
42 import mircoders.entity.EntityUsers;
43 import mircoders.global.MirGlobal;
44 import mircoders.module.ModuleUsers;
45 import mircoders.storage.DatabaseUsers;
46
47 import javax.servlet.http.HttpServletRequest;
48 import javax.servlet.http.HttpServletResponse;
49 import java.util.*;
50
51 /**
52  *
53  *
54  */
55 public class ServletModuleUsers extends ServletModule
56 {
57   private static ServletModuleUsers instance = new ServletModuleUsers();
58   public static ServletModule getInstance() { return instance; }
59   protected ModuleUsers usersModule;
60
61   private ServletModuleUsers() {
62     super();
63     logger = new LoggerWrapper("ServletModule.Users");
64
65     try {
66       definition = "user";
67       usersModule = new ModuleUsers();
68       mainModule = usersModule;
69     }
70     catch (Throwable e) {
71       logger.debug("initialization of ServletModuleUsers failed!: " + e.getMessage());
72     }
73   }
74
75   public void edit(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
76   {
77     String idParam = aRequest.getParameter("id");
78
79     if (idParam == null)
80       throw new ServletModuleExc("ServletModuleUser.edit: invalid call: (id) not specified");
81
82     try {
83       EntityUsers user = (EntityUsers) mainModule.getById(idParam);
84       MirGlobal.accessControl().user().assertMayEditUser(ServletHelper.getUser(aRequest), user);
85
86       showUser(idParam, false, aRequest, aResponse);
87     }
88     catch (Throwable e) {
89       throw new ServletModuleFailure(e);
90     }
91   }
92
93   public void add(HttpServletRequest aRequest, HttpServletResponse aResponse)
94       throws ServletModuleExc
95   {
96     try {
97       MirGlobal.accessControl().user().assertMayAddUsers(ServletHelper.getUser(aRequest));
98
99       showUser(null, false, aRequest, aResponse);
100     }
101     catch (Throwable e) {
102       throw new ServletModuleFailure(e);
103     }
104   }
105
106   public String validatePassword(EntityUsers aUser, HTTPRequestParser aRequestParser) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure
107   {
108     if ( (aRequestParser.getParameter("newpassword") != null &&
109           aRequestParser.getParameter("newpassword").length() > 0) ||
110          (aRequestParser.getParameter("newpassword2") != null &&
111           aRequestParser.getParameter("newpassword2").length() > 0)
112         ) {
113       String newPassword = aRequestParser.getParameterWithDefault("newpassword", "");
114       String newPassword2 = aRequestParser.getParameterWithDefault("newpassword2", "");
115       String oldPassword = aRequestParser.getParameterWithDefault("oldpassword", "");
116
117       try {
118         if (!usersModule.checkUserPassword(aUser, oldPassword)) {
119           throw new ServletModuleUserExc("user.error.incorrectpassword", new String[] {});
120         }
121       }
122       catch (Throwable t) {
123         throw new ServletModuleFailure(t);
124       }
125
126
127       if (newPassword.length() == 0 || newPassword2.length() == 0) {
128         throw new ServletModuleUserExc("user.error.missingpasswords", new String[] {});
129       }
130
131       if (!newPassword.equals(newPassword2)) {
132         throw new ServletModuleUserExc("user.error.passwordmismatch", new String[] {});
133       }
134
135       return newPassword;
136     }
137                 return null;
138   }
139
140   public void insert(HttpServletRequest aRequest, HttpServletResponse aResponse)
141       throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure
142   {
143     try {
144       MirGlobal.accessControl().user().assertMayAddUsers(ServletHelper.getUser(aRequest));
145
146       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
147       Map withValues = getIntersectingValues(aRequest, mainModule.getStorageObject());
148
149       String newPassword=validatePassword(ServletHelper.getUser(aRequest), requestParser);
150       if (newPassword!=null)
151         withValues.put("password", newPassword);
152       else
153         throw new ServletModuleUserExc("user.error.missingpassword", new String[] {});
154
155       String id = mainModule.add(withValues);
156
157       logAdminUsage(aRequest, id, "object added");
158
159       if (requestParser.hasParameter("returnurl"))
160         ServletHelper.redirect(aResponse, requestParser.getParameter("returnurl"));
161       else
162         list(aRequest, aResponse);
163     }
164     catch (Throwable e) {
165       throw new ServletModuleFailure(e);
166     }
167   }
168
169   public void update(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure
170   {
171     try {
172       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
173       String id = requestParser.getParameter("id");
174       EntityUsers user = (EntityUsers) mainModule.getById(id);
175       MirGlobal.accessControl().user().assertMayEditUser(ServletHelper.getUser(aRequest), user);
176
177       Map withValues = getIntersectingValues(aRequest, mainModule.getStorageObject());
178       if (!withValues.containsKey("is_admin"))
179         withValues.put("is_admin","0");
180       if (!withValues.containsKey("is_disabled"))
181         withValues.put("is_disabled","0");
182
183       String newPassword=validatePassword(ServletHelper.getUser(aRequest), requestParser);
184       if (newPassword!=null)
185         withValues.put("password", MirGlobal.localizer().adminInterface().makePasswordDigest(newPassword));
186
187       mainModule.set(withValues);
188
189       logAdminUsage(aRequest, id, "object modified");
190
191       if (requestParser.hasParameter("returnurl"))
192         ServletHelper.redirect(aResponse, requestParser.getParameter("returnurl"));
193       else
194         list(aRequest, aResponse);
195     }
196     catch (Throwable e) {
197       throw new ServletModuleFailure(e);
198     }
199   }
200
201   public void updatepassword(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc, ServletModuleUserExc, ServletModuleFailure
202   {
203     try {
204       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
205       String id = requestParser.getParameter("id");
206       EntityUsers user = (EntityUsers) mainModule.getById(id);
207       MirGlobal.accessControl().user().assertMayChangeUserPassword(ServletHelper.getUser(aRequest), user);
208
209       String newPassword=validatePassword(ServletHelper.getUser(aRequest), requestParser);
210       if (newPassword!=null) {
211         user.setFieldValue("password", MirGlobal.localizer().adminInterface().makePasswordDigest(newPassword));
212         user.update();
213
214         logAdminUsage(aRequest, id, "password changed");
215
216         // hackish: to make sure the cached logged in user is up-to-date:
217         ServletHelper.setUser(aRequest, (EntityUsers) mainModule.getById(ServletHelper.getUser(aRequest).getId()));
218       }
219
220       if (requestParser.hasParameter("returnurl"))
221         ServletHelper.redirect(aResponse, requestParser.getParameter("returnurl"));
222       else
223         ServletHelper.redirect(aResponse, "");
224     }
225     catch (Throwable e) {
226       throw new ServletModuleFailure(e);
227     }
228   }
229
230   public void list(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
231   {
232     HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
233
234     int offset = requestParser.getIntegerWithDefault("offset", 0);
235
236     returnUserList(aRequest, aResponse, offset);
237   }
238
239   public void returnUserList(
240        HttpServletRequest aRequest,
241        HttpServletResponse aResponse,
242        int anOffset) throws ServletModuleExc {
243
244     URLBuilder urlBuilder = new URLBuilder();
245
246     try {
247       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
248
249       List list =
250          EntityAdapterEngine.retrieveAdapterList(model, definition, "", "login", nrEntitiesPerListPage, anOffset);
251
252       responseData.put("nexturl", null);
253       responseData.put("prevurl", null);
254
255       urlBuilder.setValue("module", "Users");
256       urlBuilder.setValue("do", "list");
257
258       urlBuilder.setValue("offset", anOffset);
259       responseData.put("offset" , new Integer(anOffset).toString());
260       responseData.put("thisurl" , urlBuilder.getQuery());
261
262       if (list.size()>=nrEntitiesPerListPage) {
263         urlBuilder.setValue("offset", (anOffset + nrEntitiesPerListPage));
264         responseData.put("nexturl" , urlBuilder.getQuery());
265       }
266
267       if (anOffset>0) {
268         urlBuilder.setValue("offset", Math.max(anOffset - nrEntitiesPerListPage, 0));
269         responseData.put("prevurl" , urlBuilder.getQuery());
270       }
271
272       responseData.put("users", list);
273       responseData.put("mayDeleteUsers", new Boolean(MirGlobal.accessControl().user().mayDeleteUsers(ServletHelper.getUser(aRequest))));
274       responseData.put("mayAddUsers", new Boolean(MirGlobal.accessControl().user().mayAddUsers(ServletHelper.getUser(aRequest))));
275       responseData.put("mayEditUsers", new Boolean(MirGlobal.accessControl().user().mayEditUsers(ServletHelper.getUser(aRequest))));
276
277       responseData.put("from" , Integer.toString(anOffset+1));
278       responseData.put("to", Integer.toString(anOffset+list.size()));
279       responseData.put("offset" , Integer.toString(anOffset));
280
281       ServletHelper.generateResponse(aResponse.getWriter(), responseData, listGenerator);
282     }
283     catch (Throwable e) {
284       throw new ServletModuleFailure(e);
285     }
286   }
287
288   public void showUser(String anId, boolean anOnlyPassword, HttpServletRequest aRequest, HttpServletResponse aResponse)
289       throws ServletModuleExc {
290     try {
291       HTTPRequestParser requestParser = new HTTPRequestParser(aRequest);
292       Map responseData = ServletHelper.makeGenerationData(aRequest, aResponse, new Locale[] { getLocale(aRequest), getFallbackLocale(aRequest)});
293       EntityAdapterModel model = MirGlobal.localizer().dataModel().adapterModel();
294       Map user;
295       URLBuilder urlBuilder = new URLBuilder();
296
297       urlBuilder.setValue("module", "Users");
298       if (anOnlyPassword)
299         urlBuilder.setValue("do", "changepassword");
300       else
301         urlBuilder.setValue("do", "edit");
302       urlBuilder.setValue("id", anId);
303       urlBuilder.setValue("returnurl", requestParser.getParameter("returnurl"));
304
305       if (anId!=null) {
306         responseData.put("new", Boolean.FALSE);
307         user = model.makeEntityAdapter("user", mainModule.getById(anId));
308       }
309       else {
310         List fields = DatabaseUsers.getInstance().getFieldNames();
311         responseData.put("new", Boolean.TRUE);
312         user = new HashMap();
313         Iterator i = fields.iterator();
314         while (i.hasNext()) {
315           user.put(i.next(), null);
316         }
317
318         MirGlobal.localizer().adminInterface().initializeArticle(user);
319       }
320       responseData.put("user", user);
321       responseData.put("passwordonly", new Boolean(anOnlyPassword));
322
323       responseData.put("returnurl", requestParser.getParameter("returnurl"));
324       responseData.put("thisurl", urlBuilder.getQuery());
325
326       ServletHelper.generateResponse(aResponse.getWriter(), responseData, editGenerator);
327     }
328     catch (Throwable e) {
329       throw new ServletModuleFailure(e);
330     }
331   }
332
333   public void delete(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleUserExc, ServletModuleExc, ServletModuleFailure {
334     try {
335       EntityUsers user = (EntityUsers) mainModule.getById(aRequest.getParameter("id"));
336
337       MirGlobal.accessControl().user().assertMayDeleteUser(ServletHelper.getUser(aRequest), user);
338
339       super.delete(aRequest, aResponse);
340     }
341     catch (Throwable t) {
342       throw new ServletModuleFailure(t);
343     }
344   }
345
346   public void changepassword(HttpServletRequest aRequest, HttpServletResponse aResponse) throws ServletModuleExc
347   {
348     String idParam = aRequest.getParameter("id");
349
350     if (idParam == null)
351       throw new ServletModuleExc("ServletModuleUser.edit: invalid call: (id) not specified");
352
353     try {
354       EntityUsers user = (EntityUsers) mainModule.getById(idParam);
355       MirGlobal.accessControl().user().assertMayChangeUserPassword(ServletHelper.getUser(aRequest), user);
356
357       showUser(idParam, true, aRequest, aResponse);
358     }
359     catch (Throwable e) {
360       throw new ServletModuleFailure(e);
361     }
362   }
363 }
364