@@ -7,9 +7,12 @@ package forms
77import (
88 "mime/multipart"
99 "net/http"
10+ "strings"
1011
1112 user_model "code.gitea.io/gitea/models/user"
13+ "code.gitea.io/gitea/modules/setting"
1214 "code.gitea.io/gitea/modules/structs"
15+ "code.gitea.io/gitea/modules/util"
1316 "code.gitea.io/gitea/modules/web/middleware"
1417 "code.gitea.io/gitea/services/context"
1518
@@ -356,14 +359,31 @@ func (f *NewAccessTokenForm) Validate(req *http.Request, errs binding.Errors) bi
356359// EditOAuth2ApplicationForm form for editing oauth2 applications
357360type EditOAuth2ApplicationForm struct {
358361 Name string `binding:"Required;MaxSize(255)" form:"application_name"`
359- RedirectURIs string `binding:"Required;ValidUrlList " form:"redirect_uris"`
362+ RedirectURIs string `binding:"Required" form:"redirect_uris"`
360363 ConfidentialClient bool `form:"confidential_client"`
361364 SkipSecondaryAuthorization bool `form:"skip_secondary_authorization"`
362365}
363366
367+ func DetectInvalidOAuth2ApplicationRedirectURI (uris []string ) (invalidURL string ) {
368+ for _ , u := range uris {
369+ scheme , _ , ok := strings .Cut (u , ":" )
370+ valid := ok && (strings .EqualFold (scheme , "http" ) ||
371+ strings .EqualFold (scheme , "https" ) ||
372+ util .SliceContainsString (setting .OAuth2 .CustomSchemes , scheme , true ))
373+ if ! valid {
374+ return u
375+ }
376+ }
377+ return ""
378+ }
379+
364380// Validate validates the fields
365381func (f * EditOAuth2ApplicationForm ) Validate (req * http.Request , errs binding.Errors ) binding.Errors {
366382 ctx := context .GetValidateContext (req )
383+ invalidURI := DetectInvalidOAuth2ApplicationRedirectURI (util .SplitTrimSpace (f .RedirectURIs , "\n " ))
384+ if invalidURI != "" {
385+ middleware .ReportValidationError (errs , ctx .Data , "RedirectURIs" , binding .ERR_URL , ctx .Locale .TrString ("form.url_error" , invalidURI ))
386+ }
367387 return middleware .Validate (errs , ctx .Data , f , ctx .Locale )
368388}
369389
0 commit comments