mirror of
https://github.com/ONLYOFFICE/server.git
synced 2026-02-10 18:05:07 +08:00
[bug] Refactor wopi discovery for new pdf editor; Fix downloadFile for editnew action; For bug 67135
This commit is contained in:
@ -86,11 +86,13 @@
|
||||
"favIconUrlWord" : "/web-apps/apps/documenteditor/main/resources/img/favicon.ico",
|
||||
"favIconUrlCell" : "/web-apps/apps/spreadsheeteditor/main/resources/img/favicon.ico",
|
||||
"favIconUrlSlide" : "/web-apps/apps/presentationeditor/main/resources/img/favicon.ico",
|
||||
"favIconUrlPdf" : "/web-apps/apps/pdfeditor/main/resources/img/favicon.ico",
|
||||
"fileInfoBlockList" : ["FileUrl"],
|
||||
"pdfView": ["pdf", "djvu", "xps", "oxps"],
|
||||
"wordView": ["doc", "dotx", "dotm", "dot", "fodt", "ott", "rtf", "mht", "mhtml", "html", "htm", "xml", "epub", "fb2", "sxw", "stw", "wps", "wpt", "oform"],
|
||||
"wordEdit": ["docx", "docm", "docxf", "odt", "txt"],
|
||||
"wordForm": ["pdf"],
|
||||
"pdfView": ["djvu", "xps", "oxps"],
|
||||
"pdfEdit": ["pdf"],
|
||||
"forms": ["pdf"],
|
||||
"wordView": ["doc", "dotx", "dotm", "dot", "fodt", "ott", "rtf", "mht", "mhtml", "html", "htm", "xml", "epub", "fb2", "sxw", "stw", "wps", "wpt", "docxf", "oform"],
|
||||
"wordEdit": ["docx", "docm", "odt", "txt"],
|
||||
"cellView": ["xls", "xlsb", "xltx", "xltm", "xlt", "fods", "ots", "sxc", "xml", "et", "ett"],
|
||||
"cellEdit": ["xlsx", "xlsm", "ods", "csv"],
|
||||
"slideView": ["ppt", "ppsx", "ppsm", "pps", "potx", "potm", "pot", "fodp", "otp", "sxi", "dps", "dpt"],
|
||||
@ -105,7 +107,7 @@
|
||||
"privateKeyOld": "MIIEowIBAAKCAQEAqnro3nUUjvZK1i7UqeOlXmCrVPiDtHlRgIPReAjt2nKL1GG3SBXO6N0aPbiM5rtK0XRPUoLmKu2rYvSJ/Kmkdp14a/3uiEl788VVn0hb/l9OuQtH3HBjmM0/LKRgJQuU3LgHI67uRVZYtSJ/n9fYdZqnLfveLsrgZpgRCoabrp+H5Uem9N+x0OJR3LpToVRZhzSkYQrxnERJmF3bhR5yF8Zn+3BoSiUpVOCAvJRAYl8cAIs3BwQcTEyXJjnt+wW5Q1VyKr+bXp/39+tnugQeTe1jjdPy6rOTftQwzjro81oZpOMazwwR1aeQuQWCrmHQZqyV3Rvo6X3xYlOQnlo1/wIDAQABAoIBAQCKtUSBs8tNYrGTQTlBHXrwpkDg+u7WSZt5sEcfnkxA39BLtlHU8gGO0E9Ihr8GAL+oWjUsEltJ9GTtN8CJ9lFdPVS8sTiCZR/YQOggmFRZTJyVzMrkXgF7Uwwiu3+KxLiTOZx9eRhfDBlTD8W9fXaegX2i2Xp2ohUhBHthEBLdaZTWFi5Sid/Y0dDzBeP6UIJorZ5D+1ybaeIVHjndpwNsIEUGUxPFLrkeiU8Rm4MJ9ahxfywcP7DjQoPGY9Ge5cBhpxfzERWf732wUD6o3+L9tvOBU00CLVjULbGZKTVE2FJMyXK9jr6Zor9Mkhomp6/8Agkr9rp+TPyelFGYEz8hAoGBAOEc09CrL3eYBkhNEcaMQzxBLvOGpg8kaDX5SaArHfl9+U9yzRqss4ARECanp9HuHfjMQo7iejao0ngDjL7BNMSaH74QlSsPOY2iOm8Qvx8/zb7g4h9r1zLjFZb3mpSA4snRZvvdiZ9ugbuVPmhXnDzRRMg45MibJeeOTJNylofRAoGBAMHfF/WutqKDoX25qZo9m74W4bttOj6oIDk1N4/c6M1Z1v/aptYSE06bkWngj9P46kqjaay4hgMtzyGruc5aojPx5MHHf5bo14+Jv4NzYtR2llrUxO+UJX7aCfUYXI7RC93GUmhpeQ414j7SNAXec58d7e+ETw+6cHiAWO4uOSTPAoGATPq5qDLR4Zi4FUNdn8LZPyKfNqHF6YmupT5hIgd8kZO1jKiaYNPL8jBjkIRmjBBcaXcYD5p85nImvumf2J9jNxPpZOpwyC/Fo5xlVROp97qu1eY7DTmodntXJ6/2SXAlnZQhHmHsrPtyG752f+HtyJJbbgiem8cKWDu+DfHybfECgYBbSLo1WiBwgN4nHqZ3E48jgA6le5azLeKOTTpuKKwNFMIhEkj//t7MYn+jhLL0Mf3PSwZU50Vidc1To1IHkbFSGBGIFHFFEzl8QnXEZS4hr/y3o/teezj0c6HAn8nlDRUzRVBEDXWMdV6kCcGpCccTIrqHzpqTY0vV0UkOTQFnDQKBgAxSEhm/gtCYJIMCBe+KBJT9uECV5xDQopTTjsGOkd4306EN2dyPOIlAfwM6K/0qWisa0Ei5i8TbRRuBeTTdLEYLqXCJ7fj5tdD1begBdSVtHQ2WHqzPJSuImTkFi9NXxd1XUyZFM3y6YQvlssSuL7QSxUIEtZHnrJTt3QDd10dj",
|
||||
"refreshLockInterval": "10m",
|
||||
"dummy" : {
|
||||
"enable": true,
|
||||
"enable": false,
|
||||
"sampleFilePath": ""
|
||||
}
|
||||
},
|
||||
|
||||
@ -282,15 +282,11 @@ exports.FILE_STATUS_UPDATE_VERSION = 'updateversion';
|
||||
exports.ACTIVEMQ_QUEUE_PREFIX = 'queue://';
|
||||
exports.ACTIVEMQ_TOPIC_PREFIX = 'topic://';
|
||||
|
||||
exports.TEMPLATES_DEFAULT_LOCALE = 'en-US';
|
||||
exports.TEMPLATES_FOLDER_LOCALE_COLLISON_MAP = {
|
||||
'en': 'en-US',
|
||||
'pt': 'pt-BR',
|
||||
'zh': 'zh-CH',
|
||||
'pt-PT': 'pt-PT',
|
||||
'zh-TW': 'zh-TW'
|
||||
};
|
||||
exports.SUPPORTED_TEMPLATES_EXTENSIONS = {
|
||||
'Word': ['docx', 'docxf'],
|
||||
'Excel': ['xlsx'],
|
||||
'PowerPoint': ['pptx']
|
||||
};
|
||||
@ -2250,7 +2250,7 @@ exports.install = function(server, callbackFunction) {
|
||||
}
|
||||
if (decoded.queryParams) {
|
||||
let queryParams = decoded.queryParams;
|
||||
data.lang = queryParams.lang || queryParams.ui || "en-US";
|
||||
data.lang = queryParams.lang || queryParams.ui || constants.TEMPLATES_DEFAULT_LOCALE;
|
||||
}
|
||||
if (wopiClient.isWopiJwtToken(decoded)) {
|
||||
let fileInfo = decoded.fileInfo;
|
||||
|
||||
@ -53,6 +53,7 @@ var statsDClient = require('./../../Common/sources/statsdclient');
|
||||
var operationContext = require('./../../Common/sources/operationContext');
|
||||
var tenantManager = require('./../../Common/sources/tenantManager');
|
||||
var config = require('config');
|
||||
const path = require("path");
|
||||
|
||||
const cfgTypesUpload = config.get('services.CoAuthoring.utils.limits_image_types_upload');
|
||||
const cfgImageSize = config.get('services.CoAuthoring.server.limits_image_size');
|
||||
@ -70,6 +71,7 @@ const cfgAssemblyFormatAsOrigin = config.get('services.CoAuthoring.server.assemb
|
||||
const cfgDownloadMaxBytes = config.get('FileConverter.converter.maxDownloadBytes');
|
||||
const cfgDownloadTimeout = config.get('FileConverter.converter.downloadTimeout');
|
||||
const cfgDownloadFileAllowExt = config.get('services.CoAuthoring.server.downloadFileAllowExt');
|
||||
const cfgNewFileTemplate = config.get('services.CoAuthoring.server.newFileTemplate');
|
||||
|
||||
var SAVE_TYPE_PART_START = 0;
|
||||
var SAVE_TYPE_PART = 1;
|
||||
@ -1597,11 +1599,12 @@ exports.downloadFile = function(req, res) {
|
||||
const tenDownloadMaxBytes = ctx.getCfg('FileConverter.converter.maxDownloadBytes', cfgDownloadMaxBytes);
|
||||
const tenDownloadTimeout = ctx.getCfg('FileConverter.converter.downloadTimeout', cfgDownloadTimeout);
|
||||
const tenDownloadFileAllowExt = ctx.getCfg('services.CoAuthoring.server.downloadFileAllowExt', cfgDownloadFileAllowExt);
|
||||
const tenNewFileTemplate = ctx.getCfg('services.CoAuthoring.server.newFileTemplate', cfgNewFileTemplate);
|
||||
|
||||
let authorization;
|
||||
let isInJwtToken = false;
|
||||
let errorDescription;
|
||||
let headers;
|
||||
let headers, fromTemplate;
|
||||
let authRes = yield docsCoServer.getRequestParams(ctx, req);
|
||||
if (authRes.code === constants.NO_ERROR) {
|
||||
let decoded = authRes.params;
|
||||
@ -1615,14 +1618,19 @@ exports.downloadFile = function(req, res) {
|
||||
url = decoded.url;
|
||||
isInJwtToken = true;
|
||||
} else if (wopiClient.isWopiJwtToken(decoded)) {
|
||||
({url, headers} = wopiClient.getWopiFileUrl(ctx, decoded.fileInfo, decoded.userAuth));
|
||||
let filterStatus = yield wopiClient.checkIpFilter(ctx, url);
|
||||
if (0 === filterStatus) {
|
||||
//todo false? (true because it passed checkIpFilter for wopi)
|
||||
//todo use directIfIn
|
||||
isInJwtToken = true;
|
||||
if (decoded.fileInfo.Size === 0) {
|
||||
//editnew case
|
||||
fromTemplate = pathModule.extname(decoded.fileInfo.BaseFileName).substring(1);
|
||||
} else {
|
||||
errorDescription = 'access deny';
|
||||
({url, headers} = wopiClient.getWopiFileUrl(ctx, decoded.fileInfo, decoded.userAuth));
|
||||
let filterStatus = yield wopiClient.checkIpFilter(ctx, url);
|
||||
if (0 === filterStatus) {
|
||||
//todo false? (true because it passed checkIpFilter for wopi)
|
||||
//todo use directIfIn
|
||||
isInJwtToken = true;
|
||||
} else {
|
||||
errorDescription = 'access deny';
|
||||
}
|
||||
}
|
||||
} else if (!tenTokenEnableBrowser) {
|
||||
//todo token required
|
||||
@ -1641,26 +1649,33 @@ exports.downloadFile = function(req, res) {
|
||||
res.sendStatus(403);
|
||||
return;
|
||||
}
|
||||
if (utils.canIncludeOutboxAuthorization(ctx, url)) {
|
||||
let secret = yield tenantManager.getTenantSecret(ctx, commonDefines.c_oAscSecretType.Outbox);
|
||||
authorization = utils.fillJwtForRequest(ctx, {url: url}, secret, false);
|
||||
}
|
||||
let urlParsed = urlModule.parse(url);
|
||||
let filterStatus = yield* utils.checkHostFilter(ctx, urlParsed.hostname);
|
||||
if (0 !== filterStatus) {
|
||||
ctx.logger.warn('Error downloadFile checkIpFilter error: url = %s', url);
|
||||
res.sendStatus(filterStatus);
|
||||
return;
|
||||
}
|
||||
|
||||
if (req.get('Range')) {
|
||||
if (!headers) {
|
||||
headers = {};
|
||||
if (fromTemplate) {
|
||||
ctx.logger.debug('downloadFile from file template: %s', fromTemplate);
|
||||
let locale = constants.TEMPLATES_DEFAULT_LOCALE;
|
||||
let fileTemplatePath = pathModule.join(tenNewFileTemplate, locale, 'new.' + fromTemplate);
|
||||
res.sendFile(pathModule.resolve(fileTemplatePath));
|
||||
} else {
|
||||
if (utils.canIncludeOutboxAuthorization(ctx, url)) {
|
||||
let secret = yield tenantManager.getTenantSecret(ctx, commonDefines.c_oAscSecretType.Outbox);
|
||||
authorization = utils.fillJwtForRequest(ctx, {url: url}, secret, false);
|
||||
}
|
||||
let urlParsed = urlModule.parse(url);
|
||||
let filterStatus = yield* utils.checkHostFilter(ctx, urlParsed.hostname);
|
||||
if (0 !== filterStatus) {
|
||||
ctx.logger.warn('Error downloadFile checkIpFilter error: url = %s', url);
|
||||
res.sendStatus(filterStatus);
|
||||
return;
|
||||
}
|
||||
headers['Range'] = req.get('Range');
|
||||
}
|
||||
|
||||
yield utils.downloadUrlPromise(ctx, url, tenDownloadTimeout, tenDownloadMaxBytes, authorization, isInJwtToken, headers, res);
|
||||
if (req.get('Range')) {
|
||||
if (!headers) {
|
||||
headers = {};
|
||||
}
|
||||
headers['Range'] = req.get('Range');
|
||||
}
|
||||
|
||||
yield utils.downloadUrlPromise(ctx, url, tenDownloadTimeout, tenDownloadMaxBytes, authorization, isInJwtToken, headers, res);
|
||||
}
|
||||
|
||||
if (clientStatsD) {
|
||||
clientStatsD.timing('coauth.downloadFile', new Date() - startDate);
|
||||
|
||||
@ -67,16 +67,18 @@ const cfgMaxDownloadBytes = config.get('FileConverter.converter.maxDownloadBytes
|
||||
const cfgWopiFileInfoBlockList = config.get('wopi.fileInfoBlockList');
|
||||
const cfgWopiWopiZone = config.get('wopi.wopiZone');
|
||||
const cfgWopiPdfView = config.get('wopi.pdfView');
|
||||
const cfgWopiPdfEdit = config.get('wopi.pdfEdit');
|
||||
const cfgWopiWordView = config.get('wopi.wordView');
|
||||
const cfgWopiWordEdit = config.get('wopi.wordEdit');
|
||||
const cfgWopiCellView = config.get('wopi.cellView');
|
||||
const cfgWopiCellEdit = config.get('wopi.cellEdit');
|
||||
const cfgWopiSlideView = config.get('wopi.slideView');
|
||||
const cfgWopiSlideEdit = config.get('wopi.slideEdit');
|
||||
const cfgWopiWordForm = config.get('wopi.wordForm');
|
||||
const cfgWopiForms = config.get('wopi.forms');
|
||||
const cfgWopiFavIconUrlWord = config.get('wopi.favIconUrlWord');
|
||||
const cfgWopiFavIconUrlCell = config.get('wopi.favIconUrlCell');
|
||||
const cfgWopiFavIconUrlSlide = config.get('wopi.favIconUrlSlide');
|
||||
const cfgWopiFavIconUrlPdf = config.get('wopi.favIconUrlPdf');
|
||||
const cfgWopiPublicKey = config.get('wopi.publicKey');
|
||||
const cfgWopiModulus = config.get('wopi.modulus');
|
||||
const cfgWopiExponent = config.get('wopi.exponent');
|
||||
@ -89,6 +91,7 @@ const cfgWopiHost = config.get('wopi.host');
|
||||
const cfgWopiDummySampleFilePath = config.get('wopi.dummy.sampleFilePath');
|
||||
|
||||
let templatesFolderLocalesCache = null;
|
||||
let templatesFolderExtsCache = null;
|
||||
const templateFilesSizeCache = {};
|
||||
|
||||
let mimeTypesByExt = (function() {
|
||||
@ -109,9 +112,24 @@ let mimeTypesByExt = (function() {
|
||||
return mimeTypesByExt;
|
||||
})();
|
||||
|
||||
async function getTemplatesFolderExts(ctx){
|
||||
//find available template files
|
||||
if (templatesFolderExtsCache === null) {
|
||||
const tenNewFileTemplate = ctx.getCfg('services.CoAuthoring.server.newFileTemplate', cfgNewFileTemplate);
|
||||
const dirContent = await readdir(`${tenNewFileTemplate}/${constants.TEMPLATES_DEFAULT_LOCALE}/`, { withFileTypes: true });
|
||||
templatesFolderExtsCache = dirContent
|
||||
.filter(dirObject => dirObject.isFile())
|
||||
.reduce((result, item, index, array) => {
|
||||
let ext = path.extname(item.name).substring(1);
|
||||
result[ext] = ext;
|
||||
return result;
|
||||
}, {});
|
||||
}
|
||||
return templatesFolderExtsCache;
|
||||
}
|
||||
|
||||
function discovery(req, res) {
|
||||
return co(function*() {
|
||||
let output = '';
|
||||
const xml = xmlbuilder2.create({version: '1.0', encoding: 'utf-8'});
|
||||
let ctx = new operationContext.Context();
|
||||
try {
|
||||
@ -120,16 +138,18 @@ function discovery(req, res) {
|
||||
ctx.logger.info('wopiDiscovery start');
|
||||
const tenWopiWopiZone = ctx.getCfg('wopi.wopiZone', cfgWopiWopiZone);
|
||||
const tenWopiPdfView = ctx.getCfg('wopi.pdfView', cfgWopiPdfView);
|
||||
const tenWopiPdfEdit = ctx.getCfg('wopi.pdfEdit', cfgWopiPdfEdit);
|
||||
const tenWopiWordView = ctx.getCfg('wopi.wordView', cfgWopiWordView);
|
||||
const tenWopiWordEdit = ctx.getCfg('wopi.wordEdit', cfgWopiWordEdit);
|
||||
const tenWopiCellView = ctx.getCfg('wopi.cellView', cfgWopiCellView);
|
||||
const tenWopiCellEdit = ctx.getCfg('wopi.cellEdit', cfgWopiCellEdit);
|
||||
const tenWopiSlideView = ctx.getCfg('wopi.slideView', cfgWopiSlideView);
|
||||
const tenWopiSlideEdit = ctx.getCfg('wopi.slideEdit', cfgWopiSlideEdit);
|
||||
const tenWopiWordForm = ctx.getCfg('wopi.wordForm', cfgWopiWordForm);
|
||||
const tenWopiForms = ctx.getCfg('wopi.forms', cfgWopiForms);
|
||||
const tenWopiFavIconUrlWord = ctx.getCfg('wopi.favIconUrlWord', cfgWopiFavIconUrlWord);
|
||||
const tenWopiFavIconUrlCell = ctx.getCfg('wopi.favIconUrlCell', cfgWopiFavIconUrlCell);
|
||||
const tenWopiFavIconUrlSlide = ctx.getCfg('wopi.favIconUrlSlide', cfgWopiFavIconUrlSlide);
|
||||
const tenWopiFavIconUrlPdf = ctx.getCfg('wopi.favIconUrlSlide', cfgWopiFavIconUrlPdf);
|
||||
const tenWopiPublicKey = ctx.getCfg('wopi.publicKey', cfgWopiPublicKey);
|
||||
const tenWopiModulus = ctx.getCfg('wopi.modulus', cfgWopiModulus);
|
||||
const tenWopiExponent = ctx.getCfg('wopi.exponent', cfgWopiExponent);
|
||||
@ -139,20 +159,27 @@ function discovery(req, res) {
|
||||
const tenWopiHost = ctx.getCfg('wopi.host', cfgWopiHost);
|
||||
|
||||
let baseUrl = tenWopiHost || utils.getBaseUrlByRequest(ctx, req);
|
||||
let names = ['Word','Excel','PowerPoint'];
|
||||
let favIconUrls = [tenWopiFavIconUrlWord, tenWopiFavIconUrlCell, tenWopiFavIconUrlSlide];
|
||||
let names = ['Word','Excel','PowerPoint','Pdf'];
|
||||
let favIconUrls = [tenWopiFavIconUrlWord, tenWopiFavIconUrlCell, tenWopiFavIconUrlSlide, tenWopiFavIconUrlPdf];
|
||||
let exts = [
|
||||
{targetext: 'docx', view: tenWopiPdfView.concat(tenWopiWordView), edit: tenWopiWordEdit, form: tenWopiWordForm},
|
||||
{targetext: 'docx', view: tenWopiWordView, edit: tenWopiWordEdit},
|
||||
{targetext: 'xlsx', view: tenWopiCellView, edit: tenWopiCellEdit},
|
||||
{targetext: 'pptx', view: tenWopiSlideView, edit: tenWopiSlideEdit}
|
||||
{targetext: 'pptx', view: tenWopiSlideView, edit: tenWopiSlideEdit},
|
||||
{targetext: null, view: tenWopiPdfView, edit: tenWopiPdfEdit}
|
||||
];
|
||||
let documentTypes = [`word`, `cell`, `slide`, `pdf`];
|
||||
|
||||
let templatesFolderExtsCache = yield getTemplatesFolderExts(ctx);
|
||||
let formsExts = tenWopiForms.reduce((result, item, index, array) => {
|
||||
result[item] = item;
|
||||
return result;
|
||||
}, {});
|
||||
|
||||
let templateStart = `${baseUrl}/hosting/wopi`;
|
||||
let templateEnd = `<rs=DC_LLCC&><dchat=DISABLE_CHAT&><embed=EMBEDDED&>`;
|
||||
templateEnd += `<fs=FULLSCREEN&><hid=HOST_SESSION_ID&><rec=RECORDING&>`;
|
||||
templateEnd += `<sc=SESSION_CONTEXT&><thm=THEME_ID&><ui=UI_LLCC&>`;
|
||||
templateEnd += `<wopisrc=WOPI_SOURCE&>&`;
|
||||
let documentTypes = [`word`, `cell`, `slide`];
|
||||
let xmlZone = xml.ele('wopi-discovery').ele('net-zone', { name: tenWopiWopiZone });
|
||||
//start section for MS WOPI connectors
|
||||
for(let i = 0; i < names.length; ++i) {
|
||||
@ -173,7 +200,7 @@ function discovery(req, res) {
|
||||
xmlApp.ele('action', {name: 'view', ext: ext.view[j], default: 'true', urlsrc: urlTemplateView}).up();
|
||||
xmlApp.ele('action', {name: 'embedview', ext: ext.view[j], urlsrc: urlTemplateEmbedView}).up();
|
||||
xmlApp.ele('action', {name: 'mobileView', ext: ext.view[j], urlsrc: urlTemplateMobileView}).up();
|
||||
if (-1 === tenWopiPdfView.indexOf(ext.view[j])) {
|
||||
if (ext.targetext) {
|
||||
let urlConvert = `${templateStart}/convert-and-edit/${ext.view[j]}/${ext.targetext}?${templateEnd}`;
|
||||
xmlApp.ele('action', {name: 'convert', ext: ext.view[j], targetext: ext.targetext, requires: 'update', urlsrc: urlConvert}).up();
|
||||
}
|
||||
@ -184,13 +211,13 @@ function discovery(req, res) {
|
||||
xmlApp.ele('action', {name: 'mobileView', ext: ext.edit[j], urlsrc: urlTemplateMobileView}).up();
|
||||
xmlApp.ele('action', {name: 'edit', ext: ext.edit[j], default: 'true', requires: 'locks,update', urlsrc: urlTemplateEdit}).up();
|
||||
xmlApp.ele('action', {name: 'mobileEdit', ext: ext.edit[j], requires: 'locks,update', urlsrc: urlTemplateMobileEdit}).up();
|
||||
if (formsExts[ext.edit[j]]) {
|
||||
xmlApp.ele('action', {name: 'formsubmit', ext: ext.edit[j], requires: 'locks,update', urlsrc: urlTemplateFormSubmit}).up();
|
||||
}
|
||||
if (templatesFolderExtsCache[ext.edit[j]]) {
|
||||
xmlApp.ele('action', {name: 'editnew', ext: ext.edit[j], requires: 'locks,update', urlsrc: urlTemplateEdit}).up();
|
||||
}
|
||||
}
|
||||
for (let extention of (ext.form || [])) {
|
||||
xmlApp.ele('action', {name: 'formsubmit', ext: extention, requires: 'locks,update', urlsrc: urlTemplateFormSubmit}).up();
|
||||
}
|
||||
constants.SUPPORTED_TEMPLATES_EXTENSIONS[name].forEach(
|
||||
extension => xmlApp.ele('action', {name: 'editnew', ext: extension, requires: 'locks,update', urlsrc: urlTemplateEdit}).up()
|
||||
);
|
||||
xmlApp.up();
|
||||
}
|
||||
//end section for MS WOPI connectors
|
||||
@ -211,13 +238,10 @@ function discovery(req, res) {
|
||||
xmlApp.ele('action', {name: 'view', ext: '', default: 'true', urlsrc: urlTemplateView}).up();
|
||||
xmlApp.ele('action', {name: 'embedview', ext: '', urlsrc: urlTemplateEmbedView}).up();
|
||||
xmlApp.ele('action', {name: 'mobileView', ext: '', urlsrc: urlTemplateMobileView}).up();
|
||||
if (-1 === tenWopiPdfView.indexOf(ext.view[j])) {
|
||||
if (ext.targetext) {
|
||||
let urlConvert = `${templateStart}/convert-and-edit/${ext.view[j]}/${ext.targetext}?${templateEnd}`;
|
||||
xmlApp.ele('action', {name: 'convert', ext: '', targetext: ext.targetext, requires: 'update', urlsrc: urlConvert}).up();
|
||||
}
|
||||
if (ext.form && -1 !== ext.form.indexOf(ext.view[j])) {
|
||||
xmlApp.ele('action', {name: 'formsubmit', ext: '', requires: 'locks,update', urlsrc: urlTemplateFormSubmit}).up();
|
||||
}
|
||||
xmlApp.up();
|
||||
});
|
||||
}
|
||||
@ -229,9 +253,12 @@ function discovery(req, res) {
|
||||
let xmlApp = xmlZone.ele('app', {name: value});
|
||||
xmlApp.ele('action', {name: 'edit', ext: '', default: 'true', requires: 'locks,update', urlsrc: urlTemplateEdit}).up();
|
||||
xmlApp.ele('action', {name: 'mobileEdit', ext: '', requires: 'locks,update', urlsrc: urlTemplateMobileEdit}).up();
|
||||
if (ext.form && -1 !== ext.form.indexOf(ext.edit[j])) {
|
||||
if (formsExts[ext.edit[j]]) {
|
||||
xmlApp.ele('action', {name: 'formsubmit', ext: '', requires: 'locks,update', urlsrc: urlTemplateFormSubmit}).up();
|
||||
}
|
||||
if (templatesFolderExtsCache[ext.edit[j]]) {
|
||||
xmlApp.ele('action', {name: 'editnew', ext: '', requires: 'locks,update', urlsrc: urlTemplateEdit}).up();
|
||||
}
|
||||
xmlApp.up();
|
||||
});
|
||||
}
|
||||
@ -496,7 +523,7 @@ function getEditorHtml(req, res) {
|
||||
const localePrefix = lang || ui || 'en';
|
||||
let locale = constants.TEMPLATES_FOLDER_LOCALE_COLLISON_MAP[localePrefix] ?? templatesFolderLocalesCache.find(locale => locale.startsWith(localePrefix));
|
||||
if (locale === undefined) {
|
||||
locale = 'en-US';
|
||||
locale = constants.TEMPLATES_DEFAULT_LOCALE;
|
||||
}
|
||||
|
||||
const filePath = `${tenNewFileTemplate}/${locale}/new.${fileType}`;
|
||||
|
||||
@ -360,7 +360,7 @@ async function changeFormatToExtendedPdf(ctx, dataConvert, cmd) {
|
||||
function* replaceEmptyFile(ctx, fileFrom, ext, _lcid) {
|
||||
const tenNewFileTemplate = ctx.getCfg('services.CoAuthoring.server.newFileTemplate', cfgNewFileTemplate);
|
||||
if (!fs.existsSync(fileFrom) || 0 === fs.lstatSync(fileFrom).size) {
|
||||
let locale = 'en-US';
|
||||
let locale = constants.TEMPLATES_DEFAULT_LOCALE;
|
||||
if (_lcid) {
|
||||
let localeNew = lcid.from(_lcid);
|
||||
if (localeNew) {
|
||||
@ -372,14 +372,24 @@ function* replaceEmptyFile(ctx, fileFrom, ext, _lcid) {
|
||||
}
|
||||
}
|
||||
}
|
||||
ctx.logger.debug('replaceEmptyFile format=%s locale=%s', ext, locale);
|
||||
let format = formatChecker.getFormatFromString(ext);
|
||||
if (formatChecker.isDocumentFormat(format)) {
|
||||
fs.copyFileSync(path.join(tenNewFileTemplate, locale, 'new.docx'), fileFrom);
|
||||
} else if (formatChecker.isSpreadsheetFormat(format)) {
|
||||
fs.copyFileSync(path.join(tenNewFileTemplate, locale, 'new.xlsx'), fileFrom);
|
||||
} else if (formatChecker.isPresentationFormat(format)) {
|
||||
fs.copyFileSync(path.join(tenNewFileTemplate, locale, 'new.pptx'), fileFrom);
|
||||
let fileTemplatePath = path.join(tenNewFileTemplate, locale, 'new.');
|
||||
if (fs.existsSync(fileTemplatePath + ext)) {
|
||||
ctx.logger.debug('replaceEmptyFile format=%s locale=%s', ext, locale);
|
||||
fs.copyFileSync(fileTemplatePath + ext, fileFrom);
|
||||
} else {
|
||||
let format = formatChecker.getFormatFromString(ext);
|
||||
let editorFormat;
|
||||
if (formatChecker.isDocumentFormat(format)) {
|
||||
editorFormat = 'docx';
|
||||
} else if (formatChecker.isSpreadsheetFormat(format)) {
|
||||
editorFormat = 'xlsx';
|
||||
} else if (formatChecker.isPresentationFormat(format)) {
|
||||
editorFormat = 'pptx';
|
||||
}
|
||||
if (fs.existsSync(fileTemplatePath + editorFormat)) {
|
||||
ctx.logger.debug('replaceEmptyFile format=%s locale=%s', ext, locale);
|
||||
fs.copyFileSync(fileTemplatePath + editorFormat, fileFrom);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user