15
15
package gitea
16
16
17
17
import (
18
+ "context"
18
19
"crypto/tls"
19
20
"fmt"
20
21
"net"
@@ -25,6 +26,7 @@ import (
25
26
"time"
26
27
27
28
gitsource "github.com/sorintlab/agola/internal/gitsources"
29
+ "golang.org/x/oauth2"
28
30
29
31
"code.gitea.io/sdk/gitea"
30
32
"github.com/pkg/errors"
@@ -37,14 +39,24 @@ const (
37
39
ClientNotFound = "404 Not Found"
38
40
)
39
41
42
+ var (
43
+ // gitea corrently doesn't have any auth scope
44
+ GiteaOauth2Scopes = []string {"" }
45
+ )
46
+
40
47
type Opts struct {
41
- URL string
42
- Token string
43
- SkipVerify bool
48
+ URL string
49
+ Token string
50
+ SkipVerify bool
51
+ Oauth2ClientID string
52
+ Oauth2Secret string
44
53
}
45
54
46
55
type Client struct {
47
- client * gitea.Client
56
+ client * gitea.Client
57
+ URL string
58
+ oauth2ClientID string
59
+ oauth2Secret string
48
60
}
49
61
50
62
// fromCommitStatus converts a gitsource commit status to a gitea commit status
@@ -90,10 +102,47 @@ func New(opts Opts) (*Client, error) {
90
102
client .SetHTTPClient (httpClient )
91
103
92
104
return & Client {
93
- client : client ,
105
+ client : client ,
106
+ URL : opts .URL ,
107
+ oauth2ClientID : opts .Oauth2ClientID ,
108
+ oauth2Secret : opts .Oauth2Secret ,
94
109
}, nil
95
110
}
96
111
112
+ func (c * Client ) oauth2Config (callbackURL string ) * oauth2.Config {
113
+ return & oauth2.Config {
114
+ ClientID : c .oauth2ClientID ,
115
+ ClientSecret : c .oauth2Secret ,
116
+ Scopes : GiteaOauth2Scopes ,
117
+ Endpoint : oauth2.Endpoint {
118
+ AuthURL : fmt .Sprintf ("%s/login/oauth/authorize" , c .URL ),
119
+ TokenURL : fmt .Sprintf ("%s/login/oauth/access_token" , c .URL ),
120
+ },
121
+ RedirectURL : callbackURL ,
122
+ }
123
+ }
124
+
125
+ func (c * Client ) GetOauth2AuthorizationURL (callbackURL , state string ) (string , error ) {
126
+ var config = c .oauth2Config (callbackURL )
127
+ return config .AuthCodeURL (state ), nil
128
+ }
129
+
130
+ func (c * Client ) RequestOauth2Token (callbackURL , code string ) (* oauth2.Token , error ) {
131
+ var config = c .oauth2Config (callbackURL )
132
+ token , err := config .Exchange (context .TODO (), code )
133
+ if err != nil {
134
+ return nil , errors .Wrapf (err , "cannot get oauth2 token" )
135
+ }
136
+ return token , nil
137
+ }
138
+
139
+ func (c * Client ) RefreshOauth2Token (refreshToken string ) (* oauth2.Token , error ) {
140
+ var config = c .oauth2Config ("" )
141
+ token := & oauth2.Token {RefreshToken : refreshToken }
142
+ ts := config .TokenSource (context .TODO (), token )
143
+ return ts .Token ()
144
+ }
145
+
97
146
func (c * Client ) LoginPassword (username , password , tokenName string ) (string , error ) {
98
147
// try to get agola access token if it already exists
99
148
var accessToken string
0 commit comments