diff --git a/db/migrations/0082__camelCase_options.sql b/db/migrations/0082__camelCase_options.sql new file mode 100644 index 000000000..9dd45d6a1 --- /dev/null +++ b/db/migrations/0082__camelCase_options.sql @@ -0,0 +1,14 @@ +UPDATE "options" SET "name" = 'passwordVerificationHash' WHERE "name" = 'password_verification_hash'; +UPDATE "options" SET "name" = 'dbVersion' WHERE "name" = 'db_version'; +UPDATE "options" SET "name" = 'passwordDerivedKeySalt' WHERE "name" = 'password_derived_key_salt'; +UPDATE "options" SET "name" = 'documentId' WHERE "name" = 'document_id'; +UPDATE "options" SET "name" = 'lastSyncedPull' WHERE "name" = 'last_synced_pull'; +UPDATE "options" SET "name" = 'startNotePath' WHERE "name" = 'start_note_path'; +UPDATE "options" SET "name" = 'lastSyncedPush' WHERE "name" = 'last_synced_push'; +UPDATE "options" SET "name" = 'documentSecret' WHERE "name" = 'document_secret'; +UPDATE "options" SET "name" = 'lastBackupDate' WHERE "name" = 'last_backup_date'; +UPDATE "options" SET "name" = 'noteRevisionSnapshotTimeInterval' WHERE "name" = 'note_revision_snapshot_time_interval'; +UPDATE "options" SET "name" = 'protectedSessionTimeout' WHERE "name" = 'protected_session_timeout'; +UPDATE "options" SET "name" = 'encryptedDataKey' WHERE "name" = 'encrypted_data_key'; +UPDATE "options" SET "name" = 'encryptedDataKeyIv' WHERE "name" = 'encrypted_data_key_iv'; +UPDATE "options" SET "name" = 'passwordVerificationSalt' WHERE "name" = 'password_verification_salt'; diff --git a/src/public/javascripts/dialogs/options.js b/src/public/javascripts/dialogs/options.js index 6a04432fd..01a925518 100644 --- a/src/public/javascripts/dialogs/options.js +++ b/src/public/javascripts/dialogs/options.js @@ -93,7 +93,7 @@ addTabHandler((function() { addTabHandler((function() { const $form = $("#protected-session-timeout-form"); const $protectedSessionTimeout = $("#protected-session-timeout-in-seconds"); - const optionName = 'protected_session_timeout'; + const optionName = 'protectedSessionTimeout'; function optionsLoaded(options) { $protectedSessionTimeout.val(options[optionName]); @@ -117,7 +117,7 @@ addTabHandler((function() { addTabHandler((function () { const $form = $("#note-revision-snapshot-time-interval-form"); const $timeInterval = $("#note-revision-snapshot-time-interval-in-seconds"); - const optionName = 'note_revision_snapshot_time_interval'; + const optionName = 'noteRevisionSnapshotTimeInterval'; function optionsLoaded(options) { $timeInterval.val(options[optionName]); @@ -143,7 +143,7 @@ addTabHandler((async function () { const appInfo = await server.get('app-info'); $appVersion.html(appInfo.app_version); - $dbVersion.html(appInfo.db_version); + $dbVersion.html(appInfo.dbVersion); $buildDate.html(appInfo.build_date); $buildRevision.html(appInfo.build_revision); $buildRevision.attr('href', 'https://github.com/zadam/trilium/commit/' + appInfo.build_revision); diff --git a/src/public/javascripts/migration.js b/src/public/javascripts/migration.js index 522427ec9..30240650c 100644 --- a/src/public/javascripts/migration.js +++ b/src/public/javascripts/migration.js @@ -2,8 +2,8 @@ import server from './services/server.js'; $(document).ready(() => { server.get('migration').then(result => { - const appDbVersion = result.app_db_version; - const dbVersion = result.db_version; + const appDbVersion = result.app_dbVersion; + const dbVersion = result.dbVersion; if (appDbVersion === dbVersion) { $("#up-to-date").show(); @@ -26,7 +26,7 @@ $("#run-migration").click(async () => { for (const migration of result.migrations) { const row = $('') - .append($('').html(migration.db_version)) + .append($('').html(migration.dbVersion)) .append($('').html(migration.name)) .append($('').html(migration.success ? 'Yes' : 'No')) .append($('').html(migration.success ? 'N/A' : migration.error)); diff --git a/src/public/javascripts/services/protected_session_holder.js b/src/public/javascripts/services/protected_session_holder.js index 4e743d69b..b1d402e20 100644 --- a/src/public/javascripts/services/protected_session_holder.js +++ b/src/public/javascripts/services/protected_session_holder.js @@ -6,7 +6,7 @@ let protectedSessionTimeout = null; let protectedSessionId = null; $(document).ready(() => { - server.get('options').then(options => protectedSessionTimeout = options.protected_session_timeout); + server.get('options').then(options => protectedSessionTimeout = options.protectedSessionTimeout); }); setInterval(() => { diff --git a/src/public/javascripts/services/tree.js b/src/public/javascripts/services/tree.js index 545b600bb..751a8d3fb 100644 --- a/src/public/javascripts/services/tree.js +++ b/src/public/javascripts/services/tree.js @@ -369,7 +369,7 @@ function getNotePathFromAddress() { async function loadTree() { const resp = await server.get('tree'); - startNotePath = resp.start_note_path; + startNotePath = resp.startNotePath; if (document.location.hash) { startNotePath = getNotePathFromAddress(); diff --git a/src/routes/api/login.js b/src/routes/api/login.js index e976be95f..9e0277f52 100644 --- a/src/routes/api/login.js +++ b/src/routes/api/login.js @@ -21,11 +21,11 @@ async function loginSync(req) { const dbVersion = req.body.dbVersion; - if (dbVersion !== appInfo.db_version) { - return [400, { message: 'Non-matching db versions, local is version ' + appInfo.db_version }]; + if (dbVersion !== appInfo.dbVersion) { + return [400, { message: 'Non-matching db versions, local is version ' + appInfo.dbVersion }]; } - const documentSecret = await options.getOption('document_secret'); + const documentSecret = await options.getOption('documentSecret'); const expectedHash = utils.hmac(documentSecret, timestampStr); const givenHash = req.body.hash; diff --git a/src/routes/api/migration.js b/src/routes/api/migration.js index a6c6b6403..74f7ab012 100644 --- a/src/routes/api/migration.js +++ b/src/routes/api/migration.js @@ -6,8 +6,8 @@ const appInfo = require('../../services/app_info'); async function getMigrationInfo() { return { - db_version: parseInt(await optionService.getOption('db_version')), - app_db_version: appInfo.db_version + dbVersion: parseInt(await optionService.getOption('dbVersion')), + app_dbVersion: appInfo.dbVersion }; } diff --git a/src/routes/api/options.js b/src/routes/api/options.js index 2e3fefe93..4ce2da70a 100644 --- a/src/routes/api/options.js +++ b/src/routes/api/options.js @@ -4,7 +4,7 @@ const sql = require('../../services/sql'); const optionService = require('../../services/options'); // options allowed to be updated directly in options dialog -const ALLOWED_OPTIONS = ['protected_session_timeout', 'note_revision_snapshot_time_interval']; +const ALLOWED_OPTIONS = ['protectedSessionTimeout', 'noteRevisionSnapshotTimeInterval']; async function getOptions() { const options = await sql.getMap("SELECT name, value FROM options WHERE name IN (" diff --git a/src/routes/api/recent_notes.js b/src/routes/api/recent_notes.js index 38b6f1a20..7700724c9 100644 --- a/src/routes/api/recent_notes.js +++ b/src/routes/api/recent_notes.js @@ -33,7 +33,7 @@ async function addRecentNote(req) { await recentNote.save(); - await optionService.setOption('start_note_path', notePath); + await optionService.setOption('startNotePath', notePath); return await getRecentNotes(); } diff --git a/src/routes/api/setup.js b/src/routes/api/setup.js index 644cd42dd..8794c3095 100644 --- a/src/routes/api/setup.js +++ b/src/routes/api/setup.js @@ -11,11 +11,11 @@ async function setup(req) { await optionService.setOption('username', username); - await optionService.setOption('password_verification_salt', utils.randomSecureToken(32)); - await optionService.setOption('password_derived_key_salt', utils.randomSecureToken(32)); + await optionService.setOption('passwordVerificationSalt', utils.randomSecureToken(32)); + await optionService.setOption('passwordDerivedKeySalt', utils.randomSecureToken(32)); const passwordVerificationKey = utils.toBase64(await myScryptService.getVerificationHash(password)); - await optionService.setOption('password_verification_hash', passwordVerificationKey); + await optionService.setOption('passwordVerificationHash', passwordVerificationKey); await passwordEncryptionService.setDataKey(password, utils.randomSecureToken(16)); diff --git a/src/routes/api/sync.js b/src/routes/api/sync.js index 10728ec9a..e4b0212e4 100644 --- a/src/routes/api/sync.js +++ b/src/routes/api/sync.js @@ -26,8 +26,8 @@ async function fillSyncRows() { } async function forceFullSync() { - await optionService.setOption('last_synced_pull', 0); - await optionService.setOption('last_synced_push', 0); + await optionService.setOption('lastSyncedPull', 0); + await optionService.setOption('lastSyncedPush', 0); log.info("Forcing full sync."); diff --git a/src/routes/api/tree.js b/src/routes/api/tree.js index dfd90b691..9276582a1 100644 --- a/src/routes/api/tree.js +++ b/src/routes/api/tree.js @@ -51,7 +51,7 @@ async function getTree() { }); return { - start_note_path: await optionService.getOption('start_note_path'), + startNotePath: await optionService.getOption('startNotePath'), branches: branches, notes: notes }; diff --git a/src/routes/login.js b/src/routes/login.js index 27425c68b..3066fa8b9 100644 --- a/src/routes/login.js +++ b/src/routes/login.js @@ -33,7 +33,7 @@ async function login(req, res) { } async function verifyPassword(guessedPassword) { - const hashed_password = utils.fromBase64(await optionService.getOption('password_verification_hash')); + const hashed_password = utils.fromBase64(await optionService.getOption('passwordVerificationHash')); const guess_hashed = await myScryptService.getVerificationHash(guessedPassword); diff --git a/src/services/anonymization.js b/src/services/anonymization.js index 76a9abae4..aafb8f0f8 100644 --- a/src/services/anonymization.js +++ b/src/services/anonymization.js @@ -20,8 +20,8 @@ async function anonymize() { await db.run("UPDATE note_revisions SET title = 'title', content = 'text'"); await db.run("UPDATE branches SET prefix = 'prefix' WHERE prefix IS NOT NULL"); await db.run(`UPDATE options SET value = 'anonymized' WHERE name IN - ('document_secret', 'encrypted_data_key', 'password_verification_hash', - 'password_verification_salt', 'password_derived_key_salt')`); + ('documentSecret', 'encryptedDataKey', 'passwordVerificationHash', + 'passwordVerificationSalt', 'passwordDerivedKeySalt')`); await db.run("VACUUM"); await db.close(); diff --git a/src/services/app_info.js b/src/services/app_info.js index 582ec9724..f3a6d3ea5 100644 --- a/src/services/app_info.js +++ b/src/services/app_info.js @@ -7,7 +7,7 @@ const APP_DB_VERSION = 81; module.exports = { app_version: packageJson.version, - db_version: APP_DB_VERSION, + dbVersion: APP_DB_VERSION, build_date: build.build_date, build_revision: build.build_revision }; \ No newline at end of file diff --git a/src/services/backup.js b/src/services/backup.js index 687020ff3..865f9ad6b 100644 --- a/src/services/backup.js +++ b/src/services/backup.js @@ -11,7 +11,7 @@ const cls = require('./cls'); async function regularBackup() { const now = new Date(); - const lastBackupDate = dateUtils.parseDateTime(await optionService.getOption('last_backup_date')); + const lastBackupDate = dateUtils.parseDateTime(await optionService.getOption('lastBackupDate')); console.log(lastBackupDate); @@ -32,7 +32,7 @@ async function backupNow() { log.info("Created backup at " + backupFile); - await optionService.setOption('last_backup_date', dateUtils.nowDate()); + await optionService.setOption('lastBackupDate', dateUtils.nowDate()); }); } diff --git a/src/services/change_password.js b/src/services/change_password.js index 9aa4c6950..d50b86176 100644 --- a/src/services/change_password.js +++ b/src/services/change_password.js @@ -20,7 +20,7 @@ async function changePassword(currentPassword, newPassword) { await sql.doInTransaction(async () => { await passwordEncryptionService.setDataKey(newPassword, decryptedDataKey); - await optionService.setOption('password_verification_hash', newPasswordVerificationKey); + await optionService.setOption('passwordVerificationHash', newPasswordVerificationKey); }); return { diff --git a/src/services/messaging.js b/src/services/messaging.js index 8e5e8168b..839440f28 100644 --- a/src/services/messaging.js +++ b/src/services/messaging.js @@ -66,7 +66,7 @@ async function sendMessageToAllClients(message) { async function sendPing(client, lastSentSyncId) { const syncData = await sql.getRows("SELECT * FROM sync WHERE id > ?", [lastSentSyncId]); - const lastSyncedPush = await optionService.getOption('last_synced_push'); + const lastSyncedPush = await optionService.getOption('lastSyncedPush'); const changesToPushCount = await sql.getValue("SELECT COUNT(*) FROM sync WHERE id > ?", [lastSyncedPush]); diff --git a/src/services/migration.js b/src/services/migration.js index e02c84d9e..7419bde80 100644 --- a/src/services/migration.js +++ b/src/services/migration.js @@ -12,7 +12,7 @@ async function migrate() { // backup before attempting migration await backupService.backupNow(); - const currentDbVersion = parseInt(await optionService.getOption('db_version')); + const currentDbVersion = parseInt(await optionService.getOption('dbVersion')); fs.readdirSync(resourceDir.MIGRATIONS_DIR).forEach(file => { const match = file.match(/([0-9]{4})__([a-zA-Z0-9_ ]+)\.(sql|js)/); @@ -63,7 +63,7 @@ async function migrate() { throw new Error("Unknown migration type " + mig.type); } - await optionService.setOption("db_version", mig.dbVersion); + await optionService.setOption("dbVersion", mig.dbVersion); }); diff --git a/src/services/my_scrypt.js b/src/services/my_scrypt.js index 44f311259..ed724bb22 100644 --- a/src/services/my_scrypt.js +++ b/src/services/my_scrypt.js @@ -4,13 +4,13 @@ const optionService = require('./options'); const scrypt = require('scrypt'); async function getVerificationHash(password) { - const salt = await optionService.getOption('password_verification_salt'); + const salt = await optionService.getOption('passwordVerificationSalt'); return getScryptHash(password, salt); } async function getPasswordDerivedKey(password) { - const salt = await optionService.getOption('password_derived_key_salt'); + const salt = await optionService.getOption('passwordDerivedKeySalt'); return getScryptHash(password, salt); } diff --git a/src/services/notes.js b/src/services/notes.js index e6b7d3758..b8e274f82 100644 --- a/src/services/notes.js +++ b/src/services/notes.js @@ -165,7 +165,7 @@ async function saveNoteRevision(note) { const labelsMap = await note.getLabelMap(); const now = new Date(); - const noteRevisionSnapshotTimeInterval = parseInt(await optionService.getOption('note_revision_snapshot_time_interval')); + const noteRevisionSnapshotTimeInterval = parseInt(await optionService.getOption('noteRevisionSnapshotTimeInterval')); const revisionCutoff = dateUtils.dateStr(new Date(now.getTime() - noteRevisionSnapshotTimeInterval * 1000)); diff --git a/src/services/options.js b/src/services/options.js index 5f41d579d..cc20c5a99 100644 --- a/src/services/options.js +++ b/src/services/options.js @@ -47,24 +47,24 @@ async function createOption(name, value, isSynced) { } async function initOptions(startNotePath) { - await createOption('document_id', utils.randomSecureToken(16), false); - await createOption('document_secret', utils.randomSecureToken(16), false); + await createOption('documentId', utils.randomSecureToken(16), false); + await createOption('documentSecret', utils.randomSecureToken(16), false); await createOption('username', '', true); - await createOption('password_verification_hash', '', true); - await createOption('password_verification_salt', '', true); - await createOption('password_derived_key_salt', '', true); - await createOption('encrypted_data_key', '', true); - await createOption('encrypted_data_key_iv', '', true); + await createOption('passwordVerificationHash', '', true); + await createOption('passwordVerificationSalt', '', true); + await createOption('passwordDerivedKeySalt', '', true); + await createOption('encryptedDataKey', '', true); + await createOption('encryptedDataKey_iv', '', true); - await createOption('start_note_path', startNotePath, false); - await createOption('protected_session_timeout', 600, true); - await createOption('note_revision_snapshot_time_interval', 600, true); - await createOption('last_backup_date', dateUtils.nowDate(), false); - await createOption('db_version', appInfo.db_version, false); + await createOption('startNotePath', startNotePath, false); + await createOption('protectedSessionTimeout', 600, true); + await createOption('noteRevisionSnapshotTimeInterval', 600, true); + await createOption('lastBackupDate', dateUtils.nowDate(), false); + await createOption('dbVersion', appInfo.dbVersion, false); - await createOption('last_synced_pull', appInfo.db_version, false); - await createOption('last_synced_push', 0, false); + await createOption('lastSyncedPull', appInfo.dbVersion, false); + await createOption('lastSyncedPush', 0, false); } module.exports = { diff --git a/src/services/password_encryption.js b/src/services/password_encryption.js index 2ebe8e326..6bc1831e7 100644 --- a/src/services/password_encryption.js +++ b/src/services/password_encryption.js @@ -6,7 +6,7 @@ const dataEncryptionService = require('./data_encryption'); async function verifyPassword(password) { const givenPasswordHash = utils.toBase64(await myScryptService.getVerificationHash(password)); - const dbPasswordHash = await optionService.getOption('password_verification_hash'); + const dbPasswordHash = await optionService.getOption('passwordVerificationHash'); return givenPasswordHash === dbPasswordHash; } @@ -16,20 +16,20 @@ async function setDataKey(password, plainTextDataKey) { const encryptedDataKeyIv = utils.randomString(16); - await optionService.setOption('encrypted_data_key_iv', encryptedDataKeyIv); + await optionService.setOption('encryptedDataKeyIv', encryptedDataKeyIv); const buffer = Buffer.from(plainTextDataKey); const newEncryptedDataKey = dataEncryptionService.encrypt(passwordDerivedKey, encryptedDataKeyIv, buffer); - await optionService.setOption('encrypted_data_key', newEncryptedDataKey); + await optionService.setOption('encryptedDataKey', newEncryptedDataKey); } async function getDataKey(password) { const passwordDerivedKey = await myScryptService.getPasswordDerivedKey(password); - const encryptedDataKeyIv = await optionService.getOption('encrypted_data_key_iv'); - const encryptedDataKey = await optionService.getOption('encrypted_data_key'); + const encryptedDataKeyIv = await optionService.getOption('encryptedDataKeyIv'); + const encryptedDataKey = await optionService.getOption('encryptedDataKey'); const decryptedDataKey = dataEncryptionService.decrypt(passwordDerivedKey, encryptedDataKeyIv, encryptedDataKey); diff --git a/src/services/sql_init.js b/src/services/sql_init.js index 6f33abe46..9100b7041 100644 --- a/src/services/sql_init.js +++ b/src/services/sql_init.js @@ -76,12 +76,12 @@ function setDbReadyAsResolved() { } async function isDbUpToDate() { - const dbVersion = parseInt(await sql.getValue("SELECT value FROM options WHERE name = 'db_version'")); + const dbVersion = parseInt(await sql.getValue("SELECT value FROM options WHERE name = 'dbVersion'")); - const upToDate = dbVersion >= appInfo.db_version; + const upToDate = dbVersion >= appInfo.dbVersion; if (!upToDate) { - log.info("App db version is " + appInfo.db_version + ", while db version is " + dbVersion + ". Migration needed."); + log.info("App db version is " + appInfo.dbVersion + ", while db version is " + dbVersion + ". Migration needed."); } return upToDate; diff --git a/src/services/sync.js b/src/services/sync.js index 31921703c..fe1c0c445 100644 --- a/src/services/sync.js +++ b/src/services/sync.js @@ -71,14 +71,14 @@ async function sync() { async function login() { const timestamp = dateUtils.nowDate(); - const documentSecret = await optionService.getOption('document_secret'); + const documentSecret = await optionService.getOption('documentSecret'); const hash = utils.hmac(documentSecret, timestamp); const syncContext = { cookieJar: rp.jar() }; const resp = await syncRequest(syncContext, 'POST', '/api/login/sync', { timestamp: timestamp, - dbVersion: appInfo.db_version, + dbVersion: appInfo.dbVersion, hash: hash }); @@ -92,11 +92,11 @@ async function login() { } async function getLastSyncedPull() { - return parseInt(await optionService.getOption('last_synced_pull')); + return parseInt(await optionService.getOption('lastSyncedPull')); } async function setLastSyncedPull(syncId) { - await optionService.setOption('last_synced_pull', syncId); + await optionService.setOption('lastSyncedPull', syncId); } async function pullSync(syncContext) { @@ -163,11 +163,11 @@ async function pullSync(syncContext) { } async function getLastSyncedPush() { - return parseInt(await optionService.getOption('last_synced_push')); + return parseInt(await optionService.getOption('lastSyncedPush')); } async function setLastSyncedPush(lastSyncedPush) { - await optionService.setOption('last_synced_push', lastSyncedPush); + await optionService.setOption('lastSyncedPush', lastSyncedPush); } async function pushSync(syncContext) { diff --git a/src/services/sync_table.js b/src/services/sync_table.js index eb6ef6d40..cf80522c8 100644 --- a/src/services/sync_table.js +++ b/src/services/sync_table.js @@ -56,7 +56,7 @@ async function addEntitySync(entityName, entityId, sourceId) { if (!syncSetup.isSyncSetup) { // this is because the "server" instances shouldn't have outstanding pushes // useful when you fork the DB for new "client" instance, it won't try to sync the whole DB - await sql.execute("UPDATE options SET value = (SELECT MAX(id) FROM sync) WHERE name IN('last_synced_push', 'last_synced_pull')"); + await sql.execute("UPDATE options SET value = (SELECT MAX(id) FROM sync) WHERE name IN('lastSyncedPush', 'lastSyncedPull')"); } }