Skip to content

Commit

Permalink
Expose SecurityLevel on server-side
Browse files Browse the repository at this point in the history
  • Loading branch information
ovidiutirla committed Feb 25, 2022
1 parent 6559ef8 commit 1b247d6
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
15 changes: 14 additions & 1 deletion api/src/main/java/io/grpc/ServerCall.java
Expand Up @@ -208,7 +208,20 @@ public void setMessageCompression(boolean enabled) {
*/
@ExperimentalApi("https://github.com/grpc/grpc-java/issues/1704")
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 returns a lower security level in the face of
* uncertainty.
*
* @return non-{@code null} SecurityLevel enum
*/
public SecurityLevel getSecurityLevel() {
return SecurityLevel.NONE;
}

/**
Expand Down
11 changes: 11 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,15 @@ public MethodDescriptor<ReqT, RespT> getMethodDescriptor() {
return method;
}

@Override
public SecurityLevel getSecurityLevel() {
if (getAttributes() == null) {
return super.getSecurityLevel();
}
final SecurityLevel securityLevel = getAttributes().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
20 changes: 20 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 @@ -314,6 +316,7 @@ private void serverSendsOne_okFailsOnMissingResponse(
serverCallTracer,
PerfMark.createTag());
serverCall.close(Status.OK, new Metadata());

ArgumentCaptor<Status> statusCaptor = ArgumentCaptor.forClass(Status.class);
verify(stream, times(1)).cancel(statusCaptor.capture());
assertEquals(Status.Code.INTERNAL, statusCaptor.getValue().getCode());
Expand Down Expand Up @@ -352,6 +355,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, times(2)).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 1b247d6

Please sign in to comment.