/auth.pl
#!/usr/bin/perl
use lib qw(/home/doa/perlmods/lib/perl/5.8 /home/doa/perlmods/lib/perl/5.8.8 /home/doa/perlmods/share/perl/5.8 /home/doa/perlmods/share/perl/5.8.8);

use CGI qw/:cgi/;
use CGI::Carp qw/fatalsToBrowser/;
use CGI::Session;
use Net::OpenID::Consumer;
use LWPx::ParanoidAgent;
use DBI;
use Digest::SHA qw/sha256_base64/;
use Vector::User;
use strict;

my $cgi = new CGI;
my $session = new CGI::Session($cgi);

sub consumer_secret {
	my ($time) = @_;

	return sha256_base64("nMgGvUbvI9fL7FafdUQQqcQL+LJBoygSSM8eKyLB7KztDCcoogHAuSbpUuNrGTnzpDewiVkSvL2DcWabNfrNIg${time}vyfC7rWPoimEN1e2T7NkUW8VKBIhGKTBwHEpMISw2DwNFhoraVNbmXTIeBChFPhTxkzkVOMAQTQQMZY9bi0h4M");
}

my $csr = Net::OpenID::Consumer->new(
    ua => LWPx::ParanoidAgent->new,
    args => $cgi,
    consumer_secret => \&consumer_secret,
    required_root => "http://dominionofawesome.com/vector/"
);

if (param('openid.mode')) {
	$csr->handle_server_response(
		not_openid => sub {
			die "Not an OpenID message";
		},
		setup_required => sub {
			my $setup_url = shift;
			print redirect($setup_url);
			exit 0;
		},
		cancelled => sub {
			# Do something appropriate when the user hits "cancel" at the OP
			print redirect('http://dominionofawesome.com/vector/');
			exit 0;
		},
		verified => sub {
			my $vident = shift;
			# Do something with the VerifiedIdentity object $vident
			my $user = Vector::User->fetch_by_name($vident->url)
				or die "Could not fetch user";
			$session->param('id', $user->{user_id});
			$session->param('username', $vident->url);
			$session->param('displayname', $vident->display);
			$session->flush();

			print redirect('http://dominionofawesome.com/vector/');
			exit 0;
		},
		error => sub {
			my ($errcode, $errtext) = @_;
			die("$errcode: $errtext");
		},
	);
} elsif (param('login')) {
	my $uri = param('login');

	# Cheat
	if ($uri =~ /^\w+$/) {
		$uri = "http://id.dominionofawesome.com/$uri";
	}
	my $claimed_identity = $csr->claimed_identity($uri)
		or die "could not get claimed identity for $uri: " . $csr->errcode;

	my $check_url = $claimed_identity->check_url(
	    return_to  => 'http://dominionofawesome.com/vector/auth',
	    trust_root => 'http://dominionofawesome.com/vector/',
	    delayed_return => 1,
	);
	
	print redirect($check_url);
	exit 0;
} elsif (param('logout')) {
	$session->clear();
	$session->flush();

	print redirect('http://dominionofawesome.com/vector/');
	exit 0;
} else {
	print "Content-type: text/plain\r\n\r\n";
	my @params = param();
	print "@params\n";
}