aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeripath2019-04-12 22:25:06 +0100
committerGitHub2019-04-12 22:25:06 +0100
commit40f41dc6942222141aa8f0e7ab115139ef2f46d7 (patch)
treeaeeeda0ff58be8354f6980e930f547d94080a930
parenta63b9fbc70bdd1d25d75dbbd1e56e1d70215743a (diff)
Correctly adjust mirror url (#6593) (#6594)
-rw-r--r--models/repo.go6
-rw-r--r--models/repo_mirror.go25
-rw-r--r--options/locale/locale_en-US.ini4
-rw-r--r--routers/repo/setting.go48
-rw-r--r--templates/repo/settings/options.tmpl2
5 files changed, 70 insertions, 15 deletions
diff --git a/models/repo.go b/models/repo.go
index cafde2936..3a887c6c3 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1077,9 +1077,11 @@ func CleanUpMigrateInfo(repo *Repository) (*Repository, error) {
}
}
- if err := cleanUpMigrateGitConfig(repo.GitConfigPath()); err != nil {
- return repo, fmt.Errorf("cleanUpMigrateGitConfig: %v", err)
+ _, err := git.NewCommand("remote", "remove", "origin").RunInDir(repoPath)
+ if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ return repo, fmt.Errorf("CleanUpMigrateInfo: %v", err)
}
+
if repo.HasWiki() {
if err := cleanUpMigrateGitConfig(path.Join(repo.WikiPath(), "config")); err != nil {
return repo, fmt.Errorf("cleanUpMigrateGitConfig (wiki): %v", err)
diff --git a/models/repo_mirror.go b/models/repo_mirror.go
index 9f8c9bee6..6205ab3b2 100644
--- a/models/repo_mirror.go
+++ b/models/repo_mirror.go
@@ -20,7 +20,6 @@ import (
"github.com/Unknwon/com"
"github.com/go-xorm/xorm"
- "gopkg.in/ini.v1"
)
// MirrorQueue holds an UniqueQueue object of the mirror
@@ -71,11 +70,18 @@ func (m *Mirror) ScheduleNextUpdate() {
}
func remoteAddress(repoPath string) (string, error) {
- cfg, err := ini.Load(GitConfigPath(repoPath))
+ cmd := git.NewCommand("remote", "get-url", "origin")
+ result, err := cmd.RunInDir(repoPath)
if err != nil {
+ if strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ return "", nil
+ }
return "", err
}
- return cfg.Section("remote \"origin\"").Key("url").Value(), nil
+ if len(result) > 0 {
+ return result[:len(result)-1], nil
+ }
+ return "", nil
}
func (m *Mirror) readAddress() {
@@ -115,14 +121,15 @@ func (m *Mirror) FullAddress() string {
// SaveAddress writes new address to Git repository config.
func (m *Mirror) SaveAddress(addr string) error {
- configPath := m.Repo.GitConfigPath()
- cfg, err := ini.Load(configPath)
- if err != nil {
- return fmt.Errorf("Load: %v", err)
+ repoPath := m.Repo.RepoPath()
+ // Remove old origin
+ _, err := git.NewCommand("remote", "remove", "origin").RunInDir(repoPath)
+ if err != nil && !strings.HasPrefix(err.Error(), "exit status 128 - fatal: No such remote ") {
+ return err
}
- cfg.Section("remote \"origin\"").Key("url").SetValue(addr)
- return cfg.SaveToIndent(configPath, "\t")
+ _, err = git.NewCommand("remote", "add", "origin", addr).RunInDir(repoPath)
+ return err
}
// gitShortEmptySha Git short empty SHA
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 0dc884896..703942af7 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -566,7 +566,9 @@ mirror_prune_desc = Remove obsolete remote-tracking references
mirror_interval = Mirror Interval (valid time units are 'h', 'm', 's'). 0 to disable automatic sync.
mirror_interval_invalid = The mirror interval is not valid.
mirror_address = Clone From URL
-mirror_address_desc = Include any required authorization credentials in the URL.
+mirror_address_desc = Include any required authorization credentials in the URL. These must be url escaped as appropriate
+mirror_address_url_invalid = The provided url is invalid. You must escape all components of the url correctly.
+mirror_address_protocol_invalid = The provided url is invalid. Only http(s):// or git:// locations can be mirrored from.
mirror_last_synced = Last Synchronized
watchers = Watchers
stargazers = Stargazers
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index d68edb4e5..598f52f37 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -7,11 +7,12 @@ package repo
import (
"errors"
+ "net/url"
+ "regexp"
"strings"
"time"
"code.gitea.io/git"
-
"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/auth"
"code.gitea.io/gitea/modules/base"
@@ -21,6 +22,8 @@ import (
"code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/validation"
"code.gitea.io/gitea/routers/utils"
+
+ "github.com/mvdan/xurls"
)
const (
@@ -33,6 +36,8 @@ const (
tplProtectedBranch base.TplName = "repo/settings/protected_branch"
)
+var validFormAddress *regexp.Regexp
+
// Settings show a repository's settings page
func Settings(ctx *context.Context) {
ctx.Data["Title"] = ctx.Tr("repo.settings")
@@ -146,7 +151,38 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
return
}
}
- if err := ctx.Repo.Mirror.SaveAddress(form.MirrorAddress); err != nil {
+
+ // Validate the form.MirrorAddress
+ u, err := url.Parse(form.MirrorAddress)
+ if err != nil {
+ ctx.Data["Err_MirrorAddress"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.mirror_address_url_invalid"), tplSettingsOptions, &form)
+ return
+ }
+
+ if u.Opaque != "" || !(u.Scheme == "http" || u.Scheme == "https" || u.Scheme == "git") {
+ ctx.Data["Err_MirrorAddress"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.mirror_address_protocol_invalid"), tplSettingsOptions, &form)
+ return
+ }
+
+ // Now use xurls
+ address := validFormAddress.FindString(form.MirrorAddress)
+ if address != form.MirrorAddress && form.MirrorAddress != "" {
+ ctx.Data["Err_MirrorAddress"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.mirror_address_url_invalid"), tplSettingsOptions, &form)
+ return
+ }
+
+ if u.EscapedPath() == "" || u.Host == "" || !u.IsAbs() {
+ ctx.Data["Err_MirrorAddress"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.mirror_address_url_invalid"), tplSettingsOptions, &form)
+ return
+ }
+
+ address = u.String()
+
+ if err := ctx.Repo.Mirror.SaveAddress(address); err != nil {
ctx.ServerError("SaveAddress", err)
return
}
@@ -683,3 +719,11 @@ func DeleteDeployKey(ctx *context.Context) {
"redirect": ctx.Repo.RepoLink + "/settings/keys",
})
}
+
+func init() {
+ var err error
+ validFormAddress, err = xurls.StrictMatchingScheme(`(https?)|(git)://`)
+ if err != nil {
+ panic(err)
+ }
+}
diff --git a/templates/repo/settings/options.tmpl b/templates/repo/settings/options.tmpl
index 94fbcbe65..667b94001 100644
--- a/templates/repo/settings/options.tmpl
+++ b/templates/repo/settings/options.tmpl
@@ -58,7 +58,7 @@
<label for="interval">{{.i18n.Tr "repo.mirror_interval"}}</label>
<input id="interval" name="interval" value="{{.MirrorInterval}}">
</div>
- <div class="field">
+ <div class="field {{if .Err_MirrorAddress}}error{{end}}">
<label for="mirror_address">{{.i18n.Tr "repo.mirror_address"}}</label>
<input id="mirror_address" name="mirror_address" value="{{.Mirror.FullAddress}}" required>
<p class="help">{{.i18n.Tr "repo.mirror_address_desc"}}</p>