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 }