package main import ( "fmt" "time" "github.com/VeraeLLC/PrintToVeraeTimeStamp/internal/auth" "github.com/VeraeLLC/PrintToVeraeTimeStamp/internal/job" "github.com/VeraeLLC/PrintToVeraeTimeStamp/internal/veraeapi" "github.com/VeraeLLC/PrintToVeraeTimeStamp/internal/vlog" ) // clientForChannel builds an API client from the stored credentials. // Missing xVerae- key (and no JWT fallback) → errNoKey. func clientForChannel(ch auth.Channel, lj vlog.Job) (*veraeapi.Client, auth.Channel, error) { client := &veraeapi.Client{Channel: ch} switch ch { case auth.ChannelZapier: tok, err := auth.LoadXVeraeToken() if err != nil { if jwt, jerr := auth.LoadVeraeJWT(); jerr == nil { lj.Printf("auth: no xVerae- token, using verae channel (auth.properties)") client.Channel, client.VeraeToken = auth.ChannelVerae, jwt return client, auth.ChannelVerae, nil } return nil, ch, fmt.Errorf("%w (%v)", errNoKey, err) } client.XVeraeToken = tok default: tok, err := auth.LoadVeraeJWT() if err != nil { return nil, ch, fmt.Errorf("verae channel: %v", err) } client.VeraeToken = tok } return client, ch, nil } // stampFile stamps one PDF with the current key (no holding / prompting). func stampFile(pdf string, t stampTarget, lj vlog.Job) (job.Result, error) { client, ch, err := clientForChannel(auth.PreferredChannel(), lj) if err != nil { return job.Result{}, err } client.HTTPDo = loggingDo(lj) start := time.Now() res, err := job.Run(job.Options{SourcePDF: pdf, OutDir: t.OutDir, OutPath: t.OutPath, DocumentName: safeStem(t.Title) + ".pdf", Channel: ch, Client: client}) if err != nil { return res, err } lj.Printf("stamp: OK in %s receipt=%s sha256=%s\n original=%q\n cert=%q\n json=%q", time.Since(start).Round(time.Millisecond), res.ReceiptID, res.SHA256, res.OriginalPDF, res.CertificatePDF, res.ReceiptJSON) return res, nil } func authReason(err error) string { if veraeapi.IsAuthError(err) { return "Verae did not accept your signing key (it may have expired or been revoked). Please sign in again." } return "No Verae signing key is set up for this user yet. Please sign in or create an account." }