#!/usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);
$cgi= new CGI;
if ($cgi->param('source')){&show_source;}
print "Content-type: text/html\n\n";
my($raw,@data);
$raw=$cgi->param('raw');
@data=&decode($raw);
#if (defined($data[4])){
# print $cgi->redirect("$data[4]");
# exit;
#} elsif (defined($data[3])){
# print $cgi->header;
# print "
The character \"$data[3]\" is not a valid output.";
# print "
Please try again!
";
# print '';
# exit;
#} else {
# print $cgi->header;
##}
print "Scan
";
print "Scanned: $data[2] ($data[1])";
print '
';
open(FILE,"body.html");
while($line=){print $line};
close(FILE);
print $cgi->end_html;
########################################################################
sub descram
{
my $l,@s,$encoded,$r,$n;
$seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-';
($encoded) = @_;
@s = map { index($seq,$_); } split(//,$encoded);
$l = ($#s+1) % 4;
if ($l)
{
if ($l == 1)
{
print "Error!";
return;
}
$l = 4-$l;
$#s += $l;
}
$r = '';
while ($#s >= 0)
{
$n = (($s[0] << 6 | $s[1]) << 6 | $s[2]) << 6 | $s[3];
$r .=chr(($n >> 16) ^ 67) .
chr(($n >> 8 & 255) ^ 67) .
chr(($n & 255) ^ 67);
@s = @s[4..$#s];
}
$r = substr($r,0,length($r)-$l);
return $r;
}
########################################################################
sub decode{
my ($raw)=@_;
my @data;
#Handle Hand Entered Value (HEV)
if ($raw!~/^\./){
$data[2]=$raw;
$data[1]="HEV";
$data[0]="00000000000";
return @data;
exit;
}
my $seq = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.';
#Warn about bad scans
foreach $char (split(//,$raw)){
if ($seq!~/\Q$char\E/){
$data[3]=$char;
return @data;
exit;
}
}
my(@fields) = split(/\./,$raw);
if ($fields[2] eq "aabI"){
$data[4]=&send_to_url($raw);
return @data;
exit;
}
#Do it!
(@data) = map(descram($_), @fields[1..$#fields]);
my $sum;
#Calculate the checksum's, and clip the size
if ($data[1] eq "IB5" ){
$data[2]=substr($data[2],3,length($data[2])-(6+3));
$sum=0;
for ($i=0;$i<=length($data[2]);$i++){
$sum=$sum + substr($data[2],$i,1) * ($i+1);
}
$sum=$sum % 11;
if ($sum == 10){
$sum = "X";
}
} elsif ($data[1] eq "IBN") {
$data[2]=substr($data[2],3,length($data[2])-(1+3));
$sum=0;
for ($i=0;$i<=length($data[2]);$i++){
$sum=$sum + substr($data[2],$i,1) * ($i+1);
}
$sum=$sum % 11;
if ($sum == 10){
$sum = "X";
}
} elsif ($data[1] eq "UPE"){
@sum=split(//,$data[2]);
#remember, these are 0-indexed, so they look wrong! mentaly add one!
#4+2+8=14*3=42 0+9+4+0=13 42+13=55 55/10=5R5 10-5=5
#14*3=39+11=60/10=6R0 10-0=10 10=0
#0407902
$sum=((($sum[1]+$sum[3]+$sum[5])*3)+($sum[0]+$sum[2]+$sum[4]+$sum[6]))%10;
#$sum=$tempsum%10;
#echo "
\n$tempsum
$sum";
#$temp.=$sum;
}
$data[2].=$sum;
return @data;
}
########################################################################
sub show_source {
open(S, $0) || die("open $0: $!\n");
print "Content-type: text/plain\n\n";
while() { print }
close S;
exit;
}