Skip to content

Commit

Permalink
Expose SecurityLevel on server-side (#8943)
Browse files Browse the repository at this point in the history
  • Loading branch information
ovidiutirla committed May 17, 2022
1 parent c61b4af commit a88f19f
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 0 deletions.
15 changes: 15 additions & 0 deletions api/src/main/java/io/grpc/ServerCall.java
Expand Up @@ -211,6 +211,21 @@ public void setCompression(String compressor) {
// noop
}

/**
* Returns the level of security guarantee in communications
*
* <p>Determining the level of security offered by the transport for RPCs on server-side.
* This can be approximated by looking for the SSLSession, but that doesn't work for ALTS and
* maybe some future TLS approaches. May return a lower security level when it cannot be
* determined precisely.
*
* @return non-{@code null} SecurityLevel enum
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/4692")
public SecurityLevel getSecurityLevel() {
return SecurityLevel.NONE;
}

/**
* Returns properties of a single call.
*
Expand Down
12 changes: 12 additions & 0 deletions core/src/main/java/io/grpc/internal/ServerCallImpl.java
Expand Up @@ -19,6 +19,7 @@
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static io.grpc.internal.GrpcAttributes.ATTR_SECURITY_LEVEL;
import static io.grpc.internal.GrpcUtil.ACCEPT_ENCODING_SPLITTER;
import static io.grpc.internal.GrpcUtil.CONTENT_LENGTH_KEY;
import static io.grpc.internal.GrpcUtil.MESSAGE_ACCEPT_ENCODING_KEY;
Expand All @@ -36,6 +37,7 @@
import io.grpc.InternalDecompressorRegistry;
import io.grpc.Metadata;
import io.grpc.MethodDescriptor;
import io.grpc.SecurityLevel;
import io.grpc.ServerCall;
import io.grpc.Status;
import io.perfmark.PerfMark;
Expand Down Expand Up @@ -250,6 +252,16 @@ public MethodDescriptor<ReqT, RespT> getMethodDescriptor() {
return method;
}

@Override
public SecurityLevel getSecurityLevel() {
final Attributes attributes = getAttributes();
if (attributes == null) {
return super.getSecurityLevel();
}
final SecurityLevel securityLevel = attributes.get(ATTR_SECURITY_LEVEL);
return securityLevel == null ? super.getSecurityLevel() : securityLevel;
}

/**
* Close the {@link ServerStream} because an internal error occurred. Allow the application to
* run until completion, but silently ignore interactions with the {@link ServerStream} from now
Expand Down
19 changes: 19 additions & 0 deletions core/src/test/java/io/grpc/internal/ServerCallImplTest.java
Expand Up @@ -33,6 +33,7 @@
import static org.mockito.Mockito.when;

import com.google.common.io.CharStreams;
import io.grpc.Attributes;
import io.grpc.CompressorRegistry;
import io.grpc.Context;
import io.grpc.DecompressorRegistry;
Expand All @@ -41,6 +42,7 @@
import io.grpc.MethodDescriptor;
import io.grpc.MethodDescriptor.Marshaller;
import io.grpc.MethodDescriptor.MethodType;
import io.grpc.SecurityLevel;
import io.grpc.ServerCall;
import io.grpc.Status;
import io.grpc.internal.ServerCallImpl.ServerStreamListenerImpl;
Expand Down Expand Up @@ -352,6 +354,23 @@ public void getNullAuthority() {
verify(stream).getAuthority();
}

@Test
public void getSecurityLevel() {
Attributes attributes = Attributes.newBuilder()
.set(GrpcAttributes.ATTR_SECURITY_LEVEL, SecurityLevel.INTEGRITY).build();
when(stream.getAttributes()).thenReturn(attributes);
assertEquals(SecurityLevel.INTEGRITY, call.getSecurityLevel());
verify(stream).getAttributes();
}

@Test
public void getNullSecurityLevel() {
when(stream.getAttributes()).thenReturn(null);
assertEquals(SecurityLevel.NONE, call.getSecurityLevel());
verify(stream).getAttributes();
}


@Test
public void setMessageCompression() {
call.setMessageCompression(true);
Expand Down

0 comments on commit a88f19f

Please sign in to comment.