From 9569004c7e4e4232386ab3a6307a794353c8128c Mon Sep 17 00:00:00 2001 From: Holger Brunn Date: Sun, 7 May 2017 19:12:40 +0200 Subject: [PATCH] [ADD] document_wopi --- document_wopi/README.rst | 80 +++++++++++++ document_wopi/__init__.py | 5 + document_wopi/__openerp__.py | 32 +++++ document_wopi/controllers/__init__.py | 4 + document_wopi/controllers/main.py | 102 ++++++++++++++++ document_wopi/data/ir_actions_todo.xml | 10 ++ document_wopi/demo/ir_config_parameter.xml | 9 ++ document_wopi/images/screenshot.png | Bin 0 -> 98642 bytes document_wopi/models/__init__.py | 6 + document_wopi/models/document_wopi.py | 47 ++++++++ .../models/document_wopi_access_token.py | 109 ++++++++++++++++++ .../models/knowledge_config_settings.py | 36 ++++++ document_wopi/security/ir.model.access.csv | 2 + document_wopi/security/ir_rule.xml | 10 ++ document_wopi/static/description/icon.png | Bin 0 -> 9455 bytes .../static/src/css/document_wopi.css | 9 ++ document_wopi/static/src/js/document_wopi.js | 89 ++++++++++++++ .../static/src/xml/document_wopi.xml | 17 +++ document_wopi/tests/__init__.py | 4 + document_wopi/tests/test_document_wopi.py | 56 +++++++++ .../views/knowledge_config_settings.xml | 16 +++ document_wopi/views/templates.xml | 11 ++ 22 files changed, 654 insertions(+) create mode 100644 document_wopi/README.rst create mode 100644 document_wopi/__init__.py create mode 100644 document_wopi/__openerp__.py create mode 100644 document_wopi/controllers/__init__.py create mode 100644 document_wopi/controllers/main.py create mode 100644 document_wopi/data/ir_actions_todo.xml create mode 100644 document_wopi/demo/ir_config_parameter.xml create mode 100644 document_wopi/images/screenshot.png create mode 100644 document_wopi/models/__init__.py create mode 100644 document_wopi/models/document_wopi.py create mode 100644 document_wopi/models/document_wopi_access_token.py create mode 100644 document_wopi/models/knowledge_config_settings.py create mode 100644 document_wopi/security/ir.model.access.csv create mode 100644 document_wopi/security/ir_rule.xml create mode 100644 document_wopi/static/description/icon.png create mode 100644 document_wopi/static/src/css/document_wopi.css create mode 100644 document_wopi/static/src/js/document_wopi.js create mode 100644 document_wopi/static/src/xml/document_wopi.xml create mode 100644 document_wopi/tests/__init__.py create mode 100644 document_wopi/tests/test_document_wopi.py create mode 100644 document_wopi/views/knowledge_config_settings.xml create mode 100644 document_wopi/views/templates.xml diff --git a/document_wopi/README.rst b/document_wopi/README.rst new file mode 100644 index 00000000..abcf08c9 --- /dev/null +++ b/document_wopi/README.rst @@ -0,0 +1,80 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +==== +WOPI +==== + +This module was written to implement the `WOPI protocol `_ in order to allow online collaborative editing and viewing of office files. This works with `LibreOffice online `_/`Collabora online `_ and probably also with Office 365. + +Installation +============ + +To install this module, you need to: + +#. have a WOPI client available. For testing, use one of the `Collabora `_ or `Libreoffice `_ docker images. The first works out of the box, but is rate limited, the second needs manual interaction, but is unmodified. The `Nextcloud documentation `_ contains some information on how to get this running +#. have your instance accessible on port 443 via your WOPI client and should have a valid SSL certificate +#. use a dbfilter if necessary to have unauthenticated requests ending up in the database you want + +Configuration +============= + +To configure this module, you need to: + +#. fill in your WOPI client URL in the configuration wizard + +Usage +===== + +To use this module, you need to: + +#. on any supported attachment, click the edit button + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/118/8.0 + +Known issues / Roadmap +====================== + +* implement quasi permanent public shares a la google docs +* whoever want to get their hands dirty with Microsoft should find our how to integrate this with Office 365 + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed feedback. + +Credits +======= + +Images +------ + +* Odoo Community Association: `Icon `_. + +Contributors +------------ + +* Holger Brunn + +Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list `_ or the `appropriate specialized mailinglist `_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/document_wopi/__init__.py b/document_wopi/__init__.py new file mode 100644 index 00000000..c897fc16 --- /dev/null +++ b/document_wopi/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import models +from . import controllers diff --git a/document_wopi/__openerp__.py b/document_wopi/__openerp__.py new file mode 100644 index 00000000..0cc25b16 --- /dev/null +++ b/document_wopi/__openerp__.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +{ + "name": "WOPI", + "version": "8.0.1.0.0", + "author": "Therp BV,Odoo Community Association (OCA)", + "license": "AGPL-3", + "category": "Knowledge Management", + "summary": "Allow online collaborative editing of your documents", + "depends": [ + 'knowledge', + 'attachment_action', + 'attachment_lock', + ], + "demo": [ + "demo/ir_config_parameter.xml", + ], + "data": [ + "security/ir_rule.xml", + "data/ir_actions_todo.xml", + "views/knowledge_config_settings.xml", + 'views/templates.xml', + 'security/ir.model.access.csv', + ], + "qweb": [ + "static/src/xml/document_wopi.xml", + ], + "images": [ + "images/screenshot.png", + ], +} diff --git a/document_wopi/controllers/__init__.py b/document_wopi/controllers/__init__.py new file mode 100644 index 00000000..1b21ddd3 --- /dev/null +++ b/document_wopi/controllers/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import main diff --git a/document_wopi/controllers/main.py b/document_wopi/controllers/main.py new file mode 100644 index 00000000..7116d829 --- /dev/null +++ b/document_wopi/controllers/main.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import base64 +import json +import time +import logging +from openerp import http, fields +from openerp.http import request +_logger = logging.getLogger(__name__) + + +class WopiEndpoints(http.Controller): + @http.route( + '/wopi/files/', type='http', + auth='public', + ) + def files(self, attachment, access_token, **kwargs): + token = self._verify(access_token) + if not token: + _logger.error(request.httprequest.headers) + return request.not_found() + attachment = token.attachment_id + _logger.debug(request.httprequest.headers) + return json.dumps({ + 'BaseFileName': attachment.name, + 'OwnerId': attachment.create_uid.id, + 'Size': attachment.file_size, + 'UserId': token.user_id.id, + 'Version': str(self._timestamp(attachment)), + 'UserFriendlyName': token.user_id.display_name, + 'UserCanWrite': attachment.check_access_rights('write', False), + 'SupportsUpdate': True, + 'SupportsGetLock': True, + 'SupportsLocks': True, + 'LastModifiedTime': fields.Datetime.from_string( + attachment.write_date + ).isoformat(), + 'UserCanNotWriteRelative': True, + 'DisablePrint': False, + 'DisableExport': False, + 'DisableCopy': False, + 'DisableInactiveMessages': False, + 'HidePrintOption': False, + 'HideSaveOption': False, + 'HideExportOption': False, + 'EnableOwnerTermination': False, + 'UserExtraInfo': False, + 'WatermarkText': '', + 'PostMessageOrigin': False, + }) + + @http.route( + '/wopi/files//contents', + type='http', auth='public', + ) + def files_contents(self, attachment, access_token, **kwargs): + token = self._verify(access_token) + attachment = token.attachment_id + if not token: + _logger.error(request.httprequest.headers) + return request.not_found() + _logger.debug(request.httprequest.headers) + if 'X-WOPI-Override' in request.httprequest.headers: + name = '_files_contents_%s' % ( + request.httprequest.headers['X-WOPI-Override'] + ) + if hasattr(self, name): + return getattr(self, name)(attachment, token, **kwargs) + return request.not_found() + return request.make_response( + base64.b64decode(attachment.datas), + [('X-WOPI-ItemVersion', str(self._timestamp(attachment)))], + ) + + def _files_contents_PUT(self, attachment, token, **kwargs): + if not attachment.can_lock: + return request.not_found() + if not attachment.locked: + attachment.lock() + attachment.write({'datas': base64.b64encode(request.httprequest.data)}) + return request.make_response( + json.dumps({ + 'LastModifiedTime': fields.Datetime.from_string( + attachment.create_date + ).isoformat(), + }), + [ + ('X-WOPI-Lock', str(attachment.lock_ids.ids)), + ('X-WOPI-ItemVersion', str(self._timestamp(attachment))), + ], + ) + + def _verify(self, access_token): + return request.env['document.wopi.access.token'].sudo()._verify_token( + access_token + ) + + def _timestamp(self, attachment): + return int(time.mktime( + fields.Datetime.from_string(attachment.write_date).timetuple() + )) diff --git a/document_wopi/data/ir_actions_todo.xml b/document_wopi/data/ir_actions_todo.xml new file mode 100644 index 00000000..2e5ad68d --- /dev/null +++ b/document_wopi/data/ir_actions_todo.xml @@ -0,0 +1,10 @@ + + + + + Configure document_wopi + + once + + + diff --git a/document_wopi/demo/ir_config_parameter.xml b/document_wopi/demo/ir_config_parameter.xml new file mode 100644 index 00000000..f320b3f2 --- /dev/null +++ b/document_wopi/demo/ir_config_parameter.xml @@ -0,0 +1,9 @@ + + + + + document_wopi.client + https://docs.therp.nl + + + diff --git a/document_wopi/images/screenshot.png b/document_wopi/images/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..2c0be5b7fe1fae8e8d1c68a2ffd56f65dac56182 GIT binary patch literal 98642 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 literal 0 HcmV?d00001 diff --git a/document_wopi/models/__init__.py b/document_wopi/models/__init__.py new file mode 100644 index 00000000..7f2c31a3 --- /dev/null +++ b/document_wopi/models/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from . import knowledge_config_settings +from . import document_wopi +from . import document_wopi_access_token diff --git a/document_wopi/models/document_wopi.py b/document_wopi/models/document_wopi.py new file mode 100644 index 00000000..7d66ad39 --- /dev/null +++ b/document_wopi/models/document_wopi.py @@ -0,0 +1,47 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import requests +import urlparse +from openerp import api, models, tools +from lxml import etree + + +class DocumentWopi(models.AbstractModel): + _name = 'document.wopi' + _description = 'Implement the WOPI protocol' + + @api.model + def _get_url(self, path): + client = self.env['ir.config_parameter'].get_param( + 'document_wopi.client' + ) + assert client, 'You need to define your WOPI client in the settings' + return urlparse.urljoin(client, path) + + @api.model + def _call(self, path, query=None, headers=None): + return requests.get( + self._get_url(path), params=query, headers=headers + ) + + @api.model + def get_access_token(self, attachment_id): + """Return an access token to pass to the WOPI client. Make sure the + user in question can access the resource""" + self.env['ir.attachment'].browse(attachment_id).read([]) + return self.env['document.wopi.access.token']._get_token( + self.env['ir.attachment'].browse(attachment_id) + ).id + + @tools.ormcache() + @api.model + def _discovery(self): + response = self.env['document.wopi']._call('hosting/discovery') + xml = etree.fromstring(response.text) + result = {} + for action in xml.xpath('//action'): + ext = action.attrib['ext'] + name = action.attrib['name'] + result[(ext, name)] = dict(action.attrib) + return result diff --git a/document_wopi/models/document_wopi_access_token.py b/document_wopi/models/document_wopi_access_token.py new file mode 100644 index 00000000..05317b1d --- /dev/null +++ b/document_wopi/models/document_wopi_access_token.py @@ -0,0 +1,109 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import time +import mimetypes +import os.path +import uuid +import urllib +import urlparse +from datetime import datetime, timedelta +from openerp import api, fields, models +from openerp.exceptions import AccessDenied + + +class DocumentWopiAccessToken(models.Model): + _name = 'document.wopi.access.token' + _description = 'Access token for WOPI requests' + + user_id = fields.Many2one( + 'res.users', 'User', required=True, ondelete='cascade', + ) + attachment_id = fields.Many2one( + 'ir.attachment', 'Attachment', required=True, ondelete='cascade', + ) + valid_until = fields.Datetime() + token = fields.Char(required=True) + token_ttl = fields.Integer(compute='_compute_token_ttl') + action_url = fields.Char(compute='_compute_action_url') + + @api.model + def _get_token(self, attachment): + """Create or return a token ID for some attachment for the current + user. This implies creating a shared lock for the attachment""" + result = self.search([ + ('user_id', '=', self.env.user.id), + ('attachment_id', '=', attachment.id), + '|', + ('valid_until', '=', False), + ('valid_until', '>=', fields.Datetime.now()), + ], limit=1) + valid_until = fields.Datetime.to_string( + datetime.now() + + timedelta(self.env['ir.config_parameter'].get_param( + 'document_wopi.token_validity', 1800, + )) + ) + if result: + result.write({'valid_until': valid_until}) + else: + result = self.create({ + 'user_id': self.env.user.id, + 'attachment_id': attachment.id, + 'valid_until': valid_until, + # TODO: is this random enough or do we need some secret + # generator? + 'token': str(uuid.uuid4()), + }) + result.attachment_id.lock(lock_type='shared', valid_until=valid_until) + return result + + @api.multi + def _compute_token_ttl(self): + for this in self: + if not this.valid_until: + continue + this.token_ttl = int(time.mktime( + fields.Datetime.from_string(this.valid_until).timetuple() + )) + + @api.multi + def _compute_action_url(self): + wopi = self.env['document.wopi'] + discovery = wopi._discovery() + for this in self: + dummy, ext = os.path.splitext(this.attachment_id.datas_fname) + if not ext: + ext = mimetypes.guess_extension(this.attachment_id.file_type) + if not ext: + continue + ext = ext[1:] + action = discovery.get( + (ext, 'edit'), discovery.get((ext, 'view')), + ) + if not action: + continue + + this.action_url = wopi._get_url( + action.get('urlsrc', '') + ) + '?' + urllib.urlencode({ + 'WOPISrc': urlparse.urljoin( + self.env['ir.config_parameter'] + .get_param('web.base.url'), + '/wopi/files/%d' % this.attachment_id.id, + ) + }) + + @api.model + def _verify_token(self, token): + """Be sure a token is valid; return a falsy value for invalid tokens""" + access_token = self.search([('token', '=', token)]) + if not access_token: + return self.browse([]) + try: + access_token.attachment_id.sudo(access_token.user_id).read([]) + except AccessDenied: + return self.browse([]) + if access_token.valid_until < fields.Datetime.now(): + return self.browse([]) + return access_token.sudo(access_token.user_id) diff --git a/document_wopi/models/knowledge_config_settings.py b/document_wopi/models/knowledge_config_settings.py new file mode 100644 index 00000000..19d64e1d --- /dev/null +++ b/document_wopi/models/knowledge_config_settings.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# © 2017 Therp BV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from openerp import _, api, fields, models +from openerp.exceptions import Warning as UserError + + +class KnowledgeConfigSettings(models.TransientModel): + _inherit = 'knowledge.config.settings' + + document_wopi_client = fields.Char( + 'WOPI client', required=True, + default=lambda self: self._default_document_wopi_client() + ) + + @api.multi + def set_document_wopi_client(self): + self.ensure_one() + self.env['ir.config_parameter'].set_param( + 'document_wopi.client', self.document_wopi_client + ) + self.env['document.wopi']._discovery.clear_cache( + self.env['document.wopi'] + ) + response = self.env['document.wopi']._discovery() + if not response: + raise UserError( + _("%s doesn't seem to support WOPI discovery") % + self.document_wopi_client + ) + + @api.model + def _default_document_wopi_client(self): + return self.env['ir.config_parameter'].get_param( + 'document_wopi.client' + ) diff --git a/document_wopi/security/ir.model.access.csv b/document_wopi/security/ir.model.access.csv new file mode 100644 index 00000000..02498f9c --- /dev/null +++ b/document_wopi/security/ir.model.access.csv @@ -0,0 +1,2 @@ +"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" +access_document_wopi_access_token,access_document_wopi_access_token,model_document_wopi_access_token,base.group_document_user,1,1,1,1 diff --git a/document_wopi/security/ir_rule.xml b/document_wopi/security/ir_rule.xml new file mode 100644 index 00000000..e77dff5d --- /dev/null +++ b/document_wopi/security/ir_rule.xml @@ -0,0 +1,10 @@ + + + + + Users can only work on their own access tokens + [('user_id', '=', user.id)] + + + + diff --git a/document_wopi/static/description/icon.png b/document_wopi/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/document_wopi/static/src/css/document_wopi.css b/document_wopi/static/src/css/document_wopi.css new file mode 100644 index 00000000..9e1e7787 --- /dev/null +++ b/document_wopi/static/src/css/document_wopi.css @@ -0,0 +1,9 @@ +#document_wopi_iframe +{ + position: absolute; + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + border: none; +} diff --git a/document_wopi/static/src/js/document_wopi.js b/document_wopi/static/src/js/document_wopi.js new file mode 100644 index 00000000..ec1374d3 --- /dev/null +++ b/document_wopi/static/src/js/document_wopi.js @@ -0,0 +1,89 @@ +//-*- coding: utf-8 -*- +//© 2017 Therp BV +//License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +openerp.document_wopi = function(instance) +{ + var _t = instance.web._t; + instance.web.Sidebar.include( + { + on_attachments_loaded: function(attachments) + { + var self = this; + return jQuery.when(this._super.apply(this, arguments)) + .then(function() + { + self.$el.find('.oe-sidebar-document-wopi') + .click(self.on_document_wopi); + }); + }, + on_document_wopi: function(e) + { + var self = this, + $target = jQuery(e.currentTarget), + attachment_id = $target.data('id'); + e.preventDefault(); + e.stopPropagation(); + return new instance.web.Model('document.wopi').call( + 'get_access_token', [attachment_id], + ).then(function(access_token_id) + { + return self.document_wopi_frame(access_token_id); + }); + }, + document_wopi_frame: function(access_token_id) + { + this.do_action({ + type: 'ir.actions.client', + name: 'document_wopi', + tag: 'document_wopi', + params: { + access_token_id: access_token_id, + } + }); + }, + }); + instance.document_wopi.OfficeWidget = instance.web.Widget.extend({ + 'template': 'DocumentWopiOfficeWidget', + init: function(parent, options) + { + this.params = options.params; + return this._super.apply(this, arguments); + }, + start: function() + { + return this._super.apply(this, arguments) + .then(this.proxy('get_token_values')) + .then(this.proxy('call_wopi_client')); + }, + get_token_values: function() + { + var self = this; + return new instance.web.Model('document.wopi.access.token').query( + ['token', 'token_ttl', 'attachment_id', 'action_url'] + ) + .filter([['id', '=', this.params.access_token_id]]) + .first() + .then(function(data) + { + self.params = _.extend(self.params, data); + }); + }, + call_wopi_client: function() + { + if(!this.params.action_url) + { + throw instance.web._t('Unsupported document!'); + } + this.$('form').attr('action', this.params.action_url); + this.$('form input[name="access_token"]').val(this.params.token); + this.$('form input[name="access_token_ttl"]').val( + this.params.token_ttl + ); + this.$('form').submit(); + }, + }); + instance.web.client_actions.add( + 'document_wopi', 'instance.document_wopi.OfficeWidget', + ); +}; diff --git a/document_wopi/static/src/xml/document_wopi.xml b/document_wopi/static/src/xml/document_wopi.xml new file mode 100644 index 00000000..7e4e0163 --- /dev/null +++ b/document_wopi/static/src/xml/document_wopi.xml @@ -0,0 +1,17 @@ + + + + + + + + + +
+
+ + +
+