-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
put.go
119 lines (103 loc) · 3.82 KB
/
put.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
package git
import (
"context"
"encoding/base64"
"fmt"
"github.com/keybase/client/go/chat/globals"
"github.com/keybase/client/go/libkb"
"github.com/keybase/client/go/protocol/chat1"
"github.com/keybase/client/go/protocol/keybase1"
"github.com/keybase/go-codec/codec"
)
func PutMetadata(ctx context.Context, g *libkb.GlobalContext, arg keybase1.PutGitMetadataArg) error {
teamer := NewTeamer(g)
cryptoer := NewCrypto(g)
mctx := libkb.NewMetaContext(ctx, g)
teamIDVis, err := teamer.LookupOrCreate(ctx, arg.Folder)
if err != nil {
return err
}
// Translate the GitLocalMetadata struct into GitLocalMetadataVersioned,
// for versioned storage.
localMetadataVersioned := keybase1.NewGitLocalMetadataVersionedWithV1(
keybase1.GitLocalMetadataV1{
RepoName: arg.Metadata.RepoName})
mh := codec.MsgpackHandle{WriteExt: true}
var msgpackLocalMetadata []byte
enc := codec.NewEncoderBytes(&msgpackLocalMetadata, &mh)
err = enc.Encode(localMetadataVersioned)
if err != nil {
return fmt.Errorf("encoding git metadata:%v", err)
}
encryptedMetadata, err := cryptoer.Box(ctx, msgpackLocalMetadata, teamIDVis)
if err != nil {
return err
}
base64Ciphertext := base64.StdEncoding.EncodeToString(encryptedMetadata.E)
base64Nonce := base64.StdEncoding.EncodeToString(encryptedMetadata.N[:])
apiArg := libkb.APIArg{
Endpoint: "kbfs/git/team/put",
SessionType: libkb.APISessionTypeREQUIRED,
Args: libkb.HTTPArgs{
"team_id": libkb.S{Val: string(teamIDVis.TeamID)},
"repo_id": libkb.S{Val: string(arg.RepoID)},
"encrypted_metadata": libkb.S{Val: base64Ciphertext},
"nonce": libkb.S{Val: base64Nonce},
"key_generation": libkb.I{Val: int(encryptedMetadata.Gen)},
"device_id": libkb.S{Val: string(g.Env.GetDeviceID())},
"encryption_version": libkb.I{Val: encryptedMetadata.V},
"notify_team": libkb.B{Val: arg.NotifyTeam},
},
}
_, err = mctx.G().GetAPI().Post(mctx, apiArg)
if err == nil {
err = sendChat(mctx, teamIDVis.TeamID, arg)
}
return err
}
func sendChat(mctx libkb.MetaContext, teamID keybase1.TeamID, arg keybase1.PutGitMetadataArg) error {
if arg.Folder.FolderType != keybase1.FolderType_TEAM {
// only send chat for team repos
return nil
}
settingsArg := keybase1.GetTeamRepoSettingsArg{
Folder: arg.Folder,
RepoID: arg.RepoID,
}
settings, err := GetTeamRepoSettings(mctx.Ctx(), mctx.G(), settingsArg)
if err != nil {
return err
}
if settings.ChatDisabled {
return nil
}
if settings.ChannelName == nil {
// this shouldn't happen, but protect it if it does:
mctx.Debug("invalid team repo settings: chat enabled, but nil ChannelName. using default.")
settings.ChannelName = &globals.DefaultTeamTopic
}
if mctx.G().ChatHelper == nil {
mctx.Debug("cannot send chat on git push to team channel because no ChatHelper")
return nil
}
if arg.Metadata.PushType == keybase1.GitPushType_DEFAULT && keybase1.TotalNumberOfCommits(arg.Metadata.Refs) == 0 {
mctx.Debug("default git push and no commits, not sending chat")
return nil
}
mctx.G().StartStandaloneChat()
subBody := chat1.NewMessageSystemWithGitpush(chat1.MessageSystemGitPush{
Team: arg.Folder.Name,
Pusher: mctx.G().Env.GetUsername().String(),
RepoID: arg.RepoID,
RepoName: string(arg.Metadata.RepoName),
Refs: arg.Metadata.Refs,
PushType: arg.Metadata.PushType,
PreviousRepoName: string(arg.Metadata.PreviousRepoName),
})
body := chat1.NewMessageBodyWithSystem(subBody)
mctx.Debug("sending git push system chat message to %s/%s", arg.Folder.Name, *settings.ChannelName)
_, err = mctx.G().ChatHelper.SendMsgByNameNonblock(mctx.Ctx(), arg.Folder.Name, settings.ChannelName,
chat1.ConversationMembersType_TEAM, keybase1.TLFIdentifyBehavior_CHAT_CLI, body,
chat1.MessageType_SYSTEM, nil)
return err
}