Migrated JWT secrets over to new Storage system and improved secrets storage performance

This commit is contained in:
emad-salah 2020-08-17 12:06:48 +01:00
parent 4738228d36
commit eeb3e36fc4
2 changed files with 13 additions and 76 deletions

View file

@ -7,90 +7,32 @@ const uuidv1 = require('uuid/v1')
const jsonfile = require('jsonfile') const jsonfile = require('jsonfile')
const path = require('path') const path = require('path')
const logger = require('winston') const logger = require('winston')
const Storage = require('node-persist')
const FS = require('../../utils/fs') const FS = require('../../utils/fs')
const rootFolder = process.resourcesPath || __dirname const rootFolder = process.resourcesPath || __dirname
const secretsFilePath = path.resolve(rootFolder, 'secrets.json') const secretsFilePath = path.resolve(rootFolder, 'secrets.json')
class Auth { class Auth {
verifySecretsFile = async () => { readSecrets = async () => {
try { const secrets = await Storage.get('auth/secrets')
const fileExists = await FS.access(secretsFilePath)
if (!fileExists) { if (secrets) {
return { exists: false } return secrets
}
const secretsFile = await FS.readFile(secretsFilePath, {
encoding: 'utf8'
})
// Check if secrets file has valid JSON
JSON.parse(secretsFile)
return { exists: true, parsable: true }
} catch (err) {
logger.error(err)
return { exists: true, parsable: false }
} }
const newSecrets = await Storage.set('auth/secrets', {})
return newSecrets
} }
initSecretsFile = async () => {
const { exists, parsable } = await this.verifySecretsFile()
if (exists && parsable) {
// logger.info('Secrets file exists!')
return true
}
if (exists && !parsable) {
await FS.unlink(secretsFilePath)
}
await FS.writeFile(secretsFilePath, '{}')
logger.info('New secrets file generated!')
return true
}
readSecrets = () =>
new Promise((resolve, reject) => {
this.initSecretsFile()
.then(() => {
jsonfile.readFile(secretsFilePath, (err, allSecrets) => {
if (err) {
logger.error('readSecrets err', err)
reject('Problem reading secrets file')
} else {
resolve(allSecrets)
}
})
})
.catch(reject)
})
async writeSecrets(key, value) { async writeSecrets(key, value) {
await this.initSecretsFile()
const allSecrets = await this.readSecrets() const allSecrets = await this.readSecrets()
return new Promise((resolve, reject) => { const newSecrets = await Storage.set('auth/secrets', {
allSecrets[key] = value ...allSecrets,
logger.info('Writing new secret:', secretsFilePath) [key]: value
jsonfile.writeFile(
secretsFilePath,
allSecrets,
{ spaces: 2, EOL: '\r\n' },
err => {
if (err) {
logger.error('writeSecrets err', err)
reject(err)
} else {
logger.info('New secret saved!')
resolve(true)
}
}
)
}) })
return newSecrets
} }
async generateToken() { async generateToken() {
@ -111,7 +53,6 @@ class Auth {
async validateToken(token) { async validateToken(token) {
try { try {
await this.initSecretsFile()
const key = jwt.decode(token).data.timestamp const key = jwt.decode(token).data.timestamp
const secrets = await this.readSecrets() const secrets = await this.readSecrets()
const secret = secrets[key] const secret = secrets[key]

View file

@ -2767,8 +2767,4 @@ module.exports = async (
data: isAuthenticated() data: isAuthenticated()
}) })
}) })
/**
* Return app so that it can be used by express.
*/
// return app;
} }