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