Skip to content

Commit ca35dec

Browse files
authoredJun 5, 2023
Add ability to set multiple redirect URIs in OAuth application UI (#25072)
OAuth applications can already have multiple redirect URIs if created/edited over API. This change allows for setting multiple redirect URIs through the UI as a comma-separated list (e. g. `https://example.org/redirect,https://redirect.example.org`) <details> <summary>Screenshots</summary> ![Bildschirmfoto vom 2023-06-04 17-14-40](https://github.com/go-gitea/gitea/assets/47871822/2206dc32-e7e4-4953-9ecb-e098890b3f54) ![Bildschirmfoto vom 2023-06-04 17-14-50](https://github.com/go-gitea/gitea/assets/47871822/cd97c73c-9310-44ee-a83a-b927a1ef94da) </details> Closes #25068
1 parent 7d192cb commit ca35dec

File tree

7 files changed

+27
-17
lines changed

7 files changed

+27
-17
lines changed
 

‎models/auth/oauth2.go

-8
Original file line numberDiff line numberDiff line change
@@ -51,14 +51,6 @@ func (app *OAuth2Application) TableName() string {
5151
return "oauth2_application"
5252
}
5353

54-
// PrimaryRedirectURI returns the first redirect uri or an empty string if empty
55-
func (app *OAuth2Application) PrimaryRedirectURI() string {
56-
if len(app.RedirectURIs) == 0 {
57-
return ""
58-
}
59-
return app.RedirectURIs[0]
60-
}
61-
6254
// ContainsRedirectURI checks if redirectURI is allowed for app
6355
func (app *OAuth2Application) ContainsRedirectURI(redirectURI string) bool {
6456
if !app.ConfidentialClient {

‎modules/util/truncate.go

+18-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33

44
package util
55

6-
import "unicode/utf8"
6+
import (
7+
"strings"
8+
"unicode/utf8"
9+
)
710

811
// in UTF8 "…" is 3 bytes so doesn't really gain us anything...
912
const (
@@ -35,3 +38,17 @@ func SplitStringAtByteN(input string, n int) (left, right string) {
3538

3639
return input[:end] + utf8Ellipsis, utf8Ellipsis + input[end:]
3740
}
41+
42+
// SplitTrimSpace splits the string at given separator and trims leading and trailing space
43+
func SplitTrimSpace(input, sep string) []string {
44+
// replace CRLF with LF
45+
input = strings.ReplaceAll(input, "\r\n", "\n")
46+
47+
var stringList []string
48+
for _, s := range strings.Split(input, sep) {
49+
// trim leading and trailing space
50+
stringList = append(stringList, strings.TrimSpace(s))
51+
}
52+
53+
return stringList
54+
}

‎options/locale/locale_en-US.ini

+1-1
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ create_oauth2_application_success = You've successfully created a new OAuth2 app
826826
update_oauth2_application_success = You've successfully updated the OAuth2 application.
827827
oauth2_application_name = Application Name
828828
oauth2_confidential_client = Confidential Client. Select for apps that keep the secret confidential, such as web apps. Do not select for native apps including desktop and mobile apps.
829-
oauth2_redirect_uri = Redirect URI
829+
oauth2_redirect_uris = Redirect URIs. Please use a new line for every URI.
830830
save_application = Save
831831
oauth2_client_id = Client ID
832832
oauth2_client_secret = Client Secret

‎routers/web/user/setting/oauth2_common.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"code.gitea.io/gitea/models/auth"
1111
"code.gitea.io/gitea/modules/base"
1212
"code.gitea.io/gitea/modules/context"
13+
"code.gitea.io/gitea/modules/util"
1314
"code.gitea.io/gitea/modules/web"
1415
"code.gitea.io/gitea/services/forms"
1516
)
@@ -40,7 +41,7 @@ func (oa *OAuth2CommonHandlers) AddApp(ctx *context.Context) {
4041
// TODO validate redirect URI
4142
app, err := auth.CreateOAuth2Application(ctx, auth.CreateOAuth2ApplicationOptions{
4243
Name: form.Name,
43-
RedirectURIs: []string{form.RedirectURI},
44+
RedirectURIs: util.SplitTrimSpace(form.RedirectURIs, "\n"),
4445
UserID: oa.OwnerID,
4546
ConfidentialClient: form.ConfidentialClient,
4647
})
@@ -93,7 +94,7 @@ func (oa *OAuth2CommonHandlers) EditSave(ctx *context.Context) {
9394
if ctx.Data["App"], err = auth.UpdateOAuth2Application(auth.UpdateOAuth2ApplicationOptions{
9495
ID: ctx.ParamsInt64("id"),
9596
Name: form.Name,
96-
RedirectURIs: []string{form.RedirectURI},
97+
RedirectURIs: util.SplitTrimSpace(form.RedirectURIs, "\n"),
9798
UserID: oa.OwnerID,
9899
ConfidentialClient: form.ConfidentialClient,
99100
}); err != nil {

‎services/forms/user_form.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ func (f *NewAccessTokenForm) GetScope() (auth_model.AccessTokenScope, error) {
398398
// EditOAuth2ApplicationForm form for editing oauth2 applications
399399
type EditOAuth2ApplicationForm struct {
400400
Name string `binding:"Required;MaxSize(255)" form:"application_name"`
401-
RedirectURI string `binding:"Required" form:"redirect_uri"`
401+
RedirectURIs string `binding:"Required" form:"redirect_uris"`
402402
ConfidentialClient bool `form:"confidential_client"`
403403
}
404404

‎templates/user/settings/applications_oauth2_edit_form.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
<input id="application-name" value="{{.App.Name}}" name="application_name" required maxlength="255">
4040
</div>
4141
<div class="field {{if .Err_RedirectURI}}error{{end}}">
42-
<label for="redirect-uri">{{.locale.Tr "settings.oauth2_redirect_uri"}}</label>
43-
<input type="url" name="redirect_uri" value="{{.App.PrimaryRedirectURI}}" id="redirect-uri" required>
42+
<label for="redirect-uris">{{.locale.Tr "settings.oauth2_redirect_uris"}}</label>
43+
<textarea name="redirect_uris" id="redirect-uris" required>{{StringUtils.Join .App.RedirectURIs "\n"}}</textarea>
4444
</div>
4545
<div class="field ui checkbox {{if .Err_ConfidentialClient}}error{{end}}">
4646
<label>{{.locale.Tr "settings.oauth2_confidential_client"}}</label>

‎templates/user/settings/applications_oauth2_list.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
<input id="application-name" name="application_name" value="{{.application_name}}" required maxlength="255">
3535
</div>
3636
<div class="field {{if .Err_RedirectURI}}error{{end}}">
37-
<label for="redirect-uri">{{.locale.Tr "settings.oauth2_redirect_uri"}}</label>
38-
<input type="url" name="redirect_uri" id="redirect-uri">
37+
<label for="redirect-uris">{{.locale.Tr "settings.oauth2_redirect_uris"}}</label>
38+
<textarea name="redirect_uris" id="redirect-uris"></textarea>
3939
</div>
4040
<div class="field ui checkbox {{if .Err_ConfidentialClient}}error{{end}}">
4141
<label>{{.locale.Tr "settings.oauth2_confidential_client"}}</label>

0 commit comments

Comments
 (0)
Please sign in to comment.