forked from keybase/client
/
puk_upgrade.go
99 lines (82 loc) · 2.63 KB
/
puk_upgrade.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright 2017 Keybase, Inc. All rights reserved. Use of
// this source code is governed by the included BSD license.
// PerUserKeyUpgrade creates a per-user-key for the active user
// if they do not already have one.
// It adds a per-user-key link to the sigchain and adds the key to the local keyring.
package engine
import (
"fmt"
"github.com/keybase/client/go/libkb"
)
// PerUserKeyUpgrade is an engine.
type PerUserKeyUpgrade struct {
libkb.Contextified
args *PerUserKeyUpgradeArgs
DidNewKey bool
}
type PerUserKeyUpgradeArgs struct{}
// NewPerUserKeyUpgrade creates a PerUserKeyUpgrade engine.
func NewPerUserKeyUpgrade(g *libkb.GlobalContext, args *PerUserKeyUpgradeArgs) *PerUserKeyUpgrade {
return &PerUserKeyUpgrade{
args: args,
Contextified: libkb.NewContextified(g),
}
}
// Name is the unique engine name.
func (e *PerUserKeyUpgrade) Name() string {
return "PerUserKeyUpgrade"
}
// GetPrereqs returns the engine prereqs.
func (e *PerUserKeyUpgrade) Prereqs() Prereqs {
return Prereqs{
Device: true,
}
}
// RequiredUIs returns the required UIs.
func (e *PerUserKeyUpgrade) RequiredUIs() []libkb.UIKind {
return []libkb.UIKind{}
}
// SubConsumers returns the other UI consumers for this engine.
func (e *PerUserKeyUpgrade) SubConsumers() []libkb.UIConsumer {
return []libkb.UIConsumer{&PerUserKeyRoll{}}
}
// Run starts the engine.
func (e *PerUserKeyUpgrade) Run(ctx *Context) (err error) {
defer e.G().CTrace(ctx.GetNetContext(), "PerUserKeyUpgrade", func() error { return err })()
return e.inner(ctx)
}
func (e *PerUserKeyUpgrade) inner(ctx *Context) error {
if !e.G().Env.GetUpgradePerUserKey() {
return fmt.Errorf("per-user-key upgrade is disabled")
}
e.G().Log.CDebugf(ctx.GetNetContext(), "PerUserKeyUpgrade load self")
uid := e.G().GetMyUID()
if uid.IsNil() {
return libkb.NoUIDError{}
}
loadArg := libkb.NewLoadUserArgBase(e.G()).
WithNetContext(ctx.GetNetContext()).
WithUID(uid).
WithSelf(true).
WithPublicKeyOptional()
upak, me, err := e.G().GetUPAKLoader().LoadV2(*loadArg)
if err != nil {
return err
}
// `me` could be nil. Use the upak for quick checks and then pass maybe-nil `me` to the next engine.
e.G().Log.CDebugf(ctx.GetNetContext(), "PerUserKeyUpgrade check for key")
if len(upak.Current.PerUserKeys) > 0 {
e.G().Log.CDebugf(ctx.GetNetContext(), "PerUserKeyUpgrade already has per-user-key")
e.DidNewKey = false
return nil
}
e.G().Log.CDebugf(ctx.GetNetContext(), "PerUserKeyUpgrade has no per-user-key")
// Make the key
arg := &PerUserKeyRollArgs{
Me: me,
}
eng := NewPerUserKeyRoll(e.G(), arg)
err = RunEngine(eng, ctx)
e.DidNewKey = eng.DidNewKey
return err
}