001 /**
002 * Copyright 2004-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.hr.time.authorization;
017
018 import java.util.HashMap;
019 import java.util.HashSet;
020 import java.util.Map;
021 import java.util.Set;
022
023 import org.kuali.hr.time.roles.TkUserRoles;
024 import org.kuali.hr.time.roles.UserRoles;
025 import org.kuali.hr.time.util.TKContext;
026 import org.kuali.hr.time.util.TKUser;
027 import org.kuali.rice.kim.api.identity.Person;
028 import org.kuali.rice.kns.document.authorization.DocumentAuthorizer;
029 import org.kuali.rice.kns.document.authorization.MaintenanceDocumentAuthorizer;
030 import org.kuali.rice.krad.bo.BusinessObject;
031 import org.kuali.rice.krad.document.Document;
032 import org.kuali.rice.krad.maintenance.MaintenanceDocument;
033 import org.kuali.rice.krad.util.GlobalVariables;
034 import org.kuali.rice.krad.util.KRADConstants;
035
036 /**
037 * Base class for the implementation of Authorization in KPME Time and Attendance.
038 *
039 * Role Security Grid Documentation:
040 * https://wiki.kuali.org/display/KPME/Role+Security+Grid
041 */
042 public abstract class TkMaintenanceDocumentAuthorizerBase implements MaintenanceDocumentAuthorizer, DocumentAuthorizer {
043
044 // Methods from BusinessObjectAuthorizer
045
046 @Override
047 public boolean isAuthorized(BusinessObject businessObject, String namespaceCode, String permissionName, String principalId) {
048 return true;
049 }
050
051 @Override
052 public boolean isAuthorizedByTemplate(BusinessObject businessObject, String namespaceCode, String permissionTemplateName, String principalId) {
053 return true;
054 }
055
056 @Override
057 public boolean isAuthorized(BusinessObject businessObject, String namespaceCode, String permissionName, String principalId, Map<String, String> additionalPermissionDetails, Map<String, String> additionalRoleQualifiers) {
058 return true;
059 }
060
061 @Override
062 public boolean isAuthorizedByTemplate(Object dataObject, String namespaceCode, String permissionTemplateName, String principalId, Map<String, String> additionalPermissionDetails, Map<String, String> additionalRoleQualifiers) {
063 return true;
064 }
065
066 @Override
067 public Map<String, String> getCollectionItemRoleQualifications(BusinessObject collectionItemBusinessObject) {
068 return new HashMap<String,String>();
069 }
070
071 @Override
072 public Map<String, String> getCollectionItemPermissionDetails(BusinessObject collectionItemBusinessObject) {
073 return new HashMap<String,String>();
074 }
075
076 // Methods from MaintenanceDocumentAuthorizer
077
078 @Override
079 public boolean canCreate(Class boClass, Person user) {
080 return this.rolesIndicateGeneralWriteAccess();
081 }
082
083 @Override
084 /**
085 * In lookup, called for each Business object if the user can edit or not.
086 */
087 public boolean canMaintain(Object dataObject, Person user) {
088 return this.rolesIndicateWriteAccess((BusinessObject) dataObject);
089 }
090
091 @Override
092 /**
093 * Called when submit is clicked from maintenance doc
094 */
095 public boolean canCreateOrMaintain(MaintenanceDocument maintenanceDocument, Person user){
096 return this.rolesIndicateWriteAccess((BusinessObject) maintenanceDocument.getNewMaintainableObject().getDataObject());
097 }
098
099 @Override
100 public Set<String> getSecurePotentiallyReadOnlySectionIds() {
101 return new HashSet<String>();
102 }
103
104 // Methods from DocumentAuthorizer
105
106
107 /**
108 * Copied from DocumentAuthorizerBase
109 */
110 @Override
111 public Set<String> getDocumentActions(Document document, Person user, Set<String> documentActions) {
112 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_EDIT) && !canEdit(document, user)) {
113 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_EDIT);
114 }
115
116 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_COPY) && !canCopy(document, user)) {
117 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_COPY);
118 }
119
120 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_CLOSE) && !canClose(document, user)) {
121 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_CLOSE);
122 }
123
124 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_RELOAD) && !canReload(document, user)) {
125 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_RELOAD);
126 }
127
128 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_BLANKET_APPROVE) && !canBlanketApprove(document, user)) {
129 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_BLANKET_APPROVE);
130 }
131
132 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_CANCEL) && !canCancel(document, user)) {
133 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_CANCEL);
134 }
135
136 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_RECALL) && !canRecall(document, user)) {
137 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_RECALL);
138 }
139
140 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_SAVE) && !canSave(document, user)) {
141 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_SAVE);
142 }
143
144 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_ROUTE) && !canRoute(document, user)) {
145 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_ROUTE);
146 }
147
148 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_ACKNOWLEDGE) && !canAcknowledge(document, user)) {
149 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_ACKNOWLEDGE);
150 }
151
152 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_FYI) && !canFyi(document, user)) {
153 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_FYI);
154 }
155
156 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_APPROVE) && !canApprove(document, user)) {
157 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_APPROVE);
158 }
159
160 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_DISAPPROVE) && !canDisapprove(document, user)) {
161 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_DISAPPROVE);
162 }
163
164 if (!canSendAnyTypeAdHocRequests(document, user)) {
165 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_ADD_ADHOC_REQUESTS);
166 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_SEND_ADHOC_REQUESTS);
167 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_SEND_NOTE_FYI);
168 }
169
170 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_SEND_NOTE_FYI) && !canSendNoteFyi(document, user)) {
171 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_SEND_NOTE_FYI);
172 }
173
174 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_ANNOTATE) && !canAnnotate(document, user)) {
175 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_ANNOTATE);
176 }
177
178 if (documentActions.contains(KRADConstants.KUALI_ACTION_CAN_EDIT_DOCUMENT_OVERVIEW) && !canEditDocumentOverview(
179 document, user)) {
180 documentActions.remove(KRADConstants.KUALI_ACTION_CAN_EDIT_DOCUMENT_OVERVIEW);
181 }
182
183 if (documentActions.contains(KRADConstants.KUALI_ACTION_PERFORM_ROUTE_REPORT) && !canPerformRouteReport(document,
184 user)) {
185 documentActions.remove(KRADConstants.KUALI_ACTION_PERFORM_ROUTE_REPORT);
186 }
187
188 return documentActions;
189 }
190
191 @Override
192 /**
193 * TODO: What is this used for? It's called often.
194 */
195 public boolean canInitiate(String documentTypeName, Person user) {
196 return this.rolesIndicateGeneralReadAccess();
197 }
198
199 @Override
200 /**
201 *
202 * One Reference in KualiDocumentActionBase:366
203 */
204 public boolean canOpen(Document document, Person user) {
205 return this.rolesIndicateGeneralReadAccess();
206 }
207
208 @Override
209 public boolean canEdit(Document document, Person user) {
210 return this.rolesIndicateGeneralWriteAccess();
211 }
212
213 @Override
214 public boolean canAnnotate(Document document, Person user) {
215 return true;
216 }
217
218 @Override
219 public boolean canReload(Document document, Person user) {
220 return true;
221 }
222
223 @Override
224 public boolean canClose(Document document, Person user) {
225 return true;
226 }
227
228 @Override
229 public boolean canSave(Document document, Person user) {
230 return this.rolesIndicateGeneralWriteAccess();
231 }
232
233 @Override
234 public boolean canRoute(Document document, Person user) {
235 return true;
236 }
237
238 @Override
239 public boolean canCancel(Document document, Person user) {
240 return true;
241 }
242
243 @Override
244 public boolean canCopy(Document document, Person user) {
245 return this.rolesIndicateGeneralWriteAccess();
246 }
247
248 @Override
249 public boolean canPerformRouteReport(Document document, Person user) {
250 return true;
251 }
252
253 @Override
254 public boolean canBlanketApprove(Document document, Person user) {
255 return true;
256 }
257
258 @Override
259 public boolean canApprove(Document document, Person user) {
260 return true;
261 }
262
263 @Override
264 public boolean canDisapprove(Document document, Person user) {
265 return true;
266 }
267
268 @Override
269 public boolean canSendNoteFyi(Document document, Person user) {
270 return true;
271 }
272
273 @Override
274 public boolean canEditDocumentOverview(Document document, Person user) {
275 return true;
276 }
277
278 @Override
279 public boolean canFyi(Document document, Person user) {
280 return true;
281 }
282
283 @Override
284 public boolean canAcknowledge(Document document, Person user) {
285 return true;
286 }
287
288 @Override
289 public boolean canReceiveAdHoc(Document document, Person user, String actionRequestCode) {
290 return true;
291 }
292
293 @Override
294 public boolean canAddNoteAttachment(Document document, String attachmentTypeCode, Person user) {
295 return true;
296 }
297
298 @Override
299 public boolean canDeleteNoteAttachment(Document document, String attachmentTypeCode, String createdBySelfOnly, Person user) {
300 return true;
301 }
302
303 @Override
304 public boolean canViewNoteAttachment(Document document,String attachmentTypeCode, Person user) {
305 return true;
306 }
307
308 @Override
309 public boolean canViewNoteAttachment(Document document, String attachmentTypeCode, String authorUniversalIdentifier, Person user) {
310 return true;
311 }
312
313 @Override
314 public boolean canSendAdHocRequests(Document document, String actionRequestCd, Person user) {
315 return true;
316 }
317
318 @Override
319 public boolean canSendAnyTypeAdHocRequests(Document document, Person user) {
320 return true;
321 }
322
323 @Override
324 public boolean canTakeRequestedAction(Document document, String actionRequestCode, Person user) {
325 return true;
326 }
327
328 @Override
329 public boolean canRecall(Document document, Person user) {
330 return true;
331 }
332
333 // Methods from DataObjectAuthorizer
334
335 @Override
336 public boolean isAuthorized(Object dataObject, String namespaceCode, String permissionName, String principalId) {
337 return true;
338 }
339
340 @Override
341 public boolean isAuthorizedByTemplate(Object dataObject, String namespaceCode, String permissionTemplateName, String principalId) {
342 return true;
343 }
344
345 @Override
346 public boolean isAuthorized(Object dataObject, String namespaceCode, String permissionName, String principalId,
347 Map<String, String> additionalPermissionDetails, Map<String, String> additionalRoleQualifiers) {
348 return true;
349 }
350
351
352 // Methods from InquiryOrMaintenanceDocumentAuthorizer
353
354 @Override
355 /**
356 * Can't return null.
357 */
358 public Set<String> getSecurePotentiallyHiddenSectionIds() {
359 return new HashSet<String>();
360 }
361
362 // Override this if necessary:
363
364 /**
365 * Returns the UserRoles object for the CURRENT user. This will take into
366 * account target/backdoor user status. Subclasses can override this if
367 * necessary.
368 *
369 * @return The UserRoles object for the current user.
370 */
371 public UserRoles getRoles() {
372 return TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId());
373 }
374
375 // Subclasses will implement these methods
376
377 /**
378 * Method to indicate whether or not the Context current user can read
379 * objects if the current maintenance type.
380 *
381 * @return true if readable, false otherwise.
382 */
383 abstract public boolean rolesIndicateGeneralReadAccess();
384
385 /**
386 * Method to indicate whether or not the Context current user can create/edit
387 * objects if the current maintenance type.
388 *
389 * @return true if create/editable, false otherwise.
390 */
391 abstract public boolean rolesIndicateGeneralWriteAccess();
392
393 /**
394 * Indicates whether or not the current Context user has create/edit rights
395 * to the provided BusinessObject.
396 *
397 * @param bo The BusinessObject under investigation.
398 *
399 * @return true if editable, false otherwise.
400 */
401 abstract public boolean rolesIndicateWriteAccess(BusinessObject bo);
402
403 /**
404 * Indicates whether or not the current Context user has view rights to the
405 * provided BusinessObject.
406 *
407 * @param bo The BusinessObject under investigation.
408 *
409 * @return true if editable, false otherwise.
410 */
411 abstract public boolean rolesIndicateReadAccess(BusinessObject bo);
412 }