github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/pgp_keyfinder.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 package engine 5 6 import ( 7 "github.com/keybase/client/go/libkb" 8 ) 9 10 // PGPKeyfinder is an engine to find PGP Keys for users (loaded by 11 // assertions), possibly tracking them if necessary. 12 type PGPKeyfinder struct { 13 arg *PGPKeyfinderArg 14 uplus []*UserPlusKeys 15 runerr error 16 libkb.Contextified 17 } 18 19 type PGPKeyfinderArg struct { 20 Usernames []string // must be keybase usernames 21 } 22 23 // NewPGPKeyfinder creates a PGPKeyfinder engine. 24 func NewPGPKeyfinder(g *libkb.GlobalContext, arg *PGPKeyfinderArg) *PGPKeyfinder { 25 return &PGPKeyfinder{ 26 arg: arg, 27 Contextified: libkb.NewContextified(g), 28 } 29 } 30 31 // Name is the unique engine name. 32 func (e *PGPKeyfinder) Name() string { 33 return "PGPKeyfinder" 34 } 35 36 // GetPrereqs returns the engine prereqs. 37 func (e *PGPKeyfinder) Prereqs() Prereqs { 38 return Prereqs{} 39 } 40 41 // RequiredUIs returns the required UIs. 42 func (e *PGPKeyfinder) RequiredUIs() []libkb.UIKind { 43 return []libkb.UIKind{} 44 } 45 46 // SubConsumers returns the other UI consumers for this engine. 47 func (e *PGPKeyfinder) SubConsumers() []libkb.UIConsumer { 48 return []libkb.UIConsumer{} 49 } 50 51 // Run starts the engine. 52 func (e *PGPKeyfinder) Run(m libkb.MetaContext) error { 53 e.loadUsers(m) 54 e.loadKeys(m) 55 return e.runerr 56 } 57 58 // UsersPlusKeys returns the users found while running the engine, 59 // plus their pgp keys. 60 func (e *PGPKeyfinder) UsersPlusKeys() []*UserPlusKeys { 61 return e.uplus 62 } 63 64 // don't identify or track, just load the users 65 func (e *PGPKeyfinder) loadUsers(m libkb.MetaContext) { 66 if e.runerr != nil { 67 return 68 } 69 70 for _, u := range e.arg.Usernames { 71 arg := libkb.NewLoadUserByNameArg(e.G(), u) 72 user, err := libkb.LoadUser(arg) 73 if err != nil { 74 e.runerr = err 75 return 76 } 77 e.addUser(user, false) 78 } 79 80 } 81 82 func (e *PGPKeyfinder) loadKeys(m libkb.MetaContext) { 83 if e.runerr != nil { 84 return 85 } 86 87 // get the pgp keys for all the users 88 for _, x := range e.uplus { 89 keys := x.User.GetActivePGPKeys(true) 90 if len(keys) == 0 { 91 e.runerr = libkb.NoPGPEncryptionKeyError{ 92 User: x.User.GetName(), 93 HasKeybaseEncryptionKey: x.User.HasEncryptionSubkey() || (x.User.GetComputedKeyFamily().GetLatestPerUserKey() != nil), 94 } 95 return 96 } 97 x.Keys = keys 98 } 99 } 100 101 type UserPlusKeys struct { 102 User *libkb.User 103 IsTracked bool 104 Keys []*libkb.PGPKeyBundle 105 } 106 107 func (e *PGPKeyfinder) addUser(user *libkb.User, tracked bool) { 108 e.uplus = append(e.uplus, &UserPlusKeys{User: user, IsTracked: tracked}) 109 }