-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use fetch to send requests to create issues/comments (#25258)
Follow #23290 Network error won't make content lost. And this is a much better approach than "loading-button". The UI is not perfect and there are still some TODOs, they can be done in following PRs, not a must in this PR's scope. <details> ![image](https://github.com/go-gitea/gitea/assets/2114189/c94ba958-aa46-4747-8ddf-6584deeed25c) </details>
- Loading branch information
1 parent
a305c37
commit b71cb7a
Showing
14 changed files
with
163 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package httplib | ||
|
||
import ( | ||
"net/url" | ||
"strings" | ||
|
||
"code.gitea.io/gitea/modules/setting" | ||
) | ||
|
||
// IsRiskyRedirectURL returns true if the URL is considered risky for redirects | ||
func IsRiskyRedirectURL(s string) bool { | ||
// Unfortunately browsers consider a redirect Location with preceding "//", "\\", "/\" and "\/" as meaning redirect to "http(s)://REST_OF_PATH" | ||
// Therefore we should ignore these redirect locations to prevent open redirects | ||
if len(s) > 1 && (s[0] == '/' || s[0] == '\\') && (s[1] == '/' || s[1] == '\\') { | ||
return true | ||
} | ||
|
||
u, err := url.Parse(s) | ||
if err != nil || ((u.Scheme != "" || u.Host != "") && !strings.HasPrefix(strings.ToLower(s), strings.ToLower(setting.AppURL))) { | ||
return true | ||
} | ||
|
||
return false | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package httplib | ||
|
||
import ( | ||
"testing" | ||
|
||
"code.gitea.io/gitea/modules/setting" | ||
|
||
"github.com/stretchr/testify/assert" | ||
) | ||
|
||
func TestIsRiskyRedirectURL(t *testing.T) { | ||
setting.AppURL = "http://localhost:3000/" | ||
tests := []struct { | ||
input string | ||
want bool | ||
}{ | ||
{"", false}, | ||
{"foo", false}, | ||
{"/", false}, | ||
{"/foo?k=%20#abc", false}, | ||
|
||
{"//", true}, | ||
{"\\\\", true}, | ||
{"/\\", true}, | ||
{"\\/", true}, | ||
{"mail:a@b.com", true}, | ||
{"https://test.com", true}, | ||
{setting.AppURL + "/foo", false}, | ||
} | ||
for _, tt := range tests { | ||
t.Run(tt.input, func(t *testing.T) { | ||
assert.Equal(t, tt.want, IsRiskyRedirectURL(tt.input)) | ||
}) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Copyright 2023 The Gitea Authors. All rights reserved. | ||
// SPDX-License-Identifier: MIT | ||
|
||
package common | ||
|
||
import ( | ||
"net/http" | ||
|
||
"code.gitea.io/gitea/modules/httplib" | ||
) | ||
|
||
// FetchRedirectDelegate helps the "fetch" requests to redirect to the correct location | ||
func FetchRedirectDelegate(resp http.ResponseWriter, req *http.Request) { | ||
// When use "fetch" to post requests and the response is a redirect, browser's "location.href = uri" has limitations. | ||
// 1. change "location" from old "/foo" to new "/foo#hash", the browser will not reload the page. | ||
// 2. when use "window.reload()", the hash is not respected, the newly loaded page won't scroll to the hash target. | ||
// The typical page is "issue comment" page. The backend responds "/owner/repo/issues/1#comment-2", | ||
// then frontend needs this delegate to redirect to the new location with hash correctly. | ||
redirect := req.PostFormValue("redirect") | ||
if httplib.IsRiskyRedirectURL(redirect) { | ||
resp.WriteHeader(http.StatusBadRequest) | ||
return | ||
} | ||
resp.Header().Add("Location", redirect) | ||
resp.WriteHeader(http.StatusSeeOther) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.