From 8358e8d74748f7bcdfcd9aecd490c8b8d0c142b5 Mon Sep 17 00:00:00 2001 From: Milan Cosnefroy Date: Tue, 24 Sep 2024 22:57:38 +0200 Subject: [PATCH 1/5] [FIX][H14427] website_sale_signifyd: allow confirming sale order without http request --- website_sale_signifyd/models/sale_order.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index 890c94e1..29108eff 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -8,9 +8,15 @@ from odoo.http import request class SaleOrder(models.Model): _inherit = 'sale.order' + def _get_source_ip(self): + if request and request.env.user._is_public(): + return request.httprequest.environ['REMOTE_ADDR'] + return '' + signifyd_case_id = fields.Many2one('signifyd.case', readonly=1, copy=False) singifyd_score = fields.Float(related='signifyd_case_id.score') signifyd_checkpoint_action = fields.Selection(string='Signifyd Action', related='signifyd_case_id.checkpoint_action') + source_ip = fields.Char(default=_get_source_ip) def action_view_signifyd_case(self): self.ensure_one() @@ -30,6 +36,8 @@ class SaleOrder(models.Model): def action_confirm(self): res = super().action_confirm() + if not self.source_ip: + self.source_ip = self._get_source_ip() for sale in self.filtered(lambda so: so._should_post_signifyd()): _case = sale.post_signifyd_case() return res @@ -44,16 +52,16 @@ class SaleOrder(models.Model): return self.state in ('sale', 'done') and not self.signifyd_case_id and case_required def post_signifyd_case(self): + self.ensure_one() if not self.website_id.signifyd_connector_id: return - browser_ip_address = request.httprequest.environ['REMOTE_ADDR'] - if request.session: + if request and request.session: checkout_token = request.session.session_token order_session_id = checkout_token else: checkout_token = '' # Session values for Signifyd post - sig_vals = self._prepare_signifyd_case_values(order_session_id, checkout_token, browser_ip_address) + sig_vals = self._prepare_signifyd_case_values(order_session_id, checkout_token, self.source_ip) case = self.env['signifyd.case'].post_case(self.website_id.signifyd_connector_id, sig_vals) @@ -101,7 +109,6 @@ class SaleOrder(models.Model): "orderSessionId": order_session_id, "orderId": self.id, "checkoutToken": checkout_token, - "browserIpAddress": browser_ip_address, "currency": self.partner_id.currency_id.name, "orderChannel": "WEB", "totalPrice": self.amount_total, @@ -171,4 +178,7 @@ class SaleOrder(models.Model): ], } + if browser_ip_address: + new_case_vals['purchase']['browserIpAddress'] = browser_ip_address, + return new_case_vals From 4ea688c61defd351bb91a1649f10ce859f463be3 Mon Sep 17 00:00:00 2001 From: Milan Cosnefroy Date: Tue, 24 Sep 2024 23:28:43 +0200 Subject: [PATCH 2/5] [FIX][H14427] website_sale_signifyd: typo --- website_sale_signifyd/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index 29108eff..a127229b 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -179,6 +179,6 @@ class SaleOrder(models.Model): } if browser_ip_address: - new_case_vals['purchase']['browserIpAddress'] = browser_ip_address, + new_case_vals['purchase']['browserIpAddress'] = browser_ip_address return new_case_vals From 2f267790e9a5bfd1c2a56bce32fb1180926d5741 Mon Sep 17 00:00:00 2001 From: Milan Cosnefroy Date: Tue, 24 Sep 2024 23:32:08 +0200 Subject: [PATCH 3/5] [FIX][H14427] website_sale_signifyd: browserIpAddress required, always include --- website_sale_signifyd/models/sale_order.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index a127229b..03e7fc88 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -8,15 +8,16 @@ from odoo.http import request class SaleOrder(models.Model): _inherit = 'sale.order' + # Source IP for case creation - determination attempted at order creation and if necessary at confirmation def _get_source_ip(self): - if request and request.env.user._is_public(): + if request: return request.httprequest.environ['REMOTE_ADDR'] return '' signifyd_case_id = fields.Many2one('signifyd.case', readonly=1, copy=False) singifyd_score = fields.Float(related='signifyd_case_id.score') signifyd_checkpoint_action = fields.Selection(string='Signifyd Action', related='signifyd_case_id.checkpoint_action') - source_ip = fields.Char(default=_get_source_ip) + source_ip = fields.Char(default=_get_source_ip, help='IP address of the customer, used for signifyd case creation.') def action_view_signifyd_case(self): self.ensure_one() @@ -109,6 +110,7 @@ class SaleOrder(models.Model): "orderSessionId": order_session_id, "orderId": self.id, "checkoutToken": checkout_token, + "browserIpAddress": browser_ip_address, "currency": self.partner_id.currency_id.name, "orderChannel": "WEB", "totalPrice": self.amount_total, @@ -178,7 +180,4 @@ class SaleOrder(models.Model): ], } - if browser_ip_address: - new_case_vals['purchase']['browserIpAddress'] = browser_ip_address - return new_case_vals From ae5a72bce6c062254cf7f68f271a10c6584b5544 Mon Sep 17 00:00:00 2001 From: Milan Cosnefroy Date: Wed, 25 Sep 2024 00:31:42 +0200 Subject: [PATCH 4/5] [FIX][H14427] website_sale_signifyd: source_ip copy=False --- website_sale_signifyd/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index 03e7fc88..f791f8e1 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -17,7 +17,7 @@ class SaleOrder(models.Model): signifyd_case_id = fields.Many2one('signifyd.case', readonly=1, copy=False) singifyd_score = fields.Float(related='signifyd_case_id.score') signifyd_checkpoint_action = fields.Selection(string='Signifyd Action', related='signifyd_case_id.checkpoint_action') - source_ip = fields.Char(default=_get_source_ip, help='IP address of the customer, used for signifyd case creation.') + source_ip = fields.Char(default=_get_source_ip, copy=False, help='IP address of the customer, used for signifyd case creation.') def action_view_signifyd_case(self): self.ensure_one() From 8e9572bc81a56c302d7d32eba577b017c7f5cb77 Mon Sep 17 00:00:00 2001 From: Milan Cosnefroy Date: Wed, 25 Sep 2024 00:39:05 +0200 Subject: [PATCH 5/5] [FIX][H14427] website_sale_signifyd: no signifyd case if no source ip --- website_sale_signifyd/models/sale_order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website_sale_signifyd/models/sale_order.py b/website_sale_signifyd/models/sale_order.py index f791f8e1..e99c07d7 100644 --- a/website_sale_signifyd/models/sale_order.py +++ b/website_sale_signifyd/models/sale_order.py @@ -54,7 +54,7 @@ class SaleOrder(models.Model): def post_signifyd_case(self): self.ensure_one() - if not self.website_id.signifyd_connector_id: + if not self.website_id.signifyd_connector_id or not self.source_ip: return if request and request.session: checkout_token = request.session.session_token