# Original source of this file is https://github.com/cloudera/impyla/blob/master/impala/sasl_compat.py # which uses Apache-2.0 license as of 21 May 2023. # This code was added to Impyla in 2016 as a compatibility layer to allow use of either python-sasl or pure-sasl # via PR https://github.com/cloudera/impyla/pull/179 # Even though thrift_sasl lists pure-sasl as dependency here https://github.com/cloudera/thrift_sasl/blob/master/setup.py#L34 # but it still calls functions native to python-sasl in this file https://github.com/cloudera/thrift_sasl/blob/master/thrift_sasl/__init__.py#L82 # Hence this code is required for the fallback to work. from puresasl.client import SASLClient, SASLError from contextlib import contextmanager @contextmanager def error_catcher(self, Exc = Exception): try: self.error = None yield except Exc as e: self.error = str(e) class PureSASLClient(SASLClient): def __init__(self, *args, **kwargs): self.error = None super(PureSASLClient, self).__init__(*args, **kwargs) def start(self, mechanism): with error_catcher(self, SASLError): if isinstance(mechanism, list): self.choose_mechanism(mechanism) else: self.choose_mechanism([mechanism]) return True, self.mechanism, self.process() # else return False, mechanism, None def encode(self, incoming): with error_catcher(self): return True, self.unwrap(incoming) # else return False, None def decode(self, outgoing): with error_catcher(self): return True, self.wrap(outgoing) # else return False, None def step(self, challenge=None): with error_catcher(self): return True, self.process(challenge) # else return False, None def getError(self): return self.error