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