#!/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 '
Scanned:
'; # exit; #} else { # print $cgi->header; ##} print "Scan "; print "Scanned: $data[2] ($data[1])"; print '
Scan:
'; 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; }