-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
puk_upgrade.go
101 lines (82 loc) · 2.49 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
100
101
// 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(m libkb.MetaContext) (err error) {
defer m.Trace("PerUserKeyUpgrade", &err)()
return e.inner(m)
}
func (e *PerUserKeyUpgrade) inner(m libkb.MetaContext) error {
if !m.G().Env.GetUpgradePerUserKey() {
return fmt.Errorf("per-user-key upgrade is disabled")
}
m.Debug("PerUserKeyUpgrade load self")
uid := m.G().GetMyUID()
if uid.IsNil() {
return libkb.NoUIDError{}
}
m.Debug("PerUserKeyUpgrade upgrading: %d", uid)
loadArg := libkb.NewLoadUserArgWithMetaContext(m).
WithUID(uid).
WithSelf(true).
WithPublicKeyOptional()
upak, me, err := m.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.
m.Debug("PerUserKeyUpgrade check for key")
if len(upak.Current.PerUserKeys) > 0 {
m.Debug("PerUserKeyUpgrade already has per-user-key")
e.DidNewKey = false
return nil
}
m.Debug("PerUserKeyUpgrade has no per-user-key")
// Make the key
arg := &PerUserKeyRollArgs{
Me: me,
}
eng := NewPerUserKeyRoll(m.G(), arg)
err = RunEngine2(m, eng)
e.DidNewKey = eng.DidNewKey
return err
}