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.portal.upgrade.v6_1_0;
016    
017    import com.liferay.portal.kernel.dao.jdbc.DataAccess;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.log.Log;
020    import com.liferay.portal.kernel.log.LogFactoryUtil;
021    import com.liferay.portal.kernel.upgrade.UpgradeProcess;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.StringBundler;
024    import com.liferay.portal.model.PermissionedModel;
025    import com.liferay.portal.model.ResourceBlock;
026    import com.liferay.portal.model.ResourceBlockPermissionsContainer;
027    import com.liferay.portal.model.ResourceConstants;
028    import com.liferay.portal.model.ResourcePermission;
029    import com.liferay.portal.model.Role;
030    import com.liferay.portal.model.RoleConstants;
031    import com.liferay.portal.security.permission.ResourceActionsUtil;
032    import com.liferay.portal.service.ResourceActionLocalServiceUtil;
033    import com.liferay.portal.service.ResourceBlockLocalServiceUtil;
034    import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
035    import com.liferay.portal.service.RoleLocalServiceUtil;
036    import com.liferay.portlet.bookmarks.model.BookmarksEntry;
037    import com.liferay.portlet.bookmarks.model.BookmarksFolder;
038    
039    import java.sql.Connection;
040    import java.sql.PreparedStatement;
041    import java.sql.ResultSet;
042    
043    import java.util.List;
044    
045    /**
046     * @author Alexander Chow
047     * @author Connor McKay
048     * @author Igor Beslic
049     */
050    public class UpgradePermission extends UpgradeProcess {
051    
052            protected ResourceBlock convertResourcePermissions(
053                            String tableName, String pkColumnName, long companyId, long groupId,
054                            String name, long primKey)
055                    throws SystemException {
056    
057                    PermissionedModel permissionedModel = new UpgradePermissionedModel(
058                            tableName, pkColumnName, primKey);
059    
060                    ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
061                            getResourceBlockPermissionsContainer(
062                                    companyId, groupId, name, primKey);
063    
064                    String permissionsHash =
065                            resourceBlockPermissionsContainer.getPermissionsHash();
066    
067                    ResourceBlock resourceBlock =
068                            ResourceBlockLocalServiceUtil.updateResourceBlockId(
069                                    companyId, groupId, name, permissionedModel, permissionsHash,
070                                    resourceBlockPermissionsContainer);
071    
072                    return resourceBlock;
073            }
074    
075            protected void convertResourcePermissions(
076                            String name, String tableName, String pkColumnName)
077                    throws Exception {
078    
079                    Connection con = null;
080                    PreparedStatement ps = null;
081                    ResultSet rs = null;
082    
083                    try {
084                            con = DataAccess.getUpgradeOptimizedConnection();
085    
086                            ps = con.prepareStatement(
087                                    "select " + pkColumnName + ", groupId, companyId from " +
088                                            tableName);
089    
090                            rs = ps.executeQuery();
091    
092                            while (rs.next()) {
093                                    long primKey = rs.getLong(pkColumnName);
094                                    long groupId = rs.getLong("groupId");
095                                    long companyId = rs.getLong("companyId");
096    
097                                    ResourceBlock resourceBlock = convertResourcePermissions(
098                                            tableName, pkColumnName, companyId, groupId, name, primKey);
099    
100                                    if (_log.isInfoEnabled() &&
101                                            ((resourceBlock.getResourceBlockId() % 100) == 0)) {
102    
103                                            _log.info("Processed 100 resource blocks for " + name);
104                                    }
105                            }
106                    }
107                    finally {
108                            DataAccess.cleanUp(con, ps, rs);
109                    }
110    
111                    List<ResourcePermission> resourcePermissions =
112                            ResourcePermissionLocalServiceUtil.getScopeResourcePermissions(
113                                    _SCOPES);
114    
115                    for (ResourcePermission resourcePermission : resourcePermissions) {
116                            int scope = resourcePermission.getScope();
117    
118                            if (!name.equals(resourcePermission.getName())) {
119                                    continue;
120                            }
121    
122                            if ((scope == ResourceConstants.SCOPE_COMPANY) ||
123                                    (scope == ResourceConstants.SCOPE_GROUP_TEMPLATE)) {
124    
125                                    ResourceBlockLocalServiceUtil.setCompanyScopePermissions(
126                                            resourcePermission.getCompanyId(), name,
127                                            resourcePermission.getRoleId(),
128                                            resourcePermission.getActionIds());
129                            }
130                            else if (scope == ResourceConstants.SCOPE_GROUP) {
131                                    ResourceBlockLocalServiceUtil.setGroupScopePermissions(
132                                            resourcePermission.getCompanyId(),
133                                            GetterUtil.getLong(resourcePermission.getPrimaryKey()),
134                                            name, resourcePermission.getRoleId(),
135                                            resourcePermission.getActionIds());
136                            }
137                    }
138            }
139    
140            @Override
141            protected void doUpgrade() throws Exception {
142    
143                    // LPS-46141
144    
145                    List<String> modelActions = ResourceActionsUtil.getModelResourceActions(
146                            Role.class.getName());
147    
148                    ResourceActionLocalServiceUtil.checkResourceActions(
149                            Role.class.getName(), modelActions);
150    
151                    // LPS-14202 and LPS-17841
152    
153                    RoleLocalServiceUtil.checkSystemRoles();
154    
155                    updatePermissions("com.liferay.portlet.bookmarks", true, true);
156                    updatePermissions("com.liferay.portlet.documentlibrary", false, true);
157                    updatePermissions("com.liferay.portlet.imagegallery", true, true);
158                    updatePermissions("com.liferay.portlet.messageboards", true, true);
159                    updatePermissions("com.liferay.portlet.shopping", true, true);
160    
161                    convertResourcePermissions(
162                            BookmarksEntry.class.getName(), "BookmarksEntry", "entryId");
163                    convertResourcePermissions(
164                            BookmarksFolder.class.getName(), "BookmarksFolder", "folderId");
165            }
166    
167            protected ResourceBlockPermissionsContainer
168                            getResourceBlockPermissionsContainer(
169                                    long companyId, long groupId, String name, long primKey)
170                    throws SystemException {
171    
172                    ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
173                            new ResourceBlockPermissionsContainer();
174    
175                    List<ResourcePermission> resourcePermissions =
176                            ResourcePermissionLocalServiceUtil.getResourceResourcePermissions(
177                                    companyId, groupId, name, String.valueOf(primKey));
178    
179                    for (ResourcePermission resourcePermission : resourcePermissions) {
180                            resourceBlockPermissionContainer.addPermission(
181                                    resourcePermission.getRoleId(),
182                                    resourcePermission.getActionIds());
183                    }
184    
185                    return resourceBlockPermissionContainer;
186            }
187    
188            protected void updatePermissions(
189                            String name, boolean community, boolean guest)
190                    throws Exception {
191    
192                    List<String> modelActions = ResourceActionsUtil.getModelResourceActions(
193                            name);
194    
195                    ResourceActionLocalServiceUtil.checkResourceActions(name, modelActions);
196    
197                    int scope = ResourceConstants.SCOPE_INDIVIDUAL;
198                    long actionIdsLong = 1;
199    
200                    if (community) {
201                            ResourcePermissionLocalServiceUtil.addResourcePermissions(
202                                    name, RoleConstants.ORGANIZATION_USER, scope, actionIdsLong);
203                            ResourcePermissionLocalServiceUtil.addResourcePermissions(
204                                    name, RoleConstants.SITE_MEMBER, scope, actionIdsLong);
205                    }
206    
207                    if (guest) {
208                            ResourcePermissionLocalServiceUtil.addResourcePermissions(
209                                    name, RoleConstants.GUEST, scope, actionIdsLong);
210                    }
211    
212                    ResourcePermissionLocalServiceUtil.addResourcePermissions(
213                            name, RoleConstants.OWNER, scope, actionIdsLong);
214            }
215    
216            private static final int[] _SCOPES = {
217                    ResourceConstants.SCOPE_COMPANY, ResourceConstants.SCOPE_GROUP,
218                    ResourceConstants.SCOPE_GROUP_TEMPLATE
219            };
220    
221            private static Log _log = LogFactoryUtil.getLog(UpgradePermission.class);
222    
223            private class UpgradePermissionedModel implements PermissionedModel {
224    
225                    public UpgradePermissionedModel(
226                            String tableName, String pkColumnName, long primKey) {
227    
228                            _pkColumnName = pkColumnName;
229                            _primKey = primKey;
230                            _tableName = tableName;
231                    }
232    
233                    @Override
234                    public long getResourceBlockId() {
235                            return _resourceBlockId;
236                    }
237    
238                    @Override
239                    public void persist() throws SystemException {
240                            try {
241                                    StringBundler sb = new StringBundler(8);
242    
243                                    sb.append("update ");
244                                    sb.append(_tableName);
245                                    sb.append(" set resourceBlockId = ");
246                                    sb.append(_resourceBlockId);
247                                    sb.append(" where ");
248                                    sb.append(_pkColumnName);
249                                    sb.append(" = ");
250                                    sb.append(_primKey);
251    
252                                    runSQL(sb.toString());
253                            }
254                            catch (Exception e) {
255                                    throw new SystemException(e);
256                            }
257                    }
258    
259                    @Override
260                    public void setResourceBlockId(long resourceBlockId) {
261                            _resourceBlockId = resourceBlockId;
262                    }
263    
264                    private String _pkColumnName;
265                    private long _primKey;
266                    private long _resourceBlockId;
267                    private String _tableName;
268    
269            }
270    
271    }