]> git.aero2k.de Git - tmp/jakarta-migration.git/blob
b6ed8494ca0effe365714c1b488657f3842d2032
[tmp/jakarta-migration.git] /
1 /**
2  *  This document is a part of the source code and related artifacts
3  *  for CollectionSpace, an open source collections management system
4  *  for museums and related institutions:
5
6  *  http://www.collectionspace.org
7  *  http://wiki.collectionspace.org
8
9  *  Copyright 2009 University of California at Berkeley
10
11  *  Licensed under the Educational Community License (ECL), Version 2.0.
12  *  You may not use this file except in compliance with this License.
13
14  *  You may obtain a copy of the ECL 2.0 License at
15
16  *  https://source.collectionspace.org/collection-space/LICENSE.txt
17
18  *  Unless required by applicable law or agreed to in writing, software
19  *  distributed under the License is distributed on an "AS IS" BASIS,
20  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21  *  See the License for the specific language governing permissions and
22  *  limitations under the License.
23  */
24
25 package org.collectionspace.services.authorization.spring;
26
27 import java.util.List;
28 import org.apache.commons.logging.Log;
29 import org.apache.commons.logging.LogFactory;
30 import org.collectionspace.services.authorization.CSpaceAction;
31 import org.collectionspace.services.authorization.spi.CSpacePermissionManager;
32 import org.collectionspace.services.authorization.CSpaceResource;
33 import org.springframework.security.acls.model.AccessControlEntry;
34 import org.springframework.security.acls.model.MutableAcl;
35 import org.springframework.security.acls.model.MutableAclService;
36 import org.springframework.security.acls.model.NotFoundException;
37 import org.springframework.security.acls.model.ObjectIdentity;
38 import org.springframework.security.acls.model.Permission;
39 import org.springframework.security.acls.model.Sid;
40
41 /**
42  * Manages permissions in Spring Security
43  * @author 
44  */
45 public class SpringPermissionManager implements CSpacePermissionManager {
46
47     final Log log = LogFactory.getLog(SpringPermissionEvaluator.class);
48     private SpringAuthorizationProvider provider;
49
50     SpringPermissionManager(SpringAuthorizationProvider provider) {
51         this.provider = provider;
52     }
53
54     @Override
55     public void addPermission(CSpaceResource res, String[] principals, CSpaceAction perm) {
56         ObjectIdentity oid = SpringAuthorizationProvider.mapResource(res);
57         Sid[] sids = SpringAuthorizationProvider.mapPrincipal(principals);
58         Permission p = SpringAuthorizationProvider.mapPermssion(perm);
59         for (Sid sid : sids) {
60             addPermission(oid, sid, p);
61         }
62     }
63
64     private void addPermission(ObjectIdentity oid, Sid recipient, Permission permission) {
65         MutableAcl acl;
66         MutableAclService mutableAclService = provider.getProviderAclService();
67         try {
68             acl = (MutableAcl) mutableAclService.readAclById(oid);
69         } catch (NotFoundException nfe) {
70             acl = mutableAclService.createAcl(oid);
71         }
72
73         acl.insertAce(acl.getEntries().size(), permission, recipient, true);
74         mutableAclService.updateAcl(acl);
75
76     }
77
78     @Override
79     public void deletePermission(CSpaceResource res, String[] principals, CSpaceAction perm) {
80         ObjectIdentity oid = SpringAuthorizationProvider.mapResource(res);
81         Sid[] sids = SpringAuthorizationProvider.mapPrincipal(principals);
82         Permission p = SpringAuthorizationProvider.mapPermssion(perm);
83         for (Sid sid : sids) {
84             deletePermission(oid, sid, p);
85         }
86     }
87
88     private void deletePermission(ObjectIdentity oid, Sid recipient, Permission permission) {
89
90         MutableAclService mutableAclService = provider.getProviderAclService();
91         MutableAcl acl = (MutableAcl) mutableAclService.readAclById(oid);
92
93         // Remove all permissions associated with this particular recipient (string equality to KISS)
94         List<AccessControlEntry> entries = acl.getEntries();
95
96         for (int i = 0; i < entries.size(); i++) {
97             if (entries.get(i).getSid().equals(recipient)
98                     && entries.get(i).getPermission().equals(permission)) {
99                 acl.deleteAce(i);
100             }
101         }
102         mutableAclService.updateAcl(acl);
103     }
104 }