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