#!/usr/bin/perl -w -T # ============================================================================================== # Author: Tommi Lahtonen # Date: 22.11.2004 # Name: ostoskori.cgi # Version: v1.01 # # v1.0 Initial version # # v1.01 21.1.2005 Lisätty tarkistuksia ja paremmat virheilmoitukset # # Description: # Toimii yleiskäyttöisenä ostoskorina ITK024-kurssilaisten harjoitustöissä # lukee asetukset ostoskori.conf-tiedostosta # Ei lukitse tallennustiedostoa -> jos kaksi kirjoittaa samaan aikaan tulee ongelmia # ============================================================================================== use CGI::Carp qw(fatalsToBrowser warningsToBrowser); use CGI qw(:standard); use XML::DOM; use XML::DOM::ValParser; use Encode; my $address = "http://" . server_name() . script_name(); $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin'; my $file = "ostoskori.conf"; # asetustiedoston nimi my $parser = new XML::DOM::Parser; my $lkm; my $doc; eval { $doc = $parser->parsefile($file); }; if ($@) { print "Content-Type: text/html; charset=ISO-8859-1\n\n"; print "virhe"; print "
";
  print "$@";
  print "
"; print ""; exit(1); } my $email = $doc->getElementsByTagName("email")->item(0); my $xhtml = $doc->getElementsByTagName("xhtml")->item(0); my $from = $doc->getElementsByTagName("from")->item(0); my $name = $doc->getElementsByTagName("name")->item(0); my $subject = $doc->getElementsByTagName("subject")->item(0); my $save = $doc->getElementsByTagName("save")->item(0); if($email && $email->getFirstChild) { $email = $email->getFirstChild->getNodeValue; } else { undef $email; } if($save && $save->getFirstChild) { $save = $save->getFirstChild->getNodeValue; } else { undef $save; } if($from && $from->getFirstChild) { $from = $from->getFirstChild->getNodeValue; } else { undef $from; } if($name && $name->getFirstChild) { $name = $name->getFirstChild->getNodeValue; } else { undef $name; } if($subject && $subject->getFirstChild) { $subject = $subject->getFirstChild->getNodeValue; } else { undef $subject; } if($xhtml->getFirstChild) { $xhtml = $xhtml->getFirstChild->getNodeValue; } else { undef $title; } my $kauppa = $doc->getElementsByTagName("kauppa")->item(0); my @t = $kauppa->getElementsByTagName("tuote"); my %tuotteet; foreach my $p ( @t ) { my $nimi = $p->getElementsByTagName("nimi")->item(0)->getFirstChild->getNodeValue; my $hinta = $p->getElementsByTagName("hinta")->item(0)->getFirstChild->getNodeValue; $tuotteet{$nimi} = $hinta; } eval { $doc = $parser->parsefile($xhtml); }; if ($@) { print "Content-Type: text/html; charset=ISO-8859-1\n\n"; print "virhe"; print "
";
  print "$@";
  print "
"; print ""; exit(1); } my $frag = $doc->createDocumentFragment; if ( param("poista") ) { poista(); exit(); } if ( param("update") ) { paivita(); exit(); } if ( param("lisaa") ) { lisaa(); exit(); } if ( param("tilaa") ) { my $err = tilaa($email, $from, $name, $subject, $save); if ( $err ) { print "Content-type: text/plain\n\n"; print $err . "\n"; } else { #print "Content-type: text/plain\n\n"; foreach $tuote ( param() ) { if ( $tuotteet{ $tuote } ) { print "Set-Cookie: $tuote=0; path=/; expires=-1h\n"; } } print "Location: $address?tilattu=1\n\n"; exit(); } } print header(); nayta_kori($tuote, $lkm, $frag); my @elements = $doc->getDocumentElement->getElementsByTagName("*", 1); foreach $p ( @elements ) { if ( $p->getAttribute("id") eq "tiedot" ) { if ( param("tilattu") ) { my $pp = $doc->createElement("p"); my $strong = $doc->createElement("strong"); $strong->addText(encode("UTF-8", "Tilauksesi on lähetetty")); $pp->appendChild($strong); # $frag->insertBefore($p, $frag->getFirstChild); $p->appendChild($pp); } $p->appendChild($frag); } } print $doc->toString; sub poista { foreach $tuote ( param("tuote") ) { if ( $tuotteet{ $tuote } ) { print "Set-Cookie: $tuote=0; path=/; expires=-1h\n"; } } print "Location: $address\n\n"; } sub lisaa { foreach $tuote ( param() ) { if ( $tuotteet{ $tuote } ) { my $lkm = param($tuote) + cookie($tuote); print "Set-Cookie: $tuote=$lkm; path=/; expires=+24h\n"; } } print "Location: $address\n\n"; } sub nayta_kori { my ($tuote, $lkm, $form) = @_; my $count = 0; foreach $name (cookie()) { if ( cookie($name) ne "0" && $tuotteet{$name} ) { $count++; } } if ( $count == 0 ) { return; } my $summa; my $table = $doc->createElement("table"); my $submit = $doc->createElement("input"); $submit->setAttribute( "type", "submit" ); $submit->setAttribute( "value", "Update" ); $submit->setAttribute( "name", "update" ); $form->appendChild($submit); my $tr = $doc->createElement("tr"); my $t = $doc->createElement("th"); $t->appendChild( $doc->createTextNode( "Tuote" ) ); my $h = $doc->createElement("th"); $h->appendChild( $doc->createTextNode( "Hinta" ) ); my $hkpl = $doc->createElement("th"); $hkpl->appendChild( $doc->createTextNode( "Hinta / kpl" ) ); my $l = $doc->createElement("th"); $l->appendChild( $doc->createTextNode( "Lkm" ) ); $tr->appendChild($t); $tr->appendChild($l); $tr->appendChild($hkpl); $tr->appendChild($h); $t = $doc->createElement("th"); $t->appendChild($submit); $tr->appendChild($t); $table->appendChild($tr); $form->appendChild($table); foreach $name (cookie()) { if ( cookie($name) ne "0" && $tuotteet{$name} ) { my $tr = $doc->createElement("tr"); my $t = $doc->createElement("td"); my $h = $doc->createElement("td"); my $hkpl = $doc->createElement("td"); my $l = $doc->createElement("td"); my $input = $doc->createElement("input"); $t->appendChild( $doc->createTextNode( $name ) ); $hkpl->appendChild( $doc->createTextNode( $tuotteet{$name} )); $h->appendChild( $doc->createTextNode( $tuotteet{$name} * cookie($name) )); $summa = $summa + $tuotteet{$name} * cookie($name); $l->appendChild( $input ); $input->setAttribute( "value", cookie($name) ); $input->setAttribute( "size", "3" ); $input->setAttribute( "name", $name ); $input->setAttribute( "type", "text" ); $input->setAttribute( "maxlength", "7" ); $tr->appendChild($t); $tr->appendChild($l); $tr->appendChild($hkpl); $tr->appendChild($h); my $p = $doc->createElement("td"); my $a = $doc->createElement("a"); $a->setAttribute("href", "?poista=1&tuote=$name"); $a->appendChild ( $doc->createTextNode( "Poista" ) ); $p->appendChild($a); $tr->appendChild($p); $table->appendChild($tr); } } $tr = $doc->createElement("tr"); $t = $doc->createElement("td"); $h = $doc->createElement("th"); $l = $doc->createElement("td"); $l->setAttribute("colspan", "2"); $tr->appendChild($t); $tr->appendChild($l); $tr->appendChild($h); $t->appendChild( $doc->createTextNode( "Yhteensä" ) ); $h->appendChild( $doc->createTextNode( $summa ) ); $table->appendChild($tr); $submit = $doc->createElement("input"); $submit->setAttribute( "type", "submit" ); $submit->setAttribute( "name", "tilaa" ); $submit->setAttribute( "value", "Tilaa" ); #$form->appendChild($end); $form->appendChild($submit); return $form; } sub paivita { foreach $name ( param() ) { if ( $tuotteet{$name} ) { my $arvo = param($name); print "Set-Cookie: $name=$arvo; path=/; expires=+24h\n"; } } print "Location: $address\n\n"; } sub korvaa_merkit { # Korvataan ylimääräiset merkit tyhjällä $korvaus= join(" ", @_); $korvaus =~ s/[^\wåäöÄÖÅ0-9\@_\.\,\:\-\/\%\~\!\ ]//gi; # Korvataan muut paitsi annetut return($korvaus); } sub tilaa { my ($email, $lahettaja, $nimi, $title, $save) = @_; $nimi = param("name") if ( !defined($nimi) ); $lahettaja = param("from") if ( !defined($lahettaja) ); $title = param("subject") if ( !defined($title) ); my($koe)=0; # Lokaalimuuttuja my($arvo)=0; # Lokaalimuuttuja if( !validate_email_address ( $email ) ) { return "Viallinen sähköpostiosoite"; } # Lähetetään varsinainen posti sendmailillä open (MAIL, "|/usr/lib/sendmail -t") or return "Sendmail ei toimi"; print MAIL "To: $email\n"; #Lomakkeelta tuleva data # print "To: $email\n"; #Lomakkeelta tuleva data if ($lahettaja || $nimi) { # Jos annettiin lähettäjä print MAIL "From: $nimi"; # print "From: $nimi"; if($lahettaja) { print MAIL " \<$lahettaja\>\n"; # print " \<$lahettaja\>\n"; if( validate_email_address( $lahettaja ) ) { print MAIL "Cc: $lahettaja\n"; # print "Cc: $lahettaja\n"; } } else {print MAIL "\n";} } else { print MAIL "From: Tuntematon lähettäjä \ \n"; } if ($title) { # Jos annettiin title print MAIL "Subject: $title\n\n"; # print "Subject: $title\n\n"; } else { print MAIL "Subject: Tilaus\n\n"; } print MAIL "Tilauksen tiedot:\n\n"; foreach $name ( param() ) { if ( !defined($tuotteet{$name}) ) { my $arvo = param($name); print MAIL < -1 ) { eval { $doc = $parser->parsefile($save); }; if ($@) { print "Content-Type: text/html; charset=ISO-8859-1\n\n"; print "virhe"; print "
";
  print "$@";
  print "
"; print ""; exit(1); } my $root = $doc->getDocumentElement; my $tilaus = $doc->createElement("tilaus"); my $tilaaja = $doc->createElement("tilaaja"); $tilaaja->addText($nimi); my $osoite = $doc->createElement("osoite"); $osoite->addText($lahettaja); my $otsikko = $doc->createElement("title"); $otsikko->addText($title); $tilaus->appendChild($tilaaja); $tilaus->appendChild($osoite); $tilaus->appendChild($otsikko); $root->appendChild($tilaus); my $tiedot = $doc->createElement("tiedot"); foreach $name ( param() ) { if ( !defined($tuotteet{$name}) ) { my $arvo = param($name); my $tieto = $doc->createElement("tieto"); my $nimi = $doc->createElement("nimi"); $nimi->addText($name); my $value = $doc->createElement("arvo"); $value->addText($arvo); $tieto->appendChild($nimi); $tieto->appendChild($value); $tiedot->appendChild($tieto); } } $tilaus->appendChild($tiedot); my $tuotteet = $doc->createElement("tuotteet"); foreach $name ( param() ) { if ( param($name) ne "0" && $tuotteet{$name} ) { my $lkm = param($name); my $tuote = $doc->createElement("tuote"); my $nimi = $doc->createElement("nimi"); $nimi->addText($name); my $l = $doc->createElement("lkm"); $l->addText($lkm); $tuote->appendChild($nimi); $tuote->appendChild($l); $tuotteet->appendChild($tuote); } } $tilaus->appendChild($tuotteet); eval { $doc->printToFile ($save); }; if ( $@ ) { print "Content-Type: text/plain; charset=ISO-8859-1\n\n"; print "Tallennus tiedostoon $save ei onnistu\n"; exit(); } } else { open (FILE, ">>$save") or return "Tallennustiedosto ei aukea"; print FILE < Title $title OMAA #print FILE "\nTilauksen tiedot:\n\n"; foreach $name ( param() ) { if ( !defined($tuotteet{$name}) ) { my $arvo = param($name); print FILE <\@,;:".\\[\\]$esc$ctrl$nonASCII] }; my $atom = qq{ $atom_char+ }; my $byte = qq{ (?: 1?$digit?$digit | 2[0-4]$digit | 25[0-5] ) }; my $qtext = qq{ [^$esc$nonASCII$CRlist"] }; my $quoted_pair = qq{ $esc [^$nonASCII] }; my $quoted_str = qq{ " (?: $qtext | $quoted_pair )* " }; my $word = qq{ (?: $atom | $quoted_str ) }; my $ip_address = qq{ \\[ $byte (?: $dot $byte ){3} \\] }; my $sub_domain = qq{ [$letter$digit] [$letter$digit-]{0,61} [$letter$digit]}; my $top_level = qq{ (?: $atom_char ){2,4} }; my $domain_name = qq{ (?: $sub_domain $dot )+ $top_level }; my $domain = qq{ (?: $domain_name | $ip_address ) }; my $local_part = qq{ $word (?: $dot $word )* }; my $address = qq{ $local_part \@ $domain }; return $addr_to_check =~ /^$address$/ox ? $addr_to_check : ""; }