diff --git a/DocService/npm-shrinkwrap.json b/DocService/npm-shrinkwrap.json index 08ca6176..418cc6bf 100644 --- a/DocService/npm-shrinkwrap.json +++ b/DocService/npm-shrinkwrap.json @@ -18,6 +18,17 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, "base64-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz", @@ -28,6 +39,11 @@ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-4.1.0.tgz", "integrity": "sha512-eJzYkFYy9L4JzXsbymsFn3p54D+llV27oTQ+ziJG7WFRheJcNZilgVXMG0LoZtlQSKBsJdWtLFqOD0u+U0jZKA==" }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, "body-parser": { "version": "1.18.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", @@ -287,6 +303,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, "http-errors": { "version": "1.6.3", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -311,6 +332,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", @@ -437,6 +463,11 @@ "mime-db": "~1.37.0" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", @@ -506,6 +537,19 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-localstorage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -514,6 +558,16 @@ "ee-first": "1.1.1" } }, + "openpgp": { + "version": "4.10.8", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.8.tgz", + "integrity": "sha512-l+/u3TyR3+qS7mN0+HoNQRu/2BzHdLOMOOCDRLDE9gZGAqpKkD9ZD7hkpjan+GGY3f0nHaE7Qv7kI6qmQK+AkA==", + "requires": { + "asn1.js": "^5.0.0", + "node-fetch": "^2.1.2", + "node-localstorage": "~1.3.0" + } + }, "packet-reader": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz", @@ -761,6 +815,11 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "sockjs": { "version": "0.3.19", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", @@ -872,6 +931,16 @@ "resolved": "https://registry.npmjs.org/windows-locale/-/windows-locale-1.0.1.tgz", "integrity": "sha512-X8B22Cg9njwV4h3C5j28xmZ2eWaO69j63WhReeglB69LOT3LoqSO4Vb6TTVSfFikh4KQ9qBOJb6+WvR4tVLTfQ==" }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/DocService/package.json b/DocService/package.json index dbef3527..610370d6 100644 --- a/DocService/package.json +++ b/DocService/package.json @@ -25,6 +25,7 @@ "multi-integer-range": "^4.0.7", "multiparty": "^4.2.1", "mysql": "^2.16.0", + "openpgp": "^4.10.8", "pg": "^7.6.0", "redis": "^2.8.0", "retry": "^0.12.0", diff --git a/DocService/sources/DocsCoServer.js b/DocService/sources/DocsCoServer.js index bd209ea1..960c1d26 100644 --- a/DocService/sources/DocsCoServer.js +++ b/DocService/sources/DocsCoServer.js @@ -1147,6 +1147,7 @@ exports.install = function(server, callbackFunction) { conn.close(constants.ACCESS_DENIED_CODE, constants.ACCESS_DENIED_REASON); return; } + yield* encryptPasswordParams(data); switch (data.type) { case 'auth' : yield* auth(conn, data); @@ -1862,6 +1863,18 @@ exports.install = function(server, callbackFunction) { return jwt.sign(payload, secret, options); } + function* encryptPasswordParams(data) { + let dataWithPassword; + if (data.type === 'openDocument' && data.message) { + dataWithPassword = data.message; + } else if (data.type === 'auth' && data.openCmd) { + dataWithPassword = data.openCmd; + } + if (dataWithPassword && dataWithPassword.password) { + dataWithPassword.password = yield canvasService.encryptPassword(dataWithPassword.password); + } + } + function* auth(conn, data) { //TODO: Do authorization etc. check md5 or query db if (data.token && data.user) { diff --git a/DocService/sources/canvasservice.js b/DocService/sources/canvasservice.js index 865e1c00..d289daa3 100644 --- a/DocService/sources/canvasservice.js +++ b/DocService/sources/canvasservice.js @@ -127,8 +127,19 @@ OutputData.prototype = { this['data'] = data; } }; - -function* getOutputData(cmd, outputData, key, status, statusInfo, optConn, optAdditionalOutput, opt_bIsRestore) { +let encryptPassword = co.wrap(function* (password) { + console.log(`encryptPassword:${password}:${new Error().stack}`); + const openpgp = require('openpgp'); + const { data: encrypted } = yield openpgp.encrypt({message: openpgp.message.fromText(password), passwords: ['secret stuff']}); + return encrypted; +}); +let decryptPassword = co.wrap(function* (password) { + const openpgp = require('openpgp'); + const message = yield openpgp.message.readArmored(password); + const { data: decrypted } = yield openpgp.decrypt({message: message, passwords: ['secret stuff']}); + return decrypted; +}); +function* getOutputData(cmd, outputData, key, status, statusInfo, password, optConn, optAdditionalOutput, opt_bIsRestore) { var docId = cmd.getDocId(); switch (status) { case taskResult.FileStatus.SaveVersion: @@ -177,7 +188,23 @@ function* getOutputData(cmd, outputData, key, status, statusInfo, optConn, optAd optAdditionalOutput.needUrlType = commonDefines.c_oAscUrlTypes.Temporary; } } else { - if (optConn) { + let encryptedUserPassword = cmd.getPassword(); + let userPassword; + let decryptedPassword; + if (encryptedUserPassword) { + decryptedPassword = yield decryptPassword(password); + userPassword = yield decryptPassword(encryptedUserPassword); + } + logger.debug("checkPassword password: %s===%s docId = %s", decryptedPassword, userPassword, docId); + if(password && !(encryptedUserPassword && decryptedPassword === userPassword)) { + if(encryptedUserPassword) { + outputData.setStatus('needpassword'); + outputData.setData(constants.CONVERT_PASSWORD); + } else { + outputData.setStatus('needpassword'); + outputData.setData(constants.CONVERT_DRM); + } + } else if (optConn) { outputData.setData(yield storage.getSignedUrls(optConn.baseUrl, key, commonDefines.c_oAscUrlTypes.Session)); } else if (optAdditionalOutput) { optAdditionalOutput.needUrlKey = key; @@ -238,6 +265,7 @@ function* saveParts(cmd, filename) { } return result; } + function getSaveTask(cmd) { cmd.setData(null); var queueData = new commonDefines.TaskQueueData(); @@ -258,18 +286,20 @@ function getUpdateResponse(cmd) { var statusInfo = cmd.getStatusInfo(); if (constants.NO_ERROR == statusInfo) { updateTask.status = taskResult.FileStatus.Ok; + let password = cmd.getPassword(); + if (password) { + updateTask.password = password; + } } else if (constants.CONVERT_DOWNLOAD == statusInfo) { updateTask.status = taskResult.FileStatus.ErrToReload; } else if (constants.CONVERT_NEED_PARAMS == statusInfo) { updateTask.status = taskResult.FileStatus.NeedParams; - } else if (constants.CONVERT_DRM == statusInfo) { + } else if (constants.CONVERT_DRM == statusInfo || constants.CONVERT_PASSWORD == statusInfo) { if (cfgOpenProtectedFile) { - updateTask.status = taskResult.FileStatus.NeedPassword; + updateTask.status = taskResult.FileStatus.NeedPassword; } else { updateTask.status = taskResult.FileStatus.Err; } - } else if (constants.CONVERT_PASSWORD == statusInfo) { - updateTask.status = taskResult.FileStatus.NeedPassword; } else if (constants.CONVERT_DEAD_LETTER == statusInfo) { updateTask.status = taskResult.FileStatus.ErrToReload; } else { @@ -369,40 +399,53 @@ function* commandOpenFillOutput(conn, cmd, outputData, opt_bIsRestore) { if (taskResult.FileStatus.None === row.status) { needAddTask = true; } else { - yield* getOutputData(cmd, outputData, cmd.getDocId(), row.status, row.status_info, conn, undefined, opt_bIsRestore); + yield* getOutputData(cmd, outputData, cmd.getDocId(), row.status, row.status_info, row.password, conn, undefined, opt_bIsRestore); } } return needAddTask; } -function* commandReopen(cmd) { +function* commandReopen(conn, cmd, outputData) { let res = true; let isPassword = undefined !== cmd.getPassword(); + if(isPassword) { + let selectRes = yield taskResult.select(cmd.getDocId()); + if (selectRes.length > 0) { + let row = selectRes[0]; + if (row.password) { + yield* commandOpenFillOutput(conn, cmd, outputData, false); + return res; + } + } + } if (!isPassword || cfgOpenProtectedFile) { - let updateMask = new taskResult.TaskResultData(); - updateMask.key = cmd.getDocId(); + let updateMask = new taskResult.TaskResultData(); + updateMask.key = cmd.getDocId(); updateMask.status = isPassword ? taskResult.FileStatus.NeedPassword : taskResult.FileStatus.NeedParams; - var task = new taskResult.TaskResultData(); - task.key = cmd.getDocId(); - task.status = taskResult.FileStatus.WaitQueue; - task.statusInfo = constants.NO_ERROR; + var task = new taskResult.TaskResultData(); + task.key = cmd.getDocId(); + task.status = taskResult.FileStatus.WaitQueue; + task.statusInfo = constants.NO_ERROR; - var upsertRes = yield taskResult.updateIf(task, updateMask); - if (upsertRes.affectedRows > 0) { - //add task - cmd.setUrl(null);//url may expire - cmd.setSaveKey(cmd.getDocId()); - cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); - cmd.setEmbeddedFonts(false); - var dataQueue = new commonDefines.TaskQueueData(); - dataQueue.setCmd(cmd); - dataQueue.setToFile('Editor.bin'); - dataQueue.setFromSettings(true); - yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); - } + var upsertRes = yield taskResult.updateIf(task, updateMask); + if (upsertRes.affectedRows > 0) { + //add task + cmd.setUrl(null);//url may expire + cmd.setSaveKey(cmd.getDocId()); + cmd.setOutputFormat(constants.AVS_OFFICESTUDIO_FILE_CANVAS); + cmd.setEmbeddedFonts(false); + // if (isPassword) { + // cmd.setUserConnectionId(opt_userConnectionId); + // } + var dataQueue = new commonDefines.TaskQueueData(); + dataQueue.setCmd(cmd); + dataQueue.setToFile('Editor.bin'); + dataQueue.setFromSettings(true); + yield* docsCoServer.addTask(dataQueue, constants.QUEUE_PRIORITY_HIGH); + } } else { res = false; -} + } return res; } function* commandSave(cmd, outputData) { @@ -953,6 +996,12 @@ function* commandSendMMCallback(cmd) { } logger.debug('End commandSendMMCallback: docId = %s', docId); } +function* commandOpenReopenCallback(cmd, updateTask, outputData, additionalOutput) { + let password = cmd.getPassword(); + if (password) { + updateTask.password = password; + } +} exports.openDocument = function(conn, cmd, opt_upsertRes, opt_bIsRestore) { return co(function* () { @@ -971,7 +1020,7 @@ exports.openDocument = function(conn, cmd, opt_upsertRes, opt_bIsRestore) { yield* commandOpen(conn, cmd, outputData, opt_upsertRes, opt_bIsRestore); break; case 'reopen': - res = yield* commandReopen(cmd); + res = yield* commandReopen(conn, cmd, outputData); break; case 'imgurls': yield* commandImgurls(conn, cmd, outputData); @@ -1210,13 +1259,15 @@ exports.receiveTask = function(data, ack) { var outputData = new OutputData(cmd.getCommand()); var command = cmd.getCommand(); var additionalOutput = {needUrlKey: null, needUrlMethod: null, needUrlType: null}; - if ('open' == command || 'reopen' == command) { - //yield utils.sleep(5000); + if ('open' == command) { yield* getOutputData(cmd, outputData, cmd.getDocId(), updateTask.status, - updateTask.statusInfo, null, additionalOutput); + updateTask.statusInfo, updateTask.password, null, additionalOutput); + } else if ('reopen' == command) { + yield* getOutputData(cmd, outputData, cmd.getDocId(), updateTask.status, + updateTask.statusInfo, updateTask.password, null, additionalOutput); } else if ('save' == command || 'savefromorigin' == command || 'sfct' == command) { yield* getOutputData(cmd, outputData, cmd.getSaveKey(), updateTask.status, - updateTask.statusInfo, null, additionalOutput); + updateTask.statusInfo, updateTask.password, null, additionalOutput); } else if ('sfcm' == command) { yield* commandSfcCallback(cmd, true); } else if ('sfc' == command) { @@ -1247,6 +1298,7 @@ exports.receiveTask = function(data, ack) { }); }; +exports.encryptPassword = encryptPassword; exports.cleanupCache = cleanupCache; exports.commandSfctByCmd = commandSfctByCmd; exports.commandOpenStartPromise = commandOpenStartPromise; diff --git a/DocService/sources/converterservice.js b/DocService/sources/converterservice.js index 5111e227..1a80ab7d 100644 --- a/DocService/sources/converterservice.js +++ b/DocService/sources/converterservice.js @@ -224,7 +224,10 @@ function convertRequest(req, res, isJson) { if (params.spreadsheetLayout) { cmd.setJsonParams(JSON.stringify({'spreadsheetLayout': params.spreadsheetLayout})); } - cmd.setPassword(params.password); + if (params.password) { + let encryptedPassword = yield canvasService.encryptPassword(params.password); + cmd.setPassword(encryptedPassword); + } cmd.setWithAuthorization(true); var thumbnail = params.thumbnail; if (thumbnail) { diff --git a/DocService/sources/mySqlBaseConnector.js b/DocService/sources/mySqlBaseConnector.js index 1c04fd7d..231fc691 100644 --- a/DocService/sources/mySqlBaseConnector.js +++ b/DocService/sources/mySqlBaseConnector.js @@ -101,17 +101,18 @@ exports.upsert = function(task, opt_updateUserIndex) { 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}`; + let p9 = addSqlParam(task.password, values); + let pDate = addSqlParam(dateNow, values); + var sqlCommand = 'INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl, password)'+ + ` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9}) ON DUPLICATE KEY UPDATE` + + ` last_open_date = ${pDate}`; if (task.callback) { - let p10 = addSqlParam(JSON.stringify(task.callback), values); - sqlCommand += `, callback = CONCAT(callback , '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' , (user_index + 1) , ',"callback":', ${p10}, '}')`; + let pCallback = addSqlParam(JSON.stringify(task.callback), values); + sqlCommand += `, callback = CONCAT(callback , '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' , (user_index + 1) , ',"callback":', ${pCallback}, '}')`; } if (task.baseurl) { - let p11 = addSqlParam(task.baseurl, values); - sqlCommand += `, baseurl = ${p11}`; + let pBaseurl = addSqlParam(task.baseurl, values); + sqlCommand += `, baseurl = ${pBaseurl}`; } if (opt_updateUserIndex) { sqlCommand += ', user_index = LAST_INSERT_ID(user_index + 1)'; diff --git a/DocService/sources/postgreSqlBaseConnector.js b/DocService/sources/postgreSqlBaseConnector.js index 0c54b5d0..bcb1d654 100644 --- a/DocService/sources/postgreSqlBaseConnector.js +++ b/DocService/sources/postgreSqlBaseConnector.js @@ -118,20 +118,21 @@ function getUpsertString(task, values) { let p6 = addSqlParam(task.changeId, values); let p7 = addSqlParam(cbInsert, values); let p8 = addSqlParam(task.baseurl, values); + let p9 = addSqlParam(task.password, values); if (isSupportOnConflict) { - let p9 = addSqlParam(dateNow, values); + let pDate = 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, 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}`; + let sqlCommand = "INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl, password)"; + sqlCommand += ` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9})`; + sqlCommand += ` ON CONFLICT (id) DO UPDATE SET last_open_date = ${pDate}`; if (task.callback) { - let p10 = addSqlParam(JSON.stringify(task.callback), values); + let pCallback = addSqlParam(JSON.stringify(task.callback), values); sqlCommand += `, callback = task_result.callback || '${sqlBase.UserCallback.prototype.delimiter}{"userIndex":' `; - sqlCommand += ` || (task_result.user_index + 1)::text || ',"callback":' || ${p10}::text || '}'`; + sqlCommand += ` || (task_result.user_index + 1)::text || ',"callback":' || ${pCallback}::text || '}'`; } if (task.baseurl) { - let p11 = addSqlParam(task.baseurl, values); - sqlCommand += `, baseurl = ${p11}`; + let pBaseurl = addSqlParam(task.baseurl, values); + sqlCommand += `, baseurl = ${pBaseurl}`; } sqlCommand += ", user_index = task_result.user_index + 1 RETURNING user_index as userindex;"; return sqlCommand; diff --git a/DocService/sources/taskresult.js b/DocService/sources/taskresult.js index f1386767..c6df9381 100644 --- a/DocService/sources/taskresult.js +++ b/DocService/sources/taskresult.js @@ -64,6 +64,7 @@ function TaskResultData() { this.changeId = null; this.callback = null; this.baseurl = null; + this.password = null; } TaskResultData.prototype.completeDefaults = function() { if (!this.key) { @@ -90,6 +91,9 @@ TaskResultData.prototype.completeDefaults = function() { if (!this.baseurl) { this.baseurl = ''; } + if (!this.password) { + this.password = ''; + } }; function upsert(task, opt_updateUserIndex) { @@ -146,6 +150,10 @@ function toUpdateArray(task, updateTime, isMask, values) { let sqlParam = addSqlParam(task.baseurl, values); res.push(`baseurl=${sqlParam}`); } + if (null != task.password) { + let sqlParam = addSqlParam(task.password, values); + res.push(`password=${sqlParam}`); + } return res; } @@ -202,8 +210,9 @@ function addRandomKey(task, opt_prefix, opt_size) { 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});`; + let p9 = addSqlParam(task.password, values); + let sqlCommand = 'INSERT INTO task_result (id, status, status_info, last_open_date, user_index, change_id, callback, baseurl, password)' + + ` VALUES (${p1}, ${p2}, ${p3}, ${p4}, ${p5}, ${p6}, ${p7}, ${p8}, ${p9});`; sqlBase.baseConnector.sqlQuery(sqlCommand, function(error, result) { if (error) { reject(error); diff --git a/FileConverter/npm-shrinkwrap.json b/FileConverter/npm-shrinkwrap.json index 9fca47e2..ca124551 100644 --- a/FileConverter/npm-shrinkwrap.json +++ b/FileConverter/npm-shrinkwrap.json @@ -12,6 +12,22 @@ "cross-spawn": "^5.1.0" } }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==" + }, "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", @@ -40,6 +56,21 @@ "which": "^1.2.9" } }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -62,16 +93,49 @@ "yallist": "^2.1.2" } }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-localstorage": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-1.3.1.tgz", + "integrity": "sha512-NMWCSWWc6JbHT5PyWlNT2i8r7PgGYXVntmKawY83k/M0UJScZ5jirb61TLnqKwd815DfBQu+lR3sRw08SPzIaQ==", + "requires": { + "write-file-atomic": "^1.1.4" + } + }, + "openpgp": { + "version": "4.10.8", + "resolved": "https://registry.npmjs.org/openpgp/-/openpgp-4.10.8.tgz", + "integrity": "sha512-l+/u3TyR3+qS7mN0+HoNQRu/2BzHdLOMOOCDRLDE9gZGAqpKkD9ZD7hkpjan+GGY3f0nHaE7Qv7kI6qmQK+AkA==", + "requires": { + "asn1.js": "^5.0.0", + "node-fetch": "^2.1.2", + "node-localstorage": "~1.3.0" + } + }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -85,6 +149,11 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -93,6 +162,16 @@ "isexe": "^2.0.0" } }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", diff --git a/FileConverter/package.json b/FileConverter/package.json index 7e53f027..24f0d5e2 100644 --- a/FileConverter/package.json +++ b/FileConverter/package.json @@ -8,7 +8,8 @@ "@expo/spawn-async": "^1.3.0", "bytes": "^3.0.0", "co": "^4.6.0", - "config": "^2.0.1" + "config": "^2.0.1", + "openpgp": "^4.10.8" }, "pkg": { "scripts": [ diff --git a/FileConverter/sources/converter.js b/FileConverter/sources/converter.js index 8b3f00f0..084c0c14 100644 --- a/FileConverter/sources/converter.js +++ b/FileConverter/sources/converter.js @@ -86,6 +86,13 @@ var exitCodesUpload = [constants.NO_ERROR, constants.CONVERT_CORRUPTED, constant constants.CONVERT_DRM]; let inputLimitsXmlCache; +function* decryptPassword(password){ + const openpgp = require('openpgp'); + const message = yield openpgp.message.readArmored(password); + const { data: decrypted } = yield openpgp.decrypt({message: message, passwords: ['secret stuff']}); + return decrypted +} + function TaskQueueDataConvert(task) { var cmd = task.getCmd(); this.key = cmd.savekey ? cmd.savekey : cmd.id; @@ -149,13 +156,20 @@ TaskQueueDataConvert.prototype = { xml += this.serializeLimit(); xml += ''; fs.writeFileSync(fsPath, xml, {encoding: 'utf8'}); - let hiddenXml; - if (undefined !== this.password) { - hiddenXml = ''; - hiddenXml += this.serializeXmlProp('m_sPassword', this.password); - hiddenXml += ''; - } - return hiddenXml; + }, + serializeHidden: function() { + var t = this; + return co(function* () { + let xml; + if (undefined !== t.password) { + let password = yield* decryptPassword(t.password); + console.log(`password:${password}`); + xml = ''; + xml += t.serializeXmlProp('m_sPassword', password); + xml += ''; + } + return xml; + }); }, serializeMailMerge: function(data) { var xml = ''; @@ -650,8 +664,10 @@ function* ExecuteTask(task) { if (!isBuilder) { processPath = cfgX2tPath; let paramsFile = path.join(tempDirs.temp, 'params.xml'); - let hiddenXml = dataConvert.serialize(paramsFile); + dataConvert.serialize(paramsFile); childArgs.push(paramsFile); + let hiddenXml = yield dataConvert.serializeHidden(); + console.log(`hiddenXml:${hiddenXml}`); if (hiddenXml) { childArgs.push(hiddenXml); }