-
Notifications
You must be signed in to change notification settings - Fork 168
Expand file tree
/
Copy pathoauth.go
More file actions
145 lines (117 loc) · 3.35 KB
/
oauth.go
File metadata and controls
145 lines (117 loc) · 3.35 KB
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package plugin
import (
"context"
"sync"
"github.com/mattermost/mattermost/server/public/pluginapi/experimental/bot/logger"
"golang.org/x/oauth2"
)
type Context struct {
Ctx context.Context
UserID string
Log logger.Logger
}
type GitHubUserRequest struct {
UserID string `json:"user_id"`
}
type GitHubUserResponse struct {
Username string `json:"username"`
}
type ConnectedResponse struct {
Connected bool `json:"connected"`
GitHubUsername string `json:"github_username"`
GitHubClientID string `json:"github_client_id"`
EnterpriseBaseURL string `json:"enterprise_base_url,omitempty"`
Organizations []string `json:"organizations"`
UserSettings *UserSettings `json:"user_settings"`
ClientConfiguration map[string]interface{} `json:"configuration"`
}
type UserSettings struct {
SidebarButtons string `json:"sidebar_buttons"`
DailyReminder bool `json:"daily_reminder"`
DailyReminderOnChange bool `json:"daily_reminder_on_change"`
Notifications bool `json:"notifications"`
}
type GitHubUserInfo struct {
UserID string
Token *oauth2.Token
GitHubUsername string
LastToDoPostAt int64
Settings *UserSettings
AllowedPrivateRepos bool
// MM34646ResetTokenDone is set for a user whose token has been reset for MM-34646.
MM34646ResetTokenDone bool
}
type OAuthCompleteEvent struct {
UserID string
Err error
}
type UserContext struct {
Context
GHInfo *GitHubUserInfo
}
type OAuthState struct {
UserID string `json:"user_id"`
Token string `json:"token"`
PrivateAllowed bool `json:"private_allowed"`
}
type OAuthBroker struct {
sendOAuthCompleteEvent func(event OAuthCompleteEvent)
lock sync.RWMutex // Protects closed and pingSubs
closed bool
oauthCompleteSubs map[string][]chan error
mapCreate sync.Once
}
func NewOAuthBroker(sendOAuthCompleteEvent func(event OAuthCompleteEvent)) *OAuthBroker {
return &OAuthBroker{
sendOAuthCompleteEvent: sendOAuthCompleteEvent,
}
}
func (ob *OAuthBroker) SubscribeOAuthComplete(userID string) <-chan error {
ob.lock.Lock()
defer ob.lock.Unlock()
ob.mapCreate.Do(func() {
ob.oauthCompleteSubs = make(map[string][]chan error)
})
ch := make(chan error, 1)
ob.oauthCompleteSubs[userID] = append(ob.oauthCompleteSubs[userID], ch)
return ch
}
func (ob *OAuthBroker) UnsubscribeOAuthComplete(userID string, ch <-chan error) {
ob.lock.Lock()
defer ob.lock.Unlock()
for i, sub := range ob.oauthCompleteSubs[userID] {
if sub == ch {
ob.oauthCompleteSubs[userID] = append(ob.oauthCompleteSubs[userID][:i], ob.oauthCompleteSubs[userID][i+1:]...)
break
}
}
}
func (ob *OAuthBroker) publishOAuthComplete(userID string, err error, fromCluster bool) {
ob.lock.Lock()
defer ob.lock.Unlock()
if ob.closed {
return
}
for _, userSub := range ob.oauthCompleteSubs[userID] {
// non-blocking send
select {
case userSub <- err:
default:
}
}
if !fromCluster {
ob.sendOAuthCompleteEvent(OAuthCompleteEvent{UserID: userID, Err: err})
}
}
func (ob *OAuthBroker) Close() {
ob.lock.Lock()
defer ob.lock.Unlock()
if !ob.closed {
ob.closed = true
for _, userSubs := range ob.oauthCompleteSubs {
for _, sub := range userSubs {
close(sub)
}
}
}
}