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