github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/pgp_select_test.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  	"os"
     8  	"path"
     9  	"testing"
    10  
    11  	"github.com/keybase/client/go/libkb"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestSelectEngine(t *testing.T) {
    16  	tc := SetupEngineTest(t, "select")
    17  	defer tc.Cleanup()
    18  
    19  	fu := NewFakeUserOrBust(t, "se")
    20  	if err := tc.GenerateGPGKeyring(fu.Email); err != nil {
    21  		t.Fatal(err)
    22  	}
    23  	arg := MakeTestSignupEngineRunArg(fu)
    24  	arg.SkipGPG = false
    25  	s := NewSignupEngine(tc.G, &arg)
    26  	testui := &gpgtestui{}
    27  	uis := libkb.UIs{
    28  		LogUI:    tc.G.UI.GetLogUI(),
    29  		GPGUI:    testui,
    30  		SecretUI: fu.NewSecretUI(),
    31  		LoginUI:  &libkb.TestLoginUI{Username: fu.Username},
    32  	}
    33  	m := NewMetaContextForTest(tc).WithUIs(uis)
    34  	if err := RunEngine2(m, s); err != nil {
    35  		t.Fatal(err)
    36  	}
    37  
    38  	fuUser, err := libkb.LoadUser(libkb.NewLoadUserByNameArg(tc.G, fu.Username))
    39  	if err != nil {
    40  		tc.T.Fatal(err)
    41  	}
    42  
    43  	publicKeys := fuUser.GetActivePGPKeys(false)
    44  	if len(publicKeys) != 1 {
    45  		tc.T.Fatal("There should be one generated PGP key")
    46  	}
    47  
    48  	key := publicKeys[0]
    49  	fp := key.GetFingerprint().String()
    50  	garg := GPGImportKeyArg{
    51  		Query:      fp,
    52  		AllowMulti: true,
    53  		SkipImport: false,
    54  		OnlyImport: false,
    55  	}
    56  	gpg := NewGPGImportKeyEngine(tc.G, &garg)
    57  	err = RunEngine2(m, gpg)
    58  	require.NoError(t, err)
    59  
    60  	// The GPGImportKeyEngine converts a multi select on the same key into
    61  	// an update, so our test checks that the update code ran, by counting
    62  	// on the test version of the update key prompt.
    63  	if testui.keyChosenCount != 1 {
    64  		tc.T.Fatal("Selected the same key twice and no update happened")
    65  	}
    66  	if len(gpg.duplicatedFingerprints) != 1 {
    67  		tc.T.Fatal("Server didn't return an error while updating")
    68  	}
    69  	if !key.GetFingerprint().Eq(gpg.duplicatedFingerprints[0]) {
    70  		tc.T.Fatal("Our fingerprint ID wasn't returned as up to date")
    71  	}
    72  }
    73  
    74  func TestPGPSelectThenPushSecret(t *testing.T) {
    75  	tc := SetupEngineTest(t, "select")
    76  	defer tc.Cleanup()
    77  
    78  	user := CreateAndSignupFakeUser(tc, "selc")
    79  	secUI := &libkb.TestSecretUI{Passphrase: user.Passphrase}
    80  
    81  	err := tc.GenerateGPGKeyring(user.Email)
    82  	require.NoError(t, err)
    83  
    84  	uis := libkb.UIs{
    85  		LogUI:    tc.G.UI.GetLogUI(),
    86  		SecretUI: secUI,
    87  		GPGUI:    &gpgtestui{},
    88  	}
    89  	mctx := tc.MetaContext().WithUIs(uis)
    90  
    91  	// PGP Select the key, without importing to local keyring.
    92  	garg := GPGImportKeyArg{
    93  		HasProvisionedDevice: true,
    94  		AllowMulti:           false,
    95  		SkipImport:           true,
    96  		OnlyImport:           false,
    97  	}
    98  	gpgEng := NewGPGImportKeyEngine(tc.G, &garg)
    99  	err = RunEngine2(mctx, gpgEng)
   100  	require.NoError(t, err)
   101  
   102  	kid := gpgEng.last.GetKID()
   103  
   104  	// Secret key should not be available on the server.
   105  	ss, err := mctx.ActiveDevice().SyncSecretsForce(mctx)
   106  	require.NoError(t, err)
   107  	_, ok := ss.FindPrivateKey(kid.String())
   108  	require.False(t, ok)
   109  
   110  	// Import secret key afterwards with pushing to the server.
   111  	keyBytes, err := os.ReadFile(path.Join(tc.Tp.GPGHome, "secring.gpg"))
   112  	require.NoError(t, err)
   113  	pgpEng, err := NewPGPKeyImportEngineFromBytes(tc.G, keyBytes, true /* pushSecret*/)
   114  	require.NoError(t, err)
   115  	mctx = tc.MetaContext().WithUIs(uis)
   116  	err = RunEngine2(mctx, pgpEng)
   117  	require.NoError(t, err)
   118  
   119  	// Secret key should *be* available on the server (pushSecret=true in GPG
   120  	// import engine above).
   121  	ss, err = mctx.ActiveDevice().SyncSecretsForce(mctx)
   122  	require.NoError(t, err)
   123  	privKey, ok := ss.FindPrivateKey(kid.String())
   124  	require.True(t, ok)
   125  	require.NotEmpty(t, privKey.Bundle)
   126  }