Skip to content

Commit bd32a23

Browse files
authored
Merge branch 'main' into remove-dashboard-home-button
2 parents 679a55f + cad7059 commit bd32a23

File tree

12 files changed

+119
-50
lines changed

12 files changed

+119
-50
lines changed

integrations/pull_update_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ func createOutdatedPR(t *testing.T, actor, forkOrg *models.User) *models.PullReq
6060
assert.NoError(t, err)
6161
assert.NotEmpty(t, baseRepo)
6262

63-
headRepo, err := repo_module.ForkRepository(actor, forkOrg, baseRepo, "repo-pr-update", "desc")
63+
headRepo, err := repo_module.ForkRepository(actor, forkOrg, models.ForkRepoOptions{
64+
BaseRepo: baseRepo,
65+
Name: "repo-pr-update",
66+
Description: "desc",
67+
})
6468
assert.NoError(t, err)
6569
assert.NotEmpty(t, headRepo)
6670

models/models_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
package models
66

77
import (
8+
"encoding/json"
89
"io/ioutil"
910
"os"
1011
"path/filepath"
12+
"strings"
1113
"testing"
1214

1315
"code.gitea.io/gitea/modules/setting"
16+
"xorm.io/xorm/schemas"
1417

1518
"github.com/stretchr/testify/assert"
1619
)
@@ -32,3 +35,46 @@ func TestDumpDatabase(t *testing.T) {
3235
assert.NoError(t, DumpDatabase(filepath.Join(dir, dbType+".sql"), dbType))
3336
}
3437
}
38+
39+
type TestSource struct {
40+
Provider string
41+
ClientID string
42+
ClientSecret string
43+
OpenIDConnectAutoDiscoveryURL string
44+
IconURL string
45+
}
46+
47+
// FromDB fills up a LDAPConfig from serialized format.
48+
func (source *TestSource) FromDB(bs []byte) error {
49+
return json.Unmarshal(bs, &source)
50+
}
51+
52+
// ToDB exports a LDAPConfig to a serialized format.
53+
func (source *TestSource) ToDB() ([]byte, error) {
54+
return json.Marshal(source)
55+
}
56+
57+
func TestDumpLoginSource(t *testing.T) {
58+
assert.NoError(t, PrepareTestDatabase())
59+
60+
loginSourceSchema, err := x.TableInfo(new(LoginSource))
61+
assert.NoError(t, err)
62+
63+
RegisterLoginTypeConfig(LoginOAuth2, new(TestSource))
64+
65+
CreateLoginSource(&LoginSource{
66+
Type: LoginOAuth2,
67+
Name: "TestSource",
68+
IsActive: false,
69+
Cfg: &TestSource{
70+
Provider: "ConvertibleSourceName",
71+
ClientID: "42",
72+
},
73+
})
74+
75+
sb := new(strings.Builder)
76+
77+
x.DumpTables([]*schemas.Table{loginSourceSchema}, sb)
78+
79+
assert.Contains(t, sb.String(), `"Provider":"ConvertibleSourceName"`)
80+
}

models/repo.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,13 @@ type CreateRepoOptions struct {
10041004
MirrorInterval string
10051005
}
10061006

1007+
// ForkRepoOptions contains the fork repository options
1008+
type ForkRepoOptions struct {
1009+
BaseRepo *Repository
1010+
Name string
1011+
Description string
1012+
}
1013+
10071014
// GetRepoInitFile returns repository init files
10081015
func GetRepoInitFile(tp, name string) ([]byte, error) {
10091016
cleanedName := strings.TrimLeft(path.Clean("/"+name), "/")

modules/repository/fork.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ import (
1616
)
1717

1818
// ForkRepository forks a repository
19-
func ForkRepository(doer, owner *models.User, oldRepo *models.Repository, name, desc string) (_ *models.Repository, err error) {
20-
forkedRepo, err := oldRepo.GetUserFork(owner.ID)
19+
func ForkRepository(doer, owner *models.User, opts models.ForkRepoOptions) (_ *models.Repository, err error) {
20+
forkedRepo, err := opts.BaseRepo.GetUserFork(owner.ID)
2121
if err != nil {
2222
return nil, err
2323
}
2424
if forkedRepo != nil {
2525
return nil, models.ErrForkAlreadyExist{
2626
Uname: owner.Name,
27-
RepoName: oldRepo.FullName(),
27+
RepoName: opts.BaseRepo.FullName(),
2828
ForkName: forkedRepo.FullName(),
2929
}
3030
}
@@ -33,17 +33,17 @@ func ForkRepository(doer, owner *models.User, oldRepo *models.Repository, name,
3333
OwnerID: owner.ID,
3434
Owner: owner,
3535
OwnerName: owner.Name,
36-
Name: name,
37-
LowerName: strings.ToLower(name),
38-
Description: desc,
39-
DefaultBranch: oldRepo.DefaultBranch,
40-
IsPrivate: oldRepo.IsPrivate || oldRepo.Owner.Visibility == structs.VisibleTypePrivate,
41-
IsEmpty: oldRepo.IsEmpty,
36+
Name: opts.Name,
37+
LowerName: strings.ToLower(opts.Name),
38+
Description: opts.Description,
39+
DefaultBranch: opts.BaseRepo.DefaultBranch,
40+
IsPrivate: opts.BaseRepo.IsPrivate || opts.BaseRepo.Owner.Visibility == structs.VisibleTypePrivate,
41+
IsEmpty: opts.BaseRepo.IsEmpty,
4242
IsFork: true,
43-
ForkID: oldRepo.ID,
43+
ForkID: opts.BaseRepo.ID,
4444
}
4545

46-
oldRepoPath := oldRepo.RepoPath()
46+
oldRepoPath := opts.BaseRepo.RepoPath()
4747

4848
err = models.WithTx(func(ctx models.DBContext) error {
4949
if err = models.CreateRepository(ctx, doer, owner, repo, false); err != nil {
@@ -59,23 +59,23 @@ func ForkRepository(doer, owner *models.User, oldRepo *models.Repository, name,
5959
}
6060
}
6161

62-
if err = models.IncrementRepoForkNum(ctx, oldRepo.ID); err != nil {
62+
if err = models.IncrementRepoForkNum(ctx, opts.BaseRepo.ID); err != nil {
6363
rollbackRemoveFn()
6464
return err
6565
}
6666

6767
// copy lfs files failure should not be ignored
68-
if err := models.CopyLFS(ctx, repo, oldRepo); err != nil {
68+
if err := models.CopyLFS(ctx, repo, opts.BaseRepo); err != nil {
6969
rollbackRemoveFn()
7070
return err
7171
}
7272

7373
repoPath := models.RepoPath(owner.Name, repo.Name)
7474
if stdout, err := git.NewCommand(
7575
"clone", "--bare", oldRepoPath, repoPath).
76-
SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", oldRepo.FullName(), repo.FullName())).
76+
SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())).
7777
RunInDirTimeout(10*time.Minute, ""); err != nil {
78-
log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, oldRepo, stdout, err)
78+
log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, opts.BaseRepo, stdout, err)
7979
rollbackRemoveFn()
8080
return fmt.Errorf("git clone: %v", err)
8181
}
@@ -103,7 +103,7 @@ func ForkRepository(doer, owner *models.User, oldRepo *models.Repository, name,
103103
if err = repo.UpdateSize(ctx); err != nil {
104104
log.Error("Failed to update size for repository: %v", err)
105105
}
106-
if err := models.CopyLanguageStat(oldRepo, repo); err != nil {
106+
if err := models.CopyLanguageStat(opts.BaseRepo, repo); err != nil {
107107
log.Error("Copy language stat from oldRepo failed")
108108
}
109109

modules/repository/fork_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ func TestForkRepository(t *testing.T) {
1818
user := models.AssertExistsAndLoadBean(t, &models.User{ID: 13}).(*models.User)
1919
repo := models.AssertExistsAndLoadBean(t, &models.Repository{ID: 10}).(*models.Repository)
2020

21-
fork, err := ForkRepository(user, user, repo, "test", "test")
21+
fork, err := ForkRepository(user, user, models.ForkRepoOptions{
22+
BaseRepo: repo,
23+
Name: "test",
24+
Description: "test",
25+
})
2226
assert.Nil(t, fork)
2327
assert.Error(t, err)
2428
assert.True(t, models.IsErrForkAlreadyExist(err))

routers/api/v1/repo/fork.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,11 @@ func CreateFork(ctx *context.APIContext) {
123123
forker = org
124124
}
125125

126-
fork, err := repo_service.ForkRepository(ctx.User, forker, repo, repo.Name, repo.Description)
126+
fork, err := repo_service.ForkRepository(ctx.User, forker, models.ForkRepoOptions{
127+
BaseRepo: repo,
128+
Name: repo.Name,
129+
Description: repo.Description,
130+
})
127131
if err != nil {
128132
ctx.Error(http.StatusInternalServerError, "ForkRepository", err)
129133
return

routers/web/repo/pull.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,11 @@ func ForkPost(ctx *context.Context) {
225225
}
226226
}
227227

228-
repo, err := repo_service.ForkRepository(ctx.User, ctxUser, forkRepo, form.RepoName, form.Description)
228+
repo, err := repo_service.ForkRepository(ctx.User, ctxUser, models.ForkRepoOptions{
229+
BaseRepo: forkRepo,
230+
Name: form.RepoName,
231+
Description: form.Description,
232+
})
229233
if err != nil {
230234
ctx.Data["Err_RepoName"] = true
231235
switch {

routers/web/user/oauth.go

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ type AccessTokenResponse struct {
115115
IDToken string `json:"id_token,omitempty"`
116116
}
117117

118-
func newAccessTokenResponse(grant *models.OAuth2Grant, signingKey oauth2.JWTSigningKey) (*AccessTokenResponse, *AccessTokenError) {
118+
func newAccessTokenResponse(grant *models.OAuth2Grant, serverKey, clientKey oauth2.JWTSigningKey) (*AccessTokenResponse, *AccessTokenError) {
119119
if setting.OAuth2.InvalidateRefreshTokens {
120120
if err := grant.IncreaseCounter(); err != nil {
121121
return nil, &AccessTokenError{
@@ -133,7 +133,7 @@ func newAccessTokenResponse(grant *models.OAuth2Grant, signingKey oauth2.JWTSign
133133
ExpiresAt: expirationDate.AsTime().Unix(),
134134
},
135135
}
136-
signedAccessToken, err := accessToken.SignToken()
136+
signedAccessToken, err := accessToken.SignToken(serverKey)
137137
if err != nil {
138138
return nil, &AccessTokenError{
139139
ErrorCode: AccessTokenErrorCodeInvalidRequest,
@@ -151,7 +151,7 @@ func newAccessTokenResponse(grant *models.OAuth2Grant, signingKey oauth2.JWTSign
151151
ExpiresAt: refreshExpirationDate,
152152
},
153153
}
154-
signedRefreshToken, err := refreshToken.SignToken()
154+
signedRefreshToken, err := refreshToken.SignToken(serverKey)
155155
if err != nil {
156156
return nil, &AccessTokenError{
157157
ErrorCode: AccessTokenErrorCodeInvalidRequest,
@@ -207,7 +207,7 @@ func newAccessTokenResponse(grant *models.OAuth2Grant, signingKey oauth2.JWTSign
207207
idToken.EmailVerified = user.IsActive
208208
}
209209

210-
signedIDToken, err = idToken.SignToken(signingKey)
210+
signedIDToken, err = idToken.SignToken(clientKey)
211211
if err != nil {
212212
return nil, &AccessTokenError{
213213
ErrorCode: AccessTokenErrorCodeInvalidRequest,
@@ -265,7 +265,7 @@ func IntrospectOAuth(ctx *context.Context) {
265265
}
266266

267267
form := web.GetForm(ctx).(*forms.IntrospectTokenForm)
268-
token, err := oauth2.ParseToken(form.Token)
268+
token, err := oauth2.ParseToken(form.Token, oauth2.DefaultSigningKey)
269269
if err == nil {
270270
if token.Valid() == nil {
271271
grant, err := models.GetOAuth2GrantByID(token.GrantID)
@@ -544,24 +544,25 @@ func AccessTokenOAuth(ctx *context.Context) {
544544
}
545545
}
546546

547-
signingKey := oauth2.DefaultSigningKey
548-
if signingKey.IsSymmetric() {
549-
clientKey, err := oauth2.CreateJWTSigningKey(signingKey.SigningMethod().Alg(), []byte(form.ClientSecret))
547+
serverKey := oauth2.DefaultSigningKey
548+
clientKey := serverKey
549+
if serverKey.IsSymmetric() {
550+
var err error
551+
clientKey, err = oauth2.CreateJWTSigningKey(serverKey.SigningMethod().Alg(), []byte(form.ClientSecret))
550552
if err != nil {
551553
handleAccessTokenError(ctx, AccessTokenError{
552554
ErrorCode: AccessTokenErrorCodeInvalidRequest,
553555
ErrorDescription: "Error creating signing key",
554556
})
555557
return
556558
}
557-
signingKey = clientKey
558559
}
559560

560561
switch form.GrantType {
561562
case "refresh_token":
562-
handleRefreshToken(ctx, form, signingKey)
563+
handleRefreshToken(ctx, form, serverKey, clientKey)
563564
case "authorization_code":
564-
handleAuthorizationCode(ctx, form, signingKey)
565+
handleAuthorizationCode(ctx, form, serverKey, clientKey)
565566
default:
566567
handleAccessTokenError(ctx, AccessTokenError{
567568
ErrorCode: AccessTokenErrorCodeUnsupportedGrantType,
@@ -570,8 +571,8 @@ func AccessTokenOAuth(ctx *context.Context) {
570571
}
571572
}
572573

573-
func handleRefreshToken(ctx *context.Context, form forms.AccessTokenForm, signingKey oauth2.JWTSigningKey) {
574-
token, err := oauth2.ParseToken(form.RefreshToken)
574+
func handleRefreshToken(ctx *context.Context, form forms.AccessTokenForm, serverKey, clientKey oauth2.JWTSigningKey) {
575+
token, err := oauth2.ParseToken(form.RefreshToken, serverKey)
575576
if err != nil {
576577
handleAccessTokenError(ctx, AccessTokenError{
577578
ErrorCode: AccessTokenErrorCodeUnauthorizedClient,
@@ -598,15 +599,15 @@ func handleRefreshToken(ctx *context.Context, form forms.AccessTokenForm, signin
598599
log.Warn("A client tried to use a refresh token for grant_id = %d was used twice!", grant.ID)
599600
return
600601
}
601-
accessToken, tokenErr := newAccessTokenResponse(grant, signingKey)
602+
accessToken, tokenErr := newAccessTokenResponse(grant, serverKey, clientKey)
602603
if tokenErr != nil {
603604
handleAccessTokenError(ctx, *tokenErr)
604605
return
605606
}
606607
ctx.JSON(http.StatusOK, accessToken)
607608
}
608609

609-
func handleAuthorizationCode(ctx *context.Context, form forms.AccessTokenForm, signingKey oauth2.JWTSigningKey) {
610+
func handleAuthorizationCode(ctx *context.Context, form forms.AccessTokenForm, serverKey, clientKey oauth2.JWTSigningKey) {
610611
app, err := models.GetOAuth2ApplicationByClientID(form.ClientID)
611612
if err != nil {
612613
handleAccessTokenError(ctx, AccessTokenError{
@@ -660,7 +661,7 @@ func handleAuthorizationCode(ctx *context.Context, form forms.AccessTokenForm, s
660661
ErrorDescription: "cannot proceed your request",
661662
})
662663
}
663-
resp, tokenErr := newAccessTokenResponse(authorizationCode.Grant, signingKey)
664+
resp, tokenErr := newAccessTokenResponse(authorizationCode.Grant, serverKey, clientKey)
664665
if tokenErr != nil {
665666
handleAccessTokenError(ctx, *tokenErr)
666667
return

routers/web/user/oauth_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,8 @@ func createAndParseToken(t *testing.T, grant *models.OAuth2Grant) *oauth2.OIDCTo
1818
signingKey, err := oauth2.CreateJWTSigningKey("HS256", make([]byte, 32))
1919
assert.NoError(t, err)
2020
assert.NotNil(t, signingKey)
21-
oauth2.DefaultSigningKey = signingKey
2221

23-
response, terr := newAccessTokenResponse(grant, signingKey)
22+
response, terr := newAccessTokenResponse(grant, signingKey, signingKey)
2423
assert.Nil(t, terr)
2524
assert.NotNil(t, response)
2625

services/auth/oauth2.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ func CheckOAuthAccessToken(accessToken string) int64 {
2929
if !strings.Contains(accessToken, ".") {
3030
return 0
3131
}
32-
token, err := oauth2.ParseToken(accessToken)
32+
token, err := oauth2.ParseToken(accessToken, oauth2.DefaultSigningKey)
3333
if err != nil {
34-
log.Trace("ParseOAuth2Token: %v", err)
34+
log.Trace("oauth2.ParseToken: %v", err)
3535
return 0
3636
}
3737
var grant *models.OAuth2Grant

services/auth/source/oauth2/token.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ type Token struct {
4040
}
4141

4242
// ParseToken parses a signed jwt string
43-
func ParseToken(jwtToken string) (*Token, error) {
43+
func ParseToken(jwtToken string, signingKey JWTSigningKey) (*Token, error) {
4444
parsedToken, err := jwt.ParseWithClaims(jwtToken, &Token{}, func(token *jwt.Token) (interface{}, error) {
45-
if token.Method == nil || token.Method.Alg() != DefaultSigningKey.SigningMethod().Alg() {
45+
if token.Method == nil || token.Method.Alg() != signingKey.SigningMethod().Alg() {
4646
return nil, fmt.Errorf("unexpected signing algo: %v", token.Header["alg"])
4747
}
48-
return DefaultSigningKey.VerifyKey(), nil
48+
return signingKey.VerifyKey(), nil
4949
})
5050
if err != nil {
5151
return nil, err
@@ -59,11 +59,11 @@ func ParseToken(jwtToken string) (*Token, error) {
5959
}
6060

6161
// SignToken signs the token with the JWT secret
62-
func (token *Token) SignToken() (string, error) {
62+
func (token *Token) SignToken(signingKey JWTSigningKey) (string, error) {
6363
token.IssuedAt = time.Now().Unix()
64-
jwtToken := jwt.NewWithClaims(DefaultSigningKey.SigningMethod(), token)
65-
DefaultSigningKey.PreProcessToken(jwtToken)
66-
return jwtToken.SignedString(DefaultSigningKey.SignKey())
64+
jwtToken := jwt.NewWithClaims(signingKey.SigningMethod(), token)
65+
signingKey.PreProcessToken(jwtToken)
66+
return jwtToken.SignedString(signingKey.SignKey())
6767
}
6868

6969
// OIDCToken represents an OpenID Connect id_token

services/repository/repository.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ func DeleteUnadoptedRepository(doer, owner *models.User, name string) error {
4747
}
4848

4949
// ForkRepository forks a repository
50-
func ForkRepository(doer, u *models.User, oldRepo *models.Repository, name, desc string) (*models.Repository, error) {
51-
repo, err := repo_module.ForkRepository(doer, u, oldRepo, name, desc)
50+
func ForkRepository(doer, u *models.User, opts models.ForkRepoOptions) (*models.Repository, error) {
51+
repo, err := repo_module.ForkRepository(doer, u, opts)
5252
if err != nil {
5353
return nil, err
5454
}
5555

56-
notification.NotifyForkRepository(doer, oldRepo, repo)
56+
notification.NotifyForkRepository(doer, opts.BaseRepo, repo)
5757

5858
return repo, nil
5959
}

0 commit comments

Comments
 (0)