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  }