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  }