[feature] Add upgrade scripts; Remove additional_params column

This commit is contained in:
Sergey Konovalov
2020-12-09 17:18:32 +03:00
committed by Sergey Konovalov
parent 8904a33e59
commit 76397294a3
10 changed files with 102 additions and 64 deletions

View File

@ -86,8 +86,7 @@
"forgottenfilesname": "output",
"maxRequestChanges": 20000,
"openProtectedFile": true,
"editorDataStorage": "editorDataMemory",
"secretPassword": "verysecretstring"
"editorDataStorage": "editorDataMemory"
},
"requestDefaults": {
"headers": {
@ -221,6 +220,14 @@
"randomize": false
},
"httpStatus": "429,500-599"
},
"password": {
"encrypt": {
"passwords": ["verysecretstring"]
},
"decrypt": {
"passwords": ["verysecretstring"]
}
}
}
},

View File

@ -76,7 +76,8 @@ var cfgRequestDefaults = config.get('services.CoAuthoring.requestDefaults');
const cfgTokenOutboxInBody = config.get('services.CoAuthoring.token.outbox.inBody');
const cfgTokenEnableRequestOutbox = config.get('services.CoAuthoring.token.enable.request.outbox');
const cfgTokenOutboxUrlExclusionRegex = config.get('services.CoAuthoring.token.outbox.urlExclusionRegex');
const cfgSecretPassword = config.get('services.CoAuthoring.server.secretPassword');
const cfgPasswordEncrypt = config.get('services.CoAuthoring.password.encrypt');
const cfgPasswordDecrypt = config.get('services.CoAuthoring.password.decrypt');
var ANDROID_SAFE_FILENAME = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ._-+,@£$€!½§~\'=()[]{}0123456789';
@ -812,11 +813,15 @@ exports.canIncludeOutboxAuthorization = function (url) {
return false;
};
exports.encryptPassword = co.wrap(function* (password) {
const { data: encrypted } = yield openpgp.encrypt({message: openpgp.message.fromText(password), passwords: [cfgSecretPassword]});
let params = {message: openpgp.message.fromText(password)};
Object.assign(params, cfgPasswordEncrypt);
const { data: encrypted } = yield openpgp.encrypt(params);
return encrypted;
});
exports.decryptPassword = co.wrap(function* (password) {
const message = yield openpgp.message.readArmored(password);
const { data: decrypted } = yield openpgp.decrypt({message: message, passwords: [cfgSecretPassword]});
let params = {message: message};
Object.assign(params, cfgPasswordDecrypt);
const { data: decrypted } = yield openpgp.decrypt(params);
return decrypted;
});

View File

@ -71,6 +71,7 @@ var SAVE_TYPE_COMPLETE_ALL = 3;
var clientStatsD = statsDClient.getClient();
var redisKeyShutdown = cfgRedisPrefix + constants.REDIS_KEY_SHUTDOWN;
let hasPasswordCol = false;//stub on upgradev630.sql update failure
const retryHttpStatus = new MultiRange(cfgCallbackBackoffOptions.httpStatus);
@ -136,7 +137,7 @@ function* getOutputData(cmd, outputData, key, optConn, optAdditionalOutput, opt_
status = row.status;
statusInfo = row.status_info;
password = row.password;
creationDate = row.creation_date.getTime();
creationDate = row.created_at && row.created_at.getTime();
}
switch (status) {
case taskResult.FileStatus.SaveVersion:
@ -189,7 +190,7 @@ function* getOutputData(cmd, outputData, key, optConn, optAdditionalOutput, opt_
let userPassword;
let decryptedPassword;
let isCorrectPassword;
if (encryptedUserPassword) {
if (password && encryptedUserPassword) {
decryptedPassword = yield utils.decryptPassword(password);
userPassword = yield utils.decryptPassword(encryptedUserPassword);
isCorrectPassword = decryptedPassword === userPassword;
@ -287,7 +288,7 @@ function getSaveTask(cmd) {
//}
return queueData;
}
function getUpdateResponse(cmd) {
function* getUpdateResponse(cmd) {
var updateTask = new taskResult.TaskResultData();
updateTask.key = cmd.getSaveKey() ? cmd.getSaveKey() : cmd.getDocId();
var statusInfo = cmd.getStatusInfo();
@ -295,7 +296,13 @@ function getUpdateResponse(cmd) {
updateTask.status = taskResult.FileStatus.Ok;
let password = cmd.getPassword();
if (password) {
updateTask.password = password;
if (false === hasPasswordCol) {
let selectRes = yield taskResult.select(updateTask.key);
hasPasswordCol = selectRes.length > 0 && undefined !== selectRes[0].password;
}
if(hasPasswordCol) {
updateTask.password = password;
}
}
} else if (constants.CONVERT_DOWNLOAD == statusInfo) {
updateTask.status = taskResult.FileStatus.ErrToReload;
@ -688,12 +695,13 @@ function* commandSetPassword(conn, cmd, outputData) {
let selectRes = yield taskResult.select(cmd.getDocId());
if (selectRes.length > 0) {
let row = selectRes[0];
hasPasswordCol = undefined !== row.password;
if (taskResult.FileStatus.Ok === row.status && row.password) {
hasDocumentPassword = true;
}
}
logger.debug('commandSetPassword isEnterCorrectPassword=%s, hasDocumentPassword=%s: docId = %s', conn.isEnterCorrectPassword, hasDocumentPassword, cmd.getDocId());
if (conn.isEnterCorrectPassword || !hasDocumentPassword) {
logger.debug('commandSetPassword isEnterCorrectPassword=%s, hasDocumentPassword=%s, hasPasswordCol=%s: docId = %s', conn.isEnterCorrectPassword, hasDocumentPassword, hasPasswordCol, cmd.getDocId());
if ((conn.isEnterCorrectPassword || !hasDocumentPassword) && hasPasswordCol) {
let updateMask = new taskResult.TaskResultData();
updateMask.key = cmd.getDocId();
updateMask.status = taskResult.FileStatus.Ok;
@ -1297,7 +1305,7 @@ exports.receiveTask = function(data, ack) {
var cmd = task.getCmd();
docId = cmd.getDocId();
logger.debug('Start receiveTask: docId = %s %s', docId, data);
var updateTask = getUpdateResponse(cmd);
var updateTask = yield* getUpdateResponse(cmd);
var updateRes = yield taskResult.update(updateTask);
if (updateRes.affectedRows > 0) {
var outputData = new OutputData(cmd.getCommand());

View File

@ -97,24 +97,21 @@ exports.upsert = function(task, opt_updateUserIndex) {
let p2 = addSqlParam(task.status, values);
let p3 = addSqlParam(task.statusInfo, values);
let p4 = addSqlParam(dateNow, values);
let p5 = addSqlParam(dateNow, values);
let p6 = addSqlParam(task.userIndex, values);
let p7 = addSqlParam(task.changeId, values);
let p8 = addSqlParam(cbInsert, values);
let p9 = addSqlParam(task.baseurl, values);
let p10 = addSqlParam(task.password, values);
let p11 = addSqlParam(task.additionalParams, values);
let pDate = addSqlParam(dateNow, values);
var sqlCommand = 'INSERT INTO task_result (id, status, status_info, creation_date, last_open_date, user_index, change_id, callback, baseurl, password, additional_params)'+
` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9}, ${p10}, ${p11}) ON DUPLICATE KEY UPDATE` +
` last_open_date = ${pDate}`;
let p5 = addSqlParam(task.userIndex, values);
let p6 = addSqlParam(task.changeId, values);
let p7 = addSqlParam(cbInsert, values);
let p8 = addSqlParam(task.baseurl, values);
let p9 = addSqlParam(dateNow, values);
var sqlCommand = 'INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl)'+
` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}) ON DUPLICATE KEY UPDATE` +
` last_open_date = ${p9}`;
if (task.callback) {
let pCallback = addSqlParam(JSON.stringify(task.callback), values);
sqlCommand += `, callback = CONCAT(callback , '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' , (user_index + 1) , ',"callback":', ${pCallback}, '}')`;
let p10 = addSqlParam(JSON.stringify(task.callback), values);
sqlCommand += `, callback = CONCAT(callback , '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' , (user_index + 1) , ',"callback":', ${p10}, '}')`;
}
if (task.baseurl) {
let pBaseurl = addSqlParam(task.baseurl, values);
sqlCommand += `, baseurl = ${pBaseurl}`;
let p11 = addSqlParam(task.baseurl, values);
sqlCommand += `, baseurl = ${p11}`;
}
if (opt_updateUserIndex) {
sqlCommand += ', user_index = LAST_INSERT_ID(user_index + 1)';

View File

@ -114,27 +114,24 @@ function getUpsertString(task, values) {
let p2 = addSqlParam(task.status, values);
let p3 = addSqlParam(task.statusInfo, values);
let p4 = addSqlParam(dateNow, values);
let p5 = addSqlParam(dateNow, values);
let p6 = addSqlParam(task.userIndex, values);
let p7 = addSqlParam(task.changeId, values);
let p8 = addSqlParam(cbInsert, values);
let p9 = addSqlParam(task.baseurl, values);
let p10 = addSqlParam(task.password, values);
let p11 = addSqlParam(task.additionalParams, values);
let p5 = addSqlParam(task.userIndex, values);
let p6 = addSqlParam(task.changeId, values);
let p7 = addSqlParam(cbInsert, values);
let p8 = addSqlParam(task.baseurl, values);
if (isSupportOnConflict) {
let pDate = addSqlParam(dateNow, values);
let p9 = addSqlParam(dateNow, values);
//http://stackoverflow.com/questions/34762732/how-to-find-out-if-an-upsert-was-an-update-with-postgresql-9-5-upsert
let sqlCommand = "INSERT INTO task_result (id, status, status_info, creation_date, last_open_date, user_index, change_id, callback, baseurl, password, additional_params)";
sqlCommand += ` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9}, ${p10}, ${p11})`;
sqlCommand += ` ON CONFLICT (id) DO UPDATE SET last_open_date = ${pDate}`;
let sqlCommand = "INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl)";
sqlCommand += ` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8})`;
sqlCommand += ` ON CONFLICT (id) DO UPDATE SET last_open_date = ${p9}`;
if (task.callback) {
let pCallback = addSqlParam(JSON.stringify(task.callback), values);
let p10 = addSqlParam(JSON.stringify(task.callback), values);
sqlCommand += `, callback = task_result.callback || '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' `;
sqlCommand += ` || (task_result.user_index + 1)::text || ',"callback":' || ${pCallback}::text || '}'`;
sqlCommand += ` || (task_result.user_index + 1)::text || ',"callback":' || ${p10}::text || '}'`;
}
if (task.baseurl) {
let pBaseurl = addSqlParam(task.baseurl, values);
sqlCommand += `, baseurl = ${pBaseurl}`;
let p11 = addSqlParam(task.baseurl, values);
sqlCommand += `, baseurl = ${p11}`;
}
sqlCommand += ", user_index = task_result.user_index + 1 RETURNING user_index as userindex;";
return sqlCommand;

View File

@ -66,7 +66,6 @@ function TaskResultData() {
this.callback = null;
this.baseurl = null;
this.password = null;
this.additionalParams = null;
}
TaskResultData.prototype.completeDefaults = function() {
if (!this.key) {
@ -96,12 +95,6 @@ TaskResultData.prototype.completeDefaults = function() {
if (!this.baseurl) {
this.baseurl = '';
}
if (!this.password) {
this.password = '';
}
if (!this.additionalParams) {
this.additionalParams = '';
}
};
function upsert(task, opt_updateUserIndex) {
@ -214,15 +207,12 @@ function addRandomKey(task, opt_prefix, opt_size) {
let p2 = addSqlParam(task.status, values);
let p3 = addSqlParam(task.statusInfo, values);
let p4 = addSqlParam(new Date(), values);
let p5 = addSqlParam(new Date(), values);
let p6 = addSqlParam(task.userIndex, values);
let p7 = addSqlParam(task.changeId, values);
let p8 = addSqlParam(task.callback, values);
let p9 = addSqlParam(task.baseurl, values);
let p10 = addSqlParam(task.password, values);
let p11 = addSqlParam(task.additionalParams, values);
let sqlCommand = 'INSERT INTO task_result (id, status, status_info, creation_date, last_open_date, user_index, change_id, callback, baseurl, password, additional_params)' +
` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9}, ${p10}, ${p11});`;
let p5 = addSqlParam(task.userIndex, values);
let p6 = addSqlParam(task.changeId, values);
let p7 = addSqlParam(task.callback, values);
let p8 = addSqlParam(task.baseurl, values);
let sqlCommand = 'INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl)' +
` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8});`;
sqlBase.baseConnector.sqlQuery(sqlCommand, function(error, result) {
if (error) {
reject(error);

View File

@ -51,14 +51,13 @@ CREATE TABLE IF NOT EXISTS `task_result` (
`id` varchar(255) NOT NULL,
`status` tinyint(3) NOT NULL,
`status_info` int(10) NOT NULL,
`creation_date` datetime NOT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`last_open_date` datetime NOT NULL,
`user_index` int(10) unsigned NOT NULL DEFAULT 1,
`change_id` int(10) unsigned NOT NULL DEFAULT 0,
`callback` longtext NOT NULL,
`baseurl` text NOT NULL,
`password` longtext NOT NULL,
`additional_params` longtext NOT NULL,
`password` longtext NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@ -0,0 +1,21 @@
DELIMITER DLM00
DROP PROCEDURE IF EXISTS upgrade630 DLM00
CREATE PROCEDURE upgrade630()
BEGIN
IF (SELECT DATA_TYPE FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'task_result' AND COLUMN_NAME = 'callback') <> 'longtext' THEN
ALTER TABLE `task_result` CHANGE COLUMN `callback` `callback` LONGTEXT NOT NULL ;
END IF;
IF NOT EXISTS(SELECT * FROM information_schema.`COLUMNS` WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'task_result' AND COLUMN_NAME = 'created_at') THEN
ALTER TABLE `task_result` ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `status_info`;
ALTER TABLE `task_result` ADD COLUMN `password` LONGTEXT NULL AFTER `baseurl`;
END IF;
END DLM00
CALL upgrade630() DLM00
DELIMITER ;

View File

@ -26,14 +26,13 @@ CREATE TABLE IF NOT EXISTS "public"."task_result" (
"id" varchar(255) COLLATE "default" NOT NULL,
"status" int2 NOT NULL,
"status_info" int4 NOT NULL,
"creation_date" timestamp without time zone NOT NULL,
"created_at" timestamp without time zone DEFAULT NOW(),
"last_open_date" timestamp without time zone NOT NULL,
"user_index" int4 NOT NULL DEFAULT 1,
"change_id" int4 NOT NULL DEFAULT 0,
"callback" text COLLATE "default" NOT NULL,
"baseurl" text COLLATE "default" NOT NULL,
"password" text COLLATE "default" NOT NULL,
"additional_params" text COLLATE "default" NOT NULL,
"password" text COLLATE "default" NULL,
PRIMARY KEY ("id")
)
WITH (OIDS=FALSE);

View File

@ -0,0 +1,15 @@
DO $$
BEGIN
BEGIN
ALTER TABLE "task_result" ADD COLUMN "created_at" timestamp without time zone DEFAULT NOW();
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'column created_at already exists.';
END;
BEGIN
ALTER TABLE "task_result" ADD COLUMN "password" text;
EXCEPTION
WHEN duplicate_column THEN RAISE NOTICE 'column password already exists.';
END;
END;
$$