Backport PR #35 to allow EXTERNAL as well as AMQPLAIN auth
parent
92b9a820a4
commit
bcd200bd27
@ -0,0 +1,70 @@
|
||||
From db3e849c09c58f563ef99030bdb264fadaa48bed Mon Sep 17 00:00:00 2001
|
||||
From: Adam Williamson <awilliam@redhat.com>
|
||||
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 <awilliam@redhat.com>
|
||||
---
|
||||
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<so this parameter is ignored>.
|
||||
+Sets the AMQP authentication mechanism. Defaults to AMQPLAIN. AMQPLAIN and
|
||||
+EXTERNAL are supported; EXTERNAL will only work if L<Mojo::RabbitMQ::Client> does not need
|
||||
+to do anything beyond passing along a username and password if specified.
|
||||
|
||||
=head2 heartbeat
|
||||
|
||||
--
|
||||
2.22.0
|
||||
|
Loading…
Reference in new issue