[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:
@@ -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',
|
||||
])
|
||||
|
||||
@@ -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',
|
||||
])
|
||||
|
||||
@@ -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'])
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user