mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 18:13:42 +08:00 
			
		
		
		
	Planned to be imported by nerdctl in future. Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
		
			
				
	
	
		
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package buildflags
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/csv"
 | 
						|
	"strings"
 | 
						|
 | 
						|
	"github.com/moby/buildkit/session"
 | 
						|
	"github.com/moby/buildkit/session/secrets/secretsprovider"
 | 
						|
	"github.com/pkg/errors"
 | 
						|
)
 | 
						|
 | 
						|
func ParseSecretSpecs(sl []string) (session.Attachable, error) {
 | 
						|
	fs := make([]secretsprovider.Source, 0, len(sl))
 | 
						|
	for _, v := range sl {
 | 
						|
		s, err := parseSecret(v)
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
		fs = append(fs, *s)
 | 
						|
	}
 | 
						|
	store, err := secretsprovider.NewStore(fs)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return secretsprovider.NewSecretProvider(store), nil
 | 
						|
}
 | 
						|
 | 
						|
func parseSecret(value string) (*secretsprovider.Source, error) {
 | 
						|
	csvReader := csv.NewReader(strings.NewReader(value))
 | 
						|
	fields, err := csvReader.Read()
 | 
						|
	if err != nil {
 | 
						|
		return nil, errors.Wrap(err, "failed to parse csv secret")
 | 
						|
	}
 | 
						|
 | 
						|
	fs := secretsprovider.Source{}
 | 
						|
 | 
						|
	var typ string
 | 
						|
	for _, field := range fields {
 | 
						|
		parts := strings.SplitN(field, "=", 2)
 | 
						|
		key := strings.ToLower(parts[0])
 | 
						|
 | 
						|
		if len(parts) != 2 {
 | 
						|
			return nil, errors.Errorf("invalid field '%s' must be a key=value pair", field)
 | 
						|
		}
 | 
						|
 | 
						|
		value := parts[1]
 | 
						|
		switch key {
 | 
						|
		case "type":
 | 
						|
			if value != "file" && value != "env" {
 | 
						|
				return nil, errors.Errorf("unsupported secret type %q", value)
 | 
						|
			}
 | 
						|
			typ = value
 | 
						|
		case "id":
 | 
						|
			fs.ID = value
 | 
						|
		case "source", "src":
 | 
						|
			fs.FilePath = value
 | 
						|
		case "env":
 | 
						|
			fs.Env = value
 | 
						|
		default:
 | 
						|
			return nil, errors.Errorf("unexpected key '%s' in '%s'", key, field)
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if typ == "env" && fs.Env == "" {
 | 
						|
		fs.Env = fs.FilePath
 | 
						|
		fs.FilePath = ""
 | 
						|
	}
 | 
						|
	return &fs, nil
 | 
						|
}
 |