source: preprover/abac_preprover_client.pl

Last change on this file was ab52de1, checked in by Mike Ryan <mikeryan@…>, 12 years ago

bump to version 0.2.0

  • Property mode set to 100755
File size: 2.4 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4use Getopt::Long;
5use Data::Dumper;
6use RPC::XML qw(smart_encode);
7use RPC::XML::Parser;
8use Crypt::SSLeay;
9use LWP::UserAgent;
10use HTTP::Request;
11
12use ABAC;
13
14use constant {
15    USER_AGENT  => 'abac/0.2.0',
16};
17
18my ($keystore, $cert, $key, $role);
19my $url = 'localhost:8000';
20GetOptions(
21    'keystore=s'    => \$keystore,
22    'url=s'         => \$url,
23    'cert=s'        => \$cert,
24    'key=s'         => \$key,
25    'role=s'        => \$role,
26) || usage();
27
28usage() unless defined $keystore && defined $cert && defined $key && defined $role;
29
30# code starts here
31
32# load the certificates
33my $context = ABAC::Context->new;
34$context->load_directory($keystore);
35
36# build the XML RPC request
37my $request = RPC::XML::request->new(
38    'abac.query',
39    smart_encode({
40        role => $role,
41        credentials => [
42            map {{
43                attribute_cert  => RPC::XML::base64->new($_->attribute_cert),
44                issuer_cert     => RPC::XML::base64->new($_->issuer_cert),
45            }} @{$context->credentials}
46        ],
47    }),
48);
49
50# encode and send the HTTP POST
51my $request_body = $request->as_string;
52
53$ENV{HTTPS_CERT_FILE} = $cert;
54$ENV{HTTPS_KEY_FILE} = $key;
55# $ENV{HTTPS_DEBUG} = 1;
56
57my $ua = LWP::UserAgent->new;
58
59my $request = HTTP::Request->new(
60    'POST',
61    "https://$url/RPC2",
62);
63$request->header('User-Agent', USER_AGENT);
64$request->header('Content-Length', length $request_body);
65$request->content($request_body);
66
67my $response = $ua->request($request);
68if (!$response->is_success) {
69    die $response->status_line;
70}
71
72# decode the reply
73my $xmlrpc_response = RPC::XML::Parser->new->parse($response->decoded_content);
74my $result = $xmlrpc_response->value->value;
75
76# load all the credentials from the reply
77foreach my $cred (@{$result->{credentials}}) {
78    $context->load_identity_chunk($cred->{attribute_cert});
79    $context->load_attribute_chunk($cred->{attribute_cert});
80}
81
82my $success = $result->{success};
83if ($success) {
84    print "Success\n";
85}
86
87foreach my $cred (@{$context->credentials}) {
88    printf "Credential %s <- %s\n",
89        $cred->head->string,
90        $cred->tail->string;
91}
92
93sub usage {
94    print "Usage: $0 \\\n";
95    print "        --keystore <keystore> [ --url <host:port> ] \\\n";
96    print "        --cert <cert.pem> --key <key.pem> \\\n";
97    print "        --role <keyid.role>\n";
98    print "    url defaults to localhost:8000\n";
99    exit 1;
100}
Note: See TracBrowser for help on using the repository browser.