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