001    /**
002     * Copyright 2005-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.rice.kim.service.impl;
017    
018    import org.apache.commons.lang.exception.ExceptionUtils;
019    import org.apache.log4j.Logger;
020    import org.kuali.rice.core.api.criteria.QueryByCriteria;
021    import org.kuali.rice.kim.api.common.assignee.Assignee;
022    import org.kuali.rice.kim.api.group.Group;
023    import org.kuali.rice.kim.api.group.GroupService;
024    import org.kuali.rice.kim.api.identity.IdentityService;
025    import org.kuali.rice.kim.api.identity.CodedAttribute;
026    import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliationType;
027    import org.kuali.rice.kim.api.identity.entity.Entity;
028    import org.kuali.rice.kim.api.identity.entity.EntityDefault;
029    import org.kuali.rice.kim.api.identity.entity.EntityDefaultQueryResults;
030    import org.kuali.rice.kim.api.identity.entity.EntityQueryResults;
031    import org.kuali.rice.kim.api.identity.external.EntityExternalIdentifierType;
032    import org.kuali.rice.kim.api.identity.principal.Principal;
033    import org.kuali.rice.kim.api.permission.Permission;
034    import org.kuali.rice.kim.api.permission.PermissionService;
035    import org.kuali.rice.kim.api.responsibility.Responsibility;
036    import org.kuali.rice.kim.api.responsibility.ResponsibilityAction;
037    import org.kuali.rice.kim.api.responsibility.ResponsibilityService;
038    import org.kuali.rice.kim.api.services.IdentityManagementService;
039    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
040    
041    import java.util.HashMap;
042    import java.util.List;
043    import java.util.Map;
044    
045    public class IdentityManagementServiceImpl implements IdentityManagementService {
046            private static final Logger LOG = Logger.getLogger( IdentityManagementServiceImpl.class );
047    
048            private PermissionService permissionService;
049            private ResponsibilityService responsibilityService;
050            private IdentityService identityService;
051            private GroupService groupService;
052    
053        @Override
054            public void flushAllCaches() {
055            }
056    
057        @Override
058            public void flushEntityPrincipalCaches() {
059            }
060    
061        @Override
062            public void flushGroupCaches() {
063            }
064    
065        @Override
066            public void flushPermissionCaches() {
067            }
068    
069        @Override
070            public void flushResponsibilityCaches() {
071                    // nothing currently being cached
072            }
073    
074    
075        // AUTHORIZATION SERVICE
076        @Override
077        public boolean hasPermission(String principalId, String namespaceCode, String permissionName, Map<String, String> permissionDetails) {
078            if ( LOG.isDebugEnabled() ) {
079                    logHasPermissionCheck("Permission", principalId, namespaceCode, permissionName, permissionDetails);
080            }
081            boolean hasPerm = getPermissionService().hasPermission(principalId, namespaceCode, permissionName);
082            if ( LOG.isDebugEnabled() ) {
083                LOG.debug( "Result: " + hasPerm );
084            }
085            return hasPerm;
086        }
087    
088        @Override
089        public boolean isAuthorized(String principalId, String namespaceCode, String permissionName, Map<String, String> permissionDetails, Map<String, String> qualification ) {
090            if ( qualification == null || qualification.isEmpty() ) {
091                    return hasPermission( principalId, namespaceCode, permissionName, permissionDetails );
092            }
093            if ( LOG.isDebugEnabled() ) {
094                    logAuthorizationCheck("Permission", principalId, namespaceCode, permissionName, permissionDetails, qualification);
095            }
096            boolean isAuthorized = getPermissionService().isAuthorized(principalId, namespaceCode, permissionName, qualification);
097            if ( LOG.isDebugEnabled() ) {
098                    LOG.debug( "Result: " + isAuthorized );
099            }
100            return isAuthorized;
101        }
102    
103        @Override
104        public boolean hasPermissionByTemplate(String principalId, String namespaceCode, String permissionTemplateName,
105                Map<String, String> permissionDetails) {
106            if ( LOG.isDebugEnabled() ) {
107                    logHasPermissionCheck("Perm Templ", principalId, namespaceCode, permissionTemplateName, permissionDetails);
108            }
109    
110                    boolean hasPerm = getPermissionService().hasPermissionByTemplate(principalId, namespaceCode,
111                    permissionTemplateName, permissionDetails);
112    
113                    if ( LOG.isDebugEnabled() ) {
114                            LOG.debug( "Result: " + hasPerm );
115                    }
116            return hasPerm;
117        }
118    
119        @Override
120        public boolean isAuthorizedByTemplate(String principalId, String namespaceCode, String permissionTemplateName,
121                Map<String, String> permissionDetails, Map<String, String> qualification) {
122            if ( qualification == null || qualification.isEmpty() ) {
123                    return hasPermissionByTemplate(principalId, namespaceCode, permissionTemplateName,
124                        new HashMap<String, String>(permissionDetails));
125            }
126            if ( LOG.isDebugEnabled() ) {
127                    logAuthorizationCheck("Perm Templ", principalId, namespaceCode, permissionTemplateName, new HashMap<String, String>(permissionDetails), new HashMap<String, String>(qualification));
128            }
129            boolean isAuthorized = getPermissionService().isAuthorizedByTemplate(principalId, namespaceCode,
130                    permissionTemplateName, new HashMap<String, String>(permissionDetails), new HashMap<String, String>(
131                    qualification));
132                    if ( LOG.isDebugEnabled() ) {
133                            LOG.debug( "Result: " + isAuthorized );
134                    }
135            return isAuthorized;
136        }
137    
138        @Override
139        public List<Permission> getAuthorizedPermissions(String principalId,
140                                                         String namespaceCode, String permissionName, Map<String, String> permissionDetails, Map<String, String> qualification) {
141            return getPermissionService().getAuthorizedPermissions(principalId, namespaceCode, permissionName, qualification);
142        }
143    
144        @Override
145        public List<Permission> getAuthorizedPermissionsByTemplate(String principalId, String namespaceCode,
146                String permissionTemplateName, Map<String, String> permissionDetails, Map<String, String> qualification) {
147            return getPermissionService().getAuthorizedPermissionsByTemplate(principalId, namespaceCode,
148                    permissionTemplateName, permissionDetails, qualification);
149        }
150    
151        @Override
152        public boolean isPermissionDefinedForTemplate(String namespaceCode, String permissionTemplateName,
153                Map<String, String> permissionDetails) {
154            return getPermissionService().isPermissionDefinedByTemplate(namespaceCode, permissionTemplateName,
155                    permissionDetails);
156        }
157    
158        @Override
159            public List<Assignee> getPermissionAssignees(String namespaceCode,
160                            String permissionName, Map<String, String> permissionDetails, Map<String, String> qualification) {
161                    return this.permissionService.getPermissionAssignees(namespaceCode, permissionName, qualification);
162            }
163    
164        @Override
165            public List<Assignee> getPermissionAssigneesForTemplate(String namespaceCode, String permissionTemplateName,
166                Map<String, String> permissionDetails, Map<String, String> qualification) {
167                    return this.permissionService.getPermissionAssigneesByTemplate(namespaceCode, permissionTemplateName,
168                    new HashMap<String, String>(permissionDetails), new HashMap<String, String>(qualification));
169            }
170    
171        // GROUP SERVICE
172        @Override
173            public boolean isMemberOfGroup(String principalId, String groupId) {
174                    return getGroupService().isMemberOfGroup(principalId, groupId);
175            }
176        @Override
177            public boolean isMemberOfGroup(String principalId, String namespaceCode, String groupName) {
178                    Group group = getGroupByName(namespaceCode, groupName);
179                    return group == null ? false : isMemberOfGroup(principalId, group.getId());
180        }
181        @Override
182            public boolean isGroupMemberOfGroup(String potentialMemberId, String potentialParentId)
183            {
184                   return getGroupService()
185                            .isGroupMemberOfGroup(potentialMemberId, potentialParentId);
186            }
187        @Override
188            public List<String> getGroupMemberPrincipalIds(String groupId) {
189                    return getGroupService().getMemberPrincipalIds(groupId);
190            }
191        @Override
192            public List<String> getDirectGroupMemberPrincipalIds(String groupId) {
193                    return getGroupService().getDirectMemberPrincipalIds(groupId);
194            }
195        @Override
196        public List<String> getGroupIdsForPrincipal(String principalId) {
197                    return getGroupService().getGroupIdsByPrincipalId(principalId);
198            }
199        @Override
200        public List<String> getGroupIdsForPrincipal(String principalId, String namespaceCode ) {
201                    return getGroupService().getGroupIdsByPrincipalIdAndNamespaceCode(principalId, namespaceCode);
202            }
203        @Override
204        public List<Group> getGroupsForPrincipal(String principalId) {
205                    return getGroupService().getGroupsByPrincipalId(principalId);
206            }
207        @Override
208        public List<Group> getGroupsForPrincipal(String principalId, String namespaceCode ) {
209                    return getGroupService().getGroupsByPrincipalIdAndNamespaceCode(principalId, namespaceCode);
210            }
211        @Override
212        public List<String> getMemberGroupIds(String groupId) {
213                    return getGroupService().getMemberGroupIds(groupId);
214            }
215        @Override
216        public List<String> getDirectMemberGroupIds(String groupId) {
217                    return getGroupService().getDirectMemberGroupIds(groupId);
218            }
219        @Override
220        public Group getGroup(String groupId) {
221                    return getGroupService().getGroup(groupId);
222            }
223        @Override
224        public Group getGroupByName(String namespaceCode, String groupName) {
225                    return getGroupService().getGroupByNamespaceCodeAndName(namespaceCode, groupName);
226        }
227        @Override
228        public List<String> getParentGroupIds(String groupId) {
229                    return getGroupService().getParentGroupIds(groupId);
230            }
231        @Override
232        public List<String> getDirectParentGroupIds(String groupId) {
233                    return getGroupService().getDirectParentGroupIds( groupId );
234            }
235    
236        @Override
237        public boolean addGroupToGroup(String childId, String parentId) {
238            return getGroupService().addGroupToGroup(childId, parentId);
239        }
240    
241        @Override
242        public boolean addPrincipalToGroup(String principalId, String groupId) {
243            return getGroupService().addPrincipalToGroup(principalId, groupId);
244        }
245    
246        @Override
247        public boolean removeGroupFromGroup(String childId, String parentId) {
248            return getGroupService().removeGroupFromGroup(childId, parentId);
249        }
250    
251        @Override
252        public boolean removePrincipalFromGroup(String principalId, String groupId) {
253            return getGroupService().removePrincipalFromGroup(principalId, groupId);
254        }
255    
256        @Override
257            public Group createGroup(Group group) {
258                    return getGroupService().createGroup(group);
259            }
260    
261        @Override
262            public void removeAllMembers(String groupId) {
263                    getGroupService().removeAllMembers(groupId);
264            }
265    
266        @Override
267            public Group updateGroup(String groupId, Group group) {
268                    return getGroupService().updateGroup(groupId, group);
269            }
270    
271    
272        // IDENTITY SERVICE
273        @Override
274            public Principal getPrincipal(String principalId) {
275                    return getIdentityService().getPrincipal(principalId);
276            }
277    
278        @Override
279        public Principal getPrincipalByPrincipalName(String principalName) {
280                    return getIdentityService().getPrincipalByPrincipalName(principalName);
281        }
282    
283        @Override
284        public Principal getPrincipalByPrincipalNameAndPassword(String principalName, String password) {
285            return getIdentityService().getPrincipalByPrincipalNameAndPassword(principalName, password);
286        }
287    
288        @Override
289        public EntityDefault getEntityDefaultInfo(String entityId) {
290                    return getIdentityService().getEntityDefault(entityId);
291        }
292    
293        @Override
294        public EntityDefault getEntityDefaultInfoByPrincipalId(
295                    String principalId) {
296                    return getIdentityService().getEntityDefaultByPrincipalId(principalId);
297        }
298    
299        @Override
300        public EntityDefault getEntityDefaultInfoByPrincipalName(
301                    String principalName) {
302                    return getIdentityService().getEntityDefaultByPrincipalName(principalName);
303        }
304    
305        @Override
306        public EntityDefaultQueryResults findEntityDefaults(QueryByCriteria queryByCriteria) {
307            return getIdentityService().findEntityDefaults(queryByCriteria);
308        }
309    
310        @Override
311            public Entity getEntity(String entityId) {
312                    return getIdentityService().getEntity(entityId);
313            }
314    
315        @Override
316        public Entity getEntityByPrincipalId(String principalId) {
317            return getIdentityService().getEntityByPrincipalId(principalId);
318        }
319    
320        @Override
321        public Entity getEntityByPrincipalName(String principalName) {
322            return getIdentityService().getEntityByPrincipalName(principalName);
323        }
324    
325        @Override
326        public EntityQueryResults findEntities(QueryByCriteria queryByCriteria) {
327            return getIdentityService().findEntities(queryByCriteria);
328        }
329    
330        @Override
331            public CodedAttribute getAddressType( String code ) {
332                    return getIdentityService().getAddressType(code);
333            }
334    
335        @Override
336        public CodedAttribute getEmailType( String code ) {
337                    return getIdentityService().getEmailType(code);
338            }
339    
340        @Override
341            public EntityAffiliationType getAffiliationType( String code ) {
342                            return getIdentityService().getAffiliationType(code);
343            }
344    
345        @Override
346            public CodedAttribute getCitizenshipStatus( String code ) {
347                            return CodedAttribute.Builder.create(getIdentityService().getCitizenshipStatus(code)).build();
348            }
349        @Override
350            public CodedAttribute getEmploymentStatus( String code ) {
351                            return getIdentityService().getEmploymentStatus(code);
352            }
353        @Override
354            public CodedAttribute getEmploymentType( String code ) {
355                            return getIdentityService().getEmploymentType(code);
356            }
357        @Override
358            public CodedAttribute getEntityNameType( String code ) {
359                            return getIdentityService().getNameType(code);
360            }
361        @Override
362            public CodedAttribute getEntityType( String code ) {
363                    return getIdentityService().getEntityType(code);
364            }
365        @Override
366            public EntityExternalIdentifierType getExternalIdentifierType( String code ) {
367                            return getIdentityService().getExternalIdentifierType(code);
368            }
369        @Override
370            public CodedAttribute getPhoneType( String code ) {
371                            return getIdentityService().getPhoneType(code);
372            }
373    
374        // ----------------------
375        // Responsibility Methods
376        // ----------------------
377    
378        @Override
379            public Responsibility getResponsibility(String responsibilityId) {
380                    return getResponsibilityService().getResponsibility( responsibilityId );
381            }
382    
383        @Override
384            public boolean hasResponsibility(String principalId, String namespaceCode,
385                            String responsibilityName, Map<String, String> qualification) {
386                    return getResponsibilityService().hasResponsibility( principalId, namespaceCode, responsibilityName,
387                    qualification );
388            }
389    
390        @Override
391            public Responsibility getResponsibilityByName( String namespaceCode, String responsibilityName) {
392                    return getResponsibilityService().findRespByNamespaceCodeAndName(namespaceCode, responsibilityName);
393            }
394    
395        @Override
396            public List<ResponsibilityAction> getResponsibilityActions( String namespaceCode, String responsibilityName,
397                    Map<String, String> qualification, Map<String, String> responsibilityDetails) {
398                    return getResponsibilityService().getResponsibilityActions( namespaceCode, responsibilityName, qualification );
399            }
400    
401        @Override
402            public List<ResponsibilityAction> getResponsibilityActionsByTemplate(String namespaceCode,
403                String responsibilityTemplateName, Map<String, String> qualification,
404                Map<String, String> responsibilityDetails) {
405                    return getResponsibilityService().getResponsibilityActionsByTemplate(namespaceCode, responsibilityTemplateName,
406                    qualification, responsibilityDetails);
407            }
408    
409        @Override
410            public boolean hasResponsibilityByTemplate(String principalId, String namespaceCode,
411                String responsibilityTemplateName, Map<String, String> qualification,
412                Map<String, String> responsibilityDetails) {
413                    return getResponsibilityService().hasResponsibilityByTemplate(principalId, namespaceCode,
414                    responsibilityTemplateName, qualification, responsibilityDetails);
415            }
416    
417        protected void logAuthorizationCheck(String checkType, String principalId, String namespaceCode, String permissionName, Map<String, String> permissionDetails, Map<String, String> qualification ) {
418                    StringBuilder sb = new StringBuilder();
419                    sb.append(  '\n' );
420                    sb.append( "Is AuthZ for " ).append( checkType ).append( ": " ).append( namespaceCode ).append( "/" ).append( permissionName ).append( '\n' );
421                    sb.append( "             Principal:  " ).append( principalId );
422                    if ( principalId != null ) {
423                            Principal principal = getPrincipal( principalId );
424                            if ( principal != null ) {
425                                    sb.append( " (" ).append( principal.getPrincipalName() ).append( ')' );
426                            }
427                    }
428                    sb.append( '\n' );
429                    sb.append( "             Details:\n" );
430                    if ( permissionDetails != null ) {
431                            sb.append( permissionDetails);
432                    } else {
433                            sb.append( "                         [null]\n" );
434                    }
435                    sb.append( "             Qualifiers:\n" );
436                    if ( qualification != null && !qualification.isEmpty() ) {
437                            sb.append( qualification);
438                    } else {
439                            sb.append( "                         [null]\n" );
440                    }
441                    if (LOG.isTraceEnabled()) {
442                            LOG.trace( sb.append(ExceptionUtils.getStackTrace(new Throwable())));
443                    } else {
444                            LOG.debug(sb.toString());
445                    }
446        }
447    
448        protected void logHasPermissionCheck(String checkType, String principalId, String namespaceCode, String permissionName, Map<String, String> permissionDetails ) {
449                    StringBuilder sb = new StringBuilder();
450                    sb.append(  '\n' );
451                    sb.append( "Has Perm for " ).append( checkType ).append( ": " ).append( namespaceCode ).append( "/" ).append( permissionName ).append( '\n' );
452                    sb.append( "             Principal:  " ).append( principalId );
453                    if ( principalId != null ) {
454                            Principal principal = getPrincipal( principalId );
455                            if ( principal != null ) {
456                                    sb.append( " (" ).append( principal.getPrincipalName() ).append( ')' );
457                            }
458                    }
459                    sb.append(  '\n' );
460                    sb.append( "             Details:\n" );
461                    if ( permissionDetails != null ) {
462                            sb.append( permissionDetails);
463                    } else {
464                            sb.append( "                         [null]\n" );
465                    }
466                    if (LOG.isTraceEnabled()) {
467                            LOG.trace( sb.append( ExceptionUtils.getStackTrace(new Throwable())) );
468                    } else {
469                            LOG.debug(sb.toString());
470                    }
471        }
472    
473            // OTHER METHODS
474    
475            public IdentityService getIdentityService() {
476                    if ( identityService == null ) {
477                            identityService = KimApiServiceLocator.getIdentityService();
478                    }
479                    return identityService;
480            }
481    
482            public GroupService getGroupService() {
483                    if ( groupService == null ) {
484                            groupService = KimApiServiceLocator.getGroupService();
485                    }
486                    return groupService;
487            }
488    
489            public PermissionService getPermissionService() {
490                    if ( permissionService == null ) {
491                            permissionService = KimApiServiceLocator.getPermissionService();
492                    }
493                    return permissionService;
494            }
495    
496            public ResponsibilityService getResponsibilityService() {
497                    if ( responsibilityService == null ) {
498                            responsibilityService = KimApiServiceLocator.getResponsibilityService();
499                    }
500                    return responsibilityService;
501            }
502    }