func (p ProvisionUI) DisplayAndPromptSecret(ctx context.Context, arg keybase1.DisplayAndPromptSecretArg) ([]byte, error) { if p.role == libkb.KexRoleProvisioner { // This is the provisioner device (device X) // For command line app, all secrets are entered on the provisioner only: p.parent.Output("Enter the verification code from your other device here:\n\n") ret, err := PromptWithChecker(PromptDescriptorProvisionPhrase, p.parent, "Verification code", false, libkb.CheckNotEmpty) if err != nil { return nil, err } secret, err := libkb.NewKex2SecretFromPhrase(ret) if err != nil { return nil, err } sbytes := secret.Secret() return sbytes[:], nil } if p.role == libkb.KexRoleProvisionee { // this is the provisionee device (device Y) // For command line app, the provisionee displays secrets only p.parent.Output("Type this verification code into your other device:\n\n") p.parent.Output("\t" + arg.Phrase + "\n\n") p.parent.Output("If you are using the command line client on your other device, run this command:\n\n") p.parent.Output("\tkeybase device add\n\n") p.parent.Output("It will then prompt you for the verification code above.\n\n") if arg.OtherDeviceType == keybase1.DeviceType_MOBILE { encodings, err := qrcode.Encode(arg.Secret) // ignoring any of these errors...phrase above will suffice. if err == nil { p.parent.Output("Or, scan this QR Code with the keybase app on your mobile phone:\n\n") p.parent.Output(encodings.Terminal) fname := path.Join(os.TempDir(), "keybase_qr.png") f, ferr := os.Create(fname) if ferr == nil { f.Write(encodings.PNG) f.Close() p.parent.Printf("\nThere's also a PNG version in %s that might work better.\n\n", fname) } } } return nil, nil } return nil, libkb.InvalidArgumentError{Msg: fmt.Sprintf("invalid ProvisionUI role: %d", p.role)} }
func (p ProvisionUI) DisplayAndPromptSecret(ctx context.Context, arg keybase1.DisplayAndPromptSecretArg) (keybase1.SecretResponse, error) { var resp keybase1.SecretResponse if p.role == libkb.KexRoleProvisioner { // This is the provisioner device (device X) // In development mode, show the QR code. This is just to // make frontend development easier. if (arg.OtherDeviceType == keybase1.DeviceType_MOBILE) && (p.parent.G().Env.GetRunMode() == libkb.DevelRunMode) { encodings, err := qrcode.Encode([]byte(arg.Phrase)) // ignoring any of these errors...phrase above will suffice. if err == nil { p.parent.Output("[DEVEL ONLY] Scan this QR Code with the keybase app on your mobile phone:\n\n") p.parent.Output(encodings.Terminal) fname := filepath.Join(os.TempDir(), "keybase_qr.png") f, ferr := os.Create(fname) if ferr == nil { f.Write(encodings.PNG) f.Close() p.parent.Printf("\nThere's also a PNG version in %s that might work better.\n\n", fname) } } } // For command line app, all secrets are entered on the provisioner only: p.parent.Output("\nEnter the verification code from your other device here. To get\n") p.parent.Output("a verification code, run 'keybase login' on your other device.\n\n") ret, err := PromptWithChecker(PromptDescriptorProvisionPhrase, p.parent, "Verification code", false, libkb.CheckKex2SecretPhrase) if err != nil { return resp, err } resp.Phrase = ret return resp, nil } if p.role == libkb.KexRoleProvisionee { // this is the provisionee device (device Y) // For command line app, the provisionee displays secrets only p.parent.Output("Type this verification code into your other device:\n\n") p.parent.Output("\t" + arg.Phrase + "\n\n") p.parent.Output("If you are using the command line client on your other device, run this command:\n\n") p.parent.Output("\tkeybase device add\n\n") p.parent.Output("It will then prompt you for the verification code above.\n\n") if arg.OtherDeviceType == keybase1.DeviceType_MOBILE { encodings, err := qrcode.Encode([]byte(arg.Phrase)) // ignoring any of these errors...phrase above will suffice. if err == nil { p.parent.Output("Or, scan this QR Code with the keybase app on your mobile phone:\n\n") p.parent.Output(encodings.Terminal) fname := filepath.Join(os.TempDir(), "keybase_qr.png") f, ferr := os.Create(fname) if ferr == nil { f.Write(encodings.PNG) f.Close() p.parent.Printf("\nThere's also a PNG version in %s that might work better.\n\n", fname) } } } return resp, nil } return resp, libkb.InvalidArgumentError{Msg: fmt.Sprintf("invalid ProvisionUI role: %d", p.role)} }