def connection_start(self, ch, msg): if self.client.mechanism is None and self.client.response is not None: # Supports users passing the response argument self.client.mechanism = "PLAIN" serverSupportedMechs = msg.frame.args[3].split() if self.client.mechanism is None: self.client.sasl = get_sasl_mechanism(serverSupportedMechs, self.client.username, self.client.password, sasl_options=self.client.sasl_options) else: if self.client.mechanism not in serverSupportedMechs: raise SaslException("sasl negotiation failed: no mechanism agreed. Client requested: '%s' Server supports: %s" % (self.client.mechanism, serverSupportedMechs)) self.client.sasl = get_sasl_mechanism([self.client.mechanism], self.client.username, self.client.password, sasl_options=self.client.sasl_options) if self.client.sasl is None: raise SaslException("sasl negotiation failed: no mechanism agreed. Client requested: '%s' Server supports: %s" % (self.client.mechanism, serverSupportedMechs)) self.client.mechanism = self.client.sasl.mechanismName() if self.client.response is None: self.client.response = self.client.sasl.initialResponse() msg.start_ok(mechanism=self.client.mechanism, response=self.client.response or "", locale=self.client.locale, client_properties=self.client.client_properties)