diff --git a/Gopkg.toml b/Gopkg.toml index 56fd4154d480097761aefd7c8bfe6a1b7fa872d3..83e3a3257c4eae098313632023d1582a2cc1d4ca 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -1,5 +1,5 @@ [[constraint]] - branch = "master" + branch = "activity_update" name = "code.vereign.com/code/viam-apis" [[constraint]] diff --git a/config/configs.go b/config/configs.go index a2d37733bf31f40b6cdd895593b3cb2f54abacb1..1591a7a2d90a990b06862df7a50a75b5aa068308 100644 --- a/config/configs.go +++ b/config/configs.go @@ -25,6 +25,7 @@ var MaxMessageSize int var GrpcListenAddress string var RestListenAddress string var DataStorageUrl string +var EntitiesManagerUrl string var CertDir string func SetConfigValues() { @@ -34,6 +35,7 @@ func SetConfigValues() { viper.SetDefault("grpcListenAddress", "localhost:7877") viper.SetDefault("restListenAddress", "localhost:7878") viper.SetDefault("dataStorageUrl", "localhost:7777") + viper.SetDefault("entitiesManagerUrl", "localhost:7779") viper.SetDefault("viamUUID", "viam-system") viper.SetDefault("viamSession", "viam-session") @@ -106,6 +108,7 @@ func SetConfigValues() { RestListenAddress = viper.GetString("restListenAddress") DataStorageUrl = viper.GetString("dataStorageUrl") + EntitiesManagerUrl = viper.GetString("entitiesManagerUrl") SystemAuth.Uuid = viper.GetString("viamUUID") SystemAuth.Session = viper.GetString("viamSession") diff --git a/handler/handler.go b/handler/handler.go index c049ccdd7758282b83e1605cdac950a37bf5d5ea..aef13b5408e64d07dd62a4e5556e370ebeb1fe4a 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -18,9 +18,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. package handler import ( + "encoding/base64" + "errors" "log" "strings" + "code.vereign.com/code/viam-apis/clientutils" "code.vereign.com/code/viam-apis/versions" "github.com/golang/protobuf/proto" @@ -32,6 +35,10 @@ import ( "google.golang.org/grpc/metadata" ) +const ( + keyToKeyIdTable = "authenticationKeyToKeyId" +) + // Server represents the gRPC server type KeyStorageServerImpl struct { DataStorageUrl string @@ -165,6 +172,17 @@ func (s *KeyStorageServerImpl) SetKey(ctx context.Context, in *api.SetKeyRequest "200", api.StatusType_INFO, result) } + if in.KeyType == api.KeyType_PUBLIC { + keyContent := base64.StdEncoding.EncodeToString(in.Key.Content) + + _, _, err = client.DoPutDataCallWithString(keyToKeyIdTable, keyContent, + in.Uuid, versions.EntitiesManagementAgentApiVersion) + if err != nil { + log.Printf("can't DoPutDataCallWithString: %s", err) + return nil, err + } + } + return setKeyResponse, nil } @@ -209,6 +227,68 @@ func (s *KeyStorageServerImpl) ReserveKeyUUID(ctx context.Context, in *api.Reser return reserveKeyUUIDResponse, nil } +func (s *KeyStorageServerImpl) GetKeyId(ctx context.Context, in *api.GetKeyIdByKeyRequest) (*api.GetKeyIdByKeyResponse, error) { + auth := s.CreateAuthentication(ctx) + //in.PublicKey + entitiesMagamentClient := keyutils.CreateEntitiesManagementClient(auth) + defer entitiesMagamentClient.CloseClient() + + dataStorageClient := keyutils.CreateDataStorageClient(auth) + defer dataStorageClient.CloseClient() + + keyIdResponse := &api.GetKeyIdByKeyResponse{} + + response, err := dataStorageClient.DoGetDataCall(keyToKeyIdTable, in.PublicKey) + if err == nil && response.Data != nil && response.Data.Data != nil { + keyID := string(response.Data.Data) + keyIdResponse.KeyId = keyID + return keyIdResponse, nil + } + + entity, err := clientutils.GetLastEntity(entitiesMagamentClient, auth.Uuid) + + if err != nil { + return nil, err + } + + for _, checkID := range entity.AuthenticationKeys { + key := &api.Key{} + + data, err := dataStorageClient.DoGetDataCall("keys", checkID+"/"+api.KeyType_PUBLIC.String()) + + if err != nil { + log.Printf("grpc call GetKeyId to DataStorage failed: %s", err) + return nil, err + } + + if data.Errors != "" { + return nil, errors.New(data.Errors) + } else { + proto.Unmarshal(data.Data.Data, key) + } + + keyFromStorage := base64.StdEncoding.EncodeToString(key.Content) + + if in.PublicKey != keyFromStorage { + continue + } + + _, _, err = dataStorageClient.DoPutDataCallWithString(keyToKeyIdTable, in.PublicKey, + checkID, versions.EntitiesManagementAgentApiVersion) + if err != nil { + log.Printf("can't DoPutDataCallWithString: %s", err) + + return nil, err + } + + keyIdResponse.KeyId = checkID + return keyIdResponse, nil + } + + //getKeyFromContent + return keyIdResponse, nil +} + func (s *KeyStorageServerImpl) GetVersionKSA(ctx context.Context, in *api.GetVersionKSAMessage) (*api.GetVersionKSAResponseMessage, error) { log.Println("Version: " + version) return &api.GetVersionKSAResponseMessage{Version: version, Errors: ""}, nil diff --git a/utils/utils.go b/utils/utils.go index 1184090980508d157fe292dd65a4590da7fa7ba8..aaf072029e81bb2f67e244ae96f9cda74ea68bb3 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -33,6 +33,7 @@ import ( "code.vereign.com/code/viam-apis/clientutils" "code.vereign.com/code/viam-apis/data-storage-agent/client" dsclient "code.vereign.com/code/viam-apis/data-storage-agent/client" + emclient "code.vereign.com/code/viam-apis/entities-management-agent/client" "code.vereign.com/code/viam-apis/key-storage-agent/api" "code.vereign.com/code/viam-apis/utils" "github.com/golang/protobuf/proto" @@ -151,3 +152,8 @@ func CreateDataStorageClient(auth *authentication.Authentication) *dsclient.Data return clientutils.CreateDataStorageClient(auth, config.DataStorageUrl, config.CertificatePEM, config.PrivateKeyPEM, config.CaCertificatePEM, config.MaxMessageSize) } + +func CreateEntitiesManagementClient(auth *authentication.Authentication) *emclient.EntitiesManagerClientImpl { + return clientutils.CreateEntitiesManagementClient(auth, config.EntitiesManagerUrl, config.CertificatePEM, + config.PrivateKeyPEM, config.CaCertificatePEM, config.MaxMessageSize) +}