/
signup.go
126 lines (112 loc) · 3.5 KB
/
signup.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright 2015 Keybase, Inc. All rights reserved. Use of
// this source code is governed by the included BSD license.
package service
import (
"fmt"
"github.com/keybase/client/go/engine"
"github.com/keybase/client/go/libkb"
keybase1 "github.com/keybase/client/go/protocol/keybase1"
"github.com/keybase/go-framed-msgpack-rpc/rpc"
"golang.org/x/net/context"
)
type SignupHandler struct {
*BaseHandler
libkb.Contextified
}
func NewSignupHandler(xp rpc.Transporter, g *libkb.GlobalContext) *SignupHandler {
return &SignupHandler{
BaseHandler: NewBaseHandler(g, xp),
Contextified: libkb.NewContextified(g),
}
}
func (h *SignupHandler) CheckUsernameAvailable(_ context.Context, arg keybase1.CheckUsernameAvailableArg) error {
_, err := h.G().API.Get(libkb.APIArg{
Endpoint: "user/lookup",
SessionType: libkb.APISessionTypeNONE,
Args: libkb.HTTPArgs{
"username": libkb.S{Val: arg.Username},
"fields": libkb.S{Val: "basics"},
},
})
switch err := err.(type) {
case nil:
// User found, so the name is taken.
return libkb.AppStatusError{
Code: libkb.SCBadSignupUsernameTaken,
Name: "BAD_SIGNUP_USERNAME_TAKEN",
Desc: fmt.Sprintf("Username '%s' is taken", arg.Username),
}
case libkb.AppStatusError:
switch err.Name {
case "NOT_FOUND":
// User not found, name is available.
return nil
case "DELETED":
return libkb.AppStatusError{
Code: libkb.SCBadSignupUsernameDeleted,
Name: "BAD_SIGNUP_USERNAME_DELETED",
Desc: fmt.Sprintf("Username '%s' has been deleted", arg.Username),
}
}
return err
default:
return err
}
}
func (h *SignupHandler) Signup(ctx context.Context, arg keybase1.SignupArg) (res keybase1.SignupRes, err error) {
uis := libkb.UIs{
LogUI: h.getLogUI(arg.SessionID),
GPGUI: h.getGPGUI(arg.SessionID),
SecretUI: h.getSecretUI(arg.SessionID, h.G()),
LoginUI: h.getLoginUI(arg.SessionID),
SessionID: arg.SessionID,
}
runarg := engine.SignupEngineRunArg{
Username: arg.Username,
Email: arg.Email,
InviteCode: arg.InviteCode,
Passphrase: arg.Passphrase,
StoreSecret: arg.StoreSecret,
DeviceName: arg.DeviceName,
DeviceType: arg.DeviceType,
SkipMail: arg.SkipMail,
GenPGPBatch: arg.GenPGPBatch,
SkipPaper: !arg.GenPaper,
}
m := libkb.NewMetaContext(ctx, h.G()).WithUIs(uis)
eng := engine.NewSignupEngine(h.G(), &runarg)
err = engine.RunEngine2(m, eng)
if err == nil {
// everything succeeded
// these don't really matter as they aren't checked with nil err,
// but just to make sure:
res.PassphraseOk = true
res.PostOk = true
res.WriteOk = true
return res, nil
}
// check to see if the error is a join engine run result:
if e, ok := err.(engine.SignupJoinEngineRunRes); ok {
res.PassphraseOk = e.PassphraseOk
res.PostOk = e.PostOk
res.WriteOk = e.WriteOk
err = e.Err
return res, err
}
// not a join engine error:
return res, err
}
func (h *SignupHandler) InviteRequest(ctx context.Context, arg keybase1.InviteRequestArg) (err error) {
m := libkb.NewMetaContext(ctx, h.G())
return libkb.PostInviteRequest(m, libkb.InviteRequestArg{
Email: arg.Email,
Fullname: arg.Fullname,
Notes: arg.Notes,
})
}
func (h *SignupHandler) CheckInvitationCode(ctx context.Context, arg keybase1.CheckInvitationCodeArg) (err error) {
return libkb.CheckInvitationCode(libkb.NewMetaContext(ctx, h.G()), arg.InvitationCode)
}
func (h *SignupHandler) GetInvitationCode(c context.Context, sessionID int) (code string, err error) {
return libkb.GetInvitationCode(libkb.NewMetaContext(c, h.G()))
}