github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/engine/fakeusers_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 "github.com/stretchr/testify/require" 11 ) 12 13 func createFakeUserWithNoKeys(tc libkb.TestContext) (username, passphrase string) { 14 username, email := fakeUser(tc.T, "login") 15 passphrase = fakePassphrase(tc.T) 16 m := NewMetaContextForTest(tc) 17 s := NewSignupEngine(tc.G, nil) 18 19 f := func() error { 20 m = m.WithNewProvisionalLoginContext() 21 22 // going to just run the join step of signup engine 23 if err := s.genPassphraseStream(m, passphrase, false /* randomPW */); err != nil { 24 return err 25 } 26 27 if err := s.join(m, SignupEngineRunArg{ 28 Username: username, 29 Email: email, 30 InviteCode: libkb.TestInvitationCode, 31 SkipMail: true, 32 }); err != nil { 33 return err 34 } 35 m = m.CommitProvisionalLogin() 36 return nil 37 } 38 if err := f(); err != nil { 39 tc.T.Fatal(err) 40 } 41 42 return username, passphrase 43 } 44 45 // createFakeUserWithPGPOnly creates a new fake/testing user, who signed 46 // up on the Web site, and used the Web site to generate his/her key. They 47 // used triplesec-encryption and synced their key to the keybase servers. 48 func createFakeUserWithPGPOnly(t *testing.T, tc libkb.TestContext) *FakeUser { 49 fu := NewFakeUserOrBust(tc.T, "login") 50 51 secui := &libkb.TestSecretUI{Passphrase: fu.Passphrase} 52 uis := libkb.UIs{ 53 GPGUI: &gpgtestui{}, 54 SecretUI: secui, 55 LogUI: tc.G.UI.GetLogUI(), 56 LoginUI: &libkb.TestLoginUI{Username: fu.Username}, 57 } 58 s := NewSignupEngine(tc.G, nil) 59 m := NewMetaContextForTest(tc).WithUIs(uis) 60 61 // Keep this provisional login around indefinitely, since we're going to need it to 62 // post PGP keys below. This isn't a modern use for our software, but we have this code 63 // to emulate old accounts provisioned by deprecated login paths. 64 m = m.WithNewProvisionalLoginContext() 65 err := s.genPassphraseStream(m, fu.Passphrase, false /* randomPW */) 66 require.NoError(t, err) 67 err = s.join(m, SignupEngineRunArg{ 68 Username: fu.Username, 69 Email: fu.Email, 70 InviteCode: libkb.TestInvitationCode, 71 SkipMail: true, 72 }) 73 require.NoError(t, err) 74 err = s.fakeLKS(m) 75 require.NoError(t, err) 76 m.Dump() 77 78 // Generate a new test PGP key for the user, and specify the PushSecret 79 // flag so that their triplesec'ed key is pushed to the server. 80 gen := libkb.PGPGenArg{ 81 PrimaryBits: 1024, 82 SubkeyBits: 1024, 83 } 84 gen.AddDefaultUID(tc.G) 85 peng := NewPGPKeyImportEngine(tc.G, PGPKeyImportEngineArg{ 86 Gen: &gen, 87 PushSecret: true, 88 Lks: s.lks, 89 NoSave: true, 90 }) 91 92 err = RunEngine2(m, peng) 93 require.NoError(t, err) 94 fu.User, err = libkb.LoadMe(libkb.NewLoadUserArgWithMetaContext(m).WithPublicKeyOptional()) 95 require.NoError(t, err) 96 97 return fu 98 } 99 100 // private gpg key not pushed to server 101 func createFakeUserWithPGPPubOnly(t *testing.T, tc libkb.TestContext) *FakeUser { 102 fu := NewFakeUserOrBust(t, "login") 103 if err := tc.GenerateGPGKeyring(fu.Email); err != nil { 104 t.Fatal(err) 105 } 106 107 secui := &libkb.TestSecretUI{Passphrase: fu.Passphrase} 108 s := NewSignupEngine(tc.G, nil) 109 uis := libkb.UIs{ 110 GPGUI: &gpgPubOnlyTestUI{}, 111 SecretUI: secui, 112 LogUI: tc.G.UI.GetLogUI(), 113 LoginUI: &libkb.TestLoginUI{Username: fu.Username}, 114 } 115 m := NewMetaContextForTest(tc).WithUIs(uis) 116 117 f := func() error { 118 m = m.WithNewProvisionalLoginContext() 119 if err := s.genPassphraseStream(m, fu.Passphrase, false /* randomPW */); err != nil { 120 return err 121 } 122 123 if err := s.join(m, SignupEngineRunArg{ 124 Username: fu.Username, 125 Email: fu.Email, 126 InviteCode: libkb.TestInvitationCode, 127 SkipMail: true, 128 }); err != nil { 129 return err 130 } 131 132 if err := s.fakeLKS(m); err != nil { 133 return err 134 } 135 136 if err := s.addGPG(m, false, false); err != nil { 137 return err 138 } 139 m = m.CommitProvisionalLogin() 140 return nil 141 } 142 if err := f(); err != nil { 143 t.Fatal(err) 144 } 145 146 return fu 147 } 148 149 // multiple pgp keys 150 func createFakeUserWithPGPMult(t *testing.T, tc libkb.TestContext) *FakeUser { 151 fu := NewFakeUserOrBust(t, "login") 152 if err := tc.GenerateGPGKeyring(fu.Email, "xxx@xxx.com"); err != nil { 153 t.Fatal(err) 154 } 155 156 secui := &libkb.TestSecretUI{Passphrase: fu.Passphrase} 157 s := NewSignupEngine(tc.G, nil) 158 uis := libkb.UIs{ 159 GPGUI: &gpgtestui{}, 160 SecretUI: secui, 161 LogUI: tc.G.UI.GetLogUI(), 162 LoginUI: &libkb.TestLoginUI{Username: fu.Username}, 163 } 164 m := NewMetaContextForTest(tc).WithUIs(uis) 165 166 f := func() error { 167 m = m.WithNewProvisionalLoginContext() 168 if err := s.genPassphraseStream(m, fu.Passphrase, false /* randomPW */); err != nil { 169 return err 170 } 171 172 if err := s.join(m, SignupEngineRunArg{ 173 Username: fu.Username, 174 Email: fu.Email, 175 InviteCode: libkb.TestInvitationCode, 176 SkipMail: true, 177 }); err != nil { 178 t.Fatal(err) 179 } 180 181 fu.User = s.GetMe() 182 183 // fake the lks: 184 if err := s.fakeLKS(m); err != nil { 185 return err 186 } 187 188 if err := s.addGPG(m, false, false); err != nil { 189 return err 190 } 191 192 // hack the gpg ui to select a different key: 193 m = m.WithGPGUI(&gpgtestui{index: 1}) 194 if err := s.addGPG(m, true, false); err != nil { 195 return nil 196 } 197 m = m.CommitProvisionalLogin() 198 return nil 199 } 200 201 if err := f(); err != nil { 202 t.Fatal(err) 203 } 204 205 // now it should have two pgp keys... 206 207 return fu 208 } 209 210 func createFakeUserWithPGPSibkey(tc libkb.TestContext) *FakeUser { 211 fu := CreateAndSignupFakeUser(tc, "pgp") 212 213 arg := PGPKeyImportEngineArg{ 214 Gen: &libkb.PGPGenArg{ 215 PrimaryBits: 768, 216 SubkeyBits: 768, 217 }, 218 } 219 if err := arg.Gen.MakeAllIds(tc.G); err != nil { 220 tc.T.Fatal(err) 221 } 222 uis := libkb.UIs{ 223 LogUI: tc.G.UI.GetLogUI(), 224 SecretUI: fu.NewSecretUI(), 225 } 226 eng := NewPGPKeyImportEngine(tc.G, arg) 227 m := NewMetaContextForTest(tc).WithUIs(uis) 228 err := RunEngine2(m, eng) 229 if err != nil { 230 tc.T.Fatal(err) 231 } 232 return fu 233 } 234 235 func createFakeUserWithPGPSibkeyPaper(tc libkb.TestContext) *FakeUser { 236 fu := CreateAndSignupFakeUserPaper(tc, "pgp") 237 238 arg := PGPKeyImportEngineArg{ 239 Gen: &libkb.PGPGenArg{ 240 PrimaryBits: 768, 241 SubkeyBits: 768, 242 }, 243 } 244 if err := arg.Gen.MakeAllIds(tc.G); err != nil { 245 tc.T.Fatal(err) 246 } 247 uis := libkb.UIs{ 248 LogUI: tc.G.UI.GetLogUI(), 249 SecretUI: fu.NewSecretUI(), 250 } 251 eng := NewPGPKeyImportEngine(tc.G, arg) 252 m := NewMetaContextForTest(tc).WithUIs(uis) 253 err := RunEngine2(m, eng) 254 if err != nil { 255 tc.T.Fatal(err) 256 } 257 return fu 258 } 259 260 func createFakeUserWithPGPSibkeyPushed(tc libkb.TestContext) *FakeUser { 261 fu := CreateAndSignupFakeUser(tc, "pgp") 262 263 arg := PGPKeyImportEngineArg{ 264 Gen: &libkb.PGPGenArg{ 265 PrimaryBits: 768, 266 SubkeyBits: 768, 267 }, 268 PushSecret: true, 269 NoSave: true, 270 } 271 if err := arg.Gen.MakeAllIds(tc.G); err != nil { 272 tc.T.Fatal(err) 273 } 274 uis := libkb.UIs{ 275 LogUI: tc.G.UI.GetLogUI(), 276 SecretUI: fu.NewSecretUI(), 277 } 278 eng := NewPGPKeyImportEngine(tc.G, arg) 279 m := NewMetaContextForTest(tc).WithUIs(uis) 280 err := RunEngine2(m, eng) 281 if err != nil { 282 tc.T.Fatal(err) 283 } 284 return fu 285 } 286 287 func createFakeUserWithPGPSibkeyPushedPaper(tc libkb.TestContext) *FakeUser { 288 fu := CreateAndSignupFakeUserPaper(tc, "pgp") 289 290 arg := PGPKeyImportEngineArg{ 291 Gen: &libkb.PGPGenArg{ 292 PrimaryBits: 768, 293 SubkeyBits: 768, 294 }, 295 PushSecret: true, 296 NoSave: true, 297 } 298 if err := arg.Gen.MakeAllIds(tc.G); err != nil { 299 tc.T.Fatal(err) 300 } 301 uis := libkb.UIs{ 302 LogUI: tc.G.UI.GetLogUI(), 303 SecretUI: fu.NewSecretUI(), 304 } 305 eng := NewPGPKeyImportEngine(tc.G, arg) 306 m := NewMetaContextForTest(tc).WithUIs(uis) 307 err := RunEngine2(m, eng) 308 if err != nil { 309 tc.T.Fatal(err) 310 } 311 return fu 312 } 313 314 func createFakeUserWithPGPSibkeyPregen(tc libkb.TestContext, pregen *libkb.PGPKeyBundle) *FakeUser { 315 fu := CreateAndSignupFakeUser(tc, "pgp") 316 317 arg := PGPKeyImportEngineArg{ 318 Pregen: pregen, 319 } 320 uis := libkb.UIs{ 321 LogUI: tc.G.UI.GetLogUI(), 322 SecretUI: fu.NewSecretUI(), 323 } 324 eng := NewPGPKeyImportEngine(tc.G, arg) 325 m := NewMetaContextForTest(tc).WithUIs(uis) 326 err := RunEngine2(m, eng) 327 if err != nil { 328 tc.T.Fatal(err) 329 } 330 return fu 331 } 332 333 // fakeLKS is used to create a lks that has the server half when 334 // creating a fake user that doesn't have a device. 335 func (s *SignupEngine) fakeLKS(m libkb.MetaContext) error { 336 s.lks = libkb.NewLKSec(s.ppStream, s.uid) 337 return s.lks.GenerateServerHalf() 338 }