diff --git a/client/model/session.js b/client/model/session.js index e6bf5249..1b3f019a 100644 --- a/client/model/session.js +++ b/client/model/session.js @@ -7,8 +7,11 @@ class SessionManager { .then((data) => data.result); } - oauth2(url) { - return http_get(url) + oauth2(url, next) { + const u = new URL(document.location); + u.pathname = url; + if (next) u.searchParams.set("next", next); + return http_get(u.toString()) .then((data) => data.result); } diff --git a/client/pages/connectpage.js b/client/pages/connectpage.js index b1cf691c..2d0f09f1 100644 --- a/client/pages/connectpage.js +++ b/client/pages/connectpage.js @@ -37,7 +37,7 @@ function ConnectPageComponent({ error, history }) { return; } else if ("oauth2" in formData) { setIsLoading(true); - Session.oauth2(formData["oauth2"]).then((url) => { + Session.oauth2(formData["oauth2"], _GET["next"]).then((url) => { window.location.href = url; }).catch((err) => error(err)); return; @@ -60,7 +60,12 @@ function ConnectPageComponent({ error, history }) { useEffect(() => { if (_GET["state"]) { // oauth2/oidc - authenticate({ ..._GET, type: _GET["state"] }).catch((err) => error(err)); + const [type, next] = _GET["state"].split("::") + authenticate({ + ..._GET, + next: next, + type: type, + }).catch((err) => error(err)); } else if (_GET["type"]) { // form using get authenticate(_GET).catch((err) => error(err)); } diff --git a/server/ctrl/session.go b/server/ctrl/session.go index bfab890a..0a8016d5 100644 --- a/server/ctrl/session.go +++ b/server/ctrl/session.go @@ -7,6 +7,7 @@ import ( . "github.com/mickael-kerjean/filestash/server/middleware" "github.com/mickael-kerjean/filestash/server/model" "net/http" + "net/url" "strings" "time" ) @@ -153,11 +154,24 @@ func SessionOAuthBackend(ctx App, res http.ResponseWriter, req *http.Request) { SendErrorResult(res, ErrNotSupported) return } - if strings.Contains(req.Header.Get("Accept"), "text/html") { - http.Redirect(res, req, obj.OAuthURL(), http.StatusSeeOther) + redirectUrl, err := url.Parse(obj.OAuthURL()) + if err != nil { + Log.Debug("session::oauth 'Parse URL - \"%s\"'", a["type"]) + SendErrorResult(res, ErrNotValid) return } - SendSuccessResult(res, obj.OAuthURL()) + stateValue := vars["service"] + if req.URL.Query().Get("next") != "" { + stateValue += "::" + req.URL.Query().Get("next") + } + q := redirectUrl.Query() + q.Set("state", stateValue) + redirectUrl.RawQuery = q.Encode() + if strings.Contains(req.Header.Get("Accept"), "text/html") { + http.Redirect(res, req, redirectUrl.String(), http.StatusSeeOther) + return + } + SendSuccessResult(res, redirectUrl.String()) } func SessionAuthMiddleware(ctx App, res http.ResponseWriter, req *http.Request) { diff --git a/server/plugin/plg_backend_dropbox/index.go b/server/plugin/plg_backend_dropbox/index.go index 1ed44843..cda4f156 100644 --- a/server/plugin/plg_backend_dropbox/index.go +++ b/server/plugin/plg_backend_dropbox/index.go @@ -70,7 +70,6 @@ func (d Dropbox) OAuthURL() string { url += "client_id=" + d.ClientId url += "&redirect_uri=https://" + d.Hostname + "/login" url += "&response_type=token" - url += "&state=dropbox" return url }