From 2e75037b4e72c10cc825caa3430aa20bd1b476ab Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 13 Feb 2023 14:56:09 +0300 Subject: [PATCH 01/29] php: referenceData --- web/documentserver-example/php/common.php | 18 +++++++ web/documentserver-example/php/doceditor.php | 41 +++++++------- .../php/webeditor-ajax.php | 53 +++++++++++++++++++ 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/web/documentserver-example/php/common.php b/web/documentserver-example/php/common.php index 66673df7b..9f2972701 100644 --- a/web/documentserver-example/php/common.php +++ b/web/documentserver-example/php/common.php @@ -624,3 +624,21 @@ function getDocEditorKey($fileName) $key = $key . $stat; // and add it to the document key return generateRevisionId($key); // generate the document key value } + +/** + * Get url to download a file + * + * @param string $fileName + * @param bool $isServer + * + * @return string + */ +function getDownloadUrl($fileName, $isServer = true) +{ + $userAddress = $isServer ? "&userAddress=" . getClientIp() : ""; + return serverPath($isServer) . '/' + . "webeditor-ajax.php" + . "?type=download" + . "&fileName=" . urlencode($fileName) + . $userAddress; +} \ No newline at end of file diff --git a/web/documentserver-example/php/doceditor.php b/web/documentserver-example/php/doceditor.php index c7b675770..373f66d8d 100755 --- a/web/documentserver-example/php/doceditor.php +++ b/web/documentserver-example/php/doceditor.php @@ -117,6 +117,13 @@ "commentGroups" => $user->commentGroups, "userInfoGroups" => $user->userInfoGroups, ], + "referenceData" => [ + "fileKey" => $user->id != "uid-0" ? json_encode([ + "fileName" => $filename, + "userAddress" => getCurUserHostAddress() + ]) : null, + "instanceId" => serverPath(), + ], ], "editorConfig" => [ "actionLink" => empty($_GET["actionLink"]) ? null : json_decode($_GET["actionLink"]), @@ -283,24 +290,6 @@ function getHistoryDownloadUrl($fileName, $version, $file, $isServer = true) . $userAddress; } -/** - * Get url to download a file - * - * @param string $fileName - * @param bool $isServer - * - * @return string - */ -function getDownloadUrl($fileName, $isServer = true) -{ - $userAddress = $isServer ? "&userAddress=" . getClientIp() : ""; - return serverPath($isServer) . '/' - . "webeditor-ajax.php" - . "?type=download" - . "&fileName=" . urlencode($fileName) - . $userAddress; -} - /** * Get document history * @@ -604,6 +593,21 @@ function getHistory($filename, $filetype, $docKey, $fileuri, $isEnableDirectUrl) } }; + var onRequestReferenceData = function(event) { // user refresh external data source + innerAlert("onRequestReferenceData: " + JSON.stringify(event.data)); + + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "webeditor-ajax.php?type=reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + innerAlert(xhr.responseText); + console.log(JSON.parse(xhr.responseText)); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + var сonnectEditor = function () { if (config.editorConfig.createUrl) { diff --git a/web/documentserver-example/php/webeditor-ajax.php b/web/documentserver-example/php/webeditor-ajax.php index be405af82..1b5dd2872 100644 --- a/web/documentserver-example/php/webeditor-ajax.php +++ b/web/documentserver-example/php/webeditor-ajax.php @@ -99,6 +99,10 @@ $response_array = csv(); $response_array['status'] = 'success'; die(json_encode($response_array)); + case "reference": + $response_array = reference(); + $response_array['status'] = 'success'; + die(json_encode($response_array)); case "files": $response_array = files(); die(json_encode($response_array)); @@ -570,3 +574,52 @@ function renamefile() return ["result" => $commandRequest]; } + +/** + * Reference data + * + * @return array + */ +function reference() +{ + $post = json_decode(file_get_contents('php://input'), true); + + @header("Content-Type: application/json"); + + $referenceData = $post["referenceData"]; + + if ($referenceData) { + $instanceId = $referenceData["instanceId"]; + if ($instanceId == serverPath()) { + $fileKey = json_decode($referenceData["fileKey"]); + $userAddress = $fileKey->userAddress; + if ($userAddress == getCurUserHostAddress()) { + $fileName = $fileKey->fileName; + } + } + } + + if (!$fileName) { + return ["error" => "File is not found"]; + } + + $data = [ + "fileType" => getInternalExtension($fileName), + "url" => getDownloadUrl($fileName), + "directUrl" => $post["directUrl"] ? getDownloadUrl($fileName) : getDownloadUrl($fileName, false), + "referenceData" => [ + "fileKey" => json_encode([ + "fileName" => $fileName, + "userAddress" => getCurUserHostAddress() + ]), + "instanceId" => serverPath(), + ], + "path" => $fileName + ]; + + if (isJwtEnabled()) { + $data["token"] = jwtEncode($data); + } + + return $data; +} From 69caf5364692e21d5e9c3867e2034709b429d4ae Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 14 Feb 2023 15:20:27 +0300 Subject: [PATCH 02/29] csharp: referenceData --- .../csharp/DocEditor.aspx | 14 +++++ .../csharp/DocEditor.aspx.cs | 11 ++++ .../csharp/WebEditor.ashx.cs | 63 +++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/web/documentserver-example/csharp/DocEditor.aspx b/web/documentserver-example/csharp/DocEditor.aspx index eef961ee3..7b2394e8f 100644 --- a/web/documentserver-example/csharp/DocEditor.aspx +++ b/web/documentserver-example/csharp/DocEditor.aspx @@ -190,6 +190,19 @@ } }; + var onRequestReferenceData = function (event) { // user refresh external data source + + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "webeditor.ashx?type=reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + console.log(xhr.responseText); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + config = <%= DocConfig %>; config.width = "100%"; @@ -242,6 +255,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } if (config.editorConfig.createUrl) { diff --git a/web/documentserver-example/csharp/DocEditor.aspx.cs b/web/documentserver-example/csharp/DocEditor.aspx.cs index cc69832b0..8056752e5 100755 --- a/web/documentserver-example/csharp/DocEditor.aspx.cs +++ b/web/documentserver-example/csharp/DocEditor.aspx.cs @@ -206,6 +206,17 @@ protected void Page_Load(object sender, EventArgs e) { "favorite", favorite } } }, + { + "referenceData", new Dictionary() + { + { "fileKey", !user.id.Equals("uid-0") ? + jss.Serialize(new Dictionary{ + {"fileName", FileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) : null }, + {"instanceId", _Default.GetServerUrl(false) } + } + }, { // the permission for the document to be edited and downloaded or not "permissions", new Dictionary diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 415a63bca..59a41b4b2 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -71,6 +71,9 @@ public void ProcessRequest(HttpContext context) case "rename": Rename(context); break; + case "reference": + Reference(context); + break; } } @@ -409,5 +412,65 @@ private static void Rename(HttpContext context) TrackManager.commandRequest("meta", docKey, meta); context.Response.Write("{ \"result\": \"OK\"}"); } + + private static void Reference(HttpContext context) + { + string fileData; + try + { + using (var receiveStream = context.Request.InputStream) + using (var readStream = new StreamReader(receiveStream)) + { + fileData = readStream.ReadToEnd(); + if (string.IsNullOrEmpty(fileData)) return; + } + } + catch (Exception e) + { + throw new HttpException((int)HttpStatusCode.BadRequest, e.Message); + } + + var jss = new JavaScriptSerializer(); + var body = jss.Deserialize>(fileData); + var referenceData = jss.Deserialize > (jss.Serialize(body["referenceData"])); + var instanceId = (string)referenceData["instanceId"]; + var fileKey = (string)referenceData["fileKey"]; + + try + { + var fileKeyObj = jss.Deserialize>(fileKey); + var fileName = (string)fileKeyObj["fileName"]; + var userAddress = (string)fileKeyObj["userAddress"]; + + var data = new Dictionary() { + { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, + { "url", DocEditor.getDownloadUrl(fileName)}, + { "directUrl", DocEditor.getDownloadUrl(fileName) }, + { "referenceData", new Dictionary() + { + { "fileKey", jss.Serialize(new Dictionary{ + {"fileName", fileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) + }, + {"instanceId", _Default.GetServerUrl(false) } + } + } + }; + + if (JwtManager.Enabled) + { + var token = JwtManager.Encode(data); + data.Add("token", token); + } + + context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + } + catch (Exception e) + { + context.Response.Write("{ \"error\": \"File not found!\"}"); + } + + } } } \ No newline at end of file From 75046b80c6f56c07e0afe527648cc6233aca5bd5 Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 14 Feb 2023 15:42:36 +0300 Subject: [PATCH 03/29] csharp-mvc: referenceData --- .../csharp-mvc/Models/FileModel.cs | 11 ++++ .../csharp-mvc/Views/Home/Editor.aspx | 13 ++++ .../csharp-mvc/WebEditor.ashx.cs | 63 +++++++++++++++++++ 3 files changed, 87 insertions(+) diff --git a/web/documentserver-example/csharp-mvc/Models/FileModel.cs b/web/documentserver-example/csharp-mvc/Models/FileModel.cs index a2cd44aac..0c84b7c6c 100755 --- a/web/documentserver-example/csharp-mvc/Models/FileModel.cs +++ b/web/documentserver-example/csharp-mvc/Models/FileModel.cs @@ -138,6 +138,17 @@ public string GetDocConfig(HttpRequest request, UrlHelper url) { "favorite", favorite} } }, + { + "referenceData", new Dictionary() + { + { "fileKey", !user.id.Equals("uid-0") ? + jss.Serialize(new Dictionary{ + {"fileName", FileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) : null }, + {"instanceId", _Default.GetServerUrl(false) } + } + }, { // the permission for the document to be edited and downloaded or not "permissions", new Dictionary diff --git a/web/documentserver-example/csharp-mvc/Views/Home/Editor.aspx b/web/documentserver-example/csharp-mvc/Views/Home/Editor.aspx index faec8ff6f..ceb0d857e 100644 --- a/web/documentserver-example/csharp-mvc/Views/Home/Editor.aspx +++ b/web/documentserver-example/csharp-mvc/Views/Home/Editor.aspx @@ -178,6 +178,18 @@ } }; + var onRequestReferenceData = function (event) { // user refresh external data source + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "webeditor.ashx?type=reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + console.log(xhr.responseText); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + config = <%= Model.GetDocConfig(Request, Url) %>; config.width = "100%"; @@ -239,6 +251,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } if (config.editorConfig.createUrl) { diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index f09726179..4f0ee8918 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -74,6 +74,9 @@ public void ProcessRequest(HttpContext context) case "rename": Rename(context); break; + case "reference": + Reference(context); + break; } } @@ -591,5 +594,65 @@ private static void Rename(HttpContext context) TrackManager.commandRequest("meta", docKey, meta); context.Response.Write("{ \"result\": \"OK\"}"); } + + private static void Reference(HttpContext context) + { + string fileData; + try + { + using (var receiveStream = context.Request.InputStream) + using (var readStream = new StreamReader(receiveStream)) + { + fileData = readStream.ReadToEnd(); + if (string.IsNullOrEmpty(fileData)) return; + } + } + catch (Exception e) + { + throw new HttpException((int)HttpStatusCode.BadRequest, e.Message); + } + + var jss = new JavaScriptSerializer(); + var body = jss.Deserialize>(fileData); + var referenceData = jss.Deserialize > (jss.Serialize(body["referenceData"])); + var instanceId = (string)referenceData["instanceId"]; + var fileKey = (string)referenceData["fileKey"]; + + try + { + var fileKeyObj = jss.Deserialize>(fileKey); + var fileName = (string)fileKeyObj["fileName"]; + var userAddress = (string)fileKeyObj["userAddress"]; + + var data = new Dictionary() { + { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, + { "url", DocEditor.getDownloadUrl(fileName)}, + { "directUrl", DocEditor.getDownloadUrl(fileName) }, + { "referenceData", new Dictionary() + { + { "fileKey", jss.Serialize(new Dictionary{ + {"fileName", fileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) + }, + {"instanceId", _Default.GetServerUrl(false) } + } + } + }; + + if (JwtManager.Enabled) + { + var token = JwtManager.Encode(data); + data.Add("token", token); + } + + context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + } + catch (Exception e) + { + context.Response.Write("{ \"error\": \"File not found!\"}"); + } + + } } } \ No newline at end of file From 9213143e145c511bc2af2611b3e9073e4374a7cd Mon Sep 17 00:00:00 2001 From: rivexe Date: Wed, 15 Feb 2023 14:20:40 +0300 Subject: [PATCH 04/29] chsarp: fix referenceData - path-parameter in ajax-handler added --- web/documentserver-example/csharp/WebEditor.ashx.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 59a41b4b2..221db03d1 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -455,7 +455,8 @@ private static void Reference(HttpContext context) }, {"instanceId", _Default.GetServerUrl(false) } } - } + }, + { "path", fileName } }; if (JwtManager.Enabled) From 8147608d3bfefc6225363a8bdb4b618eccca0a23 Mon Sep 17 00:00:00 2001 From: rivexe Date: Wed, 15 Feb 2023 14:24:44 +0300 Subject: [PATCH 05/29] csharp-mvc: fix referenceData - path-parameter in ajax-handler added --- web/documentserver-example/csharp-mvc/WebEditor.ashx.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index 4f0ee8918..3e924e3bd 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -636,7 +636,8 @@ private static void Reference(HttpContext context) }) }, {"instanceId", _Default.GetServerUrl(false) } - } + }, + { "path", fileName } } }; From 97ba0da3c23417e6385419fb47439495abca31b4 Mon Sep 17 00:00:00 2001 From: rivexe Date: Wed, 15 Feb 2023 14:54:12 +0300 Subject: [PATCH 06/29] java: referenceData --- .../main/java/controllers/IndexServlet.java | 45 +++++++++++++++++++ .../src/main/java/entities/FileModel.java | 24 ++++++++++ .../java/src/main/webapp/editor.jsp | 14 ++++++ 3 files changed, 83 insertions(+) diff --git a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java index b023eb2cf..ae018e6cc 100755 --- a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java +++ b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java @@ -19,6 +19,7 @@ package controllers; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import entities.FileType; import entities.User; import helpers.ConfigManager; @@ -118,6 +119,9 @@ protected void processRequest(final HttpServletRequest request, case "rename": rename(request, response, writer); break; + case "reference": + reference(request, response, writer); + break; default: break; } @@ -633,6 +637,47 @@ private static void rename(final HttpServletRequest request, } } + // reference data + private static void reference(final HttpServletRequest request, + final HttpServletResponse response, + final PrintWriter writer) { + try { + Scanner scanner = new Scanner(request.getInputStream()); + scanner.useDelimiter("\\A"); + String bodyString = scanner.hasNext() ? scanner.next() : ""; + scanner.close(); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + + JSONParser parser = new JSONParser(); + JSONObject body = (JSONObject) parser.parse(bodyString); + String instanceId = (String) body.get("instanceId"); + JSONObject fileKey = (JSONObject) body.get("fileKey"); + String fileKeyValue = gson.toJson(fileKey); + + String fileName = (String) fileKey.get("fileName"); + String userAddress = (String) fileKey.get("userAddress"); + + HashMap referenceData = new HashMap<>(); + referenceData.put("instanceId", DocumentManager.getServerUrl(true)); + referenceData.put("fileKey", fileKeyValue); + + HashMap data = new HashMap<>(); + data.put("fileType", FileUtility.getFileExtension(fileName)); + data.put("url", DocumentManager.getDownloadUrl(fileName, true)); + data.put("directUrl", DocumentManager.getDownloadUrl(fileName, true)); + data.put("referenceData", referenceData); + data.put("path", referenceData); + + if (DocumentManager.tokenEnabled()) { + String token = DocumentManager.createToken(data); + data.put("token", token); + } + writer.write(gson.toJson(data)); + } catch (Exception e) { + e.printStackTrace(); + writer.write("{ \"error\" : 1, \"message\" : \"" + e.getMessage() + "\"}"); + } + } // process get request @Override diff --git a/web/documentserver-example/java/src/main/java/entities/FileModel.java b/web/documentserver-example/java/src/main/java/entities/FileModel.java index 4e420d5f2..c75d1f679 100755 --- a/web/documentserver-example/java/src/main/java/entities/FileModel.java +++ b/web/documentserver-example/java/src/main/java/entities/FileModel.java @@ -77,6 +77,7 @@ public FileModel(final String fileNameParam, .lastModified()))); document.setInfo(new Info()); document.getInfo().setFavorite(user.getFavorite()); + document.setReferenceData(new ReferenceData(fileName, DocumentManager.curUserHostAddress(null), user)); String templatesImageUrl = DocumentManager.getTemplateImageUrl(FileUtility.getFileType(fileName)); List> templates = new ArrayList<>(); @@ -302,6 +303,7 @@ public class Document { private String key; private Info info; private Permissions permissions; + private ReferenceData referenceData; public String getTitle() { return title; @@ -354,6 +356,13 @@ public Permissions getPermissions() { public void setPermissions(final Permissions permissionsParam) { this.permissions = permissionsParam; } + + public ReferenceData getReferenceData() { + return referenceData; + } + public void setReferenceData(final ReferenceData referenceDataParam) { + this.referenceData = referenceDataParam; + } } // the permissions parameters @@ -394,6 +403,21 @@ public Permissions(final String modeParam, final String typeParam, final Boolean } } + public class ReferenceData { + private final String instanceId; + private final Map fileKey; + public ReferenceData(final String fileName, final String curUserHostAddress, final User user) { + instanceId = DocumentManager.getServerUrl(true); + Map fileKeyList = new HashMap<>(); + if (!user.getId().equals("uid-0")) { + fileKeyList.put("fileName", fileName); + fileKeyList.put("userAddress", curUserHostAddress); + } else { + fileKeyList = null; + } + fileKey = fileKeyList; + } + } // the Favorite icon state public class Info { private String owner = "Me"; diff --git a/web/documentserver-example/java/src/main/webapp/editor.jsp b/web/documentserver-example/java/src/main/webapp/editor.jsp index 35726ef73..813220c02 100644 --- a/web/documentserver-example/java/src/main/webapp/editor.jsp +++ b/web/documentserver-example/java/src/main/webapp/editor.jsp @@ -161,6 +161,19 @@ } }; + var onRequestReferenceData = function(event) { // user refresh external data source + + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "IndexServlet?type=reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + innerAlert(xhr.responseText); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + config = JSON.parse('<%= FileModel.serialize(Model) %>'); config.width = "100%"; config.height = "100%"; @@ -215,6 +228,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } if (config.editorConfig.createUrl) { From 43875b06bfda94d5a7b7faac0d620cfb3f3e3b42 Mon Sep 17 00:00:00 2001 From: rivexe Date: Wed, 15 Feb 2023 15:33:07 +0300 Subject: [PATCH 07/29] java-spring: ReferenceData --- .../controllers/FileController.java | 34 +++++++++++++++++++ .../models/filemodel/Document.java | 2 ++ .../models/filemodel/ReferenceData.java | 24 +++++++++++++ .../src/main/resources/templates/editor.html | 13 +++++++ 4 files changed, 73 insertions(+) create mode 100644 web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/ReferenceData.java diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java index 502a799a5..6597db761 100755 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java @@ -19,6 +19,7 @@ package com.onlyoffice.integration.controllers; import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; import com.onlyoffice.integration.documentserver.callbacks.CallbackHandler; import com.onlyoffice.integration.documentserver.managers.jwt.JwtManager; import com.onlyoffice.integration.documentserver.storage.FileStorageMutator; @@ -445,4 +446,37 @@ public String rename(@RequestBody final JSONObject body) { return e.getMessage(); } } + + @PostMapping("/reference") + @ResponseBody + public String reference(@RequestBody final JSONObject body) { + try { + String instanceId = (String) body.get("instanceId"); + JSONObject fileKey = (JSONObject) body.get("fileKey"); + Gson gson = new Gson(); + String fileKeyValue = gson.toJson(fileKey); + + String fileName = (String) fileKey.get("fileName"); + String userAddress = (String) fileKey.get("userAddress"); + HashMap referenceData = new HashMap<>(); + referenceData.put("instanceId", storagePathBuilder.getServerUrl(true)); + referenceData.put("fileKey", fileKeyValue); + + HashMap data = new HashMap<>(); + data.put("fileType", fileUtility.getFileExtension(fileName)); + data.put("url", documentManager.getDownloadUrl(fileName, true)); + data.put("directUrl", documentManager.getDownloadUrl(fileName, true)); + data.put("referenceData", referenceData); + data.put("path", referenceData); + + if (jwtManager.tokenEnabled()) { + String token = jwtManager.createToken(data); + data.put("token", token); + } + return gson.toJson(data); + } catch (Exception e) { + e.printStackTrace(); + return "{ \"error\" : 1, \"message\" : \"" + e.getMessage() + "\"}"; + } + } } diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java index 985b6bc0d..45319043f 100755 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java @@ -18,6 +18,7 @@ package com.onlyoffice.integration.documentserver.models.filemodel; +import com.onlyoffice.integration.documentserver.managers.document.DocumentManager; import com.onlyoffice.integration.documentserver.models.configurations.Info; import lombok.Getter; import lombok.Setter; @@ -43,4 +44,5 @@ public class Document { // the parameters pertaining to the document (title, ur as file name when the document is downloaded */ private String url; // the absolute URL where the source viewed or edited document is stored private String directUrl; + private ReferenceData referenceData; } diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/ReferenceData.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/ReferenceData.java new file mode 100644 index 000000000..3ecdd7493 --- /dev/null +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/ReferenceData.java @@ -0,0 +1,24 @@ +package com.onlyoffice.integration.documentserver.models.filemodel; + +import java.util.HashMap; +import java.util.Map; +import com.onlyoffice.integration.documentserver.storage.FileStoragePathBuilder; +import org.springframework.beans.factory.annotation.Autowired; + +public class ReferenceData { + @Autowired + private FileStoragePathBuilder storagePathBuilder; + private final String instanceId; + private final Map fileKey; + public ReferenceData(final String fileName, final String curUserHostAddress, final User user) { + instanceId = storagePathBuilder.getServerUrl(true); + Map fileKeyList = new HashMap<>(); + if (!user.getId().equals("uid-0")) { + fileKeyList.put("fileName", fileName); + fileKeyList.put("userAddress", curUserHostAddress); + } else { + fileKeyList = null; + } + fileKey = fileKeyList; + } +} diff --git a/web/documentserver-example/java-spring/src/main/resources/templates/editor.html b/web/documentserver-example/java-spring/src/main/resources/templates/editor.html index e0802290d..7342b2818 100755 --- a/web/documentserver-example/java-spring/src/main/resources/templates/editor.html +++ b/web/documentserver-example/java-spring/src/main/resources/templates/editor.html @@ -160,6 +160,18 @@ } }; + var onRequestReferenceData = function(event) { // user refresh external data source + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + innerAlert(xhr.responseText); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + config.width = "100%"; config.height = "100%"; config.events = { @@ -211,6 +223,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } if (config.editorConfig.createUrl) { From 55734a14589c253702d3fb09857b49276e7c2af1 Mon Sep 17 00:00:00 2001 From: rivexe Date: Thu, 16 Feb 2023 10:10:23 +0300 Subject: [PATCH 08/29] ruby: referenceData --- .../ruby/app/controllers/home_controller.rb | 39 +++++++++++++++++++ .../ruby/app/models/file_model.rb | 9 +++++ .../ruby/app/views/home/editor.html.erb | 14 +++++++ .../ruby/config/routes.rb | 1 + 4 files changed, 63 insertions(+) diff --git a/web/documentserver-example/ruby/app/controllers/home_controller.rb b/web/documentserver-example/ruby/app/controllers/home_controller.rb index 30d025ebd..e7d8dcc57 100755 --- a/web/documentserver-example/ruby/app/controllers/home_controller.rb +++ b/web/documentserver-example/ruby/app/controllers/home_controller.rb @@ -363,4 +363,43 @@ def rename json_data = TrackHelper.command_request("meta", dockey, meta) render plain: '{ "result" : "' + JSON.dump(json_data) + '"}' end + + #ReferenceData + def reference + body = JSON.parse(request.body.read) + referenceData = body["referenceData"] + + if referenceData != nil + instanceId = referenceData["instanceId"] + if instanceId == DocumentHelper.get_server_url(false) + fileKey = JSON.parse(referenceData["fileKey"]) + userAddress = fileKey["userAddress"] + if userAddress == DocumentHelper.cur_user_host_address(nil) + fileName = fileKey["fileName"] + end + end + end + + if !fileName || fileName.eql?("") + render plain: '{ "error": "File not found"}' + return + end + + data = { + :fileType => DocumentHelper.get_internal_extension(fileName), + :url => DocumentHelper.get_download_url(fileName), + :directUrl => body["directUrl"] ? DocumentHelper.get_download_url(fileName) : DocumentHelper.get_download_url(fileName,false), + :referenceData => { + :instanceId => DocumentHelper.get_server_url(false), + :fileKey => fileKey.to_json + }, + :path => fileName + } + + if JwtHelper.is_enabled + data["token"] = JwtHelper.encode(data) + end + + render plain: data.to_json + end end \ No newline at end of file diff --git a/web/documentserver-example/ruby/app/models/file_model.rb b/web/documentserver-example/ruby/app/models/file_model.rb index 92340a759..24e61d8aa 100755 --- a/web/documentserver-example/ruby/app/models/file_model.rb +++ b/web/documentserver-example/ruby/app/models/file_model.rb @@ -105,6 +105,11 @@ def get_config } ] + fileKey = { + :fileName => @file_name, + :userAddress => DocumentHelper.cur_user_host_address(nil) + } + config = { :type => type(), :documentType => document_type, @@ -133,6 +138,10 @@ def get_config :reviewGroups => @user.reviewGroups, :commentGroups => @user.commentGroups, :userInfoGroups => @user.userInfoGroups + }, + :referenceData => { + :instanceId => DocumentHelper.get_server_url(false), + :fileKey => !@user.id.eql?("uid-0") ? fileKey.to_json : nil } }, :editorConfig => { diff --git a/web/documentserver-example/ruby/app/views/home/editor.html.erb b/web/documentserver-example/ruby/app/views/home/editor.html.erb index 19cc22e0e..ea38e5f15 100755 --- a/web/documentserver-example/ruby/app/views/home/editor.html.erb +++ b/web/documentserver-example/ruby/app/views/home/editor.html.erb @@ -151,6 +151,19 @@ } }; + var onRequestReferenceData = function(event) { // user refresh external data source + + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + innerAlert(xhr.responseText); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + var сonnectEditor = function () { config = <%= raw @file.get_config.to_json %>; @@ -205,6 +218,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } if (config.editorConfig.createUrl) { diff --git a/web/documentserver-example/ruby/config/routes.rb b/web/documentserver-example/ruby/config/routes.rb index 6d42c1b70..6388fc30d 100644 --- a/web/documentserver-example/ruby/config/routes.rb +++ b/web/documentserver-example/ruby/config/routes.rb @@ -14,6 +14,7 @@ match '/files', to: 'home#files', via: 'get' match '/saveas', to: 'home#saveas', via: 'post' match '/rename', to: 'home#rename', via: 'post' + match '/reference', to: 'home#reference', via: 'post' # The priority is based upon order of creation: first created -> highest priority. # See how all your routes lay out with "rake routes". From 1b1d07ebc5bc65fd0c1d7e2282790c8308beecf0 Mon Sep 17 00:00:00 2001 From: rivexe Date: Thu, 16 Feb 2023 12:19:33 +0300 Subject: [PATCH 09/29] python: referenceData --- web/documentserver-example/python/src/urls.py | 3 +- .../python/src/views/actions.py | 37 +++++++++++++++++++ .../python/templates/editor.html | 16 ++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/web/documentserver-example/python/src/urls.py b/web/documentserver-example/python/src/urls.py index fde0db342..9f7575975 100644 --- a/web/documentserver-example/python/src/urls.py +++ b/web/documentserver-example/python/src/urls.py @@ -34,7 +34,8 @@ path('csv', actions.csv), path('files', actions.files), path('saveas', actions.saveAs), - path('rename', actions.rename) + path('rename', actions.rename), + path('reference', actions.reference) ] urlpatterns += staticfiles_urlpatterns() \ No newline at end of file diff --git a/web/documentserver-example/python/src/views/actions.py b/web/documentserver-example/python/src/views/actions.py index 91c835743..2bb0f0059 100755 --- a/web/documentserver-example/python/src/views/actions.py +++ b/web/documentserver-example/python/src/views/actions.py @@ -245,6 +245,10 @@ def edit(request): 'reviewGroups': user.reviewGroups, 'commentGroups': user.commentGroups, 'userInfoGroups': user.userInfoGroups + }, + 'referenceData' : { + 'instanceId' : docManager.getServerUrl(False, request), + 'fileKey' : json.dumps({'fileName' : filename, 'userAddress': request.META['REMOTE_ADDR']}) if user.id !='uid-0' else None } }, 'editorConfig': { @@ -453,3 +457,36 @@ def downloadhistory(request): response = {} response.setdefault('error', 'File not found') return HttpResponse(json.dumps(response), content_type='application/json', status=404) + +# referenceData +def reference(request): + try: + body = json.loads(request.body) + referenceData = body['referenceData'] + + if referenceData: + instanceId = referenceData['instanceId'] + if instanceId == docManager.getServerUrl(False, request): + fileKey = json.loads(referenceData['fileKey']) + userAddress = fileKey['userAddress'] + if userAddress == request.META['REMOTE_ADDR']: + fileName = fileKey['fileName'] + data = { + 'fileType' : fileUtils.getFileExt(fileName), + 'url' : docManager.getDownloadUrl(fileName, request), + 'directUrl' : docManager.getDownloadUrl(fileName, request) if body["directUrl"] else docManager.getDownloadUrl(fileName, request, False), + 'referenceData' : { + 'instanceId' : docManager.getServerUrl(False, request), + 'fileKey' : json.dumps({'fileName' : fileName, 'userAddress': request.META['REMOTE_ADDR']}) + }, + 'path' : fileName + } + + if (jwtManager.isEnabled()): + data['token'] = jwtManager.encode(data) + + return HttpResponse(json.dumps(data), content_type='application/json') + except Exception: + response = {} + response.setdefault('error', 'File not found') + return HttpResponse(json.dumps(response), content_type='application/json', status=404) diff --git a/web/documentserver-example/python/templates/editor.html b/web/documentserver-example/python/templates/editor.html index 31e5d2eb3..64dde07c7 100755 --- a/web/documentserver-example/python/templates/editor.html +++ b/web/documentserver-example/python/templates/editor.html @@ -168,6 +168,21 @@ } }; + var onRequestReferenceData = function(event) { // user refresh external data source + innerAlert("onRequestReferenceData: " + JSON.stringify(event.data)); + + event.data.directUrl = !!config.document.directUrl; + let xhr = new XMLHttpRequest(); + xhr.open("POST", "reference"); + xhr.setRequestHeader("Content-Type", "application/json"); + xhr.send(JSON.stringify(event.data)); + xhr.onload = function () { + innerAlert(xhr.responseText); + console.log(JSON.parse(xhr.responseText)); + docEditor.setReferenceData(JSON.parse(xhr.responseText)); + } + }; + var connectEditor = function () { config = {{ cfg | safe }} @@ -223,6 +238,7 @@ }; // prevent file renaming for anonymous users config.events['onRequestRename'] = onRequestRename; + config.events['onRequestReferenceData'] = onRequestReferenceData; } From 42b7c8353e0b10a3432b27adb2f62f1dedb51537 Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 09:34:22 +0300 Subject: [PATCH 10/29] php: search for fileName by path added --- web/documentserver-example/php/webeditor-ajax.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/documentserver-example/php/webeditor-ajax.php b/web/documentserver-example/php/webeditor-ajax.php index 1b5dd2872..e7772968d 100644 --- a/web/documentserver-example/php/webeditor-ajax.php +++ b/web/documentserver-example/php/webeditor-ajax.php @@ -599,7 +599,14 @@ function reference() } } - if (!$fileName) { + if (!isset($filename) && isset($post["path"]) && isset($userAddress)) { + $path = basename($post["path"]); + if (file_exists(getStoragePath($path, $userAddress))) { + $fileName = $path; + } + } + + if (!isset($fileName)) { return ["error" => "File is not found"]; } From 7d1c3a994d696170e4fbca83b81269ba30a9a977 Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 10:13:43 +0300 Subject: [PATCH 11/29] python: search for fileName by path added --- .../python/src/views/actions.py | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/web/documentserver-example/python/src/views/actions.py b/web/documentserver-example/python/src/views/actions.py index 2bb0f0059..4edc62bc3 100755 --- a/web/documentserver-example/python/src/views/actions.py +++ b/web/documentserver-example/python/src/views/actions.py @@ -460,9 +460,12 @@ def downloadhistory(request): # referenceData def reference(request): + response = {} try: body = json.loads(request.body) referenceData = body['referenceData'] + fileName = None + userAddress = None if referenceData: instanceId = referenceData['instanceId'] @@ -471,6 +474,20 @@ def reference(request): userAddress = fileKey['userAddress'] if userAddress == request.META['REMOTE_ADDR']: fileName = fileKey['fileName'] + + if fileName is None and userAddress is not None: + try: + path = fileUtils.getFileName(body['path']) + if os.path.exists(docManager.getStoragePath(path,request)): + fileName = path + except KeyError: + response.setdefault('error', 'Path not found') + return HttpResponse(json.dumps(response), content_type='application/json', status=404) + + if fileName is None: + response.setdefault('error', 'File not found') + return HttpResponse(json.dumps(response), content_type='application/json', status=404) + data = { 'fileType' : fileUtils.getFileExt(fileName), 'url' : docManager.getDownloadUrl(fileName, request), @@ -487,6 +504,5 @@ def reference(request): return HttpResponse(json.dumps(data), content_type='application/json') except Exception: - response = {} - response.setdefault('error', 'File not found') + response.setdefault('error', 'Reference data is not correct') return HttpResponse(json.dumps(response), content_type='application/json', status=404) From f76c611033356751e38ae9e59d00cc8ab941c1e6 Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 10:40:03 +0300 Subject: [PATCH 12/29] ruby: search for fileName by path added --- .../ruby/app/controllers/home_controller.rb | 73 +++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/web/documentserver-example/ruby/app/controllers/home_controller.rb b/web/documentserver-example/ruby/app/controllers/home_controller.rb index e7d8dcc57..82c8d2e58 100755 --- a/web/documentserver-example/ruby/app/controllers/home_controller.rb +++ b/web/documentserver-example/ruby/app/controllers/home_controller.rb @@ -366,40 +366,55 @@ def rename #ReferenceData def reference - body = JSON.parse(request.body.read) - referenceData = body["referenceData"] - - if referenceData != nil - instanceId = referenceData["instanceId"] - if instanceId == DocumentHelper.get_server_url(false) - fileKey = JSON.parse(referenceData["fileKey"]) - userAddress = fileKey["userAddress"] - if userAddress == DocumentHelper.cur_user_host_address(nil) - fileName = fileKey["fileName"] + begin + body = JSON.parse(request.body.read) + referenceData = body["referenceData"] + + if referenceData != nil + instanceId = referenceData["instanceId"] + if instanceId == DocumentHelper.get_server_url(false) + fileKey = JSON.parse(referenceData["fileKey"]) + userAddress = fileKey["userAddress"] + if userAddress == DocumentHelper.cur_user_host_address(nil) + fileName = fileKey["fileName"] + end end end - end - if !fileName || fileName.eql?("") - render plain: '{ "error": "File not found"}' - return - end + if (!defined?(fileName) && defined?(userAddress)) + begin + path = File.basename(body["path"]) + if File.exists?(DocumentHelper.storage_path(path, nil)) + fileName = path + end + rescue => ex + render plain: '{ "error": "' + ex.message + '"}' + end + end - data = { - :fileType => DocumentHelper.get_internal_extension(fileName), - :url => DocumentHelper.get_download_url(fileName), - :directUrl => body["directUrl"] ? DocumentHelper.get_download_url(fileName) : DocumentHelper.get_download_url(fileName,false), - :referenceData => { - :instanceId => DocumentHelper.get_server_url(false), - :fileKey => fileKey.to_json - }, - :path => fileName - } + if !defined?(fileName) + render plain: '{ "error": "File not found"}' + return + end - if JwtHelper.is_enabled - data["token"] = JwtHelper.encode(data) - end + data = { + :fileType => DocumentHelper.get_internal_extension(fileName), + :url => DocumentHelper.get_download_url(fileName), + :directUrl => body["directUrl"] ? DocumentHelper.get_download_url(fileName) : DocumentHelper.get_download_url(fileName,false), + :referenceData => { + :instanceId => DocumentHelper.get_server_url(false), + :fileKey => fileKey.to_json + }, + :path => fileName + } + + if JwtHelper.is_enabled + data["token"] = JwtHelper.encode(data) + end - render plain: data.to_json + render plain: data.to_json + rescue => ex + render plain: '{ "error": "' + ex.message + '"}' + end end end \ No newline at end of file From ee0a167708c178253dd4fc0f806408195950f4e5 Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 11:15:33 +0300 Subject: [PATCH 13/29] csharp: search for fileName by path added --- .../csharp/WebEditor.ashx.cs | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 221db03d1..9dc5df238 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -26,6 +26,7 @@ using System.Web.Configuration; using System.Linq; using System.Net; +using System.Net.Sockets; namespace OnlineEditorsExample { @@ -435,43 +436,60 @@ private static void Reference(HttpContext context) var referenceData = jss.Deserialize > (jss.Serialize(body["referenceData"])); var instanceId = (string)referenceData["instanceId"]; var fileKey = (string)referenceData["fileKey"]; + var fileName = ""; + var userAddress = ""; - try + if (instanceId == _Default.GetServerUrl(false)) { var fileKeyObj = jss.Deserialize>(fileKey); - var fileName = (string)fileKeyObj["fileName"]; - var userAddress = (string)fileKeyObj["userAddress"]; - - var data = new Dictionary() { - { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, - { "url", DocEditor.getDownloadUrl(fileName)}, - { "directUrl", DocEditor.getDownloadUrl(fileName) }, - { "referenceData", new Dictionary() - { - { "fileKey", jss.Serialize(new Dictionary{ - {"fileName", fileName}, - {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} - }) - }, - {"instanceId", _Default.GetServerUrl(false) } - } - }, - { "path", fileName } - }; - - if (JwtManager.Enabled) + userAddress = (string)fileKeyObj["userAddress"]; + if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) { - var token = JwtManager.Encode(data); - data.Add("token", token); + fileName = (string)fileKeyObj["fileName"]; } + } - context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + if (fileName == "" && userAddress != "") + { + var path = (string)body["path"]; + path = Path.GetFileName(path); + if (File.Exists(_Default.StoragePath(path, userAddress))) + { + fileName = path; + } } - catch (Exception e) + + if (fileName == "") { context.Response.Write("{ \"error\": \"File not found!\"}"); + return; + } + + var data = new Dictionary() { + { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, + { "url", DocEditor.getDownloadUrl(fileName)}, + { "directUrl", DocEditor.getDownloadUrl(fileName) }, + { "referenceData", new Dictionary() + { + { "fileKey", jss.Serialize(new Dictionary{ + {"fileName", fileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) + }, + {"instanceId", _Default.GetServerUrl(false) } + } + }, + { "path", fileName } + }; + + if (JwtManager.Enabled) + { + var token = JwtManager.Encode(data); + data.Add("token", token); } + context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + } } } \ No newline at end of file From 54f501c82b457bb032776281fb8c45a695f96214 Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 11:19:42 +0300 Subject: [PATCH 14/29] csharp-mvc: search for fileName by path added --- .../csharp-mvc/WebEditor.ashx.cs | 78 ++++++++++++------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index 3e924e3bd..28b1f31c9 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -614,46 +614,72 @@ private static void Reference(HttpContext context) var jss = new JavaScriptSerializer(); var body = jss.Deserialize>(fileData); - var referenceData = jss.Deserialize > (jss.Serialize(body["referenceData"])); + var referenceData = jss.Deserialize>(jss.Serialize(body["referenceData"])); var instanceId = (string)referenceData["instanceId"]; var fileKey = (string)referenceData["fileKey"]; + var fileName = ""; + var userAddress = ""; - try + if (instanceId == _Default.GetServerUrl(false)) { var fileKeyObj = jss.Deserialize>(fileKey); - var fileName = (string)fileKeyObj["fileName"]; - var userAddress = (string)fileKeyObj["userAddress"]; - - var data = new Dictionary() { - { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, - { "url", DocEditor.getDownloadUrl(fileName)}, - { "directUrl", DocEditor.getDownloadUrl(fileName) }, - { "referenceData", new Dictionary() - { - { "fileKey", jss.Serialize(new Dictionary{ - {"fileName", fileName}, - {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} - }) - }, - {"instanceId", _Default.GetServerUrl(false) } - }, - { "path", fileName } + userAddress = (string)fileKeyObj["userAddress"]; + if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + { + fileName = (string)fileKeyObj["fileName"]; } - }; + } - if (JwtManager.Enabled) + if (fileName == "" && userAddress != "") + { + try { - var token = JwtManager.Encode(data); - data.Add("token", token); + var path = (string)body["path"]; + path = Path.GetFileName(path); + if (File.Exists(_Default.StoragePath(path, userAddress))) + { + fileName = path; + } + } + catch + { + context.Response.Write("{ \"error\": \"Path not found!\"}"); + return; } - - context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); } - catch (Exception e) + + if (fileName == "") { context.Response.Write("{ \"error\": \"File not found!\"}"); + return; } + var data = new Dictionary() { + { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, + { "url", DocEditor.getDownloadUrl(fileName)}, + { "directUrl", DocEditor.getDownloadUrl(fileName) }, + { "referenceData", new Dictionary() + { + { "fileKey", jss.Serialize(new Dictionary{ + {"fileName", fileName}, + {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + }) + }, + {"instanceId", _Default.GetServerUrl(false) } + } + }, + { "path", fileName } + }; + + if (JwtManager.Enabled) + { + var token = JwtManager.Encode(data); + data.Add("token", token); + } + + context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); } + + } } } \ No newline at end of file From 63b7641c470b0af34c7089eb094875d6f50a64cc Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 11:46:17 +0300 Subject: [PATCH 15/29] csharp: fix - "Path not found" - error handled --- .../csharp/WebEditor.ashx.cs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 9dc5df238..4fd063f02 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -451,11 +451,18 @@ private static void Reference(HttpContext context) if (fileName == "" && userAddress != "") { - var path = (string)body["path"]; - path = Path.GetFileName(path); - if (File.Exists(_Default.StoragePath(path, userAddress))) + try { - fileName = path; + var path = (string)body["path"]; + path = Path.GetFileName(path); + if (File.Exists(_Default.StoragePath(path, userAddress))) + { + fileName = path; + } + } + catch { + context.Response.Write("{ \"error\": \"Path not found!\"}"); + return; } } From e88c2e9c68019560da961b55c0c0a437b562e15c Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 12:03:42 +0300 Subject: [PATCH 16/29] java: search for fileName by path added + json-data fix --- .../main/java/controllers/IndexServlet.java | 41 +++++++++++++++---- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java index ae018e6cc..fff229386 100755 --- a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java +++ b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java @@ -64,7 +64,6 @@ import static utils.Constants.KILOBYTE_SIZE; - @WebServlet(name = "IndexServlet", urlPatterns = {"/IndexServlet"}) @MultipartConfig public class IndexServlet extends HttpServlet { @@ -650,15 +649,43 @@ private static void reference(final HttpServletRequest request, JSONParser parser = new JSONParser(); JSONObject body = (JSONObject) parser.parse(bodyString); - String instanceId = (String) body.get("instanceId"); - JSONObject fileKey = (JSONObject) body.get("fileKey"); - String fileKeyValue = gson.toJson(fileKey); + JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); + String instanceId = (String) referenceDataObj.get("instanceId"); + + String fileKeyValue = ""; + String userAddress = ""; + String fileName = ""; + + if (instanceId.equals(DocumentManager.getServerUrl(false))) { + JSONObject fileKey = (JSONObject) referenceDataObj.get("fileKey"); + fileKeyValue = gson.toJson(fileKey); + userAddress = (String) fileKey.get("userAddress"); + if (userAddress.equals(DocumentManager.curUserHostAddress(null))) { + fileName = (String) fileKey.get("fileName"); + } + } + + if (fileName.equals("") && !userAddress.equals("")) { + try { + String path = (String) body.get("path"); + path = FileUtility.getFileName(path); + File f = new File(DocumentManager.storagePath(path, userAddress)); + if (f.exists()) { + fileName = path; + } + } catch (Exception e) { + e.printStackTrace(); + writer.write("{ \"error\" : 1, \"message\" : \"" + e.getMessage() + "\"}"); + } + } - String fileName = (String) fileKey.get("fileName"); - String userAddress = (String) fileKey.get("userAddress"); + if (fileName.equals("")) { + writer.write("{ \"error\": \"File not found\"}"); + return; + } HashMap referenceData = new HashMap<>(); - referenceData.put("instanceId", DocumentManager.getServerUrl(true)); + referenceData.put("instanceId", DocumentManager.getServerUrl(false)); referenceData.put("fileKey", fileKeyValue); HashMap data = new HashMap<>(); From e729afdd051de2004a2c9cb84169f5c43c6a961a Mon Sep 17 00:00:00 2001 From: rivexe Date: Fri, 17 Feb 2023 12:59:09 +0300 Subject: [PATCH 17/29] java-spring: search for fileName by path added + json-data fix --- .../controllers/FileController.java | 41 ++++++++++++++++--- 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java index 6597db761..c1e5a0d22 100755 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; import com.onlyoffice.integration.documentserver.callbacks.CallbackHandler; import com.onlyoffice.integration.documentserver.managers.jwt.JwtManager; import com.onlyoffice.integration.documentserver.storage.FileStorageMutator; @@ -52,8 +53,10 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.InetAddress; import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; @@ -451,13 +454,39 @@ public String rename(@RequestBody final JSONObject body) { @ResponseBody public String reference(@RequestBody final JSONObject body) { try { - String instanceId = (String) body.get("instanceId"); - JSONObject fileKey = (JSONObject) body.get("fileKey"); - Gson gson = new Gson(); - String fileKeyValue = gson.toJson(fileKey); + JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + String instanceId = (String) referenceDataObj.get("instanceId"); + String fileKeyValue = ""; + String userAddress = ""; + String fileName = ""; + + if (instanceId.equals(storagePathBuilder.getServerUrl(false))) { + JSONObject fileKey = (JSONObject) referenceDataObj.get("fileKey"); + fileKeyValue = gson.toJson(fileKey); + userAddress = (String) fileKey.get("userAddress"); + if (userAddress.equals(InetAddress.getLocalHost().getHostAddress())) { + fileName = (String) fileKey.get("fileName"); + } + } + + if (fileName.equals("") && !userAddress.equals("")) { + try { + String path = (String) body.get("path"); + path = fileUtility.getFileName(path); + File f = new File(storagePathBuilder.getFileLocation(path)); + if (f.exists()) { + fileName = path; + } + } catch (Exception e) { + return "{ \"error\" : 1, \"message\" : \"" + e.getMessage() + "\"}"; + } + } + + if (fileName.equals("")) { + return "{ \"error\": \"File not found\"}"; + } - String fileName = (String) fileKey.get("fileName"); - String userAddress = (String) fileKey.get("userAddress"); HashMap referenceData = new HashMap<>(); referenceData.put("instanceId", storagePathBuilder.getServerUrl(true)); referenceData.put("fileKey", fileKeyValue); From 8d2cbca12ffdaaa176d93b047786c59e3ac3636a Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 20 Feb 2023 16:49:44 +0300 Subject: [PATCH 18/29] php: fix - search for filename by path --- web/documentserver-example/php/webeditor-ajax.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/documentserver-example/php/webeditor-ajax.php b/web/documentserver-example/php/webeditor-ajax.php index e7772968d..ac396bace 100644 --- a/web/documentserver-example/php/webeditor-ajax.php +++ b/web/documentserver-example/php/webeditor-ajax.php @@ -586,7 +586,7 @@ function reference() @header("Content-Type: application/json"); - $referenceData = $post["referenceData"]; + $referenceData = $post["referenceData"] ?? null; if ($referenceData) { $instanceId = $referenceData["instanceId"]; @@ -599,9 +599,9 @@ function reference() } } - if (!isset($filename) && isset($post["path"]) && isset($userAddress)) { + if (!isset($filename) && isset($post["path"])) { $path = basename($post["path"]); - if (file_exists(getStoragePath($path, $userAddress))) { + if (file_exists(getStoragePath($path))) { $fileName = $path; } } From 9d54ec748ab0be53f9dfff2e404f73f169becd37 Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 20 Feb 2023 17:06:56 +0300 Subject: [PATCH 19/29] python: fix - search for filename by path --- .../python/src/views/actions.py | 83 ++++++++++--------- 1 file changed, 42 insertions(+), 41 deletions(-) diff --git a/web/documentserver-example/python/src/views/actions.py b/web/documentserver-example/python/src/views/actions.py index 4edc62bc3..197c2f664 100755 --- a/web/documentserver-example/python/src/views/actions.py +++ b/web/documentserver-example/python/src/views/actions.py @@ -461,48 +461,49 @@ def downloadhistory(request): # referenceData def reference(request): response = {} + body = json.loads(request.body) + referenceData = None + fileName = None + userAddress = None + try: - body = json.loads(request.body) referenceData = body['referenceData'] - fileName = None - userAddress = None - - if referenceData: - instanceId = referenceData['instanceId'] - if instanceId == docManager.getServerUrl(False, request): - fileKey = json.loads(referenceData['fileKey']) - userAddress = fileKey['userAddress'] - if userAddress == request.META['REMOTE_ADDR']: - fileName = fileKey['fileName'] - - if fileName is None and userAddress is not None: - try: - path = fileUtils.getFileName(body['path']) - if os.path.exists(docManager.getStoragePath(path,request)): - fileName = path - except KeyError: - response.setdefault('error', 'Path not found') - return HttpResponse(json.dumps(response), content_type='application/json', status=404) - - if fileName is None: - response.setdefault('error', 'File not found') - return HttpResponse(json.dumps(response), content_type='application/json', status=404) - - data = { - 'fileType' : fileUtils.getFileExt(fileName), - 'url' : docManager.getDownloadUrl(fileName, request), - 'directUrl' : docManager.getDownloadUrl(fileName, request) if body["directUrl"] else docManager.getDownloadUrl(fileName, request, False), - 'referenceData' : { - 'instanceId' : docManager.getServerUrl(False, request), - 'fileKey' : json.dumps({'fileName' : fileName, 'userAddress': request.META['REMOTE_ADDR']}) - }, - 'path' : fileName - } - - if (jwtManager.isEnabled()): - data['token'] = jwtManager.encode(data) - - return HttpResponse(json.dumps(data), content_type='application/json') except Exception: - response.setdefault('error', 'Reference data is not correct') + pass + + if referenceData is not None: + instanceId = referenceData['instanceId'] + if instanceId == docManager.getServerUrl(False, request): + fileKey = json.loads(referenceData['fileKey']) + userAddress = fileKey['userAddress'] + if userAddress == request.META['REMOTE_ADDR']: + fileName = fileKey['fileName'] + + if fileName is None: + try: + path = fileUtils.getFileName(body['path']) + if os.path.exists(docManager.getStoragePath(path,request)): + fileName = path + except KeyError: + response.setdefault('error', 'Path not found') + return HttpResponse(json.dumps(response), content_type='application/json', status=404) + + if fileName is None: + response.setdefault('error', 'File not found') return HttpResponse(json.dumps(response), content_type='application/json', status=404) + + data = { + 'fileType' : fileUtils.getFileExt(fileName), + 'url' : docManager.getDownloadUrl(fileName, request), + 'directUrl' : docManager.getDownloadUrl(fileName, request) if body["directUrl"] else docManager.getDownloadUrl(fileName, request, False), + 'referenceData' : { + 'instanceId' : docManager.getServerUrl(False, request), + 'fileKey' : json.dumps({'fileName' : fileName, 'userAddress': request.META['REMOTE_ADDR']}) + }, + 'path' : fileName + } + + if (jwtManager.isEnabled()): + data['token'] = jwtManager.encode(data) + + return HttpResponse(json.dumps(data), content_type='application/json') From d23e139272e059924dfe6abe558c72cddb6c61ce Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 21 Feb 2023 09:29:52 +0300 Subject: [PATCH 20/29] csharp: fix - search for filename by path --- .../csharp/WebEditor.ashx.cs | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 4fd063f02..1595977f6 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -433,34 +433,39 @@ private static void Reference(HttpContext context) var jss = new JavaScriptSerializer(); var body = jss.Deserialize>(fileData); - var referenceData = jss.Deserialize > (jss.Serialize(body["referenceData"])); - var instanceId = (string)referenceData["instanceId"]; - var fileKey = (string)referenceData["fileKey"]; + Dictionary referenceData = null; var fileName = ""; var userAddress = ""; - if (instanceId == _Default.GetServerUrl(false)) + if (body.ContainsKey("referenceData")) { - var fileKeyObj = jss.Deserialize>(fileKey); - userAddress = (string)fileKeyObj["userAddress"]; - if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + referenceData = jss.Deserialize>(jss.Serialize(body["referenceData"])); + var instanceId = (string)referenceData["instanceId"]; + var fileKey = (string)referenceData["fileKey"]; + if (instanceId == _Default.GetServerUrl(false)) { - fileName = (string)fileKeyObj["fileName"]; + var fileKeyObj = jss.Deserialize>(fileKey); + userAddress = (string)fileKeyObj["userAddress"]; + if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + { + fileName = (string)fileKeyObj["fileName"]; + } } } - if (fileName == "" && userAddress != "") + if (fileName != "") { try { var path = (string)body["path"]; path = Path.GetFileName(path); - if (File.Exists(_Default.StoragePath(path, userAddress))) + if (File.Exists(_Default.StoragePath(path, null))) { fileName = path; } } - catch { + catch + { context.Response.Write("{ \"error\": \"Path not found!\"}"); return; } @@ -484,7 +489,7 @@ private static void Reference(HttpContext context) }) }, {"instanceId", _Default.GetServerUrl(false) } - } + } }, { "path", fileName } }; @@ -496,7 +501,6 @@ private static void Reference(HttpContext context) } context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); - } } } \ No newline at end of file From 4f26ff64c6e1675012a3b25999abc14832ac5113 Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 21 Feb 2023 09:31:50 +0300 Subject: [PATCH 21/29] csharp-mvc: fix - search for filename by path --- .../csharp-mvc/WebEditor.ashx.cs | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index 28b1f31c9..9e14add42 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -614,29 +614,33 @@ private static void Reference(HttpContext context) var jss = new JavaScriptSerializer(); var body = jss.Deserialize>(fileData); - var referenceData = jss.Deserialize>(jss.Serialize(body["referenceData"])); - var instanceId = (string)referenceData["instanceId"]; - var fileKey = (string)referenceData["fileKey"]; + Dictionary referenceData = null; var fileName = ""; var userAddress = ""; - if (instanceId == _Default.GetServerUrl(false)) + if (body.ContainsKey("referenceData")) { - var fileKeyObj = jss.Deserialize>(fileKey); - userAddress = (string)fileKeyObj["userAddress"]; - if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + referenceData = jss.Deserialize>(jss.Serialize(body["referenceData"])); + var instanceId = (string)referenceData["instanceId"]; + var fileKey = (string)referenceData["fileKey"]; + if (instanceId == _Default.GetServerUrl(false)) { - fileName = (string)fileKeyObj["fileName"]; + var fileKeyObj = jss.Deserialize>(fileKey); + userAddress = (string)fileKeyObj["userAddress"]; + if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + { + fileName = (string)fileKeyObj["fileName"]; + } } } - if (fileName == "" && userAddress != "") + if (fileName != "") { try { var path = (string)body["path"]; path = Path.GetFileName(path); - if (File.Exists(_Default.StoragePath(path, userAddress))) + if (File.Exists(_Default.StoragePath(path, null))) { fileName = path; } From 4eff2e7d89261b46c40c94fba87d9a9f2a928bcc Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 21 Feb 2023 11:49:42 +0300 Subject: [PATCH 22/29] ruby: fix - search for filename by path --- .../ruby/app/controllers/home_controller.rb | 76 +++++++++---------- .../ruby/app/models/file_model.rb | 7 +- 2 files changed, 36 insertions(+), 47 deletions(-) diff --git a/web/documentserver-example/ruby/app/controllers/home_controller.rb b/web/documentserver-example/ruby/app/controllers/home_controller.rb index 82c8d2e58..d40c3970f 100755 --- a/web/documentserver-example/ruby/app/controllers/home_controller.rb +++ b/web/documentserver-example/ruby/app/controllers/home_controller.rb @@ -366,55 +366,49 @@ def rename #ReferenceData def reference - begin - body = JSON.parse(request.body.read) - referenceData = body["referenceData"] + body = JSON.parse(request.body.read) + fileName = "" + - if referenceData != nil - instanceId = referenceData["instanceId"] - if instanceId == DocumentHelper.get_server_url(false) - fileKey = JSON.parse(referenceData["fileKey"]) - userAddress = fileKey["userAddress"] - if userAddress == DocumentHelper.cur_user_host_address(nil) - fileName = fileKey["fileName"] - end + if body.key?("referenceData") + referenceData = body["referenceData"] + instanceId = referenceData["instanceId"] + if instanceId == DocumentHelper.get_server_url(false) + fileKey = JSON.parse(referenceData["fileKey"]) + userAddress = fileKey["userAddress"] + if userAddress == DocumentHelper.cur_user_host_address(nil) + fileName = fileKey["fileName"] end end + end - if (!defined?(fileName) && defined?(userAddress)) - begin - path = File.basename(body["path"]) - if File.exists?(DocumentHelper.storage_path(path, nil)) - fileName = path - end - rescue => ex - render plain: '{ "error": "' + ex.message + '"}' - end + if fileName.empty? and body.key?("path") + path = File.basename(body["path"]) + if File.exist?(DocumentHelper.storage_path(path, nil)) + fileName = path end + end - if !defined?(fileName) - render plain: '{ "error": "File not found"}' - return - end + if fileName.empty? + render plain: '{ "error": "File not found"}' + return + end - data = { - :fileType => DocumentHelper.get_internal_extension(fileName), - :url => DocumentHelper.get_download_url(fileName), - :directUrl => body["directUrl"] ? DocumentHelper.get_download_url(fileName) : DocumentHelper.get_download_url(fileName,false), - :referenceData => { - :instanceId => DocumentHelper.get_server_url(false), - :fileKey => fileKey.to_json - }, - :path => fileName - } - - if JwtHelper.is_enabled - data["token"] = JwtHelper.encode(data) - end + data = { + :fileType => DocumentHelper.get_internal_extension(fileName), + :url => DocumentHelper.get_download_url(fileName), + :directUrl => body["directUrl"] ? DocumentHelper.get_download_url(fileName) : DocumentHelper.get_download_url(fileName,false), + :referenceData => { + :instanceId => DocumentHelper.get_server_url(false), + :fileKey => {:fileName => fileName,:userAddress => DocumentHelper.cur_user_host_address(nil)}.to_json + }, + :path => fileName + } - render plain: data.to_json - rescue => ex - render plain: '{ "error": "' + ex.message + '"}' + if JwtHelper.is_enabled + data["token"] = JwtHelper.encode(data) end + + render plain: data.to_json end end \ No newline at end of file diff --git a/web/documentserver-example/ruby/app/models/file_model.rb b/web/documentserver-example/ruby/app/models/file_model.rb index 24e61d8aa..3671b8237 100755 --- a/web/documentserver-example/ruby/app/models/file_model.rb +++ b/web/documentserver-example/ruby/app/models/file_model.rb @@ -105,11 +105,6 @@ def get_config } ] - fileKey = { - :fileName => @file_name, - :userAddress => DocumentHelper.cur_user_host_address(nil) - } - config = { :type => type(), :documentType => document_type, @@ -141,7 +136,7 @@ def get_config }, :referenceData => { :instanceId => DocumentHelper.get_server_url(false), - :fileKey => !@user.id.eql?("uid-0") ? fileKey.to_json : nil + :fileKey => !@user.id.eql?("uid-0") ? {:fileName => @file_name,:userAddress => DocumentHelper.cur_user_host_address(nil)}.to_json : nil } }, :editorConfig => { From 21d1fd962fd4d902e31e42993054f0c77e0e3bea Mon Sep 17 00:00:00 2001 From: rivexe Date: Tue, 21 Feb 2023 14:42:20 +0300 Subject: [PATCH 23/29] java: fix - search for filename by path --- .../main/java/controllers/IndexServlet.java | 44 ++++++++++++------- .../java/src/main/webapp/editor.jsp | 1 - 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java index fff229386..422064cce 100755 --- a/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java +++ b/web/documentserver-example/java/src/main/java/controllers/IndexServlet.java @@ -645,31 +645,39 @@ private static void reference(final HttpServletRequest request, scanner.useDelimiter("\\A"); String bodyString = scanner.hasNext() ? scanner.next() : ""; scanner.close(); - Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - - JSONParser parser = new JSONParser(); - JSONObject body = (JSONObject) parser.parse(bodyString); - JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); - String instanceId = (String) referenceDataObj.get("instanceId"); String fileKeyValue = ""; String userAddress = ""; String fileName = ""; + boolean incorrectFileKey = false; + + JSONParser parser = new JSONParser(); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); + JSONObject body = (JSONObject) parser.parse(bodyString); - if (instanceId.equals(DocumentManager.getServerUrl(false))) { - JSONObject fileKey = (JSONObject) referenceDataObj.get("fileKey"); - fileKeyValue = gson.toJson(fileKey); - userAddress = (String) fileKey.get("userAddress"); - if (userAddress.equals(DocumentManager.curUserHostAddress(null))) { - fileName = (String) fileKey.get("fileName"); + if (body.containsKey("referenceData")) { + JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); + String instanceId = (String) referenceDataObj.get("instanceId"); + + if (instanceId.equals(DocumentManager.getServerUrl(false))) { + try { + JSONObject fileKey = (JSONObject) parser.parse((String) referenceDataObj.get("fileKey")); + userAddress = (String) fileKey.get("userAddress"); + + if (userAddress.equals(DocumentManager.curUserHostAddress(null))) { + fileName = (String) fileKey.get("fileName"); + } + } catch (Exception e) { + incorrectFileKey = true; //data from DocEditor can give incorrect fileKey param in java Example + } } } - if (fileName.equals("") && !userAddress.equals("")) { + if (fileName.equals("")) { try { String path = (String) body.get("path"); path = FileUtility.getFileName(path); - File f = new File(DocumentManager.storagePath(path, userAddress)); + File f = new File(DocumentManager.storagePath(path, null)); if (f.exists()) { fileName = path; } @@ -684,16 +692,20 @@ private static void reference(final HttpServletRequest request, return; } + HashMap fileKey = new HashMap<>(); + fileKey.put("fileName", fileName); + fileKey.put("userAddress", DocumentManager.curUserHostAddress(null)); + HashMap referenceData = new HashMap<>(); referenceData.put("instanceId", DocumentManager.getServerUrl(false)); - referenceData.put("fileKey", fileKeyValue); + referenceData.put("fileKey", gson.toJson(fileKey)); HashMap data = new HashMap<>(); data.put("fileType", FileUtility.getFileExtension(fileName)); data.put("url", DocumentManager.getDownloadUrl(fileName, true)); data.put("directUrl", DocumentManager.getDownloadUrl(fileName, true)); data.put("referenceData", referenceData); - data.put("path", referenceData); + data.put("path", fileName); if (DocumentManager.tokenEnabled()) { String token = DocumentManager.createToken(data); diff --git a/web/documentserver-example/java/src/main/webapp/editor.jsp b/web/documentserver-example/java/src/main/webapp/editor.jsp index 813220c02..331f9430b 100644 --- a/web/documentserver-example/java/src/main/webapp/editor.jsp +++ b/web/documentserver-example/java/src/main/webapp/editor.jsp @@ -162,7 +162,6 @@ }; var onRequestReferenceData = function(event) { // user refresh external data source - event.data.directUrl = !!config.document.directUrl; let xhr = new XMLHttpRequest(); xhr.open("POST", "IndexServlet?type=reference"); From 61d64e909b237701ab1e445fb11143103158462d Mon Sep 17 00:00:00 2001 From: rivexe Date: Wed, 22 Feb 2023 12:22:41 +0300 Subject: [PATCH 24/29] java-spring: fix - search for filename by path --- .../controllers/FileController.java | 32 ++++++++++++------- .../models/filemodel/Document.java | 4 ++- .../DefaultDocumentConfigurer.java | 19 +++++++++++ .../wrappers/DefaultDocumentWrapper.java | 2 ++ 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java index c1e5a0d22..96a7784c4 100755 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/controllers/FileController.java @@ -454,23 +454,27 @@ public String rename(@RequestBody final JSONObject body) { @ResponseBody public String reference(@RequestBody final JSONObject body) { try { - JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); + Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - String instanceId = (String) referenceDataObj.get("instanceId"); - String fileKeyValue = ""; + String userAddress = ""; String fileName = ""; - if (instanceId.equals(storagePathBuilder.getServerUrl(false))) { - JSONObject fileKey = (JSONObject) referenceDataObj.get("fileKey"); - fileKeyValue = gson.toJson(fileKey); - userAddress = (String) fileKey.get("userAddress"); - if (userAddress.equals(InetAddress.getLocalHost().getHostAddress())) { - fileName = (String) fileKey.get("fileName"); + if (body.containsKey("referenceData")) { + JSONObject referenceDataObj = (JSONObject) body.get("referenceData"); + String instanceId = (String) referenceDataObj.get("instanceId"); + + if (instanceId.equals(storagePathBuilder.getServerUrl(false))) { + JSONObject fileKey = (JSONObject) referenceDataObj.get("fileKey"); + userAddress = (String) fileKey.get("userAddress"); + if (userAddress.equals(InetAddress.getLocalHost().getHostAddress())) { + fileName = (String) fileKey.get("fileName"); + } } } - if (fileName.equals("") && !userAddress.equals("")) { + + if (fileName.equals("")) { try { String path = (String) body.get("path"); path = fileUtility.getFileName(path); @@ -487,16 +491,20 @@ public String reference(@RequestBody final JSONObject body) { return "{ \"error\": \"File not found\"}"; } + HashMap fileKey = new HashMap<>(); + fileKey.put("fileName", fileName); + fileKey.put("userAddress", InetAddress.getLocalHost().getHostAddress()); + HashMap referenceData = new HashMap<>(); referenceData.put("instanceId", storagePathBuilder.getServerUrl(true)); - referenceData.put("fileKey", fileKeyValue); + referenceData.put("fileKey", fileKey); HashMap data = new HashMap<>(); data.put("fileType", fileUtility.getFileExtension(fileName)); data.put("url", documentManager.getDownloadUrl(fileName, true)); data.put("directUrl", documentManager.getDownloadUrl(fileName, true)); data.put("referenceData", referenceData); - data.put("path", referenceData); + data.put("path", fileName); if (jwtManager.tokenEnabled()) { String token = jwtManager.createToken(data); diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java index 45319043f..b9a3d4de5 100755 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/documentserver/models/filemodel/Document.java @@ -26,6 +26,8 @@ import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; +import java.util.HashMap; + @Component @Scope("prototype") @Getter @@ -44,5 +46,5 @@ public class Document { // the parameters pertaining to the document (title, ur as file name when the document is downloaded */ private String url; // the absolute URL where the source viewed or edited document is stored private String directUrl; - private ReferenceData referenceData; + private HashMap referenceData; } diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/implementations/DefaultDocumentConfigurer.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/implementations/DefaultDocumentConfigurer.java index 9f5141114..d1203e568 100644 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/implementations/DefaultDocumentConfigurer.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/implementations/DefaultDocumentConfigurer.java @@ -18,8 +18,10 @@ package com.onlyoffice.integration.services.configurers.implementations; +import com.google.gson.Gson; import com.onlyoffice.integration.documentserver.models.filemodel.Document; import com.onlyoffice.integration.documentserver.models.filemodel.Permission; +import com.onlyoffice.integration.documentserver.models.filemodel.ReferenceData; import com.onlyoffice.integration.documentserver.storage.FileStoragePathBuilder; import com.onlyoffice.integration.services.configurers.DocumentConfigurer; import com.onlyoffice.integration.services.configurers.wrappers.DefaultDocumentWrapper; @@ -31,6 +33,8 @@ import org.springframework.stereotype.Service; import java.io.File; +import java.net.InetAddress; +import java.util.HashMap; @Service @Primary @@ -52,6 +56,7 @@ public void configure(final Document document, final DefaultDocumentWrapper wrapper) { // define the document configurer String fileName = wrapper.getFileName(); // get the fileName parameter from the document wrapper Permission permission = wrapper.getPermission(); // get the permission parameter from the document wrapper + //ReferenceData referenceData = wrapper.getReferenceData(); document.setTitle(fileName); // set the title to the document config @@ -71,7 +76,21 @@ public void configure(final Document document, + "/" + fileName + "/" + new File(storagePathBuilder.getFileLocation(fileName)).lastModified()); + Gson gson = new Gson(); + HashMap fileKey = new HashMap<>(); + fileKey.put("fileName", fileName); + try { + fileKey.put("userAddress", InetAddress.getLocalHost().getHostAddress()); + } catch (Exception e) + { + e.printStackTrace(); + } + HashMap referenceData = new HashMap<>(); + referenceData.put("instanceId", storagePathBuilder.getServerUrl(true)); + referenceData.put("fileKey", gson.toJson(fileKey)); + document.setKey(key); // set the key to the document config document.setPermissions(permission); // set the permission parameters to the document config + document.setReferenceData(referenceData); } } diff --git a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/wrappers/DefaultDocumentWrapper.java b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/wrappers/DefaultDocumentWrapper.java index 919e5e33e..1940a4378 100644 --- a/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/wrappers/DefaultDocumentWrapper.java +++ b/web/documentserver-example/java-spring/src/main/java/com/onlyoffice/integration/services/configurers/wrappers/DefaultDocumentWrapper.java @@ -19,6 +19,7 @@ package com.onlyoffice.integration.services.configurers.wrappers; import com.onlyoffice.integration.documentserver.models.filemodel.Permission; +import com.onlyoffice.integration.documentserver.models.filemodel.ReferenceData; import lombok.Builder; import lombok.Getter; @@ -29,4 +30,5 @@ public class DefaultDocumentWrapper { private String fileName; private Boolean favorite; private Boolean isEnableDirectUrl; + private ReferenceData referenceData; } From 82bc0e649675d4630e4d99b22743f01fe9696c09 Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 27 Feb 2023 09:25:32 +0300 Subject: [PATCH 25/29] csharp: unnecessary replace of symbols deleted. --- web/documentserver-example/csharp/WebEditor.ashx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index 1595977f6..da955086f 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -500,7 +500,7 @@ private static void Reference(HttpContext context) data.Add("token", token); } - context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + context.Response.Write(jss.Serialize(data)); } } } \ No newline at end of file From 060f28e404191fd4b6c412a3d7338ef1c39ac8d8 Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 27 Feb 2023 09:30:44 +0300 Subject: [PATCH 26/29] csharp-mvc: unnecessary replace of symbols deleted --- web/documentserver-example/csharp-mvc/WebEditor.ashx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index 9e14add42..4c9c613fe 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -681,7 +681,7 @@ private static void Reference(HttpContext context) data.Add("token", token); } - context.Response.Write(jss.Serialize(data).Replace(@"\u0026", "&")); + context.Response.Write(jss.Serialize(data)); } } From 4fa2049adc2905d9b98ed25590e44e0e16edbe2b Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 27 Feb 2023 10:08:47 +0300 Subject: [PATCH 27/29] csharp-mvc: names of helpers fixed + check of empty filename-string (logical error fixed) --- .../csharp-mvc/Models/FileModel.cs | 4 ++-- .../csharp-mvc/WebEditor.ashx.cs | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/web/documentserver-example/csharp-mvc/Models/FileModel.cs b/web/documentserver-example/csharp-mvc/Models/FileModel.cs index 0c84b7c6c..65791c0d6 100755 --- a/web/documentserver-example/csharp-mvc/Models/FileModel.cs +++ b/web/documentserver-example/csharp-mvc/Models/FileModel.cs @@ -144,9 +144,9 @@ public string GetDocConfig(HttpRequest request, UrlHelper url) { "fileKey", !user.id.Equals("uid-0") ? jss.Serialize(new Dictionary{ {"fileName", FileName}, - {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + {"userAddress", HttpUtility.UrlEncode(DocManagerHelper.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} }) : null }, - {"instanceId", _Default.GetServerUrl(false) } + {"instanceId", DocManagerHelper.GetServerUrl(false) } } }, { diff --git a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs index 4c9c613fe..b5f7137bd 100644 --- a/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp-mvc/WebEditor.ashx.cs @@ -623,24 +623,24 @@ private static void Reference(HttpContext context) referenceData = jss.Deserialize>(jss.Serialize(body["referenceData"])); var instanceId = (string)referenceData["instanceId"]; var fileKey = (string)referenceData["fileKey"]; - if (instanceId == _Default.GetServerUrl(false)) + if (instanceId == DocManagerHelper.GetServerUrl(false)) { var fileKeyObj = jss.Deserialize>(fileKey); userAddress = (string)fileKeyObj["userAddress"]; - if (userAddress == HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) + if (userAddress == HttpUtility.UrlEncode(DocManagerHelper.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))) { fileName = (string)fileKeyObj["fileName"]; } } } - if (fileName != "") + if (fileName == "") { try { var path = (string)body["path"]; path = Path.GetFileName(path); - if (File.Exists(_Default.StoragePath(path, null))) + if (File.Exists(DocManagerHelper.StoragePath(path, null))) { fileName = path; } @@ -660,16 +660,16 @@ private static void Reference(HttpContext context) var data = new Dictionary() { { "fileType", (Path.GetExtension(fileName) ?? "").ToLower() }, - { "url", DocEditor.getDownloadUrl(fileName)}, - { "directUrl", DocEditor.getDownloadUrl(fileName) }, + { "url", DocManagerHelper.GetDownloadUrl(fileName)}, + { "directUrl", DocManagerHelper.GetDownloadUrl(fileName) }, { "referenceData", new Dictionary() { { "fileKey", jss.Serialize(new Dictionary{ {"fileName", fileName}, - {"userAddress", HttpUtility.UrlEncode(_Default.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} + {"userAddress", HttpUtility.UrlEncode(DocManagerHelper.CurUserHostAddress(HttpContext.Current.Request.UserHostAddress))} }) }, - {"instanceId", _Default.GetServerUrl(false) } + {"instanceId", DocManagerHelper.GetServerUrl(false) } } }, { "path", fileName } @@ -685,5 +685,5 @@ private static void Reference(HttpContext context) } } - } + } \ No newline at end of file From 61a8490d4f952a46ec1311de52cd5d95f16eb947 Mon Sep 17 00:00:00 2001 From: rivexe Date: Mon, 27 Feb 2023 10:10:37 +0300 Subject: [PATCH 28/29] csharp: check of empty filename-string (logical error fixed) --- web/documentserver-example/csharp/WebEditor.ashx.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/documentserver-example/csharp/WebEditor.ashx.cs b/web/documentserver-example/csharp/WebEditor.ashx.cs index da955086f..c18e3e8fc 100644 --- a/web/documentserver-example/csharp/WebEditor.ashx.cs +++ b/web/documentserver-example/csharp/WebEditor.ashx.cs @@ -453,7 +453,7 @@ private static void Reference(HttpContext context) } } - if (fileName != "") + if (fileName == "") { try { From 4d4951f184466645a80c52cca4824ca97488d410 Mon Sep 17 00:00:00 2001 From: Sergey Linnik Date: Sat, 18 Feb 2023 14:09:50 +0500 Subject: [PATCH 29/29] referenceData to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be7019726..d1c9ae046 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # Change Log +- referenceData - anonymous can't protect file - separate setting for checking the token in requests - php: linter refactoring