home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / internet / develop / temp / cgi / guestbook.txt
Encoding:
Text File  |  2001-07-13  |  6.2 KB  |  249 lines

  1. #!/usr/bin/perl
  2.  
  3. # original skript: Shishir Gundavaram, shishir@ora.com
  4. # z knihy CGI programovanie webovskych stranok a aplikacii
  5. # vyslo u O'Reilly(tm)
  6. # cesky preklad ComputerPress, ISBN80-7226-088-X
  7. # slovensky kometar: Svatoslav Straka, straka@developer.sk
  8.  
  9. $webmaster = "straka\@developer\.sk";
  10.  
  11. $method = $ENV{'REQUEST_METHOD'};
  12. $script = $ENV{'SCRIPT_NAME'};
  13. $query  = $ENV{'QUERY_STRING'};
  14. $document_root = $ENV{'DOCUMENT_ROOT'};
  15.  
  16. # $guest_file - relativna cesta k suboru s odkazmi
  17. $guest_file = "/guestbook.html";
  18. $full_path = $document_root . $guest_file;
  19.  
  20. # $exclusive_lock a $unlock maju vyznam len na systemoch na ktorych
  21. # je implementovany prikaz flock, na Windows nie!
  22. $exclusive_lock = 2;
  23. $unlock = 8;
  24.  
  25.  
  26. if ($method eq "GET") {
  27.     if ($query eq "add") {
  28.     $date_time = &get_date_time();
  29.         
  30.         # Tu si mozete zvolit nazov pre Vas guestbook
  31.         &MIME_header ("text/html", "Developer Zone Guestbook");
  32.  
  33. # popis ku guestbooku a vytvorenie formulara pre pridavanie odkazov
  34.         print <<End_Of_Guestbook_Form;
  35.  
  36. Guestbook CGI skript Vam umoznuje nechat nam odkaz. Prosim vypiste 
  37. pozadovane informacie a kliknite na tlacitko "Pridaj odkaz".
  38. <P>
  39. Momentalne je: $date_time
  40. <HR>
  41.  
  42. <FORM METHOD="POST">
  43. <PRE>
  44. <EM>Meno</EM>:       <INPUT TYPE="text" NAME="name" SIZE=40>
  45. <EM>E-mail</EM>:     <INPUT TYPE="text" NAME="from" SIZE=40>
  46. <EM>WWW Server</EM>: <INPUT TYPE="text" NAME="www"  SIZE=40>
  47. </PRE>
  48. <P>
  49. <EM>Sem napiste Vas odkaz:</EM><BR>
  50. <TEXTAREA ROWS=3 COLS=60 NAME="comments"></TEXTAREA><P>
  51. <INPUT TYPE="submit" VALUE="Pridaj odkaz">
  52. <INPUT TYPE="reset"  VALUE="Vymaz formular"><BR>
  53. <P>
  54. </FORM>
  55. <HR>
  56.  
  57. End_Of_Guestbook_Form
  58.  
  59.     } else {
  60.  
  61.     if ( open(GUESTBOOK, "<" . $full_path) ) {
  62.                 # pokym Vas system nepozna prikaz flock, odpoznamkujte
  63.                 # nasledujuci riadok!
  64.                 flock (GUESTBOOK, $exclusive_lock);
  65.         
  66.         # Mozete si zvolit nadpis pre stranku, na ktorej budu
  67.         # vypisane odkazy
  68.         &MIME_header ("text/html", "Tu je guestbook!");
  69.                 print <<Pridanie_Odkazu;
  70.  
  71. <a href="$script?add">Pridaj odkaz</a>
  72. <hr>
  73. Pridanie_Odkazu
  74.                 
  75.                 while (<GUESTBOOK>) {
  76.                     print;
  77.                 }
  78.                 # pokym Vas system nepozna prikaz flock, odpoznamkujte
  79.                 # nasledujuci riadok!
  80.                 flock (GUESTBOOK, $unlock);
  81.                 close(GUESTBOOK);
  82.         
  83.     } else {
  84.                 &return_error (500, "Guestbook File Error",
  85.             "Cannot read from the guestbook file [$full_path].");
  86.         }
  87.    }
  88. } elsif ($method eq "POST") {
  89.     
  90.     if ( open (GUESTBOOK, ">>" . $full_path) ) {
  91.         
  92.         # pokym Vas system nepozna prikaz flock, odpoznamkujte
  93.         # nasledujuci riadok!
  94.         flock (GUESTBOOK, $exclusive_lock);
  95.  
  96.     $date_time = &get_date_time();
  97.     &parse_form_data (*FORM);
  98.         
  99.         # Ak uzivatel nezada svoje meno, doplni sa "Anonym"
  100.         $FORM{'name'}  = "Anonym"               if !$FORM{'name'};
  101.         $FORM{'from'}  = $ENV{'REMOTE_HOST'}    if !$FORM{'from'};
  102.         
  103.         $FORM{'comments'} =~ s/\n/<BR>/g;
  104.  
  105.         print GUESTBOOK <<End_Of_Write;
  106.  
  107. <P>
  108. <B>$date_time:</B><BR>
  109. Odkaz pridal <EM>$FORM{'name'}</EM>, <EM>$FORM{'from'}</EM>:
  110. <P>
  111. $FORM{'comments'}
  112.  
  113. End_Of_Write
  114.  
  115.  
  116.         if ($FORM{'www'}) {
  117.             print GUESTBOOK <<End_of_Web_Address;
  118.             
  119. <P>
  120. $FORM{'name'} je dostupny aj cez: 
  121. <A HREF="$FORM{'www'}">$FORM{'www'}</A>
  122.  
  123. End_of_Web_Address
  124.  
  125.         }
  126.         
  127.         print GUESTBOOK "<P><HR>";
  128.         
  129.         # pokym Vas system nepozna prikaz flock, odpoznamkujte
  130.         # nasledujuci riadok!
  131.         flock (GUESTBOOK, $unlock);
  132.         close(GUESTBOOK);
  133.  
  134.         # Nadpis pre stranku s podakovanim
  135.         &MIME_header ("text/html", "Dakujeme!");
  136.  
  137.         # podakovanie za pridanie odkazu
  138.         print <<End_of_Thanks;
  139.         
  140. Dakujeme za navstevu guestbooku. Ak si ho chcete prezriet,
  141. kliknite <A HREF="$script">sem</A>.
  142.  
  143. End_of_Thanks
  144.  
  145.     } else {
  146.         &return_error (500, "Guestbook File Error",
  147.                "Cannot write to the guestbook file [$full_path].");
  148.     }
  149.         
  150. } else {
  151.     &return_error (500, "Server Error",
  152.                         "Server uses unsupported method");
  153. }
  154.  
  155. exit(0);
  156.  
  157. sub MIME_header
  158. {
  159.     local ($mime_type, $title_string, $header) = @_;
  160.  
  161.     if (!$header) {
  162.         $header = $title_string;
  163.     }
  164.  
  165.     print "Content-type: ", $mime_type, "\n\n";
  166.     print "<HTML>", "\n";
  167.     print "<HEAD><TITLE>", $title_string, "</TITLE></HEAD>", "\n";
  168.     print "<BODY>", "\n";
  169.     print "<H1>", $header, "</H1>";
  170.     print "<HR>";
  171. }
  172.  
  173. sub get_date_time 
  174. {
  175.     local ($months, $weekdays, $ampm, $time_string);
  176.  
  177.     $months = "januar/febraur/marec/april/maj/jun/jul/" . 
  178.               "august/september/oktober/november/december";
  179.     $weekdays = "Nedela/Pondelok/Utorok/Streda/Stvrtok/Piatok/Sobota";
  180.  
  181.     local ($sec, $min, $hour, $day, $nmonth, $year, $wday, $yday, $isdst) 
  182.               = localtime(time);
  183.  
  184.     if ($hour > 12) {
  185.         $hour -= 12;
  186.         $ampm = "pm";
  187.     } else {
  188.         $ampm = "am";
  189.     }
  190.  
  191.     if ($hour == 0) {
  192.            $hour = 12;
  193.     }
  194.  
  195.     $year += 1900;
  196.  
  197.     $week  = (split("/", $weekdays))[$wday];
  198.     $month = (split("/", $months))[$nmonth];
  199.  
  200.     $time_string = sprintf("%s, %s. %s %s - %02d:%02d:%02d %s", 
  201.                                 $week, $day, $month, $year, 
  202.                                 $hour, $min, $sec, $ampm);
  203.  
  204.     return ($time_string);
  205. }
  206.  
  207. sub parse_form_data
  208. {
  209.     local (*FORM_DATA) = @_;
  210.     
  211.     local ( $request_method, $post_info, @key_value_pairs,
  212.                   $key_value, $key, $value);
  213.  
  214.     read (STDIN, $post_info, $ENV{'CONTENT_LENGTH'});
  215.  
  216.     @key_value_pairs = split (/&/, $post_info);
  217.  
  218.     foreach $key_value (@key_value_pairs) {
  219.         ($key, $value) = split (/=/, $key_value);
  220.         $value =~ tr/+/ /;
  221.         $value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ($1))/eg;
  222.  
  223.         if (defined($FORM_DATA{$key})) {
  224.             $FORM_DATA{$key} = join ("\0", $FORM_DATA{$key}, $value);
  225.         } else {
  226.             $FORM_DATA{$key} = $value;
  227.         }
  228.     }
  229. }
  230.  
  231. sub return_error
  232. {
  233.     local ($status, $keyword, $message) = @_;
  234.  
  235.     print "Content-type: text/html", "\n";
  236.     print "Status: ", $status, " ", $keyword, "\n\n";
  237.  
  238.     print <<End_of_Error;
  239.  
  240. <title>CGI Program - Unexpected Error</title>
  241. <h1>$keyword</h1>
  242. <hr>$message</hr>
  243. Please contact $webmaster for more information.
  244.  
  245. End_of_Error
  246.  
  247.     exit(1);
  248. }
  249.