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