|
55 | 55 | import java.util.Arrays; |
56 | 56 | import java.util.Collections; |
57 | 57 | import java.util.List; |
| 58 | +import javax.net.ssl.ExtendedSSLSession; |
| 59 | +import javax.net.ssl.SNIHostName; |
| 60 | +import javax.net.ssl.SNIServerName; |
58 | 61 | import javax.net.ssl.SSLPeerUnverifiedException; |
59 | | -import javax.net.ssl.SSLSession; |
60 | 62 | import javax.security.auth.x500.X500Principal; |
61 | 63 | import org.junit.Before; |
62 | 64 | import org.junit.Rule; |
@@ -85,12 +87,13 @@ public class GrpcAuthorizationEngineTest { |
85 | 87 | @Mock |
86 | 88 | private ServerCall<Void,Void> serverCall; |
87 | 89 | @Mock |
88 | | - private SSLSession sslSession; |
| 90 | + private ExtendedSSLSession sslSession; |
89 | 91 |
|
90 | 92 | @Before |
91 | 93 | public void setUp() throws Exception { |
92 | 94 | X509Certificate[] certs = {TestUtils.loadX509Cert("server1.pem")}; |
93 | 95 | when(sslSession.getPeerCertificates()).thenReturn(certs); |
| 96 | + when(sslSession.getRequestedServerNames()).thenReturn(Collections.<SNIServerName>emptyList()); |
94 | 97 | Attributes attributes = Attributes.newBuilder() |
95 | 98 | .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(IP_ADDR2, PORT)) |
96 | 99 | .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, new InetSocketAddress(IP_ADDR1, PORT)) |
@@ -354,6 +357,80 @@ public void multiplePolicies() throws Exception { |
354 | 357 | assertThat(decision.matchingPolicyName()).isEqualTo(POLICY_NAME); |
355 | 358 | } |
356 | 359 |
|
| 360 | + @Test |
| 361 | + public void requestedServerNameMatcher_matchesTlsSni() { |
| 362 | + when(sslSession.getRequestedServerNames()).thenReturn( |
| 363 | + Collections.<SNIServerName>singletonList(new SNIHostName("blocked.example"))); |
| 364 | + GrpcAuthorizationEngine.RequestedServerNameMatcher requestedServerNameMatcher = |
| 365 | + GrpcAuthorizationEngine.RequestedServerNameMatcher.create( |
| 366 | + StringMatcher.forExact("blocked.example", false)); |
| 367 | + OrMatcher permission = OrMatcher.create(requestedServerNameMatcher); |
| 368 | + OrMatcher principal = OrMatcher.create(AlwaysTrueMatcher.INSTANCE); |
| 369 | + PolicyMatcher policyMatcher = PolicyMatcher.create("deny-sni", permission, principal); |
| 370 | + |
| 371 | + GrpcAuthorizationEngine engine = new GrpcAuthorizationEngine( |
| 372 | + AuthConfig.create(Collections.singletonList(policyMatcher), Action.DENY)); |
| 373 | + AuthDecision decision = engine.evaluate(new Metadata(), serverCall); |
| 374 | + assertThat(decision.decision()).isEqualTo(Action.DENY); |
| 375 | + assertThat(decision.matchingPolicyName()).isEqualTo("deny-sni"); |
| 376 | + } |
| 377 | + |
| 378 | + @Test |
| 379 | + public void requestedServerNameMatcher_noTlsSessionDoesNotMatch() { |
| 380 | + Attributes attributes = Attributes.newBuilder() |
| 381 | + .set(Grpc.TRANSPORT_ATTR_REMOTE_ADDR, new InetSocketAddress(IP_ADDR2, PORT)) |
| 382 | + .set(Grpc.TRANSPORT_ATTR_LOCAL_ADDR, new InetSocketAddress(IP_ADDR1, PORT)) |
| 383 | + .build(); |
| 384 | + when(serverCall.getAttributes()).thenReturn(attributes); |
| 385 | + GrpcAuthorizationEngine.RequestedServerNameMatcher requestedServerNameMatcher = |
| 386 | + GrpcAuthorizationEngine.RequestedServerNameMatcher.create( |
| 387 | + StringMatcher.forExact("blocked.example", false)); |
| 388 | + OrMatcher permission = OrMatcher.create(requestedServerNameMatcher); |
| 389 | + OrMatcher principal = OrMatcher.create(AlwaysTrueMatcher.INSTANCE); |
| 390 | + PolicyMatcher policyMatcher = PolicyMatcher.create("deny-sni", permission, principal); |
| 391 | + |
| 392 | + GrpcAuthorizationEngine engine = new GrpcAuthorizationEngine( |
| 393 | + AuthConfig.create(Collections.singletonList(policyMatcher), Action.DENY)); |
| 394 | + AuthDecision decision = engine.evaluate(new Metadata(), serverCall); |
| 395 | + assertThat(decision.decision()).isEqualTo(Action.ALLOW); |
| 396 | + assertThat(decision.matchingPolicyName()).isNull(); |
| 397 | + } |
| 398 | + |
| 399 | + @Test |
| 400 | + public void requestedServerNameMatcher_nullTlsSniListDoesNotMatch() { |
| 401 | + when(sslSession.getRequestedServerNames()).thenReturn(null); |
| 402 | + GrpcAuthorizationEngine.RequestedServerNameMatcher requestedServerNameMatcher = |
| 403 | + GrpcAuthorizationEngine.RequestedServerNameMatcher.create( |
| 404 | + StringMatcher.forExact("blocked.example", false)); |
| 405 | + OrMatcher permission = OrMatcher.create(requestedServerNameMatcher); |
| 406 | + OrMatcher principal = OrMatcher.create(AlwaysTrueMatcher.INSTANCE); |
| 407 | + PolicyMatcher policyMatcher = PolicyMatcher.create("deny-sni", permission, principal); |
| 408 | + |
| 409 | + GrpcAuthorizationEngine engine = new GrpcAuthorizationEngine( |
| 410 | + AuthConfig.create(Collections.singletonList(policyMatcher), Action.DENY)); |
| 411 | + AuthDecision decision = engine.evaluate(new Metadata(), serverCall); |
| 412 | + assertThat(decision.decision()).isEqualTo(Action.ALLOW); |
| 413 | + assertThat(decision.matchingPolicyName()).isNull(); |
| 414 | + } |
| 415 | + |
| 416 | + @Test |
| 417 | + public void requestedServerNameMatcher_nonHostTlsSniDoesNotMatch() { |
| 418 | + when(sslSession.getRequestedServerNames()).thenReturn( |
| 419 | + Collections.singletonList(new SNIServerName(1, new byte[] {1}) { })); |
| 420 | + GrpcAuthorizationEngine.RequestedServerNameMatcher requestedServerNameMatcher = |
| 421 | + GrpcAuthorizationEngine.RequestedServerNameMatcher.create( |
| 422 | + StringMatcher.forExact("blocked.example", false)); |
| 423 | + OrMatcher permission = OrMatcher.create(requestedServerNameMatcher); |
| 424 | + OrMatcher principal = OrMatcher.create(AlwaysTrueMatcher.INSTANCE); |
| 425 | + PolicyMatcher policyMatcher = PolicyMatcher.create("deny-sni", permission, principal); |
| 426 | + |
| 427 | + GrpcAuthorizationEngine engine = new GrpcAuthorizationEngine( |
| 428 | + AuthConfig.create(Collections.singletonList(policyMatcher), Action.DENY)); |
| 429 | + AuthDecision decision = engine.evaluate(new Metadata(), serverCall); |
| 430 | + assertThat(decision.decision()).isEqualTo(Action.ALLOW); |
| 431 | + assertThat(decision.matchingPolicyName()).isNull(); |
| 432 | + } |
| 433 | + |
357 | 434 | @Test |
358 | 435 | public void matchersEqualHashcode() throws Exception { |
359 | 436 | PathMatcher pathMatcher = PathMatcher.create(STRING_MATCHER); |
|
0 commit comments