1// Copyright 2015 Keybase, Inc. All rights reserved. Use of 2// this source code is governed by the included BSD license. 3 4package engine 5 6import ( 7 "fmt" 8 9 "golang.org/x/net/context" 10 11 "github.com/keybase/client/go/libkb" 12 keybase1 "github.com/keybase/client/go/protocol/keybase1" 13) 14 15type gpgtestui struct { 16 libkb.Contextified 17 index int 18 keyChosenCount int 19} 20 21func (g *gpgtestui) SelectKeyAndPushOption(_ context.Context, arg keybase1.SelectKeyAndPushOptionArg) (keybase1.SelectKeyRes, error) { 22 if len(arg.Keys) == 0 { 23 return keybase1.SelectKeyRes{}, fmt.Errorf("no keys in arg") 24 } 25 if g.index >= len(arg.Keys) { 26 return keybase1.SelectKeyRes{}, fmt.Errorf("test index %d outside bounds (num keys = %d)", g.index, len(arg.Keys)) 27 } 28 key := arg.Keys[g.index] 29 return keybase1.SelectKeyRes{KeyID: key.KeyID, DoSecretPush: true}, nil 30} 31 32func (g *gpgtestui) SelectKey(_ context.Context, arg keybase1.SelectKeyArg) (string, error) { 33 if len(arg.Keys) == 0 { 34 return "", fmt.Errorf("no keys in arg") 35 } 36 if g.index >= len(arg.Keys) { 37 return "", fmt.Errorf("test index %d outside bounds (num keys = %d)", g.index, len(arg.Keys)) 38 } 39 key := arg.Keys[g.index] 40 return key.KeyID, nil 41} 42 43func (g *gpgtestui) WantToAddGPGKey(_ context.Context, _ int) (bool, error) { 44 return true, nil 45} 46 47func (g *gpgtestui) ConfirmDuplicateKeyChosen(_ context.Context, _ int) (bool, error) { 48 g.keyChosenCount++ 49 return true, nil 50} 51 52func (g *gpgtestui) ConfirmImportSecretToExistingKey(_ context.Context, _ int) (bool, error) { 53 return false, nil 54} 55 56func (g *gpgtestui) Sign(ctx context.Context, arg keybase1.SignArg) (string, error) { 57 mctx := g.MetaContext(ctx) 58 fp, err := libkb.PGPFingerprintFromSlice(arg.Fingerprint) 59 if err != nil { 60 return "", err 61 } 62 cli := g.G().GetGpgClient() 63 if err := cli.Configure(mctx); err != nil { 64 return "", err 65 } 66 return cli.Sign(mctx, *fp, arg.Msg) 67} 68 69func (g *gpgtestui) GetTTY(_ context.Context) (string, error) { 70 return "", nil 71} 72 73func (g *gpgtestui) MetaContext(ctx context.Context) libkb.MetaContext { 74 return libkb.NewMetaContext(ctx, g.G()) 75} 76 77type gpgTestUIBadSign struct { 78 gpgtestui 79} 80 81func (g *gpgTestUIBadSign) Sign(_ context.Context, arg keybase1.SignArg) (string, error) { 82 return "", libkb.GpgError{M: "Artificial GPG failure for testing"} 83} 84 85// doesn't push secret to api server 86type gpgPubOnlyTestUI struct { 87 *gpgtestui 88} 89 90func (g *gpgPubOnlyTestUI) SelectKeyAndPushOption(_ context.Context, arg keybase1.SelectKeyAndPushOptionArg) (keybase1.SelectKeyRes, error) { 91 if len(arg.Keys) == 0 { 92 return keybase1.SelectKeyRes{}, fmt.Errorf("no keys in arg") 93 } 94 key := arg.Keys[0] 95 return keybase1.SelectKeyRes{KeyID: key.KeyID, DoSecretPush: false}, nil 96} 97