From 006fa3a85a1881928b454b63f9b25e8f698e6a83 Mon Sep 17 00:00:00 2001 From: Timothy Messier Date: Tue, 12 Apr 2022 22:38:45 -0400 Subject: [PATCH] feat(session): Classify resources for audit events --- Makefile | 2 + .../api/services/session_service.pb.go | 12 +- .../api/resources/sessions/v1/session.proto | 56 +++--- .../api/services/v1/session_service.proto | 12 +- .../tests/api/sessions/classification_test.go | 160 ++++++++++++++++++ .../api/resources/sessions/session.pb.go | 56 +++--- 6 files changed, 230 insertions(+), 68 deletions(-) create mode 100644 internal/tests/api/sessions/classification_test.go diff --git a/Makefile b/Makefile index 2648e7406..ad3082fdb 100644 --- a/Makefile +++ b/Makefile @@ -177,6 +177,8 @@ protobuild: @protoc-go-inject-tag -input=./internal/gen/controller/api/services/credential_library_service.pb.go @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/roles/role.pb.go @protoc-go-inject-tag -input=./internal/gen/controller/api/services/role_service.pb.go + @protoc-go-inject-tag -input=./sdk/pbs/controller/api/resources/sessions/session.pb.go + @protoc-go-inject-tag -input=./internal/gen/controller/api/services/session_service.pb.go # these protos, services and openapi artifacts are purely for testing purposes @protoc-go-inject-tag -input=./internal/gen/testing/event/event.pb.go diff --git a/internal/gen/controller/api/services/session_service.pb.go b/internal/gen/controller/api/services/session_service.pb.go index a5f84520d..dbed5c594 100644 --- a/internal/gen/controller/api/services/session_service.pb.go +++ b/internal/gen/controller/api/services/session_service.pb.go @@ -28,7 +28,7 @@ type GetSessionRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *GetSessionRequest) Reset() { @@ -122,9 +122,9 @@ type ListSessionsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ScopeId string `protobuf:"bytes,1,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty"` - Recursive bool `protobuf:"varint,20,opt,name=recursive,proto3" json:"recursive,omitempty"` - Filter string `protobuf:"bytes,30,opt,name=filter,proto3" json:"filter,omitempty"` + ScopeId string `protobuf:"bytes,1,opt,name=scope_id,json=scopeId,proto3" json:"scope_id,omitempty" class:"public"` // @gotags: `class:"public"` + Recursive bool `protobuf:"varint,20,opt,name=recursive,proto3" json:"recursive,omitempty" class:"public"` // @gotags: `class:"public"` + Filter string `protobuf:"bytes,30,opt,name=filter,proto3" json:"filter,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *ListSessionsRequest) Reset() { @@ -232,8 +232,8 @@ type CancelSessionRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` + Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *CancelSessionRequest) Reset() { diff --git a/internal/proto/controller/api/resources/sessions/v1/session.proto b/internal/proto/controller/api/resources/sessions/v1/session.proto index a700ead92..a7e473e9a 100644 --- a/internal/proto/controller/api/resources/sessions/v1/session.proto +++ b/internal/proto/controller/api/resources/sessions/v1/session.proto @@ -9,106 +9,106 @@ import "controller/api/resources/scopes/v1/scope.proto"; message WorkerInfo { // The address of the worker. - string address = 10; + string address = 10; // @gotags: `class:"public"` } message SessionState { // The status of the Session, e.g. "pending", "active", "canceling", "terminated". - string status = 10; + string status = 10; // @gotags: `class:"public"` // Output only. The time the Session entered this state. - google.protobuf.Timestamp start_time = 20 [json_name = "start_time"]; + google.protobuf.Timestamp start_time = 20 [json_name = "start_time"]; // @gotags: `class:"public"` // Output only. The time the Session stopped being in this state. - google.protobuf.Timestamp end_time = 30 [json_name = "end_time"]; + google.protobuf.Timestamp end_time = 30 [json_name = "end_time"]; // @gotags: `class:"public"` } // Connection contains information about a specific connection in a session message Connection { // client_tcp_address of the connection - string client_tcp_address = 3; + string client_tcp_address = 3; // @gotags: `class:"public"` // client_tcp_port of the connection - uint32 client_tcp_port = 4; + uint32 client_tcp_port = 4; // @gotags: `class:"public"` // endpoint_tcp_address of the connection - string endpoint_tcp_address = 5; + string endpoint_tcp_address = 5; // @gotags: `class:"public"` // endpoint_tcp_port of the connection - uint32 endpoint_tcp_port = 6; + uint32 endpoint_tcp_port = 6; // @gotags: `class:"public"` // bytes_up of the connection - uint64 bytes_up = 7; + uint64 bytes_up = 7; // @gotags: `class:"public"` // bytes_down of the connection - uint64 bytes_down = 8; + uint64 bytes_down = 8; // @gotags: `class:"public"` // closed_reason of the conneciont - string closed_reason = 9; + string closed_reason = 9; // @gotags: `class:"public"` } // Session contains all fields related to a Session resource message Session { // Output only. The ID of the Session. - string id = 10; + string id = 10; // @gotags: `class:"public"` // Output only. The ID of the Target that created this Session. - string target_id = 20 [json_name = "target_id"]; + string target_id = 20 [json_name = "target_id"]; // @gotags: `class:"public"` // Output only. Scope information for this resource. resources.scopes.v1.ScopeInfo scope = 30; // Output only. The time this resource was created. - google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; + google.protobuf.Timestamp created_time = 60 [json_name = "created_time"]; // @gotags: `class:"public"` // Output only. The time this resource was last updated. - google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; + google.protobuf.Timestamp updated_time = 70 [json_name = "updated_time"]; // @gotags: `class:"public"` // Version is used when canceling this Session to ensure that the operation is acting on a known session state. - uint32 version = 80; + uint32 version = 80; // @gotags: `class:"public"` // Output only. Type of the Session (e.g. tcp). - string type = 90; + string type = 90; // @gotags: `class:"public"` // Output only. After this time the connection will be expired, e.g. forcefully terminated. - google.protobuf.Timestamp expiration_time = 100 [json_name = "expiration_time"]; + google.protobuf.Timestamp expiration_time = 100 [json_name = "expiration_time"]; // @gotags: `class:"public"` // Output only. The ID of the Auth Token used to authenticate. - string auth_token_id = 110 [json_name = "auth_token_id"]; + string auth_token_id = 110 [json_name = "auth_token_id"]; // @gotags: `class:"public"` // Output only. The ID of the User that requested the Session. - string user_id = 120 [json_name = "user_id"]; + string user_id = 120 [json_name = "user_id"]; // @gotags: `class:"public"` // Output only. The Host Set sourcing the Host for this Session. - string host_set_id = 130 [json_name = "host_set_id"]; + string host_set_id = 130 [json_name = "host_set_id"]; // @gotags: `class:"public"` // Output only. The Host used by the Session. - string host_id = 140 [json_name = "host_id"]; + string host_id = 140 [json_name = "host_id"]; // @gotags: `class:"public"` // Output only. The Scope of the Session. - string scope_id = 150 [json_name = "scope_id"]; + string scope_id = 150 [json_name = "scope_id"]; // @gotags: `class:"public"` // Output only. The endpoint of the Session; that is, the address to which the worker is proxying data. - string endpoint = 160; + string endpoint = 160; // @gotags: `class:"public"` // Output only. The states of this Session in descending order from the current state to the first. repeated SessionState states = 170; // Output only. The current status of this Session. - string status = 180; + string status = 180; // @gotags: `class:"public"` // Output only. Worker information given to the client. repeated WorkerInfo worker_info = 190 [json_name = "worker_info"]; // Output only. The certificate generated for the session. Raw DER bytes. - bytes certificate = 200; + bytes certificate = 200; // @gotags: `class:"public"` // Output only. If the session is terminated, this provides a short description as to why. - string termination_reason = 210 [json_name = "termination_reason"]; + string termination_reason = 210 [json_name = "termination_reason"]; // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - repeated string authorized_actions = 300 [json_name="authorized_actions"]; + repeated string authorized_actions = 300 [json_name="authorized_actions"]; // @gotags: `class:"public"` // Output only. The associated connections with this session. repeated Connection connections = 310; diff --git a/internal/proto/controller/api/services/v1/session_service.proto b/internal/proto/controller/api/services/v1/session_service.proto index 73e163c74..8dbeae49e 100644 --- a/internal/proto/controller/api/services/v1/session_service.proto +++ b/internal/proto/controller/api/services/v1/session_service.proto @@ -52,7 +52,7 @@ service SessionService { } message GetSessionRequest { - string id = 1; + string id = 1; // @gotags: `class:"public"` } message GetSessionResponse { @@ -60,9 +60,9 @@ message GetSessionResponse { } message ListSessionsRequest { - string scope_id = 1; - bool recursive = 20 [json_name="recursive"]; - string filter = 30 [json_name="filter"]; + string scope_id = 1; // @gotags: `class:"public"` + bool recursive = 20 [json_name="recursive"]; // @gotags: `class:"public"` + string filter = 30 [json_name="filter"]; // @gotags: `class:"public"` } message ListSessionsResponse { @@ -70,8 +70,8 @@ message ListSessionsResponse { } message CancelSessionRequest { - string id = 1; - uint32 version = 2; + string id = 1; // @gotags: `class:"public"` + uint32 version = 2; // @gotags: `class:"public"` } message CancelSessionResponse { diff --git a/internal/tests/api/sessions/classification_test.go b/internal/tests/api/sessions/classification_test.go new file mode 100644 index 000000000..3136a44e9 --- /dev/null +++ b/internal/tests/api/sessions/classification_test.go @@ -0,0 +1,160 @@ +package sessions_test + +import ( + "context" + "encoding/json" + "testing" + "time" + + "github.com/hashicorp/boundary/sdk/pbs/controller/api" + "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/scopes" + pb "github.com/hashicorp/boundary/sdk/pbs/controller/api/resources/sessions" + "github.com/hashicorp/boundary/sdk/wrapper" + "github.com/hashicorp/eventlogger" + "github.com/hashicorp/eventlogger/filters/encrypt" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/timestamppb" +) + +func TestSessions(t *testing.T) { + ctx := context.Background() + now := time.Now() + pbNow := timestamppb.Now() + wrapper := wrapper.TestWrapper(t) + testEncryptingFilter := api.NewEncryptFilter(t, wrapper) + testEncryptingFilter.FilterOperationOverrides = map[encrypt.DataClassification]encrypt.FilterOperation{ + // Use HMAC for sensitive fields for easy test comparisons + encrypt.SensitiveClassification: encrypt.HmacSha256Operation, + } + + tests := []struct { + name string + in *eventlogger.Event + want *eventlogger.Event + }{ + { + name: "session", + in: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &pb.Session{ + Id: "id", + TargetId: "target_id", + Scope: &scopes.ScopeInfo{ + Id: "scope-id", + Type: "scope-type", + Name: "scope-name", + Description: "scope-description", + ParentScopeId: "scope-parent_scope_id", + }, + CreatedTime: pbNow, + UpdatedTime: pbNow, + Version: 0, + Type: "type", + ExpirationTime: pbNow, + AuthTokenId: "auth_token_id", + UserId: "user_id", + HostSetId: "host_set_id", + HostId: "host_id", + ScopeId: "scope_id", + Endpoint: "endpoint", + States: []*pb.SessionState{ + { + Status: "status", + StartTime: pbNow, + EndTime: pbNow, + }, + }, + Status: "status", + WorkerInfo: []*pb.WorkerInfo{ + { + Address: "worker-address", + }, + }, + Certificate: []byte("certificate"), + TerminationReason: "termination_reason", + AuthorizedActions: []string{"action-1"}, + Connections: []*pb.Connection{ + { + ClientTcpAddress: "client_tcp_address", + ClientTcpPort: 0, + EndpointTcpAddress: "endpoint_tcp_address", + EndpointTcpPort: 0, + BytesUp: 0, + BytesDown: 0, + ClosedReason: "closed_reason", + }, + }, + }, + }, + want: &eventlogger.Event{ + Type: "test", + CreatedAt: now, + Payload: &pb.Session{ + Id: "id", + TargetId: "target_id", + Scope: &scopes.ScopeInfo{ + Id: "scope-id", + Type: "scope-type", + Name: "scope-name", + Description: "scope-description", + ParentScopeId: "scope-parent_scope_id", + }, + CreatedTime: pbNow, + UpdatedTime: pbNow, + Version: 0, + Type: "type", + ExpirationTime: pbNow, + AuthTokenId: "auth_token_id", + UserId: "user_id", + HostSetId: "host_set_id", + HostId: "host_id", + ScopeId: "scope_id", + Endpoint: "endpoint", + States: []*pb.SessionState{ + { + Status: "status", + StartTime: pbNow, + EndTime: pbNow, + }, + }, + Status: "status", + WorkerInfo: []*pb.WorkerInfo{ + { + Address: "worker-address", + }, + }, + Certificate: []byte("certificate"), + TerminationReason: "termination_reason", + AuthorizedActions: []string{"action-1"}, + Connections: []*pb.Connection{ + { + ClientTcpAddress: "client_tcp_address", + ClientTcpPort: 0, + EndpointTcpAddress: "endpoint_tcp_address", + EndpointTcpPort: 0, + BytesUp: 0, + BytesDown: 0, + ClosedReason: "closed_reason", + }, + }, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + got, err := testEncryptingFilter.Process(ctx, tt.in) + require.NoError(err) + require.NotNil(got) + gotJSON, err := json.Marshal(got) + require.NoError(err) + + wantJSON, err := json.Marshal(tt.want) + require.NoError(err) + assert.JSONEq(string(wantJSON), string(gotJSON)) + }) + } +} diff --git a/sdk/pbs/controller/api/resources/sessions/session.pb.go b/sdk/pbs/controller/api/resources/sessions/session.pb.go index 8761881dd..8d3fd027d 100644 --- a/sdk/pbs/controller/api/resources/sessions/session.pb.go +++ b/sdk/pbs/controller/api/resources/sessions/session.pb.go @@ -28,7 +28,7 @@ type WorkerInfo struct { unknownFields protoimpl.UnknownFields // The address of the worker. - Address string `protobuf:"bytes,10,opt,name=address,proto3" json:"address,omitempty"` + Address string `protobuf:"bytes,10,opt,name=address,proto3" json:"address,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *WorkerInfo) Reset() { @@ -76,11 +76,11 @@ type SessionState struct { unknownFields protoimpl.UnknownFields // The status of the Session, e.g. "pending", "active", "canceling", "terminated". - Status string `protobuf:"bytes,10,opt,name=status,proto3" json:"status,omitempty"` + Status string `protobuf:"bytes,10,opt,name=status,proto3" json:"status,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time the Session entered this state. - StartTime *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=start_time,proto3" json:"start_time,omitempty"` + StartTime *timestamppb.Timestamp `protobuf:"bytes,20,opt,name=start_time,proto3" json:"start_time,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time the Session stopped being in this state. - EndTime *timestamppb.Timestamp `protobuf:"bytes,30,opt,name=end_time,proto3" json:"end_time,omitempty"` + EndTime *timestamppb.Timestamp `protobuf:"bytes,30,opt,name=end_time,proto3" json:"end_time,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *SessionState) Reset() { @@ -143,19 +143,19 @@ type Connection struct { unknownFields protoimpl.UnknownFields // client_tcp_address of the connection - ClientTcpAddress string `protobuf:"bytes,3,opt,name=client_tcp_address,json=clientTcpAddress,proto3" json:"client_tcp_address,omitempty"` + ClientTcpAddress string `protobuf:"bytes,3,opt,name=client_tcp_address,json=clientTcpAddress,proto3" json:"client_tcp_address,omitempty" class:"public"` // @gotags: `class:"public"` // client_tcp_port of the connection - ClientTcpPort uint32 `protobuf:"varint,4,opt,name=client_tcp_port,json=clientTcpPort,proto3" json:"client_tcp_port,omitempty"` + ClientTcpPort uint32 `protobuf:"varint,4,opt,name=client_tcp_port,json=clientTcpPort,proto3" json:"client_tcp_port,omitempty" class:"public"` // @gotags: `class:"public"` // endpoint_tcp_address of the connection - EndpointTcpAddress string `protobuf:"bytes,5,opt,name=endpoint_tcp_address,json=endpointTcpAddress,proto3" json:"endpoint_tcp_address,omitempty"` + EndpointTcpAddress string `protobuf:"bytes,5,opt,name=endpoint_tcp_address,json=endpointTcpAddress,proto3" json:"endpoint_tcp_address,omitempty" class:"public"` // @gotags: `class:"public"` // endpoint_tcp_port of the connection - EndpointTcpPort uint32 `protobuf:"varint,6,opt,name=endpoint_tcp_port,json=endpointTcpPort,proto3" json:"endpoint_tcp_port,omitempty"` + EndpointTcpPort uint32 `protobuf:"varint,6,opt,name=endpoint_tcp_port,json=endpointTcpPort,proto3" json:"endpoint_tcp_port,omitempty" class:"public"` // @gotags: `class:"public"` // bytes_up of the connection - BytesUp uint64 `protobuf:"varint,7,opt,name=bytes_up,json=bytesUp,proto3" json:"bytes_up,omitempty"` + BytesUp uint64 `protobuf:"varint,7,opt,name=bytes_up,json=bytesUp,proto3" json:"bytes_up,omitempty" class:"public"` // @gotags: `class:"public"` // bytes_down of the connection - BytesDown uint64 `protobuf:"varint,8,opt,name=bytes_down,json=bytesDown,proto3" json:"bytes_down,omitempty"` + BytesDown uint64 `protobuf:"varint,8,opt,name=bytes_down,json=bytesDown,proto3" json:"bytes_down,omitempty" class:"public"` // @gotags: `class:"public"` // closed_reason of the conneciont - ClosedReason string `protobuf:"bytes,9,opt,name=closed_reason,json=closedReason,proto3" json:"closed_reason,omitempty"` + ClosedReason string `protobuf:"bytes,9,opt,name=closed_reason,json=closedReason,proto3" json:"closed_reason,omitempty" class:"public"` // @gotags: `class:"public"` } func (x *Connection) Reset() { @@ -246,45 +246,45 @@ type Session struct { unknownFields protoimpl.UnknownFields // Output only. The ID of the Session. - Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,10,opt,name=id,proto3" json:"id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The ID of the Target that created this Session. - TargetId string `protobuf:"bytes,20,opt,name=target_id,proto3" json:"target_id,omitempty"` + TargetId string `protobuf:"bytes,20,opt,name=target_id,proto3" json:"target_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. Scope information for this resource. Scope *scopes.ScopeInfo `protobuf:"bytes,30,opt,name=scope,proto3" json:"scope,omitempty"` // Output only. The time this resource was created. - CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty"` + CreatedTime *timestamppb.Timestamp `protobuf:"bytes,60,opt,name=created_time,proto3" json:"created_time,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The time this resource was last updated. - UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty"` + UpdatedTime *timestamppb.Timestamp `protobuf:"bytes,70,opt,name=updated_time,proto3" json:"updated_time,omitempty" class:"public"` // @gotags: `class:"public"` // Version is used when canceling this Session to ensure that the operation is acting on a known session state. - Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty"` + Version uint32 `protobuf:"varint,80,opt,name=version,proto3" json:"version,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. Type of the Session (e.g. tcp). - Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty"` + Type string `protobuf:"bytes,90,opt,name=type,proto3" json:"type,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. After this time the connection will be expired, e.g. forcefully terminated. - ExpirationTime *timestamppb.Timestamp `protobuf:"bytes,100,opt,name=expiration_time,proto3" json:"expiration_time,omitempty"` + ExpirationTime *timestamppb.Timestamp `protobuf:"bytes,100,opt,name=expiration_time,proto3" json:"expiration_time,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The ID of the Auth Token used to authenticate. - AuthTokenId string `protobuf:"bytes,110,opt,name=auth_token_id,proto3" json:"auth_token_id,omitempty"` + AuthTokenId string `protobuf:"bytes,110,opt,name=auth_token_id,proto3" json:"auth_token_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The ID of the User that requested the Session. - UserId string `protobuf:"bytes,120,opt,name=user_id,proto3" json:"user_id,omitempty"` + UserId string `protobuf:"bytes,120,opt,name=user_id,proto3" json:"user_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The Host Set sourcing the Host for this Session. - HostSetId string `protobuf:"bytes,130,opt,name=host_set_id,proto3" json:"host_set_id,omitempty"` + HostSetId string `protobuf:"bytes,130,opt,name=host_set_id,proto3" json:"host_set_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The Host used by the Session. - HostId string `protobuf:"bytes,140,opt,name=host_id,proto3" json:"host_id,omitempty"` + HostId string `protobuf:"bytes,140,opt,name=host_id,proto3" json:"host_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The Scope of the Session. - ScopeId string `protobuf:"bytes,150,opt,name=scope_id,proto3" json:"scope_id,omitempty"` + ScopeId string `protobuf:"bytes,150,opt,name=scope_id,proto3" json:"scope_id,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The endpoint of the Session; that is, the address to which the worker is proxying data. - Endpoint string `protobuf:"bytes,160,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + Endpoint string `protobuf:"bytes,160,opt,name=endpoint,proto3" json:"endpoint,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The states of this Session in descending order from the current state to the first. States []*SessionState `protobuf:"bytes,170,rep,name=states,proto3" json:"states,omitempty"` // Output only. The current status of this Session. - Status string `protobuf:"bytes,180,opt,name=status,proto3" json:"status,omitempty"` + Status string `protobuf:"bytes,180,opt,name=status,proto3" json:"status,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. Worker information given to the client. WorkerInfo []*WorkerInfo `protobuf:"bytes,190,rep,name=worker_info,proto3" json:"worker_info,omitempty"` // Output only. The certificate generated for the session. Raw DER bytes. - Certificate []byte `protobuf:"bytes,200,opt,name=certificate,proto3" json:"certificate,omitempty"` + Certificate []byte `protobuf:"bytes,200,opt,name=certificate,proto3" json:"certificate,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. If the session is terminated, this provides a short description as to why. - TerminationReason string `protobuf:"bytes,210,opt,name=termination_reason,proto3" json:"termination_reason,omitempty"` + TerminationReason string `protobuf:"bytes,210,opt,name=termination_reason,proto3" json:"termination_reason,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The available actions on this resource for this user. - AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty"` + AuthorizedActions []string `protobuf:"bytes,300,rep,name=authorized_actions,proto3" json:"authorized_actions,omitempty" class:"public"` // @gotags: `class:"public"` // Output only. The associated connections with this session. Connections []*Connection `protobuf:"bytes,310,rep,name=connections,proto3" json:"connections,omitempty"` }