001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.usersadmin.action;
016    
017    import com.liferay.portal.AddressCityException;
018    import com.liferay.portal.AddressStreetException;
019    import com.liferay.portal.AddressZipException;
020    import com.liferay.portal.CompanyMaxUsersException;
021    import com.liferay.portal.ContactBirthdayException;
022    import com.liferay.portal.ContactFirstNameException;
023    import com.liferay.portal.ContactFullNameException;
024    import com.liferay.portal.ContactLastNameException;
025    import com.liferay.portal.DuplicateOpenIdException;
026    import com.liferay.portal.DuplicateUserEmailAddressException;
027    import com.liferay.portal.DuplicateUserScreenNameException;
028    import com.liferay.portal.EmailAddressException;
029    import com.liferay.portal.GroupFriendlyURLException;
030    import com.liferay.portal.NoSuchCountryException;
031    import com.liferay.portal.NoSuchListTypeException;
032    import com.liferay.portal.NoSuchRegionException;
033    import com.liferay.portal.NoSuchUserException;
034    import com.liferay.portal.PhoneNumberException;
035    import com.liferay.portal.RequiredUserException;
036    import com.liferay.portal.ReservedUserEmailAddressException;
037    import com.liferay.portal.ReservedUserScreenNameException;
038    import com.liferay.portal.UserEmailAddressException;
039    import com.liferay.portal.UserFieldException;
040    import com.liferay.portal.UserIdException;
041    import com.liferay.portal.UserPasswordException;
042    import com.liferay.portal.UserReminderQueryException;
043    import com.liferay.portal.UserScreenNameException;
044    import com.liferay.portal.UserSmsException;
045    import com.liferay.portal.WebsiteURLException;
046    import com.liferay.portal.kernel.bean.BeanParamUtil;
047    import com.liferay.portal.kernel.language.LanguageUtil;
048    import com.liferay.portal.kernel.servlet.SessionErrors;
049    import com.liferay.portal.kernel.servlet.SessionMessages;
050    import com.liferay.portal.kernel.util.CalendarFactoryUtil;
051    import com.liferay.portal.kernel.util.CharPool;
052    import com.liferay.portal.kernel.util.Constants;
053    import com.liferay.portal.kernel.util.HttpUtil;
054    import com.liferay.portal.kernel.util.LocaleUtil;
055    import com.liferay.portal.kernel.util.ParamUtil;
056    import com.liferay.portal.kernel.util.StringPool;
057    import com.liferay.portal.kernel.util.StringUtil;
058    import com.liferay.portal.kernel.util.Validator;
059    import com.liferay.portal.kernel.workflow.WorkflowConstants;
060    import com.liferay.portal.model.Address;
061    import com.liferay.portal.model.Company;
062    import com.liferay.portal.model.Contact;
063    import com.liferay.portal.model.EmailAddress;
064    import com.liferay.portal.model.Group;
065    import com.liferay.portal.model.Layout;
066    import com.liferay.portal.model.Phone;
067    import com.liferay.portal.model.User;
068    import com.liferay.portal.model.UserGroupRole;
069    import com.liferay.portal.model.Website;
070    import com.liferay.portal.security.auth.PrincipalException;
071    import com.liferay.portal.security.membershippolicy.MembershipPolicyException;
072    import com.liferay.portal.service.ServiceContext;
073    import com.liferay.portal.service.ServiceContextFactory;
074    import com.liferay.portal.service.UserLocalServiceUtil;
075    import com.liferay.portal.service.UserServiceUtil;
076    import com.liferay.portal.struts.PortletAction;
077    import com.liferay.portal.theme.ThemeDisplay;
078    import com.liferay.portal.util.PortalUtil;
079    import com.liferay.portal.util.PortletKeys;
080    import com.liferay.portal.util.PropsValues;
081    import com.liferay.portal.util.WebKeys;
082    import com.liferay.portlet.InvokerPortletImpl;
083    import com.liferay.portlet.admin.util.AdminUtil;
084    import com.liferay.portlet.announcements.model.AnnouncementsDelivery;
085    import com.liferay.portlet.announcements.model.AnnouncementsEntryConstants;
086    import com.liferay.portlet.announcements.model.impl.AnnouncementsDeliveryImpl;
087    import com.liferay.portlet.announcements.service.AnnouncementsDeliveryLocalServiceUtil;
088    import com.liferay.portlet.sites.util.SitesUtil;
089    import com.liferay.portlet.usersadmin.util.UsersAdmin;
090    import com.liferay.portlet.usersadmin.util.UsersAdminUtil;
091    
092    import java.util.ArrayList;
093    import java.util.Calendar;
094    import java.util.List;
095    import java.util.Locale;
096    
097    import javax.portlet.ActionRequest;
098    import javax.portlet.ActionResponse;
099    import javax.portlet.PortletConfig;
100    import javax.portlet.PortletSession;
101    import javax.portlet.RenderRequest;
102    import javax.portlet.RenderResponse;
103    
104    import javax.servlet.http.HttpServletRequest;
105    import javax.servlet.http.HttpServletResponse;
106    import javax.servlet.http.HttpSession;
107    
108    import org.apache.struts.Globals;
109    import org.apache.struts.action.ActionForm;
110    import org.apache.struts.action.ActionForward;
111    import org.apache.struts.action.ActionMapping;
112    
113    /**
114     * @author Brian Wing Shun Chan
115     * @author Jorge Ferrer
116     * @author Julio Camarero
117     * @author Wesley Gong
118     */
119    public class EditUserAction extends PortletAction {
120    
121            @Override
122            public void processAction(
123                            ActionMapping actionMapping, ActionForm actionForm,
124                            PortletConfig portletConfig, ActionRequest actionRequest,
125                            ActionResponse actionResponse)
126                    throws Exception {
127    
128                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
129    
130                    try {
131                            User user = null;
132                            String oldScreenName = StringPool.BLANK;
133                            boolean updateLanguageId = false;
134    
135                            if (cmd.equals(Constants.ADD)) {
136                                    user = addUser(actionRequest);
137                            }
138                            else if (cmd.equals(Constants.DEACTIVATE) ||
139                                             cmd.equals(Constants.DELETE) ||
140                                             cmd.equals(Constants.RESTORE)) {
141    
142                                    deleteUsers(actionRequest);
143                            }
144                            else if (cmd.equals("deleteRole")) {
145                                    deleteRole(actionRequest);
146                            }
147                            else if (cmd.equals(Constants.UPDATE)) {
148                                    Object[] returnValue = updateUser(
149                                            actionRequest, actionResponse);
150    
151                                    user = (User)returnValue[0];
152                                    oldScreenName = ((String)returnValue[1]);
153                                    updateLanguageId = ((Boolean)returnValue[2]);
154                            }
155                            else if (cmd.equals("unlock")) {
156                                    user = updateLockout(actionRequest);
157                            }
158    
159                            ThemeDisplay themeDisplay =
160                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
161    
162                            String redirect = ParamUtil.getString(actionRequest, "redirect");
163    
164                            if (user != null) {
165                                    if (Validator.isNotNull(oldScreenName)) {
166    
167                                            // This will fix the redirect if the user is on his personal
168                                            // my account page and changes his screen name. A redirect
169                                            // that references the old screen name no longer points to a
170                                            // valid screen name and therefore needs to be updated.
171    
172                                            Group group = user.getGroup();
173    
174                                            if (group.getGroupId() == themeDisplay.getScopeGroupId()) {
175                                                    Layout layout = themeDisplay.getLayout();
176    
177                                                    String friendlyURLPath = group.getPathFriendlyURL(
178                                                            layout.isPrivateLayout(), themeDisplay);
179    
180                                                    String oldPath =
181                                                            friendlyURLPath + StringPool.SLASH + oldScreenName;
182                                                    String newPath =
183                                                            friendlyURLPath + StringPool.SLASH +
184                                                                    user.getScreenName();
185    
186                                                    redirect = StringUtil.replace(
187                                                            redirect, oldPath, newPath);
188    
189                                                    redirect = StringUtil.replace(
190                                                            redirect, HttpUtil.encodeURL(oldPath),
191                                                            HttpUtil.encodeURL(newPath));
192                                            }
193                                    }
194    
195                                    if (updateLanguageId && themeDisplay.isI18n()) {
196                                            String i18nLanguageId = user.getLanguageId();
197                                            int pos = i18nLanguageId.indexOf(CharPool.UNDERLINE);
198    
199                                            if (pos != -1) {
200                                                    i18nLanguageId = i18nLanguageId.substring(0, pos);
201                                            }
202    
203                                            String i18nPath = StringPool.SLASH + i18nLanguageId;
204    
205                                            redirect = StringUtil.replace(
206                                                    redirect, themeDisplay.getI18nPath(), i18nPath);
207                                    }
208    
209                                    redirect = HttpUtil.setParameter(
210                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
211                                            user.getUserId());
212                            }
213    
214                            Group scopeGroup = themeDisplay.getScopeGroup();
215    
216                            if (scopeGroup.isUser() &&
217                                    (UserLocalServiceUtil.fetchUserById(
218                                            scopeGroup.getClassPK()) == null)) {
219    
220                                    redirect = HttpUtil.setParameter(redirect, "doAsGroupId" , 0);
221                                    redirect = HttpUtil.setParameter(redirect, "refererPlid" , 0);
222                            }
223    
224                            sendRedirect(actionRequest, actionResponse, redirect);
225                    }
226                    catch (Exception e) {
227                            if (e instanceof NoSuchUserException ||
228                                    e instanceof PrincipalException) {
229    
230                                    SessionErrors.add(actionRequest, e.getClass());
231    
232                                    setForward(actionRequest, "portlet.users_admin.error");
233                            }
234                            else if (e instanceof AddressCityException ||
235                                             e instanceof AddressStreetException ||
236                                             e instanceof AddressZipException ||
237                                             e instanceof CompanyMaxUsersException ||
238                                             e instanceof ContactBirthdayException ||
239                                             e instanceof ContactFirstNameException ||
240                                             e instanceof ContactFullNameException ||
241                                             e instanceof ContactLastNameException ||
242                                             e instanceof DuplicateOpenIdException ||
243                                             e instanceof DuplicateUserEmailAddressException ||
244                                             e instanceof DuplicateUserScreenNameException ||
245                                             e instanceof EmailAddressException ||
246                                             e instanceof GroupFriendlyURLException ||
247                                             e instanceof MembershipPolicyException ||
248                                             e instanceof NoSuchCountryException ||
249                                             e instanceof NoSuchListTypeException ||
250                                             e instanceof NoSuchRegionException ||
251                                             e instanceof PhoneNumberException ||
252                                             e instanceof RequiredUserException ||
253                                             e instanceof ReservedUserEmailAddressException ||
254                                             e instanceof ReservedUserScreenNameException ||
255                                             e instanceof UserEmailAddressException ||
256                                             e instanceof UserFieldException ||
257                                             e instanceof UserIdException ||
258                                             e instanceof UserPasswordException ||
259                                             e instanceof UserReminderQueryException ||
260                                             e instanceof UserScreenNameException ||
261                                             e instanceof UserSmsException ||
262                                             e instanceof WebsiteURLException) {
263    
264                                    if (e instanceof NoSuchListTypeException) {
265                                            NoSuchListTypeException nslte = (NoSuchListTypeException)e;
266    
267                                            SessionErrors.add(
268                                                    actionRequest,
269                                                    e.getClass().getName() + nslte.getType());
270                                    }
271                                    else {
272                                            SessionErrors.add(actionRequest, e.getClass(), e);
273                                    }
274    
275                                    String password1 = actionRequest.getParameter("password1");
276                                    String password2 = actionRequest.getParameter("password2");
277    
278                                    boolean submittedPassword = false;
279    
280                                    if (!Validator.isBlank(password1) ||
281                                            !Validator.isBlank(password2)) {
282    
283                                            submittedPassword = true;
284                                    }
285    
286                                    if (e instanceof CompanyMaxUsersException ||
287                                            e instanceof RequiredUserException ||
288                                            submittedPassword) {
289    
290                                            String redirect = PortalUtil.escapeRedirect(
291                                                    ParamUtil.getString(actionRequest, "redirect"));
292    
293                                            if (submittedPassword) {
294                                                    User user = PortalUtil.getSelectedUser(actionRequest);
295    
296                                                    redirect = HttpUtil.setParameter(
297                                                            redirect, actionResponse.getNamespace() + "p_u_i_d",
298                                                            user.getUserId());
299                                            }
300    
301                                            if (Validator.isNotNull(redirect)) {
302                                                    actionResponse.sendRedirect(redirect);
303                                            }
304                                    }
305                            }
306                            else {
307                                    throw e;
308                            }
309                    }
310            }
311    
312            @Override
313            public ActionForward render(
314                            ActionMapping actionMapping, ActionForm actionForm,
315                            PortletConfig portletConfig, RenderRequest renderRequest,
316                            RenderResponse renderResponse)
317                    throws Exception {
318    
319                    try {
320                            PortalUtil.getSelectedUser(renderRequest);
321                    }
322                    catch (Exception e) {
323                            if (e instanceof PrincipalException) {
324                                    SessionErrors.add(renderRequest, e.getClass());
325    
326                                    return actionMapping.findForward("portlet.users_admin.error");
327                            }
328                            else {
329                                    throw e;
330                            }
331                    }
332    
333                    return actionMapping.findForward(
334                            getForward(renderRequest, "portlet.users_admin.edit_user"));
335            }
336    
337            protected User addUser(ActionRequest actionRequest) throws Exception {
338                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
339                            WebKeys.THEME_DISPLAY);
340    
341                    boolean autoPassword = ParamUtil.getBoolean(
342                            actionRequest, "autoPassword", true);
343                    String password1 = actionRequest.getParameter("password1");
344                    String password2 = actionRequest.getParameter("password2");
345    
346                    String reminderQueryQuestion = ParamUtil.getString(
347                            actionRequest, "reminderQueryQuestion");
348    
349                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
350                            reminderQueryQuestion = ParamUtil.getString(
351                                    actionRequest, "reminderQueryCustomQuestion");
352                    }
353    
354                    String reminderQueryAnswer = ParamUtil.getString(
355                            actionRequest, "reminderQueryAnswer");
356                    boolean autoScreenName = ParamUtil.getBoolean(
357                            actionRequest, "autoScreenName");
358                    String screenName = ParamUtil.getString(actionRequest, "screenName");
359                    String emailAddress = ParamUtil.getString(
360                            actionRequest, "emailAddress");
361                    long facebookId = 0;
362                    String openId = ParamUtil.getString(actionRequest, "openId");
363                    String languageId = ParamUtil.getString(actionRequest, "languageId");
364                    String timeZoneId = ParamUtil.getString(actionRequest, "timeZoneId");
365                    String greeting = ParamUtil.getString(actionRequest, "greeting");
366                    String firstName = ParamUtil.getString(actionRequest, "firstName");
367                    String middleName = ParamUtil.getString(actionRequest, "middleName");
368                    String lastName = ParamUtil.getString(actionRequest, "lastName");
369                    int prefixId = ParamUtil.getInteger(actionRequest, "prefixId");
370                    int suffixId = ParamUtil.getInteger(actionRequest, "suffixId");
371                    boolean male = ParamUtil.getBoolean(actionRequest, "male", true);
372                    int birthdayMonth = ParamUtil.getInteger(
373                            actionRequest, "birthdayMonth");
374                    int birthdayDay = ParamUtil.getInteger(actionRequest, "birthdayDay");
375                    int birthdayYear = ParamUtil.getInteger(actionRequest, "birthdayYear");
376                    String comments = ParamUtil.getString(actionRequest, "comments");
377                    String smsSn = ParamUtil.getString(actionRequest, "smsSn");
378                    String aimSn = ParamUtil.getString(actionRequest, "aimSn");
379                    String facebookSn = ParamUtil.getString(actionRequest, "facebookSn");
380                    String icqSn = ParamUtil.getString(actionRequest, "icqSn");
381                    String jabberSn = ParamUtil.getString(actionRequest, "jabberSn");
382                    String msnSn = ParamUtil.getString(actionRequest, "msnSn");
383                    String mySpaceSn = ParamUtil.getString(actionRequest, "mySpaceSn");
384                    String skypeSn = ParamUtil.getString(actionRequest, "skypeSn");
385                    String twitterSn = ParamUtil.getString(actionRequest, "twitterSn");
386                    String ymSn = ParamUtil.getString(actionRequest, "ymSn");
387                    String jobTitle = ParamUtil.getString(actionRequest, "jobTitle");
388                    long[] groupIds = UsersAdminUtil.getGroupIds(actionRequest);
389                    long[] organizationIds = UsersAdminUtil.getOrganizationIds(
390                            actionRequest);
391                    long[] roleIds = UsersAdminUtil.getRoleIds(actionRequest);
392                    List<UserGroupRole> userGroupRoles = UsersAdminUtil.getUserGroupRoles(
393                            actionRequest);
394                    long[] userGroupIds = UsersAdminUtil.getUserGroupIds(actionRequest);
395                    List<Address> addresses = UsersAdminUtil.getAddresses(actionRequest);
396                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
397                            actionRequest);
398                    List<Phone> phones = UsersAdminUtil.getPhones(actionRequest);
399                    List<Website> websites = UsersAdminUtil.getWebsites(actionRequest);
400                    List<AnnouncementsDelivery> announcementsDeliveries =
401                            getAnnouncementsDeliveries(actionRequest);
402                    boolean sendEmail = true;
403    
404                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
405                            User.class.getName(), actionRequest);
406    
407                    User user = UserServiceUtil.addUser(
408                            themeDisplay.getCompanyId(), autoPassword, password1, password2,
409                            autoScreenName, screenName, emailAddress, facebookId, openId,
410                            LocaleUtil.getDefault(), firstName, middleName, lastName, prefixId,
411                            suffixId, male, birthdayMonth, birthdayDay, birthdayYear, jobTitle,
412                            groupIds, organizationIds, roleIds, userGroupIds, addresses,
413                            emailAddresses, phones, websites, announcementsDeliveries,
414                            sendEmail, serviceContext);
415    
416                    if (!userGroupRoles.isEmpty()) {
417                            for (UserGroupRole userGroupRole : userGroupRoles) {
418                                    userGroupRole.setUserId(user.getUserId());
419                            }
420    
421                            user = UserServiceUtil.updateUser(
422                                    user.getUserId(), StringPool.BLANK, StringPool.BLANK,
423                                    StringPool.BLANK, false, reminderQueryQuestion,
424                                    reminderQueryAnswer, user.getScreenName(),
425                                    user.getEmailAddress(), facebookId, openId, languageId,
426                                    timeZoneId, greeting, comments, firstName, middleName, lastName,
427                                    prefixId, suffixId, male, birthdayMonth, birthdayDay,
428                                    birthdayYear, smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn,
429                                    mySpaceSn, skypeSn, twitterSn, ymSn, jobTitle, groupIds,
430                                    organizationIds, roleIds, userGroupRoles, userGroupIds,
431                                    addresses, emailAddresses, phones, websites,
432                                    announcementsDeliveries, serviceContext);
433                    }
434    
435                    long publicLayoutSetPrototypeId = ParamUtil.getLong(
436                            actionRequest, "publicLayoutSetPrototypeId");
437                    long privateLayoutSetPrototypeId = ParamUtil.getLong(
438                            actionRequest, "privateLayoutSetPrototypeId");
439                    boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
440                            actionRequest, "publicLayoutSetPrototypeLinkEnabled");
441                    boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
442                            actionRequest, "privateLayoutSetPrototypeLinkEnabled");
443    
444                    SitesUtil.updateLayoutSetPrototypesLinks(
445                            user.getGroup(), publicLayoutSetPrototypeId,
446                            privateLayoutSetPrototypeId, publicLayoutSetPrototypeLinkEnabled,
447                            privateLayoutSetPrototypeLinkEnabled);
448    
449                    return user;
450            }
451    
452            protected void deleteRole(ActionRequest actionRequest) throws Exception {
453                    User user = PortalUtil.getSelectedUser(actionRequest);
454    
455                    long roleId = ParamUtil.getLong(actionRequest, "roleId");
456    
457                    UserServiceUtil.deleteRoleUser(roleId, user.getUserId());
458            }
459    
460            protected void deleteUsers(ActionRequest actionRequest) throws Exception {
461                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
462    
463                    long[] deleteUserIds = StringUtil.split(
464                            ParamUtil.getString(actionRequest, "deleteUserIds"), 0L);
465    
466                    for (long deleteUserId : deleteUserIds) {
467                            if (cmd.equals(Constants.DEACTIVATE) ||
468                                    cmd.equals(Constants.RESTORE)) {
469    
470                                    int status = WorkflowConstants.STATUS_APPROVED;
471    
472                                    if (cmd.equals(Constants.DEACTIVATE)) {
473                                            status = WorkflowConstants.STATUS_INACTIVE;
474                                    }
475    
476                                    UserServiceUtil.updateStatus(deleteUserId, status);
477                            }
478                            else {
479                                    UserServiceUtil.deleteUser(deleteUserId);
480                            }
481                    }
482            }
483    
484            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
485                    ActionRequest actionRequest) {
486    
487                    List<AnnouncementsDelivery> announcementsDeliveries =
488                            new ArrayList<AnnouncementsDelivery>();
489    
490                    for (String type : AnnouncementsEntryConstants.TYPES) {
491                            boolean email = ParamUtil.getBoolean(
492                                    actionRequest, "announcementsType" + type + "Email");
493                            boolean sms = ParamUtil.getBoolean(
494                                    actionRequest, "announcementsType" + type + "Sms");
495                            boolean website = ParamUtil.getBoolean(
496                                    actionRequest, "announcementsType" + type + "Website");
497    
498                            AnnouncementsDelivery announcementsDelivery =
499                                    new AnnouncementsDeliveryImpl();
500    
501                            announcementsDelivery.setType(type);
502                            announcementsDelivery.setEmail(email);
503                            announcementsDelivery.setSms(sms);
504                            announcementsDelivery.setWebsite(website);
505    
506                            announcementsDeliveries.add(announcementsDelivery);
507                    }
508    
509                    return announcementsDeliveries;
510            }
511    
512            protected List<AnnouncementsDelivery> getAnnouncementsDeliveries(
513                            ActionRequest actionRequest, User user)
514                    throws Exception {
515    
516                    if (actionRequest.getParameter(
517                                    "announcementsType" + AnnouncementsEntryConstants.TYPES[0] +
518                                            "Email") == null) {
519    
520                            return AnnouncementsDeliveryLocalServiceUtil.getUserDeliveries(
521                                    user.getUserId());
522                    }
523    
524                    return getAnnouncementsDeliveries(actionRequest);
525            }
526    
527            protected User updateLockout(ActionRequest actionRequest) throws Exception {
528                    User user = PortalUtil.getSelectedUser(actionRequest);
529    
530                    UserServiceUtil.updateLockoutById(user.getUserId(), false);
531    
532                    return user;
533            }
534    
535            protected Object[] updateUser(
536                            ActionRequest actionRequest, ActionResponse actionResponse)
537                    throws Exception {
538    
539                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
540                            WebKeys.THEME_DISPLAY);
541    
542                    User user = PortalUtil.getSelectedUser(actionRequest);
543    
544                    boolean deleteLogo = ParamUtil.getBoolean(actionRequest, "deleteLogo");
545    
546                    if (deleteLogo) {
547                            UserServiceUtil.deletePortrait(user.getUserId());
548                    }
549    
550                    Contact contact = user.getContact();
551    
552                    String oldPassword = AdminUtil.getUpdateUserPassword(
553                            actionRequest, user.getUserId());
554                    String newPassword1 = actionRequest.getParameter("password1");
555                    String newPassword2 = actionRequest.getParameter("password2");
556                    boolean passwordReset = ParamUtil.getBoolean(
557                            actionRequest, "passwordReset");
558    
559                    String reminderQueryQuestion = BeanParamUtil.getString(
560                            user, actionRequest, "reminderQueryQuestion");
561    
562                    if (reminderQueryQuestion.equals(UsersAdmin.CUSTOM_QUESTION)) {
563                            reminderQueryQuestion = BeanParamUtil.getStringSilent(
564                                    user, actionRequest, "reminderQueryCustomQuestion");
565                    }
566    
567                    String reminderQueryAnswer = BeanParamUtil.getString(
568                            user, actionRequest, "reminderQueryAnswer");
569                    String oldScreenName = user.getScreenName();
570                    String screenName = BeanParamUtil.getString(
571                            user, actionRequest, "screenName");
572                    String oldEmailAddress = user.getEmailAddress();
573                    String emailAddress = BeanParamUtil.getString(
574                            user, actionRequest, "emailAddress");
575                    long facebookId = user.getFacebookId();
576                    String openId = BeanParamUtil.getString(user, actionRequest, "openId");
577                    String languageId = BeanParamUtil.getString(
578                            user, actionRequest, "languageId");
579                    String timeZoneId = BeanParamUtil.getString(
580                            user, actionRequest, "timeZoneId");
581                    String greeting = BeanParamUtil.getString(
582                            user, actionRequest, "greeting");
583                    String firstName = BeanParamUtil.getString(
584                            user, actionRequest, "firstName");
585                    String middleName = BeanParamUtil.getString(
586                            user, actionRequest, "middleName");
587                    String lastName = BeanParamUtil.getString(
588                            user, actionRequest, "lastName");
589                    int prefixId = BeanParamUtil.getInteger(
590                            contact, actionRequest, "prefixId");
591                    int suffixId = BeanParamUtil.getInteger(
592                            contact, actionRequest, "suffixId");
593                    boolean male = BeanParamUtil.getBoolean(
594                            user, actionRequest, "male", true);
595    
596                    Calendar birthdayCal = CalendarFactoryUtil.getCalendar();
597    
598                    birthdayCal.setTime(contact.getBirthday());
599    
600                    int birthdayMonth = ParamUtil.getInteger(
601                            actionRequest, "birthdayMonth", birthdayCal.get(Calendar.MONTH));
602                    int birthdayDay = ParamUtil.getInteger(
603                            actionRequest, "birthdayDay", birthdayCal.get(Calendar.DATE));
604                    int birthdayYear = ParamUtil.getInteger(
605                            actionRequest, "birthdayYear", birthdayCal.get(Calendar.YEAR));
606                    String comments = BeanParamUtil.getString(
607                            user, actionRequest, "comments");
608                    String smsSn = BeanParamUtil.getString(contact, actionRequest, "smsSn");
609                    String aimSn = BeanParamUtil.getString(contact, actionRequest, "aimSn");
610                    String facebookSn = BeanParamUtil.getString(
611                            contact, actionRequest, "facebookSn");
612                    String icqSn = BeanParamUtil.getString(contact, actionRequest, "icqSn");
613                    String jabberSn = BeanParamUtil.getString(
614                            contact, actionRequest, "jabberSn");
615                    String msnSn = BeanParamUtil.getString(contact, actionRequest, "msnSn");
616                    String mySpaceSn = BeanParamUtil.getString(
617                            contact, actionRequest, "mySpaceSn");
618                    String skypeSn = BeanParamUtil.getString(
619                            contact, actionRequest, "skypeSn");
620                    String twitterSn = BeanParamUtil.getString(
621                            contact, actionRequest, "twitterSn");
622                    String ymSn = BeanParamUtil.getString(contact, actionRequest, "ymSn");
623                    String jobTitle = BeanParamUtil.getString(
624                            user, actionRequest, "jobTitle");
625                    long[] groupIds = UsersAdminUtil.getGroupIds(actionRequest);
626                    long[] organizationIds = UsersAdminUtil.getOrganizationIds(
627                            actionRequest);
628                    long[] roleIds = UsersAdminUtil.getRoleIds(actionRequest);
629    
630                    List<UserGroupRole> userGroupRoles = null;
631    
632                    if ((actionRequest.getParameter("addGroupRolesGroupIds") != null) ||
633                            (actionRequest.getParameter("addGroupRolesRoleIds") != null) ||
634                            (actionRequest.getParameter("deleteGroupRolesGroupIds") != null) ||
635                            (actionRequest.getParameter("deleteGroupRolesRoleIds") != null)) {
636    
637                            userGroupRoles = UsersAdminUtil.getUserGroupRoles(actionRequest);
638                    }
639    
640                    long[] userGroupIds = UsersAdminUtil.getUserGroupIds(actionRequest);
641                    List<Address> addresses = UsersAdminUtil.getAddresses(
642                            actionRequest, user.getAddresses());
643                    List<EmailAddress> emailAddresses = UsersAdminUtil.getEmailAddresses(
644                            actionRequest, user.getEmailAddresses());
645                    List<Phone> phones = UsersAdminUtil.getPhones(
646                            actionRequest, user.getPhones());
647                    List<Website> websites = UsersAdminUtil.getWebsites(
648                            actionRequest, user.getWebsites());
649                    List<AnnouncementsDelivery> announcementsDeliveries =
650                            getAnnouncementsDeliveries(actionRequest, user);
651    
652                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
653                            User.class.getName(), actionRequest);
654    
655                    user = UserServiceUtil.updateUser(
656                            user.getUserId(), oldPassword, newPassword1, newPassword2,
657                            passwordReset, reminderQueryQuestion, reminderQueryAnswer,
658                            screenName, emailAddress, facebookId, openId, languageId,
659                            timeZoneId, greeting, comments, firstName, middleName, lastName,
660                            prefixId, suffixId, male, birthdayMonth, birthdayDay, birthdayYear,
661                            smsSn, aimSn, facebookSn, icqSn, jabberSn, msnSn, mySpaceSn,
662                            skypeSn, twitterSn, ymSn, jobTitle, groupIds, organizationIds,
663                            roleIds, userGroupRoles, userGroupIds, addresses, emailAddresses,
664                            phones, websites, announcementsDeliveries, serviceContext);
665    
666                    if (oldScreenName.equals(user.getScreenName())) {
667                            oldScreenName = StringPool.BLANK;
668                    }
669    
670                    boolean updateLanguageId = false;
671    
672                    if (user.getUserId() == themeDisplay.getUserId()) {
673    
674                            // Reset the locale
675    
676                            HttpServletRequest request = PortalUtil.getHttpServletRequest(
677                                    actionRequest);
678                            HttpServletResponse response = PortalUtil.getHttpServletResponse(
679                                    actionResponse);
680                            HttpSession session = request.getSession();
681    
682                            session.removeAttribute(Globals.LOCALE_KEY);
683    
684                            Locale locale = LocaleUtil.fromLanguageId(languageId);
685    
686                            LanguageUtil.updateCookie(request, response, locale);
687    
688                            // Clear cached portlet responses
689    
690                            PortletSession portletSession = actionRequest.getPortletSession();
691    
692                            InvokerPortletImpl.clearResponses(portletSession);
693    
694                            // Password
695    
696                            if (PropsValues.SESSION_STORE_PASSWORD &&
697                                    Validator.isNotNull(newPassword1)) {
698    
699                                    portletSession.setAttribute(
700                                            WebKeys.USER_PASSWORD, newPassword1,
701                                            PortletSession.APPLICATION_SCOPE);
702                            }
703    
704                            updateLanguageId = true;
705                    }
706    
707                    String portletId = serviceContext.getPortletId();
708    
709                    if (!portletId.equals(PortletKeys.MY_ACCOUNT)) {
710                            long publicLayoutSetPrototypeId = ParamUtil.getLong(
711                                    actionRequest, "publicLayoutSetPrototypeId");
712                            long privateLayoutSetPrototypeId = ParamUtil.getLong(
713                                    actionRequest, "privateLayoutSetPrototypeId");
714                            boolean publicLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
715                                    actionRequest, "publicLayoutSetPrototypeLinkEnabled");
716                            boolean privateLayoutSetPrototypeLinkEnabled = ParamUtil.getBoolean(
717                                    actionRequest, "privateLayoutSetPrototypeLinkEnabled");
718    
719                            SitesUtil.updateLayoutSetPrototypesLinks(
720                                    user.getGroup(), publicLayoutSetPrototypeId,
721                                    privateLayoutSetPrototypeId,
722                                    publicLayoutSetPrototypeLinkEnabled,
723                                    privateLayoutSetPrototypeLinkEnabled);
724                    }
725    
726                    Company company = PortalUtil.getCompany(actionRequest);
727    
728                    if (company.isStrangersVerify() &&
729                            !StringUtil.equalsIgnoreCase(oldEmailAddress, emailAddress)) {
730    
731                            SessionMessages.add(actionRequest, "verificationEmailSent");
732                    }
733    
734                    return new Object[] {user, oldScreenName, updateLanguageId};
735            }
736    
737    }