Projet

Général

Profil

0001-systempayv2-do-not-use-filesystem-for-unique-vads_tr.patch

Benjamin Dauvergne, 10 octobre 2020 12:39

Télécharger (3,55 ko)

Voir les différences:

Subject: [PATCH] systempayv2: do not use filesystem for unique vads_trans_id
 (#47534)

vads_trans_id character space is larger than what we use, using 6
alphanumeric characters probability of collision on a day is small, 1 on
2*10^9.

https://paiement.systempay.fr/doc/fr-FR/form-payment/reference/vads-trans-id.html
 eopayment/systempayv2.py | 27 ++++++++++++++++++++++-----
 1 file changed, 22 insertions(+), 5 deletions(-)
eopayment/systempayv2.py
20 20
import datetime as dt
21 21
import hashlib
22 22
import hmac
23
import random
23 24
import string
25
import six
24 26
from six.moves.urllib import parse as urlparse
25 27
import warnings
26 28
from gettext import gettext as _
......
156 158
    Parameter('vads_theme_config', 'ans', 32, max_length=255),
157 159
    Parameter(VADS_TRANS_DATE, 'n', 4, length=14, needed=True,
158 160
              default=isonow),
159
    Parameter('vads_trans_id', 'n', 3, length=6, needed=True),
161
    # https://paiement.systempay.fr/doc/fr-FR/form-payment/reference/vads-trans-id.html
162
    Parameter('vads_trans_id', 'an', 3, length=6, needed=True),
160 163
    Parameter('vads_validation_mode', 'n', 5, max_length=1, choices=('', '0', '1'),
161 164
              default=''),
162 165
    Parameter('vads_version', 'an', 1, default='V2', needed=True,
......
314 317
        options = add_vads(options)
315 318
        self.options = options
316 319

  
320
    def make_vads_trans_id(self):
321
        # vads_trans_id must be 6 alphanumeric characters,
322
        # trans_id starting with 9 are reserved for the systempay backoffice
323
        # https://paiement.systempay.fr/doc/fr-FR/form-payment/reference/vads-trans-id.html
324
        gen = random.SystemRandom()
325
        if six.PY3:
326
            alphabet = string.ascii_letters + string.digits
327
        else:
328
            alphabet = string.letters + string.digits
329
        first_letter_alphabet = alphabet.replace('9', '')
330
        vads_trans_id = (
331
            gen.choice(first_letter_alphabet)
332
            + ''.join(gen.choice(alphabet) for i in range(5))
333
        )
334
        return vads_trans_id
317 335

  
318 336
    def request(self, amount, name=None, first_name=None, last_name=None,
319 337
                address=None, email=None, phone=None, orderid=None, info1=None,
......
368 386
                    '%s value %s is not of the type %s' % (name, orderid, ptype))
369 387
            kwargs[name] = orderid
370 388

  
371
        transaction_id = self.transaction_id(6, string.digits, 'systempay',
372
                                             self.options[VADS_SITE_ID])
373
        kwargs[VADS_TRANS_ID] = force_text(transaction_id)
389
        vads_trans_id = self.make_vads_trans_id()
390
        kwargs[VADS_TRANS_ID] = vads_trans_id
374 391
        fields = kwargs
375 392
        for parameter in PARAMETERS:
376 393
            name = parameter.name
......
392 409
        check_vads(fields)
393 410
        fields[SIGNATURE] = force_text(self.signature(fields))
394 411
        self.logger.debug('%s request contains fields: %s', __name__, fields)
395
        transaction_id = '%s_%s' % (fields[VADS_TRANS_DATE], transaction_id)
412
        transaction_id = '%s_%s' % (fields[VADS_TRANS_DATE], vads_trans_id)
396 413
        self.logger.debug('%s transaction id: %s', __name__, transaction_id)
397 414
        form = Form(
398 415
            url=self.service_url,
399
-