github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/engine/device_history_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  	"testing"
     8  
     9  	"github.com/keybase/client/go/libkb"
    10  	keybase1 "github.com/keybase/client/go/protocol/keybase1"
    11  )
    12  
    13  func TestDeviceHistoryBasic(t *testing.T) {
    14  	tc := SetupEngineTest(t, "devhist")
    15  	defer tc.Cleanup()
    16  
    17  	CreateAndSignupFakeUserPaper(tc, "dhst")
    18  
    19  	eng := NewDeviceHistorySelf(tc.G)
    20  	m := NewMetaContextForTest(tc)
    21  	if err := RunEngine2(m, eng); err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	devs := eng.Devices()
    25  	if len(devs) != 2 {
    26  		t.Errorf("num devices: %d, expected 2", len(devs))
    27  	}
    28  
    29  	var desktop keybase1.DeviceDetail
    30  	var paper keybase1.DeviceDetail
    31  
    32  	for _, d := range devs {
    33  		switch d.Device.Type {
    34  		case keybase1.DeviceTypeV2_PAPER:
    35  			paper = d
    36  		case keybase1.DeviceTypeV2_DESKTOP:
    37  			desktop = d
    38  		default:
    39  			t.Fatalf("unexpected device type %s", d.Device.Type)
    40  		}
    41  	}
    42  
    43  	// paper's provisioner should be desktop
    44  	if paper.Provisioner == nil {
    45  		t.Fatal("paper device has no provisioner")
    46  	}
    47  	if paper.Provisioner.DeviceID != desktop.Device.DeviceID {
    48  		t.Errorf("paper provisioned id: %s, expected %s", paper.Provisioner.DeviceID, desktop.Device.DeviceID)
    49  		t.Logf("desktop: %+v", desktop)
    50  		t.Logf("paper:   %+v", paper)
    51  	}
    52  
    53  	// Check that LastUsedTime is set (since we're fetching our own device history)
    54  	for _, d := range devs {
    55  		if d.Device.LastUsedTime == 0 {
    56  			t.Fatal("last used time not set")
    57  		}
    58  	}
    59  }
    60  
    61  func TestDeviceHistoryRevoked(t *testing.T) {
    62  	tc := SetupEngineTest(t, "devhist")
    63  	defer tc.Cleanup()
    64  
    65  	u := CreateAndSignupFakeUserPaper(tc, "dhst")
    66  
    67  	eng := NewDeviceHistorySelf(tc.G)
    68  	m := NewMetaContextForTest(tc)
    69  	if err := RunEngine2(m, eng); err != nil {
    70  		t.Fatal(err)
    71  	}
    72  
    73  	var desktop keybase1.DeviceDetail
    74  	var paper keybase1.DeviceDetail
    75  
    76  	for _, d := range eng.Devices() {
    77  		switch d.Device.Type {
    78  		case keybase1.DeviceTypeV2_PAPER:
    79  			paper = d
    80  		case keybase1.DeviceTypeV2_DESKTOP:
    81  			desktop = d
    82  		default:
    83  			t.Fatalf("unexpected device type %s", d.Device.Type)
    84  		}
    85  	}
    86  
    87  	// paper's provisioner should be desktop
    88  	if paper.Provisioner == nil {
    89  		t.Fatal("paper device has no provisioner")
    90  	}
    91  	if paper.Provisioner.DeviceID != desktop.Device.DeviceID {
    92  		t.Errorf("paper provisioned id: %s, expected %s", paper.Provisioner.DeviceID, desktop.Device.DeviceID)
    93  		t.Logf("desktop: %+v", desktop)
    94  		t.Logf("paper:   %+v", paper)
    95  	}
    96  
    97  	// revoke the paper device
    98  	uis := libkb.UIs{
    99  		SecretUI: u.NewSecretUI(),
   100  		LogUI:    tc.G.UI.GetLogUI(),
   101  	}
   102  	m = NewMetaContextForTest(tc).WithUIs(uis)
   103  	reng := NewRevokeDeviceEngine(tc.G, RevokeDeviceEngineArgs{ID: paper.Device.DeviceID})
   104  	if err := RunEngine2(m, reng); err != nil {
   105  		t.Fatal(err)
   106  	}
   107  
   108  	// get history after revoke
   109  	eng = NewDeviceHistorySelf(tc.G)
   110  	if err := RunEngine2(m, eng); err != nil {
   111  		t.Fatal(err)
   112  	}
   113  
   114  	var desktop2 keybase1.DeviceDetail
   115  	var paper2 keybase1.DeviceDetail
   116  
   117  	for _, d := range eng.Devices() {
   118  		switch d.Device.Type {
   119  		case keybase1.DeviceTypeV2_PAPER:
   120  			paper2 = d
   121  		case keybase1.DeviceTypeV2_DESKTOP:
   122  			desktop2 = d
   123  		default:
   124  			t.Fatalf("unexpected device type %s", d.Device.Type)
   125  		}
   126  	}
   127  
   128  	// paper's provisioner should (still) be desktop
   129  	if paper2.Provisioner == nil {
   130  		t.Fatal("paper device has no provisioner")
   131  	}
   132  	if paper2.Provisioner.DeviceID != desktop2.Device.DeviceID {
   133  		t.Errorf("paper provisioned id: %s, expected %s", paper2.Provisioner.DeviceID, desktop2.Device.DeviceID)
   134  		t.Logf("desktop: %+v", desktop2)
   135  		t.Logf("paper:   %+v", paper2)
   136  	}
   137  
   138  	if paper2.RevokedAt == nil {
   139  		t.Fatal("paper device RevokedAt is nil")
   140  	}
   141  	if paper2.RevokedBy.IsNil() {
   142  		t.Fatal("paper device RevokedBy is nil")
   143  	}
   144  	if paper2.RevokedByDevice == nil {
   145  		t.Fatal("paper device RevokedByDevice is nil")
   146  	}
   147  	if paper2.RevokedByDevice.DeviceID != desktop.Device.DeviceID {
   148  		t.Fatalf("paper revoked by wrong device, %s != %s", paper2.RevokedByDevice.DeviceID,
   149  			desktop.Device.DeviceID)
   150  	}
   151  	if paper2.RevokedByDevice.Name != desktop.Device.Name {
   152  		t.Fatalf("paper revoked by wrong device, %s != %s", paper2.RevokedByDevice.Name,
   153  			desktop.Device.Name)
   154  	}
   155  }
   156  
   157  func TestDeviceHistoryPGP(t *testing.T) {
   158  	tc := SetupEngineTest(t, "devhist")
   159  	u1 := createFakeUserWithPGPOnly(t, tc)
   160  	t.Log("Created fake synced pgp user")
   161  	Logout(tc)
   162  	tc.Cleanup()
   163  
   164  	// redo SetupEngineTest to get a new home directory...should look like a new device.
   165  	tc = SetupEngineTest(t, "devhist")
   166  	defer tc.Cleanup()
   167  
   168  	uis := libkb.UIs{
   169  		ProvisionUI: newTestProvisionUIPassphrase(),
   170  		LoginUI:     &libkb.TestLoginUI{Username: u1.Username},
   171  		LogUI:       tc.G.UI.GetLogUI(),
   172  		SecretUI:    u1.NewSecretUI(),
   173  		GPGUI:       &gpgtestui{},
   174  	}
   175  	eng := NewLogin(tc.G, keybase1.DeviceTypeV2_DESKTOP, "", keybase1.ClientType_CLI)
   176  	m := NewMetaContextForTest(tc).WithUIs(uis)
   177  	if err := RunEngine2(m, eng); err != nil {
   178  		t.Fatal(err)
   179  	}
   180  
   181  	heng := NewDeviceHistorySelf(tc.G)
   182  	if err := RunEngine2(m, heng); err != nil {
   183  		t.Fatal(err)
   184  	}
   185  	devs := heng.Devices()
   186  	if len(devs) != 1 {
   187  		t.Errorf("num devices: %d, expected 1", len(devs))
   188  	}
   189  }