diff --git a/api/_common/middleware.js b/api/_common/middleware.js index b00f3b6b..2c5d801f 100644 --- a/api/_common/middleware.js +++ b/api/_common/middleware.js @@ -8,6 +8,9 @@ const TIMEOUT = process.env.API_TIMEOUT_LIMIT ? parseInt(process.env.API_TIMEOUT // If present, set CORS allowed origins for responses const ALLOWED_ORIGINS = process.env.API_CORS_ORIGIN || '*'; +// Disable everything :( Setting this env var will turn off the instance, and show message +const DISABLE_EVERYTHING = !!process.env.VITE_DISABLE_EVERYTHING; + // Set the platform currently being used let PLATFORM = 'NETLIFY'; if (process.env.PLATFORM) { PLATFORM = process.env.PLATFORM.toUpperCase(); } @@ -21,7 +24,6 @@ const headers = { 'Content-Type': 'application/json;charset=UTF-8', }; - const timeoutErrorMsg = 'You can re-trigger this request, by clicking "Retry"\n' + 'If you\'re running your own instance of Web Check, then you can ' + 'resolve this issue, by increasing the timeout limit in the ' @@ -31,6 +33,14 @@ const timeoutErrorMsg = 'You can re-trigger this request, by clicking "Retry"\n' + 'in order to keep running costs affordable, so that Web Check can ' + 'remain freely available for everyone.'; +const disabledErrorMsg = 'Error - WebCheck Temporarily Disabled.\n\n' ++ 'We\'re sorry, but due to the increased cost of running Web Check ' ++ 'we\'ve had to temporatily disable the public instand. ' ++ 'We\'re activley looking for affordable ways to keep Web Check running, ' ++ 'while free to use for everybody.\n' ++ 'In the meantime, since we\'ve made our code free and open source, ' ++ 'you can get Web Check running on your own system, by following the instructions in our GitHub repo'; + // A middleware function used by all API routes on all platforms const commonMiddleware = (handler) => { @@ -45,6 +55,11 @@ const commonMiddleware = (handler) => { // Vercel const vercelHandler = async (request, response) => { + + if (DISABLE_EVERYTHING) { + response.status(503).json({ error: disabledErrorMsg }); + } + const queryParams = request.query || {}; const rawUrl = queryParams.url; @@ -83,6 +98,15 @@ const commonMiddleware = (handler) => { const queryParams = event.queryStringParameters || event.query || {}; const rawUrl = queryParams.url; + if (DISABLE_EVERYTHING) { + callback(null, { + statusCode: 503, + body: JSON.stringify({ error: 'Web-Check is temporarily disabled. Please try again later.' }), + headers, + }); + return; + } + if (!rawUrl) { callback(null, { statusCode: 500, diff --git a/src/components/homepage/TempDisabled.astro b/src/components/homepage/TempDisabled.astro new file mode 100644 index 00000000..7ff564fe --- /dev/null +++ b/src/components/homepage/TempDisabled.astro @@ -0,0 +1,27 @@ + + + diff --git a/src/pages/index.astro b/src/pages/index.astro index 60e41202..2ba3b726 100644 --- a/src/pages/index.astro +++ b/src/pages/index.astro @@ -1,12 +1,15 @@ --- import BaseLayout from '@layouts/Base.astro'; import HeroForm from '@components/homepage/HeroForm.astro'; +import TempDisabled from '@/components/homepage/TempDisabled.astro'; import HomeBackground from '@/components/homepage/HomeBackground'; import AboutSection from '@/components/homepage/AboutSection.astro'; import Footer from '@components/scafold/Footer.astro'; const isBossServer = import.meta.env.BOSS_SERVER === true; +const disableEverything = import.meta.env.VITE_DISABLE_EVERYTHING === true; + // Redirect strait to /check or /check/:url if running as self-hosted instance if (!isBossServer) { const searchUrl = new URLSearchParams(new URL(Astro.request.url).search).get('url'); @@ -20,6 +23,7 @@ if (!isBossServer) { {!isBossServer && ()} + { disableEverything && }
diff --git a/src/web-check-live/hooks/motherOfAllHooks.ts b/src/web-check-live/hooks/motherOfAllHooks.ts index fef5cabd..850644df 100644 --- a/src/web-check-live/hooks/motherOfAllHooks.ts +++ b/src/web-check-live/hooks/motherOfAllHooks.ts @@ -4,6 +4,7 @@ import 'react-toastify/dist/ReactToastify.css'; import type { LoadingState } from 'web-check-live/components/misc/ProgressBar'; import type { AddressType } from 'web-check-live/utils/address-type-checker'; +import keys from 'web-check-live/utils/get-keys'; interface UseIpAddressProps { // Unique identifier for this job type @@ -37,6 +38,10 @@ const useMotherOfAllHooks = (params: UseIpAddressProps { + if (keys.disableEverything) { + updateLoadingJobs(jobId, 'skipped', 'Web-Check is temporarily disabled. Please try again later.', reset); + return Promise.resolve(); + } return fetchRequest() .then((res: any) => { if (!res) { // No response :( diff --git a/src/web-check-live/utils/get-keys.ts b/src/web-check-live/utils/get-keys.ts index 71c7aaae..d6988739 100644 --- a/src/web-check-live/utils/get-keys.ts +++ b/src/web-check-live/utils/get-keys.ts @@ -2,6 +2,7 @@ const keys = { shodan: import.meta.env.REACT_APP_SHODAN_API_KEY || "default_value_if_not_set", whoApi: import.meta.env.REACT_APP_WHO_API_KEY || "default_value_if_not_set", + disableEverything: import.meta.env.VITE_DISABLE_EVERYTHING === 'true', }; // const keys = process && process.env ? { // shodan: process.env.REACT_APP_SHODAN_API_KEY,