1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * Permission is hereby granted, free of charge, to any person obtaining a copy
5    * of this software and associated documentation files (the "Software"), to deal
6    * in the Software without restriction, including without limitation the rights
7    * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8    * copies of the Software, and to permit persons to whom the Software is
9    * furnished to do so, subject to the following conditions:
10   *
11   * The above copyright notice and this permission notice shall be included in
12   * all copies or substantial portions of the Software.
13   *
14   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20   * SOFTWARE.
21   */
22  
23  package com.liferay.portlet.enterpriseadmin.action;
24  
25  import com.liferay.portal.AddressCityException;
26  import com.liferay.portal.AddressStreetException;
27  import com.liferay.portal.AddressZipException;
28  import com.liferay.portal.ContactFirstNameException;
29  import com.liferay.portal.ContactLastNameException;
30  import com.liferay.portal.DuplicateUserEmailAddressException;
31  import com.liferay.portal.DuplicateUserScreenNameException;
32  import com.liferay.portal.EmailAddressException;
33  import com.liferay.portal.NoSuchCountryException;
34  import com.liferay.portal.NoSuchListTypeException;
35  import com.liferay.portal.NoSuchRegionException;
36  import com.liferay.portal.NoSuchUserException;
37  import com.liferay.portal.PhoneNumberException;
38  import com.liferay.portal.RequiredUserException;
39  import com.liferay.portal.ReservedUserEmailAddressException;
40  import com.liferay.portal.ReservedUserScreenNameException;
41  import com.liferay.portal.UserEmailAddressException;
42  import com.liferay.portal.UserIdException;
43  import com.liferay.portal.UserPasswordException;
44  import com.liferay.portal.UserReminderQueryException;
45  import com.liferay.portal.UserScreenNameException;
46  import com.liferay.portal.UserSmsException;
47  import com.liferay.portal.WebsiteURLException;
48  import com.liferay.portal.kernel.servlet.SessionErrors;
49  import com.liferay.portal.kernel.util.Constants;
50  import com.liferay.portal.kernel.util.GetterUtil;
51  import com.liferay.portal.kernel.util.HttpUtil;
52  import com.liferay.portal.kernel.util.ParamUtil;
53  import com.liferay.portal.kernel.util.StringPool;
54  import com.liferay.portal.kernel.util.StringUtil;
55  import com.liferay.portal.kernel.util.Validator;
56  import com.liferay.portal.model.Address;
57  import com.liferay.portal.model.EmailAddress;
58  import com.liferay.portal.model.Group;
59  import com.liferay.portal.model.Layout;
60  import com.liferay.portal.model.Phone;
61  import com.liferay.portal.model.User;
62  import com.liferay.portal.model.UserGroupRole;
63  import com.liferay.portal.model.Website;
64  import com.liferay.portal.security.auth.PrincipalException;
65  import com.liferay.portal.service.ServiceContext;
66  import com.liferay.portal.service.ServiceContextFactory;
67  import com.liferay.portal.service.UserServiceUtil;
68  import com.liferay.portal.struts.PortletAction;
69  import com.liferay.portal.theme.ThemeDisplay;
70  import com.liferay.portal.util.PortalUtil;
71  import com.liferay.portal.util.WebKeys;
72  import com.liferay.portlet.InvokerPortletImpl;
73  import com.liferay.portlet.admin.util.AdminUtil;
74  import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
75  import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
76  import com.liferay.portlet.announcements.model.impl.AnnouncementsEntryImpl;
77  import com.liferay.portlet.enterpriseadmin.util.EnterpriseAdminUtil;
78  
79  import java.util.ArrayList;
80  import java.util.List;
81  
82  import javax.portlet.ActionRequest;
83  import javax.portlet.ActionResponse;
84  import javax.portlet.PortletConfig;
85  import javax.portlet.PortletRequest;
86  import javax.portlet.PortletSession;
87  import javax.portlet.RenderRequest;
88  import javax.portlet.RenderResponse;
89  
90  import javax.servlet.http.HttpServletRequest;
91  import javax.servlet.http.HttpSession;
92  
93  import org.apache.struts.Globals;
94  import org.apache.struts.action.ActionForm;
95  import org.apache.struts.action.ActionForward;
96  import org.apache.struts.action.ActionMapping;
97  
98  /**
99   * <a href="EditUserAction.java.html"><b><i>View Source</i></b></a>
100  *
101  * @author Brian Wing Shun Chan
102  * @author Jorge Ferrer
103  * @author Julio Camarero
104  *
105  */
106 public class EditUserAction extends PortletAction {
107 
108     public void processAction(
109             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
110             ActionRequest actionRequest, ActionResponse actionResponse)
111         throws Exception {
112 
113         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
114 
115         try {
116             User user = null;
117             String oldScreenName = StringPool.BLANK;
118 
119             if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
120                 Object[] returnValue = updateUser(actionRequest);
121 
122                 user = (User)returnValue[0];
123                 oldScreenName = ((String)returnValue[1]);
124             }
125             else if (cmd.equals(Constants.DEACTIVATE) ||
126                      cmd.equals(Constants.DELETE) ||
127                      cmd.equals(Constants.RESTORE)) {
128 
129                 deleteUsers(actionRequest);
130             }
131             else if (cmd.equals("deleteRole")) {
132                 deleteRole(actionRequest);
133             }
134             else if (cmd.equals("unlock")) {
135                 user = updateLockout(actionRequest);
136             }
137 
138             String redirect = ParamUtil.getString(actionRequest, "redirect");
139 
140             if (user != null) {
141                 if (Validator.isNotNull(oldScreenName)) {
142 
143                     // This will fix the redirect if the user is on his personal
144                     // my account page and changes his screen name. A redirect
145                     // that references the old screen name no longer points to a
146                     // valid screen name and therefore needs to be updated.
147 
148                     ThemeDisplay themeDisplay =
149                         (ThemeDisplay)actionRequest.getAttribute(
150                             WebKeys.THEME_DISPLAY);
151 
152                     Group group = user.getGroup();
153 
154                     if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
155                         Layout layout = themeDisplay.getLayout();
156 
157                         String friendlyURLPath = group.getPathFriendlyURL(
158                             layout.isPrivateLayout(), themeDisplay);
159 
160                         String oldPath =
161                             friendlyURLPath + StringPool.SLASH + oldScreenName;
162                         String newPath =
163                             friendlyURLPath + StringPool.SLASH +
164                                 user.getScreenName();
165 
166                         redirect = StringUtil.replace(
167                             redirect, oldPath, newPath);
168 
169                         redirect = StringUtil.replace(
170                             redirect, HttpUtil.encodeURL(oldPath),
171                             HttpUtil.encodeURL(newPath));
172                     }
173                 }
174 
175                 redirect = HttpUtil.setParameter(
176                     redirect, actionResponse.getNamespace() + "p_u_i_d",
177                     user.getUserId());
178             }
179 
180             sendRedirect(actionRequest, actionResponse, redirect);
181         }
182         catch (Exception e) {
183             if (e instanceof NoSuchUserException ||
184                 e instanceof PrincipalException) {
185 
186                 SessionErrors.add(actionRequest, e.getClass().getName());
187 
188                 setForward(actionRequest, "portlet.enterprise_admin.error");
189             }
190             else if (e instanceof AddressCityException ||
191                      e instanceof AddressStreetException ||
192                      e instanceof AddressZipException ||
193                      e instanceof ContactFirstNameException ||
194                      e instanceof ContactLastNameException ||
195                      e instanceof DuplicateUserEmailAddressException ||
196                      e instanceof DuplicateUserScreenNameException ||
197                      e instanceof EmailAddressException ||
198                      e instanceof NoSuchCountryException ||
199                      e instanceof NoSuchListTypeException ||
200                      e instanceof NoSuchRegionException ||
201                      e instanceof PhoneNumberException ||
202                      e instanceof RequiredUserException ||
203                      e instanceof ReservedUserEmailAddressException ||
204                      e instanceof ReservedUserScreenNameException ||
205                      e instanceof UserEmailAddressException ||
206                      e instanceof UserIdException ||
207                      e instanceof UserPasswordException ||
208                      e instanceof UserReminderQueryException ||
209                      e instanceof UserScreenNameException ||
210                      e instanceof UserSmsException ||
211                      e instanceof WebsiteURLException) {
212 
213                 if (e instanceof NoSuchListTypeException) {
214                     NoSuchListTypeException nslte = (NoSuchListTypeException)e;
215 
216                     SessionErrors.add(
217                         actionRequest,
218                         e.getClass().getName() + nslte.getType());
219                 }
220                 else {
221                     SessionErrors.add(actionRequest, e.getClass().getName(), e);
222                 }
223 
224                 if (e instanceof RequiredUserException) {
225                     actionResponse.sendRedirect(
226                         ParamUtil.getString(actionRequest, "redirect"));
227                 }
228             }
229             else {
230                 throw e;
231             }
232         }
233     }
234 
235     public ActionForward render(
236             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
237             RenderRequest renderRequest, RenderResponse renderResponse)
238         throws Exception {
239 
240         try {
241             PortalUtil.getSelectedUser(renderRequest);
242         }
243         catch (Exception e) {
244             if (e instanceof PrincipalException) {
245                 SessionErrors.add(renderRequest, e.getClass().getName());
246 
247                 return mapping.findForward("portlet.enterprise_admin.error");
248             }
249             else {
250                 throw e;
251             }
252         }
253 
254         return mapping.findForward(
255             getForward(renderRequest, "portlet.enterprise_admin.edit_user"));
256     }
257 
258     protected void deleteRole(ActionRequest actionRequest) throws Exception {
259         User user = PortalUtil.getSelectedUser(actionRequest);
260 
261         long roleId = ParamUtil.getLong(actionRequest, "roleId");
262 
263         UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
264     }
265 
266     protected void deleteUsers(ActionRequest actionRequest) throws Exception {
267         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
268 
269         long[] deleteUserIds = StringUtil.split(
270             ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
271 
272         for (int i = 0; i < deleteUserIds.length; i++) {
273             if (cmd.equals(Constants.DEACTIVATE) ||
274                 cmd.equals(Constants.RESTORE)) {
275 
276                 boolean active = !cmd.equals(Constants.DEACTIVATE);
277 
278                 UserServiceUtil.updateActive(deleteUserIds[i], active);
279             }
280             else {
281                 UserServiceUtil.deleteUser(deleteUserIds[i]);
282             }
283         }
284     }
285 
286     protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
287         ActionRequest actionRequest) {
288 
289         List<AnnouncementsDelivery> announcementsDeliveries =
290             new ArrayList<AnnouncementsDelivery>();
291 
292         for (String type : AnnouncementsEntryImpl.TYPES) {
293             boolean email = ParamUtil.getBoolean(
294                 actionRequest, "announcementsType" + type + "Email");
295             boolean sms = ParamUtil.getBoolean(
296                 actionRequest, "announcementsType" + type + "Sms");
297             boolean website = ParamUtil.getBoolean(
298                 actionRequest, "announcementsType" + type + "Website");
299 
300             AnnouncementsDelivery announcementsDelivery =
301                 new AnnouncementsDeliveryImpl();
302 
303             announcementsDelivery.setType(type);
304             announcementsDelivery.setEmail(email);
305             announcementsDelivery.setSms(sms);
306             announcementsDelivery.setWebsite(website);
307 
308             announcementsDeliveries.add(announcementsDelivery);
309         }
310 
311         return announcementsDeliveries;
312     }
313 
314     protected long[] getLongArray(PortletRequest portletRequest, String name) {
315         String value = portletRequest.getParameter(name);
316 
317         if (value == null) {
318             return null;
319         }
320 
321         return StringUtil.split(GetterUtil.getString(value), 0L);
322     }
323 
324     protected User updateLockout(ActionRequest actionRequest) throws Exception {
325         User user = PortalUtil.getSelectedUser(actionRequest);
326 
327         UserServiceUtil.updateLockout(user.getUserId(), false);
328 
329         return user;
330     }
331 
332     protected Object[] updateUser(ActionRequest actionRequest)
333         throws Exception {
334 
335         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
336 
337         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
338             WebKeys.THEME_DISPLAY);
339 
340         boolean autoPassword = ParamUtil.getBoolean(
341             actionRequest, "autoPassword", true);
342         String password1 = ParamUtil.getString(actionRequest, "password1");
343         String password2 = ParamUtil.getString(actionRequest, "password2");
344 
345         String reminderQueryQuestion = ParamUtil.getString(
346             actionRequest, "reminderQueryQuestion");
347 
348         if (reminderQueryQuestion.equals(EnterpriseAdminUtil.CUSTOM_QUESTION)) {
349             reminderQueryQuestion = ParamUtil.getString(
350                 actionRequest, "reminderQueryCustomQuestion");
351         }
352 
353         String reminderQueryAnswer = ParamUtil.getString(
354             actionRequest, "reminderQueryAnswer");
355         boolean autoScreenName = ParamUtil.getBoolean(
356             actionRequest, "autoScreenName");
357         String screenName = ParamUtil.getString(actionRequest, "screenName");
358         String emailAddress = ParamUtil.getString(
359             actionRequest, "emailAddress");
360         String openId = ParamUtil.getString(actionRequest, "openId");
361         String languageId = ParamUtil.getString(actionRequest, "languageId");
362         String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
363         String greeting = ParamUtil.getString(actionRequest, "greeting");
364         String firstName = ParamUtil.getString(actionRequest, "firstName");
365         String middleName = ParamUtil.getString(actionRequest, "middleName");
366         String lastName = ParamUtil.getString(actionRequest, "lastName");
367         int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
368         int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
369         boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
370         int birthdayMonth = ParamUtil.getInteger(
371             actionRequest, "birthdayMonth");
372         int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
373         int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
374         String comments = ParamUtil.getString(actionRequest, "comments");
375         String smsSn = ParamUtil.getString(actionRequest, "smsSn");
376         String aimSn = ParamUtil.getString(actionRequest, "aimSn");
377         String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
378         String icqSn = ParamUtil.getString(actionRequest, "icqSn");
379         String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
380         String msnSn = ParamUtil.getString(actionRequest, "msnSn");
381         String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
382         String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
383         String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
384         String ymSn = ParamUtil.getString(actionRequest, "ymSn");
385         String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
386         long[] groupIds = getLongArray(
387             actionRequest, "groupsSearchContainerPrimaryKeys");
388         long[] organizationIds = getLongArray(
389             actionRequest, "organizationsSearchContainerPrimaryKeys");
390         long[] roleIds = getLongArray(
391             actionRequest, "rolesSearchContainerPrimaryKeys");
392         List<UserGroupRole> userGroupRoles =
393             EnterpriseAdminUtil.getUserGroupRoles(actionRequest);
394         long[] userGroupIds = getLongArray(
395             actionRequest, "userGroupsSearchContainerPrimaryKeys");
396         boolean sendEmail = true;
397         List<Address> addresses = EnterpriseAdminUtil.getAddresses(
398             actionRequest);
399         List<EmailAddress> emailAddresses =
400             EnterpriseAdminUtil.getEmailAddresses(actionRequest);
401         List<Phone> phones = EnterpriseAdminUtil.getPhones(actionRequest);
402         List<Website> websites = EnterpriseAdminUtil.getWebsites(actionRequest);
403         List<AnnouncementsDelivery> announcementsDeliveries =
404             getAnnouncementsDeliveries(actionRequest);
405 
406         ServiceContext serviceContext = ServiceContextFactory.getInstance(
407             User.class.getName(), actionRequest);
408 
409         User user = null;
410         String oldScreenName = StringPool.BLANK;
411 
412         if (cmd.equals(Constants.ADD)) {
413 
414             // Add user
415 
416             user = UserServiceUtil.addUser(
417                 themeDisplay.getCompanyId(), autoPassword, password1, password2,
418                 autoScreenName, screenName, emailAddress, openId,
419                 themeDisplay.getLocale(), firstName, middleName, lastName,
420                 prefixId, suffixId, male, birthdayMonth, birthdayDay,
421                 birthdayYear, jobTitle, groupIds, organizationIds,
422                 roleIds, userGroupIds, sendEmail, addresses, emailAddresses,
423                 phones, websites, announcementsDeliveries, serviceContext);
424 
425             if (!userGroupRoles.isEmpty()) {
426                 for (UserGroupRole userGroupRole : userGroupRoles) {
427                     userGroupRole.setUserId(user.getUserId());
428                 }
429 
430                 user = UserServiceUtil.updateUser(
431                     user.getUserId(), StringPool.BLANK, StringPool.BLANK,
432                     StringPool.BLANK, false, reminderQueryQuestion,
433                     reminderQueryAnswer, screenName, emailAddress, openId,
434                     languageId, timeZoneId, greeting, comments, firstName,
435                     middleName, lastName, prefixId, suffixId, male,
436                     birthdayMonth, birthdayDay, birthdayYear, smsSn, aimSn,
437                     facebookSn, icqSn, jabberSn, msnSn, mySpaceSn, skypeSn,
438                     twitterSn, ymSn, jobTitle, groupIds, organizationIds,
439                     roleIds, userGroupRoles, userGroupIds, addresses,
440                     emailAddresses, phones, websites, announcementsDeliveries,
441                     serviceContext);
442             }
443         }
444         else {
445 
446             // Update user
447 
448             user = PortalUtil.getSelectedUser(actionRequest);
449 
450             String oldPassword = AdminUtil.getUpdateUserPassword(
451                 actionRequest, user.getUserId());
452             String newPassword1 = ParamUtil.getString(
453                 actionRequest, "password1");
454             String newPassword2 = ParamUtil.getString(
455                 actionRequest, "password2");
456             boolean passwordReset = ParamUtil.getBoolean(
457                 actionRequest, "passwordReset");
458 
459             String tempOldScreenName = user.getScreenName();
460 
461             user = UserServiceUtil.updateUser(
462                 user.getUserId(), oldPassword, newPassword1, newPassword2,
463                 passwordReset, reminderQueryQuestion, reminderQueryAnswer,
464                 screenName, emailAddress, openId, languageId, timeZoneId,
465                 greeting, comments, firstName, middleName, lastName, prefixId,
466                 suffixId, male, birthdayMonth, birthdayDay, birthdayYear, smsSn,
467                 aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn, skypeSn,
468                 twitterSn, ymSn, jobTitle, groupIds, organizationIds, roleIds,
469                 userGroupRoles, userGroupIds, addresses, emailAddresses, phones,
470                 websites, announcementsDeliveries, serviceContext);
471 
472             boolean deletePortrait = ParamUtil.getBoolean(
473                 actionRequest, "deletePortrait");
474 
475             if (deletePortrait) {
476                 UserServiceUtil.deletePortrait(user.getUserId());
477             }
478 
479             if (!tempOldScreenName.equals(user.getScreenName())) {
480                 oldScreenName = tempOldScreenName;
481             }
482 
483             if (user.getUserId() == themeDisplay.getUserId()) {
484 
485                 // Reset the locale
486 
487                 HttpServletRequest request = PortalUtil.getHttpServletRequest(
488                     actionRequest);
489                 HttpSession session = request.getSession();
490 
491                 session.removeAttribute(Globals.LOCALE_KEY);
492 
493                 // Clear cached portlet responses
494 
495                 PortletSession portletSession =
496                     actionRequest.getPortletSession();
497 
498                 InvokerPortletImpl.clearResponses(portletSession);
499 
500                 // Password
501 
502                 if (Validator.isNotNull(newPassword1)) {
503                     portletSession.setAttribute(
504                         WebKeys.USER_PASSWORD, newPassword1,
505                         PortletSession.APPLICATION_SCOPE);
506                 }
507             }
508         }
509 
510         return new Object[] {user, oldScreenName};
511     }
512 
513 }