This commit is contained in:
Leandro Facchinetti 2021-03-13 23:36:06 +00:00
parent 0f7159f58c
commit f79a1781f8
4 changed files with 308 additions and 3 deletions

View File

@ -0,0 +1,40 @@
module.exports = async (require) => {
const path = require("path");
const express = require("express");
const cookieSession = require("cookie-session");
const { sql } = require("@leafac/sqlite");
const AutoEncrypt = require("@small-tech/auto-encrypt");
const courselore = require(".").default;
const customization = require(path.join(__dirname, "customization"))(require);
const app = await courselore(__dirname);
app.set("url", "https://courselore.org");
app.set("administrator", "mailto:administrator@courselore.org");
const reverseProxy = express();
reverseProxy.use((req, res, next) => {
if (req.hostname !== new URL(app.get("url")).hostname)
return res.redirect(`${app.get("url")}${req.originalUrl}`);
next();
});
reverseProxy.use(cookieSession({ secret: app.get("cookie secret") }));
reverseProxy.use(customization(app));
reverseProxy.use(app);
AutoEncrypt.https
.createServer(
{
domains: [
"courselore.org",
"www.courselore.org",
"courselore.com",
"www.courselore.com",
],
settingsPath: path.join(__dirname, "data/keys/tls"),
},
reverseProxy
)
.listen(443);
};

View File

@ -0,0 +1,12 @@
[Unit]
Description=Courselore
After=network.target
[Service]
ExecStart=/root/courselore/courselore /root/courselore/configuration.js
Environment=NODE_ENV=production
User=root
Restart=always
[Install]
WantedBy=multi-user.target

258
package-lock.json generated
View File

@ -12,6 +12,7 @@
"@leafac/html": "^1.3.0",
"@leafac/sqlite": "^1.1.2",
"@leafac/sqlite-migration": "^1.0.3",
"@small-tech/auto-encrypt": "^3.0.0",
"crypto-random-string": "^3.3.1",
"express": "^4.17.1",
"fs-extra": "^9.1.0",
@ -928,6 +929,14 @@
"@leafac/sqlite": "^1.1.2"
}
},
"node_modules/@panva/asn1.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz",
"integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==",
"engines": {
"node": ">=10.13.0"
}
},
"node_modules/@sindresorhus/is": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz",
@ -958,6 +967,24 @@
"@sinonjs/commons": "^1.7.0"
}
},
"node_modules/@small-tech/auto-encrypt": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@small-tech/auto-encrypt/-/auto-encrypt-3.0.0.tgz",
"integrity": "sha512-u/D3j0VtDemZtpTArw0eI1d2T39b4E6wRsdnts6auLJO+BJKUzQXdJyv08r/9xYxBXQF/NWfTfc43PCqCL6AWQ==",
"dependencies": {
"bent": "github:aral/bent#errors-with-response-headers",
"encodeurl": "^1.0.2",
"jose": "^1.24.0",
"moment": "^2.24.0",
"node-forge": "^0.10.0",
"ocsp": "^1.2.0",
"server-destroy": "^1.0.1"
},
"funding": {
"type": "foundation",
"url": "https://small-tech.org/fund-us/"
}
},
"node_modules/@szmarczak/http-timer": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz",
@ -1535,6 +1562,35 @@
"safer-buffer": "~2.1.0"
}
},
"node_modules/asn1.js": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
"integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
"dependencies": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
"node_modules/asn1.js-rfc2560": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-4.0.6.tgz",
"integrity": "sha512-ysf48ni+f/efNPilq4+ApbifUPcSW/xbDeQAh055I+grr2gXgNRQqHew7kkO70WSMQ2tEOURVwsK+dJqUNjIIg==",
"dependencies": {
"asn1.js-rfc5280": "^2.0.0"
},
"peerDependencies": {
"asn1.js": "^4.4.0"
}
},
"node_modules/asn1.js-rfc5280": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-2.0.1.tgz",
"integrity": "sha512-1e2ypnvTbYD/GdxWK77tdLBahvo1fZUHlQJqAVUuZWdYj0rdjGcf2CWYUtbsyRYpYUMwMWLZFUtLxog8ZXTrcg==",
"dependencies": {
"asn1.js": "^4.5.0"
}
},
"node_modules/assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
@ -1759,6 +1815,16 @@
"tweetnacl": "^0.14.3"
}
},
"node_modules/bent": {
"version": "7.0.3",
"resolved": "git+ssh://git@github.com/aral/bent.git#16a959683c6916204c28a1c870cb7b399c9215a9",
"license": "Apache-2.0",
"dependencies": {
"bytesish": "^0.4.1",
"caseless": "~0.12.0",
"is-stream": "^2.0.0"
}
},
"node_modules/better-sqlite3": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.2.tgz",
@ -1815,6 +1881,11 @@
"node": ">= 6"
}
},
"node_modules/bn.js": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
},
"node_modules/body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
@ -1952,6 +2023,11 @@
"node": ">= 0.8"
}
},
"node_modules/bytesish": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz",
"integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ=="
},
"node_modules/cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@ -4262,7 +4338,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
"dev": true,
"engines": {
"node": ">=8"
}
@ -4985,6 +5060,20 @@
"node": ">= 10.13.0"
}
},
"node_modules/jose": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-1.28.0.tgz",
"integrity": "sha512-JmfDRzt/HSj8ipd9TsDtEHoLUnLYavG+7e8F6s1mx2jfVSfXOTaFQsJUydbjJpTnTDHP1+yKL9Ke7ktS/a0Eiw==",
"dependencies": {
"@panva/asn1.js": "^1.0.0"
},
"engines": {
"node": ">=10.13.0"
},
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -5641,6 +5730,11 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
},
"node_modules/minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@ -5710,6 +5804,14 @@
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
},
"node_modules/moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
"engines": {
"node": "*"
}
},
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -5781,6 +5883,14 @@
"semver": "^5.4.1"
}
},
"node_modules/node-forge": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
"integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
"engines": {
"node": ">= 6.0.0"
}
},
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@ -6047,6 +6157,23 @@
"node": ">=0.10.0"
}
},
"node_modules/ocsp": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/ocsp/-/ocsp-1.2.0.tgz",
"integrity": "sha1-RpoXdrRX3uZ+sCAUCMGUa6xAdsw=",
"dependencies": {
"asn1.js": "^4.8.0",
"asn1.js-rfc2560": "^4.0.0",
"asn1.js-rfc5280": "^2.0.0",
"async": "^1.5.2",
"simple-lru-cache": "0.0.2"
}
},
"node_modules/ocsp/node_modules/async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
},
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@ -7290,6 +7417,11 @@
"node": ">= 0.8.0"
}
},
"node_modules/server-destroy": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
"integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0="
},
"node_modules/set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@ -7398,6 +7530,11 @@
"simple-concat": "^1.0.0"
}
},
"node_modules/simple-lru-cache": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz",
"integrity": "sha1-1ZzDoZPBpdAyD4Tucy9uRxPlEd0="
},
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@ -9751,6 +9888,11 @@
"integrity": "sha512-oTfynjzKSFH3tc0M4sISheaZ4go1/3Wr9knGHuq66rFfgqblfgWh6RMG8V3dAiZI0U4PBidOAKzt2AYefXjHNQ==",
"requires": {}
},
"@panva/asn1.js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@panva/asn1.js/-/asn1.js-1.0.0.tgz",
"integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw=="
},
"@sindresorhus/is": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz",
@ -9775,6 +9917,20 @@
"@sinonjs/commons": "^1.7.0"
}
},
"@small-tech/auto-encrypt": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/@small-tech/auto-encrypt/-/auto-encrypt-3.0.0.tgz",
"integrity": "sha512-u/D3j0VtDemZtpTArw0eI1d2T39b4E6wRsdnts6auLJO+BJKUzQXdJyv08r/9xYxBXQF/NWfTfc43PCqCL6AWQ==",
"requires": {
"bent": "github:aral/bent#errors-with-response-headers",
"encodeurl": "^1.0.2",
"jose": "^1.24.0",
"moment": "^2.24.0",
"node-forge": "^0.10.0",
"ocsp": "^1.2.0",
"server-destroy": "^1.0.1"
}
},
"@szmarczak/http-timer": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz",
@ -10285,6 +10441,32 @@
"safer-buffer": "~2.1.0"
}
},
"asn1.js": {
"version": "4.10.1",
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
"integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
"requires": {
"bn.js": "^4.0.0",
"inherits": "^2.0.1",
"minimalistic-assert": "^1.0.0"
}
},
"asn1.js-rfc2560": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/asn1.js-rfc2560/-/asn1.js-rfc2560-4.0.6.tgz",
"integrity": "sha512-ysf48ni+f/efNPilq4+ApbifUPcSW/xbDeQAh055I+grr2gXgNRQqHew7kkO70WSMQ2tEOURVwsK+dJqUNjIIg==",
"requires": {
"asn1.js-rfc5280": "^2.0.0"
}
},
"asn1.js-rfc5280": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/asn1.js-rfc5280/-/asn1.js-rfc5280-2.0.1.tgz",
"integrity": "sha512-1e2ypnvTbYD/GdxWK77tdLBahvo1fZUHlQJqAVUuZWdYj0rdjGcf2CWYUtbsyRYpYUMwMWLZFUtLxog8ZXTrcg==",
"requires": {
"asn1.js": "^4.5.0"
}
},
"assert-plus": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
@ -10449,6 +10631,15 @@
"tweetnacl": "^0.14.3"
}
},
"bent": {
"version": "git+ssh://git@github.com/aral/bent.git#16a959683c6916204c28a1c870cb7b399c9215a9",
"from": "bent@github:aral/bent#errors-with-response-headers",
"requires": {
"bytesish": "^0.4.1",
"caseless": "~0.12.0",
"is-stream": "^2.0.0"
}
},
"better-sqlite3": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.1.2.tgz",
@ -10500,6 +10691,11 @@
}
}
},
"bn.js": {
"version": "4.12.0",
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
"integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
},
"body-parser": {
"version": "1.19.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
@ -10598,6 +10794,11 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"bytesish": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/bytesish/-/bytesish-0.4.4.tgz",
"integrity": "sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ=="
},
"cache-base": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
@ -12366,8 +12567,7 @@
"is-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
"dev": true
"integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
},
"is-typedarray": {
"version": "1.0.0",
@ -12938,6 +13138,14 @@
"supports-color": "^7.0.0"
}
},
"jose": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-1.28.0.tgz",
"integrity": "sha512-JmfDRzt/HSj8ipd9TsDtEHoLUnLYavG+7e8F6s1mx2jfVSfXOTaFQsJUydbjJpTnTDHP1+yKL9Ke7ktS/a0Eiw==",
"requires": {
"@panva/asn1.js": "^1.0.0"
}
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@ -13467,6 +13675,11 @@
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
"integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA=="
},
"minimalistic-assert": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
"integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@ -13518,6 +13731,11 @@
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@ -13577,6 +13795,11 @@
"semver": "^5.4.1"
}
},
"node-forge": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
"integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
},
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@ -13789,6 +14012,25 @@
"isobject": "^3.0.1"
}
},
"ocsp": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/ocsp/-/ocsp-1.2.0.tgz",
"integrity": "sha1-RpoXdrRX3uZ+sCAUCMGUa6xAdsw=",
"requires": {
"asn1.js": "^4.8.0",
"asn1.js-rfc2560": "^4.0.0",
"asn1.js-rfc5280": "^2.0.0",
"async": "^1.5.2",
"simple-lru-cache": "0.0.2"
},
"dependencies": {
"async": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
}
}
},
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
@ -14733,6 +14975,11 @@
"send": "0.17.1"
}
},
"server-destroy": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
"integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0="
},
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@ -14814,6 +15061,11 @@
"simple-concat": "^1.0.0"
}
},
"simple-lru-cache": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/simple-lru-cache/-/simple-lru-cache-0.0.2.tgz",
"integrity": "sha1-1ZzDoZPBpdAyD4Tucy9uRxPlEd0="
},
"sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",

View File

@ -25,6 +25,7 @@
"@leafac/html": "^1.3.0",
"@leafac/sqlite": "^1.1.2",
"@leafac/sqlite-migration": "^1.0.3",
"@small-tech/auto-encrypt": "^3.0.0",
"crypto-random-string": "^3.3.1",
"express": "^4.17.1",
"fs-extra": "^9.1.0",