Compare commits

..

24 Commits

Author SHA1 Message Date
7d79efe1f1 release/v5.2.0 2018-09-27 19:07:46 +03:00
0245c992a3 nodejs: fillForms only mode 2018-07-20 12:29:50 +03:00
04cad3f10f nodejs: fix unique key 2018-05-24 16:05:44 +03:00
cb60398051 nodejs: correct result 2018-05-24 16:05:44 +03:00
f46b6a7c8c nodejs: fix content type in conversion request 2018-05-24 16:05:14 +03:00
4872a74d13 nodejs: disable cache in ajax 2018-05-24 16:05:06 +03:00
b00ed15051 Java: formating 2018-05-24 16:03:43 +03:00
0cbc290fbe java: using GetServerUrl 2018-05-24 16:03:42 +03:00
cb065bc4db v5.1.4 2018-05-24 15:34:47 +03:00
4712057faa Merge pull request #48 from flaminestone/develop
Thx
2018-05-24 14:21:21 +03:00
2e9842d559 nodejs: jwt in request body 2018-05-11 15:44:27 +03:00
0078c05a74 Add folder for bin files after build and add README.md file 2018-05-03 18:13:56 +03:00
aa8a143338 java: change version 2018-04-27 15:21:00 +03:00
a999b20588 java: fix path separator 2018-04-27 15:20:05 +03:00
cab5f62201 v5.1.3 2018-04-26 18:26:25 +03:00
95d33f3ee7 v5.1.3 2018-04-26 18:23:53 +03:00
83c03c97db php: fix filename in url (178133a292) 2018-04-24 17:42:27 +03:00
7b1c56ea2c php: replace download url 2018-04-24 17:32:31 +03:00
178133a292 php: fix filename in url 2018-04-24 16:55:16 +03:00
f9232788b2 php: using current scheme 2018-04-24 16:54:38 +03:00
c0f8caaf0b nodejs: comment only for spreadsheet editor 2018-04-19 19:06:40 +03:00
fbb23a5872 recognize type of otf 2018-04-16 15:58:00 +03:00
ec764e0f0e OpenDocument template 2018-04-16 15:58:00 +03:00
b039b16fd9 v5.1.2 2018-04-11 14:26:31 +03:00
16 changed files with 140 additions and 57 deletions

View File

@ -0,0 +1,9 @@
FROM ubuntu:16.04
RUN apt-get update && apt-get install -y software-properties-common \
python-software-properties
RUN add-apt-repository -y ppa:webupd8team/java
RUN echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN apt-get update && apt-get install -y oracle-java8-installer \
maven
COPY . /java
CMD mvn -f /java package

View File

@ -0,0 +1,61 @@
## Build instruction
At first, You need to install `oracle-java8-installer`
```
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
```
Edit the **settings.properties** configuration file. Specify the name of your local server with the ONLYOFFICE Document Server installed
```
nano src/main/resources/settings.properties
```
Edit the following lines:
```
files.docservice.url.converter=https://documentserver/ConvertService.ashx
files.docservice.url.tempstorage=https://documentserver/ResourceService.ashx
files.docservice.url.api=https://documentserver/web-apps/apps/api/documents/api.js
files.docservice.url.preloader=https://documentserver/web-apps/apps/api/documents/cache-scripts.html
```
Install Maven:
```
apt-get install maven
```
And build:
```
mvn package
```
After it, all bin files will be passed to `./target` folder
## Build from docker
Edit the **settings.properties** configuration file. Specify the name of your local server with the ONLYOFFICE Document Server installed
```
nano src/main/resources/settings.properties
```
Edit the following lines. You need to change `documentserver` to your documentserver:
```
files.docservice.url.converter=https://documentserver/ConvertService.ashx
files.docservice.url.tempstorage=https://documentserver/ResourceService.ashx
files.docservice.url.api=https://documentserver/web-apps/apps/api/documents/api.js
files.docservice.url.preloader=https://documentserver/web-apps/apps/api/documents/cache-scripts.html
```
Run next command in java example directory:
```
docker build . -t java-example
docker run -it -v $PWD/target:/java/target java-example
```
After it, all bin files will be passed to `./target` folder

View File

@ -4,7 +4,7 @@
<groupId>onlyoffice.com</groupId>
<artifactId>OnlineEditorsExampleJava</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.0</version>
<packaging>war</packaging>
<name>OnlineEditorsExampleJava</name>

View File

@ -56,7 +56,7 @@ public class IndexServlet extends HttpServlet
{
String action = request.getParameter("type");
if(action == null)
if (action == null)
{
request.getRequestDispatcher("index.jsp").forward(request, response);
return;
@ -249,7 +249,7 @@ public class IndexServlet extends HttpServlet
long status = (long) jsonObj.get("status");
int saved = 0;
if(status == 2 || status == 3)//MustSave, Corrupted
if (status == 2 || status == 3)//MustSave, Corrupted
{
String downloadUri = (String) jsonObj.get("url");

View File

@ -117,7 +117,7 @@ public class DocumentManager
String storagePath = ConfigManager.GetProperty("storage-folder");
String hostAddress = CurUserHostAddress(userAddress);
String directory = serverPath + "\\" + storagePath + "\\";
String directory = serverPath + File.separator + storagePath + File.separator;
File file = new File(directory);
@ -126,7 +126,7 @@ public class DocumentManager
file.mkdir();
}
directory = directory + hostAddress + "\\";
directory = directory + hostAddress + File.separator;
file = new File(directory);
if (!file.exists())
@ -181,7 +181,7 @@ public class DocumentManager
{
try
{
String serverPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
String serverPath = GetServerUrl();
String storagePath = ConfigManager.GetProperty("storage-folder");
String hostAddress = CurUserHostAddress(null);
@ -197,12 +197,12 @@ public class DocumentManager
public static String GetServerUrl()
{
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
}
public static String GetCallback(String fileName)
{
String serverPath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
String serverPath = GetServerUrl();
String hostAddress = CurUserHostAddress(null);
try
{

View File

@ -231,6 +231,7 @@ app.get("/convert", function (req, res) {
if (error != null)
result["error"] = error;
response.setHeader("Content-Type", "application/json");
response.write(JSON.stringify(result));
response.end();
};
@ -270,7 +271,7 @@ app.get("/convert", function (req, res) {
fileSystem.renameSync(path.join(correctHistoryPath, fileName + ".txt"), path.join(correctHistoryPath, correctName + ".txt"));
writeResult(correctName, null, null);
writeResult(correctName, result, null);
} catch (e) {
console.log(e);
writeResult(null, null, "Server error");
@ -279,7 +280,11 @@ app.get("/convert", function (req, res) {
try {
if (configServer.get('convertedDocs').indexOf(fileExt) != -1) {
const key = documentService.generateRevisionId(fileUri);
let storagePath = docManager.storagePath(fileName);
const stat = fileSystem.statSync(storagePath);
let key = fileUri + stat.mtime.getTime();
key = documentService.generateRevisionId(key);
documentService.getConvertedUri(fileUri, fileExt, internalFileExt, key, true, callback);
} else {
writeResult(fileName, null, null);
@ -469,25 +474,32 @@ app.post("/track", function (req, res) {
//checkjwt
if (cfgSignatureEnable && cfgSignatureUseForRequest) {
var checkJwtHeaderRes = documentService.checkJwtHeader(req);
if (checkJwtHeaderRes) {
var body;
if (checkJwtHeaderRes.payload) {
body = checkJwtHeaderRes.payload;
}
if (checkJwtHeaderRes.query) {
if (checkJwtHeaderRes.query.useraddress) {
userAddress = checkJwtHeaderRes.query.useraddress;
}
if (checkJwtHeaderRes.query.filename) {
fileName = fileUtility.getFileName(checkJwtHeaderRes.query.filename);
}
}
processTrack(res, body, fileName, userAddress);
var body = null;
if (req.body.hasOwnProperty("token")) {
body = documentService.readToken(req.body.token);
} else {
var checkJwtHeaderRes = documentService.checkJwtHeader(req);
if (checkJwtHeaderRes) {
var body;
if (checkJwtHeaderRes.payload) {
body = checkJwtHeaderRes.payload;
}
if (checkJwtHeaderRes.query) {
if (checkJwtHeaderRes.query.useraddress) {
userAddress = checkJwtHeaderRes.query.useraddress;
}
if (checkJwtHeaderRes.query.filename) {
fileName = fileUtility.getFileName(checkJwtHeaderRes.query.filename);
}
}
}
}
if (body == null) {
res.write("{\"error\":1}");
res.end();
return;
}
processTrack(res, body, fileName, userAddress);
return;
}
@ -522,7 +534,7 @@ app.get("/editor", function (req, res) {
var fileName = fileUtility.getFileName(req.query.fileName);
var key = docManager.getKey(fileName);
var url = docManager.getFileUri(fileName);
var mode = req.query.mode || "edit"; //mode: view/edit/review/comment/embedded
var mode = req.query.mode || "edit"; //mode: view/edit/review/comment/fillForms/embedded
var type = req.query.type || ""; //type: embedded/mobile/desktop
if (type == "") {
type = new RegExp(configServer.get("mobileRegEx"), "i").test(req.get('User-Agent')) ? "mobile" : "desktop";
@ -601,7 +613,8 @@ app.get("/editor", function (req, res) {
callbackUrl: docManager.getCallback(fileName),
isEdit: canEdit && (mode == "edit" || mode == "filter"),
review: mode == "edit" || mode == "review",
comment: mode != "view" && mode != "embedded",
comment: mode != "view" && mode != "fillForms" && mode != "embedded",
fillForms: mode != "view" && mode != "comment" && mode != "embedded",
modifyFilter: mode != "filter",
mode: canEdit && mode != "view" ? "edit" : "view",
canBackToFolder: type != "embedded",

View File

@ -304,7 +304,7 @@ docManager.getKey = function (fileName) {
let storagePath = docManager.storagePath(fileName, userAddress);
const stat = fileSystem.statSync(storagePath);
key += stat.mtime.toString();
key += stat.mtime.getTime();
return documentService.generateRevisionId(key);
};

View File

@ -46,8 +46,6 @@ var documentService = {};
documentService.userIp = null;
documentService.getConvertedUriSync = function (documentUri, fromExtension, toExtension, documentRevisionId, callback) {
documentRevisionId = documentService.generateRevisionId(documentRevisionId || documentUri);
documentService.getConvertedUri(documentUri, fromExtension, toExtension, documentRevisionId, false, function (err, data) {
if (err) {
callback();
@ -82,6 +80,7 @@ documentService.getConvertedUri = function (documentUri, fromExtension, toExtens
if (cfgSignatureEnable && cfgSignatureUseForRequest) {
headers[cfgSignatureAuthorizationHeader] = cfgSignatureAuthorizationHeaderPrefix + this.fillJwtByUrl(uri, params);
params.token = documentService.getToken(params);
}
urllib.request(uri,
@ -185,6 +184,7 @@ documentService.commandRequest = function (method, documentRevisionId, callback)
};
if (cfgSignatureEnable && cfgSignatureUseForRequest) {
headers[cfgSignatureAuthorizationHeader] = cfgSignatureAuthorizationHeaderPrefix + this.fillJwtByUrl(uri, params);
params.token = documentService.getToken(params);
}
urllib.request(uri,
@ -218,4 +218,18 @@ documentService.fillJwtByUrl = function (uri, opt_dataObject, opt_iss, opt_paylo
return jwt.sign(payload, cfgSignatureSecret, options);
}
documentService.getToken = function (data) {
var options = {algorithm: cfgSignatureSecretAlgorithmRequest, expiresIn: cfgSignatureSecretExpiresIn};
return jwt.sign(data, cfgSignatureSecret, options);
};
documentService.readToken = function (token) {
try {
return jwt.verify(token, cfgSignatureSecret);
} catch (err) {
console.log('checkJwtHeader error: name = ' + err.name + ' message = ' + err.message + ' token = ' + token)
}
return null;
};
module.exports = documentService;

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

View File

@ -136,10 +136,9 @@ if (typeof jQuery != "undefined") {
timer = setTimeout(function () {
var requestAddress = UrlConverter + "?filename=" + encodeURIComponent(jq("#hiddenFileName").val());
jq.ajaxSetup({ cache: false });
jq.ajax({
async: true,
contentType: "text/xml",
type: "get",
url: requestAddress,
complete: function (data) {

View File

@ -16,6 +16,7 @@
"comment": <%- editor.comment %>,
"download": true,
"edit": <%- editor.isEdit %>,
"fillForms": <%- editor.fillForms %>,
"modifyFilter": <%- editor.modifyFilter %>,
"review": <%- editor.review %>
}

View File

@ -130,7 +130,7 @@
<thead>
<tr class="tableHeader">
<td class="tableHeaderCell tableHeaderCellFileName">Filename</td>
<td colspan="4" class="tableHeaderCell contentCells-shift">Editors</td>
<td colspan="5" class="tableHeaderCell contentCells-shift">Editors</td>
<td colspan="3" class="tableHeaderCell">Viewers</td>
</tr>
</thead>
@ -163,14 +163,18 @@
<img src="images/filter-24.png" alt="Open in editor without access to change the filter" title="Open in editor without access to change the filter" /></a>
<% } %>
</td>
<td class="contentCells contentCells-shift contentCells-icon">
<% if (storedFiles[i].documentType == "text" || storedFiles[i].documentType == "presentation") { %>
<td class="contentCells contentCells-icon">
<a href="editor?type=desktop&mode=comment&fileName=<%= encodeURIComponent(storedFiles[i].name) + params %>" target="_blank">
<img src="images/comment-24.png" alt="Open in editor for comment" title="Open in editor for comment" /></a>
</td>
<td class="contentCells contentCells-shift contentCells-icon">
<% if (storedFiles[i].documentType == "text") { %>
<a href="editor?type=desktop&mode=fillForms&fileName=<%= encodeURIComponent(storedFiles[i].name) + params %>" target="_blank">
<img src="images/fill-forms-24.png" alt="Open in editor for filling in forms" title="Open in editor for filling in forms" /></a>
<% } %>
</td>
<% } else { %>
<td class="contentCells contentCells-shift contentCells-icon" colspan="4"></td>
<td class="contentCells contentCells-shift contentCells-icon" colspan="5"></td>
<% } %>
<td class="contentCells contentCells-icon">
<a href="editor?type=desktop&mode=view&fileName=<%= encodeURIComponent(storedFiles[i].name) + params %>" target="_blank">

View File

@ -150,7 +150,7 @@ function getClientIp() {
function serverPath($forDocumentServer = NULL) {
return $forDocumentServer && isset($GLOBALS['EXAMPLE_URL']) && $GLOBALS['EXAMPLE_URL'] != ""
? $GLOBALS['EXAMPLE_URL']
: ('http://' . $_SERVER['HTTP_HOST']);
: (getScheme() . '://' . $_SERVER['HTTP_HOST']);
}
function getCurUserHostAddress($userAddress = NULL) {
@ -257,7 +257,7 @@ function getVirtualPath($forDocumentServer) {
}
function FileUri($file_name, $forDocumentServer = NULL) {
$uri = getVirtualPath($forDocumentServer) . $file_name;
$uri = getVirtualPath($forDocumentServer) . rawurlencode($file_name);
return $uri;
}

View File

@ -177,7 +177,7 @@
echo ' <a class="stored-edit '.$storeFile->documentType.'" href="doceditor.php?fileID='.urlencode($storeFile->name).'&user='.$user.'" target="_blank">';
echo ' <span title="'.$storeFile->name.'">'.$storeFile->name.'</span>';
echo ' </a>';
echo ' <a href="webeditor-ajax.php?type=download&filename='.$storeFile->name.'">';
echo ' <a href="'.FileUri($storeFile->name).'">';
echo ' <img class="icon-download" src="css/images/download-24.png" alt="Download" title="Download" /></a>';
echo ' </a>';
echo ' <a class="delete-file" data="'.$storeFile->name.'">';

View File

@ -61,9 +61,6 @@ if (isset($_GET["type"]) && !empty($_GET["type"])) { //Checks if type value exis
$response_array = upload();
$response_array['status'] = isset($response_array['error']) ? 'error' : 'success';
die (json_encode($response_array));
case "download":
download();
exit;
case "convert":
$response_array = convert();
$response_array['status'] = 'success';
@ -128,21 +125,6 @@ function upload() {
return $result;
}
function download() {
$fileName = $_GET["filename"];
$filePath = getStoragePath($fileName);
if (!file_exists($filePath)) {
http_response_code(404);
return;
}
header("Content-Length: " . filesize($filePath));
header("Content-Type: " . mime_content_type($fileName));
header("Content-Disposition: attachment; filename=\"".basename($filePath)."\"");
readfile($filePath);
}
function track() {
sendlog("Track START", "webedior-ajax.log");
sendlog("_GET params: " . serialize( $_GET ), "webedior-ajax.log");