| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | // Copyright 2017 The Gitea Authors. All rights reserved. | 
					
						
							|  |  |  | // Use of this source code is governed by a MIT-style | 
					
						
							|  |  |  | // license that can be found in the LICENSE file. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package integrations | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 	"net/http" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"code.gitea.io/gitea/models" | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	"code.gitea.io/gitea/models/db" | 
					
						
							| 
									
										
										
										
											2021-07-25 00:03:58 +08:00
										 |  |  | 	"code.gitea.io/gitea/modules/json" | 
					
						
							| 
									
										
										
										
											2019-05-11 18:21:34 +08:00
										 |  |  | 	api "code.gitea.io/gitea/modules/structs" | 
					
						
							| 
									
										
										
										
											2018-09-13 10:33:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/stretchr/testify/assert" | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAPIAdminCreateAndDeleteSSHKey(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	// user1 is an admin user | 
					
						
							|  |  |  | 	session := loginUser(t, "user1") | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	keyOwner := db.AssertExistsAndLoadBean(t, &models.User{Name: "user2"}).(*models.User) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 	urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys?token=%s", keyOwner.Name, token) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ | 
					
						
							| 
									
										
										
										
											2020-10-09 07:52:57 +01:00
										 |  |  | 		"key":   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n", | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 		"title": "test-key", | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	resp := session.MakeRequest(t, req, http.StatusCreated) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var newPublicKey api.PublicKey | 
					
						
							|  |  |  | 	DecodeJSON(t, resp, &newPublicKey) | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	db.AssertExistsAndLoadBean(t, &models.PublicKey{ | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 		ID:          newPublicKey.ID, | 
					
						
							|  |  |  | 		Name:        newPublicKey.Title, | 
					
						
							|  |  |  | 		Content:     newPublicKey.Key, | 
					
						
							|  |  |  | 		Fingerprint: newPublicKey.Fingerprint, | 
					
						
							|  |  |  | 		OwnerID:     keyOwner.ID, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-04 01:15:55 +00:00
										 |  |  | 	req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token=%s", | 
					
						
							|  |  |  | 		keyOwner.Name, newPublicKey.ID, token) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	session.MakeRequest(t, req, http.StatusNoContent) | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	db.AssertNotExistsBean(t, &models.PublicKey{ID: newPublicKey.ID}) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAPIAdminDeleteMissingSSHKey(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	// user1 is an admin user | 
					
						
							|  |  |  | 	session := loginUser(t, "user1") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	req := NewRequestf(t, "DELETE", "/api/v1/admin/users/user1/keys/%d?token=%s", db.NonexistentID, token) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	session.MakeRequest(t, req, http.StatusNotFound) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAPIAdminDeleteUnauthorizedKey(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	normalUsername := "user2" | 
					
						
							|  |  |  | 	session := loginUser(t, adminUsername) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 	urlStr := fmt.Sprintf("/api/v1/admin/users/%s/keys?token=%s", adminUsername, token) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ | 
					
						
							| 
									
										
										
										
											2020-10-09 07:52:57 +01:00
										 |  |  | 		"key":   "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC4cn+iXnA4KvcQYSV88vGn0Yi91vG47t1P7okprVmhNTkipNRIHWr6WdCO4VDr/cvsRkuVJAsLO2enwjGWWueOO6BodiBgyAOZ/5t5nJNMCNuLGT5UIo/RI1b0WRQwxEZTRjt6mFNw6lH14wRd8ulsr9toSWBPMOGWoYs1PDeDL0JuTjL+tr1SZi/EyxCngpYszKdXllJEHyI79KQgeD0Vt3pTrkbNVTOEcCNqZePSVmUH8X8Vhugz3bnE0/iE9Pb5fkWO9c4AnM1FgI/8Bvp27Fw2ShryIXuR6kKvUqhVMTuOSDHwu6A8jLE5Owt3GAYugDpDYuwTVNGrHLXKpPzrGGPE/jPmaLCMZcsdkec95dYeU3zKODEm8UQZFhmJmDeWVJ36nGrGZHL4J5aTTaeFUJmmXDaJYiJ+K2/ioKgXqnXvltu0A9R8/LGy4nrTJRr4JMLuJFoUXvGm1gXQ70w2LSpk6yl71RNC0hCtsBe8BP8IhYCM0EP5jh7eCMQZNvM= nocomment\n", | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 		"title": "test-key", | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	resp := session.MakeRequest(t, req, http.StatusCreated) | 
					
						
							|  |  |  | 	var newPublicKey api.PublicKey | 
					
						
							|  |  |  | 	DecodeJSON(t, resp, &newPublicKey) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	session = loginUser(t, normalUsername) | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token = getTokenForLoggedInUser(t, session) | 
					
						
							| 
									
										
										
										
											2018-11-04 01:15:55 +00:00
										 |  |  | 	req = NewRequestf(t, "DELETE", "/api/v1/admin/users/%s/keys/%d?token=%s", | 
					
						
							|  |  |  | 		adminUsername, newPublicKey.ID, token) | 
					
						
							| 
									
										
										
										
											2017-12-06 12:27:10 +02:00
										 |  |  | 	session.MakeRequest(t, req, http.StatusForbidden) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAPISudoUser(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	normalUsername := "user2" | 
					
						
							|  |  |  | 	session := loginUser(t, adminUsername) | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	urlStr := fmt.Sprintf("/api/v1/user?sudo=%s&token=%s", normalUsername, token) | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 	req := NewRequest(t, "GET", urlStr) | 
					
						
							|  |  |  | 	resp := session.MakeRequest(t, req, http.StatusOK) | 
					
						
							|  |  |  | 	var user api.User | 
					
						
							|  |  |  | 	DecodeJSON(t, resp, &user) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	assert.Equal(t, normalUsername, user.UserName) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAPISudoUserForbidden(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	normalUsername := "user2" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	session := loginUser(t, normalUsername) | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-11 02:15:52 +10:00
										 |  |  | 	urlStr := fmt.Sprintf("/api/v1/user?sudo=%s&token=%s", adminUsername, token) | 
					
						
							| 
									
										
										
										
											2018-09-07 04:31:29 +01:00
										 |  |  | 	req := NewRequest(t, "GET", urlStr) | 
					
						
							|  |  |  | 	session.MakeRequest(t, req, http.StatusForbidden) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-15 17:36:59 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAPIListUsers(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2019-04-15 17:36:59 +01:00
										 |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	session := loginUser(t, adminUsername) | 
					
						
							|  |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	urlStr := fmt.Sprintf("/api/v1/admin/users?token=%s", token) | 
					
						
							|  |  |  | 	req := NewRequest(t, "GET", urlStr) | 
					
						
							|  |  |  | 	resp := session.MakeRequest(t, req, http.StatusOK) | 
					
						
							|  |  |  | 	var users []api.User | 
					
						
							|  |  |  | 	DecodeJSON(t, resp, &users) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	found := false | 
					
						
							|  |  |  | 	for _, user := range users { | 
					
						
							|  |  |  | 		if user.UserName == adminUsername { | 
					
						
							|  |  |  | 			found = true | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	assert.True(t, found) | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	numberOfUsers := db.GetCount(t, &models.User{}, "type = 0") | 
					
						
							| 
									
										
										
										
											2019-04-15 17:36:59 +01:00
										 |  |  | 	assert.Equal(t, numberOfUsers, len(users)) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-05-08 15:17:32 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAPIListUsersNotLoggedIn(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2019-05-08 15:17:32 -04:00
										 |  |  | 	req := NewRequest(t, "GET", "/api/v1/admin/users") | 
					
						
							|  |  |  | 	MakeRequest(t, req, http.StatusUnauthorized) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func TestAPIListUsersNonAdmin(t *testing.T) { | 
					
						
							| 
									
										
										
										
											2019-11-25 23:21:37 +00:00
										 |  |  | 	defer prepareTestEnv(t)() | 
					
						
							| 
									
										
										
										
											2019-05-08 15:17:32 -04:00
										 |  |  | 	nonAdminUsername := "user2" | 
					
						
							|  |  |  | 	session := loginUser(t, nonAdminUsername) | 
					
						
							|  |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 	req := NewRequestf(t, "GET", "/api/v1/admin/users?token=%s", token) | 
					
						
							|  |  |  | 	session.MakeRequest(t, req, http.StatusForbidden) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-11-15 00:53:43 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAPICreateUserInvalidEmail(t *testing.T) { | 
					
						
							|  |  |  | 	defer prepareTestEnv(t)() | 
					
						
							|  |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	session := loginUser(t, adminUsername) | 
					
						
							|  |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 	urlStr := fmt.Sprintf("/api/v1/admin/users?token=%s", token) | 
					
						
							|  |  |  | 	req := NewRequestWithValues(t, "POST", urlStr, map[string]string{ | 
					
						
							|  |  |  | 		"email":                "invalid_email@domain.com\r\n", | 
					
						
							|  |  |  | 		"full_name":            "invalid user", | 
					
						
							|  |  |  | 		"login_name":           "invalidUser", | 
					
						
							|  |  |  | 		"must_change_password": "true", | 
					
						
							|  |  |  | 		"password":             "password", | 
					
						
							|  |  |  | 		"send_notify":          "true", | 
					
						
							|  |  |  | 		"source_id":            "0", | 
					
						
							|  |  |  | 		"username":             "invalidUser", | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	session.MakeRequest(t, req, http.StatusUnprocessableEntity) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2020-11-20 02:56:42 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | func TestAPIEditUser(t *testing.T) { | 
					
						
							|  |  |  | 	defer prepareTestEnv(t)() | 
					
						
							|  |  |  | 	adminUsername := "user1" | 
					
						
							|  |  |  | 	session := loginUser(t, adminUsername) | 
					
						
							|  |  |  | 	token := getTokenForLoggedInUser(t, session) | 
					
						
							|  |  |  | 	urlStr := fmt.Sprintf("/api/v1/admin/users/%s?token=%s", "user2", token) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	req := NewRequestWithValues(t, "PATCH", urlStr, map[string]string{ | 
					
						
							|  |  |  | 		// required | 
					
						
							|  |  |  | 		"login_name": "user2", | 
					
						
							|  |  |  | 		"source_id":  "0", | 
					
						
							|  |  |  | 		// to change | 
					
						
							|  |  |  | 		"full_name": "Full Name User 2", | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	session.MakeRequest(t, req, http.StatusOK) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	empty := "" | 
					
						
							|  |  |  | 	req = NewRequestWithJSON(t, "PATCH", urlStr, api.EditUserOption{ | 
					
						
							|  |  |  | 		LoginName: "user2", | 
					
						
							|  |  |  | 		SourceID:  0, | 
					
						
							|  |  |  | 		Email:     &empty, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	resp := session.MakeRequest(t, req, http.StatusUnprocessableEntity) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	errMap := make(map[string]interface{}) | 
					
						
							|  |  |  | 	json.Unmarshal(resp.Body.Bytes(), &errMap) | 
					
						
							|  |  |  | 	assert.EqualValues(t, "email is not allowed to be empty string", errMap["message"].(string)) | 
					
						
							| 
									
										
										
										
											2021-02-18 09:25:35 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	user2 := db.AssertExistsAndLoadBean(t, &models.User{LoginName: "user2"}).(*models.User) | 
					
						
							| 
									
										
										
										
											2021-06-07 07:27:09 +02:00
										 |  |  | 	assert.False(t, user2.IsRestricted) | 
					
						
							| 
									
										
										
										
											2021-02-18 09:25:35 +01:00
										 |  |  | 	bTrue := true | 
					
						
							|  |  |  | 	req = NewRequestWithJSON(t, "PATCH", urlStr, api.EditUserOption{ | 
					
						
							|  |  |  | 		// required | 
					
						
							|  |  |  | 		LoginName: "user2", | 
					
						
							|  |  |  | 		SourceID:  0, | 
					
						
							|  |  |  | 		// to change | 
					
						
							|  |  |  | 		Restricted: &bTrue, | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	session.MakeRequest(t, req, http.StatusOK) | 
					
						
							| 
									
										
										
										
											2021-09-19 19:49:59 +08:00
										 |  |  | 	user2 = db.AssertExistsAndLoadBean(t, &models.User{LoginName: "user2"}).(*models.User) | 
					
						
							| 
									
										
										
										
											2021-06-07 07:27:09 +02:00
										 |  |  | 	assert.True(t, user2.IsRestricted) | 
					
						
							| 
									
										
										
										
											2020-11-20 02:56:42 +01:00
										 |  |  | } |