#!/usr/bin/perl use warnings; use strict; use constant { MAX_SIZE => 512 * 1024, STAMPFILE => "/tmp/klasse11-upload.stamp", DELAY => 60 * 5, TO => 'iblech@web.de', SUBJECT => '[klasse11] Neue Datei: "%s"', }; use CGI; use CGI::Carp "fatalsToBrowser"; use MIME::Lite; use File::Touch; use POSIX "strftime"; # Maximal erlaubte Dateigröße: 512 KiB $CGI::POST_MAX = MAX_SIZE; my $q = CGI->new; die "Du hast keine Datei oder eine zu große Datei angegeben!\n" unless my $fh = $q->upload("file"); my $last = (stat STAMPFILE)[9]; if(defined $last and time - $last <= DELAY) { die "Bitte versuche es in einem Moment nochmal (genauer gesagt: Versuche es " . strftime("%c %Z (%z)", localtime($last + DELAY)) . "), der letzte Upload war grade eben, und um Spamming einzuschränken erzwinge ich eine kleine Pause zwischen zwei Uploads.\n"; } touch STAMPFILE or die "touch(STAMPFILE) schlug fehl: $!\n"; my %info = ( name => $q->param("name"), from => $q->param("from"), type => $q->uploadInfo($q->param("file"))->{'Content-Type'}, host => $q->remote_host, referer => $q->referer, useragent => $q->user_agent, date => strftime("%c %Z", localtime), ); for($info{name}, $info{from}) { $_ = "(undef)" if not defined $_ or length $_ == 0; $_ = substr $_, 0, 100; } $info{referer} = "(undef)" if not defined $info{referer} or length $info{referer} == 0; $info{type} = "text/plain" unless defined $info{type}; my $mail = MIME::Lite->new( To => TO, Subject => sprintf(SUBJECT, $info{name}), Type => "multipart/mixed", "X-Uploader-Host" => $info{host}, "X-Uploader-Name" => $info{from}, "X-Uploader-Referer" => $info{referer}, "X-Uploader-User-Agent" => $info{useragent}, ); $mail->attach(Type => "TEXT", Data => <<EOM); Eine Datei wurde hochgeladen. Dateiinformationen: Name: "$info{name}" Sender: $info{from} MIME-Typ: $info{type} Uploaderinformationen: Host: $info{host} Referer: "$info{referer}" User-Agent: "$info{useragent}" Datum: $info{date} Die Datei befindet sich im Anhang. EOM $mail->attach( Type => $info{type}, Filename => $info{name}, Disposition => "attachment", Data => do { local $/; <$fh> } ); $mail->send; print $q->header, $q->start_html("Danke"), $q->h1("Danke"), $q->p("Die Datei wurde übertragen."), $q->end_html;
Download