github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/prove_check.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 // ProveCheck looks for an active proof in the logged in user's id 5 // table for a service, username pair. 6 7 package engine 8 9 import ( 10 "fmt" 11 12 "github.com/keybase/client/go/libkb" 13 keybase1 "github.com/keybase/client/go/protocol/keybase1" 14 ) 15 16 // ProveCheck is an engine. 17 type ProveCheck struct { 18 libkb.Contextified 19 sigID keybase1.SigID 20 found bool 21 status keybase1.ProofStatus 22 state keybase1.ProofState 23 proofText string 24 } 25 26 // NewProveCheck creates a ProveCheck engine. 27 func NewProveCheck(g *libkb.GlobalContext, sigID keybase1.SigID) *ProveCheck { 28 return &ProveCheck{ 29 Contextified: libkb.NewContextified(g), 30 sigID: sigID, 31 } 32 } 33 34 // Name is the unique engine name. 35 func (e *ProveCheck) Name() string { 36 return "ProveCheck" 37 } 38 39 // GetPrereqs returns the engine prereqs. 40 func (e *ProveCheck) Prereqs() Prereqs { 41 return Prereqs{Device: true} 42 } 43 44 // RequiredUIs returns the required UIs. 45 func (e *ProveCheck) RequiredUIs() []libkb.UIKind { 46 return []libkb.UIKind{} 47 } 48 49 // SubConsumers returns the other UI consumers for this engine. 50 func (e *ProveCheck) SubConsumers() []libkb.UIConsumer { 51 return nil 52 } 53 54 // Run starts the engine. 55 func (e *ProveCheck) Run(m libkb.MetaContext) error { 56 found, status, state, err := libkb.CheckPosted(m, e.sigID) 57 if err != nil { 58 return err 59 } 60 e.found = found 61 e.status = status 62 e.state = state 63 64 m.Debug("looking for ChainLink for %s", e.sigID) 65 me, err := libkb.LoadMe(libkb.NewLoadUserArgWithMetaContext(m).WithPublicKeyOptional()) 66 if err != nil { 67 return err 68 } 69 link := me.LinkFromSigID(e.sigID) 70 if link == nil { 71 return fmt.Errorf("no chain link found for %s", e.sigID) 72 } 73 m.Debug("chain link found: (%T)", link.Typed()) 74 if rlink, ok := link.Typed().(libkb.RemoteProofChainLink); ok { 75 e.proofText = rlink.ProofText() 76 m.Debug("chain link proof text: %q", e.proofText) 77 } else { 78 m.Warning("chain link had invalid type: %T", link.Typed()) 79 } 80 return nil 81 } 82 83 func (e *ProveCheck) Results() (found bool, status keybase1.ProofStatus, state keybase1.ProofState, proofText string) { 84 return e.found, e.status, e.state, e.proofText 85 }