2018-01-07 00:55:53 +02:00
// Copyright 2017 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2018-01-07 00:55:53 +02:00
package repo
import (
"net/http"
"testing"
"code.gitea.io/gitea/models"
2021-12-10 16:14:24 +08:00
asymkey_model "code.gitea.io/gitea/models/asymkey"
2022-03-29 14:29:02 +08:00
"code.gitea.io/gitea/models/organization"
2021-11-28 19:58:28 +08:00
"code.gitea.io/gitea/models/perm"
2021-12-10 09:27:50 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-11-12 22:36:47 +08:00
"code.gitea.io/gitea/models/unittest"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2018-08-07 02:59:42 +01:00
"code.gitea.io/gitea/modules/context"
2019-12-28 02:08:05 +00:00
"code.gitea.io/gitea/modules/setting"
2018-01-07 00:55:53 +02:00
"code.gitea.io/gitea/modules/test"
2021-01-26 23:36:53 +08:00
"code.gitea.io/gitea/modules/web"
2021-04-06 20:44:05 +01:00
"code.gitea.io/gitea/services/forms"
2018-01-07 00:55:53 +02:00
"github.com/stretchr/testify/assert"
)
2019-12-28 02:08:05 +00:00
func createSSHAuthorizedKeysTmpPath ( t * testing . T ) func ( ) {
2022-09-04 23:14:53 +08:00
tmpDir := t . TempDir ( )
2019-12-28 02:08:05 +00:00
oldPath := setting . SSH . RootPath
setting . SSH . RootPath = tmpDir
return func ( ) {
setting . SSH . RootPath = oldPath
}
}
2018-01-07 00:55:53 +02:00
func TestAddReadOnlyDeployKey ( t * testing . T ) {
2019-12-28 02:08:05 +00:00
if deferable := createSSHAuthorizedKeysTmpPath ( t ) ; deferable != nil {
defer deferable ( )
} else {
return
}
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-01-07 00:55:53 +02:00
ctx := test . MockContext ( t , "user2/repo1/settings/keys" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 2 )
2021-04-06 20:44:05 +01:00
addKeyForm := forms . AddKeyForm {
2018-01-07 00:55:53 +02:00
Title : "read-only" ,
2020-10-09 07:52:57 +01:00
Content : "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n" ,
2018-01-07 00:55:53 +02:00
}
2021-01-26 23:36:53 +08:00
web . SetForm ( ctx , & addKeyForm )
DeployKeysPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-01-07 00:55:53 +02:00
2021-12-10 16:14:24 +08:00
unittest . AssertExistsAndLoadBean ( t , & asymkey_model . DeployKey {
2018-01-07 00:55:53 +02:00
Name : addKeyForm . Title ,
Content : addKeyForm . Content ,
2021-11-28 19:58:28 +08:00
Mode : perm . AccessModeRead ,
2018-01-07 00:55:53 +02:00
} )
}
func TestAddReadWriteOnlyDeployKey ( t * testing . T ) {
2019-12-28 02:08:05 +00:00
if deferable := createSSHAuthorizedKeysTmpPath ( t ) ; deferable != nil {
defer deferable ( )
} else {
return
}
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-01-07 00:55:53 +02:00
ctx := test . MockContext ( t , "user2/repo1/settings/keys" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 2 )
2021-04-06 20:44:05 +01:00
addKeyForm := forms . AddKeyForm {
2018-01-07 00:55:53 +02:00
Title : "read-write" ,
2020-10-09 07:52:57 +01:00
Content : "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n" ,
2018-01-07 00:55:53 +02:00
IsWritable : true ,
}
2021-01-26 23:36:53 +08:00
web . SetForm ( ctx , & addKeyForm )
DeployKeysPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-01-07 00:55:53 +02:00
2021-12-10 16:14:24 +08:00
unittest . AssertExistsAndLoadBean ( t , & asymkey_model . DeployKey {
2018-01-07 00:55:53 +02:00
Name : addKeyForm . Title ,
Content : addKeyForm . Content ,
2021-11-28 19:58:28 +08:00
Mode : perm . AccessModeWrite ,
2018-01-07 00:55:53 +02:00
} )
}
2018-08-07 02:59:42 +01:00
func TestCollaborationPost ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-08-07 02:59:42 +01:00
ctx := test . MockContext ( t , "user2/repo1/issues/labels" )
test . LoadUser ( t , ctx , 2 )
test . LoadUser ( t , ctx , 4 )
test . LoadRepo ( t , ctx , 1 )
ctx . Req . Form . Set ( "collaborator" , "user4" )
2021-11-24 17:49:20 +08:00
u := & user_model . User {
2018-08-07 02:59:42 +01:00
LowerName : "user2" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeIndividual ,
2018-08-07 02:59:42 +01:00
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2018-08-07 02:59:42 +01:00
ID : 2 ,
Owner : u ,
}
repo := & context . Repository {
Owner : u ,
Repository : re ,
}
ctx . Repo = repo
CollaborationPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-08-07 02:59:42 +01:00
2022-05-11 18:09:36 +08:00
exists , err := repo_model . IsCollaborator ( ctx , re . ID , 4 )
2018-08-07 02:59:42 +01:00
assert . NoError ( t , err )
assert . True ( t , exists )
}
2018-08-07 11:01:06 +01:00
func TestCollaborationPost_InactiveUser ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-08-07 11:01:06 +01:00
ctx := test . MockContext ( t , "user2/repo1/issues/labels" )
test . LoadUser ( t , ctx , 2 )
test . LoadUser ( t , ctx , 9 )
test . LoadRepo ( t , ctx , 1 )
ctx . Req . Form . Set ( "collaborator" , "user9" )
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2018-08-07 11:01:06 +01:00
LowerName : "user2" ,
} ,
}
ctx . Repo = repo
CollaborationPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-08-07 11:01:06 +01:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
2018-08-07 02:59:42 +01:00
func TestCollaborationPost_AddCollaboratorTwice ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-08-07 02:59:42 +01:00
ctx := test . MockContext ( t , "user2/repo1/issues/labels" )
test . LoadUser ( t , ctx , 2 )
test . LoadUser ( t , ctx , 4 )
test . LoadRepo ( t , ctx , 1 )
ctx . Req . Form . Set ( "collaborator" , "user4" )
2021-11-24 17:49:20 +08:00
u := & user_model . User {
2018-08-07 02:59:42 +01:00
LowerName : "user2" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeIndividual ,
2018-08-07 02:59:42 +01:00
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2018-08-07 02:59:42 +01:00
ID : 2 ,
Owner : u ,
}
repo := & context . Repository {
Owner : u ,
Repository : re ,
}
ctx . Repo = repo
CollaborationPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-08-07 02:59:42 +01:00
2022-05-11 18:09:36 +08:00
exists , err := repo_model . IsCollaborator ( ctx , re . ID , 4 )
2018-08-07 02:59:42 +01:00
assert . NoError ( t , err )
assert . True ( t , exists )
// Try adding the same collaborator again
CollaborationPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-08-07 02:59:42 +01:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
func TestCollaborationPost_NonExistentUser ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2018-08-07 02:59:42 +01:00
ctx := test . MockContext ( t , "user2/repo1/issues/labels" )
test . LoadUser ( t , ctx , 2 )
test . LoadRepo ( t , ctx , 1 )
ctx . Req . Form . Set ( "collaborator" , "user34" )
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2018-08-07 02:59:42 +01:00
LowerName : "user2" ,
} ,
}
ctx . Repo = repo
CollaborationPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2018-08-07 02:59:42 +01:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
2019-09-23 22:08:03 +02:00
func TestAddTeamPost ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2019-09-23 22:08:03 +02:00
ctx := test . MockContext ( t , "org26/repo43" )
ctx . Req . Form . Set ( "team" , "team11" )
2021-11-24 17:49:20 +08:00
org := & user_model . User {
2019-09-23 22:08:03 +02:00
LowerName : "org26" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeOrganization ,
2019-09-23 22:08:03 +02:00
}
2022-03-29 14:29:02 +08:00
team := & organization . Team {
2019-09-23 22:08:03 +02:00
ID : 11 ,
OrgID : 26 ,
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2019-09-23 22:08:03 +02:00
ID : 43 ,
Owner : org ,
OwnerID : 26 ,
}
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2019-09-23 22:08:03 +02:00
ID : 26 ,
LowerName : "org26" ,
RepoAdminChangeTeamAccess : true ,
} ,
Repository : re ,
}
ctx . Repo = repo
AddTeamPost ( ctx )
2022-03-29 14:29:02 +08:00
assert . True ( t , models . HasRepository ( team , re . ID ) )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2019-09-23 22:08:03 +02:00
assert . Empty ( t , ctx . Flash . ErrorMsg )
}
func TestAddTeamPost_NotAllowed ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2019-09-23 22:08:03 +02:00
ctx := test . MockContext ( t , "org26/repo43" )
ctx . Req . Form . Set ( "team" , "team11" )
2021-11-24 17:49:20 +08:00
org := & user_model . User {
2019-09-23 22:08:03 +02:00
LowerName : "org26" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeOrganization ,
2019-09-23 22:08:03 +02:00
}
2022-03-29 14:29:02 +08:00
team := & organization . Team {
2019-09-23 22:08:03 +02:00
ID : 11 ,
OrgID : 26 ,
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2019-09-23 22:08:03 +02:00
ID : 43 ,
Owner : org ,
OwnerID : 26 ,
}
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2019-09-23 22:08:03 +02:00
ID : 26 ,
LowerName : "org26" ,
RepoAdminChangeTeamAccess : false ,
} ,
Repository : re ,
}
ctx . Repo = repo
AddTeamPost ( ctx )
2022-03-29 14:29:02 +08:00
assert . False ( t , models . HasRepository ( team , re . ID ) )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2019-09-23 22:08:03 +02:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
func TestAddTeamPost_AddTeamTwice ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2019-09-23 22:08:03 +02:00
ctx := test . MockContext ( t , "org26/repo43" )
ctx . Req . Form . Set ( "team" , "team11" )
2021-11-24 17:49:20 +08:00
org := & user_model . User {
2019-09-23 22:08:03 +02:00
LowerName : "org26" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeOrganization ,
2019-09-23 22:08:03 +02:00
}
2022-03-29 14:29:02 +08:00
team := & organization . Team {
2019-09-23 22:08:03 +02:00
ID : 11 ,
OrgID : 26 ,
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2019-09-23 22:08:03 +02:00
ID : 43 ,
Owner : org ,
OwnerID : 26 ,
}
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2019-09-23 22:08:03 +02:00
ID : 26 ,
LowerName : "org26" ,
RepoAdminChangeTeamAccess : true ,
} ,
Repository : re ,
}
ctx . Repo = repo
AddTeamPost ( ctx )
AddTeamPost ( ctx )
2022-03-29 14:29:02 +08:00
assert . True ( t , models . HasRepository ( team , re . ID ) )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2019-09-23 22:08:03 +02:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
func TestAddTeamPost_NonExistentTeam ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2019-09-23 22:08:03 +02:00
ctx := test . MockContext ( t , "org26/repo43" )
ctx . Req . Form . Set ( "team" , "team-non-existent" )
2021-11-24 17:49:20 +08:00
org := & user_model . User {
2019-09-23 22:08:03 +02:00
LowerName : "org26" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeOrganization ,
2019-09-23 22:08:03 +02:00
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2019-09-23 22:08:03 +02:00
ID : 43 ,
Owner : org ,
OwnerID : 26 ,
}
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2019-09-23 22:08:03 +02:00
ID : 26 ,
LowerName : "org26" ,
RepoAdminChangeTeamAccess : true ,
} ,
Repository : re ,
}
ctx . Repo = repo
AddTeamPost ( ctx )
2022-03-23 05:54:07 +01:00
assert . EqualValues ( t , http . StatusSeeOther , ctx . Resp . Status ( ) )
2019-09-23 22:08:03 +02:00
assert . NotEmpty ( t , ctx . Flash . ErrorMsg )
}
func TestDeleteTeam ( t * testing . T ) {
2021-11-12 22:36:47 +08:00
unittest . PrepareTestEnv ( t )
2019-09-23 22:08:03 +02:00
ctx := test . MockContext ( t , "org3/team1/repo3" )
ctx . Req . Form . Set ( "id" , "2" )
2021-11-24 17:49:20 +08:00
org := & user_model . User {
2019-09-23 22:08:03 +02:00
LowerName : "org3" ,
2021-11-24 17:49:20 +08:00
Type : user_model . UserTypeOrganization ,
2019-09-23 22:08:03 +02:00
}
2022-03-29 14:29:02 +08:00
team := & organization . Team {
2019-09-23 22:08:03 +02:00
ID : 2 ,
OrgID : 3 ,
}
2021-12-10 09:27:50 +08:00
re := & repo_model . Repository {
2019-09-23 22:08:03 +02:00
ID : 3 ,
Owner : org ,
OwnerID : 3 ,
}
repo := & context . Repository {
2021-11-24 17:49:20 +08:00
Owner : & user_model . User {
2019-09-23 22:08:03 +02:00
ID : 3 ,
LowerName : "org3" ,
RepoAdminChangeTeamAccess : true ,
} ,
Repository : re ,
}
ctx . Repo = repo
DeleteTeam ( ctx )
2022-03-29 14:29:02 +08:00
assert . False ( t , models . HasRepository ( team , re . ID ) )
2019-09-23 22:08:03 +02:00
}