2022-12-09 06:43:07 +00:00
|
|
|
// Copyright © 2022 Roberto Hidalgo <joao@un.rob.mx>
|
2022-12-31 06:14:08 +00:00
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
2022-12-09 06:43:07 +00:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"fmt"
|
|
|
|
"io/ioutil"
|
|
|
|
"path/filepath"
|
2022-12-20 05:49:37 +00:00
|
|
|
"sort"
|
2022-12-09 06:43:07 +00:00
|
|
|
"strings"
|
|
|
|
"text/template"
|
|
|
|
|
2022-12-20 05:49:37 +00:00
|
|
|
op "github.com/1Password/connect-sdk-go/onepassword"
|
2022-12-09 06:43:07 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2022-12-20 05:49:37 +00:00
|
|
|
"golang.org/x/crypto/blake2b"
|
2022-12-09 06:43:07 +00:00
|
|
|
"gopkg.in/yaml.v3"
|
|
|
|
)
|
|
|
|
|
2022-12-17 05:40:43 +00:00
|
|
|
type opDetails struct {
|
|
|
|
Vault string `yaml:"vault"`
|
|
|
|
Name string `yaml:"name"`
|
2022-12-18 18:16:46 +00:00
|
|
|
NameTemplate string `yaml:"nameTemplate"` // nolint: tagliatelle
|
2022-12-17 05:40:43 +00:00
|
|
|
Repo string
|
|
|
|
}
|
|
|
|
|
|
|
|
type singleModeConfig struct {
|
2022-12-18 18:16:46 +00:00
|
|
|
Config *opDetails `yaml:"_config,omitempty"` // nolint: tagliatelle
|
2022-12-17 05:40:43 +00:00
|
|
|
}
|
|
|
|
|
2022-12-09 06:43:07 +00:00
|
|
|
func argIsYAMLFile(path string) bool {
|
|
|
|
return strings.HasSuffix(path, ".yaml") || strings.HasSuffix(path, ".yml")
|
|
|
|
}
|
|
|
|
|
2023-01-11 06:57:58 +00:00
|
|
|
func VaultAndNameFrom(path string, buf []byte) (name string, vault string, err error) {
|
2022-12-09 06:43:07 +00:00
|
|
|
smc := &singleModeConfig{}
|
|
|
|
if buf == nil {
|
|
|
|
var err error
|
|
|
|
buf, err = ioutil.ReadFile(path)
|
|
|
|
if err != nil {
|
|
|
|
return "", "", fmt.Errorf("could not read file %s", path)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-14 05:41:03 +00:00
|
|
|
if err = yaml.Unmarshal(buf, &smc); err == nil && smc.Config != nil {
|
|
|
|
return smc.Config.Name, smc.Config.Vault, nil
|
2022-12-09 06:43:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
rmc, err := findRepoConfig(path)
|
|
|
|
if err != nil {
|
|
|
|
return "", "", err
|
|
|
|
}
|
|
|
|
|
|
|
|
if rmc == nil {
|
|
|
|
return "", "", fmt.Errorf("could not find repo config for %s", path)
|
|
|
|
}
|
|
|
|
|
|
|
|
if rmc.NameTemplate == "" {
|
|
|
|
rmc.NameTemplate = "{{ DirName }}:{{ FileName}}"
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Debugf("Found repo config at %s", rmc.Repo)
|
|
|
|
|
|
|
|
tpl := template.Must(template.New("help").Funcs(template.FuncMap{
|
|
|
|
"DirName": func() string {
|
|
|
|
return filepath.Base(filepath.Dir(path))
|
|
|
|
},
|
|
|
|
"FileName": func() string {
|
|
|
|
return strings.Split(filepath.Base(path), ".")[0]
|
|
|
|
},
|
|
|
|
}).Parse(rmc.NameTemplate))
|
|
|
|
|
|
|
|
var nameBuf bytes.Buffer
|
|
|
|
err = tpl.Execute(&nameBuf, nil)
|
|
|
|
if err != nil {
|
|
|
|
return "", "", err
|
|
|
|
}
|
|
|
|
return nameBuf.String(), rmc.Vault, nil
|
|
|
|
}
|
|
|
|
|
2022-12-20 05:49:37 +00:00
|
|
|
func checksum(fields []*op.ItemField) string {
|
|
|
|
newHash, err := blake2b.New256(nil)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
df := []string{}
|
|
|
|
for _, field := range fields {
|
|
|
|
if field.ID == "password" || field.ID == "notesPlain" || (field.Section != nil && field.Section.ID == "~annotations") {
|
|
|
|
continue
|
2022-12-09 06:43:07 +00:00
|
|
|
}
|
2022-12-20 05:49:37 +00:00
|
|
|
label := field.Label
|
|
|
|
if field.Section != nil && field.Section.ID != "" {
|
|
|
|
label = field.Section.ID + "." + label
|
2022-12-09 06:43:07 +00:00
|
|
|
}
|
2022-12-20 05:49:37 +00:00
|
|
|
df = append(df, label+field.Value)
|
2022-12-09 06:43:07 +00:00
|
|
|
}
|
2022-12-20 05:49:37 +00:00
|
|
|
sort.Strings(df)
|
|
|
|
newHash.Write([]byte(strings.Join(df, "")))
|
|
|
|
checksum := newHash.Sum(nil)
|
|
|
|
return fmt.Sprintf("%x", checksum)
|
|
|
|
}
|
2022-12-09 06:43:07 +00:00
|
|
|
|
2022-12-20 05:49:37 +00:00
|
|
|
func isNumeric(s string) bool {
|
|
|
|
for _, v := range s {
|
|
|
|
if v < '0' || v > '9' {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
2022-12-09 06:43:07 +00:00
|
|
|
}
|