From 7b6f8f1d1748a4cd0569e86f5c98e392840c9c16 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fabian=20Gr=C3=BCnbichler?= Date: Thu, 30 Jan 2020 12:07:52 +0100 Subject: [PATCH] implement api token support MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit and add an example for it. Signed-off-by: Fabian Grünbichler --- PVE/APIClient/LWP.pm | 22 ++++++++++++++++++++-- examples/example3.pl | 24 ++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) create mode 100755 examples/example3.pl diff --git a/PVE/APIClient/LWP.pm b/PVE/APIClient/LWP.pm index 97fd64f..c18210d 100755 --- a/PVE/APIClient/LWP.pm +++ b/PVE/APIClient/LWP.pm @@ -192,12 +192,13 @@ sub call { delete $self->{last_unknown_fingerprint}; my $ticket = $self->{ticket}; + my $apitoken = $self->{apitoken}; my $ua = $self->{useragent}; # fixme: check ticket lifetime? - if (!$ticket && $self->{username} && $self->{password}) { + if (!$ticket && !$apitoken && $self->{username} && $self->{password}) { $self->login(); } @@ -346,9 +347,26 @@ sub new { $self->{useragent}->default_header('Accept-Encoding' => 'gzip'); # allow gzip - $self->update_ticket($param{ticket}) if $param{ticket}; + if ($param{apitoken} && $param{password}) { + warn "password will be ignored in favor of API token\n"; + delete $self->{password}; + } + if ($param{ticket}) { + if ($param{apitoken}) { + warn "ticket will be ignored in favor of API token\n"; + } else { + $self->update_ticket($param{ticket}); + } + } $self->update_csrftoken($param{csrftoken}) if $param{csrftoken}; + if ($param{apitoken}) { + my $agent = $self->{useragent}; + + $self->{apitoken} = $param{apitoken}; + + $agent->default_header('Authorization', $param{apitoken}); + } return $self; } diff --git a/examples/example3.pl b/examples/example3.pl new file mode 100755 index 0000000..d09e052 --- /dev/null +++ b/examples/example3.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl + +# NOTE: you need to set the API token and PVE host below for this to work + +use strict; +use warnings; + +use PVE::APIClient::LWP; + +use JSON; + +my $apitoken = 'PVEAPIToken=USER@REALM!TOKENID=TOKENVALUE'; +my $hostname = "127.0.0.1"; + +my $conn = PVE::APIClient::LWP->new( + apitoken => $apitoken, + host => $hostname, + # allow manual fingerprint verification + manual_verification => 1, + ); + +my $res = $conn->get("/access/permissions", {}); + +print to_json($res, { pretty => 1, canonical => 1}); -- 2.39.2