001
014
015 package com.liferay.portal.verify;
016
017 import com.liferay.portal.kernel.bean.PortalBeanLocatorUtil;
018 import com.liferay.portal.kernel.concurrent.ThrowableAwareRunnable;
019 import com.liferay.portal.kernel.dao.jdbc.DataAccess;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.model.Contact;
023 import com.liferay.portal.model.Layout;
024 import com.liferay.portal.model.ResourceConstants;
025 import com.liferay.portal.model.ResourcePermission;
026 import com.liferay.portal.model.Role;
027 import com.liferay.portal.model.RoleConstants;
028 import com.liferay.portal.model.User;
029 import com.liferay.portal.service.ContactLocalServiceUtil;
030 import com.liferay.portal.service.LayoutLocalServiceUtil;
031 import com.liferay.portal.service.ResourceLocalServiceUtil;
032 import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
033 import com.liferay.portal.service.RoleLocalServiceUtil;
034 import com.liferay.portal.service.UserLocalServiceUtil;
035 import com.liferay.portal.util.PortalInstances;
036 import com.liferay.portal.verify.model.VerifiableResourcedModel;
037
038 import java.sql.Connection;
039 import java.sql.PreparedStatement;
040 import java.sql.ResultSet;
041
042 import java.util.ArrayList;
043 import java.util.Collection;
044 import java.util.List;
045 import java.util.Map;
046
047
051 public class VerifyResourcePermissions extends VerifyProcess {
052
053 public void verify(VerifiableResourcedModel ... verifiableResourcedModels)
054 throws Exception {
055
056 long[] companyIds = PortalInstances.getCompanyIdsBySQL();
057
058 for (long companyId : companyIds) {
059 Role role = RoleLocalServiceUtil.getRole(
060 companyId, RoleConstants.OWNER);
061
062 List<VerifyResourcedModelRunnable> verifyResourcedModelRunnables =
063 new ArrayList<VerifyResourcedModelRunnable>(
064 verifiableResourcedModels.length);
065
066 for (VerifiableResourcedModel verifiableResourcedModel :
067 verifiableResourcedModels) {
068
069 VerifyResourcedModelRunnable verifyResourcedModelRunnable =
070 new VerifyResourcedModelRunnable(
071 role, verifiableResourcedModel);
072
073 verifyResourcedModelRunnables.add(verifyResourcedModelRunnable);
074 }
075
076 doVerify(verifyResourcedModelRunnables);
077
078 verifyLayout(role);
079 }
080 }
081
082 @Override
083 protected void doVerify() throws Exception {
084 Map<String, VerifiableResourcedModel> verifiableResourcedModelsMap =
085 PortalBeanLocatorUtil.locate(VerifiableResourcedModel.class);
086
087 Collection<VerifiableResourcedModel> verifiableResourcedModels =
088 verifiableResourcedModelsMap.values();
089
090 verify(
091 verifiableResourcedModels.toArray(
092 new VerifiableResourcedModel[
093 verifiableResourcedModels.size()]));
094 }
095
096 protected void verifyLayout(Role role) throws Exception {
097 List<Layout> layouts = LayoutLocalServiceUtil.getNoPermissionLayouts(
098 role.getRoleId());
099
100 int total = layouts.size();
101
102 for (int i = 0; i < total; i++) {
103 Layout layout = layouts.get(i);
104
105 verifyResourcedModel(
106 role.getCompanyId(), Layout.class.getName(), layout.getPlid(),
107 role, 0, i, total);
108 }
109 }
110
111 protected void verifyResourcedModel(
112 long companyId, String modelName, long primKey, Role role,
113 long ownerId, int cur, int total)
114 throws Exception {
115
116 if (_log.isInfoEnabled() && ((cur % 100) == 0)) {
117 _log.info(
118 "Processed " + cur + " of " + total + " resource permissions " +
119 "for company = " + companyId + " and model " + modelName);
120 }
121
122 ResourcePermission resourcePermission =
123 ResourcePermissionLocalServiceUtil.fetchResourcePermission(
124 companyId, modelName, ResourceConstants.SCOPE_INDIVIDUAL,
125 String.valueOf(primKey), role.getRoleId());
126
127 if (resourcePermission == null) {
128 if (_log.isDebugEnabled()) {
129 _log.debug(
130 "No resource found for {" + companyId + ", " + modelName +
131 ", " + ResourceConstants.SCOPE_INDIVIDUAL + ", " +
132 primKey + ", " + role.getRoleId() + "}");
133 }
134
135 ResourceLocalServiceUtil.addResources(
136 companyId, 0, ownerId, modelName, String.valueOf(primKey),
137 false, false, false);
138 }
139
140 if (resourcePermission == null) {
141 resourcePermission =
142 ResourcePermissionLocalServiceUtil.fetchResourcePermission(
143 companyId, modelName, ResourceConstants.SCOPE_INDIVIDUAL,
144 String.valueOf(primKey), role.getRoleId());
145
146 if (resourcePermission == null) {
147 return;
148 }
149 }
150
151 if (modelName.equals(User.class.getName())) {
152 User user = UserLocalServiceUtil.fetchUserById(ownerId);
153
154 if (user != null) {
155 Contact contact = ContactLocalServiceUtil.fetchContact(
156 user.getContactId());
157
158 if (contact != null) {
159 ownerId = contact.getUserId();
160 }
161 }
162 }
163
164 if (ownerId != resourcePermission.getOwnerId()) {
165 resourcePermission.setOwnerId(ownerId);
166
167 ResourcePermissionLocalServiceUtil.updateResourcePermission(
168 resourcePermission);
169 }
170 }
171
172 protected void verifyResourcedModel(
173 Role role, VerifiableResourcedModel verifiableResourcedModel)
174 throws Exception {
175
176 Connection con = null;
177 PreparedStatement ps = null;
178 ResultSet rs = null;
179
180 int total = 0;
181
182 try {
183 con = DataAccess.getUpgradeOptimizedConnection();
184
185 ps = con.prepareStatement(
186 "select count(*) from " +
187 verifiableResourcedModel.getTableName() +
188 " where companyId = " + role.getCompanyId());
189
190 rs = ps.executeQuery();
191
192 if (rs.next()) {
193 total = rs.getInt(1);
194 }
195 }
196 finally {
197 DataAccess.cleanUp(con, ps, rs);
198 }
199
200 try {
201 con = DataAccess.getUpgradeOptimizedConnection();
202
203 ps = con.prepareStatement(
204 "select " + verifiableResourcedModel.getPrimaryKeyColumnName() +
205 ", userId from " + verifiableResourcedModel.getTableName() +
206 " where companyId = " + role.getCompanyId());
207
208 rs = ps.executeQuery();
209
210 for (int i = 0; rs.next(); i++) {
211 long primKey = rs.getLong(
212 verifiableResourcedModel.getPrimaryKeyColumnName());
213 long userId = rs.getLong("userId");
214
215 verifyResourcedModel(
216 role.getCompanyId(),
217 verifiableResourcedModel.getModelName(), primKey, role,
218 userId, i, total);
219 }
220 }
221 finally {
222 DataAccess.cleanUp(con, ps, rs);
223 }
224 }
225
226 private static Log _log = LogFactoryUtil.getLog(
227 VerifyResourcePermissions.class);
228
229 private class VerifyResourcedModelRunnable extends ThrowableAwareRunnable {
230
231 public VerifyResourcedModelRunnable(
232 Role role, VerifiableResourcedModel verifiableResourcedModel) {
233
234 _role = role;
235 _verifiableResourcedModel = verifiableResourcedModel;
236 }
237
238 @Override
239 protected void doRun() throws Exception {
240 verifyResourcedModel(_role, _verifiableResourcedModel);
241 }
242
243 private final Role _role;
244 private final VerifiableResourcedModel _verifiableResourcedModel;
245
246 }
247
248 }