a73x

internal/cli/ca.go

Ref:   Size: 1.2 KiB   History

package cli

import (
	"context"
	"fmt"
	"os"

	"golang.org/x/crypto/ssh"

	"github.com/a73x/eitri/internal/server/api/client"
)

// UploadUserCA registers the user-CA public key in pubFile with the server
// under the PAT token. An empty tenant registers on the token's own tenant (the
// credential names it); a non-empty tenant pins one explicitly. The key is
// parse-validated locally — garbage is rejected before it leaves the machine —
// and the returned summary line carries the locally computed fingerprint
// (identical to the server's echo: both fingerprint the same key), naming the
// tenant only when we pinned one.
func UploadUserCA(ctx context.Context, baseURL, token, tenant, pubFile string) (string, error) {
	pub, err := os.ReadFile(pubFile)
	if err != nil {
		return "", err
	}
	pk, _, _, _, err := ssh.ParseAuthorizedKey(pub)
	if err != nil {
		return "", fmt.Errorf("%s: not an SSH public key: %w", pubFile, err)
	}
	c := &client.Client{BaseURL: baseURL, Token: token}
	if err := c.UploadUserCA(ctx, tenant, string(pub)); err != nil {
		return "", err
	}
	fp := ssh.FingerprintSHA256(pk)
	if tenant == "" {
		return fmt.Sprintf("registered user CA %s", fp), nil
	}
	return fmt.Sprintf("registered user CA %s for tenant %s", fp, tenant), nil
}