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

     1  // Copyright 2017 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  	"testing"
     8  
     9  	"github.com/keybase/client/go/libkb"
    10  	"github.com/stretchr/testify/require"
    11  )
    12  
    13  func TestPerUserKeyUpkeep(t *testing.T) {
    14  	tc := SetupEngineTest(t, "pukup")
    15  	defer tc.Cleanup()
    16  
    17  	fu := CreateAndSignupFakeUserPaper(tc, "pukup")
    18  	upkeep := func() *PerUserKeyUpkeep {
    19  		arg := &PerUserKeyUpkeepArgs{}
    20  		eng := NewPerUserKeyUpkeep(tc.G, arg)
    21  		m := NewMetaContextForTestWithLogUI(tc)
    22  		err := RunEngine2(m, eng)
    23  		require.NoError(t, err)
    24  		return eng
    25  	}
    26  	require.False(t, upkeep().DidRollKey, "don't roll")
    27  
    28  	t.Logf("revoke paper key")
    29  	revokeAnyPaperKey(tc, fu)
    30  
    31  	require.False(t, upkeep().DidRollKey, "don't roll after revoke-other")
    32  
    33  	t.Logf("provision second device")
    34  	tcY, cleanup := provisionNewDeviceKex(&tc, fu)
    35  	defer cleanup()
    36  
    37  	t.Logf("second device deprovisions itself")
    38  	{
    39  		eng := NewDeprovisionEngine(tcY.G, fu.Username, true /* doRevoke */, libkb.LogoutOptions{})
    40  		uis := libkb.UIs{
    41  			LogUI:    tcY.G.UI.GetLogUI(),
    42  			SecretUI: fu.NewSecretUI(),
    43  		}
    44  		m := libkb.NewMetaContextTODO(tcY.G).WithUIs(uis)
    45  		err := RunEngine2(m, eng)
    46  		require.NoError(t, err, "deprovision")
    47  	}
    48  
    49  	t.Logf("load self to bust the upak cache")
    50  	// Upkeep hits the cache. It's ok that upkeep doesn't notice a deprovision
    51  	// right away. Bust the upak cache as a way of simulating time passing
    52  	// for the sake of this test.
    53  	loadArg := libkb.NewLoadUserArg(tc.G).
    54  		WithUID(fu.UID()).
    55  		WithSelf(true).
    56  		WithForcePoll(true). // <-
    57  		WithPublicKeyOptional()
    58  	_, _, err := tc.G.GetUPAKLoader().LoadV2(loadArg)
    59  	require.NoError(t, err)
    60  
    61  	require.True(t, upkeep().DidRollKey, "roll after deprovision")
    62  
    63  	require.False(t, upkeep().DidRollKey, "don't roll after just rolled")
    64  }
    65  
    66  // This engine no-ops when the user has no PUKs.
    67  func TestPerUserKeyUpkeepNoPUK(t *testing.T) {
    68  	tc := SetupEngineTest(t, "pukup")
    69  	defer tc.Cleanup()
    70  	tc.Tp.DisableUpgradePerUserKey = true
    71  
    72  	_ = CreateAndSignupFakeUser(tc, "pukup")
    73  
    74  	upkeep := func() *PerUserKeyUpkeep {
    75  		arg := &PerUserKeyUpkeepArgs{}
    76  		eng := NewPerUserKeyUpkeep(tc.G, arg)
    77  		m := NewMetaContextForTestWithLogUI(tc)
    78  		err := RunEngine2(m, eng)
    79  		require.NoError(t, err)
    80  		return eng
    81  	}
    82  	require.False(t, upkeep().DidRollKey, "no puk, no roll")
    83  
    84  	checkPerUserKeyCountLocal(&tc, 0)
    85  	checkPerUserKeyCount(&tc, 0)
    86  }