diff --git a/cmd/config.go b/cmd/config.go index de55c28e..1a2f000d 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -38,6 +38,8 @@ func addConfigFlags(flags *pflag.FlagSet) { flags.String("auth.header", "", "HTTP header for auth.method=proxy") flags.String("auth.command", "", "command for auth.method=hook") + flags.String("logoutpage", "", "custom logout page") + flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China") flags.String("recaptcha.key", "", "ReCaptcha site key") flags.String("recaptcha.secret", "", "ReCaptcha secret") @@ -145,6 +147,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup) fmt.Fprintf(w, "Create User Dir:\t%t\n", set.CreateUserDir) fmt.Fprintf(w, "Auth method:\t%s\n", set.AuthMethod) + fmt.Fprintf(w, "LogoutPage:\t%s\n", set.LogoutPage) fmt.Fprintf(w, "Shell:\t%s\t\n", strings.Join(set.Shell, " ")) fmt.Fprintln(w, "\nBranding:") fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name) diff --git a/cmd/config_set.go b/cmd/config_set.go index 23ff7e1b..a5062ce9 100644 --- a/cmd/config_set.go +++ b/cmd/config_set.go @@ -47,6 +47,8 @@ you want to change. Other options will remain unchanged.`, set.Signup = mustGetBool(flags, flag.Name) case "auth.method": hasAuth = true + case "logoutpage": + set.LogoutPage = mustGetString(flags, flag.Name) case "shell": set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name)) case "create-user-dir": diff --git a/frontend/index.html b/frontend/index.html index 02c303ae..85f5c1cd 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -56,6 +56,7 @@ DisableUsedPercentage: false, EnableExec: true, EnableThumbs: true, + LogoutPage: "", LoginPage: true, Name: "", NoAuth: false, diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue index 4d55cf0f..ee2e5dd7 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -124,6 +124,7 @@ import { disableExternal, disableUsedPercentage, noAuth, + logoutPage, loginPage, } from "@/utils/constants"; import { files as api } from "@/api"; @@ -153,7 +154,7 @@ export default { version: () => version, disableExternal: () => disableExternal, disableUsedPercentage: () => disableUsedPercentage, - canLogout: () => !noAuth && loginPage, + canLogout: () => !noAuth && (loginPage || logoutPage !== "/login"), }, methods: { ...mapActions(useLayoutStore, ["closeHovers", "showHover"]), diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index b868d90f..985d5b2d 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -2,7 +2,7 @@ import { useAuthStore } from "@/stores/auth"; import router from "@/router"; import type { JwtPayload } from "jwt-decode"; import { jwtDecode } from "jwt-decode"; -import { baseURL, noAuth } from "./constants"; +import { baseURL, noAuth, logoutPage } from "./constants"; import { StatusError } from "@/api/utils"; export function parseToken(token: string) { @@ -101,6 +101,8 @@ export function logout() { localStorage.setItem("jwt", ""); if (noAuth) { window.location.reload(); + } else if (logoutPage !== "/login") { + document.location.href = `${logoutPage}`; } else { router.push({ path: "/login" }); } diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index 3f131b1a..a9678f24 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -10,6 +10,7 @@ const version: string = window.FileBrowser.Version; const logoURL = `${staticURL}/img/logo.svg`; const noAuth: boolean = window.FileBrowser.NoAuth; const authMethod = window.FileBrowser.AuthMethod; +const logoutPage: string = window.FileBrowser.LogoutPage || "/login"; const loginPage: boolean = window.FileBrowser.LoginPage; const theme: UserTheme = window.FileBrowser.Theme; const enableThumbs: boolean = window.FileBrowser.EnableThumbs; @@ -31,6 +32,7 @@ export { version, noAuth, authMethod, + logoutPage, loginPage, theme, enableThumbs, diff --git a/http/static.go b/http/static.go index 47d828c6..f5e6cc8b 100644 --- a/http/static.go +++ b/http/static.go @@ -38,6 +38,7 @@ func handleWithStaticData(w http.ResponseWriter, _ *http.Request, d *data, fSys "Signup": d.settings.Signup, "NoAuth": d.settings.AuthMethod == auth.MethodNoAuth, "AuthMethod": d.settings.AuthMethod, + "LogoutPage": d.settings.LogoutPage, "LoginPage": auther.LoginPage(), "CSS": false, "ReCaptcha": false, diff --git a/settings/settings.go b/settings/settings.go index 22908396..0eb2c9a8 100644 --- a/settings/settings.go +++ b/settings/settings.go @@ -9,7 +9,10 @@ import ( "github.com/filebrowser/filebrowser/v2/rules" ) -const DefaultUsersHomeBasePath = "/users" +const ( + DefaultLogoutPage = "/login" + DefaultUsersHomeBasePath = "/users" +) // AuthMethod describes an authentication method. type AuthMethod string @@ -22,6 +25,7 @@ type Settings struct { UserHomeBasePath string `json:"userHomeBasePath"` Defaults UserDefaults `json:"defaults"` AuthMethod AuthMethod `json:"authMethod"` + LogoutPage string `json:"logoutPage"` Branding Branding `json:"branding"` Tus Tus `json:"tus"` Commands map[string][]string `json:"commands"` diff --git a/settings/storage.go b/settings/storage.go index a006a84b..d64239e5 100644 --- a/settings/storage.go +++ b/settings/storage.go @@ -33,6 +33,9 @@ func (s *Storage) Get() (*Settings, error) { if set.UserHomeBasePath == "" { set.UserHomeBasePath = DefaultUsersHomeBasePath } + if set.LogoutPage == "" { + set.LogoutPage = DefaultLogoutPage + } if set.Tus == (Tus{}) { set.Tus = Tus{ ChunkSize: DefaultTusChunkSize,