mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-02-10 18:05:07 +08:00
[feature] Add upgrade scripts; Remove additional_params column
This commit is contained in:
committed by
Sergey Konovalov
parent
8904a33e59
commit
76397294a3
@ -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"]
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@ -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;
|
||||
});
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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)';
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
21
schema/mysql/upgrade/upgradev630.sql
Normal file
21
schema/mysql/upgrade/upgradev630.sql
Normal 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 ;
|
||||
@ -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);
|
||||
|
||||
15
schema/postgresql/upgrade/upgradev630.sql
Normal file
15
schema/postgresql/upgrade/upgradev630.sql
Normal 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;
|
||||
$$
|
||||
Reference in New Issue
Block a user