From db3e849c09c58f563ef99030bdb264fadaa48bed Mon Sep 17 00:00:00 2001 From: Adam Williamson Date: Thu, 1 Aug 2019 17:55:05 -0700 Subject: [PATCH] Allow EXTERNAL as well as AMQPLAIN auth I'm trying to publish messages from openQA (which uses this client library) to fedora-messaging (which is a RabbitMQ broker using EXTERNAL auth), so I kinda need this. The intent here is that by default we'll try and use either of AMQPLAIN or EXTERNAL if the server advertises one or both, preferring AMQPLAIN; the auth_mechanism query param can be used to specify only one or the other. Signed-off-by: Adam Williamson --- lib/Mojo/RabbitMQ/Client.pm | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/Mojo/RabbitMQ/Client.pm b/lib/Mojo/RabbitMQ/Client.pm index 03d61b1..574868f 100644 --- a/lib/Mojo/RabbitMQ/Client.pm +++ b/lib/Mojo/RabbitMQ/Client.pm @@ -385,9 +385,21 @@ sub _connected { 'Connection::Start' => sub { my $frame = shift; - my @mechanisms = split /\s/, $frame->method_frame->mechanisms; - return $self->emit(error => 'AMQPLAIN is not found in mechanisms') - if none { $_ eq 'AMQPLAIN' } @mechanisms; + my @server_mechanisms = split /\s/, $frame->method_frame->mechanisms; + my $param_mechanism = $self->param('auth_mechanism') // ''; + my @client_mechanisms = ('AMQPLAIN', 'EXTERNAL'); + @client_mechanisms = ($param_mechanism) if ($param_mechanism); + warn "-- Server mechanisms: @server_mechanisms\n" if DEBUG; + warn "-- Client mechanisms: @client_mechanisms\n" if DEBUG; + my $mechanism; + for my $cand (@client_mechanisms) { + if (grep { $_ eq $cand } @server_mechanisms) { + $mechanism = $cand; + last; + } + } + return $self->emit(error => 'No authentication mechanism could be negotiated') + unless $mechanism; my @locales = split /\s/, $frame->method_frame->locales; return $self->emit(error => 'en_US is not found in locales') @@ -404,7 +416,7 @@ sub _connected { information => 'https://github.com/inway/mojo-rabbitmq-client', version => __PACKAGE__->VERSION, }, - mechanism => 'AMQPLAIN', + mechanism => $mechanism, response => {LOGIN => $self->user, PASSWORD => $self->pass}, locale => 'en_US', ), @@ -913,7 +925,9 @@ authority file has been provided, or 0x00 otherwise. =head2 auth_mechanism -Currently only AMQPLAIN is supported, B. +Sets the AMQP authentication mechanism. Defaults to AMQPLAIN. AMQPLAIN and +EXTERNAL are supported; EXTERNAL will only work if L does not need +to do anything beyond passing along a username and password if specified. =head2 heartbeat -- 2.22.0