Skip to content

Commit fdd9ab4

Browse files
marvinliuejona86
authored andcommitted
adding a security policy that allows access if and only if all given security policies allow access. this contributes to b/221149437 and is similar to cl/442582915
1 parent 4c916c4 commit fdd9ab4

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

binder/src/main/java/io/grpc/binder/SecurityPolicies.java

+31
Original file line numberDiff line numberDiff line change
@@ -187,4 +187,35 @@ private static boolean checkPackageSignature(
187187
}
188188
return false;
189189
}
190+
191+
/**
192+
* Creates a {@link SecurityPolicy} that allows access if and only if *all* of the specified
193+
* {@code securityPolicies} allow access.
194+
*
195+
* @param securityPolicies the security policies that all must allow access.
196+
* @throws NullPointerException if any of the inputs are {@code null}.
197+
* @throws IllegalArgumentException if {@code securityPolicies} is empty.
198+
*/
199+
public static SecurityPolicy allOf(SecurityPolicy... securityPolicies) {
200+
Preconditions.checkNotNull(securityPolicies, "securityPolicies");
201+
Preconditions.checkArgument(securityPolicies.length > 0, "securityPolicies must not be empty");
202+
203+
return allOfSecurityPolicy(securityPolicies);
204+
}
205+
206+
private static SecurityPolicy allOfSecurityPolicy(SecurityPolicy... securityPolicies) {
207+
return new SecurityPolicy() {
208+
@Override
209+
public Status checkAuthorization(int uid) {
210+
for (SecurityPolicy policy : securityPolicies) {
211+
Status checkAuth = policy.checkAuthorization(uid);
212+
if (!checkAuth.isOk()) {
213+
return checkAuth;
214+
}
215+
}
216+
217+
return Status.OK;
218+
}
219+
};
220+
}
190221
}

binder/src/test/java/io/grpc/binder/SecurityPoliciesTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,24 @@ public void testHasSignature_failsIfUidUnknown() throws Exception {
171171
assertThat(policy.checkAuthorization(OTHER_UID_UNKNOWN).getCode())
172172
.isEqualTo(Status.UNAUTHENTICATED.getCode());
173173
}
174+
175+
@Test
176+
public void testAllOf_succeedsIfAllSecurityPoliciesAllowed() throws Exception {
177+
policy = SecurityPolicies.allOf(SecurityPolicies.internalOnly());
178+
179+
assertThat(policy.checkAuthorization(MY_UID).getCode()).isEqualTo(Status.OK.getCode());
180+
}
181+
182+
@Test
183+
public void testAllOf_failsIfOneSecurityPoliciesNotAllowed() throws Exception {
184+
policy =
185+
SecurityPolicies.allOf(
186+
SecurityPolicies.internalOnly(),
187+
SecurityPolicies.permissionDenied("Not allowed SecurityPolicy"));
188+
189+
assertThat(policy.checkAuthorization(MY_UID).getCode())
190+
.isEqualTo(Status.PERMISSION_DENIED.getCode());
191+
assertThat(policy.checkAuthorization(MY_UID).getDescription())
192+
.contains("Not allowed SecurityPolicy");
193+
}
174194
}

0 commit comments

Comments
 (0)