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.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    }