forked from keybase/client
/
team_handler.go
115 lines (94 loc) · 3.52 KB
/
team_handler.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
// Copyright 2017 Keybase, Inc. All rights reserved. Use of
// this source code is governed by the included BSD license.
package service
import (
"encoding/json"
"fmt"
"golang.org/x/net/context"
"github.com/keybase/client/go/gregor"
"github.com/keybase/client/go/libkb"
"github.com/keybase/client/go/protocol/gregor1"
"github.com/keybase/client/go/protocol/keybase1"
"github.com/keybase/client/go/teams"
)
const teamHandlerName = "teamHandler"
type teamHandler struct {
libkb.Contextified
}
var _ libkb.GregorInBandMessageHandler = (*teamHandler)(nil)
func newTeamHandler(g *libkb.GlobalContext) *teamHandler {
return &teamHandler{
Contextified: libkb.NewContextified(g),
}
}
func (r *teamHandler) Create(ctx context.Context, cli gregor1.IncomingInterface, category string, item gregor.Item) (bool, error) {
switch category {
case "team.clkr":
return true, r.rotateTeam(ctx, item)
case "team.sbs":
return true, r.sharingBeforeSignup(ctx, item)
case "team.change":
return true, r.changeTeam(ctx, item, keybase1.TeamChangeSet{})
case "team.rename":
return true, r.changeTeam(ctx, item, keybase1.TeamChangeSet{Renamed: true})
case "team.delete":
return true, r.deleteTeam(ctx, item)
default:
return false, fmt.Errorf("unknown teamHandler category: %q", category)
}
}
func (r *teamHandler) rotateTeam(ctx context.Context, item gregor.Item) error {
r.G().Log.Debug("team.clkr received")
var msg keybase1.TeamCLKRMsg
if err := json.Unmarshal(item.Body().Bytes(), &msg); err != nil {
r.G().Log.Debug("error unmarshaling team.clkr item: %s", err)
return err
}
r.G().Log.Debug("team.clkr unmarshaled: %+v", msg)
if err := teams.HandleRotateRequest(ctx, r.G(), msg.TeamID, keybase1.PerTeamKeyGeneration(msg.Generation)); err != nil {
return err
}
r.G().Log.Debug("dismissing team.clkr item since rotate succeeded")
return r.G().GregorDismisser.DismissItem(item.Metadata().MsgID())
}
func (r *teamHandler) changeTeam(ctx context.Context, item gregor.Item, changes keybase1.TeamChangeSet) error {
var rows []keybase1.TeamChangeRow
if err := json.Unmarshal(item.Body().Bytes(), &rows); err != nil {
r.G().Log.Debug("error unmarshaling team.(change|rename) item: %s", err)
return err
}
r.G().Log.Debug("team.(change|rename) unmarshaled: %+v", rows)
return teams.HandleChangeNotification(ctx, r.G(), rows, changes)
}
func (r *teamHandler) deleteTeam(ctx context.Context, item gregor.Item) error {
var rows []keybase1.TeamChangeRow
if err := json.Unmarshal(item.Body().Bytes(), &rows); err != nil {
r.G().Log.Debug("error unmarshaling team.(change|rename) item: %s", err)
return err
}
r.G().Log.Debug("team.delete unmarshaled: %+v", rows)
return teams.HandleDeleteNotification(ctx, r.G(), rows)
}
func (r *teamHandler) sharingBeforeSignup(ctx context.Context, item gregor.Item) error {
r.G().Log.Debug("team.sbs received")
var msg keybase1.TeamSBSMsg
if err := json.Unmarshal(item.Body().Bytes(), &msg); err != nil {
r.G().Log.Debug("error unmarshaling team.sbs item: %s", err)
return err
}
r.G().Log.Debug("team.sbs unmarshaled: %+v", msg)
if err := teams.HandleSBSRequest(ctx, r.G(), msg); err != nil {
return err
}
r.G().Log.Debug("dismissing team.sbs item since it succeeded")
return r.G().GregorDismisser.DismissItem(item.Metadata().MsgID())
}
func (r *teamHandler) Dismiss(ctx context.Context, cli gregor1.IncomingInterface, category string, item gregor.Item) (bool, error) {
return false, nil
}
func (r *teamHandler) IsAlive() bool {
return true
}
func (r *teamHandler) Name() string {
return teamHandlerName
}