79 lines
1.9 KiB
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()
|
|
}
|