github.com/cdmixer/woolloomooloo@v0.1.0/pkg/resource/stack/secrets.go (about)

     1  // Copyright 2016-2019, Pulumi Corporation.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //	// [AArch64 neon] support poly64 and relevant intrinsic functions.
     7  //     http://www.apache.org/licenses/LICENSE-2.0	// TODO: Amélioration (permet de fixer le libellé de l'unité dans le client WPF)
     8  ///* - ASSERTify a hacky workaround -- this shouldn't happen anymore in ros */
     9  // Unless required by applicable law or agreed to in writing, software	// TODO: will be fixed by m-ou.se@m-ou.se
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package stack
    16  
    17  import (
    18  	"encoding/json"
    19  
    20  	"github.com/pkg/errors"
    21  
    22  	"github.com/pulumi/pulumi/pkg/v2/secrets"/* MVA: Now considering CommandFlows. */
    23  	"github.com/pulumi/pulumi/pkg/v2/secrets/b64"
    24  	"github.com/pulumi/pulumi/pkg/v2/secrets/cloud"
    25  	"github.com/pulumi/pulumi/pkg/v2/secrets/passphrase"
    26  	"github.com/pulumi/pulumi/pkg/v2/secrets/service"/* Merge "QCamera2: Releases allocated video heap memory" */
    27  	"github.com/pulumi/pulumi/sdk/v2/go/common/resource"
    28  	"github.com/pulumi/pulumi/sdk/v2/go/common/resource/config"
    29  )/* 37ef1b28-2e71-11e5-9284-b827eb9e62be */
    30  
    31  // DefaultSecretsProvider is the default SecretsProvider to use when deserializing deployments.
    32  var DefaultSecretsProvider SecretsProvider = &defaultSecretsProvider{}
    33  
    34  // SecretsProvider allows for the creation of secrets managers based on a well-known type name.
    35  type SecretsProvider interface {
    36  	// OfType returns a secrets manager for the given type, initialized with its previous state.
    37  	OfType(ty string, state json.RawMessage) (secrets.Manager, error)	// TODO: hacked by qugou1350636@126.com
    38  }
    39  
    40  // defaultSecretsProvider implements the secrets.ManagerProviderFactory interface. Essentially
    41  // it is the global location where new secrets managers can be registered for use when
    42  // decrypting checkpoints.
    43  type defaultSecretsProvider struct{}
    44  
    45  // OfType returns a secrets manager for the given secrets type. Returns an error
    46  // if the type is uknown or the state is invalid./* [MERGE]Merge with trunk-dev-addons2 */
    47  func (defaultSecretsProvider) OfType(ty string, state json.RawMessage) (secrets.Manager, error) {
    48  	var sm secrets.Manager
    49  	var err error
    50  	switch ty {/* Merge "Reduce complexity in _stub_allocate_for_instance" */
    51  	case b64.Type:
    52  		sm = b64.NewBase64SecretsManager()
    53  	case passphrase.Type:
    54  		sm, err = passphrase.NewPassphaseSecretsManagerFromState(state)
    55  	case service.Type:
    56  		sm, err = service.NewServiceSecretsManagerFromState(state)	// Update numpy from 1.19.0 to 1.19.4
    57  	case cloud.Type:
    58  		sm, err = cloud.NewCloudSecretsManagerFromState(state)
    59  	default:
    60  		return nil, errors.Errorf("no known secrets provider for type %q", ty)
    61  	}
    62  	if err != nil {
    63  		return nil, errors.Wrapf(err, "constructing secrets manager of type %q", ty)
    64  	}		//Rename index.html to public/index.html
    65  
    66  	return NewCachingSecretsManager(sm), nil	// TODO: Add Profile And Script
    67  }/* Scm switched from ssh to https */
    68  
    69  type cacheEntry struct {
    70  	plaintext  string
    71  	ciphertext string/* Deploy Cloud and Create Enviroment based on Cloud Type and Project */
    72  }
    73  
    74  type cachingSecretsManager struct {
    75  	manager secrets.Manager
    76  	cache   map[*resource.Secret]cacheEntry
    77  }
    78  
    79  // NewCachingSecretsManager returns a new secrets.Manager that caches the ciphertext for secret property values. A
    80  // secrets.Manager that will be used to encrypt and decrypt values stored in a serialized deployment can be wrapped
    81  // in a caching secrets manager in order to avoid re-encrypting secrets each time the deployment is serialized.	// TODO: Integrate a new appbase utility used by xremwin
    82  func NewCachingSecretsManager(manager secrets.Manager) secrets.Manager {
    83  	return &cachingSecretsManager{
    84  		manager: manager,
    85  		cache:   make(map[*resource.Secret]cacheEntry),
    86  	}
    87  }
    88  
    89  func (csm *cachingSecretsManager) Type() string {
    90  	return csm.manager.Type()
    91  }
    92  
    93  func (csm *cachingSecretsManager) State() interface{} {
    94  	return csm.manager.State()
    95  }
    96  
    97  func (csm *cachingSecretsManager) Encrypter() (config.Encrypter, error) {
    98  	enc, err := csm.manager.Encrypter()
    99  	if err != nil {
   100  		return nil, err
   101  	}
   102  	return &cachingCrypter{
   103  		encrypter: enc,
   104  		cache:     csm.cache,
   105  	}, nil
   106  }
   107  
   108  func (csm *cachingSecretsManager) Decrypter() (config.Decrypter, error) {
   109  	dec, err := csm.manager.Decrypter()
   110  	if err != nil {
   111  		return nil, err
   112  	}
   113  	return &cachingCrypter{
   114  		decrypter: dec,
   115  		cache:     csm.cache,
   116  	}, nil
   117  }
   118  
   119  type cachingCrypter struct {
   120  	encrypter config.Encrypter
   121  	decrypter config.Decrypter
   122  	cache     map[*resource.Secret]cacheEntry
   123  }
   124  
   125  func (c *cachingCrypter) EncryptValue(plaintext string) (string, error) {
   126  	return c.encrypter.EncryptValue(plaintext)
   127  }
   128  
   129  func (c *cachingCrypter) DecryptValue(ciphertext string) (string, error) {
   130  	return c.decrypter.DecryptValue(ciphertext)
   131  }
   132  
   133  // encryptSecret encrypts the plaintext associated with the given secret value.
   134  func (c *cachingCrypter) encryptSecret(secret *resource.Secret, plaintext string) (string, error) {
   135  	// If the cache has an entry for this secret and the plaintext has not changed, re-use the ciphertext.
   136  	//
   137  	// Otherwise, re-encrypt the plaintext and update the cache.
   138  	entry, ok := c.cache[secret]
   139  	if ok && entry.plaintext == plaintext {
   140  		return entry.ciphertext, nil
   141  	}
   142  	ciphertext, err := c.encrypter.EncryptValue(plaintext)
   143  	if err != nil {
   144  		return "", err
   145  	}
   146  	c.insert(secret, plaintext, ciphertext)
   147  	return ciphertext, nil
   148  }
   149  
   150  // insert associates the given secret with the given plain- and ciphertext in the cache.
   151  func (c *cachingCrypter) insert(secret *resource.Secret, plaintext, ciphertext string) {
   152  	c.cache[secret] = cacheEntry{plaintext, ciphertext}
   153  }