mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	@@ -58,7 +58,7 @@ func TestCreateBranch(t *testing.T) {
 | 
				
			|||||||
			OldRefSubURL:   "branch/master",
 | 
								OldRefSubURL:   "branch/master",
 | 
				
			||||||
			NewBranch:      "feature=test1",
 | 
								NewBranch:      "feature=test1",
 | 
				
			||||||
			ExpectedStatus: http.StatusFound,
 | 
								ExpectedStatus: http.StatusFound,
 | 
				
			||||||
			FlashMessage:   i18n.Tr("en", "form.NewBranchName") + i18n.Tr("en", "form.git_ref_name_error"),
 | 
								FlashMessage:   i18n.Tr("en", "repo.branch.create_success", "feature=test1"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			OldRefSubURL:   "branch/master",
 | 
								OldRefSubURL:   "branch/master",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,7 +19,9 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
	// GitRefNamePattern is regular expression with unallowed characters in git reference name
 | 
						// GitRefNamePattern is regular expression with unallowed characters in git reference name
 | 
				
			||||||
	GitRefNamePattern = regexp.MustCompile("[^\\d\\w-_\\./]")
 | 
						// They cannot have ASCII control characters (i.e. bytes whose values are lower than \040, or \177 DEL), space, tilde ~, caret ^, or colon : anywhere.
 | 
				
			||||||
 | 
						// They cannot have question-mark ?, asterisk *, or open bracket [ anywhere
 | 
				
			||||||
 | 
						GitRefNamePattern = regexp.MustCompile(`[\000-\037\177 \\~^:?*[]+`)
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// AddBindingRules adds additional binding rules
 | 
					// AddBindingRules adds additional binding rules
 | 
				
			||||||
@@ -44,7 +46,8 @@ func addGitRefNameBindingRule() {
 | 
				
			|||||||
			// Additional rules as described at https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
 | 
								// Additional rules as described at https://www.kernel.org/pub/software/scm/git/docs/git-check-ref-format.html
 | 
				
			||||||
			if strings.HasPrefix(str, "/") || strings.HasSuffix(str, "/") ||
 | 
								if strings.HasPrefix(str, "/") || strings.HasSuffix(str, "/") ||
 | 
				
			||||||
				strings.HasSuffix(str, ".") || strings.Contains(str, "..") ||
 | 
									strings.HasSuffix(str, ".") || strings.Contains(str, "..") ||
 | 
				
			||||||
				strings.Contains(str, "//") {
 | 
									strings.Contains(str, "//") || strings.Contains(str, "@{") ||
 | 
				
			||||||
 | 
									str == "@" {
 | 
				
			||||||
				errs.Add([]string{name}, ErrGitRefName, "GitRefName")
 | 
									errs.Add([]string{name}, ErrGitRefName, "GitRefName")
 | 
				
			||||||
				return false, errs
 | 
									return false, errs
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -25,6 +25,13 @@ var gitRefNameValidationTestCases = []validationTestCase{
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
		expectedErrors: binding.Errors{},
 | 
							expectedErrors: binding.Errors{},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has allowed special characters",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "debian/1%1.6.0-2",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		description: "Reference name contains backslash",
 | 
							description: "Reference name contains backslash",
 | 
				
			||||||
		data: TestForm{
 | 
							data: TestForm{
 | 
				
			||||||
@@ -129,6 +136,123 @@ var gitRefNameValidationTestCases = []validationTestCase{
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name is single @",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "@",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has @{",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "branch@{",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character ~",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "~debian/1%1.6.0-2",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character *",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "*debian/1%1.6.0-2",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character ?",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "?debian/1%1.6.0-2",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character ^",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "^debian/1%1.6.0-2",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character :",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "debian:jessie",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character (whitespace)",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "debian jessie",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							description: "Reference name has unallowed special character [",
 | 
				
			||||||
 | 
							data: TestForm{
 | 
				
			||||||
 | 
								BranchName: "debian[jessie",
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							expectedErrors: binding.Errors{
 | 
				
			||||||
 | 
								binding.Error{
 | 
				
			||||||
 | 
									FieldNames:     []string{"BranchName"},
 | 
				
			||||||
 | 
									Classification: ErrGitRefName,
 | 
				
			||||||
 | 
									Message:        "GitRefName",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func Test_GitRefNameValidation(t *testing.T) {
 | 
					func Test_GitRefNameValidation(t *testing.T) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,6 +14,7 @@ import (
 | 
				
			|||||||
	"code.gitea.io/gitea/modules/base"
 | 
						"code.gitea.io/gitea/modules/base"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/context"
 | 
						"code.gitea.io/gitea/modules/context"
 | 
				
			||||||
	"code.gitea.io/gitea/modules/log"
 | 
						"code.gitea.io/gitea/modules/log"
 | 
				
			||||||
 | 
						"code.gitea.io/gitea/modules/util"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
@@ -250,5 +251,5 @@ func CreateBranch(ctx *context.Context, form auth.NewBranchForm) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ctx.Flash.Success(ctx.Tr("repo.branch.create_success", form.NewBranchName))
 | 
						ctx.Flash.Success(ctx.Tr("repo.branch.create_success", form.NewBranchName))
 | 
				
			||||||
	ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + form.NewBranchName)
 | 
						ctx.Redirect(ctx.Repo.RepoLink + "/src/branch/" + util.PathEscapeSegments(form.NewBranchName))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user