From dc0baf4948eacebcf2441b9f285e137569b520d0 Mon Sep 17 00:00:00 2001 From: Christophe Monniez Date: Mon, 14 Jun 2021 13:49:35 +0000 Subject: [PATCH] [IMP] payment*: implement _neutralize method An overridable model method was added in a previous commit in order to neutralize a database. This commit introduce the implementation of this method for the payment modules. Also, a `_neutralize_fields` helper method is added on the PaymentAcquirer model to simplify the neutralization of the various payment modules. Part-of: odoo/odoo#67825 --- addons/payment/models/payment_acquirer.py | 25 +++++++++++++++++++ .../payment_adyen/models/payment_acquirer.py | 8 ++++++ addons/payment_adyen/tests/test_adyen.py | 7 ++++++ .../payment_alipay/models/payment_acquirer.py | 8 ++++++ addons/payment_alipay/tests/test_alipay.py | 7 ++++++ .../models/payment_acquirer.py | 9 +++++++ .../payment_authorize/tests/test_authorize.py | 8 ++++++ .../models/payment_acquirer.py | 4 +++ .../payment_buckaroo/tests/test_buckaroo.py | 6 +++++ .../payment_ogone/models/payment_acquirer.py | 10 ++++++++ addons/payment_ogone/tests/test_ogone.py | 9 +++++++ .../payment_paypal/models/payment_acquirer.py | 8 ++++++ addons/payment_paypal/tests/test_paypal.py | 7 ++++++ .../models/payment_acquirer.py | 8 ++++++ .../payment_payulatam/tests/test_payulatam.py | 7 ++++++ .../models/payment_acquirer.py | 4 +++ .../payment_payumoney/tests/test_payumoney.py | 6 +++++ .../payment_sips/models/payment_acquirer.py | 4 +++ addons/payment_sips/tests/test_sips.py | 6 +++++ .../payment_stripe/models/payment_acquirer.py | 8 ++++++ addons/payment_stripe/tests/test_stripe.py | 7 ++++++ 21 files changed, 166 insertions(+) diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index 1881a370e40..dcae4ba6b13 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -2,6 +2,8 @@ import logging +from psycopg2 import sql + from odoo import _, api, fields, models, SUPERUSER_ID from odoo.exceptions import ValidationError from odoo.osv import expression @@ -419,3 +421,26 @@ class PaymentAcquirer(models.Model): """ self.ensure_one() return self.redirect_form_view_id + + def _neutralize(self): + super()._neutralize() + self.flush() + self.invalidate_cache() + self.env.cr.execute(""" + UPDATE payment_acquirer SET state = 'disabled' + WHERE state NOT IN ('test', 'disabled') + """) + + def _neutralize_fields(self, provider, fields): + """ Helper to neutralize API keys for a specific provider + :param str provider: name of provider + :param list fields: list of fiels to nullify + """ + self.flush() + self.invalidate_cache() + query = sql.SQL(""" + UPDATE payment_acquirer + SET ({fields}) = ROW({vals}) + WHERE provider = %s + """).format(fields=sql.SQL(','.join(fields)), vals=sql.SQL(', '.join(['NULL'] * len(fields)))) + self.env.cr.execute(query, (provider, )) diff --git a/addons/payment_adyen/models/payment_acquirer.py b/addons/payment_adyen/models/payment_acquirer.py index 4c6aba0402b..ab813bcdf87 100644 --- a/addons/payment_adyen/models/payment_acquirer.py +++ b/addons/payment_adyen/models/payment_acquirer.py @@ -134,3 +134,11 @@ class PaymentAcquirer(models.Model): if self.provider != 'adyen': return super()._get_default_payment_method_id() return self.env.ref('payment_adyen.payment_method_adyen').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('adyen', [ + 'adyen_merchant_account', + 'adyen_api_key', + 'adyen_hmac_key', + ]) diff --git a/addons/payment_adyen/tests/test_adyen.py b/addons/payment_adyen/tests/test_adyen.py index 7ecf7f4adc9..f3ddf9bbe65 100644 --- a/addons/payment_adyen/tests/test_adyen.py +++ b/addons/payment_adyen/tests/test_adyen.py @@ -129,3 +129,10 @@ class AdyenTest(AdyenCommon, PaymentHttpCommon): payload, self.acquirer.adyen_hmac_key, ) + + def test_adyen_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.adyen_merchant_account, False) + self.assertEqual(self.acquirer.adyen_api_key, False) + self.assertEqual(self.acquirer.adyen_hmac_key, False) diff --git a/addons/payment_alipay/models/payment_acquirer.py b/addons/payment_alipay/models/payment_acquirer.py index d7eb65f63ec..ec1d9d703c0 100644 --- a/addons/payment_alipay/models/payment_acquirer.py +++ b/addons/payment_alipay/models/payment_acquirer.py @@ -64,3 +64,11 @@ class PaymentAcquirer(models.Model): if self.provider != 'alipay': return super()._get_default_payment_method_id() return self.env.ref('payment_alipay.payment_method_alipay').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('alipay', [ + 'alipay_merchant_partner_id', + 'alipay_md5_signature_key', + 'alipay_seller_email', + ]) diff --git a/addons/payment_alipay/tests/test_alipay.py b/addons/payment_alipay/tests/test_alipay.py index e3eb91feebd..fa2f8921984 100644 --- a/addons/payment_alipay/tests/test_alipay.py +++ b/addons/payment_alipay/tests/test_alipay.py @@ -214,3 +214,10 @@ class AlipayTest(AlipayCommon, PaymentHttpCommon): tx = self.create_transaction('redirect') payload = dict(self.NOTIFICATION_DATA, sign='dummy') self.assertRaises(Forbidden, AlipayController._verify_notification_signature, payload, tx) + + def test_alipay_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.alipay_merchant_partner_id, False) + self.assertEqual(self.acquirer.alipay_md5_signature_key, False) + self.assertEqual(self.acquirer.alipay_seller_email, False) diff --git a/addons/payment_authorize/models/payment_acquirer.py b/addons/payment_authorize/models/payment_acquirer.py index 1d27f3696f3..8f1742c9975 100644 --- a/addons/payment_authorize/models/payment_acquirer.py +++ b/addons/payment_authorize/models/payment_acquirer.py @@ -132,3 +132,12 @@ class PaymentAcquirer(models.Model): if self.provider != 'authorize': return super()._get_default_payment_method_id() return self.env.ref('payment_authorize.payment_method_authorize').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('authorize', [ + 'authorize_login', + 'authorize_transaction_key', + 'authorize_signature_key', + 'authorize_client_key', + ]) diff --git a/addons/payment_authorize/tests/test_authorize.py b/addons/payment_authorize/tests/test_authorize.py index 7bb1c094cc6..9d76533082f 100644 --- a/addons/payment_authorize/tests/test_authorize.py +++ b/addons/payment_authorize/tests/test_authorize.py @@ -54,3 +54,11 @@ class AuthorizeTest(AuthorizeCommon): token = self.create_token(active=False) with self.assertRaises(UserError): token._handle_reactivation_request() + + def test_authorize_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.authorize_login, False) + self.assertEqual(self.acquirer.authorize_transaction_key, False) + self.assertEqual(self.acquirer.authorize_signature_key, False) + self.assertEqual(self.acquirer.authorize_client_key, False) diff --git a/addons/payment_buckaroo/models/payment_acquirer.py b/addons/payment_buckaroo/models/payment_acquirer.py index 019f13e1e52..61c2277bac1 100644 --- a/addons/payment_buckaroo/models/payment_acquirer.py +++ b/addons/payment_buckaroo/models/payment_acquirer.py @@ -69,3 +69,7 @@ class PaymentAcquirer(models.Model): if self.provider != 'buckaroo': return super()._get_default_payment_method_id() return self.env.ref('payment_buckaroo.payment_method_buckaroo').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('buckaroo', ['buckaroo_website_key', 'buckaroo_secret_key']) diff --git a/addons/payment_buckaroo/tests/test_buckaroo.py b/addons/payment_buckaroo/tests/test_buckaroo.py index ff6b1fd978c..66ee43eafd2 100644 --- a/addons/payment_buckaroo/tests/test_buckaroo.py +++ b/addons/payment_buckaroo/tests/test_buckaroo.py @@ -122,3 +122,9 @@ class BuckarooTest(BuckarooCommon, PaymentHttpCommon): '937cca8f486b75e93df1e9811a5ebf43357fc3f2', msg="The signing string items should be ordered based on a lower-case copy of the keys", ) + + def test_buckaroo_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.buckaroo_website_key, False) + self.assertEqual(self.acquirer.buckaroo_secret_key, False) diff --git a/addons/payment_ogone/models/payment_acquirer.py b/addons/payment_ogone/models/payment_acquirer.py index 5649ea07a35..415e3785367 100644 --- a/addons/payment_ogone/models/payment_acquirer.py +++ b/addons/payment_ogone/models/payment_acquirer.py @@ -120,3 +120,13 @@ class PaymentAcquirer(models.Model): if self.provider != 'ogone': return super()._get_default_payment_method_id() return self.env.ref('payment_ogone.payment_method_ogone').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('ogone', [ + 'ogone_pspid', + 'ogone_userid', + 'ogone_password', + 'ogone_shakey_in', + 'ogone_shakey_out', + ]) diff --git a/addons/payment_ogone/tests/test_ogone.py b/addons/payment_ogone/tests/test_ogone.py index 7780e9cc50e..8e7aee2d2e9 100644 --- a/addons/payment_ogone/tests/test_ogone.py +++ b/addons/payment_ogone/tests/test_ogone.py @@ -161,3 +161,12 @@ class OgoneTest(OgoneCommon, PaymentHttpCommon): 'dummy', tx, ) + + def test_ogone_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.ogone_pspid, False) + self.assertEqual(self.acquirer.ogone_userid, False) + self.assertEqual(self.acquirer.ogone_password, False) + self.assertEqual(self.acquirer.ogone_shakey_in, False) + self.assertEqual(self.acquirer.ogone_shakey_out, False) diff --git a/addons/payment_paypal/models/payment_acquirer.py b/addons/payment_paypal/models/payment_acquirer.py index db948fc8582..b925baaa368 100644 --- a/addons/payment_paypal/models/payment_acquirer.py +++ b/addons/payment_paypal/models/payment_acquirer.py @@ -71,3 +71,11 @@ class PaymentAcquirer(models.Model): if self.provider != 'paypal': return super()._get_default_payment_method_id() return self.env.ref('payment_paypal.payment_method_paypal').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('paypal', [ + 'paypal_email_account', + 'paypal_seller_account', + 'paypal_pdt_token', + ]) diff --git a/addons/payment_paypal/tests/test_paypal.py b/addons/payment_paypal/tests/test_paypal.py index a69efeb6b3d..8240bdb5706 100644 --- a/addons/payment_paypal/tests/test_paypal.py +++ b/addons/payment_paypal/tests/test_paypal.py @@ -154,3 +154,10 @@ class PaypalTest(PaypalCommon, PaymentHttpCommon): ): self._make_http_post_request(url, data=self.NOTIFICATION_DATA) self.assertEqual(origin_check_mock.call_count, 1) + + def test_paypal_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.paypal_email_account, False) + self.assertEqual(self.acquirer.paypal_seller_account, False) + self.assertEqual(self.acquirer.paypal_pdt_token, False) diff --git a/addons/payment_payulatam/models/payment_acquirer.py b/addons/payment_payulatam/models/payment_acquirer.py index f54fe50108b..e464dc92ee2 100644 --- a/addons/payment_payulatam/models/payment_acquirer.py +++ b/addons/payment_payulatam/models/payment_acquirer.py @@ -74,3 +74,11 @@ class PaymentAcquirer(models.Model): if self.provider != 'payulatam': return super()._get_default_payment_method_id() return self.env.ref('payment_payulatam.payment_method_payulatam').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('payulatam', [ + 'payulatam_merchant_id', + 'payulatam_account_id', + 'payulatam_api_key', + ]) diff --git a/addons/payment_payulatam/tests/test_payulatam.py b/addons/payment_payulatam/tests/test_payulatam.py index 1573059af2c..2f6780abbc5 100644 --- a/addons/payment_payulatam/tests/test_payulatam.py +++ b/addons/payment_payulatam/tests/test_payulatam.py @@ -144,3 +144,10 @@ class PayULatamTest(PayULatamCommon): self.env['payment.transaction']._handle_feedback_data('payulatam', payulatam_post_data) self.assertEqual(tx.state, 'done', 'Payulatam: wrong state after receiving a valid pending notification') self.assertEqual(tx.acquirer_reference, 'b232989a-4aa8-42d1-bace-153236eee791', 'Payulatam: wrong txn_id after receiving a valid pending notification') + + def test_payulatam_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.payulatam_merchant_id, False) + self.assertEqual(self.acquirer.payulatam_account_id, False) + self.assertEqual(self.acquirer.payulatam_api_key, False) diff --git a/addons/payment_payumoney/models/payment_acquirer.py b/addons/payment_payumoney/models/payment_acquirer.py index a1a3b27c71a..2c7f912c800 100644 --- a/addons/payment_payumoney/models/payment_acquirer.py +++ b/addons/payment_payumoney/models/payment_acquirer.py @@ -55,3 +55,7 @@ class PaymentAcquirer(models.Model): if self.provider != 'payumoney': return super()._get_default_payment_method_id() return self.env.ref('payment_payumoney.payment_method_payumoney').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('payumoney', ['payumoney_merchant_key', 'payumoney_merchant_salt']) diff --git a/addons/payment_payumoney/tests/test_payumoney.py b/addons/payment_payumoney/tests/test_payumoney.py index e7f62c7b918..eeb4ed0b746 100644 --- a/addons/payment_payumoney/tests/test_payumoney.py +++ b/addons/payment_payumoney/tests/test_payumoney.py @@ -85,3 +85,9 @@ class PayUMoneyTest(PayumoneyCommon, PaymentHttpCommon): self.assertRaises( Forbidden, PayUMoneyController._verify_notification_signature, payload, tx ) + + def test_payumoney_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.payumoney_merchant_key, False) + self.assertEqual(self.acquirer.payumoney_merchant_salt, False) diff --git a/addons/payment_sips/models/payment_acquirer.py b/addons/payment_sips/models/payment_acquirer.py index ad05831d402..bdbd86e51b6 100644 --- a/addons/payment_sips/models/payment_acquirer.py +++ b/addons/payment_sips/models/payment_acquirer.py @@ -60,3 +60,7 @@ class PaymentAcquirer(models.Model): if self.provider != 'sips': return super()._get_default_payment_method_id() return self.env.ref('payment_sips.payment_method_sips').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('sips', ['sips_merchant_id', 'sips_secret']) diff --git a/addons/payment_sips/tests/test_sips.py b/addons/payment_sips/tests/test_sips.py index aad15de3863..cd52838cfe2 100644 --- a/addons/payment_sips/tests/test_sips.py +++ b/addons/payment_sips/tests/test_sips.py @@ -137,3 +137,9 @@ class SipsTest(SipsCommon, PaymentHttpCommon): tx = self.create_transaction('redirect') payload = dict(self.NOTIFICATION_DATA, Seal='dummy') self.assertRaises(Forbidden, SipsController._verify_notification_signature, payload, tx) + + def test_sips_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.sips_merchant_id, False) + self.assertEqual(self.acquirer.sips_secret, False) diff --git a/addons/payment_stripe/models/payment_acquirer.py b/addons/payment_stripe/models/payment_acquirer.py index 9f85ed10690..b1caed29104 100644 --- a/addons/payment_stripe/models/payment_acquirer.py +++ b/addons/payment_stripe/models/payment_acquirer.py @@ -78,3 +78,11 @@ class PaymentAcquirer(models.Model): if self.provider != 'stripe': return super()._get_default_payment_method_id() return self.env.ref('payment_stripe.payment_method_stripe').id + + def _neutralize(self): + super()._neutralize() + self._neutralize_fields('stripe', [ + 'stripe_secret_key', + 'stripe_publishable_key', + 'stripe_webhook_secret', + ]) diff --git a/addons/payment_stripe/tests/test_stripe.py b/addons/payment_stripe/tests/test_stripe.py index 71aa55d0f38..08eaedabcbc 100644 --- a/addons/payment_stripe/tests/test_stripe.py +++ b/addons/payment_stripe/tests/test_stripe.py @@ -64,3 +64,10 @@ class StripeTest(StripeCommon, PaymentHttpCommon): ): self._make_json_request(url, data=self.NOTIFICATION_DATA) self.assertEqual(signature_check_mock.call_count, 1) + + def test_stripe_neutralize(self): + self.env['payment.acquirer']._neutralize() + + self.assertEqual(self.acquirer.stripe_secret_key, False) + self.assertEqual(self.acquirer.stripe_publishable_key, False) + self.assertEqual(self.acquirer.stripe_webhook_secret, False)