#!/usr/bin/perl use CGI; use CGI::Carp qw(fatalsToBrowser); $cgi= new CGI; if ($cgi->param('source')){&show_source;} 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 :Cue:Cat output."; print "
Please try again!

"; print '
Scanned:
'; exit; } else { print $cgi->header; } print $cgi->start_html('Cue:Cat Decoder'); print $data[2]; print "
$data[1]"; print <Actions:
EOF print '
Scan again:
'; 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; } ############################################################################################## sub send_to_url { my ($raw)=@_; use IO::Socket; $host = "a.dcnv.com"; # Invert case. $raw =~ tr/[a-z][A-Z]/[A-Z][a-z]/; # Connect to webserver. unless ($handle = IO::Socket::INET->new(Proto => 'tcp', PeerAddr => $host, PeerPort => '80')) { print "Failed to connect.\n"; } # Send query to webserver. print $handle "GET /CRQ/1..ACTIVATIONCODE.04".$raw.".0 HTTP/1.0\r\n\r\n"; # Get response from webserver. recv($handle, $info, 2000, 0); # Split response into lines. @lines = split(/\r\n/,$info); foreach $retline (@lines) { ($var,$val) = split (/=/,$retline,2); if ($var eq "url" or $var eq "desc") { $$var = $val; } } #print "$desc\n$url\n\n"; return $url; }