{"id":37758407,"url":"https://github.com/cs3org/wopiserver","last_synced_at":"2026-01-16T14:33:36.924Z","repository":{"id":37825820,"uuid":"81821180","full_name":"cs3org/wopiserver","owner":"cs3org","description":"A vendor-neutral application gateway compatible with the WOPI specifications.","archived":false,"fork":false,"pushed_at":"2026-01-10T11:06:53.000Z","size":1825,"stargazers_count":69,"open_issues_count":8,"forks_count":27,"subscribers_count":18,"default_branch":"master","last_synced_at":"2026-01-11T03:33:39.298Z","etag":null,"topics":["cernbox","efss-systems","wopi","wopi-server"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cs3org.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-02-13T12:08:14.000Z","updated_at":"2026-01-04T13:34:26.000Z","dependencies_parsed_at":"2024-05-21T10:47:39.779Z","dependency_job_id":"bb0fbd0d-db71-4279-bf5a-9bb6a3d2099f","html_url":"https://github.com/cs3org/wopiserver","commit_stats":null,"previous_names":[],"tags_count":133,"template":false,"template_full_name":null,"purl":"pkg:github/cs3org/wopiserver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cs3org%2Fwopiserver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cs3org%2Fwopiserver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cs3org%2Fwopiserver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cs3org%2Fwopiserver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cs3org","download_url":"https://codeload.github.com/cs3org/wopiserver/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cs3org%2Fwopiserver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cernbox","efss-systems","wopi","wopi-server"],"created_at":"2026-01-16T14:33:36.832Z","updated_at":"2026-01-16T14:33:36.919Z","avatar_url":"https://github.com/cs3org.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n [![Gitter chat](https://badges.gitter.im/cs3org/wopiserver.svg)](https://gitter.im/cs3org/wopiserver)\n [![Build Status](https://github.com/cs3org/wopiserver/actions/workflows/release.yml/badge.svg)](https://github.com/cs3org/wopiserver/actions)\n [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/cs3org/wopiserver)\n==========\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"wopiserver-logo.png\" style=\"max-height: 200px;\" alt=\"Wopiserver Logo\"/\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\n# WOPIServer\n\nThis service is part of the ScienceMesh Interoperability Platform ([IOP](https://developer.sciencemesh.io)) and implements a vendor-neutral application gateway compatible with the Web-application Open Platform Interface ([WOPI](https://docs.microsoft.com/en-us/microsoft-365/cloud-storage-partner-program/online)) specifications.\n\nIt enables ScienceMesh EFSS storages to integrate Office Online platforms including Microsoft Office Online and Collabora Online. In addition it implements a [bridge](src/bridge/readme.md) module with dedicated extensions to support apps like CodiMD and Etherpad.\n\nAuthor: Giuseppe Lo Presti (@glpatcern) \u003cbr/\u003e\nContributors (oldest contributions first):\n- Michael DSilva (@madsi1m)\n- Lovisa Lugnegaard (@LovisaLugnegard)\n- Samuel Alfageme (@SamuAlfageme)\n- Diogo Castro (@diocas)\n- Ishank Arora (@ishank011)\n- Willy Kloucek (@wkloucek)\n- Gianmaria Del Monte (@gmgigi96)\n- Klaas Freitag (@dragotin)\n- Jörn Friedrich Dreyer (@butonic)\n- Michael Barz (@micbar)\n- Robert Kaussow (@xoxys)\n- Javier Ferrer (@javfg)\n- Vasco Guita (@vascoguita)\n- Thomas Mueller (@deepdiver1975)\n- Andre Duffeck (@aduffeck)\n- Rasmus Welander (@rawe0)\n\nInitial revision: December 2016 \u003cbr/\u003e\nFirst production version for CERNBox: September 2017 (presented at [oCCon17](https://occon17.owncloud.org) - [slides](https://www.slideshare.net/giuseppelopresti/collaborative-editing-and-more-in-cernbox))\u003cbr/\u003e\nIntegration in the CS3 Organisation: April 2020\n\n\n## Modules\n\n* [core](src/core/readme.md)\n* [bridge](src/bridge/readme.md)\n\n## Changelog\n\n[Available here](CHANGELOG.md)\n\n## Compatibility\n\nThis WOPI server implements the required APIs to ensure full compatibility with Microsoft Office (as provided via the CSPP Terms), Collabora Online, and ONLYOFFICE.\n\n## Unit testing\n\nThe `/test` folder contains some unit tests for the supported storage interfaces.\nNo tests are provided (yet) for the core WOPI server, though the test suite aims at covering all\nstorage access patterns used by the WOPI server.\n\nBy default, the local storage is tested, and the CI runs it as well (_TODO_ test against Reva in the CI).\nTo run the tests, either run `pytest` if available in your system, or execute the following:\n\n1. Run all tests: `python3 test/test_storageiface.py [-v]`\n2. Run only one test: `python3 test/test_storageiface.py [-v] TestStorage.\u003cthe test you would like to run\u003e`\n\n### Test against a Reva CS3 endpoint:\n\nThe CS3 storage interface uses the [cs3 python client](https://github.com/cs3org/cs3-python-client), please also refer to its test suite and documentation.\n\n1. Clone reva (https://github.com/cs3org/reva)\n2. Run Reva according to \u003chttps://reva.link/docs/tutorials/share-tutorial/\u003e (ie up until step 4 in the instructions)\n3. For a production deployment, configure your `wopiserver.conf` following the example above, and make sure the `iopsecret` file contains the same secret as configured in the [Reva appprovider](https://developer.sciencemesh.io/docs/technical-documentation/iop/iop-optional-configs/collabora-wopi-server/wopiserver)\n4. Configure `test/wopiserver-test.conf` such that the wopiserver can talk to your Reva instance: use [this example](docker/etc/wopiserver.cs3.conf) for a skeleton configuration\n5. Run the tests: `WOPI_STORAGE=cs3 python3 test/test_storageiface.py`\n\n### Test against an Eos endpoint:\n\n1. Make sure your Eos instance is configured to accept connections from WOPI as a privileged gateway\n2. Configure `test/wopiserver-test.conf` according to your Eos setup (the provided defaults are valid at CERN)\n3. Run the tests: `WOPI_STORAGE=xroot python3 test/test_storageiface.py`\n4. For a production deployment (CERN only), configure your `wopiserver.conf` according to the Puppet infrastructure\n\n### Test using the Microsoft WOPI validator test suite\n\nRefer to [these notes](test/wopi-validator.md). Microsoft also provides a graphical version of the test suite\nas part of their Office 365 offer, which is also supported via the Reva open-in-app workflow.\n\n\n## Run the WOPI server locally for development purposes\n\n1. Install all requirements: `pip install -r requirements.txt`\n2. Add log file directory: `sudo mkdir /var/log/wopi/ \u0026\u0026 sudo chmod a+rwx /var/log/wopi`\n3. Create the folder for the wopi config: `sudo mkdir /etc/wopi/ \u0026\u0026 sudo chmod a+rwx /etc/wopi`\n4. Create recoveryfolder: `sudo mkdir /var/spool/wopirecovery \u0026\u0026 sudo chmod a+rwx /var/spool/wopirecovery`\n5. Create the files `iopsecret` and `wopisecret` in the folder `/etc/wopi/`, create random strings for the secrets\n6. Copy the provided [wopiserver.conf](./wopiserver.conf) to `/etc/wopi/wopiserver.defaults.conf`\n7. Create a config file `/etc/wopi/wopiserver.conf`: start from `docker/etc/wopiserver.conf` for a minimal configuration and add from the defaults file as needed\n8. From the WOPI server folder run: `python3 src/wopiserver.py`\n\n### Test the open-in-app workflow on the local WOPI server\n\nOnce the WOPI server runs on top of local storage, the `tools/wopiopen.py` script can be used\nto test the open-in-app workflow.\nFor that, assuming you have e.g. CodiMD deployed in your cluster:\n\n1. Create a `test.md` file in your local storage folder, e.g. `/var/wopi_local_storage`\n2. From the WOPI server folder, execute `tools/wopiopen.py -a CodiMD -i \"internal_CodiMD_URL\" -u \"user_visible_CodiMD_URL\" -k CodiMD_API_Key test.md`\n3. If everything was setup correctly, you'll get a JSON response including an `app-url`. Open it in a browser to access the file. Otherwise, the tool prints the response from the WOPI server and the logs should help troubleshooting the problem.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcs3org%2Fwopiserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcs3org%2Fwopiserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcs3org%2Fwopiserver/lists"}