YOU ARE AN IDIOT! L L L L
#!/usr/bin/perl
#csCounter - v1.5 - 09162005
use CGI::Carp qw(fatalsToBrowser);
use strict;
use vars qw($datapath $flock %in %cookie $basepath $cgipath $cgiurl $imageurl $username $password);
$basepath = "./";
$flock=1;
$in{'scriptname'} = 'csCounter.cgi';
if(-f "$basepath/setup.cgi"){
require("$basepath/setup.cgi");
}
$in{'imageurl'} = $imageurl;
$in{'cgiurl'} = $cgiurl.'/'.$in{'scriptname'};
&main;
sub main{
&GetCookies;
&getdata();
my $command = $in{'command'};
print "Content-type: text/html\n\n";
if((! -e "$basepath/setup.cgi") && ($in{'command'} eq "")){
&DoSetup;
}
if($in{'command'} eq "savesetup"){
if(-e "$basepath/setup.cgi"){
&PError("Error. Permission denied.");
}
else{
&SaveSetup;
}
}
($command eq "")&&($in{'id'})&&(&DoCount);
($command eq "")&&(!$in{'id'})&&(&DoLogin);
($command eq "login")&&(&DoLogin);
&GetLogin;
($command eq "manage")&&(&Manage);
($command eq "delete")&&(&Delete);
($command eq "add")&&(&Add);
($command eq "showadd")&&(&ShowAdd);
($command eq "showedit")&&(&ShowEdit);
($command eq "savechanges")&&(&SaveChanges);
($command eq "showlinks")&&(&ShowLinks);
($command eq "clearcount")&&(&ClearCount);
}
sub DoCount{
my $found=0;
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
open(LCK,">$datapath/$id.lock");
flock(LCK,2);
open(DB,"<$datapath/counters.cgi")||die print "$!: can't open data file";
while(){
chomp;
my($tid,$name,$displayNumber,$ic,$hc,$cd) = split("\t",$_);
if($id == $tid){
$found=1;
$in{'name'} = $name;
$in{'displayNumber'} = $displayNumber;
$in{'ic'} = $ic;
$in{'hc'} = $hc;
$in{'cd'} = $cd;
last;
}
}
close DB;
(!$found)&&(exit);
my $count;
open(DB,"<$datapath/$id.cgi");
($flock)&&(flock(DB,2));
$count=;
($flock)&&(flock(DB,8));
close DB;
if($in{'ic'} eq 'checked'){
($in{'cd'} ne 'checked')?($count++):($count--);
($count < 0)&&($count=0);
}
else{
my $time = time;
my(@l);
my $foundcnt=1;
if(! -f "$datapath/ip.cgi"){
open(IP,">$datapath/ip.cgi");
close IP;
}
open(IP,"+<$datapath/ip.cgi");
($flock)&&(flock(IP,2));
while(){
chomp;
my($i,$t,$cid) = split("\t",$_);
if((time-$t) < 3600){
push(@l,$_);
if($id == $cid){
($i eq $ENV{'REMOTE_ADDR'})&&($foundcnt=0);
}
}
}
seek(IP,0,0);
push(@l,"$ENV{'REMOTE_ADDR'}\t$time\t$id") if ($foundcnt);
foreach my $i (@l){
print IP "$i\n";
}
truncate(IP,tell(DB));
($flock)&&(flock(DB,2));
close IP;
if($foundcnt == 1){
($in{'cd'} ne 'checked')?($count++):($count--);
($count < 0)&&($count=0);
}
}
open(DB,">$datapath/$id.cgi");
($flock)&&(flock(DB,2));
print DB $count;
($flock)&&(flock(DB,8));
close DB;
$count = sprintf("%.".$in{'displayNumber'}."d",$count);
if($in{'hc'} eq 'checked'){
$count=' ';
}
if($in{'js'} == 1){
print "document.write('$count')\n";
}
else{
print $count;
}
flock(LCK,8);
close LCK;
exit;
}
sub ClearCount{
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
unlink("$datapath/$id.cgi");
print qq|
|;
exit;
}
sub ShowLinks{
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
my ($ssiurl,$jsurl);
$ssiurl = $in{'cgiurl'};
$jsurl = $in{'cgiurl'};
$ssiurl =~ s/^http:\/\/.*?\//\//;
$jsurl = "";
$jsurl =~ s/(scr)(ipt)/$1\"\+\"$2/gsi;
$in{'linkJS'} = qq||;
$in{'linkSSI'} = qq||;
$in{'linkPHP'} = qq|\@include("$in{'cgiurl'}?id=$id");?>|;
&PageOut("$basepath/t_links.htm");
exit;
}
sub SaveChanges{
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
my(@l);
($in{'displayNumber'} > 20)&&(&PError("Error. Display number too large"));
open(DB,"+<$datapath/counters.cgi")||die print "$!: can't open data file";
($flock)&&(flock(DB,2));
while(){
chomp;
my($tid,$name,$displayNumber,$ic,$hc,$cd) = split("\t",$_);
if($id != $tid){
push(@l,$_);
}
else{
push(@l,"$id\t$in{'name'}\t$in{'displayNumber'}\t$in{'ic'}\t$in{'hc'}\t$in{'cd'}");
}
}
seek(DB,0,0);
foreach my $i (@l){
print DB "$i\n";
}
truncate(DB,tell(DB));
($flock)&&(flock(DB,8));
close DB;
($in{'count'} =~ /[^\d]/)&&($in{'count'}=0);
open(DB,">$datapath/$id.cgi");
print DB $in{'count'};
close DB;
print qq|
|;
exit;
}
sub Delete{
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
my(@l);
open(DB,"+<$datapath/counters.cgi")||die print "$!: can't open data file";
($flock)&&(flock(DB,2));
while(){
chomp;
my($tid,$name,$displayNumber,$ic,$hc,$cd) = split("\t",$_);
if($id != $tid){
push(@l,$_);
}
}
seek(DB,0,0);
foreach my $i (@l){
print DB "$i\n";
}
truncate(DB,tell(DB));
($flock)&&(flock(DB,8));
close DB;
print qq|
|;
exit;
}
sub Add{
(!$in{'name'})&&(&PError("Error. Enter a name for this counter"));
(!$in{'displayNumber'})&&(&PError("Error. Enter a display number for this counter"));
($in{'name'} =~ /[^A-Za-z0-9 -_]/)&&(&PError("Error. Counter name can only have alpha-numeric characters"));
(length($in{'name'})>50)&&(&PError("Error. Counter name has to be 50 characters or less"));
($in{'displayNumber'} =~ /[^\d]/)&&(&PError("Error. Display number can only be a digit"));
($in{'displayNumber'} > 20)&&(&PError("Error. Display number too large"));
($in{'ic'})&&($in{'ic'} ne 'checked')&&(&PError("Invalid count page selection"));
($in{'hc'})&&($in{'hc'} ne 'checked')&&(&PError("Invalid hidden counter selection"));
($in{'cd'})&&($in{'cd'} ne 'checked')&&(&PError("Invalid hidden count down selection"));
my($id) = &GetID();
open(DB,">>$datapath/counters.cgi")||die print "$!: can't open data file";
print DB "$id\t$in{'name'}\t$in{'displayNumber'}\t$in{'ic'}\t$in{'hc'}\t$in{'cd'}\n";
close DB;
($in{'count'} =~ /[^\d]/)&&($in{'count'}=0);
open(DB,">$datapath/$id.cgi");
print DB $in{'count'};
close DB;
print qq|
|;
exit;
}
sub ShowEdit{
my $found=0;
my $id = $in{'id'};
($id =~ /[^\d]/)&&(&PError("Error. Invalid id"));
open(DB,"<$datapath/counters.cgi")||die print "$!: can't open data file";
while(){
chomp;
my($tid,$name,$displayNumber,$ic,$hc,$cd) = split("\t",$_);
if($id == $tid){
$found=1;
$in{'name'} = $name;
$in{'displayNumber'} = $displayNumber;
$in{'ic'} = $ic;
$in{'hc'} = $hc;
$in{'cd'} = $cd;
last;
}
}
close DB;
(!$found)&&(&PError("Error. No id found"));
open(DB,"<$datapath/$id.cgi");
$in{'count'} = ;
close DB;
$in{'command'} = 'savechanges';
&PageOut("$basepath/t_add.htm");
exit;
}
sub ShowAdd{
$in{'command'} = 'add';
$in{'ic'} = 'checked';
$in{'count'} = '0';
&PageOut("$basepath/t_add.htm");
exit;
}
sub Manage{
open(DB,"<$datapath/counters.cgi");
while(){
chomp;
my($id,$name,$displayNumber,$ic) = split("\t",$_);
my $count=0;
open(CNT,"<$datapath/$id.cgi");
$count = ;
close CNT;
$count = sprintf("%.".$displayNumber."d",$count);
$in{'line'} .= qq|
| |
$name |
$count |
|;
}
close DB;
(!$in{'line'})&&($in{'line'} = qq|| No counters configured | |);
$in{'command'} = 'showadd';
&PageOut("$basepath/t_manage.htm");
exit;
}
sub getdata{
my($usecgi)=@_;
my($in,@in,$loc,$key,$val,$i);
if($usecgi){
use CGI;
CGI::ReadParse(\%in);
}
else{
# Read in text
if ($ENV{'REQUEST_METHOD'} eq "GET") {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
for ($i = 0; $i < $ENV{'CONTENT_LENGTH'}; $i++) {
$in .= getc;
}
}
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Convert %XX from hex numbers to alphanumeric
$in[$i] =~ s/%(..)/pack("c",hex($1))/ge;
# Split into key and value.
$loc = index($in[$i],"=");
$key = substr($in[$i],0,$loc);
$val = substr($in[$i],$loc+1);
$in{$key} .= '\0' if (defined($in{$key})); # \0 is the multiple separator
$in{$key} .= $val;
}
}
}
sub GetCookies{
my $cookies = $ENV{'HTTP_COOKIE'};
my @allcookies = split(/;\s*/,$cookies);
foreach my $i (@allcookies){
my($name,$value) = split(/\s*=\s*/,$i);
$cookie{$name}=$value;
}
}
sub PError{
my($message,$c) = @_;
if($c){
print<<"EOF";
EOF
}
else{
print<<"EOF";
EOF
}
exit;
}
sub htmlspecialchars{
my($buffer) =@_;
$buffer =~ s/\&/\&/g;
$buffer =~ s/\\</g;
$buffer =~ s/\>/\>/g;
$buffer =~ s/\"/\"/g;
return $buffer;
}
sub GetID{
my($id);
open(DB,"<$datapath/_gcount.cgi");
($flock)&&(flock(DB,2));
$id = ;
($flock)&&(flock(DB,8));
close DB;
$id++;
open(DB,">$datapath/_gcount.cgi");
($flock)&&(flock(DB,2));
print DB $id;
($flock)&&(flock(DB,8));
close DB;
return $id;
}
sub reverseHTML{
my($text) = @_;
$text =~ s/\>/>/g;
$text =~ s/\</";
while(){
$_ =~ s/in\((\w+)\)/$in{$1}/g;
print;
}
close OUT;
}
sub GetLogin{
$in{'UserName'} = $cookie{'UserName'};
$in{'PassWord'} = $cookie{'PassWord'};
# if no password, then output the login screen
if(!$in{'UserName'}){
&PageOut("$cgipath/t_login.htm");
exit;
}
if(($in{'UserName'} eq $username)&&($in{'PassWord'} eq $password)){
return 1;
}
# password failed
&PError("Error. Invalid username or password");
}
sub DoSetup{
(-f "$basepath/setup.cgi")&&(&PError("Error. Access Denied"));
use Cwd;
$in{'mcgipath'} = Cwd::cwd();
$in{'mcgiurl'} = "$ENV{'HTTP_HOST'}/$ENV{'SCRIPT_NAME'}";
$in{'mcgiurl'} =~ s/\/\//\//g;
$in{'mcgiurl'} = "http://".$in{'mcgiurl'};
$in{'mcgiurl'} =~ s/\/$in{'scriptname'}//i;
$in{'mimageurl'} = $in{'mcgiurl'}.'/images';
$in{'mdatapath'} = $in{'mcgipath'} .'/data';
&PageOut("$basepath/t_setup.htm");
exit;
}
sub SaveSetup{
(-f "$basepath/setup.cgi")&&(&PError("Error. Access Denied"));
$in{'setup'} =~ s/\r*\n/\n/g;
my $sfile = "$basepath/setup.cgi";
$in{'mcgiurl'} =~ s/[\'\%\$]//g;
$in{'mcgipath'} =~ s/[\'\%\$]//g;
$in{'mimageurl'} =~ s/[\'\%\$]//g;
$in{'mdatapath'} =~ s/[\'\%\$]//g;
$in{'musername'} =~ s/[\'\%\$]//g;
$in{'mpassword'} =~ s/[\'\%\$]//g;
(!$in{'mcgiurl'})&&(&PError("Please enter the cgiurl variable"));
(!$in{'mcgipath'})&&(&PError("Please enter the cgipath variable"));
(!$in{'mimageurl'})&&(&PError("Please enter the imageurl variable"));
(!$in{'musername'})&&(&PError("Please enter a username"));
(!$in{'mpassword'})&&(&PError("Please enter a password"));
open(SETUP,">$basepath/setup.cgi");
print SETUP "\$cgiurl='$in{'mcgiurl'}';\n";
print SETUP "\$cgipath='$in{'mcgipath'}';\n";
print SETUP "\$imageurl='$in{'mimageurl'}';\n";
print SETUP "\$datapath='$in{'mdatapath'}';\n";
print SETUP "\$username='$in{'musername'}';\n";
print SETUP "\$password='$in{'mpassword'}';\n";
print SETUP "1;\n";
print qq|
|;
exit;
}
Idiots Have visited this site. That's counting you too, Idiot
|