From 8235f03f565ecbb097aca94638703f5dd6ca4eea Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Fri, 27 Jan 2017 11:39:10 +0100 Subject: [PATCH] [FIX] module: allow disabling 1-click install As discussed on issue #15225, it should be possible for system administrators to disable the 1-click installation system. The plan is to disable the feature by default, but make it relatively easy to turn on when it is explicitly desired. 1. At the moment we cannot guarantee that all Apps published on the Odoo Apps Store are safe. And it is a security risk to let end-users deploy Python code on their Odoo servers without requiring any review/deployment by a competent system administrator. We will work on improving the validation process of the Store, but this will require time, and won't probably be a 100% safe process in any case. 2. The one-click install feature is however really useful to help non-technical users install Apps, as long as the feature has been explicitly allowed by the system administrator. This is a common feature in other software suites as well. So we'd like to keep it as an opt-in feature. 3. Administrators of multi-tenant servers, cloud hosting services, etc. understandably expect to be able to turn off the feature for security/control reasons. 4. By turning off the feature by default, but still exposing it in the UI, we keep it *discoverable* for users. The error message should be helpful to direct users to their sysadmins. 5. By using the permissions of the download folder as a flag for turning off the feature, we avoid introducing an extra server parameter. The folder is still created (read-only) by default, for the sole purpose of making it easier to locate. Fixes #15225 --- odoo/addons/base/module/module.py | 9 +++++++++ odoo/modules/module.py | 2 +- odoo/tools/config.py | 9 +++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/odoo/addons/base/module/module.py b/odoo/addons/base/module/module.py index 233d12cb370..4d3e859352b 100644 --- a/odoo/addons/base/module/module.py +++ b/odoo/addons/base/module/module.py @@ -643,6 +643,15 @@ class Module(models.Model): if not self.env.user.has_group('base.group_system'): raise AccessDenied() + # One-click install is opt-in - cfr Issue #15225 + ad_dir = tools.config.addons_data_dir + if not os.access(ad_dir, os.W_OK): + msg = (_("Automatic install of downloaded Apps is currently disabled.") + "\n\n" + + _("To enable it, make sure this directory exists and is writable on the server:") + + "\n%s" % ad_dir) + _logger.warning(msg) + raise UserError(msg) + apps_server = urlparse.urlparse(self.get_apps_server()) OPENERP = odoo.release.product_name.lower() diff --git a/odoo/modules/module.py b/odoo/modules/module.py index 014f2d0ed9b..ecf95be088b 100644 --- a/odoo/modules/module.py +++ b/odoo/modules/module.py @@ -128,7 +128,7 @@ def initialize_sys_path(): global hooked dd = tools.config.addons_data_dir - if dd not in ad_paths: + if os.access(dd, os.R_OK) and dd not in ad_paths: ad_paths.append(dd) for ad in tools.config['addons_path'].split(','): diff --git a/odoo/tools/config.py b/odoo/tools/config.py index 2473fe53304..fb29d0d4a83 100644 --- a/odoo/tools/config.py +++ b/odoo/tools/config.py @@ -582,10 +582,11 @@ class configmanager(object): def addons_data_dir(self): d = os.path.join(self['data_dir'], 'addons', release.series) if not os.path.exists(d): - os.makedirs(d, 0700) - else: - assert os.access(d, os.W_OK), \ - "%s: directory is not writable" % d + try: + # try to make +rx placeholder dir, will need manual +w to activate it + os.makedirs(d, 0500) + except OSError: + logging.getLogger(__name__).debug('Failed to create addons data dir %s', d) return d @property