1// Copyright 2016 Keybase, Inc. All rights reserved. Use of
2// this source code is governed by the included BSD license.
3
4package engine
5
6import (
7	"github.com/keybase/client/go/libkb"
8)
9
10// PaperKeySubmit is an engine.
11type PaperKeySubmit struct {
12	libkb.Contextified
13	paperPhrase    string
14	deviceWithKeys *libkb.DeviceWithKeys
15}
16
17// NewPaperKeySubmit creates a PaperKeySubmit engine.
18func NewPaperKeySubmit(g *libkb.GlobalContext, paperPhrase string) *PaperKeySubmit {
19	return &PaperKeySubmit{
20		Contextified: libkb.NewContextified(g),
21		paperPhrase:  paperPhrase,
22	}
23}
24
25// Name is the unique engine name.
26func (e *PaperKeySubmit) Name() string {
27	return "PaperKeySubmit"
28}
29
30// Prereqs returns the engine prereqs.
31func (e *PaperKeySubmit) Prereqs() Prereqs {
32	return Prereqs{Device: true}
33}
34
35// RequiredUIs returns the required UIs.
36func (e *PaperKeySubmit) RequiredUIs() []libkb.UIKind {
37	return []libkb.UIKind{}
38}
39
40// SubConsumers returns the other UI consumers for this engine.
41func (e *PaperKeySubmit) SubConsumers() []libkb.UIConsumer {
42	return []libkb.UIConsumer{
43		&PaperKeyGen{},
44	}
45}
46
47// Run starts the engine.
48func (e *PaperKeySubmit) Run(m libkb.MetaContext) error {
49	me, err := libkb.LoadMe(libkb.NewLoadUserArgWithMetaContext(m))
50	if err != nil {
51		return err
52	}
53
54	e.deviceWithKeys, err = matchPaperKey(m, me, e.paperPhrase)
55	if err != nil {
56		return err
57	}
58
59	m.ActiveDevice().CacheProvisioningKey(m, e.deviceWithKeys)
60
61	// send a notification that a paper key has been cached
62	// for rekey purposes
63	m.G().NotifyRouter.HandlePaperKeyCached(me.GetUID(), e.deviceWithKeys.EncryptionKey().GetKID(), e.deviceWithKeys.SigningKey().GetKID())
64
65	// XXX - this is temporary until KBFS handles the above notification
66	m.G().UserChanged(m.Ctx(), me.GetUID())
67
68	return nil
69}
70