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.kernel.util.StringBundler;
023 import com.liferay.portal.model.Contact;
024 import com.liferay.portal.model.Layout;
025 import com.liferay.portal.model.ResourceConstants;
026 import com.liferay.portal.model.ResourcePermission;
027 import com.liferay.portal.model.Role;
028 import com.liferay.portal.model.RoleConstants;
029 import com.liferay.portal.model.User;
030 import com.liferay.portal.service.ContactLocalServiceUtil;
031 import com.liferay.portal.service.LayoutLocalServiceUtil;
032 import com.liferay.portal.service.ResourceLocalServiceUtil;
033 import com.liferay.portal.service.ResourcePermissionLocalServiceUtil;
034 import com.liferay.portal.service.RoleLocalServiceUtil;
035 import com.liferay.portal.service.UserLocalServiceUtil;
036 import com.liferay.portal.util.PortalInstances;
037 import com.liferay.portal.verify.model.VerifiableResourcedModel;
038
039 import java.sql.Connection;
040 import java.sql.PreparedStatement;
041 import java.sql.ResultSet;
042
043 import java.util.ArrayList;
044 import java.util.Collection;
045 import java.util.List;
046 import java.util.Map;
047
048
052 public class VerifyResourcePermissions extends VerifyProcess {
053
054 public void verify(VerifiableResourcedModel ... verifiableResourcedModels)
055 throws Exception {
056
057 long[] companyIds = PortalInstances.getCompanyIdsBySQL();
058
059 for (long companyId : companyIds) {
060 Role role = RoleLocalServiceUtil.getRole(
061 companyId, RoleConstants.OWNER);
062
063 List<VerifyResourcedModelRunnable> verifyResourcedModelRunnables =
064 new ArrayList<>(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 PreparedStatement ps = null;
177 ResultSet rs = null;
178
179 int total = 0;
180
181 try (Connection con = DataAccess.getUpgradeOptimizedConnection()) {
182 try {
183 ps = con.prepareStatement(
184 "select count(*) from " +
185 verifiableResourcedModel.getTableName() +
186 " where companyId = " + role.getCompanyId());
187
188 rs = ps.executeQuery();
189
190 if (rs.next()) {
191 total = rs.getInt(1);
192 }
193 }
194 finally {
195 DataAccess.cleanUp(ps, rs);
196 }
197
198 try {
199 StringBundler sb = new StringBundler(8);
200
201 sb.append("select ");
202 sb.append(verifiableResourcedModel.getPrimaryKeyColumnName());
203 sb.append(", ");
204 sb.append(verifiableResourcedModel.getUserIdColumnName());
205 sb.append(" from ");
206 sb.append(verifiableResourcedModel.getTableName());
207 sb.append(" where companyId = ");
208 sb.append(role.getCompanyId());
209
210 ps = con.prepareStatement(sb.toString());
211
212 rs = ps.executeQuery();
213
214 for (int i = 0; rs.next(); i++) {
215 long primKey = rs.getLong(
216 verifiableResourcedModel.getPrimaryKeyColumnName());
217 long userId = rs.getLong(
218 verifiableResourcedModel.getUserIdColumnName());
219
220 verifyResourcedModel(
221 role.getCompanyId(),
222 verifiableResourcedModel.getModelName(), primKey, role,
223 userId, i, total);
224 }
225 }
226 finally {
227 DataAccess.cleanUp(ps, rs);
228 }
229 }
230 }
231
232 private static final Log _log = LogFactoryUtil.getLog(
233 VerifyResourcePermissions.class);
234
235 private class VerifyResourcedModelRunnable extends ThrowableAwareRunnable {
236
237 public VerifyResourcedModelRunnable(
238 Role role, VerifiableResourcedModel verifiableResourcedModel) {
239
240 _role = role;
241 _verifiableResourcedModel = verifiableResourcedModel;
242 }
243
244 @Override
245 protected void doRun() throws Exception {
246 verifyResourcedModel(_role, _verifiableResourcedModel);
247 }
248
249 private final Role _role;
250 private final VerifiableResourcedModel _verifiableResourcedModel;
251
252 }
253
254 }