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

     1  package systests
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/keybase/client/go/client"
     6  	"github.com/keybase/client/go/libkb"
     7  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
     8  	context "golang.org/x/net/context"
     9  	"strings"
    10  	"testing"
    11  )
    12  
    13  func TestRevokeDevices(t *testing.T) {
    14  	set := newTestDeviceSet(t, nil)
    15  	defer set.cleanup()
    16  
    17  	// Set up first device
    18  	dev1 := set.newDevice("primary").start(4)
    19  
    20  	// Signup the new user for this device
    21  	set.signupUser(dev1)
    22  
    23  	// Provision a new device
    24  	dev2 := set.provisionNewDevice("secondary", 1)
    25  
    26  	alice := tlfUser{
    27  		keybase1.UID("295a7eea607af32040647123732bc819"),
    28  		[]keybase1.KID{},
    29  	}
    30  	mike := tlfUser{
    31  		keybase1.UID("ff261e3b26543a24ba6c0693820ead19"),
    32  		[]keybase1.KID{keybase1.KID("012073f26b5996912393f7d2961ca90968e4e83d6140e9771ba890ff8ba6ea97777e0a")},
    33  	}
    34  
    35  	// Add a new TLF (private/tester#alice) that's fully keyed
    36  	dev1.keyNewTLF(set.uid,
    37  		[]tlfUser{{set.uid, []keybase1.KID{dev1.KID(), dev2.KID(), set.backupKeys[0].KID}}},
    38  		[]tlfUser{alice},
    39  	)
    40  
    41  	// Add a new TLF (private/tester#mike) that isn't keyed for the current
    42  	// device
    43  	tlf2 := dev1.keyNewTLF(set.uid,
    44  		[]tlfUser{{set.uid, []keybase1.KID{dev2.KID(), set.backupKeys[0].KID}}},
    45  		[]tlfUser{mike},
    46  	)
    47  
    48  	// Call the server and process the API call. Make sure we get a list of
    49  	// "endangered" TLFs that includes private/tester#mike
    50  	cli := keybase1.RekeyClient{Cli: dev1.cli}
    51  	res, err := cli.GetRevokeWarning(context.TODO(), keybase1.GetRevokeWarningArg{
    52  		ActingDevice: dev1.deviceID,
    53  		TargetDevice: dev2.deviceID,
    54  	})
    55  
    56  	if err != nil {
    57  		t.Fatalf("Bad answer from RPC: %s", err)
    58  	}
    59  
    60  	if n := len(res.EndangeredTLFs); n != 1 {
    61  		t.Fatalf("Expected 1 endangered TLF: got %d", n)
    62  	}
    63  
    64  	if id := res.EndangeredTLFs[0].Id; id != tlf2.id {
    65  		t.Fatalf("Got wrong TLF ID; wanted %s; but got %s", tlf2.id, id)
    66  	}
    67  
    68  	expectedName := fmt.Sprintf("private/%s#%s", set.username, "t_mike")
    69  	if nm := res.EndangeredTLFs[0].Name; nm != expectedName {
    70  		t.Fatalf("Got wrong TLF name; wanted %q; but got %q", expectedName, nm)
    71  	}
    72  
    73  	run := func(accept bool) {
    74  		g := dev1.popClone().G
    75  		ui := newTestUI(g)
    76  		g.SetUI(ui)
    77  
    78  		var prompt string
    79  		ui.outputDescHook = func(d libkb.OutputDescriptor, s string) (err error) {
    80  			if d == client.OutputDescriptorEndageredTLFs {
    81  				prompt = s
    82  			}
    83  			return nil
    84  		}
    85  
    86  		ui.promptYesNoHook = func(libkb.PromptDescriptor, string, libkb.PromptDefault) (bool, error) {
    87  			return accept, nil
    88  		}
    89  
    90  		runner := client.NewCmdDeviceRemoveRunner(g)
    91  		runner.SetIDOrName(dev2.deviceName)
    92  		err = runner.Run()
    93  
    94  		if (err == nil) != accept {
    95  			t.Fatalf("With accept=%v, got unexpected error: %v", accept, err)
    96  		}
    97  
    98  		if !strings.Contains(prompt, expectedName) {
    99  			t.Fatalf("didn't find expected TLF name %q", expectedName)
   100  		}
   101  	}
   102  	run(false)
   103  	run(true)
   104  }