Projet

Général

Profil

0001-ogone-check-signature-using-both-iso-8859-1-and-utf-.patch

Frédéric Péters, 19 février 2021 17:49

Télécharger (3,38 ko)

Voir les différences:

Subject: [PATCH] ogone: check signature using both iso-8859-1 and utf-8
 encodings (#51304)

 eopayment/ogone.py  | 20 ++++++++++++--------
 tests/test_ogone.py | 11 +++++++++++
 2 files changed, 23 insertions(+), 8 deletions(-)
eopayment/ogone.py
485 485
        ]
486 486
    }
487 487

  
488
    def sha_sign(self, algo, key, params, keep):
488
    def sha_sign(self, algo, key, params, keep, encoding='iso-8859-1'):
489 489
        '''Ogone signature algorithm of query string'''
490 490
        values = params.items()
491 491
        values = [(a.upper(), b) for a, b in values]
......
493 493
        values = [u'%s=%s' % (a, b) for a, b in values if a in keep and b]
494 494
        tosign = key.join(values)
495 495
        tosign += key
496
        tosign = force_byte(tosign, encoding='iso-8859-1')
496
        tosign = force_byte(tosign, encoding=encoding)
497 497
        hashing = getattr(hashlib, algo)
498 498
        return hashing(tosign).hexdigest().upper()
499 499

  
500
    def sha_sign_in(self, params):
501
        return self.sha_sign(self.hash_algorithm, self.sha_in, params, SHA_IN_PARAMS)
500
    def sha_sign_in(self, params, encoding='iso-8859-1'):
501
        return self.sha_sign(self.hash_algorithm, self.sha_in, params, SHA_IN_PARAMS, encoding=encoding)
502 502

  
503
    def sha_sign_out(self, params):
504
        return self.sha_sign(self.hash_algorithm, self.sha_out, params, SHA_OUT_PARAMS)
503
    def sha_sign_out(self, params, encoding='iso-8859-1'):
504
        return self.sha_sign(self.hash_algorithm, self.sha_out, params, SHA_OUT_PARAMS, encoding=encoding)
505 505

  
506 506
    def get_request_url(self):
507 507
        if self.environment == ENVIRONMENT_TEST:
......
582 582
        signed = False
583 583
        if self.sha_in:
584 584
            signature = params.get('SHASIGN')
585
            expected_signature = self.sha_sign_out(params)
586
            signed = signature == expected_signature
585
            # check signature against both encoding
586
            for encoding in ('iso-8859-1', 'utf-8'):
587
                expected_signature = self.sha_sign_out(params, encoding=encoding)
588
                signed = signature == expected_signature
589
                if signed:
590
                    break
587 591
        if status == '1':
588 592
            result = CANCELLED
589 593
        elif status == '2':
tests/test_ogone.py
129 129
        response = ogone_backend.response(urllib.urlencode(data))
130 130
        assert response.signed
131 131
        assert response.result == eopayment.WAITING
132

  
133
        # check utf-8 based signature is also ok
134
        data['shasign'] = b'0E35F687ACBEAA6CA769E0ADDBD0863EB6C1678A'
135
        response = ogone_backend.response(urllib.urlencode(data))
136
        assert response.signed
137
        assert response.result == eopayment.WAITING
138

  
139
        # check invalid signature is not marked ok
140
        data['shasign'] = b'0000000000000000000000000000000000000000'
141
        response = ogone_backend.response(urllib.urlencode(data))
142
        assert not response.signed
132
-