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