home *** CD-ROM | disk | FTP | other *** search
- #!/usr/bin/perl
-
- # original skript: Shishir Gundavaram, shishir@ora.com
- # z knihy CGI programovanie webovskych stranok a aplikacii
- # vyslo u O'Reilly(tm)
- # cesky preklad ComputerPress, ISBN80-7226-088-X
- # slovensky kometar: Svatoslav Straka, straka@developer.sk
-
- $webmaster = "straka\@developer\.sk";
-
- $method = $ENV{'REQUEST_METHOD'};
- $script = $ENV{'SCRIPT_NAME'};
- $query = $ENV{'QUERY_STRING'};
- $document_root = $ENV{'DOCUMENT_ROOT'};
-
- # $guest_file - relativna cesta k suboru s odkazmi
- $guest_file = "/guestbook.html";
- $full_path = $document_root . $guest_file;
-
- # $exclusive_lock a $unlock maju vyznam len na systemoch na ktorych
- # je implementovany prikaz flock, na Windows nie!
- $exclusive_lock = 2;
- $unlock = 8;
-
-
- if ($method eq "GET") {
- if ($query eq "add") {
- $date_time = &get_date_time();
-
- # Tu si mozete zvolit nazov pre Vas guestbook
- &MIME_header ("text/html", "Developer Zone Guestbook");
-
- # popis ku guestbooku a vytvorenie formulara pre pridavanie odkazov
- print <<End_Of_Guestbook_Form;
-
- Guestbook CGI skript Vam umoznuje nechat nam odkaz. Prosim vypiste
- pozadovane informacie a kliknite na tlacitko "Pridaj odkaz".
- <P>
- Momentalne je: $date_time
- <HR>
-
- <FORM METHOD="POST">
- <PRE>
- <EM>Meno</EM>: <INPUT TYPE="text" NAME="name" SIZE=40>
- <EM>E-mail</EM>: <INPUT TYPE="text" NAME="from" SIZE=40>
- <EM>WWW Server</EM>: <INPUT TYPE="text" NAME="www" SIZE=40>
- </PRE>
- <P>
- <EM>Sem napiste Vas odkaz:</EM><BR>
- <TEXTAREA ROWS=3 COLS=60 NAME="comments"></TEXTAREA><P>
- <INPUT TYPE="submit" VALUE="Pridaj odkaz">
- <INPUT TYPE="reset" VALUE="Vymaz formular"><BR>
- <P>
- </FORM>
- <HR>
-
- End_Of_Guestbook_Form
-
- } else {
-
- if ( open(GUESTBOOK, "<" . $full_path) ) {
- # pokym Vas system nepozna prikaz flock, odpoznamkujte
- # nasledujuci riadok!
- flock (GUESTBOOK, $exclusive_lock);
-
- # Mozete si zvolit nadpis pre stranku, na ktorej budu
- # vypisane odkazy
- &MIME_header ("text/html", "Tu je guestbook!");
- print <<Pridanie_Odkazu;
-
- <a href="$script?add">Pridaj odkaz</a>
- <hr>
- Pridanie_Odkazu
-
- while (<GUESTBOOK>) {
- print;
- }
- # pokym Vas system nepozna prikaz flock, odpoznamkujte
- # nasledujuci riadok!
- flock (GUESTBOOK, $unlock);
- close(GUESTBOOK);
-
- } else {
- &return_error (500, "Guestbook File Error",
- "Cannot read from the guestbook file [$full_path].");
- }
- }
- } elsif ($method eq "POST") {
-
- if ( open (GUESTBOOK, ">>" . $full_path) ) {
-
- # pokym Vas system nepozna prikaz flock, odpoznamkujte
- # nasledujuci riadok!
- flock (GUESTBOOK, $exclusive_lock);
-
- $date_time = &get_date_time();
- &parse_form_data (*FORM);
-
- # Ak uzivatel nezada svoje meno, doplni sa "Anonym"
- $FORM{'name'} = "Anonym" if !$FORM{'name'};
- $FORM{'from'} = $ENV{'REMOTE_HOST'} if !$FORM{'from'};
-
- $FORM{'comments'} =~ s/\n/<BR>/g;
-
- print GUESTBOOK <<End_Of_Write;
-
- <P>
- <B>$date_time:</B><BR>
- Odkaz pridal <EM>$FORM{'name'}</EM>, <EM>$FORM{'from'}</EM>:
- <P>
- $FORM{'comments'}
-
- End_Of_Write
-
-
- if ($FORM{'www'}) {
- print GUESTBOOK <<End_of_Web_Address;
-
- <P>
- $FORM{'name'} je dostupny aj cez:
- <A HREF="$FORM{'www'}">$FORM{'www'}</A>
-
- End_of_Web_Address
-
- }
-
- print GUESTBOOK "<P><HR>";
-
- # pokym Vas system nepozna prikaz flock, odpoznamkujte
- # nasledujuci riadok!
- flock (GUESTBOOK, $unlock);
- close(GUESTBOOK);
-
- # Nadpis pre stranku s podakovanim
- &MIME_header ("text/html", "Dakujeme!");
-
- # podakovanie za pridanie odkazu
- print <<End_of_Thanks;
-
- Dakujeme za navstevu guestbooku. Ak si ho chcete prezriet,
- kliknite <A HREF="$script">sem</A>.
-
- End_of_Thanks
-
- } else {
- &return_error (500, "Guestbook File Error",
- "Cannot write to the guestbook file [$full_path].");
- }
-
- } else {
- &return_error (500, "Server Error",
- "Server uses unsupported method");
- }
-
- exit(0);
-
- sub MIME_header
- {
- local ($mime_type, $title_string, $header) = @_;
-
- if (!$header) {
- $header = $title_string;
- }
-
- print "Content-type: ", $mime_type, "\n\n";
- print "<HTML>", "\n";
- print "<HEAD><TITLE>", $title_string, "</TITLE></HEAD>", "\n";
- print "<BODY>", "\n";
- print "<H1>", $header, "</H1>";
- print "<HR>";
- }
-
- sub get_date_time
- {
- local ($months, $weekdays, $ampm, $time_string);
-
- $months = "januar/febraur/marec/april/maj/jun/jul/" .
- "august/september/oktober/november/december";
- $weekdays = "Nedela/Pondelok/Utorok/Streda/Stvrtok/Piatok/Sobota";
-
- local ($sec, $min, $hour, $day, $nmonth, $year, $wday, $yday, $isdst)
- = localtime(time);
-
- if ($hour > 12) {
- $hour -= 12;
- $ampm = "pm";
- } else {
- $ampm = "am";
- }
-
- if ($hour == 0) {
- $hour = 12;
- }
-
- $year += 1900;
-
- $week = (split("/", $weekdays))[$wday];
- $month = (split("/", $months))[$nmonth];
-
- $time_string = sprintf("%s, %s. %s %s - %02d:%02d:%02d %s",
- $week, $day, $month, $year,
- $hour, $min, $sec, $ampm);
-
- return ($time_string);
- }
-
- sub parse_form_data
- {
- local (*FORM_DATA) = @_;
-
- local ( $request_method, $post_info, @key_value_pairs,
- $key_value, $key, $value);
-
- read (STDIN, $post_info, $ENV{'CONTENT_LENGTH'});
-
- @key_value_pairs = split (/&/, $post_info);
-
- foreach $key_value (@key_value_pairs) {
- ($key, $value) = split (/=/, $key_value);
- $value =~ tr/+/ /;
- $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
-
- if (defined($FORM_DATA{$key})) {
- $FORM_DATA{$key} = join ("\0", $FORM_DATA{$key}, $value);
- } else {
- $FORM_DATA{$key} = $value;
- }
- }
- }
-
- sub return_error
- {
- local ($status, $keyword, $message) = @_;
-
- print "Content-type: text/html", "\n";
- print "Status: ", $status, " ", $keyword, "\n\n";
-
- print <<End_of_Error;
-
- <title>CGI Program - Unexpected Error</title>
- <h1>$keyword</h1>
- <hr>$message</hr>
- Please contact $webmaster for more information.
-
- End_of_Error
-
- exit(1);
- }
-