#!/usr/bin/perl
# ungeek.cgi                                                       -*- Perl -*-
#
#   Copyright (C) 1997, Bradley M. Kuhn <bkuhn@ebb.org>
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# Please request a copy of the GNU General Public License from the author, or
# download a copy from http://www.gnu.org/copyleft/gpl.html
# Alternatively, you can obtain a copy by writing to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
#
# Program   :    Bradley M. Kuhn's CGI Package
# File      :    Ungeek  - decode a geek code
#
# Written   :    Bradley M. Kuhn        <bkuhn@acm.org>
#   By                                  http://www.ebb.org/bkuhn
#
#
# TODO:
#  Make it work for more than one geek code at a time
#  Add support so that I can just give a URL
#
# $Source: /home/Site/www.ebb.org/CVS/web-public/cgi-bin/ungeek.cgi,v $
# $Revision: 1.1.1.1 $
# $Date: 1998/09/06 02:59:15 $
#
# $Log: ungeek.cgi,v $
# Revision 1.1.1.1  1998/09/06 02:59:15  bkuhn
# Imported cgi-bin
#
# Revision 0.10  1998/08/13 13:57:36  bkuhn
#   -- added license information
#
# Revision 0.9  1997/10/08 02:51:39  bkuhn
#   -- added url for Ungeek location.
#
# Revision 0.8  1997/10/08 02:50:45  bkuhn
#   -- changed some messages
#
# Revision 0.7  1997/10/08 02:47:22  bkuhn
#   -- fixed location of other .pl script
#
# Revision 0.6  1997/10/08 02:35:06  bkuhn
#   -- changed the error message a bit...
#
# Revision 0.5  1996/07/31 02:35:20  bkuhn
#   -- fixed location of perl
#
# Revision 0.4  1996/05/20  04:46:34  bkuhn
#   -- made headers make more sense
#
# Revision 0.3  1996/05/20  04:40:40  bkuhn
#   -- made decrypt decode
#
# Revision 0.2  1996/05/20  04:24:35  bkuhn
#   -- minor changes
#
# Revision 0.1  1996/05/20  02:59:19  bkuhn
#   # initial version
#

use warnings;
use strict;

use POSIX qw(tmpnam);

# $UNGEEK_SCRIPT is the full path name of Pete Williams ungeek script

my $UNGEEK_SCRIPT = "/var/www/hidden-bin/ungeek.pl";

# $UNGEEK_OPTS is any options to be passed with $UNGEEK_SCRIPT

my $UNGEEK_OPTS = "";

# $GEEK_FORM is the URL of the form to display to the user

my $GEEK_FORM = "http://www.ebb.org/ungeek";

# $SCRIPT_OWNER_EMAIL is the email address  of the script owner

my $SCRIPT_OWNER_EMAIL = "geekcode\@ebb.org";

# $TEMP_FILE is a temporary file that can be written to and is unique to
#  the process

my $TEMP_FILE = POSIX::tmpnam();

###############################################################################
# CONFIGURABLE PARAMETERS ARE ABOVE THIS LINE


my $requestMethod = $ENV{'REQUEST_METHOD'};
my $queryString   = $ENV{'QUERY_STRING'};
my $contentLength = $ENV{'CONTENT_LENGTH'};


if ($requestMethod eq "GET") {
    if ( (! defined($queryString)) && ($queryString eq "") ) {
        print "Location: $GEEK_FORM", "\n\n";
    } else {
        my $formData =
          ParseFormData($requestMethod, $queryString, $contentLength);

        &ExecuteDecode($formData->{geekCode});
    }
} elsif ($requestMethod eq "POST") {
        my $formData = ParseFormData($requestMethod,
                                     $queryString, $contentLength);
        &ExecuteDecode($formData->{geekCode});
} else {
    &HtmlErrorMessage(500, "Server Error", "Server uses unsupported method.");
}
exit 0;
###############################################################################
sub ExecuteDecode ($) {
    my($geekCodeString) = @_;
    my($haveSome, $seenOtherStuff);

    %ENV = ();
    open(TEMP, ">$TEMP_FILE") ||  &HtmlErrorMessage(500, "Server Error",
                                        "Fatal error");

    print "Content-type: text/html\n\n";

    print TEMP "$geekCodeString\n";
    close(TEMP);

    print <<END_OF_PAGE_TOP;
<HTML>
<BASE target="_top">
<HEAD>
<TITLE>Requested Decoded Geek Code</TITLE>

<LINK REV="made" HREF="mailto:$SCRIPT_OWNER_EMAIL">

<META Name="description" Content="This Geek code was decoded by a script writtine by Bradley M. Kuhn ( Brad ) ( bkuhn )">
<META Name="keywords" Content="Kuhn, Bradley, bkuhn, Brad, Geek, Code, geek, code, geeks, 3.1">

</HEAD>
<BODY bgcolor= "#FFFDEF" text = "#000000" link = "#FF0000"
      vlink="#55871a178b85">
<CENTER>
<H1>Decoded Geek Code</H1>
</CENTER>
<HR>

END_OF_PAGE_TOP

    open(GEEK_CODE, "$UNGEEK_SCRIPT $UNGEEK_OPTS < $TEMP_FILE |") ||
        &HtmlErrorMessage(500, "Server Error", "Fatal ungeek script error");

    $haveSome = $seenOtherStuff = 0;
    while (my $line = <GEEK_CODE>) {
        chomp $line;
        $haveSome = 1;

        # ignore ====== lines, until the last one       
        next if ( (! $seenOtherStuff) && ($line =~ /^=+/) );

        $seenOtherStuff = 1;

        if ($line =~ /^\s*\-+ (.+) \-+\s*$/) {
            print "<P><CENTER> <H3> $1 </H3> </CENTER>\n";
        } elsif ($line =~ /^=+/) {
            last;
        } else {
            print "$line\n";
        }
    }
    if (! $haveSome) {
        print "<B> Unable to find a geek code in the text you gave me</B>.",
         "<BR>The mostly likely reason for this is that one of your geek code",
            " characters was not valid.  Make sure your geek code complies\n",
              " <B>exactly</B> with <A href=\"http://www.geekcode.com\">Geek ",
              "Code</A> ",
              "<A HREF=\"http://www.geekcode.com/.codes/geek3.1.html\">",
              "Version 3.12</A>.\n<BR>",
         "In addition, you must have at least 2 sequential valid geek codes ",
        "within in your code.  Thus, for example, 'GCS' alone is not valid.\n";

    } else {
        # print out the actual geek code block at the end
        print "<HR>\n<PRE>\n";
        while (<GEEK_CODE>) {
            print $_;
        }
        print "</PRE>\n";
    }
    close(GEEK_CODE);
    unlink($TEMP_FILE);

    print <<END_OF_PAGE_BOTTOM;

<HR>
This <A HREF="http://www.geekcode.com">Geek Code</A>  was automatically
decoded by a script written by <A HREF="http://www.ebb.org/bkuhn">Bradley M.
Kuhn</A>.
<P>

If you enjoyed this decocder, please make a donation
to help Bradley pay for the cost of bandwidth of the Geek Code Decoder:
</p>

<p>
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but21.gif" border="0" name="submit" alt="Make a donation in appreciation of the Geek Code Decoder Page.">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----
"></p>
</form>
<p>
<A HREF="http://www.ebb.org/ungeek">
Return to the Geek Code Decoder Page</A>
<HR>
Please, report any decoding problems to the author of the decoding script:
<ADDRESS>
<A HREF="http://www.ebb.org/bkuhn">Bradley M. Kuhn</A><BR>
<A HREF="mailto:$SCRIPT_OWNER_EMAIL">$SCRIPT_OWNER_EMAIL</A><BR>
</ADDRESS>
but he rarely has time to work on it anymore or even fix bugs.
</BODY>

</HTML>

END_OF_PAGE_BOTTOM
}
##############################################################################
# ParseFormData parses the form data         
sub ParseFormData
{
    my($requestMethod, $queryString, $contentLength) = @_;

    my (@keyValuePairs, $keyValue, $key, $value, %formData);

    if ($requestMethod eq "GET") {
    } elsif ($requestMethod eq "POST") {
        $queryString = "";
        read(STDIN, $queryString, $contentLength);
    } else {
        &HtmlErrorMessage(500, "Server Error", 
                          "Server uses unsupported method");
    }

    @keyValuePairs = split (/&/, $queryString);

    foreach $keyValue (@keyValuePairs) {
        ($key, $value) = split (/=/, $keyValue);
        $value =~ tr/+/ /;
        $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;

        if (defined($formData{$key})) {
            $formData{$key} = join ("\0", $formData{$key}, $value);
        } else {
	    $formData{$key} = $value;
        }
    }
    return \%formData;
}
###############################################################################
sub HtmlErrorMessage
{
    my($status, $keyword, $message) = @_;

    print "Content-type: text/html\n";
    print "Status: ", $status, " ", $keyword, "\n\n";

    print <<End_of_Error;

<TITLE>Ungeek Decoder CGI - Unexpected Error</TITLE>
<H1>$keyword</H1>
<P>
<HR>
$message
</HR>
Please contact <A HREF="mailto:$SCRIPT_OWNER_EMAIL">$SCRIPT_OWNER_EMAIL</A>;
include the error message in your reply.

End_of_Error

exit($status);
}

