mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09:00 
			
		
		
		
	split setting.go to multiple files (#6154)
* split setting.go to multiple files * fix lint
This commit is contained in:
		
							
								
								
									
										124
									
								
								modules/setting/cron.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										124
									
								
								modules/setting/cron.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,124 @@ | ||||
| // Copyright 2019 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 setting | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
|  | ||||
| 	// Cron tasks | ||||
| 	Cron = struct { | ||||
| 		UpdateMirror struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		} `ini:"cron.update_mirrors"` | ||||
| 		RepoHealthCheck struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			Timeout    time.Duration | ||||
| 			Args       []string `delim:" "` | ||||
| 		} `ini:"cron.repo_health_check"` | ||||
| 		CheckRepoStats struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		} `ini:"cron.check_repo_stats"` | ||||
| 		ArchiveCleanup struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		} `ini:"cron.archive_cleanup"` | ||||
| 		SyncExternalUsers struct { | ||||
| 			Enabled        bool | ||||
| 			RunAtStart     bool | ||||
| 			Schedule       string | ||||
| 			UpdateExisting bool | ||||
| 		} `ini:"cron.sync_external_users"` | ||||
| 		DeletedBranchesCleanup struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		} `ini:"cron.deleted_branches_cleanup"` | ||||
| 	}{ | ||||
| 		UpdateMirror: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: false, | ||||
| 			Schedule:   "@every 10m", | ||||
| 		}, | ||||
| 		RepoHealthCheck: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			Timeout    time.Duration | ||||
| 			Args       []string `delim:" "` | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: false, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			Timeout:    60 * time.Second, | ||||
| 			Args:       []string{}, | ||||
| 		}, | ||||
| 		CheckRepoStats: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 		}, | ||||
| 		ArchiveCleanup: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			OlderThan:  24 * time.Hour, | ||||
| 		}, | ||||
| 		SyncExternalUsers: struct { | ||||
| 			Enabled        bool | ||||
| 			RunAtStart     bool | ||||
| 			Schedule       string | ||||
| 			UpdateExisting bool | ||||
| 		}{ | ||||
| 			Enabled:        true, | ||||
| 			RunAtStart:     false, | ||||
| 			Schedule:       "@every 24h", | ||||
| 			UpdateExisting: true, | ||||
| 		}, | ||||
| 		DeletedBranchesCleanup: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			OlderThan:  24 * time.Hour, | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func newCron() { | ||||
| 	if err := Cfg.Section("cron").MapTo(&Cron); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Cron settings: %v", err) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										71
									
								
								modules/setting/git.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								modules/setting/git.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| // Copyright 2019 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 setting | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
|  | ||||
| 	"code.gitea.io/git" | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	version "github.com/mcuadros/go-version" | ||||
| ) | ||||
|  | ||||
| var ( | ||||
| 	// Git settings | ||||
| 	Git = struct { | ||||
| 		Version                  string `ini:"-"` | ||||
| 		DisableDiffHighlight     bool | ||||
| 		MaxGitDiffLines          int | ||||
| 		MaxGitDiffLineCharacters int | ||||
| 		MaxGitDiffFiles          int | ||||
| 		GCArgs                   []string `delim:" "` | ||||
| 		Timeout                  struct { | ||||
| 			Default int | ||||
| 			Migrate int | ||||
| 			Mirror  int | ||||
| 			Clone   int | ||||
| 			Pull    int | ||||
| 			GC      int `ini:"GC"` | ||||
| 		} `ini:"git.timeout"` | ||||
| 	}{ | ||||
| 		DisableDiffHighlight:     false, | ||||
| 		MaxGitDiffLines:          1000, | ||||
| 		MaxGitDiffLineCharacters: 5000, | ||||
| 		MaxGitDiffFiles:          100, | ||||
| 		GCArgs:                   []string{}, | ||||
| 		Timeout: struct { | ||||
| 			Default int | ||||
| 			Migrate int | ||||
| 			Mirror  int | ||||
| 			Clone   int | ||||
| 			Pull    int | ||||
| 			GC      int `ini:"GC"` | ||||
| 		}{ | ||||
| 			Default: int(git.DefaultCommandExecutionTimeout / time.Second), | ||||
| 			Migrate: 600, | ||||
| 			Mirror:  300, | ||||
| 			Clone:   300, | ||||
| 			Pull:    300, | ||||
| 			GC:      60, | ||||
| 		}, | ||||
| 	} | ||||
| ) | ||||
|  | ||||
| func newGit() { | ||||
| 	if err := Cfg.Section("git").MapTo(&Git); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Git settings: %v", err) | ||||
| 	} | ||||
| 	git.DefaultCommandExecutionTimeout = time.Duration(Git.Timeout.Default) * time.Second | ||||
|  | ||||
| 	binVersion, err := git.BinVersion() | ||||
| 	if err != nil { | ||||
| 		log.Fatal(4, "Error retrieving git version: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if version.Compare(binVersion, "2.9", ">=") { | ||||
| 		// Explicitly disable credential helper, otherwise Git credentials might leak | ||||
| 		git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=") | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										66
									
								
								modules/setting/markup.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								modules/setting/markup.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,66 @@ | ||||
| // Copyright 2019 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 setting | ||||
|  | ||||
| import ( | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| ) | ||||
|  | ||||
| // ExternalMarkupParsers represents the external markup parsers | ||||
| var ( | ||||
| 	ExternalMarkupParsers []MarkupParser | ||||
| ) | ||||
|  | ||||
| // MarkupParser defines the external parser configured in ini | ||||
| type MarkupParser struct { | ||||
| 	Enabled        bool | ||||
| 	MarkupName     string | ||||
| 	Command        string | ||||
| 	FileExtensions []string | ||||
| 	IsInputFile    bool | ||||
| } | ||||
|  | ||||
| func newMarkup() { | ||||
| 	extensionReg := regexp.MustCompile(`\.\w`) | ||||
| 	for _, sec := range Cfg.Section("markup").ChildSections() { | ||||
| 		name := strings.TrimPrefix(sec.Name(), "markup.") | ||||
| 		if name == "" { | ||||
| 			log.Warn("name is empty, markup " + sec.Name() + "ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		extensions := sec.Key("FILE_EXTENSIONS").Strings(",") | ||||
| 		var exts = make([]string, 0, len(extensions)) | ||||
| 		for _, extension := range extensions { | ||||
| 			if !extensionReg.MatchString(extension) { | ||||
| 				log.Warn(sec.Name() + " file extension " + extension + " is invalid. Extension ignored") | ||||
| 			} else { | ||||
| 				exts = append(exts, extension) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if len(exts) == 0 { | ||||
| 			log.Warn(sec.Name() + " file extension is empty, markup " + name + " ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		command := sec.Key("RENDER_COMMAND").MustString("") | ||||
| 		if command == "" { | ||||
| 			log.Warn(" RENDER_COMMAND is empty, markup " + name + " ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{ | ||||
| 			Enabled:        sec.Key("ENABLED").MustBool(false), | ||||
| 			MarkupName:     name, | ||||
| 			FileExtensions: exts, | ||||
| 			Command:        command, | ||||
| 			IsInputFile:    sec.Key("IS_INPUT_FILE").MustBool(false), | ||||
| 		}) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										168
									
								
								modules/setting/repository.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								modules/setting/repository.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| // Copyright 2019 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 setting | ||||
|  | ||||
| import ( | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/gitea/modules/log" | ||||
| 	"github.com/Unknwon/com" | ||||
| ) | ||||
|  | ||||
| // enumerates all the policy repository creating | ||||
| const ( | ||||
| 	RepoCreatingLastUserVisibility = "last" | ||||
| 	RepoCreatingPrivate            = "private" | ||||
| 	RepoCreatingPublic             = "public" | ||||
| ) | ||||
|  | ||||
| // Repository settings | ||||
| var ( | ||||
| 	Repository = struct { | ||||
| 		AnsiCharset                             string | ||||
| 		ForcePrivate                            bool | ||||
| 		DefaultPrivate                          string | ||||
| 		MaxCreationLimit                        int | ||||
| 		MirrorQueueLength                       int | ||||
| 		PullRequestQueueLength                  int | ||||
| 		PreferredLicenses                       []string | ||||
| 		DisableHTTPGit                          bool | ||||
| 		AccessControlAllowOrigin                string | ||||
| 		UseCompatSSHURI                         bool | ||||
| 		DefaultCloseIssuesViaCommitsInAnyBranch bool | ||||
|  | ||||
| 		// Repository editor settings | ||||
| 		Editor struct { | ||||
| 			LineWrapExtensions   []string | ||||
| 			PreviewableFileModes []string | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Repository upload settings | ||||
| 		Upload struct { | ||||
| 			Enabled      bool | ||||
| 			TempPath     string | ||||
| 			AllowedTypes []string `delim:"|"` | ||||
| 			FileMaxSize  int64 | ||||
| 			MaxFiles     int | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Repository local settings | ||||
| 		Local struct { | ||||
| 			LocalCopyPath string | ||||
| 			LocalWikiPath string | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Pull request settings | ||||
| 		PullRequest struct { | ||||
| 			WorkInProgressPrefixes []string | ||||
| 		} `ini:"repository.pull-request"` | ||||
|  | ||||
| 		// Issue Setting | ||||
| 		Issue struct { | ||||
| 			LockReasons []string | ||||
| 		} `ini:"repository.issue"` | ||||
| 	}{ | ||||
| 		AnsiCharset:                             "", | ||||
| 		ForcePrivate:                            false, | ||||
| 		DefaultPrivate:                          RepoCreatingLastUserVisibility, | ||||
| 		MaxCreationLimit:                        -1, | ||||
| 		MirrorQueueLength:                       1000, | ||||
| 		PullRequestQueueLength:                  1000, | ||||
| 		PreferredLicenses:                       []string{"Apache License 2.0,MIT License"}, | ||||
| 		DisableHTTPGit:                          false, | ||||
| 		AccessControlAllowOrigin:                "", | ||||
| 		UseCompatSSHURI:                         false, | ||||
| 		DefaultCloseIssuesViaCommitsInAnyBranch: false, | ||||
|  | ||||
| 		// Repository editor settings | ||||
| 		Editor: struct { | ||||
| 			LineWrapExtensions   []string | ||||
| 			PreviewableFileModes []string | ||||
| 		}{ | ||||
| 			LineWrapExtensions:   strings.Split(".txt,.md,.markdown,.mdown,.mkd,", ","), | ||||
| 			PreviewableFileModes: []string{"markdown"}, | ||||
| 		}, | ||||
|  | ||||
| 		// Repository upload settings | ||||
| 		Upload: struct { | ||||
| 			Enabled      bool | ||||
| 			TempPath     string | ||||
| 			AllowedTypes []string `delim:"|"` | ||||
| 			FileMaxSize  int64 | ||||
| 			MaxFiles     int | ||||
| 		}{ | ||||
| 			Enabled:      true, | ||||
| 			TempPath:     "data/tmp/uploads", | ||||
| 			AllowedTypes: []string{}, | ||||
| 			FileMaxSize:  3, | ||||
| 			MaxFiles:     5, | ||||
| 		}, | ||||
|  | ||||
| 		// Repository local settings | ||||
| 		Local: struct { | ||||
| 			LocalCopyPath string | ||||
| 			LocalWikiPath string | ||||
| 		}{ | ||||
| 			LocalCopyPath: "tmp/local-repo", | ||||
| 			LocalWikiPath: "tmp/local-wiki", | ||||
| 		}, | ||||
|  | ||||
| 		// Pull request settings | ||||
| 		PullRequest: struct { | ||||
| 			WorkInProgressPrefixes []string | ||||
| 		}{ | ||||
| 			WorkInProgressPrefixes: []string{"WIP:", "[WIP]"}, | ||||
| 		}, | ||||
|  | ||||
| 		// Issue settings | ||||
| 		Issue: struct { | ||||
| 			LockReasons []string | ||||
| 		}{ | ||||
| 			LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","), | ||||
| 		}, | ||||
| 	} | ||||
| 	RepoRootPath string | ||||
| 	ScriptType   = "bash" | ||||
| ) | ||||
|  | ||||
| func newRepository() { | ||||
| 	homeDir, err := com.HomeDir() | ||||
| 	if err != nil { | ||||
| 		log.Fatal(4, "Failed to get home directory: %v", err) | ||||
| 	} | ||||
| 	homeDir = strings.Replace(homeDir, "\\", "/", -1) | ||||
|  | ||||
| 	// Determine and create root git repository path. | ||||
| 	sec := Cfg.Section("repository") | ||||
| 	Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool() | ||||
| 	Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool() | ||||
| 	Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) | ||||
| 	RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gitea-repositories")) | ||||
| 	forcePathSeparator(RepoRootPath) | ||||
| 	if !filepath.IsAbs(RepoRootPath) { | ||||
| 		RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath) | ||||
| 	} else { | ||||
| 		RepoRootPath = filepath.Clean(RepoRootPath) | ||||
| 	} | ||||
| 	ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash") | ||||
|  | ||||
| 	if err = Cfg.Section("repository").MapTo(&Repository); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Editor settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Upload settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.local").MapTo(&Repository.Local); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Local settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.PullRequest settings: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if !filepath.IsAbs(Repository.Upload.TempPath) { | ||||
| 		Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath) | ||||
| 	} | ||||
| } | ||||
| @@ -15,7 +15,6 @@ import ( | ||||
| 	"os/exec" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"regexp" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| @@ -63,22 +62,6 @@ const ( | ||||
| 	LandingPageOrganizations LandingPage = "/explore/organizations" | ||||
| ) | ||||
|  | ||||
| // MarkupParser defines the external parser configured in ini | ||||
| type MarkupParser struct { | ||||
| 	Enabled        bool | ||||
| 	MarkupName     string | ||||
| 	Command        string | ||||
| 	FileExtensions []string | ||||
| 	IsInputFile    bool | ||||
| } | ||||
|  | ||||
| // enumerates all the policy repository creating | ||||
| const ( | ||||
| 	RepoCreatingLastUserVisibility = "last" | ||||
| 	RepoCreatingPrivate            = "private" | ||||
| 	RepoCreatingPublic             = "public" | ||||
| ) | ||||
|  | ||||
| // enumerates all the types of captchas | ||||
| const ( | ||||
| 	ImageCaptcha = "image" | ||||
| @@ -181,113 +164,6 @@ var ( | ||||
| 	DBConnectRetries int | ||||
| 	DBConnectBackoff time.Duration | ||||
|  | ||||
| 	// Repository settings | ||||
| 	Repository = struct { | ||||
| 		AnsiCharset                             string | ||||
| 		ForcePrivate                            bool | ||||
| 		DefaultPrivate                          string | ||||
| 		MaxCreationLimit                        int | ||||
| 		MirrorQueueLength                       int | ||||
| 		PullRequestQueueLength                  int | ||||
| 		PreferredLicenses                       []string | ||||
| 		DisableHTTPGit                          bool | ||||
| 		AccessControlAllowOrigin                string | ||||
| 		UseCompatSSHURI                         bool | ||||
| 		DefaultCloseIssuesViaCommitsInAnyBranch bool | ||||
|  | ||||
| 		// Repository editor settings | ||||
| 		Editor struct { | ||||
| 			LineWrapExtensions   []string | ||||
| 			PreviewableFileModes []string | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Repository upload settings | ||||
| 		Upload struct { | ||||
| 			Enabled      bool | ||||
| 			TempPath     string | ||||
| 			AllowedTypes []string `delim:"|"` | ||||
| 			FileMaxSize  int64 | ||||
| 			MaxFiles     int | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Repository local settings | ||||
| 		Local struct { | ||||
| 			LocalCopyPath string | ||||
| 			LocalWikiPath string | ||||
| 		} `ini:"-"` | ||||
|  | ||||
| 		// Pull request settings | ||||
| 		PullRequest struct { | ||||
| 			WorkInProgressPrefixes []string | ||||
| 		} `ini:"repository.pull-request"` | ||||
|  | ||||
| 		// Issue Setting | ||||
| 		Issue struct { | ||||
| 			LockReasons []string | ||||
| 		} `ini:"repository.issue"` | ||||
| 	}{ | ||||
| 		AnsiCharset:                             "", | ||||
| 		ForcePrivate:                            false, | ||||
| 		DefaultPrivate:                          RepoCreatingLastUserVisibility, | ||||
| 		MaxCreationLimit:                        -1, | ||||
| 		MirrorQueueLength:                       1000, | ||||
| 		PullRequestQueueLength:                  1000, | ||||
| 		PreferredLicenses:                       []string{"Apache License 2.0,MIT License"}, | ||||
| 		DisableHTTPGit:                          false, | ||||
| 		AccessControlAllowOrigin:                "", | ||||
| 		UseCompatSSHURI:                         false, | ||||
| 		DefaultCloseIssuesViaCommitsInAnyBranch: false, | ||||
|  | ||||
| 		// Repository editor settings | ||||
| 		Editor: struct { | ||||
| 			LineWrapExtensions   []string | ||||
| 			PreviewableFileModes []string | ||||
| 		}{ | ||||
| 			LineWrapExtensions:   strings.Split(".txt,.md,.markdown,.mdown,.mkd,", ","), | ||||
| 			PreviewableFileModes: []string{"markdown"}, | ||||
| 		}, | ||||
|  | ||||
| 		// Repository upload settings | ||||
| 		Upload: struct { | ||||
| 			Enabled      bool | ||||
| 			TempPath     string | ||||
| 			AllowedTypes []string `delim:"|"` | ||||
| 			FileMaxSize  int64 | ||||
| 			MaxFiles     int | ||||
| 		}{ | ||||
| 			Enabled:      true, | ||||
| 			TempPath:     "data/tmp/uploads", | ||||
| 			AllowedTypes: []string{}, | ||||
| 			FileMaxSize:  3, | ||||
| 			MaxFiles:     5, | ||||
| 		}, | ||||
|  | ||||
| 		// Repository local settings | ||||
| 		Local: struct { | ||||
| 			LocalCopyPath string | ||||
| 			LocalWikiPath string | ||||
| 		}{ | ||||
| 			LocalCopyPath: "tmp/local-repo", | ||||
| 			LocalWikiPath: "tmp/local-wiki", | ||||
| 		}, | ||||
|  | ||||
| 		// Pull request settings | ||||
| 		PullRequest: struct { | ||||
| 			WorkInProgressPrefixes []string | ||||
| 		}{ | ||||
| 			WorkInProgressPrefixes: []string{"WIP:", "[WIP]"}, | ||||
| 		}, | ||||
|  | ||||
| 		// Issue settings | ||||
| 		Issue: struct { | ||||
| 			LockReasons []string | ||||
| 		}{ | ||||
| 			LockReasons: strings.Split("Too heated,Off-topic,Spam,Resolved", ","), | ||||
| 		}, | ||||
| 	} | ||||
| 	RepoRootPath string | ||||
| 	ScriptType   = "bash" | ||||
|  | ||||
| 	// UI settings | ||||
| 	UI = struct { | ||||
| 		ExplorePagingNum    int | ||||
| @@ -400,149 +276,6 @@ var ( | ||||
|  | ||||
| 	CSRFCookieName = "_csrf" | ||||
|  | ||||
| 	// Cron tasks | ||||
| 	Cron = struct { | ||||
| 		UpdateMirror struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		} `ini:"cron.update_mirrors"` | ||||
| 		RepoHealthCheck struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			Timeout    time.Duration | ||||
| 			Args       []string `delim:" "` | ||||
| 		} `ini:"cron.repo_health_check"` | ||||
| 		CheckRepoStats struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		} `ini:"cron.check_repo_stats"` | ||||
| 		ArchiveCleanup struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		} `ini:"cron.archive_cleanup"` | ||||
| 		SyncExternalUsers struct { | ||||
| 			Enabled        bool | ||||
| 			RunAtStart     bool | ||||
| 			Schedule       string | ||||
| 			UpdateExisting bool | ||||
| 		} `ini:"cron.sync_external_users"` | ||||
| 		DeletedBranchesCleanup struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		} `ini:"cron.deleted_branches_cleanup"` | ||||
| 	}{ | ||||
| 		UpdateMirror: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: false, | ||||
| 			Schedule:   "@every 10m", | ||||
| 		}, | ||||
| 		RepoHealthCheck: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			Timeout    time.Duration | ||||
| 			Args       []string `delim:" "` | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: false, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			Timeout:    60 * time.Second, | ||||
| 			Args:       []string{}, | ||||
| 		}, | ||||
| 		CheckRepoStats: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 		}, | ||||
| 		ArchiveCleanup: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			OlderThan:  24 * time.Hour, | ||||
| 		}, | ||||
| 		SyncExternalUsers: struct { | ||||
| 			Enabled        bool | ||||
| 			RunAtStart     bool | ||||
| 			Schedule       string | ||||
| 			UpdateExisting bool | ||||
| 		}{ | ||||
| 			Enabled:        true, | ||||
| 			RunAtStart:     false, | ||||
| 			Schedule:       "@every 24h", | ||||
| 			UpdateExisting: true, | ||||
| 		}, | ||||
| 		DeletedBranchesCleanup: struct { | ||||
| 			Enabled    bool | ||||
| 			RunAtStart bool | ||||
| 			Schedule   string | ||||
| 			OlderThan  time.Duration | ||||
| 		}{ | ||||
| 			Enabled:    true, | ||||
| 			RunAtStart: true, | ||||
| 			Schedule:   "@every 24h", | ||||
| 			OlderThan:  24 * time.Hour, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	// Git settings | ||||
| 	Git = struct { | ||||
| 		Version                  string `ini:"-"` | ||||
| 		DisableDiffHighlight     bool | ||||
| 		MaxGitDiffLines          int | ||||
| 		MaxGitDiffLineCharacters int | ||||
| 		MaxGitDiffFiles          int | ||||
| 		GCArgs                   []string `delim:" "` | ||||
| 		Timeout                  struct { | ||||
| 			Default int | ||||
| 			Migrate int | ||||
| 			Mirror  int | ||||
| 			Clone   int | ||||
| 			Pull    int | ||||
| 			GC      int `ini:"GC"` | ||||
| 		} `ini:"git.timeout"` | ||||
| 	}{ | ||||
| 		DisableDiffHighlight:     false, | ||||
| 		MaxGitDiffLines:          1000, | ||||
| 		MaxGitDiffLineCharacters: 5000, | ||||
| 		MaxGitDiffFiles:          100, | ||||
| 		GCArgs:                   []string{}, | ||||
| 		Timeout: struct { | ||||
| 			Default int | ||||
| 			Migrate int | ||||
| 			Mirror  int | ||||
| 			Clone   int | ||||
| 			Pull    int | ||||
| 			GC      int `ini:"GC"` | ||||
| 		}{ | ||||
| 			Default: int(git.DefaultCommandExecutionTimeout / time.Second), | ||||
| 			Migrate: 600, | ||||
| 			Mirror:  300, | ||||
| 			Clone:   300, | ||||
| 			Pull:    300, | ||||
| 			GC:      60, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	// Mirror settings | ||||
| 	Mirror struct { | ||||
| 		DefaultInterval time.Duration | ||||
| @@ -612,7 +345,6 @@ var ( | ||||
| 	InternalToken     string // internal access token | ||||
| 	IterateBufferSize int | ||||
|  | ||||
| 	ExternalMarkupParsers []MarkupParser | ||||
| 	// UILocation is the location on the UI, so that we can display the time on UI. | ||||
| 	// Currently only show the default time.Local, it could be added to app.ini after UI is ready | ||||
| 	UILocation = time.Local | ||||
| @@ -1064,34 +796,7 @@ func NewContext() { | ||||
|  | ||||
| 	SSH.BuiltinServerUser = Cfg.Section("server").Key("BUILTIN_SSH_SERVER_USER").MustString(RunUser) | ||||
|  | ||||
| 	// Determine and create root git repository path. | ||||
| 	sec = Cfg.Section("repository") | ||||
| 	Repository.DisableHTTPGit = sec.Key("DISABLE_HTTP_GIT").MustBool() | ||||
| 	Repository.UseCompatSSHURI = sec.Key("USE_COMPAT_SSH_URI").MustBool() | ||||
| 	Repository.MaxCreationLimit = sec.Key("MAX_CREATION_LIMIT").MustInt(-1) | ||||
| 	RepoRootPath = sec.Key("ROOT").MustString(path.Join(homeDir, "gitea-repositories")) | ||||
| 	forcePathSeparator(RepoRootPath) | ||||
| 	if !filepath.IsAbs(RepoRootPath) { | ||||
| 		RepoRootPath = filepath.Join(AppWorkPath, RepoRootPath) | ||||
| 	} else { | ||||
| 		RepoRootPath = filepath.Clean(RepoRootPath) | ||||
| 	} | ||||
| 	ScriptType = sec.Key("SCRIPT_TYPE").MustString("bash") | ||||
| 	if err = Cfg.Section("repository").MapTo(&Repository); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.editor").MapTo(&Repository.Editor); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Editor settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.upload").MapTo(&Repository.Upload); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Upload settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.local").MapTo(&Repository.Local); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.Local settings: %v", err) | ||||
| 	} else if err = Cfg.Section("repository.pull-request").MapTo(&Repository.PullRequest); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Repository.PullRequest settings: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if !filepath.IsAbs(Repository.Upload.TempPath) { | ||||
| 		Repository.Upload.TempPath = path.Join(AppWorkPath, Repository.Upload.TempPath) | ||||
| 	} | ||||
| 	newRepository() | ||||
|  | ||||
| 	sec = Cfg.Section("picture") | ||||
| 	AvatarUploadPath = sec.Key("AVATAR_UPLOAD_PATH").MustString(path.Join(AppDataPath, "avatars")) | ||||
| @@ -1145,17 +850,14 @@ func NewContext() { | ||||
| 		log.Fatal(4, "Failed to map Markdown settings: %v", err) | ||||
| 	} else if err = Cfg.Section("admin").MapTo(&Admin); err != nil { | ||||
| 		log.Fatal(4, "Fail to map Admin settings: %v", err) | ||||
| 	} else if err = Cfg.Section("cron").MapTo(&Cron); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Cron settings: %v", err) | ||||
| 	} else if err = Cfg.Section("git").MapTo(&Git); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Git settings: %v", err) | ||||
| 	} else if err = Cfg.Section("api").MapTo(&API); err != nil { | ||||
| 		log.Fatal(4, "Failed to map API settings: %v", err) | ||||
| 	} else if err = Cfg.Section("metrics").MapTo(&Metrics); err != nil { | ||||
| 		log.Fatal(4, "Failed to map Metrics settings: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	git.DefaultCommandExecutionTimeout = time.Duration(Git.Timeout.Default) * time.Second | ||||
| 	newCron() | ||||
| 	newGit() | ||||
|  | ||||
| 	sec = Cfg.Section("mirror") | ||||
| 	Mirror.MinInterval = sec.Key("MIN_INTERVAL").MustDuration(10 * time.Minute) | ||||
| @@ -1193,57 +895,11 @@ func NewContext() { | ||||
|  | ||||
| 	HasRobotsTxt = com.IsFile(path.Join(CustomPath, "robots.txt")) | ||||
|  | ||||
| 	extensionReg := regexp.MustCompile(`\.\w`) | ||||
| 	for _, sec := range Cfg.Section("markup").ChildSections() { | ||||
| 		name := strings.TrimPrefix(sec.Name(), "markup.") | ||||
| 		if name == "" { | ||||
| 			log.Warn("name is empty, markup " + sec.Name() + "ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		extensions := sec.Key("FILE_EXTENSIONS").Strings(",") | ||||
| 		var exts = make([]string, 0, len(extensions)) | ||||
| 		for _, extension := range extensions { | ||||
| 			if !extensionReg.MatchString(extension) { | ||||
| 				log.Warn(sec.Name() + " file extension " + extension + " is invalid. Extension ignored") | ||||
| 			} else { | ||||
| 				exts = append(exts, extension) | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		if len(exts) == 0 { | ||||
| 			log.Warn(sec.Name() + " file extension is empty, markup " + name + " ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		command := sec.Key("RENDER_COMMAND").MustString("") | ||||
| 		if command == "" { | ||||
| 			log.Warn(" RENDER_COMMAND is empty, markup " + name + " ignored") | ||||
| 			continue | ||||
| 		} | ||||
|  | ||||
| 		ExternalMarkupParsers = append(ExternalMarkupParsers, MarkupParser{ | ||||
| 			Enabled:        sec.Key("ENABLED").MustBool(false), | ||||
| 			MarkupName:     name, | ||||
| 			FileExtensions: exts, | ||||
| 			Command:        command, | ||||
| 			IsInputFile:    sec.Key("IS_INPUT_FILE").MustBool(false), | ||||
| 		}) | ||||
| 	} | ||||
| 	newMarkup() | ||||
|  | ||||
| 	sec = Cfg.Section("U2F") | ||||
| 	U2F.TrustedFacets, _ = shellquote.Split(sec.Key("TRUSTED_FACETS").MustString(strings.TrimRight(AppURL, "/"))) | ||||
| 	U2F.AppID = sec.Key("APP_ID").MustString(strings.TrimRight(AppURL, "/")) | ||||
|  | ||||
| 	binVersion, err := git.BinVersion() | ||||
| 	if err != nil { | ||||
| 		log.Fatal(4, "Error retrieving git version: %v", err) | ||||
| 	} | ||||
|  | ||||
| 	if version.Compare(binVersion, "2.9", ">=") { | ||||
| 		// Explicitly disable credential helper, otherwise Git credentials might leak | ||||
| 		git.GlobalCommandArgs = append(git.GlobalCommandArgs, "-c", "credential.helper=") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func loadInternalToken(sec *ini.Section) string { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user