~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
62 lines · 1.9 KB Raw History
package openbaoctl

import (
	"regexp"
	"strings"

	"github.com/johnandersen777/socialweb-computer-kcp/api/v1alpha1"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/baosync"
)

const AtprotoPluginAsset = "openbao-plugin-auth-atproto"

var accessorPlaceholder = regexp.MustCompile(`%accessor:([a-z0-9-]+)%`)

func AccessorPlaceholder(mount string) string { return "%accessor:" + strings.Trim(mount, "/") + "%" }

func renderAccessors(hcl string, accessors map[string]string) (string, []string) {
	var missing []string
	out := accessorPlaceholder.ReplaceAllStringFunc(hcl, func(m string) string {
		mount := accessorPlaceholder.FindStringSubmatch(m)[1]
		if a := accessors[mount]; a != "" {
			return a
		}
		missing = append(missing, mount)
		return m
	})
	return out, missing
}

func atprotoObjects(p placedPlugin) []baosync.Object {
	a := p.spec.Atproto
	if a == nil {
		return nil
	}
	mount := strings.Trim(p.spec.MountPath, "/")
	var out []baosync.Object
	if c := a.Config; c.ClientID != "" {
		data := map[string]any{"client_id": c.ClientID, "redirect_uris": c.RedirectURIs}
		put(data, "client_name", c.ClientName)
		put(data, "scope", c.Scope)
		put(data, "plc_directory_url", c.PLCDirectoryURL)
		put(data, "trusted_hosts", c.TrustedHosts)
		o := baosync.Object{Path: "auth/" + mount + "/config", Data: data}
		if c.TrustedCAPEM != "" {
			data["trusted_ca_pem"] = c.TrustedCAPEM
			o.WriteOnly = []string{"trusted_ca_pem"}
			o.Derived = map[string]any{"trusted_ca_set": true}
		}
		out = append(out, o)
	}
	for _, r := range a.Roles {
		data := map[string]any{"token_policies": r.Policies}
		put(data, "bound_dids", r.BoundDIDs)
		put(data, "bound_handles", r.BoundHandles)
		put(data, "token_ttl", r.TokenTTL)
		put(data, "token_max_ttl", r.TokenMaxTTL)
		out = append(out, baosync.Object{Path: "auth/" + mount + "/role/" + r.Name, Data: data})
	}
	return out
}

func atprotoPlugin(p v1alpha1.OpenBaoPlugin) bool { return p.Asset.Name == AtprotoPluginAsset }