diff --git a/addons/base_setup/models/res_config_settings.py b/addons/base_setup/models/res_config_settings.py index 4a632fef..1ec28c9a 100644 --- a/addons/base_setup/models/res_config_settings.py +++ b/addons/base_setup/models/res_config_settings.py @@ -134,7 +134,7 @@ class ResConfigSettings(models.TransientModel): if self.activator_key and self.contract_id: try: set_param = self.env['ir.config_parameter'].sudo().set_param - binary = json.loads(base64.decodestring(self.activator_key)).encode('ascii') + binary = json.loads(base64.decodestring(self.activator_key).decode('utf-8')).encode('ascii') binary = base64.decodestring(binary) enc = json.dumps(decrypt(binary, self.contract_id)) if enc: diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index a374f0bc..9b168a7c 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1867,13 +1867,44 @@ class ReportController(http.Controller): class LicensingController(http.Controller): @http.route('/flectra/licensing', type='http', auth="user") - def download(self, binary='', **kwargs): - filename = '%s.%s' % (FILENAME, EXT) - content = binary - return request.make_response( - content, - headers=[ - ('Content-Type', 'plain/text' or 'application/octet-stream'), - ('Content-Disposition', content_disposition(filename)) - ] - ) + def download(self, contract_id=None, type=None, binary='', **kwargs): + if type == 'offline': + filename = '%s.%s' % (FILENAME, EXT) + content = binary + return request.make_response( + content, + headers=[ + ('Content-Type', 'plain/text' or 'application/octet-stream'), + ('Content-Disposition', content_disposition(filename)) + ] + ) + elif type == 'online': + error = { + 'code': 200, + 'message': "Invalid License Key", + 'data': '' + } + try: + if contract_id: + data = { + 'data': binary, + 'contract_id': contract_id + } + p = requests.post( + server_url + '/my/contract/validate/online', + params=data, + headers={'Content-type': 'plain/text' or 'application/octet-stream'}) + content = json.loads(p.content.decode('utf-8')) + if 'activation_key' in content: + date = datetime.datetime.now() + datetime.timedelta(days=(12 * 30 * 1)) + set_param = request.env['ir.config_parameter'].sudo().set_param + set_param('database.expiration_date', date) + set_param('contract.validity', + base64.encodestring( + encrypt(json.dumps(str(date)),str(date)))) + if 'error_in_key' in content: + return request.make_response(html_escape(json.dumps(error))) + except Exception as e: + error['code'] = 400 + error['message'] = 'Flectra Error!' + return request.make_response(html_escape(json.dumps(error))) \ No newline at end of file diff --git a/addons/web/models/ir_http.py b/addons/web/models/ir_http.py index 893b24c6..2a636eb8 100644 --- a/addons/web/models/ir_http.py +++ b/addons/web/models/ir_http.py @@ -61,17 +61,28 @@ class Http(models.AbstractModel): currencies = Currency.search([]).read(['symbol', 'position', 'decimal_places']) return { c['id']: {'symbol': c['symbol'], 'position': c['position'], 'digits': [69,c['decimal_places']]} for c in currencies} - def get_contracted_modules(self, contract_key='', ir_module_module_ids=None): + def get_contracted_modules(self, type=None, contract_key=None, ir_module_module_ids=None): if ir_module_module_ids: + contract_key = contract_key or '' contracted_module_list = ir_module_module_ids.mapped('name') - contracts = encrypt(json.dumps(contracted_module_list), contract_key) + warrant = self.env['publisher_warranty.contract'].sudo()._get_message() + warrant.update({ + 'contracts': contracted_module_list, + 'contract_id': contract_key + }) + if type != 'online': + contracts = encrypt(json.dumps(warrant), contract_key) + else: + contracts = str.encode(json.dumps(warrant)) return contracts @api.model - def contract_validate_file(self, contract_id): - ir_module_module_ids = self.env['ir.module.module'].sudo().search( - [('contract_certificate', '!=', False), ('state', '=', 'installed')]) - contracts = self.get_contracted_modules(contract_id,ir_module_module_ids) + def contract_validate_file(self, contract_id, type): + contracts = [] + if contract_id: + ir_module_module_ids = self.env['ir.module.module'].sudo().search( + [('contract_certificate', '!=', False), ('state', '=', 'installed')]) + contracts = self.get_contracted_modules(type, contract_id, ir_module_module_ids) return json.dumps(base64.encodestring(contracts).decode('ascii')) def check_validate_date(self, config): diff --git a/addons/web/static/src/js/backend_theme_customizer/DialogRegisterContract.js b/addons/web/static/src/js/backend_theme_customizer/DialogRegisterContract.js index dd855bd9..6cd22c82 100644 --- a/addons/web/static/src/js/backend_theme_customizer/DialogRegisterContract.js +++ b/addons/web/static/src/js/backend_theme_customizer/DialogRegisterContract.js @@ -24,15 +24,16 @@ flectra.define('FlectraLicensing.DialogRegisterContract', function (require) { save: function () { var contract_id = this.$el.find('#contract_id').val(); var self = this; - if (!contract_id) { + var type = this.$el.find("input[name='activate']:checked").val(); + if (!contract_id || !type) { return; } rpc.query({ model: 'ir.http', method: 'contract_validate_file', - args: [contract_id] + args: [contract_id,type] }).done(function (bin) { - self.trigger('get_key', {'key': contract_id, 'binary': bin}); + self.trigger('get_key', {'key': contract_id, 'binary': bin, 'type': type}); self.close(); }); } diff --git a/addons/web/static/src/js/chrome/web_client.js b/addons/web/static/src/js/chrome/web_client.js index bfa5b91d..9b550d96 100644 --- a/addons/web/static/src/js/chrome/web_client.js +++ b/addons/web/static/src/js/chrome/web_client.js @@ -244,7 +244,17 @@ return AbstractWebClient.extend({ session.get_file({ url: '/flectra/licensing', data: { - 'binary': key['binary'] + 'binary': key['binary'], + 'type': key['type'], + 'contract_id': key['key'] + }, + error: function (err) { + new require('web.Dialog').alert(null,err['message']); + }, + success:function () { + if (key['type'] === 'online') { + window.location.reload(); + } } }); }); @@ -291,7 +301,7 @@ return AbstractWebClient.extend({ overlayCSS: {cursor: 'auto'} }); self.contract_expired(); - }, 15000); + }, 150000); }, }); diff --git a/addons/web/static/src/xml/backend_theme.xml b/addons/web/static/src/xml/backend_theme.xml index 81ac3564..cae9c9cb 100755 --- a/addons/web/static/src/xml/backend_theme.xml +++ b/addons/web/static/src/xml/backend_theme.xml @@ -122,6 +122,14 @@
+
+ + +