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