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