From c3cdcfdecd9110d10e4105637b33c3000b6c60a9 Mon Sep 17 00:00:00 2001 From: lovetox Date: Sun, 30 Jan 2022 19:29:44 +0100 Subject: X509Name: Use functools.totalordering for comparisons (#1086) * X509Name: Use functools.totalordering for comparisons - Reduce the magic - Make it more readable - Make it easier to add type annotations in the future * Correctly return NotImplemented * Add new comparison test case --- src/OpenSSL/crypto.py | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'src/OpenSSL') diff --git a/src/OpenSSL/crypto.py b/src/OpenSSL/crypto.py index 77b2c6c..894d5fa 100644 --- a/src/OpenSSL/crypto.py +++ b/src/OpenSSL/crypto.py @@ -1,9 +1,8 @@ import calendar import datetime - from base64 import b16encode +import functools from functools import partial -from operator import __eq__, __ne__, __lt__, __le__, __gt__, __ge__ from cryptography import utils, x509 from cryptography.hazmat.primitives.asymmetric import dsa, rsa @@ -528,6 +527,7 @@ def get_elliptic_curve(name): raise ValueError("unknown curve name", name) +@functools.total_ordering class X509Name: """ An X.509 Distinguished Name. @@ -642,23 +642,17 @@ class X509Name: _lib.OPENSSL_free(result_buffer[0]) return result - def _cmp(op): - def f(self, other): - if not isinstance(other, X509Name): - return NotImplemented - result = _lib.X509_NAME_cmp(self._name, other._name) - return op(result, 0) - - return f + def __eq__(self, other): + if not isinstance(other, X509Name): + return NotImplemented - __eq__ = _cmp(__eq__) - __ne__ = _cmp(__ne__) + return _lib.X509_NAME_cmp(self._name, other._name) == 0 - __lt__ = _cmp(__lt__) - __le__ = _cmp(__le__) + def __lt__(self, other): + if not isinstance(other, X509Name): + return NotImplemented - __gt__ = _cmp(__gt__) - __ge__ = _cmp(__ge__) + return _lib.X509_NAME_cmp(self._name, other._name) < 0 def __repr__(self): """ -- cgit v1.2.1