(ctx context.Context, user *database.User)
| 1039 | } |
| 1040 | |
| 1041 | func (s *Server) userAccessToken(ctx context.Context, user *database.User) (string, error) { |
| 1042 | if user.GithubTokenExpiresOn != nil && user.GithubTokenExpiresOn.After(time.Now().Add(5*time.Minute)) { |
| 1043 | return user.GithubToken, nil |
| 1044 | } |
| 1045 | |
| 1046 | if user.GithubRefreshToken == "" { |
| 1047 | return "", errors.New("refresh token is empty") |
| 1048 | } |
| 1049 | |
| 1050 | oauthConf := &oauth2.Config{ |
| 1051 | ClientID: s.opts.GithubClientID, |
| 1052 | ClientSecret: s.opts.GithubClientSecret, |
| 1053 | Endpoint: githuboauth.Endpoint, |
| 1054 | } |
| 1055 | |
| 1056 | src := oauthConf.TokenSource(ctx, &oauth2.Token{RefreshToken: user.GithubRefreshToken}) |
| 1057 | oauthToken, err := src.Token() |
| 1058 | if err != nil { |
| 1059 | return "", err |
| 1060 | } |
| 1061 | |
| 1062 | // refresh token changes after using it for getting a new token |
| 1063 | _, err = s.admin.DB.UpdateUser(ctx, user.ID, &database.UpdateUserOptions{ |
| 1064 | DisplayName: user.DisplayName, |
| 1065 | PhotoURL: user.PhotoURL, |
| 1066 | GithubUsername: user.GithubUsername, |
| 1067 | GithubToken: oauthToken.AccessToken, |
| 1068 | GithubTokenExpiresOn: &oauthToken.Expiry, |
| 1069 | GithubRefreshToken: oauthToken.RefreshToken, |
| 1070 | QuotaSingleuserOrgs: user.QuotaSingleuserOrgs, |
| 1071 | QuotaTrialOrgs: user.QuotaTrialOrgs, |
| 1072 | PreferenceTimeZone: user.PreferenceTimeZone, |
| 1073 | }) |
| 1074 | if err != nil { |
| 1075 | s.logger.Error("failed to update user's github refresh token") |
| 1076 | return "", err |
| 1077 | } |
| 1078 | |
| 1079 | return oauthToken.AccessToken, nil |
| 1080 | } |
| 1081 | |
| 1082 | func (s *Server) fetchReposForUser(ctx context.Context, client *github.Client) ([]*adminv1.ListGithubUserReposResponse_Repo, error) { |
| 1083 | repos := make([]*adminv1.ListGithubUserReposResponse_Repo, 0) |
no test coverage detected