From e85e625e55bcfbfc0080f2ba22c4400c0c0c197b Mon Sep 17 00:00:00 2001 From: Alexander Hofbauer Date: Mon, 30 Mar 2020 17:44:55 +0200 Subject: [PATCH] Add Dockerfile and components --- Dockerfile | 37 +++++++++++++++++++++++ README.md | 36 ++++++++++++++++++++++ license.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ run-oo.sh | 10 +++++++ 4 files changed, 170 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 license.py create mode 100644 run-oo.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..880b047 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,37 @@ +ARG oo_version=5.5.0.165 +FROM onlyoffice/documentserver:$oo_version + + +RUN sed -is \ + 's/isSupportEditFeature:function(){return!1}/isSupportEditFeature:function(){return true}/g' \ + /var/www/onlyoffice/documentserver/web-apps/apps/documenteditor/mobile/app.js + +RUN sed -is \ + 's/isSupportEditFeature:function(){return!1}/isSupportEditFeature:function(){return true}/g' \ + /var/www/onlyoffice/documentserver/web-apps/apps/presentationeditor/mobile/app.js + +RUN sed -is \ + 's/isSupportEditFeature:function(){return!1}/isSupportEditFeature:function(){return true}/g' \ + /var/www/onlyoffice/documentserver/web-apps/apps/spreadsheeteditor/mobile/app.js + + +RUN apt-get update && apt-get install -y \ + python3-pip \ + && rm -rf /var/lib/apt/lists/* \ + && pip3 install pycryptodome + + +COPY license.py /tmp/ +RUN python3 /tmp/license.py + +RUN pip3 uninstall -y pycryptodome \ + && apt-get purge -y python3-pip \ + && apt-get purge -y --autoremove \ + && rm -rf /var/lib/apt/lists/* + + +COPY run-oo.sh /usr/local/bin/run-oo.sh +RUN chmod a+x /usr/local/bin/run-oo.sh + + +ENTRYPOINT [ "/usr/local/bin/run-oo.sh" ] diff --git a/README.md b/README.md new file mode 100644 index 0000000..ffd3533 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +# OnlyOffice Community server with license + +## Usage + +```sh +docker build \ + --tag=onlyoffice-patched \ + https://github.com/aleho/onlyoffice-ce-docker-license.git +``` + +```sh +docker run \ + --name=onlyoffice \ + --detach \ + --volume=$(pwd)/ooData:/var/www/onlyoffice/Data onlyoffice-patched \ + onlyoffice-patched +``` + +## Background +Recently, just about a month after Nextcloud announced their partnership with +Ascensio and featuring a community version of OnlyOffice, the latter decided +to remove support for mobile editing of documents via the Nextcloud app. + +This happened without any prior notice and alienated quite a lot of home users, +who would now be forced to pay more than €1.000 to unlock that previously free +feature. Only after some outcries Ascensio deigned to release a statement and +a new, albeit "limited", offer of €90 for home servers. + +In my opinion these deceptive practices are unacceptable for a company +advertising itself and their product as open source . + + +## Thanks + +This repo is heavily inspired by the works of +[Zegorax/OnlyOffice-Unlimited](https://github.com/Zegorax/OnlyOffice-Unlimited). diff --git a/license.py b/license.py new file mode 100644 index 0000000..18dc0d3 --- /dev/null +++ b/license.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 + +from Crypto.Hash import SHA, SHA256 +from Crypto.Signature import PKCS1_v1_5 +from Crypto.PublicKey import RSA +from shutil import copyfile +import json +import codecs + + + +def gen_keys(): + privKey = RSA.generate(1024) + publKey = privKey.publickey().exportKey('PEM') + + f = open("/var/www/onlyoffice/license_key.pub", "w+") + f.write(publKey.decode('utf-8')) + f.close() + + return publKey, privKey + + + +def write_license(publKey, privKey): + license = { + "branding": False, + "connections": 9999, + "customization": False, + "end_date": "2099-01-01T23:59:59.000Z", + "light": "False", + "mode": "", + "portal_count": "0", + "process": 2, + "ssbranding": False, + "test": "False", + "trial": "False", + "user_quota": "0", + "users_count": 9999, + "users_expire": 99999, + "whiteLabel": False, + "customer_id": "customerID", + "start_date": "2020-01-01T00:00:00.000Z", + "users": [], + "version": 2 + } + + jsonData = codecs.encode(json.dumps(license, separators=(',', ':')), encoding='utf-8') + + digest = SHA.new(jsonData) + signer = PKCS1_v1_5.new(privKey) + signature = signer.sign(digest) + finalSignature = signature.hex() + + license['signature'] = finalSignature + + f = open("/var/www/onlyoffice/license.lic", "w+") + f.write(json.dumps(license)) + f.close + + + +def patch_files(): + basePath = "/var/www/onlyoffice/documentserver/server/" + files = ["DocService/docservice", "FileConverter/converter"] + + for file in files: + f = open(basePath + file, 'rb') + data = f.read() + f.close() + + replacedData = data.replace(b"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRhGF7X4A0ZVlEg594WmODVVUI\niiPQs04aLmvfg8SborHss5gQXu0aIdUT6nb5rTh5hD2yfpF2WIW6M8z0WxRhwicg\nXwi80H1aLPf6lEPPLvN29EhQNjBpkFkAJUbS8uuhJEeKw0cE49g80eBBF4BCqSL6\nPFQbP9/rByxdxEoAIQIDAQAB\n-----END PUBLIC KEY-----", bytes(publKey)) + + f = open(basePath + file, 'wb') + f.write(replacedData) + f.close() + + + + +print("Generating and exporting key pair...") +publKey, privKey = gen_keys() + +print("Writing license file...") +write_license(publKey, privKey) + +print("Patching document server and converter...") +patch_files() diff --git a/run-oo.sh b/run-oo.sh new file mode 100644 index 0000000..ed5ad6b --- /dev/null +++ b/run-oo.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash +set -e + + +echo "Providing license" +cp -f /var/www/onlyoffice/license.lic /var/www/onlyoffice/Data/license.lic + +echo "Starting server" +/app/ds/run-document-server.sh +