aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/api/database/migrations/20210112011802_addSettingsTable.js24
-rw-r--r--src/api/database/seeds/initial.js13
-rw-r--r--src/api/scripts/overwriteConfig.js15
-rw-r--r--src/api/structures/Database.js2
-rw-r--r--src/api/utils/Util.js39
5 files changed, 90 insertions, 3 deletions
diff --git a/src/api/database/migrations/20210112011802_addSettingsTable.js b/src/api/database/migrations/20210112011802_addSettingsTable.js
index 2708352..3acd845 100644
--- a/src/api/database/migrations/20210112011802_addSettingsTable.js
+++ b/src/api/database/migrations/20210112011802_addSettingsTable.js
@@ -1,7 +1,27 @@
exports.up = async knex => {
await knex.schema.createTable('settings', table => {
- table.string('key').unique();
- table.json('value').notNullable();
+ table.string('routePrefix');
+ table.integer('rateLimitWindow');
+ table.integer('rateLimitMax');
+ table.string('secret');
+ table.string('serviceName');
+ table.string('domain');
+ table.integer('chunkSize');
+ table.integer('maxSize');
+ table.boolean('generateZips');
+ table.integer('generatedFilenameLength');
+ table.integer('generatedAlbumLength');
+ table.integer('maxLinksPerAlbum');
+ table.string('uploadFolder');
+ table.json('blockedExtensions');
+ table.boolean('publicMode');
+ table.boolean('userAccounts');
+ table.string('adminAccount');
+ table.string('adminPassword');
+ table.string('metaThemeColor');
+ table.string('metaDescription');
+ table.string('metaKeywords');
+ table.string('metaTwitterHandle');
});
};
diff --git a/src/api/database/seeds/initial.js b/src/api/database/seeds/initial.js
index edc1949..bb60b2c 100644
--- a/src/api/database/seeds/initial.js
+++ b/src/api/database/seeds/initial.js
@@ -1,9 +1,22 @@
/* eslint-disable no-console */
const bcrypt = require('bcrypt');
const moment = require('moment');
+const Util = require('../../utils/Util');
exports.seed = async db => {
const now = moment.utc().toDate();
+
+ // Save environment variables to the database
+ try {
+ const settings = await db.table('settings').first();
+ if (!settings) {
+ await Util.writeConfigToDb(Util.getEnvironmentDefaults(), false);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+
+ // Create admin user if it doesnt exist
const user = await db.table('users').where({ username: process.env.ADMIN_ACCOUNT }).first();
if (user) return;
try {
diff --git a/src/api/scripts/overwriteConfig.js b/src/api/scripts/overwriteConfig.js
new file mode 100644
index 0000000..0355ea6
--- /dev/null
+++ b/src/api/scripts/overwriteConfig.js
@@ -0,0 +1,15 @@
+require('dotenv').config();
+
+const Util = require('../utils/Util');
+
+const start = async () => {
+ try {
+ await Util.writeConfigToDb(Util.getEnvironmentDefaults());
+ console.log('Configuration overwriten, you can now start chibisafe');
+ process.exit(0);
+ } catch (error) {
+ console.error(error);
+ }
+};
+
+start();
diff --git a/src/api/structures/Database.js b/src/api/structures/Database.js
index 39632a1..ed30c50 100644
--- a/src/api/structures/Database.js
+++ b/src/api/structures/Database.js
@@ -23,7 +23,7 @@ const db = Knex({
some things like different data types for booleans need to be considered like in
the implementation below where sqlite returns 1 and 0 instead of true and false.
*/
- const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw'];
+ const booleanFields = ['enabled', 'enableDownload', 'isAdmin', 'nsfw', 'generateZips', 'publicMode', 'userAccounts'];
const processResponse = row => {
Object.keys(row).forEach(key => {
diff --git a/src/api/utils/Util.js b/src/api/utils/Util.js
index b60fca3..e760679 100644
--- a/src/api/utils/Util.js
+++ b/src/api/utils/Util.js
@@ -40,6 +40,45 @@ class Util {
this._config = null;
}
+ static getEnvironmentDefaults() {
+ return {
+ routePrefix: process.env.ROUTE_PREFIX || '/api',
+ rateLimitWindow: process.env.RATE_LIMIT_WINDOW || 2,
+ rateLimitMax: process.env.RATE_LIMIT_MAX || 5,
+ secret: process.env.SECRET || randomstring.generate(64),
+ serviceName: process.env.SERVICE_NAME || 'change-me',
+ domain: process.env.DOMAIN || `http://localhost:${process.env.SERVER_PORT}`,
+ chunkSize: process.env.CHUNK_SIZE || 90,
+ maxSize: process.env.MAX_SIZE || 5000,
+ generateZips: process.env.GENERATE_ZIPS == undefined ? true : false,
+ generatedFilenameLength: process.env.GENERATED_FILENAME_LENGTH || 12,
+ generatedAlbumLength: process.env.GENERATED_ALBUM_LENGTH || 6,
+ maxLinksPerAlbum: process.env.MAX_LINKS_PER_ALBUM || 5,
+ uploadFolder: process.env.UPLOAD_FOLDER || 'uploads',
+ blockedExtensions: process.env.BLOCKED_EXTENSIONS || ['.jar', '.exe', '.msi', '.com', '.bat', '.cmd', '.scr', '.ps1', '.sh'],
+ publicMode: process.env.PUBLIC_MODE == undefined ? true : false,
+ userAccounts: process.env.USER_ACCOUNTS == undefined ? true : false,
+ adminAccount: process.env.ADMIN_ACCOUNT || 'admin',
+ adminPassword: process.env.ADMIN_PASSWORD || 'admin',
+ metaThemeColor: process.env.META_THEME_COLOR || '#20222b',
+ metaDescription: process.env.META_DESCRIPTION || 'Blazing fast file uploader and bunker written in node! 🚀',
+ metaKeywords: process.env.META_KEYWORDS || 'chibisafe,lolisafe,upload,uploader,file,vue,images,ssr,file uploader,free',
+ metaTwitterHandle: process.env.META_TWITTER_HANDLE || '@your-handle'
+ };
+ }
+
+ static async writeConfigToDb(config, overwrite = true) {
+ try {
+ if (overwrite) {
+ await db.table('settings').first().update(config);
+ } else {
+ await db.table('settings').insert(config);
+ }
+ } catch (error) {
+ console.error(error);
+ }
+ }
+
static uuid() {
return uuidv4();
}