/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.portal.upgrade.v6_1_0;
import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.PermissionedModel;
import com.liferay.portal.kernel.model.ResourceBlock;
import com.liferay.portal.kernel.model.ResourceBlockPermissionsContainer;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.ResourcePermission;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.RoleConstants;
import com.liferay.portal.kernel.model.RoleWrapper;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.service.ResourceActionLocalServiceUtil;
import com.liferay.portal.kernel.service.ResourceBlockLocalServiceUtil;
import com.liferay.portal.kernel.service.ResourceLocalService;
import com.liferay.portal.kernel.service.ResourceLocalServiceWrapper;
import com.liferay.portal.kernel.service.ResourcePermissionLocalService;
import com.liferay.portal.kernel.service.ResourcePermissionLocalServiceUtil;
import com.liferay.portal.kernel.service.ResourcePermissionLocalServiceWrapper;
import com.liferay.portal.kernel.service.RoleLocalService;
import com.liferay.portal.kernel.service.RoleLocalServiceUtil;
import com.liferay.portal.kernel.service.RoleLocalServiceWrapper;
import com.liferay.portal.kernel.upgrade.UpgradeProcess;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.LoggingTimer;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.spring.aop.ServiceWrapperProxyUtil;
import java.io.Closeable;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.List;
/**
* @author Alexander Chow
* @author Connor McKay
* @author Igor Beslic
*/
public class UpgradePermission extends UpgradeProcess {
protected ResourceBlock convertResourcePermissions(
String tableName, String pkColumnName, long companyId, long groupId,
String name, long primKey) {
PermissionedModel permissionedModel = new UpgradePermissionedModel(
tableName, pkColumnName, primKey);
ResourceBlockPermissionsContainer resourceBlockPermissionsContainer =
getResourceBlockPermissionsContainer(
companyId, groupId, name, primKey);
String permissionsHash =
resourceBlockPermissionsContainer.getPermissionsHash();
ResourceBlock resourceBlock =
ResourceBlockLocalServiceUtil.updateResourceBlockId(
companyId, groupId, name, permissionedModel, permissionsHash,
resourceBlockPermissionsContainer);
return resourceBlock;
}
protected void convertResourcePermissions(
String name, String tableName, String pkColumnName)
throws Exception {
try (LoggingTimer loggingTimer = new LoggingTimer(name)) {
try (PreparedStatement ps = connection.prepareStatement(
"select " + pkColumnName + ", groupId, companyId from " +
tableName);
ResultSet rs = ps.executeQuery()) {
while (rs.next()) {
long primKey = rs.getLong(pkColumnName);
long groupId = rs.getLong("groupId");
long companyId = rs.getLong("companyId");
ResourceBlock resourceBlock = convertResourcePermissions(
tableName, pkColumnName, companyId, groupId, name,
primKey);
if (_log.isInfoEnabled() &&
((resourceBlock.getResourceBlockId() % 100) == 0)) {
_log.info("Processed 100 resource blocks for " + name);
}
}
}
List<ResourcePermission> resourcePermissions =
ResourcePermissionLocalServiceUtil.getScopeResourcePermissions(
_SCOPES);
for (ResourcePermission resourcePermission : resourcePermissions) {
int scope = resourcePermission.getScope();
if (!name.equals(resourcePermission.getName())) {
continue;
}
if ((scope == ResourceConstants.SCOPE_COMPANY) ||
(scope == ResourceConstants.SCOPE_GROUP_TEMPLATE)) {
ResourceBlockLocalServiceUtil.setCompanyScopePermissions(
resourcePermission.getCompanyId(), name,
resourcePermission.getRoleId(),
resourcePermission.getActionIds());
}
else if (scope == ResourceConstants.SCOPE_GROUP) {
ResourceBlockLocalServiceUtil.setGroupScopePermissions(
resourcePermission.getCompanyId(),
GetterUtil.getLong(resourcePermission.getPrimKey()),
name, resourcePermission.getRoleId(),
resourcePermission.getActionIds());
}
}
}
}
@Override
protected void doUpgrade() throws Exception {
try (Closeable closeable1 = ServiceWrapperProxyUtil.createProxy(
PortalBeanLocatorUtil.locate(
ResourceLocalService.class.getName()),
Pre7ResourceLocalServiceImpl.class);
Closeable closeable2 = ServiceWrapperProxyUtil.createProxy(
PortalBeanLocatorUtil.locate(
ResourcePermissionLocalService.class.getName()),
Pre7ResourcePermissionLocalServiceImpl.class);
Closeable closeable3 = ServiceWrapperProxyUtil.createProxy(
PortalBeanLocatorUtil.locate(RoleLocalService.class.getName()),
Pre7RoleLocalServiceImpl.class)) {
Class<? extends UpgradePermission> upgradePermissionClass =
getClass();
ResourceActionsUtil.readAndCheck(
null, upgradePermissionClass.getClassLoader(),
new String[] {
"com/liferay/portal/upgrade/v6_1_0/dependencies" +
"/resource-actions.xml"
});
// LPS-14202 and LPS-17841
RoleLocalServiceUtil.checkSystemRoles();
updatePermissions("com.liferay.portlet.bookmarks", true, true);
updatePermissions(
"com.liferay.portlet.documentlibrary", false, true);
updatePermissions("com.liferay.portlet.imagegallery", true, true);
updatePermissions("com.liferay.portlet.messageboards", true, true);
updatePermissions("com.liferay.portlet.shopping", true, true);
convertResourcePermissions(
"com.liferay.portlet.bookmarks.model.BookmarksEntry",
"BookmarksEntry", "entryId");
convertResourcePermissions(
"com.liferay.portlet.bookmarks.model.BookmarksFolder",
"BookmarksFolder", "folderId");
}
}
protected ResourceBlockPermissionsContainer
getResourceBlockPermissionsContainer(
long companyId, long groupId, String name, long primKey) {
ResourceBlockPermissionsContainer resourceBlockPermissionContainer =
new ResourceBlockPermissionsContainer();
List<ResourcePermission> resourcePermissions =
ResourcePermissionLocalServiceUtil.getResourceResourcePermissions(
companyId, groupId, name, String.valueOf(primKey));
for (ResourcePermission resourcePermission : resourcePermissions) {
resourceBlockPermissionContainer.addPermission(
resourcePermission.getRoleId(),
resourcePermission.getActionIds());
}
return resourceBlockPermissionContainer;
}
protected void updatePermissions(
String name, boolean community, boolean guest)
throws Exception {
try (LoggingTimer loggingTimer = new LoggingTimer(name)) {
List<String> modelActions =
ResourceActionsUtil.getModelResourceActions(name);
ResourceActionLocalServiceUtil.checkResourceActions(
name, modelActions);
int scope = ResourceConstants.SCOPE_INDIVIDUAL;
long actionIdsLong = 1;
if (community) {
ResourcePermissionLocalServiceUtil.addResourcePermissions(
name, RoleConstants.ORGANIZATION_USER, scope,
actionIdsLong);
ResourcePermissionLocalServiceUtil.addResourcePermissions(
name, RoleConstants.SITE_MEMBER, scope, actionIdsLong);
}
if (guest) {
ResourcePermissionLocalServiceUtil.addResourcePermissions(
name, RoleConstants.GUEST, scope, actionIdsLong);
}
ResourcePermissionLocalServiceUtil.addResourcePermissions(
name, RoleConstants.OWNER, scope, actionIdsLong);
}
}
private static final int[] _SCOPES = {
ResourceConstants.SCOPE_COMPANY, ResourceConstants.SCOPE_GROUP,
ResourceConstants.SCOPE_GROUP_TEMPLATE
};
private static final Log _log = LogFactoryUtil.getLog(
UpgradePermission.class);
private static class Pre7ResourceLocalServiceImpl
extends ResourceLocalServiceWrapper {
@Override
public void addResources(
long companyId, long groupId, long userId, String name,
long primKey, boolean portletActions,
boolean addGroupPermissions, boolean addGuestPermissions)
throws PortalException {
if (name.equals(Role.class.getName())) {
name = "com.liferay.portal.model.Role";
}
super.addResources(
companyId, groupId, userId, name, primKey, portletActions,
addGroupPermissions, addGuestPermissions);
}
private Pre7ResourceLocalServiceImpl(
ResourceLocalService resourceLocalService) {
super(resourceLocalService);
}
}
private static class Pre7ResourcePermissionLocalServiceImpl
extends ResourcePermissionLocalServiceWrapper {
@Override
public void setResourcePermissions(
long companyId, String name, int scope, String primKey,
long roleId, String[] actionIds)
throws PortalException {
if (name.equals(Role.class.getName())) {
name = "com.liferay.portal.model.Role";
}
super.setResourcePermissions(
companyId, name, scope, primKey, roleId, actionIds);
}
private Pre7ResourcePermissionLocalServiceImpl(
ResourcePermissionLocalService resourcePermissionLocalService) {
super(resourcePermissionLocalService);
}
}
private static class Pre7RoleLocalServiceImpl
extends RoleLocalServiceWrapper {
@Override
public Role deleteRole(Role role) throws PortalException {
String className = role.getClassName();
if (className.equals(Role.class.getName())) {
return new RoleWrapper(role) {
@Override
public String getClassName() {
String className = super.getClassName();
if (className.equals(Role.class.getName())) {
className = "com.liferay.portal.model.Role";
}
return className;
}
};
}
return super.deleteRole(role);
}
private Pre7RoleLocalServiceImpl(RoleLocalService roleLocalService) {
super(roleLocalService);
}
}
private class UpgradePermissionedModel implements PermissionedModel {
public UpgradePermissionedModel(
String tableName, String pkColumnName, long primKey) {
_tableName = tableName;
_pkColumnName = pkColumnName;
_primKey = primKey;
}
@Override
public long getResourceBlockId() {
return _resourceBlockId;
}
@Override
public void persist() {
try {
StringBundler sb = new StringBundler(8);
sb.append("update ");
sb.append(_tableName);
sb.append(" set resourceBlockId = ");
sb.append(_resourceBlockId);
sb.append(" where ");
sb.append(_pkColumnName);
sb.append(" = ");
sb.append(_primKey);
runSQL(sb.toString());
}
catch (Exception e) {
throw new SystemException(e);
}
}
@Override
public void setResourceBlockId(long resourceBlockId) {
_resourceBlockId = resourceBlockId;
}
private final String _pkColumnName;
private final long _primKey;
private long _resourceBlockId;
private final String _tableName;
}
}