github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/secrets/share.go (about) 1 package secrets 2 3 import ( 4 "github.com/ActiveState/cli/internal/keypairs" 5 secretsModels "github.com/ActiveState/cli/pkg/platform/api/secrets/secrets_models" 6 ) 7 8 // ShareFromDiff decrypts a source user's secrets that they are sharing and re-encrypts those secrets using 9 // the public key of a target user provided in the UserSecretDiff struct. This is effectively "copying" a set 10 // of secrets for use by another user. 11 func ShareFromDiff(sourceKeypair keypairs.Keypair, diff *secretsModels.UserSecretDiff) ([]*secretsModels.UserSecretShare, error) { 12 targetPubKey, err := keypairs.ParseRSAPublicKey(*diff.PublicKey) 13 if err != nil { 14 return nil, err 15 } 16 17 targetShares := make([]*secretsModels.UserSecretShare, len(diff.Shares)) 18 for idx, sourceShare := range diff.Shares { 19 decrVal, err := sourceKeypair.DecodeAndDecrypt(*sourceShare.Value) 20 if err != nil { 21 return nil, err 22 } 23 24 targetSecret, err := targetPubKey.EncryptAndEncode(decrVal) 25 if err != nil { 26 return nil, err 27 } 28 29 targetShares[idx] = &secretsModels.UserSecretShare{ 30 ProjectID: sourceShare.ProjectID, 31 Name: sourceShare.Name, 32 Value: &targetSecret, 33 } 34 } 35 return targetShares, nil 36 }