Browse Source

refactor: Disable password resets and email-related actions if mail disabled

Owen Diffey 1 year ago
parent
commit
92efa52a73

+ 2 - 0
backend/logic/actions/users.js

@@ -2956,6 +2956,8 @@ export default {
 		async.waterfall(
 			[
 				next => {
+					if (!config.get("mail.enabled")) return next("Password resets are disabled.");
+
 					if (!email || typeof email !== "string") return next("Invalid email.");
 					email = email.toLowerCase();
 					return userModel.findOne({ "email.address": email }, next);

+ 2 - 2
backend/logic/hooks/hasPermission.js

@@ -62,8 +62,8 @@ permissions.moderator = {
 	"stations.remove": false,
 	"users.get": true,
 	"users.ban": true,
-	"users.requestPasswordReset": true,
-	"users.resendVerifyEmail": true,
+	"users.requestPasswordReset": config.get("mail.enabled"),
+	"users.resendVerifyEmail": config.get("mail.enabled"),
 	"users.update": true,
 	"youtube.requestSetAdmin": true,
 	...(config.get("experimental.soundcloud")

+ 1 - 0
backend/logic/ws.js

@@ -600,6 +600,7 @@ class _WSModule extends CoreClass {
 					footerLinks: config.get("footerLinks"),
 					shortcutOverrides: config.get("shortcutOverrides"),
 					registrationDisabled: config.get("registrationDisabled"),
+					mailEnabled: config.get("mail.enabled"),
 					experimental: {
 						changable_listen_mode: config.get("experimental.changable_listen_mode"),
 						media_session: config.get("experimental.media_session"),

+ 4 - 1
frontend/src/components/modals/Login.vue

@@ -114,7 +114,10 @@ const githubRedirect = () => {
 						</a>
 					</div>
 
-					<p class="content-box-optional-helper">
+					<p
+						v-if="configStore.mailEnabled"
+						class="content-box-optional-helper"
+					>
 						<router-link
 							id="forgot-password"
 							to="/reset_password"

+ 4 - 1
frontend/src/components/modals/RemoveAccount.vue

@@ -165,7 +165,10 @@ onMounted(async () => {
 					Confirming your password will let us verify your identity.
 				</p>
 
-				<p class="content-box-optional-helper">
+				<p
+					v-if="configStore.mailEnabled"
+					class="content-box-optional-helper"
+				>
 					<router-link id="forgot-password" to="/reset_password">
 						Forgot password?
 					</router-link>

+ 1 - 1
frontend/src/components/modals/ViewMedia.vue

@@ -161,7 +161,7 @@ onBeforeUnmount(() => {
 </script>
 
 <template>
-	<modal title="View Song">
+	<modal title="View Media">
 		<template #body>
 			<template v-if="loaded">
 				<template v-if="currentSongMediaType === 'youtube'">

+ 12 - 2
frontend/src/main.ts

@@ -135,13 +135,17 @@ const router = createRouter({
 		},
 		{
 			path: "/reset_password",
-			component: () => import("@/pages/ResetPassword.vue")
+			component: () => import("@/pages/ResetPassword.vue"),
+			meta: {
+				configRequired: "mailEnabled"
+			}
 		},
 		{
 			path: "/set_password",
 			props: { mode: "set" },
 			component: () => import("@/pages/ResetPassword.vue"),
 			meta: {
+				configRequired: "mailEnabled",
 				loginRequired: true
 			}
 		},
@@ -288,12 +292,18 @@ createSocket().then(async socket => {
 			delete query.toast;
 			next({ ...to, query });
 		} else if (
+			to.meta.configRequired ||
 			to.meta.loginRequired ||
 			to.meta.permissionRequired ||
 			to.meta.guestsOnly
 		) {
 			const gotData = () => {
-				if (to.meta.loginRequired && !userAuthStore.loggedIn)
+				if (
+					to.meta.configRequired &&
+					!configStore.get(`${to.meta.configRequired}`)
+				)
+					next({ path: "/" });
+				else if (to.meta.loginRequired && !userAuthStore.loggedIn)
 					next({ path: "/login" });
 				else if (
 					to.meta.permissionRequired &&

+ 11 - 0
frontend/src/stores/config.ts

@@ -14,6 +14,7 @@ export const useConfigStore = defineStore("config", {
 		footerLinks: Record<string, string | boolean>;
 		shortcutOverrides: Record<string, any>;
 		registrationDisabled: boolean;
+		mailEnabled: boolean;
 		experimental: {
 			changable_listen_mode: string[] | boolean;
 			media_session: boolean;
@@ -38,6 +39,7 @@ export const useConfigStore = defineStore("config", {
 		footerLinks: {},
 		shortcutOverrides: {},
 		registrationDisabled: false,
+		mailEnabled: true,
 		experimental: {
 			changable_listen_mode: [],
 			media_session: false,
@@ -47,6 +49,15 @@ export const useConfigStore = defineStore("config", {
 			spotify: false
 		}
 	}),
+	actions: {
+		get(query: string) {
+			let config = JSON.parse(JSON.stringify(this.$state));
+			query.split(".").forEach(property => {
+				config = config[property];
+			});
+			return config;
+		}
+	},
 	getters: {
 		urls() {
 			const { protocol, host } = document.location;