#! /usr/bin/perl -w # # --- BEGIN COPYRIGHT BLOCK --- # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; # version 2.1 of the License. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, # Boston, MA 02110-1301 USA # # Copyright (C) 2007 Red Hat, Inc. # All rights reserved. # --- END COPYRIGHT BLOCK --- # ######################################################################## # # Script: esc.cgi # Author: Kin Blas () # Date: 12/19/2003 # # CGI.pm Docs: # # http://stein.cshl.org/WWW/software/CGI/ # ######################################################################## use CGI; $gQuery = new CGI; $gQueryAction = "default"; $gQueryOverrideAction = "default"; @gCookieNames = ("ascScreenName", "ascSubscriptionType", "ascBindings"); $gQueryAction = $gQuery->param("action") if (defined $gQuery->param("action")); $gQueryOverrideAction = $gQuery->param("override_action") if (defined $gQuery->param("override_action")); if ($gQueryOverrideAction ne "default") { $gQueryAction = $gQueryOverrideAction; } ######################################################################## # # If no action was provided, we default to showing our # admin page! # # http://www.foo.com/esc.cgi # ######################################################################## if ($gQueryAction eq "default") { GenerateAdminPage(); exit 0; } ######################################################################## # # We aren't doing any admin functions, before proceeding # on to user specific functions, make sure we have a screen name # and that they are subscribed to a service. # ######################################################################## #if (!HaveScreenName() || $gQueryAction eq "screennamepage") #{ # GenerateScreenNamePage($gQueryAction); # exit 0; #} LoadUserDatabase("default"); ######################################################################## # # Subscribe? # # http://www.foo.com/esc.cgi?action=subscribe # ######################################################################## #if ($gQueryAction eq "subscribe") #{ # SaveSubscription(); # $nextAction = GetNextAction(); # $redirectLocation = $gQuery->url(-path_info=>1)."?action=$nextAction&screenname=".GetScreenName(); # print $gQuery->redirect(-uri=>$redirectLocation); # exit 0; #} #if (!IsSubscriber() || $gQueryAction eq "subscriptionpage") #{ # GenerateTOSPage($gQueryAction); # exit 0; #} ######################################################################## # # Show our cookie management page? # # http://www.foo.com/esc.cgi?action=cookiepage # ######################################################################## #if ($gQueryAction eq "cookiepage") #{ # GenerateCookiesPage(); # exit 0; #} ######################################################################## # # Clear cookies? # # http://www.foo.com/esc.cgi?action=clearAllCookies # ######################################################################## #if ($gQueryAction eq "removeCookies") #{ # @expCookies = (); # foreach $cookie (@gCookieNames) # { # if (defined $gQuery->param($cookie)) # { # $expCookies[$cookieCnt++] = CreateExpiredCookie($cookie); # } # } # $redirectLocation = $gQuery->url(-path_info=>1)."?action=cookiepage&screenname=".GetScreenName(); # print $gQuery->redirect(-uri=>$redirectLocation, # -cookie=>\@expCookies); # exit 0; #} ######################################################################## # # Bind? # # ######################################################################## if ($gQueryAction eq "bind") { UpdateBindingsForBind(); $nextAction = GetNextAction(); $nextAction = "bindpage" if ($nextAction eq $gQueryAction); $redirectLocation = $gQuery->url(-path_info=>1)."?action=$nextAction&prevaction=bind&screenname=".GetScreenName()."&keytype=".GetKeyType()."&keyid=".GetKeyID()."&keylabel=".GetKeyLabelArg(); print $gQuery->redirect(-uri=>$redirectLocation); exit 0; } ######################################################################## # # Unbind? # # ######################################################################## if ($gQueryAction eq "unbind") { UpdateBindingsForUnbind(); $nextAction = GetNextAction(); $nextAction = "bindpage" if ($nextAction eq $gQueryAction); $redirectLocation = $gQuery->url(-path_info=>1)."?action=$nextAction&prevaction=unbind&screenname=".GetScreenName()."&keytype=".GetKeyType()."&keyid=".GetKeyID()."&keylabel=".GetKeyLabelArg(); print $gQuery->redirect(-uri=>$redirectLocation); exit 0; } ######################################################################## # # Label? # # ######################################################################## if ($gQueryAction eq "label") { UpdateBindingsForLabel(); $nextAction = GetNextAction(); $nextAction = "bindpage" if ($nextAction eq $gQueryAction); $redirectLocation = $gQuery->url(-path_info=>1)."?action=$nextAction&screenname=".GetScreenName(); print $gQuery->redirect(-uri=>$redirectLocation); exit 0; } ######################################################################## # # ScreenName? # # ######################################################################## #if ($gQueryAction eq "screenname") #{ # $nextAction = GetNextAction(); # $redirectLocation = $gQuery->url(-path_info=>1)."?action=$nextAction&screenname=".GetScreenName(); # print $gQuery->redirect(-uri=>$redirectLocation); # exit 0; #} ######################################################################## # # Check if we are displaying the label page. # # ######################################################################## if ($gQueryAction eq "labelpage") { my $nextAction = GetNextAction(); $nextAction = "bindpage" if ($nextAction eq $gQueryAction); my $keyType = GetKeyType(); my $keyId = GetKeyID(); GenerateLabelPage($keyType, $keyId, $nextAction); exit 0; } ######################################################################## # # Show our enrollment page? # # http://www.foo.com/esc.cgi?action=enrollmentpage # ######################################################################## if ($gQueryAction eq "enrollmentpage") { GenerateEnrollmentPage(); exit 0; } if ($gQueryAction eq "advancepage") { GenerateAdvancePage(); exit 0; } if ($gQueryAction eq "tokenmanagerpage") { GenerateTokenManagerPage(); exit 0; } if($gQueryAction eq "authenticate") { GenerateAuthenticationPage(); exit 0; } if ($gQueryAction eq "autoenroll") { GenerateAutoEnrollmentPage(); exit 0; } ######################################################################## # # Show our ticket request page? # # ######################################################################## if ($gQueryAction eq "ticketreqpage") { GenerateTicketRequestPage(); exit 0; } ######################################################################## # # Show our load external url page? # # http://www.foo.com/esc.cgi?action=loadurlpage # ######################################################################## if ($gQueryAction eq "loadurl") { $nextAction = GetNextAction(); $redirectLocation = $gQuery->param('url'); print $gQuery->redirect(-uri=>$redirectLocation); exit 0; } if ($gQueryAction eq "loadurlpage") { GenerateLoadURLPage(); exit 0; } ######################################################################## # # User is subscribed, check if we are displaying the # settings page. # # ######################################################################## if ($gQueryAction eq "settingspage") { GenerateSettingsPage(); exit 0; } ######################################################################## # # Check if we are displaying the set label page. # # ######################################################################## if ($gQueryAction eq "setlabelpage") { GenerateSetLabelPage(); exit 0; } ######################################################################## # # Check if we are displaying the bind/unbind progress page! # # ######################################################################## if ($gQueryAction eq "bindprogresspage") { GenerateBindProgressPage("bind"); exit 0; } if ($gQueryAction eq "unbindprogresspage") { GenerateBindProgressPage("unbind"); exit 0; } ######################################################################## # # Check if we are displaying the bind/unbind success page! # # ######################################################################## if ($gQueryAction eq "bindsuccesspage") { GenerateBindSuccessPage("bind"); exit 0; } if ($gQueryAction eq "unbindsuccesspage") { GenerateBindSuccessPage("unbind"); exit 0; } ######################################################################## # # XXX: Lose this code! # User is subscribed, check if we are displaying the # binding page. # # ######################################################################## if ($gQueryAction eq "bindpage") { GenerateBindingConfigPage(); exit 0; } print "

Unknown Query Action "; print $qQueryAction; print "

"; exit 0; ######################################################################## # # ######################################################################## sub ExitError { my($str) = @_; print $gQuery->header(), $gQuery->start_html(), $str, $gQuery->end_html(); exit 0; } sub GetScreenName { my $sn = ""; if (defined $gQuery->param("screenname")) { $sn = $gQuery->param("screenname"); } else { $sn = "default"; } return $sn; } sub GetKeyType { my $keyType = 0; if (defined $gQuery->param("keytype")) { $keyType = $gQuery->param("keytype"); } return $keyType; } sub GetKeyID { my $keyID = ""; if (defined $gQuery->param("keyid")) { $keyID = $gQuery->param("keyid"); } return $keyID; } sub GetKeyLabelArg { my $keyLabel = ""; if (defined $gQuery->param("keylabel")) { $keyLabel = $gQuery->param("keylabel"); } return $keyLabel; } sub HaveScreenName { return 1 if (GetScreenName() ne ""); return 0; } sub IsSubscriber { my $subType = $gUserObj{'SUBSCRIPTION'}; return 1 if ($subType eq "HouseKey" || $subType eq "NetKey"); return 0; } sub GetNextAction { my($nextActn) = "default"; if (defined $gQuery->param('nextaction')) { $nextActn = $gQuery->param('nextaction'); } elsif (defined $gQuery->param('action')) { $nextActn = $gQuery->param('action'); } return $nextActn; } sub GenerateAdminPage() { my ($l); ExitError("Failed to load Admin Page") if (!open(ADMIN_FILE, "< ./AdminEsc.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; } print $l; } close(ADMIN_FILE); } sub GenerateCookiesPage() { my ($nextPage) = @_; my ($l); ExitError("Failed to load TOS Page") if (!open(COOKIE_FILE, "< Cookies.html")); print $gQuery->header(); while ($l = ) { if ($l =~ /SECURECOOL_COOKIE_LIST/) { my @cookies = $gQuery->cookie(); if (@cookies < 1) { print "No ASC Cookies currently defined!
\n"; } else { my $cookieName; foreach $cookieName (@cookies) { # # Display only ASC related cookies! # if ($cookieName =~ /^asc/) { print "$cookieName", $gQuery->cookie($cookieName), "\n"; } } print "
\n"; } } elsif ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(COOKIE_FILE); } sub GenerateScreenNamePage { my ($nextPage) = @_; my ($l); ExitError("Failed to load ScreenName Page") if (!open(SN_FILE, "< ScreenName.html")); print $gQuery->header(); my $sn = GetScreenName(); while ($l = ) { if ($l =~ /SECURECOOL_NEXTACTION_INPUT_TAG/) { if ($nextPage) { print "\n"; print "\n"; } if ($sn) { print "\n"; } } elsif ($l =~ //) { $l =~ s//$sn/g; print $l; } else { print $l; } } close(SN_FILE); } sub GenerateTOSPage { my ($nextPage) = @_; my ($l); ExitError("Failed to load TOS Page") if (!open(TOS_FILE, "< Subscribe.html")); print $gQuery->header(); while ($l = ) { if ($l =~ /SECURECOOL_NEXTACTION_INPUT_TAG/) { if ($nextPage) { print "\n"; print "\n"; } } elsif ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(TOS_FILE); } sub GenerateSettingsPage { my ($l); ExitError("Failed to load settings page!") if (!open(SETTINGS_FILE, "< SettingsEsc.html")); print $gQuery->header(); while ($l = ) { if ($l =~ /SECURECOOL_BINDINGS_ARRAY/) { my(@curBindings) = GetBindings(); my $arrSize = scalar(@curBindings); my($i); for ($i = 0; $i < $arrSize; $i++) { my($keyType, $keyId, $keyLabel) = split(/&/, $curBindings[$i]); print " [ $keyType, \"$keyId\", \"$keyLabel\" ]"; print "," if ($arrSize > 1 && $i != $arrSize - 1); print "\n"; } } elsif ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(SETTINGS_FILE); } sub GenerateSetLabelPage { my ($l); ExitError("Failed to open label page!") if (!open(LABEL_PAGE, "< Label.html")); my $sn = GetScreenName(); ExitError("Failed to get a valid screen name!") if (! $sn); my $keyType = GetKeyType(); my $keyID = GetKeyID(); ExitError("Failed to get a valid keyID!") if (! $keyID); $defLabel = $keyID; $defLabel =~ s/^[0-9a-fA-F]{12}//; $defLabel = "$sn-$defLabel"; print $gQuery->header(); while ($l = ) { if ($l =~ //) { $l =~ s//$sn/g; } if ($l =~ //) { $l =~ s//$keyType/g; } if ($l =~ //) { $l =~ s//$keyID/g; } if ($l =~ //) { $l =~ s//$defLabel/g; } print $l; } close(LABEL_FILE); } sub GenerateBindProgressPage { my ($action) = @_; my ($l); ExitError("Failed to open progress page!") if (!open(PROG_PAGE, "< Progress.html")); my $sn = GetScreenName(); ExitError("Failed to get a valid screen name!") if (! $sn); my $keyType = GetKeyType(); my $keyID = GetKeyID(); ExitError("Failed to get a valid keyID!") if (! $keyID); my $keyLabel = ""; if ($action eq "bind") { $keyLabel = GetKeyLabelArg(); ExitError("Failed to get a valid keyLabel!") if (! $keyLabel); } print $gQuery->header(); while ($l = ) { if ($l =~ //) { $l =~ s//$sn/g; } if ($l =~ //) { $l =~ s//$keyType/g; } if ($l =~ //) { $l =~ s//$keyID/g; } if ($l =~ //) { $l =~ s//$keyLabel/g; } if ($l =~ //) { $l =~ s//$action/g; } if ($l =~ //) { $challengeData = ""; $challengeData = "QVNDIHJvY2tzIHRoZSBwYXJ0eSE=" if ($action eq "bind"); $l =~ s//$challengeData/g; } print $l; } close(PROG_PAGE); } sub GenerateBindSuccessPage { my ($action) = @_; my ($l); ExitError("Failed to open progress page!") if (!open(SUCCESS_PAGE, "< BindSuccess.html")); my $sn = GetScreenName(); ExitError("Failed to get a valid screen name!") if (! $sn); my $keyType = GetKeyType(); my $keyID = GetKeyID(); ExitError("Failed to get a valid keyID!") if (! $keyID); my $keyLabel = ""; if ($action eq "bind") { $keyLabel = GetKeyLabelArg(); ExitError("Failed to get a valid keyLabel!") if (! $keyLabel); } print $gQuery->header(); while ($l = ) { if ($l =~ //) { $l =~ s//$sn/g; } if ($l =~ //) { $l =~ s//$keyType/g; } if ($l =~ //) { $l =~ s//$keyID/g; } if ($l =~ //) { $l =~ s//$keyLabel/g; } if ($l =~ //) { $l =~ s//$action/g; } print $l; } close(SUCCESS_PAGE); } sub GenerateBindingConfigPage { my ($l); ExitError("Failed to load binding page!") if (!open(BINDING_FILE, "< Bindings.html")); print $gQuery->header(); while ($l = ) { if ($l =~ /SECURECOOL_BINDINGS_ARRAY/) { my(@curBindings) = GetBindings(); my $arrSize = scalar(@curBindings); my($i); for ($i = 0; $i < $arrSize; $i++) { my($keyType, $keyId, $keyLabel) = split(/&/, $curBindings[$i]); print " [ $keyType, \"$keyId\", \"$keyLabel\" ]"; print "," if ($arrSize > 1 && $i != $arrSize - 1); print "\n"; } } elsif ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(BINDING_FILE); } sub GetKeyLabel { my($keyType, $keyId) = @_; my(@curBindings) = GetBindings(); my($numBindings) = scalar(@curBindings); while($numBindings > 0) { --$numBindings; if ($curBindings[$numBindings] =~ /^$keyType&$keyId&/) { my($ktype, $id, $lbl) = split(/&/, $curBindings[$numBindings]); return $lbl; } } return ""; } sub GenerateLabelPage { my($keyType, $keyId, $nextAction) = @_; my($keyLabel) = GetKeyLabel($keyType, $keyId); return if ($keyLabel eq ""); my ($l); ExitError("Failed to load label page!") if (!open(EDIT_LABEL_FILE, "< EditLabel.html")); print $gQuery->header(); while ($l = ) { if ($l =~ /SECURECOOL_NEXTACTION_INPUT_TAG/) { print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; } elsif ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(EDIT_LABEL_FILE); } sub GenerateAutoEnrollmentPage { my ($l); ExitError("Failed to load enrollment page!") if (!open(ENROLL_FILE, "< EnrollPopup.html")); print $gQuery->header(); while ($l = ) { print $l; } close(ENROLL_FILE); } sub GenerateAuthenticationPage { my ($l); ExitError("Failed to load enrollment page!") if (!open(AUTH_FILE, "< GenericAuth.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(AUTH_FILE); } sub GenerateEnrollmentPage { my ($l); ExitError("Failed to load enrollment page!") if (!open(ENROLL_FILE, "< EnrollPopup.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(ENROLL_FILE); } sub GenerateAdvancePage { my ($l); ExitError("Failed to load enrollment page!") if (!open(ENROLL_FILE, "< AdvancePopup.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(ENROLL_FILE); } sub GenerateTokenManagerPage { my ($l); ExitError("Failed to load enrollment page!") if (!open(ENROLL_FILE, "< TokenManager.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(ENROLL_FILE); } sub GenerateTicketRequestPage { my ($l); ExitError("Failed to load ticket request page!") if (!open(TICKETREQ_FILE, "< Ticket.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(TICKETREQ_FILE); } sub GenerateLoadURLPage { my ($l); ExitError("Failed to load url request page!") if (!open(LOADURL_FILE, "< LoadURL.html")); print $gQuery->header(); while ($l = ) { if ($l =~ //) { my $sn = GetScreenName(); $l =~ s//$sn/g; print $l; } else { print $l; } } close(LOADURL_FILE); } sub CreateExpiredCookie { my($cookieName) = @_; my $cookie = $gQuery->cookie(-name=>$cookieName, -value=>'', -expires=>'-2d', -path=>$gQuery->url(-absolute=>1), -domain=>$gQuery->server_name()); return $cookie; } sub SaveSubscription { $gUserObj{'SUBSCRIPTION'} = $gQuery->param("subscriptiontype"); SaveUserDatabase(GetScreenName()); } sub GetBindings { my $bindings = $gUserObj{'BINDINGS'}; return @$bindings; } sub BindingsArrayToString { my(@bindings) = @_; my $i; my $str = ""; for ($i = 0; $i < @bindings; $i++) { if ($bindings[$i] ne "") { $str .= "&" if ($str ne ""); $str .= ASCUrlEncode($bindings[$i]); } } return $str; } sub AddItemToBindings { my($keyType, $keyId, $keyLabel) = @_; my(@curBindings) = GetBindings(); my($pos) = scalar(@curBindings); # First check to see if the key already exists in # the cookie! If it does, we'll just overwrite it. my($i) = $pos; while($i > 0) { --$i; if ($curBindings[$i] =~ /^$keyType&$keyId&/) { $pos = $i; last; } } $curBindings[$pos] = "$keyType&$keyId&$keyLabel"; $gUserObj{'BINDINGS'} = \@curBindings; #SaveUserDatabase(GetScreenName()); } sub RemoveItemFromBindings { my($keyType, $keyId) = @_; my(@curBindings) = GetBindings(); my($numBindings) = scalar(@curBindings); my @newBindings; while($numBindings > 0) { --$numBindings; next if ($curBindings[$numBindings] =~ /^$keyType&$keyId&/); push @newBindings, $curBindings[$numBindings]; } $gUserObj{'BINDINGS'} = \@newBindings; #SaveUserDatabase(GetScreenName()); } sub UpdateBindingsForBind { return if (! defined $gQuery->param("keytype")); my($keyType) = $gQuery->param("keytype"); return if (! defined $gQuery->param("keyid")); my($keyId) = $gQuery->param("keyid"); return if (! defined $gQuery->param("keylabel")); my($keyLabel) = $gQuery->param("keylabel"); return AddItemToBindings($keyType, $keyId, $keyLabel); } sub UpdateBindingsForUnbind { return if (! defined $gQuery->param("keytype")); my($keyType) = $gQuery->param("keytype"); return if (! defined $gQuery->param("keyid")); my($keyId) = $gQuery->param("keyid"); return RemoveItemFromBindings($keyType, $keyId,); } sub UpdateBindingsForLabel { return UpdateBindingsForBind(); } sub ASCUrlDecode { my($qstr) = @_; $qstr =~ s/\+/ /g; $qstr =~ s/%([0-9A-F]{2})/pack("C", hex($1))/eig; return $qstr; } sub ASCUrlEncode { my($qstr) = @_; $qstr =~ s/([^a-zA-Z0-9_ ])/sprintf("%%%.2X", unpack("C", $1))/eig; $qstr =~ s/ /+/g; return $qstr; } sub LoadUserDatabase { my($sn) = @_; $gUserObj{'SUBSCRIPTION'} = ""; $gUserObj{'BINDINGS'} = ""; return; } sub SaveUserDatabase { my($sn) = @_; my($snfile) = "UserDatabase/$sn"; return; }