implement api token support master
authorFabian Grünbichler <f.gruenbichler@proxmox.com>
Thu, 30 Jan 2020 11:07:52 +0000 (12:07 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 5 Feb 2020 10:17:18 +0000 (11:17 +0100)
and add an example for it.

Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
PVE/APIClient/LWP.pm
examples/example3.pl [new file with mode: 0755]

index 97fd64f..c18210d 100755 (executable)
@@ -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 (executable)
index 0000000..d09e052
--- /dev/null
@@ -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});