@@ -7,6 +7,8 @@ package repo
77
88import (
99 "errors"
10+ "net/url"
11+ "regexp"
1012 "strings"
1113 "time"
1214
@@ -21,6 +23,8 @@ import (
2123 "code.gitea.io/gitea/modules/util"
2224 "code.gitea.io/gitea/modules/validation"
2325 "code.gitea.io/gitea/routers/utils"
26+
27+ "github.com/mvdan/xurls"
2428)
2529
2630const (
@@ -33,6 +37,8 @@ const (
3337 tplProtectedBranch base.TplName = "repo/settings/protected_branch"
3438)
3539
40+ var validFormAddress * regexp.Regexp
41+
3642// Settings show a repository's settings page
3743func Settings (ctx * context.Context ) {
3844 ctx .Data ["Title" ] = ctx .Tr ("repo.settings" )
@@ -140,7 +146,38 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
140146 return
141147 }
142148 }
143- if err := ctx .Repo .Mirror .SaveAddress (form .MirrorAddress ); err != nil {
149+
150+ // Validate the form.MirrorAddress
151+ u , err := url .Parse (form .MirrorAddress )
152+ if err != nil {
153+ ctx .Data ["Err_MirrorAddress" ] = true
154+ ctx .RenderWithErr (ctx .Tr ("repo.mirror_address_url_invalid" ), tplSettingsOptions , & form )
155+ return
156+ }
157+
158+ if u .Opaque != "" || ! (u .Scheme == "http" || u .Scheme == "https" || u .Scheme == "git" ) {
159+ ctx .Data ["Err_MirrorAddress" ] = true
160+ ctx .RenderWithErr (ctx .Tr ("repo.mirror_address_protocol_invalid" ), tplSettingsOptions , & form )
161+ return
162+ }
163+
164+ // Now use xurls
165+ address := validFormAddress .FindString (form .MirrorAddress )
166+ if address != form .MirrorAddress && form .MirrorAddress != "" {
167+ ctx .Data ["Err_MirrorAddress" ] = true
168+ ctx .RenderWithErr (ctx .Tr ("repo.mirror_address_url_invalid" ), tplSettingsOptions , & form )
169+ return
170+ }
171+
172+ if u .EscapedPath () == "" || u .Host == "" || ! u .IsAbs () {
173+ ctx .Data ["Err_MirrorAddress" ] = true
174+ ctx .RenderWithErr (ctx .Tr ("repo.mirror_address_url_invalid" ), tplSettingsOptions , & form )
175+ return
176+ }
177+
178+ address = u .String ()
179+
180+ if err := ctx .Repo .Mirror .SaveAddress (address ); err != nil {
144181 ctx .ServerError ("SaveAddress" , err )
145182 return
146183 }
@@ -618,3 +655,11 @@ func DeleteDeployKey(ctx *context.Context) {
618655 "redirect" : ctx .Repo .RepoLink + "/settings/keys" ,
619656 })
620657}
658+
659+ func init () {
660+ var err error
661+ validFormAddress , err = xurls .StrictMatchingScheme (`(https?)|(git)://` )
662+ if err != nil {
663+ panic (err )
664+ }
665+ }
0 commit comments