code.gitea.io/gitea@v1.21.7/routers/web/repo/setting/settings_test.go (about)

     1  // Copyright 2017 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package setting
     5  
     6  import (
     7  	"net/http"
     8  	"testing"
     9  
    10  	asymkey_model "code.gitea.io/gitea/models/asymkey"
    11  	"code.gitea.io/gitea/models/db"
    12  	"code.gitea.io/gitea/models/organization"
    13  	"code.gitea.io/gitea/models/perm"
    14  	repo_model "code.gitea.io/gitea/models/repo"
    15  	"code.gitea.io/gitea/models/unittest"
    16  	user_model "code.gitea.io/gitea/models/user"
    17  	"code.gitea.io/gitea/modules/context"
    18  	"code.gitea.io/gitea/modules/contexttest"
    19  	"code.gitea.io/gitea/modules/setting"
    20  	"code.gitea.io/gitea/modules/web"
    21  	"code.gitea.io/gitea/services/forms"
    22  	repo_service "code.gitea.io/gitea/services/repository"
    23  
    24  	"github.com/stretchr/testify/assert"
    25  )
    26  
    27  func createSSHAuthorizedKeysTmpPath(t *testing.T) func() {
    28  	tmpDir := t.TempDir()
    29  
    30  	oldPath := setting.SSH.RootPath
    31  	setting.SSH.RootPath = tmpDir
    32  
    33  	return func() {
    34  		setting.SSH.RootPath = oldPath
    35  	}
    36  }
    37  
    38  func TestAddReadOnlyDeployKey(t *testing.T) {
    39  	if deferable := createSSHAuthorizedKeysTmpPath(t); deferable != nil {
    40  		defer deferable()
    41  	} else {
    42  		return
    43  	}
    44  	unittest.PrepareTestEnv(t)
    45  
    46  	ctx, _ := contexttest.MockContext(t, "user2/repo1/settings/keys")
    47  
    48  	contexttest.LoadUser(t, ctx, 2)
    49  	contexttest.LoadRepo(t, ctx, 2)
    50  
    51  	addKeyForm := forms.AddKeyForm{
    52  		Title:   "read-only",
    53  		Content: "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
    54  	}
    55  	web.SetForm(ctx, &addKeyForm)
    56  	DeployKeysPost(ctx)
    57  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
    58  
    59  	unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
    60  		Name:    addKeyForm.Title,
    61  		Content: addKeyForm.Content,
    62  		Mode:    perm.AccessModeRead,
    63  	})
    64  }
    65  
    66  func TestAddReadWriteOnlyDeployKey(t *testing.T) {
    67  	if deferable := createSSHAuthorizedKeysTmpPath(t); deferable != nil {
    68  		defer deferable()
    69  	} else {
    70  		return
    71  	}
    72  
    73  	unittest.PrepareTestEnv(t)
    74  
    75  	ctx, _ := contexttest.MockContext(t, "user2/repo1/settings/keys")
    76  
    77  	contexttest.LoadUser(t, ctx, 2)
    78  	contexttest.LoadRepo(t, ctx, 2)
    79  
    80  	addKeyForm := forms.AddKeyForm{
    81  		Title:      "read-write",
    82  		Content:    "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n",
    83  		IsWritable: true,
    84  	}
    85  	web.SetForm(ctx, &addKeyForm)
    86  	DeployKeysPost(ctx)
    87  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
    88  
    89  	unittest.AssertExistsAndLoadBean(t, &asymkey_model.DeployKey{
    90  		Name:    addKeyForm.Title,
    91  		Content: addKeyForm.Content,
    92  		Mode:    perm.AccessModeWrite,
    93  	})
    94  }
    95  
    96  func TestCollaborationPost(t *testing.T) {
    97  	unittest.PrepareTestEnv(t)
    98  	ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
    99  	contexttest.LoadUser(t, ctx, 2)
   100  	contexttest.LoadUser(t, ctx, 4)
   101  	contexttest.LoadRepo(t, ctx, 1)
   102  
   103  	ctx.Req.Form.Set("collaborator", "user4")
   104  
   105  	u := &user_model.User{
   106  		LowerName: "user2",
   107  		Type:      user_model.UserTypeIndividual,
   108  	}
   109  
   110  	re := &repo_model.Repository{
   111  		ID:    2,
   112  		Owner: u,
   113  	}
   114  
   115  	repo := &context.Repository{
   116  		Owner:      u,
   117  		Repository: re,
   118  	}
   119  
   120  	ctx.Repo = repo
   121  
   122  	CollaborationPost(ctx)
   123  
   124  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   125  
   126  	exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
   127  	assert.NoError(t, err)
   128  	assert.True(t, exists)
   129  }
   130  
   131  func TestCollaborationPost_InactiveUser(t *testing.T) {
   132  	unittest.PrepareTestEnv(t)
   133  	ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
   134  	contexttest.LoadUser(t, ctx, 2)
   135  	contexttest.LoadUser(t, ctx, 9)
   136  	contexttest.LoadRepo(t, ctx, 1)
   137  
   138  	ctx.Req.Form.Set("collaborator", "user9")
   139  
   140  	repo := &context.Repository{
   141  		Owner: &user_model.User{
   142  			LowerName: "user2",
   143  		},
   144  	}
   145  
   146  	ctx.Repo = repo
   147  
   148  	CollaborationPost(ctx)
   149  
   150  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   151  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   152  }
   153  
   154  func TestCollaborationPost_AddCollaboratorTwice(t *testing.T) {
   155  	unittest.PrepareTestEnv(t)
   156  	ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
   157  	contexttest.LoadUser(t, ctx, 2)
   158  	contexttest.LoadUser(t, ctx, 4)
   159  	contexttest.LoadRepo(t, ctx, 1)
   160  
   161  	ctx.Req.Form.Set("collaborator", "user4")
   162  
   163  	u := &user_model.User{
   164  		LowerName: "user2",
   165  		Type:      user_model.UserTypeIndividual,
   166  	}
   167  
   168  	re := &repo_model.Repository{
   169  		ID:    2,
   170  		Owner: u,
   171  	}
   172  
   173  	repo := &context.Repository{
   174  		Owner:      u,
   175  		Repository: re,
   176  	}
   177  
   178  	ctx.Repo = repo
   179  
   180  	CollaborationPost(ctx)
   181  
   182  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   183  
   184  	exists, err := repo_model.IsCollaborator(ctx, re.ID, 4)
   185  	assert.NoError(t, err)
   186  	assert.True(t, exists)
   187  
   188  	// Try adding the same collaborator again
   189  	CollaborationPost(ctx)
   190  
   191  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   192  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   193  }
   194  
   195  func TestCollaborationPost_NonExistentUser(t *testing.T) {
   196  	unittest.PrepareTestEnv(t)
   197  	ctx, _ := contexttest.MockContext(t, "user2/repo1/issues/labels")
   198  	contexttest.LoadUser(t, ctx, 2)
   199  	contexttest.LoadRepo(t, ctx, 1)
   200  
   201  	ctx.Req.Form.Set("collaborator", "user34")
   202  
   203  	repo := &context.Repository{
   204  		Owner: &user_model.User{
   205  			LowerName: "user2",
   206  		},
   207  	}
   208  
   209  	ctx.Repo = repo
   210  
   211  	CollaborationPost(ctx)
   212  
   213  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   214  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   215  }
   216  
   217  func TestAddTeamPost(t *testing.T) {
   218  	unittest.PrepareTestEnv(t)
   219  	ctx, _ := contexttest.MockContext(t, "org26/repo43")
   220  
   221  	ctx.Req.Form.Set("team", "team11")
   222  
   223  	org := &user_model.User{
   224  		LowerName: "org26",
   225  		Type:      user_model.UserTypeOrganization,
   226  	}
   227  
   228  	team := &organization.Team{
   229  		ID:    11,
   230  		OrgID: 26,
   231  	}
   232  
   233  	re := &repo_model.Repository{
   234  		ID:      43,
   235  		Owner:   org,
   236  		OwnerID: 26,
   237  	}
   238  
   239  	repo := &context.Repository{
   240  		Owner: &user_model.User{
   241  			ID:                        26,
   242  			LowerName:                 "org26",
   243  			RepoAdminChangeTeamAccess: true,
   244  		},
   245  		Repository: re,
   246  	}
   247  
   248  	ctx.Repo = repo
   249  
   250  	AddTeamPost(ctx)
   251  
   252  	assert.True(t, repo_service.HasRepository(db.DefaultContext, team, re.ID))
   253  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   254  	assert.Empty(t, ctx.Flash.ErrorMsg)
   255  }
   256  
   257  func TestAddTeamPost_NotAllowed(t *testing.T) {
   258  	unittest.PrepareTestEnv(t)
   259  	ctx, _ := contexttest.MockContext(t, "org26/repo43")
   260  
   261  	ctx.Req.Form.Set("team", "team11")
   262  
   263  	org := &user_model.User{
   264  		LowerName: "org26",
   265  		Type:      user_model.UserTypeOrganization,
   266  	}
   267  
   268  	team := &organization.Team{
   269  		ID:    11,
   270  		OrgID: 26,
   271  	}
   272  
   273  	re := &repo_model.Repository{
   274  		ID:      43,
   275  		Owner:   org,
   276  		OwnerID: 26,
   277  	}
   278  
   279  	repo := &context.Repository{
   280  		Owner: &user_model.User{
   281  			ID:                        26,
   282  			LowerName:                 "org26",
   283  			RepoAdminChangeTeamAccess: false,
   284  		},
   285  		Repository: re,
   286  	}
   287  
   288  	ctx.Repo = repo
   289  
   290  	AddTeamPost(ctx)
   291  
   292  	assert.False(t, repo_service.HasRepository(db.DefaultContext, team, re.ID))
   293  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   294  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   295  }
   296  
   297  func TestAddTeamPost_AddTeamTwice(t *testing.T) {
   298  	unittest.PrepareTestEnv(t)
   299  	ctx, _ := contexttest.MockContext(t, "org26/repo43")
   300  
   301  	ctx.Req.Form.Set("team", "team11")
   302  
   303  	org := &user_model.User{
   304  		LowerName: "org26",
   305  		Type:      user_model.UserTypeOrganization,
   306  	}
   307  
   308  	team := &organization.Team{
   309  		ID:    11,
   310  		OrgID: 26,
   311  	}
   312  
   313  	re := &repo_model.Repository{
   314  		ID:      43,
   315  		Owner:   org,
   316  		OwnerID: 26,
   317  	}
   318  
   319  	repo := &context.Repository{
   320  		Owner: &user_model.User{
   321  			ID:                        26,
   322  			LowerName:                 "org26",
   323  			RepoAdminChangeTeamAccess: true,
   324  		},
   325  		Repository: re,
   326  	}
   327  
   328  	ctx.Repo = repo
   329  
   330  	AddTeamPost(ctx)
   331  
   332  	AddTeamPost(ctx)
   333  	assert.True(t, repo_service.HasRepository(db.DefaultContext, team, re.ID))
   334  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   335  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   336  }
   337  
   338  func TestAddTeamPost_NonExistentTeam(t *testing.T) {
   339  	unittest.PrepareTestEnv(t)
   340  	ctx, _ := contexttest.MockContext(t, "org26/repo43")
   341  
   342  	ctx.Req.Form.Set("team", "team-non-existent")
   343  
   344  	org := &user_model.User{
   345  		LowerName: "org26",
   346  		Type:      user_model.UserTypeOrganization,
   347  	}
   348  
   349  	re := &repo_model.Repository{
   350  		ID:      43,
   351  		Owner:   org,
   352  		OwnerID: 26,
   353  	}
   354  
   355  	repo := &context.Repository{
   356  		Owner: &user_model.User{
   357  			ID:                        26,
   358  			LowerName:                 "org26",
   359  			RepoAdminChangeTeamAccess: true,
   360  		},
   361  		Repository: re,
   362  	}
   363  
   364  	ctx.Repo = repo
   365  
   366  	AddTeamPost(ctx)
   367  	assert.EqualValues(t, http.StatusSeeOther, ctx.Resp.Status())
   368  	assert.NotEmpty(t, ctx.Flash.ErrorMsg)
   369  }
   370  
   371  func TestDeleteTeam(t *testing.T) {
   372  	unittest.PrepareTestEnv(t)
   373  	ctx, _ := contexttest.MockContext(t, "org3/team1/repo3")
   374  
   375  	ctx.Req.Form.Set("id", "2")
   376  
   377  	org := &user_model.User{
   378  		LowerName: "org3",
   379  		Type:      user_model.UserTypeOrganization,
   380  	}
   381  
   382  	team := &organization.Team{
   383  		ID:    2,
   384  		OrgID: 3,
   385  	}
   386  
   387  	re := &repo_model.Repository{
   388  		ID:      3,
   389  		Owner:   org,
   390  		OwnerID: 3,
   391  	}
   392  
   393  	repo := &context.Repository{
   394  		Owner: &user_model.User{
   395  			ID:                        3,
   396  			LowerName:                 "org3",
   397  			RepoAdminChangeTeamAccess: true,
   398  		},
   399  		Repository: re,
   400  	}
   401  
   402  	ctx.Repo = repo
   403  
   404  	DeleteTeam(ctx)
   405  
   406  	assert.False(t, repo_service.HasRepository(db.DefaultContext, team, re.ID))
   407  }