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.setEmail(email);
302             announcementsDelivery.setSms(sms);
303             announcementsDelivery.setWebsite(website);
304 
305             announcementsDeliveries.add(announcementsDelivery);
306         }
307 
308         return announcementsDeliveries;
309     }
310 
311     protected User updateLockout(ActionRequest actionRequest) throws Exception {
312         User user = PortalUtil.getSelectedUser(actionRequest);
313 
314         UserServiceUtil.updateLockout(user.getUserId(), false);
315 
316         return user;
317     }
318 
319     protected Object[] updateUser(ActionRequest actionRequest)
320         throws Exception {
321 
322         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
323 
324         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
325             WebKeys.THEME_DISPLAY);
326 
327         boolean autoPassword = ParamUtil.getBoolean(
328             actionRequest, "autoPassword", true);
329         String password1 = ParamUtil.getString(actionRequest, "password1");
330         String password2 = ParamUtil.getString(actionRequest, "password2");
331 
332         String reminderQueryQuestion = ParamUtil.getString(
333             actionRequest, "reminderQueryQuestion");
334 
335         if (reminderQueryQuestion.equals(EnterpriseAdminUtil.CUSTOM_QUESTION)) {
336             reminderQueryQuestion = ParamUtil.getString(
337                 actionRequest, "reminderQueryCustomQuestion");
338         }
339 
340         String reminderQueryAnswer = ParamUtil.getString(
341             actionRequest, "reminderQueryAnswer");
342         boolean autoScreenName = ParamUtil.getBoolean(
343             actionRequest, "autoScreenName");
344         String screenName = ParamUtil.getString(actionRequest, "screenName");
345         String emailAddress = ParamUtil.getString(
346             actionRequest, "emailAddress");
347         String openId = ParamUtil.getString(actionRequest, "openId");
348         String languageId = ParamUtil.getString(actionRequest, "languageId");
349         String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
350         String greeting = ParamUtil.getString(actionRequest, "greeting");
351         String firstName = ParamUtil.getString(actionRequest, "firstName");
352         String middleName = ParamUtil.getString(actionRequest, "middleName");
353         String lastName = ParamUtil.getString(actionRequest, "lastName");
354         int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
355         int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
356         boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
357         int birthdayMonth = ParamUtil.getInteger(
358             actionRequest, "birthdayMonth");
359         int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
360         int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
361         String comments = ParamUtil.getString(actionRequest, "comments");
362         String smsSn = ParamUtil.getString(actionRequest, "smsSn");
363         String aimSn = ParamUtil.getString(actionRequest, "aimSn");
364         String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
365         String icqSn = ParamUtil.getString(actionRequest, "icqSn");
366         String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
367         String msnSn = ParamUtil.getString(actionRequest, "msnSn");
368         String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
369         String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
370         String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
371         String ymSn = ParamUtil.getString(actionRequest, "ymSn");
372         String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
373         long[] groupIds = StringUtil.split(ParamUtil.getString(
374             actionRequest, "groupsSearchContainerPrimaryKeys"), 0L);
375         long[] organizationIds = StringUtil.split(ParamUtil.getString(
376             actionRequest, "organizationsSearchContainerPrimaryKeys"), 0L);
377         long[] roleIds = StringUtil.split(ParamUtil.getString(
378             actionRequest, "rolesSearchContainerPrimaryKeys"), 0L);
379         List<UserGroupRole> userGroupRoles =
380             EnterpriseAdminUtil.getUserGroupRoles(actionRequest);
381         long[] userGroupIds = StringUtil.split(ParamUtil.getString(
382             actionRequest, "userGroupsSearchContainerPrimaryKeys"), 0L);
383         boolean sendEmail = true;
384         List<Address> addresses = EnterpriseAdminUtil.getAddresses(
385             actionRequest);
386         List<EmailAddress> emailAddresses =
387             EnterpriseAdminUtil.getEmailAddresses(actionRequest);
388         List<Phone> phones = EnterpriseAdminUtil.getPhones(actionRequest);
389         List<Website> websites = EnterpriseAdminUtil.getWebsites(actionRequest);
390         List<AnnouncementsDelivery> announcementsDeliveries =
391             getAnnouncementsDeliveries(actionRequest);
392 
393         ServiceContext serviceContext = ServiceContextFactory.getInstance(
394             User.class.getName(), actionRequest);
395 
396         User user = null;
397         String oldScreenName = StringPool.BLANK;
398 
399         if (cmd.equals(Constants.ADD)) {
400 
401             // Add user
402 
403             user = UserServiceUtil.addUser(
404                 themeDisplay.getCompanyId(), autoPassword, password1, password2,
405                 autoScreenName, screenName, emailAddress, openId,
406                 themeDisplay.getLocale(), firstName, middleName, lastName,
407                 prefixId, suffixId, male, birthdayMonth, birthdayDay,
408                 birthdayYear, jobTitle, groupIds, organizationIds,
409                 roleIds, userGroupIds, sendEmail, addresses, emailAddresses,
410                 phones, websites, announcementsDeliveries, serviceContext);
411         }
412         else {
413 
414             // Update user
415 
416             user = PortalUtil.getSelectedUser(actionRequest);
417 
418             String oldPassword = AdminUtil.getUpdateUserPassword(
419                 actionRequest, user.getUserId());
420             String newPassword1 = ParamUtil.getString(
421                 actionRequest, "password1");
422             String newPassword2 = ParamUtil.getString(
423                 actionRequest, "password2");
424             boolean passwordReset = ParamUtil.getBoolean(
425                 actionRequest, "passwordReset");
426 
427             String tempOldScreenName = user.getScreenName();
428 
429             user = UserServiceUtil.updateUser(
430                 user.getUserId(), oldPassword, newPassword1, newPassword2,
431                 passwordReset, reminderQueryQuestion, reminderQueryAnswer,
432                 screenName, emailAddress, openId, languageId, timeZoneId,
433                 greeting, comments, firstName, middleName, lastName, prefixId,
434                 suffixId, male, birthdayMonth, birthdayDay, birthdayYear, smsSn,
435                 aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn, skypeSn,
436                 twitterSn, ymSn, jobTitle, groupIds, organizationIds, roleIds,
437                 userGroupRoles, userGroupIds, addresses, emailAddresses, phones,
438                 websites, announcementsDeliveries, serviceContext);
439 
440             boolean deletePortrait = ParamUtil.getBoolean(
441                 actionRequest, "deletePortrait");
442 
443             if (deletePortrait) {
444                 UserServiceUtil.deletePortrait(user.getUserId());
445             }
446 
447             if (!tempOldScreenName.equals(user.getScreenName())) {
448                 oldScreenName = tempOldScreenName;
449             }
450 
451             if (user.getUserId() == themeDisplay.getUserId()) {
452 
453                 // Reset the locale
454 
455                 HttpServletRequest request = PortalUtil.getHttpServletRequest(
456                     actionRequest);
457                 HttpSession session = request.getSession();
458 
459                 session.removeAttribute(Globals.LOCALE_KEY);
460 
461                 // Clear cached portlet responses
462 
463                 PortletSession portletSession =
464                     actionRequest.getPortletSession();
465 
466                 InvokerPortletImpl.clearResponses(portletSession);
467 
468                 // Password
469 
470                 if (Validator.isNotNull(newPassword1)) {
471                     portletSession.setAttribute(
472                         WebKeys.USER_PASSWORD, newPassword1,
473                         PortletSession.APPLICATION_SCOPE);
474                 }
475             }
476         }
477 
478         return new Object[] {user, oldScreenName};
479     }
480 
481 }