wip: registration PDF, auth setup, CLI, Windows/Linux installers

This commit is contained in:
George Lambert 2026-10-03 18:35:27 -04:00
commit 4f1d90cf64

View file

@ -21,6 +21,8 @@ func main() {
switch os.Args[1] {
case "stamp":
os.Exit(runStamp(os.Args[2:]))
case "setup", "login":
os.Exit(runSetup())
case "install-macos":
os.Exit(runInstallMacOS(os.Args[2:]))
case "install-printer":
@ -30,9 +32,9 @@ func main() {
case "help", "-h", "--help":
usage()
default:
// PDF Services may invoke the binary with the PDF path as argv[1]
if strings.HasSuffix(strings.ToLower(os.Args[1]), ".pdf") && fileExists(os.Args[1]) {
os.Exit(runStamp([]string{"-channel", envOr("VERAE_PRINT_CHANNEL", "verae"), os.Args[1]}))
// PDF Services / drop-target may invoke the binary with the file as argv[1]
if fileExists(os.Args[1]) {
os.Exit(runStamp([]string{"-channel", string(auth.PreferredChannel()), os.Args[1]}))
}
fmt.Fprintf(os.Stderr, "unknown command %q\n", os.Args[1])
usage()
@ -44,14 +46,18 @@ func usage() {
fmt.Fprintf(os.Stderr, `verae-print %s — stamp a printed PDF with Verae (digests only)
Usage:
verae-print setup # first run: create customer account + save xVerae- signing key
verae-print stamp [--channel=verae|zapier] [--out-dir DIR] [--name STEM] [--open] <file.pdf>
verae-print install-printer # Destination list: Verae Timestamping (recommended)
verae-print install-macos # also install PDF Services menu items (legacy)
verae-print version
First install opens https://customer.verae.ai/portal/ so you can create an account
and mint an xVerae- signing key (Security tab). The key is stored in Keychain.
Channels:
verae (default) api.veraetime.net + ~/.verae/auth.properties JWT
zapier zap.verae.ai + xVerae- token (XVERAE_TOKEN / ~/.verae/xverae-token / Keychain)
zapier (default) zap.verae.ai + customer xVerae- signing key
verae api.veraetime.net + ~/.verae/auth.properties JWT
Outputs in --out-dir (default ~/Documents/Verae Timestamps):
{name}.pdf
@ -60,12 +66,27 @@ Outputs in --out-dir (default ~/Documents/Verae Timestamps):
`, job.HelperVersion)
}
func runSetup() int {
if auth.HasXVeraeToken() {
fmt.Println("Signing key already saved (xVerae-).")
fmt.Println("Portal:", auth.PortalSignupURL)
return 0
}
if err := auth.RunFirstRunSetup(); err != nil {
fmt.Fprintln(os.Stderr, err)
return 1
}
fmt.Println("Signing key saved. Print → Destination → Verae Timestamping is ready.")
return 0
}
func runStamp(args []string) int {
fs := flag.NewFlagSet("stamp", flag.ExitOnError)
channel := fs.String("channel", envOr("VERAE_PRINT_CHANNEL", "verae"), "verae | zapier")
channel := fs.String("channel", string(auth.PreferredChannel()), "verae | zapier")
outDir := fs.String("out-dir", "", "output directory")
name := fs.String("name", "", "document stem override")
openFolder := fs.Bool("open", false, "open output folder on success (macOS)")
skipSetup := fs.Bool("skip-setup", false, "do not open first-run account dialog")
_ = fs.Parse(args)
if fs.NArg() < 1 {
fmt.Fprintln(os.Stderr, "stamp: PDF path required")
@ -79,6 +100,19 @@ func runStamp(args []string) int {
return 2
}
// First-run: customer account + xVerae- signing key (preferred path)
if ch == auth.ChannelZapier && !auth.HasXVeraeToken() {
if *skipSetup {
fmt.Fprintf(os.Stderr, "no xVerae- signing key — run: verae-print setup\nPortal: %s\n", auth.PortalSignupURL)
return 1
}
if err := auth.EnsureReady(); err != nil {
fmt.Fprintln(os.Stderr, err)
notify("Create a Verae customer account to get your signing key", auth.PortalSignupURL)
return 1
}
}
client := &veraeapi.Client{Channel: ch}
switch ch {
case auth.ChannelZapier:
@ -91,7 +125,7 @@ func runStamp(args []string) int {
default:
tok, err := auth.LoadVeraeJWT()
if err != nil {
fmt.Fprintln(os.Stderr, err)
fmt.Fprintf(os.Stderr, "%v\nTip: run verae-print setup to create a customer account and xVerae- key instead.\n", err)
return 1
}
client.VeraeToken = tok