diff options
| author | Fabien Meghazi <fme@openerp.com> | 2014-03-26 22:57:09 +0100 |
|---|---|---|
| committer | Fabien Meghazi <fme@openerp.com> | 2014-03-26 22:57:09 +0100 |
| commit | e49b8f5ae32b072c7a22763ad9472fcce9265f04 (patch) | |
| tree | c29f4d5181abcafaeeac4e5fd4b8ea912ccf4dc4 /addons/base_import_module/controllers | |
| parent | b7fbef1241ac257a24952b9b8eac725711a398f1 (diff) | |
[FIX] /login is not webservice friendly, base_import_module uses it's own
Exceptions in /base_import_module/* will generate 500 pages with a short message
bzr revid: fme@openerp.com-20140326215709-esc4zkpfp8uzuww1
Diffstat (limited to 'addons/base_import_module/controllers')
| -rw-r--r-- | addons/base_import_module/controllers/main.py | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/addons/base_import_module/controllers/main.py b/addons/base_import_module/controllers/main.py index 45ce1e57480..cbfbd75894b 100644 --- a/addons/base_import_module/controllers/main.py +++ b/addons/base_import_module/controllers/main.py @@ -1,26 +1,47 @@ # -*- coding: utf-8 -*- +import functools import os import zipfile from os.path import join as opj import openerp -from openerp.http import Controller, route, request +from openerp.http import Controller, route, request, Response MAX_FILE_SIZE = 100 * 1024 * 1024 # in megabytes +def webservice(f): + @functools.wraps(f) + def wrap(*args, **kw): + try: + return f(*args, **kw) + except Exception, e: + return Response(response=str(e), status=500) + return wrap + class ImportModule(Controller): - @route('/base_import_module/check', type='http', auth='user', methods=['GET']) - def check(self): - assert request.db # TODO: custom ensure_db? - assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group - return 'ok' + def check_user(self, uid=None): + if uid is None: + uid = request.uid + is_admin = request.registry['res.users'].has_group(request.cr, uid, 'base.group_erp_manager') + if not is_admin: + raise openerp.exceptions.AccessError("Only administrators can upload a module") + + @route('/base_import_module/login', type='http', auth='none', methods=['POST']) + @webservice + def login(self, login, password, db=None): + if db and db != request.db: + raise Exception("Could not select database '%s'" % db) + uid = request.session.authenticate(request.db, login, password) + if not uid: + return Response(response="Wrong login/password", status=401) + self.check_user(uid) + return "ok" @route('/base_import_module/upload', type='http', auth='user', methods=['POST']) + @webservice def upload(self, mod_file=None, **kw): - assert request.db # TODO: custom ensure_db? - assert request.uid == openerp.SUPERUSER_ID # TODO: check admin group - + self.check_user() imm = request.registry['ir.module.module'] if not mod_file: @@ -33,7 +54,7 @@ class ImportModule(Controller): with zipfile.ZipFile(mod_file, "r") as z: for zf in z.filelist: if zf.file_size > MAX_FILE_SIZE: - raise Exception("File %r exceed maximum allowed file size" % zf.filename) + raise Exception("File '%s' exceed maximum allowed file size" % zf.filename) with openerp.tools.osutil.tempdir() as module_dir: z.extractall(module_dir) @@ -46,7 +67,7 @@ class ImportModule(Controller): success.append(mod_name) except Exception, e: errors[mod_name] = str(e) - r = ["Successfully imported module %r" % mod for mod in success] + r = ["Successfully imported module '%s'" % mod for mod in success] for mod, error in errors.items(): - r.append("Error while importing module %r: %r" % (mod, error)) + r.append("Error while importing module '%s': %r" % (mod, error)) return '\n'.join(r) |
