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