From 6049a665a41c5bf26b7293c044f99df352d8c8bd Mon Sep 17 00:00:00 2001 From: root Date: Wed, 20 Dec 2023 11:10:17 +0300 Subject: [PATCH] init --- Dockerfile | 59 +++++++++++++++++++++++++++++ README.md | 6 +++ license.py | 73 ++++++++++++++++++++++++++++++++++++ license.sh | 13 +++++++ server.patch | 102 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 253 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 license.py create mode 100755 license.sh create mode 100644 server.patch diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..9cfcb15 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,59 @@ +ARG product_version=7.5.1 +ARG build_number=1 +ARG oo_root='/var/www/onlyoffice/documentserver' +ARG build_deps="git make g++ bzip2 python3-dev python3-pip nodejs npm" + +## Setup +FROM onlyoffice/documentserver:${product_version}.${build_number} as setup-stage +ARG product_version +ARG build_number +ARG oo_root +ARG build_deps + +ENV PRODUCT_VERSION=${product_version} +ENV BUILD_NUMBER=${build_number} + +WORKDIR /build + +RUN apt-get update && \ + apt-get install -y ${build_deps} && \ + npm install -g pkg grunt grunt-cli && \ + rm -rf /var/lib/apt/lists/* + +## Clone +FROM setup-stage as clone-stage +ARG tag=v${PRODUCT_VERSION}.${BUILD_NUMBER} + +RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/build_tools.git /build/build_tools +RUN git clone --quiet --branch $tag --depth 1 https://github.com/ONLYOFFICE/server.git /build/server + +## Build +FROM clone-stage as build-stage + +COPY server.patch /build/server.patch +RUN cd /build/server && \ + git apply --ignore-space-change --ignore-whitespace /build/server.patch + +# build server with license checks patched +WORKDIR /build/server +RUN make +RUN pkg /build/build_tools/out/linux_64/onlyoffice/documentserver/server/FileConverter --targets=node16-linux -o /build/converter +RUN pkg /build/build_tools/out/linux_64/onlyoffice/documentserver/server/DocService --targets=node16-linux --options max_old_space_size=4096 -o /build/docservice + +RUN grunt + +## Final image +FROM onlyoffice/documentserver:${product_version}.${build_number} as image-stage +ARG oo_root + +#server +COPY --from=build-stage /build/converter ${oo_root}/server/FileConverter/converter +COPY --from=build-stage /build/docservice ${oo_root}/server/DocService/docservice + +RUN apt-get update && \ + apt-get install -y python3-dev python3-pip && \ + pip install PyCryptodome + +WORKDIR /license +COPY license.py /license/license.py +COPY license.sh /license/license.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..b69f08f --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +## OnlyOffice Document Server 7.5.1.1 + + +``` +docker build -t onlyoffice/documentserver-unlim:7.5.1.1 . +``` diff --git a/license.py b/license.py new file mode 100644 index 0000000..1c15aec --- /dev/null +++ b/license.py @@ -0,0 +1,73 @@ +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 + +hexlify = codecs.getencoder('hex') + +licenseFile = { + "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 +} + +jsonLicenseFile = codecs.encode(json.dumps(licenseFile, separators=(',', ':')), encoding='utf-8') + +privKey = RSA.generate(1024) +publKey = privKey.publickey().exportKey('PEM') + +digest = SHA.new(jsonLicenseFile) +signer = PKCS1_v1_5.new(privKey) +signature = signer.sign(digest) + +finalSignature = signature.hex() + +licenseFile['signature'] = finalSignature + +f = open("/license/OO_License", "w+") +f.write(json.dumps(licenseFile)) +f.close + +f = open("/license/OO_PubKey", "w+") +f.write(publKey.decode('utf-8')) +f.close() + +print("The license file has been saved to OO_License. Here's the content :") +print(json.dumps(licenseFile)) +print("It will be placed automatically in the Data directory of OnlyOffice") + +copyfile("/license/OO_License", "/var/www/onlyoffice/Data/license.lic") + +print("Patching docservice and convert...") + +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() diff --git a/license.sh b/license.sh new file mode 100755 index 0000000..ddd2fce --- /dev/null +++ b/license.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +FILE=/license/OO_PubKey + +if test -f "$FILE"; then + echo Patch has already been applied. Starting DocumentServer... +else + python3 license.py + echo Patching docservice and convert... + echo Done! Running Document Server... +fi + +/app/ds/run-document-server.sh diff --git a/server.patch b/server.patch new file mode 100644 index 0000000..2263ca0 --- /dev/null +++ b/server.patch @@ -0,0 +1,102 @@ +--- + Common/sources/constants.js | 4 ++-- + Common/sources/license.js | 22 +++++++++++----------- + DocService/sources/server.js | 2 +- + FileConverter/sources/convertermaster.js | 2 +- + Makefile | 2 +- + 5 files changed, 16 insertions(+), 16 deletions(-) + +diff --git a/Common/sources/constants.js b/Common/sources/constants.js +index 3e8e7aaa..d79daf0e 100644 +--- a/Common/sources/constants.js ++++ b/Common/sources/constants.js +@@ -85,8 +85,8 @@ exports.LICENSE_RESULT = { + NotBefore: 16 + }; + +-exports.LICENSE_CONNECTIONS = 20; +-exports.LICENSE_USERS = 3; ++exports.LICENSE_CONNECTIONS = 9999; ++exports.LICENSE_USERS = 99; + exports.LICENSE_EXPIRE_USERS_ONE_DAY = 24 * 60 * 60; // day in seconds + + exports.AVS_OFFICESTUDIO_FILE_UNKNOWN = 0x0000; +diff --git a/Common/sources/license.js b/Common/sources/license.js +index 5df8d693..3fd9de14 100644 +--- a/Common/sources/license.js ++++ b/Common/sources/license.js +@@ -45,24 +45,24 @@ exports.readLicense = function*() { + count: 1, + type: c_LR.Success, + light: false, +- packageType: constants.PACKAGE_TYPE_OS, ++ packageType: constants.PACKAGE_TYPE_I, + mode: constants.LICENSE_MODE.None, +- branding: false, ++ branding: true, + connections: constants.LICENSE_CONNECTIONS, + connectionsView: constants.LICENSE_CONNECTIONS, +- customization: false, +- advancedApi: false, +- usersCount: 0, +- usersViewCount: 0, ++ customization: true, ++ advancedApi: true, ++ usersCount: constants.LICENSE_CONNECTIONS, ++ usersViewCount: constants.LICENSE_CONNECTIONS, + usersExpire: constants.LICENSE_EXPIRE_USERS_ONE_DAY, +- hasLicense: false, +- plugins: false, ++ hasLicense: true, ++ plugins: true, + buildDate: oBuildDate, + startDate: startDate, +- endDate: null, ++ endDate: new Date("2099-01-01T23:59:59.000Z"), + customerId: "", +- alias: "" ++ alias: "community" + }, null]; + }; + +-exports.packageType = constants.PACKAGE_TYPE_OS; ++exports.packageType = constants.PACKAGE_TYPE_I; +diff --git a/DocService/sources/server.js b/DocService/sources/server.js +index 76303af9..9d2e6888 100644 +--- a/DocService/sources/server.js ++++ b/DocService/sources/server.js +@@ -109,7 +109,7 @@ if (!(cfgTokenEnableBrowser && cfgTokenEnableRequestInbox && cfgTokenEnableReque + } + + updateLicense(); +-fs.watchFile(cfgLicenseFile, updateLicense); ++// fs.watchFile(cfgLicenseFile, updateLicense); + setInterval(updateLicense, 86400000); + + if (config.has('services.CoAuthoring.server.static_content')) { +diff --git a/FileConverter/sources/convertermaster.js b/FileConverter/sources/convertermaster.js +index 46615032..6ce2d3e6 100644 +--- a/FileConverter/sources/convertermaster.js ++++ b/FileConverter/sources/convertermaster.js +@@ -92,7 +92,7 @@ if (cluster.isMaster) { + + updateLicense(); + +- fs.watchFile(cfgLicenseFile, updateLicense); ++ // fs.watchFile(cfgLicenseFile, updateLicense); + setInterval(updateLicense, 86400000); + } else { + const converter = require('./converter'); +diff --git a/Makefile b/Makefile +index e8e1308f..23f7e2ef 100644 +--- a/Makefile ++++ b/Makefile +@@ -87,7 +87,7 @@ DEBUG = $(BRANDING_DIR)/debug.js + .PHONY: all clean install uninstall build-date + + .NOTPARALLEL: +-all: $(SPELLCHECKER_DICTIONARIES) $(TOOLS) $(SCHEMA) $(CORE_FONTS) $(DOCUMENT_TEMPLATES) $(LICENSE) $(WELCOME) $(INFO) build-date ++all: $(SCHEMA) $(LICENSE) $(WELCOME) $(INFO) build-date + + build-date: $(GRUNT_FILES) + sed "s|\(const buildVersion = \).*|\1'${PRODUCT_VERSION}';|" -i $(COMMON_DEFINES_JS)