mirror of
https://github.com/BobbyWibowo/lolisafe.git
synced 2025-02-21 20:59:04 +00:00
Added alt stricter file name collision checks
This commit is contained in:
parent
b7399d2d8d
commit
ea15b145b1
@ -415,6 +415,20 @@ module.exports = {
|
|||||||
*/
|
*/
|
||||||
cacheFileIdentifiers: true,
|
cacheFileIdentifiers: true,
|
||||||
|
|
||||||
|
/*
|
||||||
|
An alternative to caching file identifiers.
|
||||||
|
|
||||||
|
Basically the service will instead query the database for stricter collision checks.
|
||||||
|
Right off the bat this has the disadvantage of adding one or more SQL queries on every
|
||||||
|
new uploads, but it has the advantage of not having to pre-cache anything.
|
||||||
|
Essentially this reduces the service's startup time and memory usage, but slows down new uploads.
|
||||||
|
|
||||||
|
As this is an alternative, you need to disable cacheFileIdentifiers to use this.
|
||||||
|
|
||||||
|
You'll have to figure out which method suits your use case best.
|
||||||
|
*/
|
||||||
|
queryDbForFileCollisions: true,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The length of the randomly generated identifier for albums.
|
The length of the randomly generated identifier for albums.
|
||||||
*/
|
*/
|
||||||
|
@ -13,7 +13,9 @@ const config = require('./../config')
|
|||||||
const logger = require('./../logger')
|
const logger = require('./../logger')
|
||||||
const db = require('knex')(config.database)
|
const db = require('knex')(config.database)
|
||||||
|
|
||||||
const self = {}
|
const self = {
|
||||||
|
onHold: new Set()
|
||||||
|
}
|
||||||
|
|
||||||
const fileIdentifierLengthFallback = 32
|
const fileIdentifierLengthFallback = 32
|
||||||
const fileIdentifierLengthChangeable = !config.uploads.fileIdentifierLength.force &&
|
const fileIdentifierLengthChangeable = !config.uploads.fileIdentifierLength.force &&
|
||||||
@ -191,6 +193,22 @@ self.getUniqueRandomName = async (length, extension) => {
|
|||||||
}
|
}
|
||||||
utils.idSet.add(identifier)
|
utils.idSet.add(identifier)
|
||||||
// logger.log(`Added ${identifier} to identifiers cache`)
|
// logger.log(`Added ${identifier} to identifiers cache`)
|
||||||
|
} else if (config.uploads.queryDbForFileCollisions) {
|
||||||
|
if (self.onHold.has(identifier))
|
||||||
|
continue
|
||||||
|
|
||||||
|
// Put token on-hold (wait for it to be inserted to DB)
|
||||||
|
self.onHold.add(identifier)
|
||||||
|
|
||||||
|
const file = await db.table('files')
|
||||||
|
.where('name', 'like', 'identifier.%')
|
||||||
|
.select('id')
|
||||||
|
.first()
|
||||||
|
if (file) {
|
||||||
|
self.onHold.delete(identifier)
|
||||||
|
logger.log(`Identifier ${identifier} is already in use (${i + 1}/${utils.idMaxTries}).`)
|
||||||
|
continue
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
await paths.access(path.join(paths.uploads, name))
|
await paths.access(path.join(paths.uploads, name))
|
||||||
@ -721,6 +739,13 @@ self.storeFilesToDb = async (req, res, user, infoMap) => {
|
|||||||
await db.table('files').insert(files)
|
await db.table('files').insert(files)
|
||||||
utils.invalidateStatsCache('uploads')
|
utils.invalidateStatsCache('uploads')
|
||||||
|
|
||||||
|
if (config.uploads.queryDbForFileCollisions)
|
||||||
|
for (const file of files) {
|
||||||
|
const extname = utils.extname(file.name)
|
||||||
|
const identifier = file.name.slice(0, -(extname.length))
|
||||||
|
self.onHold.delete(identifier)
|
||||||
|
}
|
||||||
|
|
||||||
// Update albums' timestamp
|
// Update albums' timestamp
|
||||||
if (authorizedIds.length) {
|
if (authorizedIds.length) {
|
||||||
await db.table('albums')
|
await db.table('albums')
|
||||||
|
Loading…
Reference in New Issue
Block a user