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