1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.saml2.metadata.provider;
18
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.Iterator;
22 import java.util.List;
23
24 import javax.xml.namespace.QName;
25
26 import org.opensaml.common.xml.SAMLConstants;
27 import org.opensaml.saml2.metadata.EntitiesDescriptor;
28 import org.opensaml.saml2.metadata.EntityDescriptor;
29 import org.opensaml.saml2.metadata.RoleDescriptor;
30 import org.opensaml.xml.XMLObject;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class EntityRoleFilter implements MetadataFilter {
48
49
50 private final Logger log = LoggerFactory.getLogger(EntityRoleFilter.class);
51
52
53 private List<QName> roleWhiteList;
54
55
56 private boolean removeRolelessEntityDescriptors;
57
58
59 private boolean removeEmptyEntitiesDescriptors;
60
61
62 private final QName extRoleDescriptor = new QName(SAMLConstants.SAML20MD_NS, "RoleDescriptor");
63
64
65
66
67
68
69 public EntityRoleFilter(List<QName> keptRoles) {
70 roleWhiteList = new ArrayList<QName>();
71
72 if (keptRoles != null) {
73 roleWhiteList.addAll(keptRoles);
74 }
75
76 removeRolelessEntityDescriptors = true;
77 removeEmptyEntitiesDescriptors = true;
78 }
79
80
81
82
83
84
85 public List<QName> getRoleWhiteList() {
86 return Collections.unmodifiableList(roleWhiteList);
87 }
88
89
90
91
92
93
94 public boolean getRemoveRolelessEntityDescriptors() {
95 return removeRolelessEntityDescriptors;
96 }
97
98
99
100
101
102
103 public void setRemoveRolelessEntityDescriptors(boolean remove) {
104 removeRolelessEntityDescriptors = remove;
105 }
106
107
108
109
110
111
112
113
114 public boolean getRemoveEmptyEntitiesDescriptors() {
115 return removeEmptyEntitiesDescriptors;
116 }
117
118
119
120
121
122
123
124
125 public void setRemoveEmptyEntitiesDescriptors(boolean remove) {
126 removeEmptyEntitiesDescriptors = remove;
127 }
128
129
130 public void doFilter(XMLObject metadata) throws FilterException {
131 if (metadata == null) {
132 return;
133 }
134
135 if (metadata instanceof EntitiesDescriptor) {
136 filterEntitiesDescriptor((EntitiesDescriptor) metadata);
137 } else {
138 filterEntityDescriptor((EntityDescriptor) metadata);
139 }
140 }
141
142
143
144
145
146
147
148
149 protected void filterEntitiesDescriptor(EntitiesDescriptor descriptor) throws FilterException {
150
151 List<EntityDescriptor> entityDescriptors = descriptor.getEntityDescriptors();
152 if (entityDescriptors != null && !entityDescriptors.isEmpty()) {
153 List<EntityDescriptor> emptyEntityDescriptors = new ArrayList<EntityDescriptor>();
154 Iterator<EntityDescriptor> entityDescriptorsItr = entityDescriptors.iterator();
155 EntityDescriptor entityDescriptor;
156 List<RoleDescriptor> entityRoles;
157 while (entityDescriptorsItr.hasNext()) {
158 entityDescriptor = entityDescriptorsItr.next();
159 filterEntityDescriptor(entityDescriptor);
160 if (getRemoveRolelessEntityDescriptors()) {
161 entityRoles = entityDescriptor.getRoleDescriptors();
162 if (entityRoles == null || entityRoles.isEmpty()) {
163 log.trace("Filtering out entity descriptor {} from entity group {}", entityDescriptor
164 .getEntityID(), descriptor.getName());
165 emptyEntityDescriptors.add(entityDescriptor);
166 }
167 }
168 }
169 entityDescriptors.removeAll(emptyEntityDescriptors);
170 }
171
172
173 List<EntitiesDescriptor> entitiesDescriptors = descriptor.getEntitiesDescriptors();
174 if (entitiesDescriptors != null && !entitiesDescriptors.isEmpty()) {
175 List<EntitiesDescriptor> emptyEntitiesDescriptors = new ArrayList<EntitiesDescriptor>();
176 Iterator<EntitiesDescriptor> entitiesDescriptorsItr = entitiesDescriptors.iterator();
177 EntitiesDescriptor entitiesDescriptor;
178 while (entitiesDescriptorsItr.hasNext()) {
179 entitiesDescriptor = entitiesDescriptorsItr.next();
180 filterEntitiesDescriptor(entitiesDescriptor);
181 if (getRemoveEmptyEntitiesDescriptors()) {
182
183 if ((entitiesDescriptor.getEntityDescriptors() == null || entitiesDescriptor.getEntityDescriptors()
184 .isEmpty())
185 && (entitiesDescriptor.getEntitiesDescriptors() == null || entitiesDescriptor
186 .getEntitiesDescriptors().isEmpty())) {
187 log.trace("Filtering out entity descriptor {} from entity group {}", entitiesDescriptor
188 .getName(), descriptor.getName());
189 emptyEntitiesDescriptors.add(entitiesDescriptor);
190 }
191 }
192 }
193 entitiesDescriptors.removeAll(emptyEntitiesDescriptors);
194 }
195 }
196
197
198
199
200
201
202
203
204 protected void filterEntityDescriptor(EntityDescriptor descriptor) throws FilterException {
205 List<RoleDescriptor> roles = descriptor.getRoleDescriptors();
206
207 if (roles != null && !roles.isEmpty()) {
208 Iterator<RoleDescriptor> rolesItr = roles.iterator();
209 QName roleName;
210 while (rolesItr.hasNext()) {
211 roleName = getRoleName(rolesItr.next());
212 if (!roleWhiteList.contains(roleName)) {
213 log.trace("Filtering out role {} from entity {}", roleName, descriptor.getEntityID());
214 rolesItr.remove();
215 }
216 }
217 }
218 }
219
220
221
222
223
224
225
226
227
228
229
230 protected QName getRoleName(RoleDescriptor role) throws FilterException {
231 QName roleName = role.getElementQName();
232
233 if (extRoleDescriptor.equals(roleName)) {
234 roleName = role.getSchemaType();
235 if (roleName == null) {
236 throw new FilterException("Role descriptor element was " + extRoleDescriptor
237 + " but did not contain a schema type. This is illegal.");
238 }
239 }
240
241 return roleName;
242 }
243 }