mirror of
https://github.com/overleaf/overleaf.git
synced 2024-11-07 20:31:06 -05:00
make the build id a secure random token
we allow existing build ids to work for backwards compatibility this can be removed after some time
This commit is contained in:
parent
8a2665911d
commit
2494327c12
1 changed files with 23 additions and 8 deletions
|
@ -5,13 +5,16 @@ Path = require "path"
|
||||||
logger = require "logger-sharelatex"
|
logger = require "logger-sharelatex"
|
||||||
_ = require "underscore"
|
_ = require "underscore"
|
||||||
Settings = require "settings-sharelatex"
|
Settings = require "settings-sharelatex"
|
||||||
|
crypto = require "crypto"
|
||||||
|
|
||||||
OutputFileOptimiser = require "./OutputFileOptimiser"
|
OutputFileOptimiser = require "./OutputFileOptimiser"
|
||||||
|
|
||||||
module.exports = OutputCacheManager =
|
module.exports = OutputCacheManager =
|
||||||
CACHE_SUBDIR: '.cache/clsi'
|
CACHE_SUBDIR: '.cache/clsi'
|
||||||
ARCHIVE_SUBDIR: '.archive/clsi'
|
ARCHIVE_SUBDIR: '.archive/clsi'
|
||||||
BUILD_REGEX: /^[0-9a-f]+$/ # build id is Date.now() converted to hex
|
# build id is HEXDATE-HEXRANDOM from Date.now()and RandomBytes
|
||||||
|
# for backwards compatibility, make the randombytes part optional
|
||||||
|
BUILD_REGEX: /^[0-9a-f]+(-[0-9a-f]+)?$/
|
||||||
CACHE_LIMIT: 2 # maximum number of cache directories
|
CACHE_LIMIT: 2 # maximum number of cache directories
|
||||||
CACHE_AGE: 60*60*1000 # up to one hour old
|
CACHE_AGE: 60*60*1000 # up to one hour old
|
||||||
|
|
||||||
|
@ -23,12 +26,24 @@ module.exports = OutputCacheManager =
|
||||||
# for invalid build id, return top level
|
# for invalid build id, return top level
|
||||||
return file
|
return file
|
||||||
|
|
||||||
|
generateBuildId: (callback = (error, buildId) ->) ->
|
||||||
|
# generate a secure build id from Date.now() and 8 random bytes in hex
|
||||||
|
crypto.randomBytes 8, (err, buf) ->
|
||||||
|
return callback(err) if err?
|
||||||
|
random = buf.toString('hex')
|
||||||
|
date = Date.now().toString(16)
|
||||||
|
callback err, "#{date}-#{random}"
|
||||||
|
|
||||||
saveOutputFiles: (outputFiles, compileDir, callback = (error) ->) ->
|
saveOutputFiles: (outputFiles, compileDir, callback = (error) ->) ->
|
||||||
|
OutputCacheManager.generateBuildId (err, buildId) ->
|
||||||
|
return callback(err) if err?
|
||||||
|
OutputCacheManager.saveOutputFilesInBuildDir outputFiles, compileDir, buildId, callback
|
||||||
|
|
||||||
|
saveOutputFilesInBuildDir: (outputFiles, compileDir, buildId, callback = (error) ->) ->
|
||||||
# make a compileDir/CACHE_SUBDIR/build_id directory and
|
# make a compileDir/CACHE_SUBDIR/build_id directory and
|
||||||
# copy all the output files into it
|
# copy all the output files into it
|
||||||
cacheRoot = Path.join(compileDir, OutputCacheManager.CACHE_SUBDIR)
|
cacheRoot = Path.join(compileDir, OutputCacheManager.CACHE_SUBDIR)
|
||||||
# Put the files into a new cache subdirectory
|
# Put the files into a new cache subdirectory
|
||||||
buildId = Date.now().toString(16)
|
|
||||||
cacheDir = Path.join(compileDir, OutputCacheManager.CACHE_SUBDIR, buildId)
|
cacheDir = Path.join(compileDir, OutputCacheManager.CACHE_SUBDIR, buildId)
|
||||||
|
|
||||||
# let file expiry run in the background
|
# let file expiry run in the background
|
||||||
|
@ -36,7 +51,7 @@ module.exports = OutputCacheManager =
|
||||||
|
|
||||||
# Archive logs in background
|
# Archive logs in background
|
||||||
if Settings.clsi?.archive_logs or Settings.clsi?.strace
|
if Settings.clsi?.archive_logs or Settings.clsi?.strace
|
||||||
OutputCacheManager.archiveLogs outputFiles, compileDir, (err) ->
|
OutputCacheManager.archiveLogs outputFiles, compileDir, buildId, (err) ->
|
||||||
if err?
|
if err?
|
||||||
logger.warn err:err, "erroring archiving log files"
|
logger.warn err:err, "erroring archiving log files"
|
||||||
|
|
||||||
|
@ -71,9 +86,8 @@ module.exports = OutputCacheManager =
|
||||||
else
|
else
|
||||||
# pass back the list of new files in the cache
|
# pass back the list of new files in the cache
|
||||||
callback(err, results)
|
callback(err, results)
|
||||||
|
|
||||||
archiveLogs: (outputFiles, compileDir, callback = (error) ->) ->
|
archiveLogs: (outputFiles, compileDir, buildId, callback = (error) ->) ->
|
||||||
buildId = Date.now().toString(16)
|
|
||||||
archiveDir = Path.join(compileDir, OutputCacheManager.ARCHIVE_SUBDIR, buildId)
|
archiveDir = Path.join(compileDir, OutputCacheManager.ARCHIVE_SUBDIR, buildId)
|
||||||
logger.log {dir: archiveDir}, "archiving log files for project"
|
logger.log {dir: archiveDir}, "archiving log files for project"
|
||||||
fse.ensureDir archiveDir, (err) ->
|
fse.ensureDir archiveDir, (err) ->
|
||||||
|
@ -104,8 +118,9 @@ module.exports = OutputCacheManager =
|
||||||
return false if options?.keep == dir
|
return false if options?.keep == dir
|
||||||
# remove any directories over the hard limit
|
# remove any directories over the hard limit
|
||||||
return true if index > OutputCacheManager.CACHE_LIMIT
|
return true if index > OutputCacheManager.CACHE_LIMIT
|
||||||
# we can get the build time from the directory name
|
# we can get the build time from the first part of the directory name DDDD-RRRR
|
||||||
dirTime = parseInt(dir, 16)
|
# DDDD is date and RRRR is random bytes
|
||||||
|
dirTime = parseInt(dir.split('-')?[0], 16)
|
||||||
age = currentTime - dirTime
|
age = currentTime - dirTime
|
||||||
return age > OutputCacheManager.CACHE_AGE
|
return age > OutputCacheManager.CACHE_AGE
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue