1   /**
2    * Copyright (c) 2000-2010 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   *
12   * 
13   */
14  
15  package com.liferay.portlet.enterpriseadmin.action;
16  
17  import com.liferay.portal.ContactFirstNameException;
18  import com.liferay.portal.ContactFullNameException;
19  import com.liferay.portal.ContactLastNameException;
20  import com.liferay.portal.DuplicateUserEmailAddressException;
21  import com.liferay.portal.DuplicateUserScreenNameException;
22  import com.liferay.portal.NoSuchUserException;
23  import com.liferay.portal.RequiredUserException;
24  import com.liferay.portal.ReservedUserEmailAddressException;
25  import com.liferay.portal.ReservedUserScreenNameException;
26  import com.liferay.portal.UserEmailAddressException;
27  import com.liferay.portal.UserIdException;
28  import com.liferay.portal.UserPasswordException;
29  import com.liferay.portal.UserScreenNameException;
30  import com.liferay.portal.UserSmsException;
31  import com.liferay.portal.kernel.bean.BeanParamUtil;
32  import com.liferay.portal.kernel.servlet.SessionErrors;
33  import com.liferay.portal.kernel.util.CalendarFactoryUtil;
34  import com.liferay.portal.kernel.util.Constants;
35  import com.liferay.portal.kernel.util.HttpUtil;
36  import com.liferay.portal.kernel.util.LocaleUtil;
37  import com.liferay.portal.kernel.util.ParamUtil;
38  import com.liferay.portal.kernel.util.StringPool;
39  import com.liferay.portal.kernel.util.StringUtil;
40  import com.liferay.portal.kernel.util.Validator;
41  import com.liferay.portal.model.Contact;
42  import com.liferay.portal.model.Group;
43  import com.liferay.portal.model.Layout;
44  import com.liferay.portal.model.User;
45  import com.liferay.portal.security.auth.PrincipalException;
46  import com.liferay.portal.service.UserServiceUtil;
47  import com.liferay.portal.struts.PortletAction;
48  import com.liferay.portal.theme.ThemeDisplay;
49  import com.liferay.portal.util.PortalUtil;
50  import com.liferay.portal.util.WebKeys;
51  import com.liferay.portlet.InvokerPortletImpl;
52  import com.liferay.portlet.admin.util.AdminUtil;
53  import com.liferay.portlet.announcements.model.impl.AnnouncementsEntryImpl;
54  import com.liferay.portlet.announcements.service.AnnouncementsDeliveryServiceUtil;
55  
56  import java.util.Calendar;
57  
58  import javax.portlet.ActionRequest;
59  import javax.portlet.ActionResponse;
60  import javax.portlet.PortletConfig;
61  import javax.portlet.PortletSession;
62  import javax.portlet.RenderRequest;
63  import javax.portlet.RenderResponse;
64  
65  import javax.servlet.http.HttpServletRequest;
66  import javax.servlet.http.HttpSession;
67  
68  import org.apache.struts.Globals;
69  import org.apache.struts.action.ActionForm;
70  import org.apache.struts.action.ActionForward;
71  import org.apache.struts.action.ActionMapping;
72  
73  /**
74   * <a href="EditUserAction.java.html"><b><i>View Source</i></b></a>
75   *
76   * @author Brian Wing Shun Chan
77   */
78  public class EditUserAction extends PortletAction {
79  
80      public void processAction(
81              ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
82              ActionRequest actionRequest, ActionResponse actionResponse)
83          throws Exception {
84  
85          String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
86  
87          try {
88              User user = null;
89              String oldScreenName = StringPool.BLANK;
90              String oldLanguageId = StringPool.BLANK;
91  
92              if (cmd.equals(Constants.ADD)) {
93                  user = addUser(actionRequest);
94              }
95              else if (cmd.equals(Constants.DEACTIVATE) ||
96                       cmd.equals(Constants.DELETE) ||
97                       cmd.equals(Constants.RESTORE)) {
98  
99                  deleteUsers(actionRequest);
100             }
101             else if (cmd.equals("deleteRole")) {
102                 deleteRole(actionRequest);
103             }
104             else if (cmd.equals(Constants.UPDATE)) {
105                 Object[] returnValue = updateUser(actionRequest);
106 
107                 user = (User)returnValue[0];
108                 oldScreenName = ((String)returnValue[1]);
109                 oldLanguageId = ((String)returnValue[2]);
110             }
111             else if (cmd.equals("unlock")) {
112                 user = updateLockout(actionRequest);
113             }
114 
115             String redirect = ParamUtil.getString(actionRequest, "redirect");
116 
117             if (user != null) {
118                 ThemeDisplay themeDisplay =
119                     (ThemeDisplay)actionRequest.getAttribute(
120                         WebKeys.THEME_DISPLAY);
121 
122                 if (Validator.isNotNull(oldScreenName)) {
123 
124                     // This will fix the redirect if the user is on his personal
125                     // my account page and changes his screen name. A redirect
126                     // that references the old screen name no longer points to a
127                     // valid screen name and therefore needs to be updated.
128 
129                     Group group = user.getGroup();
130 
131                     if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
132                         Layout layout = themeDisplay.getLayout();
133 
134                         String friendlyURLPath = group.getPathFriendlyURL(
135                             layout.isPrivateLayout(), themeDisplay);
136 
137                         String oldPath =
138                             friendlyURLPath + StringPool.SLASH + oldScreenName;
139                         String newPath =
140                             friendlyURLPath + StringPool.SLASH +
141                                 user.getScreenName();
142 
143                         redirect = StringUtil.replace(
144                             redirect, oldPath, newPath);
145 
146                         redirect = StringUtil.replace(
147                             redirect, HttpUtil.encodeURL(oldPath),
148                             HttpUtil.encodeURL(newPath));
149                     }
150                 }
151 
152                 if (Validator.isNotNull(oldLanguageId) &&
153                     themeDisplay.isI18n()) {
154 
155                     String i18nLanguageId = user.getLanguageId();
156                     int pos = i18nLanguageId.indexOf(StringPool.UNDERLINE);
157 
158                     if (pos != -1){
159                         i18nLanguageId = i18nLanguageId.substring(0, pos);
160                     }
161 
162                     String i18nPath = StringPool.SLASH + i18nLanguageId;
163 
164                     redirect = StringUtil.replace(
165                         redirect, themeDisplay.getI18nPath(), i18nPath);
166                 }
167 
168                 redirect = HttpUtil.setParameter(
169                     redirect, actionResponse.getNamespace() + "p_u_i_d",
170                     user.getUserId());
171             }
172 
173             sendRedirect(actionRequest, actionResponse, redirect);
174         }
175         catch (Exception e) {
176             if (e instanceof NoSuchUserException ||
177                 e instanceof PrincipalException) {
178 
179                 SessionErrors.add(actionRequest, e.getClass().getName());
180 
181                 setForward(actionRequest, "portlet.enterprise_admin.error");
182             }
183             else if (e instanceof ContactFirstNameException ||
184                      e instanceof ContactFullNameException ||
185                      e instanceof ContactLastNameException ||
186                      e instanceof DuplicateUserEmailAddressException ||
187                      e instanceof DuplicateUserScreenNameException ||
188                      e instanceof RequiredUserException ||
189                      e instanceof ReservedUserEmailAddressException ||
190                      e instanceof ReservedUserScreenNameException ||
191                      e instanceof UserEmailAddressException ||
192                      e instanceof UserIdException ||
193                      e instanceof UserPasswordException ||
194                      e instanceof UserScreenNameException ||
195                      e instanceof UserSmsException) {
196 
197                 SessionErrors.add(actionRequest, e.getClass().getName(), e);
198 
199                 if (e instanceof RequiredUserException) {
200                     actionResponse.sendRedirect(
201                         ParamUtil.getString(actionRequest, "redirect"));
202                 }
203             }
204             else {
205                 throw e;
206             }
207         }
208     }
209 
210     public ActionForward render(
211             ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
212             RenderRequest renderRequest, RenderResponse renderResponse)
213         throws Exception {
214 
215         try {
216             PortalUtil.getSelectedUser(renderRequest);
217         }
218         catch (Exception e) {
219             if (e instanceof PrincipalException) {
220                 SessionErrors.add(renderRequest, e.getClass().getName());
221 
222                 return mapping.findForward("portlet.enterprise_admin.error");
223             }
224             else {
225                 throw e;
226             }
227         }
228 
229         return mapping.findForward(
230             getForward(renderRequest, "portlet.enterprise_admin.edit_user"));
231     }
232 
233     protected User addUser(ActionRequest actionRequest)
234         throws Exception {
235 
236         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
237             WebKeys.THEME_DISPLAY);
238 
239         boolean autoPassword = ParamUtil.getBoolean(
240             actionRequest, "autoPassword", true);
241         String password1 = ParamUtil.getString(actionRequest, "password1");
242         String password2 = ParamUtil.getString(actionRequest, "password2");
243         boolean autoScreenName = ParamUtil.getBoolean(
244             actionRequest, "autoScreenName");
245         String screenName = ParamUtil.getString(actionRequest, "screenName");
246         String emailAddress = ParamUtil.getString(
247             actionRequest, "emailAddress");
248         String firstName = ParamUtil.getString(actionRequest, "firstName");
249         String middleName = ParamUtil.getString(actionRequest, "middleName");
250         String lastName = ParamUtil.getString(actionRequest, "lastName");
251         int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
252         int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
253         boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
254         int birthdayMonth = ParamUtil.getInteger(
255             actionRequest, "birthdayMonth");
256         int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
257         int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
258         String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
259         long[] organizationIds = StringUtil.split(
260             ParamUtil.getString(actionRequest, "organizationIds"),  0L);
261         boolean sendEmail = true;
262 
263         User user = null;
264 
265         user = UserServiceUtil.addUser(
266             themeDisplay.getCompanyId(), autoPassword, password1, password2,
267             autoScreenName, screenName, emailAddress, LocaleUtil.getDefault(),
268             firstName, middleName, lastName, prefixId, suffixId, male,
269             birthdayMonth, birthdayDay, birthdayYear, jobTitle, organizationIds,
270             sendEmail);
271 
272         return user;
273     }
274 
275     protected void deleteRole(ActionRequest actionRequest) throws Exception {
276         User user = PortalUtil.getSelectedUser(actionRequest);
277 
278         long roleId = ParamUtil.getLong(actionRequest, "roleId");
279 
280         UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
281     }
282 
283     protected void deleteUsers(ActionRequest actionRequest) throws Exception {
284         String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
285 
286         long[] deleteUserIds = StringUtil.split(
287             ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
288 
289         for (int i = 0; i < deleteUserIds.length; i++) {
290             if (cmd.equals(Constants.DEACTIVATE) ||
291                 cmd.equals(Constants.RESTORE)) {
292 
293                 boolean active = !cmd.equals(Constants.DEACTIVATE);
294 
295                 UserServiceUtil.updateActive(deleteUserIds[i], active);
296             }
297             else {
298                 UserServiceUtil.deleteUser(deleteUserIds[i]);
299             }
300         }
301     }
302 
303     protected User updateLockout(ActionRequest actionRequest) throws Exception {
304         User user = PortalUtil.getSelectedUser(actionRequest);
305 
306         UserServiceUtil.updateLockout(user.getUserId(), false);
307 
308         return user;
309     }
310 
311     protected Object[] updateUser(ActionRequest actionRequest)
312         throws Exception {
313 
314         ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
315             WebKeys.THEME_DISPLAY);
316 
317         User user = PortalUtil.getSelectedUser(actionRequest);
318 
319         Contact contact = user.getContact();
320 
321         Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
322 
323         birthdayCal.setTime(contact.getBirthday());
324 
325         String oldPassword = AdminUtil.getUpdateUserPassword(
326             actionRequest, user.getUserId());
327         String newPassword1 = ParamUtil.getString(actionRequest, "password1");
328         String newPassword2 = ParamUtil.getString(actionRequest, "password2");
329         boolean passwordReset = ParamUtil.getBoolean(
330             actionRequest, "passwordReset");
331         String oldScreenName = user.getScreenName();
332         String screenName = BeanParamUtil.getString(
333             user, actionRequest, "screenName");
334         String emailAddress = BeanParamUtil.getString(
335             user, actionRequest, "emailAddress");
336         String oldLanguageId = user.getLanguageId();
337         String languageId = BeanParamUtil.getString(
338             user, actionRequest, "languageId");
339         String timeZoneId = BeanParamUtil.getString(
340             user, actionRequest, "timeZoneId");
341         String greeting = BeanParamUtil.getString(
342             user, actionRequest, "greeting");
343         String firstName = BeanParamUtil.getString(
344             user, actionRequest, "firstName");
345         String middleName = BeanParamUtil.getString(
346             user, actionRequest, "middleName");
347         String lastName = BeanParamUtil.getString(
348             user, actionRequest, "lastName");
349         int prefixId = BeanParamUtil.getInteger(
350             user, actionRequest, "prefixId");
351         int suffixId = BeanParamUtil.getInteger(
352             user, actionRequest, "suffixId");
353         boolean male = BeanParamUtil.getBoolean(
354             user, actionRequest, "male", true);
355         int birthdayMonth = ParamUtil.getInteger(
356             actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
357         int birthdayDay = ParamUtil.getInteger(
358             actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
359         int birthdayYear = ParamUtil.getInteger(
360             actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
361         String comments = BeanParamUtil.getString(
362             user, actionRequest, "comments");
363         String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
364         String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
365         String facebookSn = BeanParamUtil.getString(
366             contact, actionRequest, "facebookSn");
367         String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
368         String jabberSn = BeanParamUtil.getString(
369             contact, actionRequest, "jabberSn");
370         String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
371         String mySpaceSn = BeanParamUtil.getString(
372             contact, actionRequest, "mySpaceSn");
373         String skypeSn = BeanParamUtil.getString(
374             contact, actionRequest, "skypeSn");
375         String twitterSn = BeanParamUtil.getString(
376             contact, actionRequest, "twitterSn");
377         String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
378         String jobTitle = BeanParamUtil.getString(
379             user, actionRequest, "jobTitle");
380         long[] organizationIds = StringUtil.split(
381             ParamUtil.getString(actionRequest, "organizationIds"),  0L);
382 
383         user = UserServiceUtil.updateUser(
384             user.getUserId(), oldPassword, newPassword1, newPassword2,
385             passwordReset, screenName, emailAddress, languageId, timeZoneId,
386             greeting, comments, firstName, middleName, lastName, prefixId,
387             suffixId, male, birthdayMonth, birthdayDay, birthdayYear, smsSn,
388             aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn, skypeSn,
389             twitterSn, ymSn, jobTitle, organizationIds);
390 
391         if (oldScreenName.equals(user.getScreenName())) {
392             oldScreenName = StringPool.BLANK;
393         }
394 
395         String openId = BeanParamUtil.getString(user, actionRequest, "openId");
396 
397         if (!openId.equals(user.getOpenId())) {
398             UserServiceUtil.updateOpenId(user.getUserId(), openId);
399         }
400 
401         for (String type : AnnouncementsEntryImpl.TYPES) {
402             boolean email = ParamUtil.getBoolean(
403                 actionRequest, "announcementsType" + type + "Email");
404             boolean sms = ParamUtil.getBoolean(
405                 actionRequest, "announcementsType" + type + "Sms");
406             boolean website = ParamUtil.getBoolean(
407                 actionRequest, "announcementsType" + type + "Website");
408 
409             AnnouncementsDeliveryServiceUtil.updateDelivery(
410                 user.getUserId(), type, email, sms, website);
411         }
412 
413         if (user.getUserId() == themeDisplay.getUserId()) {
414 
415             // Reset the locale
416 
417             HttpServletRequest request = PortalUtil.getHttpServletRequest(
418                 actionRequest);
419             HttpSession session = request.getSession();
420 
421             session.removeAttribute(Globals.LOCALE_KEY);
422 
423             // Clear cached portlet responses
424 
425             PortletSession portletSession = actionRequest.getPortletSession();
426 
427             InvokerPortletImpl.clearResponses(portletSession);
428 
429             // Password
430 
431             if (Validator.isNotNull(newPassword1)) {
432                 portletSession.setAttribute(
433                     WebKeys.USER_PASSWORD, newPassword1,
434                     PortletSession.APPLICATION_SCOPE);
435             }
436         }
437 
438         return new Object[] {user, oldScreenName, oldLanguageId};
439     }
440 
441 }