diff --git a/openerp/addons/base/module/module.py b/openerp/addons/base/module/module.py index 1105ccd0fa1..158edf311d8 100644 --- a/openerp/addons/base/module/module.py +++ b/openerp/addons/base/module/module.py @@ -659,6 +659,15 @@ class module(osv.osv): if not self.pool['res.users'].has_group(cr, uid, 'base.group_system'): raise openerp.exceptions.AccessDenied() + # One-click install is opt-in - cfr Issue #15225 + ad_dir = openerp.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 openerp.exceptions.AccessError(msg) + apps_server = urlparse.urlparse(self.get_apps_server(cr, uid, context=context)) OPENERP = openerp.release.product_name.lower() diff --git a/openerp/modules/module.py b/openerp/modules/module.py index e9e643001f0..7c1f8b104a8 100644 --- a/openerp/modules/module.py +++ b/openerp/modules/module.py @@ -94,7 +94,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/openerp/tools/config.py b/openerp/tools/config.py index f1dd6251036..8e30845063f 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -686,10 +686,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