-
Notifications
You must be signed in to change notification settings - Fork 168
Expand file tree
/
Copy pathmm_34646_token_refresh.go
More file actions
128 lines (106 loc) · 3.12 KB
/
mm_34646_token_refresh.go
File metadata and controls
128 lines (106 loc) · 3.12 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
package plugin
import (
"context"
"time"
"github.com/google/go-github/v54/github"
"github.com/pkg/errors"
"github.com/mattermost/mattermost/server/public/pluginapi/cluster"
)
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)
var data []byte
err := p.store.Get(mm34646DoneKey, &data)
if err != nil {
return errors.Wrap(err, "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++ {
var keys []string
keys, err = p.store.ListKeys(page, pageSize)
if err != nil {
return err
}
for _, key := range keys {
var tryInfo GitHubUserInfo
err = p.store.Get(key, &tryInfo)
if err != nil {
p.client.Log.Warn("failed to inspect key", "key", key, "error",
err.Error())
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.client.Log.Warn("failed to retrieve GitHubUserInfo", "key", key, "user_id", tryInfo.UserID,
"error", errResp.Error())
continue
}
_, err = p.forceResetUserTokenMM34646(ctx, config, info)
if err != nil {
p.client.Log.Warn("failed to reset GitHub user token", "key", key, "user_id", tryInfo.UserID,
"error", err.Error())
continue
}
time.Sleep(delayBetweenUsers)
}
if len(keys) == 0 {
break
}
}
_, err = p.store.Set(mm34646DoneKey, []byte("done"))
if err != nil {
return err
}
return nil
}
func (p *Plugin) forceResetUserTokenMM34646(ctx context.Context, config *Configuration, info *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.client.Log.Debug("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)
}