github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/login_oneshot_test.go (about)

     1  package engine
     2  
     3  import (
     4  	"github.com/keybase/client/go/libkb"
     5  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
     6  	"github.com/stretchr/testify/require"
     7  	"testing"
     8  )
     9  
    10  func TestLoginOneshot(t *testing.T) {
    11  	tc := SetupEngineTest(t, "login")
    12  	defer tc.Cleanup()
    13  	fu := NewFakeUserOrBust(t, "paper")
    14  	arg := MakeTestSignupEngineRunArg(fu)
    15  	arg.SkipPaper = false
    16  	arg.StoreSecret = true
    17  	loginUI := &paperLoginUI{Username: fu.Username}
    18  	uis := libkb.UIs{
    19  		LogUI:    tc.G.UI.GetLogUI(),
    20  		GPGUI:    &gpgtestui{},
    21  		SecretUI: fu.NewSecretUI(),
    22  		LoginUI:  loginUI,
    23  	}
    24  	s := NewSignupEngine(tc.G, &arg)
    25  	m := NewMetaContextForTest(tc).WithUIs(uis)
    26  	err := RunEngine2(m, s)
    27  	require.NoError(t, err)
    28  	require.True(t, len(loginUI.PaperPhrase) > 0)
    29  
    30  	assertNumDevicesAndKeys(tc, fu, 2, 4)
    31  	assertSecretStored(tc, fu.Username)
    32  	Logout(tc)
    33  	assertSecretNotStored(tc, fu.Username)
    34  
    35  	tc2 := SetupEngineTest(t, "login")
    36  	defer tc2.Cleanup()
    37  
    38  	eng := NewLoginOneshot(tc2.G, keybase1.LoginOneshotArg{
    39  		Username: fu.NormalizedUsername().String(),
    40  		PaperKey: loginUI.PaperPhrase,
    41  	})
    42  	m = NewMetaContextForTest(tc2)
    43  	err = RunEngine2(m, eng)
    44  	require.NoError(t, err)
    45  	assertNumDevicesAndKeys(tc, fu, 2, 4)
    46  	err = AssertProvisioned(tc2)
    47  	require.NoError(t, err)
    48  
    49  	// assert paper key generation works
    50  	uis = libkb.UIs{
    51  		LogUI:    tc.G.UI.GetLogUI(),
    52  		LoginUI:  &libkb.TestLoginUI{},
    53  		SecretUI: fu.NewSecretUI(),
    54  	}
    55  	eng2 := NewPaperKey(tc.G)
    56  	m = m.WithUIs(uis)
    57  	err = RunEngine2(m, eng2)
    58  	require.NoError(t, err)
    59  	require.NotZero(t, len(eng2.Passphrase()))
    60  
    61  	testSign(t, tc2)
    62  	trackAlice(tc2, fu, 2)
    63  	err = m.LogoutAndDeprovisionIfRevoked()
    64  	require.NoError(t, err)
    65  	testSign(t, tc2)
    66  
    67  }
    68  
    69  // Test for the case that we hit, where a user has a regular keybase service + electron running,
    70  // and also a bot running on the same machine in oneshot mode. If the oneshot bot logs out,
    71  // it shouldn't molest the system keystore.  This tests repros and tests that case.
    72  func TestLoginOneshotNoLogout(t *testing.T) {
    73  	tc := SetupEngineTest(t, "login")
    74  	defer tc.Cleanup()
    75  	fu := NewFakeUserOrBust(t, "paper")
    76  	arg := MakeTestSignupEngineRunArg(fu)
    77  	arg.SkipPaper = false
    78  	arg.StoreSecret = true
    79  	loginUI := &paperLoginUI{Username: fu.Username}
    80  	uis := libkb.UIs{
    81  		LogUI:    tc.G.UI.GetLogUI(),
    82  		GPGUI:    &gpgtestui{},
    83  		SecretUI: fu.NewSecretUI(),
    84  		LoginUI:  loginUI,
    85  	}
    86  	s := NewSignupEngine(tc.G, &arg)
    87  	m := NewMetaContextForTest(tc).WithUIs(uis)
    88  	err := RunEngine2(m, s)
    89  	require.NoError(t, err)
    90  	require.True(t, len(loginUI.PaperPhrase) > 0)
    91  
    92  	assertNumDevicesAndKeys(tc, fu, 2, 4)
    93  	assertSecretStored(tc, fu.Username)
    94  
    95  	tc2 := SetupEngineTest(t, "login")
    96  	tc2.G.Env.Test.DevelName = tc.G.Env.Test.DevelName
    97  
    98  	// Assert that tc2 and tc share the same keychain, since they are
    99  	// on the same machine with the above testing flag override. This only
   100  	// works on Darwin due to the global nature of the keychain.
   101  	if libkb.RuntimeGroup() == keybase1.RuntimeGroup_DARWINLIKE {
   102  		assertSecretStored(tc2, fu.Username)
   103  	}
   104  	defer tc2.Cleanup()
   105  
   106  	eng := NewLoginOneshot(tc2.G, keybase1.LoginOneshotArg{
   107  		Username: fu.NormalizedUsername().String(),
   108  		PaperKey: loginUI.PaperPhrase,
   109  	})
   110  	m = NewMetaContextForTest(tc2)
   111  	err = RunEngine2(m, eng)
   112  	require.NoError(t, err)
   113  	assertNumDevicesAndKeys(tc, fu, 2, 4)
   114  	err = AssertProvisioned(tc2)
   115  	require.NoError(t, err)
   116  
   117  	// This is the crux of the test --- logout in the oneshot regime (via Logout(tc2))
   118  	// but make sure that the standard install isn't touched. Hence, we need to clear
   119  	// the memory store to make sure it also doesn't get in the way of the test.
   120  	tc.G.SecretStore().ClearMem()
   121  	assertSecretStored(tc, fu.Username)
   122  	Logout(tc2)
   123  	tc.G.SecretStore().ClearMem()
   124  	assertSecretStored(tc, fu.Username)
   125  }