Update module imports

0c8ccf176511a33fb84e1528af57e17027fa733c

Cohee <18619528+Cohee1207@users.noreply.github.com>

5 files changed, +57 -38Showing whitespace changes
recover.js+11 -6
@@ -1,7 +1,12 @@
11import fs from 'node:fs';
22import yaml from 'yaml';
33import storage from 'node-persist';
4-import * as users from './src/users.js';
4+import {
5+ initUserStorage,
6+ getPasswordSalt,
7+ getPasswordHash,
8+ toKey,
9+} from './src/users.js';
510
611const userAccount = process.argv[2];
712const userPassword = process.argv[3];
@@ -22,7 +27,7 @@ async function initStorage() {
2227 process.exit(1);
2328 }
2429
2530 await users.initUserStorage(dataRoot);
2631}
2732
2833async function main() {
@@ -31,7 +36,7 @@ async function main() {
3136 /**
3237 * @type {import('./src/users').User}
3338 */
3439 const user = await storage.get(users.toKey(userAccount));
3540
3641 if (!user) {
3742 console.error(`User "${userAccount}" not found.`);
@@ -45,8 +50,8 @@ async function main() {
4550
4651 if (userPassword) {
4752 console.log('Setting new password...');
4853 const salt = users.getPasswordSalt();
4954 const passwordHash = users.getPasswordHash(userPassword, salt);
5055 user.password = passwordHash;
5156 user.salt = salt;
5257 } else {
@@ -55,7 +60,7 @@ async function main() {
5560 user.salt = '';
5661 }
5762
5863 await storage.setItem(users.toKey(userAccount), user);
5964 console.log('User recovered. A program will exit now.');
6065}
6166
server.js+37 -23
@@ -36,13 +36,27 @@ util.inspect.defaultOptions.maxStringLength = null;
3636util.inspect.defaultOptions.depth = 4;
3737
3838// local library imports
3939import *{ asloadPlugins loader} from './src/plugin-loader.js';
40-import * as userModule from './src/users.js';
40+import {
41+ initUserStorage,
42+ getCsrfSecret,
43+ getCookieSecret,
44+ getCookieSessionName,
45+ getAllEnabledUsers,
46+ ensurePublicDirectoriesExist,
47+ getUserDirectoriesList,
48+ migrateSystemPrompts,
49+ migrateUserData,
50+ requireLoginMiddleware,
51+ setUserDataMiddleware,
52+ shouldRedirectToLogin,
53+ tryAutoLogin,
54+ router as userDataRouter,
55+} from './src/users.js';
4156import basicAuthMiddleware from './src/middleware/basicAuth.js';
4257import whitelistMiddleware from './src/middleware/whitelist.js';
4358import multerMonkeyPatch from './src/middleware/multerMonkeyPatch.js';
4459import initRequestProxy from './src/request-proxy.js';
45-import * as contentManager from './src/endpoints/content-manager.js';
4660import {
4761 getVersion,
4862 getConfigValue,
@@ -81,7 +95,7 @@ import { router as worldInfoRouter } from './src/endpoints/worldinfo.js';
8195import { router as statsRouter, init as statsInit, onExit as statsOnExit } from './src/endpoints/stats.js';
8296import { router as backgroundsRouter } from './src/endpoints/backgrounds.js';
8397import { router as spritesRouter } from './src/endpoints/sprites.js';
8498import { router as contentManagerRouter, checkForNewContent } from './src/endpoints/content-manager.js';
8599import { router as settingsRouter, init as settingsInit } from './src/endpoints/settings.js';
86100import { router as stableDiffusionRouter } from './src/endpoints/stable-diffusion.js';
87101import { router as hordeRouter } from './src/endpoints/horde.js';
@@ -349,21 +363,21 @@ function getSessionCookieAge() {
349363}
350364
351365app.use(cookieSession({
352366 name: userModule.getCookieSessionName(),
353367 sameSite: 'strict',
354368 httpOnly: true,
355369 maxAge: getSessionCookieAge(),
356370 secret: userModule.getCookieSecret(),
357371}));
358372
359373app.use(userModule.setUserDataMiddleware);
360374
361375// CSRF Protection //
362376if (!disableCsrf) {
363377 const COOKIES_SECRET = userModule.getCookieSecret();
364378
365379 const { generateToken, doubleCsrfProtection } = doubleCsrf({
366380 getSecret: userModule.getCsrfSecret,
367381 cookieName: 'X-CSRF-Token',
368382 cookieOptions: {
369383 httpOnly: true,
@@ -394,7 +408,7 @@ if (!disableCsrf) {
394408// Static files
395409// Host index page
396410app.get('/', (request, response) => {
397411 if (userModule.shouldRedirectToLogin(request)) {
398412 const query = request.url.split('?')[1];
399413 const redirectUrl = query ? `/login?${query}` : '/login';
400414 return response.redirect(redirectUrl);
@@ -411,7 +425,7 @@ app.get('/login', async (request, response) => {
411425 }
412426
413427 try {
414428 const autoLogin = await userModule.tryAutoLogin(request, basicAuthMode);
415429
416430 if (autoLogin) {
417431 return response.redirect('/');
@@ -430,7 +444,7 @@ app.use(express.static(process.cwd() + '/public', {}));
430444app.use('/api/users', usersPublicRouter);
431445
432446// Everything below this line requires authentication
433447app.use(userModule.requireLoginMiddleware);
434448app.get('/api/ping', (_, response) => response.sendStatus(204));
435449
436450// File uploads
@@ -438,7 +452,7 @@ app.use(multer({ dest: uploadsPath, limits: { fieldSize: 10 * 1024 * 1024 } }).s
438452app.use(multerMonkeyPatch);
439453
440454// User data mount
441455app.use('/', userModule.routeruserDataRouter);
442456// Private endpoints
443457app.use('/api/users', usersPrivateRouter);
444458// Admin endpoints
@@ -625,15 +639,15 @@ const preSetupTasks = async function () {
625639 }
626640 console.log();
627641
628642 const directories = await userModule.getUserDirectoriesList();
629643 await contentManager.checkForNewContent(directories);
630644 await ensureThumbnailCache();
631645 cleanUploads();
632646
633647 await settingsInit();
634648 await statsInit();
635649
636650 const cleanupPlugins = await loadPluginsinitializePlugins();
637651 const consoleTitle = process.title;
638652
639653 let isExiting = false;
@@ -740,10 +754,10 @@ const postSetupTasks = async function (v6Failed, v4Failed) {
740754 * Loads server plugins from a directory.
741755 * @returns {Promise<Function>} Function to be run on server exit
742756 */
743757async function loadPluginsinitializePlugins() {
744758 try {
745759 const pluginDirectory = path.join(serverDirectory, 'plugins');
746760 const cleanupPlugins = await loader.loadPlugins(app, pluginDirectory);
747761 return cleanupPlugins;
748762 } catch {
749763 console.log('Plugin loading failed.');
@@ -883,7 +897,7 @@ async function verifySecuritySettings() {
883897 logSecurityAlert('Your SillyTavern is currently insecurely open to the public. Enable whitelisting, basic authentication or user accounts.');
884898 }
885899
886900 const users = await userModule.getAllEnabledUsers();
887901 const unprotectedUsers = users.filter(x => !x.password);
888902 const unprotectedAdminUsers = unprotectedUsers.filter(x => x.admin);
889903
@@ -901,10 +915,10 @@ async function verifySecuritySettings() {
901915}
902916
903917// User storage module needs to be initialized before starting the server
904918userModule.initUserStorage(dataRoot)
905919 .then(userModule.ensurePublicDirectoriesExist)
906920 .then(userModule.migrateUserData)
907921 .then(userModule.migrateSystemPrompts)
908922 .then(verifySecuritySettings)
909923 .then(preSetupTasks)
910924 .finally(startServer);
src/endpoints/characters.js+3 -3
@@ -16,7 +16,7 @@ import { AVATAR_WIDTH, AVATAR_HEIGHT } from '../constants.js';
1616import { jsonParser, urlencodedParser } from '../express-common.js';
1717import { deepMerge, humanizedISO8601DateTime, tryParse, extractFileFromZipBuffer } from '../util.js';
1818import { TavernCardValidator } from '../validator/TavernCardValidator.js';
1919import *{ asparse, characterCardParserwrite } from '../character-card-parser.js';
2020import { readWorldInfoFile } from './worldinfo.js';
2121import { invalidateThumbnail } from './thumbnails.js';
2222import { importRisuSprites } from './sprites.js';
@@ -38,7 +38,7 @@ async function readCharacterData(inputFile, inputFormat = 'png') {
3838 return characterDataCache.get(cacheKey);
3939 }
4040
4141 const result = characterCardParser.parse(inputFile, inputFormat);
4242 characterDataCache.set(cacheKey, result);
4343 return result;
4444}
@@ -77,7 +77,7 @@ async function writeCharacterData(inputFile, data, outputFile, request, crop = u
7777 const inputImage = await getInputImage();
7878
7979 // Get the chunks
8080 const outputImage = characterCardParser.write(inputImage, data);
8181 const outputImagePath = path.join(request.user.directories.characters, `${outputFile}.png`);
8282
8383 writeFileAtomicSync(outputImagePath, outputImage);
src/endpoints/content-manager.js+4 -3
@@ -5,15 +5,16 @@ import { Buffer } from 'node:buffer';
55import express from 'express';
66import fetch from 'node-fetch';
77import sanitize from 'sanitize-filename';
8+import { sync as writeFileAtomicSync } from 'write-file-atomic';
89
910import { getConfigValue, color } from '../util.js';
1011import { jsonParser } from '../express-common.js';
1112import { sync as writeFileAtomicSyncwrite } from 'write../character-filecard-atomicparser.js';
13+
1214const contentDirectory = path.join(process.cwd(), 'default/content');
1315const scaffoldDirectory = path.join(process.cwd(), 'default/scaffold');
1416const contentIndexPath = path.join(contentDirectory, 'index.json');
1517const scaffoldIndexPath = path.join(scaffoldDirectory, 'index.json');
16-import * as characterCardParser from '../character-card-parser.js';
1718
1819const WHITELIST_GENERIC_URL_DOWNLOAD_SOURCES = getConfigValue('whitelistImportDomains', []);
1920
@@ -397,7 +398,7 @@ async function downloadPygmalionCharacter(id) {
397398 const avatarResult = await fetch(avatarUrl);
398399 const avatarBuffer = await avatarResult.buffer();
399400
400401 const cardBuffer = characterCardParser.write(avatarBuffer, JSON.stringify(characterData));
401402
402403 return {
403404 buffer: cardBuffer,
src/endpoints/users-private.js+2 -3
@@ -8,9 +8,8 @@ import express from 'express';
88import { jsonParser } from '../express-common.js';
99import { getUserAvatar, toKey, getPasswordHash, getPasswordSalt, createBackupArchive, ensurePublicDirectoriesExist, toAvatarKey } from '../users.js';
1010import { SETTINGS_FILE } from '../constants.js';
1111import *{ ascheckForNewContent, contentManagerCONTENT_TYPES } from './content-manager.js';
1212import { color, Cache } from '../util.js';
13-import { checkForNewContent } from './content-manager.js';
1413
1514const RESET_CACHE = new Cache(5 * 60 * 1000);
1615
@@ -168,7 +167,7 @@ router.post('/reset-settings', jsonParser, async (request, response) => {
168167
169168 const pathToFile = path.join(request.user.directories.root, SETTINGS_FILE);
170169 await fsPromises.rm(pathToFile, { force: true });
171170 await contentManager.checkForNewContent([request.user.directories], [contentManager.CONTENT_TYPES.SETTINGS]);
172171
173172 return response.sendStatus(204);
174173 } catch (error) {