+++ /dev/null
-#!/usr/bin/perl -w
-
-use strict;
-use WWW::Mechanize;
-use GSSAPI;
-use GSSAPI::OID;
-use MIME::Base64;
-use JSON;
-
-sub parse_token($) {
- my ($json) = @_;
- my $ref = decode_json($json);
- return $ref->{'gssweb'}{'token'};
- }
-
-
-sub token_body($$) {
- my ($target_server, $itoken) = @_;
- my $status;
- my $otoken;
- my $target;
- try: {
- $status = GSSAPI::Name->import( $target,
- $target_server,
- GSSAPI::OID::gss_nt_hostbased_service) or last;
- our $ctx = GSSAPI::Context->new() unless $ctx;
- my $mech;
- $status = GSSAPI::OID->from_str($mech, '{ 1.3.6.1.5.5.15.1.1.17 }') or last;
- my $iflags = GSSAPI::GSS_C_MUTUAL_FLAG | GSSAPI::GSS_C_SEQUENCE_FLAG | GSSAPI::GSS_C_REPLAY_FLAG;
- my $bindings = GSS_C_NO_CHANNEL_BINDINGS;
- my $creds = GSS_C_NO_CREDENTIAL;
- my $itime = 0;
-
- $status = $ctx->init($creds,$target,
- $mech,$iflags,$itime,$bindings,$itoken,
- undef, $otoken,undef,undef);
- }
- print "$status\n";
- return undef unless $otoken;
-
- my $out = "token:" . encode_base64($otoken) ."nonce: 42\n";
- print $out;
- return $out;
-}
-
-my ($url, $gssname) = @ARGV;
-my $www = WWW::Mechanize->new('autocheck' => 0);
-my $done = 0;
-my $response_token = undef;
-unless ($done) {
-
- $www->post($url, 'Content' => token_body($gssname, $response_token));
- my $status = $www->status();
- if ($status == 200) {
- $done = 1;
- print "authenticated: response is ".$www->content()."\n";
- if (token_body($gssname, parse_token($www->content()))) {
- print "Expecting gss success but did not get it!\n";
- }
- } elsif ($status == 401) {
- print "Contiuning\n";
- $response_token = parse_token($www->content());
- } else {
- print "Unexpected response status: $status\n";
- print $www->content();
- }
-}