github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/passphrase_check.go (about) 1 // Copyright 2019 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 "errors" 8 9 "github.com/keybase/client/go/libkb" 10 keybase1 "github.com/keybase/client/go/protocol/keybase1" 11 ) 12 13 // PassphraseCheck is an engine that checks if given passphrase matches current 14 // user's passphrase. 15 type PassphraseCheck struct { 16 arg *keybase1.PassphraseCheckArg 17 result bool 18 libkb.Contextified 19 } 20 21 func NewPassphraseCheck(g *libkb.GlobalContext, a *keybase1.PassphraseCheckArg) *PassphraseCheck { 22 return &PassphraseCheck{ 23 arg: a, 24 Contextified: libkb.NewContextified(g), 25 } 26 } 27 28 // Name provides the name of the engine for the engine interface 29 func (c *PassphraseCheck) Name() string { 30 return "PassphraseCheck" 31 } 32 33 // Prereqs returns engine prereqs 34 func (c *PassphraseCheck) Prereqs() Prereqs { 35 return Prereqs{Device: true} 36 } 37 38 // RequiredUIs returns the required UIs. 39 func (c *PassphraseCheck) RequiredUIs() []libkb.UIKind { 40 return []libkb.UIKind{} 41 } 42 43 // SubConsumers requires the other UI consumers of this engine 44 func (c *PassphraseCheck) SubConsumers() []libkb.UIConsumer { 45 return []libkb.UIConsumer{} 46 } 47 48 // Run the engine 49 func (c *PassphraseCheck) Run(mctx libkb.MetaContext) (err error) { 50 defer mctx.Trace("PassphraseCheck#Run", &err)() 51 52 passphrase := c.arg.Passphrase 53 if passphrase == "" { 54 username := c.G().GetEnv().GetUsername().String() 55 promptArg := libkb.DefaultPassphrasePromptArg(mctx, username) 56 if !mctx.UIs().HasUI(libkb.SecretUIKind) { 57 return errors.New("Passphrase was not passed in arguments and SecretUI is not available") 58 } 59 res, err := mctx.UIs().SecretUI.GetPassphrase(promptArg, nil) 60 if err != nil { 61 return err 62 } 63 passphrase = res.Passphrase 64 } 65 66 _, err = libkb.VerifyPassphraseForLoggedInUser(mctx, passphrase) 67 if err != nil { 68 if _, ok := err.(libkb.PassphraseError); ok { 69 // Swallow passphrase errors, return `false` that the passphrase 70 // provided was incorrect. 71 c.result = false 72 return nil 73 } 74 // There was some other error. 75 return err 76 } 77 // No error, passphrase was correct. 78 c.result = true 79 return nil 80 } 81 82 // GetResult returns result of passphrase check, if Run() ran without errors. 83 // False means passphrase was incorrect, true means it was correct. 84 func (c *PassphraseCheck) GetResult() bool { 85 return c.result 86 }