[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
This commit is contained in:
Christophe Monniez
2022-02-01 09:54:07 +00:00
parent 152310fe26
commit dc0baf4948
21 changed files with 166 additions and 0 deletions
+25
View File
@@ -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, ))
@@ -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',
])
+7
View File
@@ -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)
@@ -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',
])
@@ -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)
@@ -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',
])
@@ -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)
@@ -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'])
@@ -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)
@@ -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',
])
+9
View File
@@ -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)
@@ -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',
])
@@ -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)
@@ -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',
])
@@ -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)
@@ -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'])
@@ -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)
@@ -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'])
+6
View File
@@ -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)
@@ -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',
])
@@ -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)