From 1551599305ec965d6c9742c78728200a67b53614 Mon Sep 17 00:00:00 2001 From: nmemmert Date: Mon, 4 May 2026 13:56:04 -0400 Subject: [PATCH] Beta: TOTP 2FA, admin asset manager, resource page redesign, rate limiting, and security hardening --- .env | 1 - .gitignore | 6 + data/admin-content-draft.json | 15 +- data/admin-content.json | 15 +- ...iscussion_questions_post-1777565348551.png | Bin 71248 -> 0 bytes data/uploads/titus-series-1777568297943.png | Bin 27849 -> 0 bytes .../titus_study_cover-1777916521873.png | Bin 0 -> 60425 bytes package-lock.json | 327 +++++++++- package.json | 6 +- server.js | 285 +++++---- server/auth.js | 188 +++++- server/helpers.js | 5 + src/AdminPage.tsx | 559 +++++++++++++++--- src/App.css | 528 +++++------------ src/App.tsx | 340 +++++++++-- src/content.ts | 4 + 16 files changed, 1597 insertions(+), 682 deletions(-) delete mode 100644 .env delete mode 100644 data/uploads/discussion_questions_post-1777565348551.png delete mode 100644 data/uploads/titus-series-1777568297943.png create mode 100644 data/uploads/titus_study_cover-1777916521873.png diff --git a/.env b/.env deleted file mode 100644 index dce304b..0000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -ADMIN_PASSWORD=TestAdmin123! diff --git a/.gitignore b/.gitignore index 1ab79e6..7215005 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,12 @@ data/backups/ data/hit-stats.json data/visitor-stats.json data/contact-submissions.json +data/totp-secret.json +data/uploads-meta.json + +# Local environment secrets — never commit +.env +.env.* # Editor directories and files .vscode/* diff --git a/data/admin-content-draft.json b/data/admin-content-draft.json index 2d76a58..fad070a 100644 --- a/data/admin-content-draft.json +++ b/data/admin-content-draft.json @@ -23,22 +23,15 @@ "seriesLabel": "Now Playing", "seriesTitle": "Study of Titus: Sound Doctrine", "seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.", - "seriesImageUrl": "/uploads/titus-series-1777568297943.png", + "seriesImageUrl": "/uploads/titus_study_cover-1777916521873.png", "seriesListenUrl": "https://open.spotify.com/show/0Gq1TzoJOdReSZ1gYQi8Xl", "studyGuideTitle": "Companion Study Guide", "studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.", + "studyGuideDownloadUrl": "", "studyGuideUrl": "https://a.co/d/01sG2tOJ", "shareHeading": "Help one more person hear the Word this week.", "shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.", - "customLinks": [ - { - "id": "molso9ow", - "label": "test", - "url": "/uploads/discussion_questions_post-1777565348551.png", - "imageUrl": "/uploads/discussion_questions_post-1777565348551.png", - "placement": "resources" - } - ], + "customLinks": [], "customBlocks": [], "archivedSeries": [], "redirects": [ @@ -108,5 +101,5 @@ ] } }, - "updatedAt": "2026-04-30T18:06:00.013Z" + "updatedAt": "2026-05-04T17:42:41.930Z" } \ No newline at end of file diff --git a/data/admin-content.json b/data/admin-content.json index 5666ead..cd924ad 100644 --- a/data/admin-content.json +++ b/data/admin-content.json @@ -23,22 +23,15 @@ "seriesLabel": "Now Playing", "seriesTitle": "Study of Titus: Sound Doctrine", "seriesDescription": "A deep-dive into Paul's letter to Titus — unpacking what it means to build a church and a life on sound doctrine.", - "seriesImageUrl": "/uploads/titus-series-1777568297943.png", + "seriesImageUrl": "/uploads/titus_study_cover-1777916521873.png", "seriesListenUrl": "https://open.spotify.com/show/0Gq1TzoJOdReSZ1gYQi8Xl", "studyGuideTitle": "Companion Study Guide", "studyGuideDescription": "Go deeper in your study with the official Verse by Verse companion guide — now available on Amazon.", + "studyGuideDownloadUrl": "", "studyGuideUrl": "https://a.co/d/01sG2tOJ", "shareHeading": "Help one more person hear the Word this week.", "shareP": "Scan the QR code or text the show link to a friend who needs encouragement today.", - "customLinks": [ - { - "id": "molso9ow", - "label": "test", - "url": "/uploads/discussion_questions_post-1777565348551.png", - "imageUrl": "/uploads/discussion_questions_post-1777565348551.png", - "placement": "resources" - } - ], + "customLinks": [], "customBlocks": [], "archivedSeries": [], "redirects": [ @@ -108,5 +101,5 @@ ] } }, - "updatedAt": "2026-04-30T18:06:00.017Z" + "updatedAt": "2026-05-04T17:42:41.949Z" } \ No newline at end of file diff --git a/data/uploads/discussion_questions_post-1777565348551.png b/data/uploads/discussion_questions_post-1777565348551.png deleted file mode 100644 index 74e82e5e9f7903c2b67c58ce97ad82d3c56a5c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71248 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 yys){t_^{ddjH}> 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

ShsefdxsRKSu1qwf6}?ac^xF)T$}$5t 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�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 literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json index 20fdf2e..1c89db5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "version": "0.0.0", "dependencies": { "express": "^5.2.1", + "express-rate-limit": "^8.4.1", + "otplib": "^13.4.0", + "qrcode": "^1.5.4", "react": "^19.2.4", "react-dom": "^19.2.4", "react-markdown": "^10.1.0", @@ -582,6 +585,74 @@ "url": "https://github.com/sponsors/Brooooooklyn" } }, + "node_modules/@noble/hashes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz", + "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==", + "license": "MIT", + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@otplib/core": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/core/-/core-13.4.0.tgz", + "integrity": "sha512-JqOGcvZQi2wIkEQo8f3/iAjstavpXy6gouIDMHygjNuH6Q0FjbHOiXMdcE94RwfgDNMABhzwUmvaPsxvgm9NYw==", + "license": "MIT" + }, + "node_modules/@otplib/hotp": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/hotp/-/hotp-13.4.0.tgz", + "integrity": "sha512-MJjE0x06mn2ptymz5qZmQveb+vWFuaIftqE0b5/TZZqUOK7l97cV8lRTmid5BpAQMwJDNLW6RnYxGeCRiNdekw==", + "license": "MIT", + "dependencies": { + "@otplib/core": "13.4.0", + "@otplib/uri": "13.4.0" + } + }, + "node_modules/@otplib/plugin-base32-scure": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/plugin-base32-scure/-/plugin-base32-scure-13.4.0.tgz", + "integrity": "sha512-/t9YWJmMbB8bF5z8mXrBZc2FXBe8B/3hG5FhWr9K8cFwFhyxScbPysmZe8s1UTzSA6N+s8Uv8aIfCtVXPNjJWw==", + "license": "MIT", + "dependencies": { + "@otplib/core": "13.4.0", + "@scure/base": "^2.0.0" + } + }, + "node_modules/@otplib/plugin-crypto-noble": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/plugin-crypto-noble/-/plugin-crypto-noble-13.4.0.tgz", + "integrity": "sha512-KrvE4m7Zv+TT1944HzgqFJWJpKb6AyoxDbvhPStmBqdMlv5Gekb80d66cuFRL08kkPgJ5gXUSb5SFpYeB+bACg==", + "license": "MIT", + "dependencies": { + "@noble/hashes": "^2.0.1", + "@otplib/core": "13.4.0" + } + }, + "node_modules/@otplib/totp": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/totp/-/totp-13.4.0.tgz", + "integrity": "sha512-dK+vl0f0ekzf6mCENRI9AKS2NJUC7OjI3+X8e7QSnhQ2WM7I+i4PGpb3QxKi5hxjTtwVuoZwXR2CFtXdcRtNdQ==", + "license": "MIT", + "dependencies": { + "@otplib/core": "13.4.0", + "@otplib/hotp": "13.4.0", + "@otplib/uri": "13.4.0" + } + }, + "node_modules/@otplib/uri": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@otplib/uri/-/uri-13.4.0.tgz", + "integrity": "sha512-x1ozBa5bPbdZCrrTL/HK21qchiK7jYElTu+0ft22abeEhiLYgH1+SIULvOcVk3CK8YwF4kdcidvkq4ciejucJA==", + "license": "MIT", + "dependencies": { + "@otplib/core": "13.4.0" + } + }, "node_modules/@oxc-project/runtime": { "version": "0.115.0", "resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.115.0.tgz", @@ -864,6 +935,15 @@ "dev": true, "license": "MIT" }, + "node_modules/@scure/base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-2.2.0.tgz", + "integrity": "sha512-b8XEupJibegiXV+tDUseI8oLQc8ei3d/4Jkb2RpbHh3MfE054ov3uIz2dhFkB3FI8iwYkEh0gGCApkrYggkPNg==", + "license": "MIT", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@stablelib/base64": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz", @@ -1355,7 +1435,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -1365,7 +1444,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -1531,6 +1609,15 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001780", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", @@ -1638,7 +1725,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -1651,7 +1737,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/comma-separated-tokens": { @@ -1801,6 +1886,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-named-character-reference": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", @@ -1862,6 +1956,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1893,7 +1993,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -2210,6 +2309,24 @@ "url": "https://opencollective.com/express" } }, + "node_modules/express-rate-limit": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.4.1.tgz", + "integrity": "sha512-NGVYwQSAyEQgzxX1iCM978PP9AdO/hW93gMcF6ZwQCm+rFvLsBH6w4xcXWTcliS8La5EPRN3p9wzItqBwJrfNw==", + "license": "MIT", + "dependencies": { + "ip-address": "10.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", @@ -2398,7 +2515,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" @@ -2665,6 +2781,15 @@ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2722,7 +2847,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4193,6 +4317,20 @@ "node": ">= 0.8.0" } }, + "node_modules/otplib": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/otplib/-/otplib-13.4.0.tgz", + "integrity": "sha512-RUcYcRMCgRWhUE/XabRppXpUwCwaWBNHe5iPXhdvP8wwDGpGpsIf/kxX/ec3zFsOaM1Oq8lEhUqDwk6W7DHkwg==", + "license": "MIT", + "dependencies": { + "@otplib/core": "13.4.0", + "@otplib/hotp": "13.4.0", + "@otplib/plugin-base32-scure": "13.4.0", + "@otplib/plugin-crypto-noble": "13.4.0", + "@otplib/totp": "13.4.0", + "@otplib/uri": "13.4.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -4225,6 +4363,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4276,7 +4423,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4322,6 +4468,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/postal-mime": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/postal-mime/-/postal-mime-2.7.4.tgz", @@ -4400,6 +4555,141 @@ "node": ">=6" } }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/qrcode/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/qrcode/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qrcode/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/qrcode/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/qrcode/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", @@ -4595,12 +4885,17 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, "node_modules/resend": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/resend/-/resend-6.10.0.tgz", @@ -4766,6 +5061,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, "node_modules/set-cookie-parser": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", @@ -4929,7 +5230,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -4958,7 +5258,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -5451,6 +5750,12 @@ "node": ">= 8" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index 71d6ef6..54836e3 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,13 @@ "build": "tsc -b && vite build", "start": "node --env-file=.env server.js", "lint": "eslint .", - "preview": "vite preview", - "chatbot:eval": "node scripts/evaluate-chatbot.mjs" + "preview": "vite preview" }, "dependencies": { "express": "^5.2.1", + "express-rate-limit": "^8.4.1", + "otplib": "^13.4.0", + "qrcode": "^1.5.4", "react": "^19.2.4", "react-dom": "^19.2.4", "react-markdown": "^10.1.0", diff --git a/server.js b/server.js index a35dfd6..e669db7 100644 --- a/server.js +++ b/server.js @@ -1,9 +1,11 @@ import express from 'express' +import rateLimit from 'express-rate-limit' import { mkdir, readdir, readFile, stat, unlink, writeFile } from 'node:fs/promises' import { createHash, randomUUID } from 'node:crypto' import path from 'node:path' import { fileURLToPath } from 'node:url' import { Resend } from 'resend' +import qrcode from 'qrcode' import { sanitizeSiteContent, escapeHtml, @@ -28,6 +30,17 @@ import { deleteAdminSession, validateAdminPasswordSetup, isAdminPasswordValid, + isTotpEnabled, + loadTotpState, + saveTotpState, + generateTotpSecret, + getTotpUri, + verifyTotpCode, + generateRecoveryCodes, + hashRecoveryCode, + consumeRecoveryCode, + createPendingSession, + consumePendingSession, } from './server/auth.js' const __filename = fileURLToPath(import.meta.url) @@ -40,7 +53,6 @@ const VISITOR_STATS_FILE = path.join(DATA_DIR, 'visitor-stats.json') const CONTACT_SUBMISSIONS_FILE = path.join(DATA_DIR, 'contact-submissions.json') const QUESTIONS_FILE = path.join(DATA_DIR, 'questions.json') const DRAFT_QUESTIONS_FILE = path.join(DATA_DIR, 'questions-draft.json') -const CHATBOT_FILE = path.join(DATA_DIR, 'chatbot-content.json') const BACKUP_DIR = path.join(DATA_DIR, 'backups') const UPLOADS_DIR = path.join(DATA_DIR, 'uploads') const UPLOADS_META_FILE = path.join(DATA_DIR, 'uploads-meta.json') @@ -227,7 +239,7 @@ async function writeUploadsMetadata(metadata) { async function listUploadedAssets() { await mkdir(UPLOADS_DIR, { recursive: true }) const files = await readdir(UPLOADS_DIR) - const imageFiles = files.filter(name => /\.(png|jpe?g|webp|gif)$/i.test(name)).sort() + const imageFiles = files.filter(name => /\.(png|jpe?g|webp|gif|pdf|docx?)$/i.test(name)).sort() const metadata = await readUploadsMetadata() const withStats = await Promise.all(imageFiles.map(async filename => { @@ -1090,7 +1102,7 @@ app.post('/api/admin-assets', requireAdminAuth, async (req, res) => { const ext = inferImageExtensionFromDataUrl(dataUrl) if (!ext) { - res.status(400).json({ message: 'Upload must be a PNG, JPG, WEBP, or GIF data URL.' }) + res.status(400).json({ message: 'Upload must be a PNG, JPG, WEBP, GIF, PDF, DOC, or DOCX data URL.' }) return } @@ -1193,93 +1205,6 @@ app.post('/api/admin-ops/deploy', requireAdminAuth, async (_req, res) => { res.json({ ok: true, message: result.message }) }) -// ── Chatbot knowledge base ────────────────────────────────────────────────── -const MAX_CHATBOT_ENTRIES = 500 -let chatbotEntries = [] -let chatbotWritePromise = Promise.resolve() -let chatbotFileMtimeMs = 0 - -function queueChatbotWrite() { - chatbotWritePromise = chatbotWritePromise - .then(async () => { - await mkdir(DATA_DIR, { recursive: true }) - await writeFile( - CHATBOT_FILE, - JSON.stringify(chatbotEntries, null, 2), - 'utf8', - ) - }) - .catch(err => { - console.error('[chatbot] failed to write chatbot content:', err) - }) -} - -async function loadChatbotFromDisk() { - try { - const [fileStats, raw] = await Promise.all([ - stat(CHATBOT_FILE), - readFile(CHATBOT_FILE, 'utf8'), - ]) - const parsed = JSON.parse(raw) - chatbotEntries = Array.isArray(parsed) ? parsed.slice(0, MAX_CHATBOT_ENTRIES) : [] - chatbotFileMtimeMs = fileStats.mtimeMs - } catch { - chatbotEntries = [] - chatbotFileMtimeMs = 0 - } -} - -async function refreshChatbotFromDiskIfChanged() { - try { - const fileStats = await stat(CHATBOT_FILE) - if (fileStats.mtimeMs <= chatbotFileMtimeMs) return - await loadChatbotFromDisk() - } catch { - if (chatbotFileMtimeMs === 0) return - chatbotEntries = [] - chatbotFileMtimeMs = 0 - } -} - -// Public: return all chatbot entries for client-side matching -app.get('/api/chatbot-content', async (req, res) => { - await refreshChatbotFromDiskIfChanged() - res.json(chatbotEntries) -}) - -// Admin: get all entries -app.get('/api/admin/chatbot-content', async (req, res) => { - if (!isValidAdminSession(req)) { res.status(401).json({ message: 'Not authenticated.' }); return } - await refreshChatbotFromDiskIfChanged() - res.json(chatbotEntries) -}) - -// Admin: save full list (replace all) -app.post('/api/admin/chatbot-content', (req, res) => { - if (!isValidAdminSession(req)) { res.status(401).json({ message: 'Not authenticated.' }); return } - const body = req.body - if (!Array.isArray(body)) { res.status(400).json({ message: 'Expected array.' }); return } - const sanitized = body - .filter(e => e && typeof e.title === 'string' && typeof e.content === 'string') - .slice(0, MAX_CHATBOT_ENTRIES) - .map(e => ({ - id: typeof e.id === 'string' && e.id ? e.id : randomUUID(), - type: ['qa', 'topic', 'episode'].includes(e.type) ? e.type : 'qa', - title: String(e.title).trim().slice(0, 500), - content: String(e.content).trim().slice(0, 4000), - sourceLabel: typeof e.sourceLabel === 'string' ? e.sourceLabel.trim().slice(0, 160) : '', - priority: e.priority === true, - keywords: Array.isArray(e.keywords) - ? e.keywords.filter(k => typeof k === 'string').map(k => k.trim().toLowerCase()).slice(0, 20) - : [], - createdAt: typeof e.createdAt === 'string' ? e.createdAt : new Date().toISOString(), - updatedAt: typeof e.updatedAt === 'string' ? e.updatedAt : new Date().toISOString(), - })) - chatbotEntries = sanitized - queueChatbotWrite() - res.json({ ok: true, count: chatbotEntries.length }) -}) - function queueQuestionsWrite() { questionsWritePromise = questionsWritePromise .then(async () => { @@ -1331,14 +1256,27 @@ function loadQuestionsFromDisk() { questions = [] }) } -app.get('/api/admin-auth/status', (req, res) => { +// Rate limiter: max 10 attempts per 15 minutes per IP on the login endpoint +const loginRateLimiter = rateLimit({ + windowMs: 15 * 60 * 1000, + max: 10, + standardHeaders: true, + legacyHeaders: false, + message: { message: 'Too many login attempts. Please wait 15 minutes and try again.' }, + skipSuccessfulRequests: true, +}) + +app.get('/api/admin-auth/status', async (req, res) => { res.json({ authenticated: isValidAdminSession(req), configured: isAdminPasswordConfigured(), + totpEnabled: await isTotpEnabled(), }) }) -app.post('/api/admin-auth/login', (req, res) => { +// Step 1: verify password. If TOTP is enabled, returns a short-lived pending token. +// If TOTP is not yet configured, logs straight in (backwards compatible). +app.post('/api/admin-auth/login', loginRateLimiter, async (req, res) => { const password = typeof req.body?.password === 'string' ? req.body.password : '' if (!isAdminPasswordConfigured()) { @@ -1351,11 +1289,110 @@ app.post('/api/admin-auth/login', (req, res) => { return } + const totpOn = await isTotpEnabled() + if (totpOn) { + const pendingToken = createPendingSession() + res.json({ totpRequired: true, pendingToken }) + return + } + const sessionToken = createAdminSession() setAdminSessionCookie(res, sessionToken) res.json({ ok: true }) }) +// Step 2a: verify TOTP code (or recovery code) after password was accepted +app.post('/api/admin-auth/totp-verify', loginRateLimiter, async (req, res) => { + const { pendingToken, code } = req.body ?? {} + + if (!consumePendingSession(pendingToken)) { + res.status(401).json({ message: 'Session expired or invalid. Please sign in again.' }) + return + } + + const state = await loadTotpState() + if (!state?.secret || !state?.verified) { + res.status(400).json({ message: 'TOTP is not configured.' }) + return + } + + const codeStr = typeof code === 'string' ? code.trim() : '' + + // Try TOTP first + if (verifyTotpCode(state.secret, codeStr)) { + const sessionToken = createAdminSession() + setAdminSessionCookie(res, sessionToken) + res.json({ ok: true }) + return + } + + // Try recovery code + if (consumeRecoveryCode(state, codeStr)) { + await saveTotpState(state) + const sessionToken = createAdminSession() + setAdminSessionCookie(res, sessionToken) + res.json({ ok: true, usedRecoveryCode: true, remainingRecoveryCodes: state.hashedRecoveryCodes.length }) + return + } + + res.status(401).json({ message: 'Invalid code. Try again or use a recovery code.' }) +}) + +// TOTP setup: generate a new secret and QR code (admin must be authenticated OR provide valid password) +app.post('/api/admin-auth/totp-setup-init', requireAdminAuth, async (req, res) => { + const secret = generateTotpSecret() + const uri = getTotpUri(secret) + const qrDataUrl = await qrcode.toDataURL(uri) + // Store unverified secret temporarily + const existing = await loadTotpState() + await saveTotpState({ ...existing, secret, verified: false }) + res.json({ qrDataUrl, secret }) +}) + +// TOTP setup: confirm the code to mark TOTP as verified and generate recovery codes +app.post('/api/admin-auth/totp-setup-confirm', requireAdminAuth, async (req, res) => { + const { code } = req.body ?? {} + const state = await loadTotpState() + + if (!state?.secret) { + res.status(400).json({ message: 'No TOTP setup in progress. Call /totp-setup-init first.' }) + return + } + + if (!verifyTotpCode(state.secret, typeof code === 'string' ? code.trim() : '')) { + res.status(401).json({ message: 'Code incorrect. Scan the QR code again and try once more.' }) + return + } + + const recoveryCodes = generateRecoveryCodes() + await saveTotpState({ + secret: state.secret, + verified: true, + hashedRecoveryCodes: recoveryCodes.map(hashRecoveryCode), + enabledAt: new Date().toISOString(), + }) + + res.json({ ok: true, recoveryCodes }) +}) + +// Disable TOTP (requires active admin session) +app.post('/api/admin-auth/totp-disable', requireAdminAuth, async (req, res) => { + await saveTotpState({ secret: null, verified: false, hashedRecoveryCodes: [], disabledAt: new Date().toISOString() }) + res.json({ ok: true }) +}) + +// Regenerate recovery codes (requires active admin session) +app.post('/api/admin-auth/totp-regen-recovery', requireAdminAuth, async (req, res) => { + const state = await loadTotpState() + if (!state?.secret || !state?.verified) { + res.status(400).json({ message: 'TOTP is not enabled.' }) + return + } + const recoveryCodes = generateRecoveryCodes() + await saveTotpState({ ...state, hashedRecoveryCodes: recoveryCodes.map(hashRecoveryCode) }) + res.json({ ok: true, recoveryCodes }) +}) + app.post('/api/admin-auth/logout', (req, res) => { const cookies = parseCookies(req.headers.cookie) const sessionToken = cookies[ADMIN_SESSION_COOKIE] @@ -1592,11 +1629,16 @@ app.post('/api/study-downloads/titus', studyDownloadRateLimit, async (req, res) return } - try { - await stat(TITUS_STUDY_FILE) - } catch { - res.status(503).json({ message: 'The Titus study file is not configured yet.' }) - return + const published = await loadSiteContentFile(DATA_FILE) + const configuredDownloadUrl = sanitizeUrl(published?.siteContent?.studyGuideDownloadUrl) + + if (!configuredDownloadUrl) { + try { + await stat(TITUS_STUDY_FILE) + } catch { + res.status(503).json({ message: 'The primary study guide download URL is not configured yet.' }) + return + } } const trimmedFirstName = firstName.trim() @@ -1617,6 +1659,11 @@ app.post('/api/study-downloads/titus', studyDownloadRateLimit, async (req, res) await syncContactToResend(trimmedName, trimmedEmail) } + if (configuredDownloadUrl) { + res.json({ ok: true, downloadUrl: configuredDownloadUrl }) + return + } + const token = createTitusDownloadToken(trimmedEmail) res.json({ ok: true, downloadUrl: `/api/study-downloads/titus/file?token=${encodeURIComponent(token)}` }) } catch (err) { @@ -1640,9 +1687,46 @@ app.post('/api/resource-download', studyDownloadRateLimit, async (req, res) => { } const published = await loadSiteContentFile(DATA_FILE) - const resource = Array.isArray(published?.siteContent?.customLinks) - ? published.siteContent.customLinks.find(link => link.id === resourceId && link.placement === 'resources') - : undefined + const siteContent = published?.siteContent + + function resolveResourceFromId(id) { + if (!siteContent || typeof siteContent !== 'object') return null + + const customResources = Array.isArray(siteContent.customLinks) + ? siteContent.customLinks.filter(link => link?.placement === 'resources') + : [] + + if (id.startsWith('custom:')) { + const customId = id.slice('custom:'.length) + const match = customResources.find(link => link.id === customId) + return match ? { label: match.label, url: match.url } : null + } + + if (id.startsWith('archived:')) { + const [, seriesId, ...linkIdParts] = id.split(':') + const linkId = linkIdParts.join(':') + const archivedSeries = Array.isArray(siteContent.archivedSeries) ? siteContent.archivedSeries : [] + const series = archivedSeries.find(item => item.id === seriesId) + const link = Array.isArray(series?.resourceLinks) + ? series.resourceLinks.find(item => item.id === linkId) + : null + return link ? { label: link.label || series?.title, url: link.url } : null + } + + const customMatch = customResources.find(link => link.id === id) + if (customMatch) return { label: customMatch.label, url: customMatch.url } + + const archivedSeries = Array.isArray(siteContent.archivedSeries) ? siteContent.archivedSeries : [] + for (const series of archivedSeries) { + if (!Array.isArray(series?.resourceLinks)) continue + const link = series.resourceLinks.find(item => item.id === id) + if (link) return { label: link.label || series?.title, url: link.url } + } + + return null + } + + const resource = resolveResourceFromId(resourceId) if (!resource || typeof resource.url !== 'string' || !resource.url.trim()) { res.status(400).json({ message: 'Resource not found.' }) @@ -2061,7 +2145,6 @@ Promise.all([ loadContactSubmissionsFromDisk(), loadQuestionsFromDisk(), loadDraftQuestionsFromDisk(), - loadChatbotFromDisk(), refreshContentCaches(), ]) .catch(err => { diff --git a/server/auth.js b/server/auth.js index b1f8225..bcd7f0e 100644 --- a/server/auth.js +++ b/server/auth.js @@ -1,6 +1,18 @@ -import { createHash, randomUUID } from 'node:crypto' +import { createHash, randomUUID, timingSafeEqual, createHmac, randomFillSync } from 'node:crypto' +import { readFile, writeFile } from 'node:fs/promises' +import path from 'node:path' +import { fileURLToPath } from 'node:url' import { parseCookies } from './helpers.js' +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const TOTP_SECRET_FILE = path.join(__dirname, '..', 'data', 'totp-secret.json') + +// Pending sessions: password verified, waiting for TOTP code +// Map +const TOTP_PENDING_TTL_MS = 5 * 60 * 1000 +const totpPendingSessions = new Map() + const ADMIN_SESSION_COOKIE = 'vbn_admin_session' const ADMIN_SESSION_TTL_MS = 7 * 24 * 60 * 60 * 1000 const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD @@ -22,7 +34,6 @@ export function validateAdminPasswordSetup() { if (!isAdminPasswordConfigured() && process.env.NODE_ENV === 'production') { throw new Error('ADMIN_PASSWORD is required in production.') } - if (!isAdminPasswordConfigured()) { console.warn('ADMIN_PASSWORD is not configured; admin routes will remain disabled until the environment is configured.') } @@ -30,9 +41,180 @@ export function validateAdminPasswordSetup() { export function isAdminPasswordValid(password) { if (!isAdminPasswordConfigured()) return false - return sha256(password) === sha256(ADMIN_PASSWORD) + const a = Buffer.from(sha256(password), 'utf8') + const b = Buffer.from(sha256(ADMIN_PASSWORD), 'utf8') + if (a.length !== b.length) return false + return timingSafeEqual(a, b) } +// ── TOTP (RFC 6238) — implemented with Node built-in crypto ───────────────── + +const BASE32_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567' + +function base32Decode(str) { + const s = str.toUpperCase().replace(/=+$/, '') + let bits = 0 + let value = 0 + const output = [] + for (const char of s) { + const idx = BASE32_CHARS.indexOf(char) + if (idx === -1) continue + value = (value << 5) | idx + bits += 5 + if (bits >= 8) { + output.push((value >>> (bits - 8)) & 0xff) + bits -= 8 + } + } + return Buffer.from(output) +} + +function base32Encode(buf) { + let bits = 0 + let value = 0 + let output = '' + for (const byte of buf) { + value = (value << 8) | byte + bits += 8 + while (bits >= 5) { + output += BASE32_CHARS[(value >>> (bits - 5)) & 0x1f] + bits -= 5 + } + } + if (bits > 0) output += BASE32_CHARS[(value << (5 - bits)) & 0x1f] + return output +} + +function totpToken(secret, counter) { + const key = base32Decode(secret) + const msg = Buffer.alloc(8) + // Write 64-bit big-endian counter + const hi = Math.floor(counter / 0x100000000) + const lo = counter >>> 0 + msg.writeUInt32BE(hi, 0) + msg.writeUInt32BE(lo, 4) + const hmac = createHmac('sha1', key).update(msg).digest() + const offset = hmac[hmac.length - 1] & 0x0f + const code = ((hmac[offset] & 0x7f) << 24) + | (hmac[offset + 1] << 16) + | (hmac[offset + 2] << 8) + | hmac[offset + 3] + return String(code % 1000000).padStart(6, '0') +} + +export function generateTotpSecret() { + const buf = Buffer.allocUnsafe(20) + randomFillSync(buf) + return base32Encode(buf) +} + +export async function loadTotpState() { + try { + const raw = await readFile(TOTP_SECRET_FILE, 'utf8') + return JSON.parse(raw) + } catch { + return null + } +} + +export async function saveTotpState(state) { + await writeFile(TOTP_SECRET_FILE, JSON.stringify(state, null, 2), 'utf8') +} + +export async function isTotpEnabled() { + const state = await loadTotpState() + return Boolean(state?.secret && state?.verified) +} + +function randomBytesForRecovery(n) { + const buf = Buffer.allocUnsafe(n) + randomFillSync(buf) + return buf +} + +export function getTotpUri(secret, label = 'Siteforge Admin') { + const issuer = 'Siteforge' + return `otpauth://totp/${encodeURIComponent(issuer)}:${encodeURIComponent(label)}?secret=${secret}&issuer=${encodeURIComponent(issuer)}&algorithm=SHA1&digits=6&period=30` +} + +export function verifyTotpCode(secret, code) { + try { + const token = String(code).replace(/\s/g, '') + const step = Math.floor(Date.now() / 1000 / 30) + // Accept current step and one step either side (±30 seconds clock skew) + for (const offset of [-1, 0, 1]) { + if (totpToken(secret, step + offset) === token) return true + } + return false + } catch { + return false + } +} + +// ── Recovery Codes ────────────────────────────────────────────────────────── + +const RECOVERY_CODE_COUNT = 8 + +function generateRecoveryCode() { + // Format: XXXX-XXXX-XXXX (uppercase alphanumeric, no ambiguous chars) + const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' + const randBytes = randomBytesForRecovery(12) + let code = '' + for (let i = 0; i < 12; i++) { + if (i > 0 && i % 4 === 0) code += '-' + code += chars[randBytes[i] % chars.length] + } + return code +} + +export function generateRecoveryCodes() { + const codes = [] + for (let i = 0; i < RECOVERY_CODE_COUNT; i++) { + codes.push(generateRecoveryCode()) + } + return codes +} + +export function hashRecoveryCode(code) { + return sha256(code.replace(/-/g, '').toUpperCase()) +} + +// Returns the matched code if valid, null otherwise. Mutates state.hashedRecoveryCodes. +export function consumeRecoveryCode(state, inputCode) { + if (!Array.isArray(state.hashedRecoveryCodes) || state.hashedRecoveryCodes.length === 0) return false + const normalized = inputCode.replace(/[-\s]/g, '').toUpperCase() + const inputHash = sha256(normalized) + const idx = state.hashedRecoveryCodes.findIndex(h => { + const a = Buffer.from(h, 'utf8') + const b = Buffer.from(inputHash, 'utf8') + return a.length === b.length && timingSafeEqual(a, b) + }) + if (idx === -1) return false + state.hashedRecoveryCodes.splice(idx, 1) + return true +} + +// ── Pending (password-ok, awaiting TOTP) sessions ─────────────────────────── + +export function createPendingSession() { + const token = randomUUID() + totpPendingSessions.set(token, { expiresAt: Date.now() + TOTP_PENDING_TTL_MS }) + return token +} + +export function consumePendingSession(token) { + if (!token) return false + const entry = totpPendingSessions.get(token) + if (!entry || entry.expiresAt <= Date.now()) { + totpPendingSessions.delete(token) + return false + } + totpPendingSessions.delete(token) + return true +} + +// ── Admin Sessions ─────────────────────────────────────────────────────────── + export function createAdminSession() { const token = randomUUID() adminSessions.set(token, Date.now() + ADMIN_SESSION_TTL_MS) diff --git a/server/helpers.js b/server/helpers.js index aad6fdf..6a3aef3 100644 --- a/server/helpers.js +++ b/server/helpers.js @@ -171,6 +171,7 @@ function sanitizeCustomLinks(value) { label: typeof item.label === 'string' ? item.label.trim().slice(0, 140) : '', url: sanitizeUrl(item.url), imageUrl: sanitizeUrl(item.imageUrl), + description: typeof item.description === 'string' ? item.description.trim().slice(0, 400) : '', placement, } }) @@ -196,6 +197,7 @@ function sanitizeArchivedSeriesResourceLinks(value) { .map(item => ({ id: typeof item.id === 'string' && item.id.trim() ? item.id.trim() : randomUUID(), label: typeof item.label === 'string' ? item.label.trim().slice(0, 120) : '', + description: typeof item.description === 'string' ? item.description.trim().slice(0, 400) : '', url: sanitizeUrl(item.url), })) .filter(item => item.label && item.url) @@ -334,6 +336,9 @@ export function inferImageExtensionFromDataUrl(dataUrl) { if (dataUrl.startsWith('data:image/jpeg;base64,')) return '.jpg' if (dataUrl.startsWith('data:image/webp;base64,')) return '.webp' if (dataUrl.startsWith('data:image/gif;base64,')) return '.gif' + if (dataUrl.startsWith('data:application/pdf;base64,')) return '.pdf' + if (dataUrl.startsWith('data:application/msword;base64,')) return '.doc' + if (dataUrl.startsWith('data:application/vnd.openxmlformats-officedocument.wordprocessingml.document;base64,')) return '.docx' return null } diff --git a/src/AdminPage.tsx b/src/AdminPage.tsx index 55f116c..a9b79bb 100644 --- a/src/AdminPage.tsx +++ b/src/AdminPage.tsx @@ -213,6 +213,14 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { const [backupFiles, setBackupFiles] = useState([]) const [selectedBackup, setSelectedBackup] = useState('') const [selectedBackupPreview, setSelectedBackupPreview] = useState(null) + + // TOTP management state + const [totpEnabled, setTotpEnabled] = useState(null) + const [totpSetupQr, setTotpSetupQr] = useState(null) + const [totpSetupSecret, setTotpSetupSecret] = useState(null) + const [totpConfirmCode, setTotpConfirmCode] = useState('') + const [totpMsg, setTotpMsg] = useState('') + const [totpRecoveryCodes, setTotpRecoveryCodes] = useState(null) const [publishState, setPublishState] = useState({ draftUpdatedAt: null, publishedAt: null }) const [assets, setAssets] = useState([]) const [assetTagEdits, setAssetTagEdits] = useState>({}) @@ -243,6 +251,13 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { return () => window.removeEventListener('beforeunload', handleBeforeUnload) }, [isDirty]) + useEffect(() => { + fetch('/api/admin-auth/status') + .then(r => r.ok ? r.json() : Promise.reject()) + .then(data => setTotpEnabled(!!(data as { totpEnabled?: boolean }).totpEnabled)) + .catch(() => {}) + }, []) + useEffect(() => { fetch('/api/admin-stats') .then(r => (r.ok ? r.json() : Promise.reject(new Error('Failed to load stats')))) @@ -458,6 +473,53 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { })) } + async function handleTotpSetupInit() { + setTotpMsg('') + setTotpRecoveryCodes(null) + const res = await fetch('/api/admin-auth/totp-setup-init', { method: 'POST' }) + const data = await res.json().catch(() => ({})) as { qrDataUrl?: string; secret?: string; message?: string } + if (!res.ok) { setTotpMsg(data.message ?? 'Setup failed.'); return } + setTotpSetupQr(data.qrDataUrl ?? null) + setTotpSetupSecret(data.secret ?? null) + setTotpConfirmCode('') + } + + async function handleTotpSetupConfirm(e: React.FormEvent) { + e.preventDefault() + setTotpMsg('') + const res = await fetch('/api/admin-auth/totp-setup-confirm', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ code: totpConfirmCode }), + }) + const data = await res.json().catch(() => ({})) as { ok?: boolean; recoveryCodes?: string[]; message?: string } + if (!res.ok) { setTotpMsg(data.message ?? 'Confirmation failed.'); return } + setTotpEnabled(true) + setTotpSetupQr(null) + setTotpSetupSecret(null) + setTotpConfirmCode('') + setTotpRecoveryCodes(data.recoveryCodes ?? null) + setTotpMsg('Two-factor authentication enabled.') + } + + async function handleTotpDisable() { + if (!confirm('Disable two-factor authentication? This will make your admin less secure.')) return + setTotpMsg('') + const res = await fetch('/api/admin-auth/totp-disable', { method: 'POST' }) + if (res.ok) { setTotpEnabled(false); setTotpRecoveryCodes(null); setTotpMsg('Two-factor authentication disabled.') } + else { const d = await res.json().catch(() => ({})) as { message?: string }; setTotpMsg(d.message ?? 'Failed to disable TOTP.') } + } + + async function handleTotpRegenRecovery() { + if (!confirm('Regenerate recovery codes? Your old codes will stop working immediately.')) return + setTotpMsg('') + const res = await fetch('/api/admin-auth/totp-regen-recovery', { method: 'POST' }) + const data = await res.json().catch(() => ({})) as { ok?: boolean; recoveryCodes?: string[]; message?: string } + if (!res.ok) { setTotpMsg(data.message ?? 'Failed.'); return } + setTotpRecoveryCodes(data.recoveryCodes ?? null) + setTotpMsg('New recovery codes generated. Save these now.') + } + function addRedirectRule() { setForm(f => ({ ...f, @@ -760,6 +822,35 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { ) } + function renderFileAssetSelector(value: string | null | undefined, onChange: (value: string) => void, fieldId: string) { + const assetOptions = [...assets.map(asset => ({ label: asset.filename, value: asset.url }))] + const currentValue = value?.trim() ?? '' + + if (currentValue && !assetOptions.some(item => item.value === currentValue)) { + assetOptions.unshift({ label: `Current file (${currentValue})`, value: currentValue }) + } + + if (assetOptions.length === 0) return null + + return ( +

+ ) + } + + function isImageAsset(filename: string) { + return /\.(png|jpe?g|webp|gif)$/i.test(filename) + } + function confirmLeaveUnsavedChanges() { if (!isDirty) return true return confirm('You have unsaved changes. Leave this section without saving?') @@ -792,7 +883,7 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { ...f, customLinks: [ ...(f.customLinks ?? []), - { id: Date.now().toString(36), label: '', url: '', imageUrl: '', placement: 'resources' as const }, + { id: Date.now().toString(36), label: '', url: '', imageUrl: '', description: '', placement: 'resources' as const }, ], })) } @@ -808,6 +899,15 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { setForm(f => ({ ...f, customLinks: (f.customLinks ?? []).filter(l => l.id !== id) })) } + function moveLinkToResources(id: string) { + setForm(f => ({ + ...f, + customLinks: (f.customLinks ?? []).map(link => ( + link.id === id ? { ...link, placement: 'resources' as const } : link + )), + })) + } + function addBlock() { setForm(f => ({ ...f, @@ -870,7 +970,7 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { ...series, resourceLinks: [ ...(series.resourceLinks ?? []), - { id: `${seriesId}-${Date.now().toString(36)}`, label: '', url: '' }, + { id: `${seriesId}-${Date.now().toString(36)}`, label: '', description: '', url: '' }, ], } : series), @@ -923,6 +1023,7 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { { id: `${seriesId}-${Date.now().toString(36)}`, label: source.label, + description: source.description ?? '', url: source.url, }, ], @@ -949,6 +1050,7 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { .map(link => ({ id: `${seriesId}-${Date.now().toString(36)}-${link.id}`, label: link.label, + description: link.description ?? '', url: link.url, })) @@ -1114,6 +1216,12 @@ export default function AdminPage({ content, onSave, onLogout }: Props) { alert('Failed to delete question') } } + + const resourceLinks = (form.customLinks ?? []).filter(link => link.placement === 'resources') + const archivedResourceCount = (form.archivedSeries ?? []).reduce((count, series) => { + return count + (series.resourceLinks ?? []).length + }, 0) + return (
@@ -1301,39 +1409,50 @@ export default function AdminPage({ content, onSave, onLogout }: Props) {

No episode highlights yet. Add one below.

)} {(form.podcastFeaturedLinks ?? []).map(item => ( -
-
-
- - updatePodcastLink(item.id, 'episodeNumber', e.target.value)} /> +
+ +
+ {item.title || 'Untitled episode highlight'} +

{item.episodeNumber ? `Episode ${item.episodeNumber}` : 'No episode number yet'}

-
- - updatePodcastLink(item.id, 'title', e.target.value)} /> -
-
- -