forked from mattermost/mattermost-plugin-github
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmm_34646_token_refresh.go
More file actions
129 lines (108 loc) · 3.24 KB
/
Copy pathmm_34646_token_refresh.go
File metadata and controls
129 lines (108 loc) · 3.24 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
package plugin
import (
"context"
"encoding/json"
"time"
"github.com/google/go-github/v48/github"
"github.com/pkg/errors"
"github.com/mattermost/mattermost-plugin-api/cluster"
"github.com/mattermost/mattermost-plugin-github/server/serializer"
)
const pageSize = 100
const delayBetweenUsers = 1 * time.Second
const delayToStart = 1 * time.Minute
func (p *Plugin) forceResetAllMM34646() error {
config := p.getConfiguration()
ctx := context.Background()
time.Sleep(delayToStart)
data, appErr := p.API.KVGet(mm34646DoneKey)
if appErr != nil {
return errors.Wrap(appErr, "failed check whether MM-34646 refresh is already done")
}
if len(data) > 0 {
// Already done
return nil
}
m, err := cluster.NewMutex(p.API, mm34646MutexKey)
if err != nil {
return errors.Wrap(err, "failed to create mutex")
}
m.Lock()
defer m.Unlock()
for page := 0; ; page++ {
keys, appErr := p.API.KVList(page, pageSize)
if appErr != nil {
return appErr
}
for _, key := range keys {
data, appErr := p.API.KVGet(key)
if appErr != nil {
p.API.LogWarn("failed to inspect key", "key", key, "error",
appErr.Error())
continue
}
tryInfo := serializer.GitHubUserInfo{}
err := json.Unmarshal(data, &tryInfo)
if err != nil {
// too noisy to report
continue
}
if tryInfo.MM34646ResetTokenDone {
continue
}
if tryInfo.Token == nil || tryInfo.Token.AccessToken == "" {
// too noisy to report
continue
}
info, errResp := p.getGitHubUserInfo(tryInfo.UserID)
if errResp != nil {
p.API.LogWarn("failed to retrieve GitHubUserInfo", "key", key, "user_id", tryInfo.UserID,
"error", errResp.Error())
continue
}
_, err = p.forceResetUserTokenMM34646(ctx, config, info)
if err != nil {
p.API.LogWarn("failed to reset GitHub user token", "key", key, "user_id", tryInfo.UserID,
"error", err.Error())
continue
}
time.Sleep(delayBetweenUsers)
}
if len(keys) == 0 {
break
}
}
_ = p.API.KVSet(mm34646DoneKey, []byte("done"))
return nil
}
func (p *Plugin) forceResetUserTokenMM34646(ctx context.Context, config *Configuration, info *serializer.GitHubUserInfo) (string, error) {
if info.MM34646ResetTokenDone {
return info.Token.AccessToken, nil
}
client, err := p.getResetUserTokenMM34646Client(config)
if err != nil {
return "", errors.Wrap(err, "failed to create a special GitHub client to refresh the user's token")
}
a, _, err := client.Authorizations.Reset(ctx, config.GitHubOAuthClientID, info.Token.AccessToken)
if err != nil {
return "", errors.Wrap(err, "failed to reset GitHub token")
}
if a.Token == nil {
return "", errors.Wrap(err, "failed to reset GitHub token: no token received")
}
info.Token.AccessToken = *a.Token
info.MM34646ResetTokenDone = true
err = p.storeGitHubUserInfo(info)
if err != nil {
return "", errors.Wrap(err, "failed to store updated serializer.GitHubUserInfo")
}
p.API.LogDebug("Updated user access token for MM-34646", "user_id", info.UserID)
return *a.Token, nil
}
func (p *Plugin) getResetUserTokenMM34646Client(config *Configuration) (*github.Client, error) {
t := &github.BasicAuthTransport{
Username: config.GitHubOAuthClientID,
Password: config.GitHubOAuthClientSecret,
}
return getGitHubClient(t.Client(), config)
}