github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/provider/oci/common/client.go (about)

     1  // Copyright 2018 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common
     5  
     6  import (
     7  	"crypto/rsa"
     8  	"crypto/x509"
     9  	"encoding/pem"
    10  	"fmt"
    11  
    12  	"github.com/juju/errors"
    13  	ociCommon "github.com/oracle/oci-go-sdk/v65/common"
    14  )
    15  
    16  type JujuConfigProvider struct {
    17  	Key         []byte
    18  	Fingerprint string
    19  	Passphrase  string
    20  	Tenancy     string
    21  	User        string
    22  	OCIRegion   string
    23  }
    24  
    25  func ValidateKey(key []byte, passphrase string) error {
    26  	keyBlock, _ := pem.Decode(key)
    27  	if keyBlock == nil {
    28  		return errors.Errorf("invalid private key")
    29  	}
    30  
    31  	if x509.IsEncryptedPEMBlock(keyBlock) {
    32  		if _, err := x509.DecryptPEMBlock(keyBlock, []byte(passphrase)); err != nil {
    33  			return errors.Annotatef(err, "decrypting private key")
    34  		}
    35  	}
    36  
    37  	return nil
    38  }
    39  
    40  func (j JujuConfigProvider) TenancyOCID() (string, error) {
    41  	if j.Tenancy == "" {
    42  		return "", errors.Errorf("tenancyOCID is not set")
    43  	}
    44  	return j.Tenancy, nil
    45  }
    46  
    47  func (j JujuConfigProvider) UserOCID() (string, error) {
    48  	if j.User == "" {
    49  		return "", errors.Errorf("userOCID is not set")
    50  	}
    51  	return j.User, nil
    52  }
    53  
    54  func (j JujuConfigProvider) KeyFingerprint() (string, error) {
    55  	if j.Fingerprint == "" {
    56  		return "", errors.Errorf("Fingerprint is not set")
    57  	}
    58  	return j.Fingerprint, nil
    59  }
    60  
    61  func (j JujuConfigProvider) Region() (string, error) {
    62  	if j.OCIRegion == "" {
    63  		return "", errors.Errorf("Region is not set")
    64  	}
    65  	return j.OCIRegion, nil
    66  }
    67  
    68  func (j JujuConfigProvider) PrivateRSAKey() (*rsa.PrivateKey, error) {
    69  	if j.Key == nil {
    70  		return nil, errors.Errorf("private key is not set")
    71  	}
    72  
    73  	key, err := ociCommon.PrivateKeyFromBytes(
    74  		j.Key, &j.Passphrase)
    75  	return key, err
    76  }
    77  
    78  func (j JujuConfigProvider) KeyID() (string, error) {
    79  	if err := j.Validate(); err != nil {
    80  		return "", err
    81  	}
    82  	return fmt.Sprintf("%s/%s/%s", j.Tenancy, j.User, j.Fingerprint), nil
    83  }
    84  
    85  func (j JujuConfigProvider) AuthType() (ociCommon.AuthConfig, error) {
    86  	return ociCommon.AuthConfig{}, errors.NotImplementedf("AuthType")
    87  }
    88  
    89  func (j JujuConfigProvider) Validate() error {
    90  	if j.Tenancy == "" || j.User == "" || j.Fingerprint == "" {
    91  		return errors.Errorf("config provider is not properly initialized")
    92  	}
    93  	if err := ValidateKey(j.Key, j.Passphrase); err != nil {
    94  		return errors.Trace(err)
    95  	}
    96  	return nil
    97  }