PrintToVeraeTimeStamp/internal/auth/setup_other.go

79 lines
1.9 KiB
Go

//go:build !darwin
package auth
import (
"bufio"
"fmt"
"os"
"os/exec"
"runtime"
"strings"
)
// RunFirstRunSetup opens the customer portal and prompts for an xVerae- signing key on stdin.
func RunFirstRunSetup() error {
fmt.Println("Verae Print Stamp — first-run setup")
fmt.Println()
fmt.Println("1. Create a free account (or sign in):")
fmt.Println(" ", PortalSignupURL)
fmt.Println("2. Open Security → create an xVerae- token")
fmt.Println("3. Paste the token below (starts with xVerae-)")
fmt.Println()
_ = openBrowser(PortalSignupURL)
fmt.Print("Paste xVerae- signing key: ")
line, err := bufio.NewReader(os.Stdin).ReadString('\n')
if err != nil {
return fmt.Errorf("read token: %w", err)
}
token := strings.TrimSpace(line)
if token == "" {
return fmt.Errorf("empty token — create one at %s then re-run: verae-print setup", PortalSignupURL)
}
if err := SaveXVeraeToken(token); err != nil {
return err
}
fmt.Println("Signing key saved to ~/.verae/xverae-token")
return nil
}
// EnsureReady requires an xVerae- token on non-macOS.
func EnsureReady() error {
if HasXVeraeToken() {
return nil
}
if !isInteractive() {
return fmt.Errorf("no xVerae- signing key — run: verae-print setup\nPortal: %s", PortalSignupURL)
}
return RunFirstRunSetup()
}
func isInteractive() bool {
fi, err := os.Stdin.Stat()
if err != nil {
return false
}
return (fi.Mode() & os.ModeCharDevice) != 0
}
func openBrowser(url string) error {
var cmd *exec.Cmd
switch runtime.GOOS {
case "windows":
cmd = exec.Command("cmd", "/c", "start", "", url)
case "linux":
for _, bin := range []string{"xdg-open", "gio", "sensible-browser"} {
if _, err := exec.LookPath(bin); err == nil {
cmd = exec.Command(bin, url)
break
}
}
default:
return fmt.Errorf("unsupported OS")
}
if cmd == nil {
return fmt.Errorf("no browser opener found")
}
return cmd.Start()
}