227 lines
6.2 KiB
Perl
Executable File
227 lines
6.2 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
no warnings 'redefine';
|
|
|
|
use Data::Dumper;
|
|
|
|
use params();
|
|
use config();
|
|
use db();
|
|
use markup();
|
|
use comments();
|
|
use template();
|
|
use log();
|
|
use time();
|
|
|
|
binmode STDOUT, ":utf8";
|
|
|
|
my $r = shift;
|
|
( my $cgi, my $params, my $error ) = params::get($r);
|
|
|
|
my $config = config::getFromScriptLocation();
|
|
my $request = {
|
|
url => $ENV{QUERY_STRING},
|
|
params => {
|
|
original => $params,
|
|
checked => check_params( $config, $params ),
|
|
},
|
|
config => $config,
|
|
};
|
|
$params = $request->{params}->{checked};
|
|
|
|
print "Content-Type:text/plain\n\n";
|
|
|
|
print STDERR "add comment: " . Dumper($params);
|
|
my $comment = $params->{comment};
|
|
|
|
$config->{access}->{write} = 1;
|
|
my $dbh = db::connect( $config, undef );
|
|
|
|
print "ok\n";
|
|
|
|
$comment->{content} =~ s/(^|\s)((https?\:\/\/)(.*?))(\s|$|\<)/$1\<a href\=\"$2\"\>$2\<\/a\>$5/g;
|
|
$comment->{content} =~ s/(^|\s)((https?\:\/\/)(.*?))(\s|$|\<)/$1\<a href\=\"$2\"\>$2\<\/a\>$5/g;
|
|
$comment->{content} =~ s/(^|\s)((www\.)(.*?))(\s|$|\<)/$1\<a href\=\"http\:\/\/$2\"\>$2\<\/a\>$5/g; #"
|
|
$comment->{content} =~ s/(^|\s)((www\.)(.*?))(\s|$|\<)/$1\<a href\=\"http\:\/\/$2\"\>$2\<\/a\>$5/g; #"
|
|
|
|
if ( comments::check( $dbh, $config, $comment ) ) {
|
|
my $nslookup = nslookup();
|
|
|
|
if (is_blocked($nslookup)==1){
|
|
send_mail($comment, $nslookup, 'blocked');
|
|
return;
|
|
};
|
|
|
|
$comment->{comment_id} = comments::insert( $dbh, $config, $comment );
|
|
if ( $comment->{comment_id} > 0 ) {
|
|
comments::update_comment_count( $dbh, $config, $comment );
|
|
send_mail( $config, $comment, $nslookup, 'new' );
|
|
}
|
|
}
|
|
|
|
sub is_blocked {
|
|
my $nslookup = shift;
|
|
|
|
my $user_agent = $ENV{HTTP_USER_AGENT};
|
|
|
|
# add lock settings here
|
|
# return 1 if
|
|
# ( $user_agent eq 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:35.0) Gecko/20100101 Firefox/35.0' )
|
|
# && ( $nslookup =~ /alicedsl/ );
|
|
|
|
return 0;
|
|
}
|
|
|
|
sub send_mail {
|
|
my $config = shift;
|
|
my $comment = shift;
|
|
my $nslookup = shift;
|
|
my $status = shift || 'new';
|
|
|
|
my $ip = $ENV{REMOTE_ADDR} || '';
|
|
my $user_agent = $ENV{HTTP_USER_AGENT} || '';
|
|
my $cookie = $ENV{HTTP_COOKIE} || '';
|
|
|
|
my $locations = $config->{locations};
|
|
my $base_domain = $locations->{base_domain};
|
|
my $from = $locations->{email};
|
|
my $to = $locations->{email};
|
|
my $subject = "$status comment from '$comment->{author}': $comment->{content}";
|
|
my $content = qq!$status comment
|
|
|
|
FROM: '$comment->{author}'
|
|
EMAIL: $comment->{email}
|
|
|
|
CONTENT: '$comment->{content}'
|
|
|
|
view event
|
|
$base_domain/programm/sendung/$comment->{event_id}.html#comments
|
|
!;
|
|
|
|
if ( $status eq 'new' ) {
|
|
$content .= qq!
|
|
manage comments:
|
|
$base_domain/agenda/planung/comment.cgi?project_id=1&studio_id=1
|
|
|
|
lock this comment
|
|
$base_domain/agenda/planung/comment.cgi?event_id=$comment->{event_id}&comment_id=$comment->{comment_id}&set_lock_status=blocked
|
|
!;
|
|
}
|
|
|
|
$content .= qq{
|
|
-----------------------------------------------------------
|
|
|
|
SENDER IP: $ip ($comment->{ip})
|
|
USER AGENT: $user_agent
|
|
COOKIE: $cookie
|
|
|
|
$nslookup
|
|
};
|
|
|
|
use MIME::Lite;
|
|
my $msg = MIME::Lite->new(
|
|
From => $from,
|
|
To => $to,
|
|
Subject => $subject,
|
|
Data => $content
|
|
);
|
|
|
|
$msg->send;
|
|
}
|
|
|
|
sub nslookup {
|
|
my $ip = $ENV{REMOTE_ADDR};
|
|
my $nslookup = '';
|
|
if ( $ip =~ /^([\d\.]+)$/ ) {
|
|
$ip = $1;
|
|
return `nslookup '$ip'`;
|
|
}
|
|
return '';
|
|
}
|
|
|
|
sub check_params {
|
|
my $config = shift;
|
|
my $params = shift;
|
|
|
|
my $template = template::check( $config, $params->{'template'}, 'comments.html' );
|
|
|
|
my $comment = {};
|
|
|
|
my $event_start = $params->{'event_start'} || '';
|
|
if ( $event_start =~ /^(\d\d\d\d\-\d\d\-\d\d[ T]\d\d\:\d\d)(\:\d\d)?$/ ) {
|
|
$comment->{event_start} = $1;
|
|
} else {
|
|
log::error( $config, 'add_comment.cgi: invalid date "' . $event_start . '"' );
|
|
}
|
|
|
|
my $event_id = $params->{'event_id'} || '';
|
|
if ( $event_id =~ /^(\d+)$/ ) {
|
|
$comment->{event_id} = $1;
|
|
} else {
|
|
log::error( $config, 'add_comment.cgi: invalid id' );
|
|
}
|
|
|
|
my $parent_id = $params->{'parent_id'} || '';
|
|
if ( $parent_id =~ /^(\d+)$/ ) {
|
|
$comment->{parent_id} = $1;
|
|
} else {
|
|
$comment->{parent_id} = 0;
|
|
}
|
|
|
|
$comment->{content} = $params->{'content'} || '';
|
|
$comment->{content} = escape_text( $comment->{content} );
|
|
$comment->{content} = substr( $comment->{content}, 0, 1000 );
|
|
log::error( $config, 'add_comment.cgi: missing body' ) if $comment->{content} eq '';
|
|
|
|
$comment->{author} = $params->{'author'} || '';
|
|
$comment->{author} = escape_text( $comment->{author} );
|
|
$comment->{author} = substr( $comment->{author}, 0, 40 );
|
|
log::error( $config, 'add_comment.cgi: missing name' ) if $comment->{author} eq '';
|
|
|
|
$comment->{email} = $params->{'email'} || '';
|
|
$comment->{email} = escape_text( $comment->{email} );
|
|
$comment->{email} = substr( $comment->{email}, 0, 40 );
|
|
|
|
$comment->{title} = $params->{'title'} || '';
|
|
$comment->{title} = escape_text( $comment->{title} );
|
|
$comment->{title} = substr( $comment->{title}, 0, 80 );
|
|
|
|
$comment->{ip} = $ENV{REMOTE_ADDR} || '';
|
|
log::error( $config, 'missing ip' ) if $comment->{ip} eq '';
|
|
$comment->{ip} = Digest::MD5::md5_base64( $comment->{ip} );
|
|
|
|
my $today = time::datetime_to_array( time::time_to_datetime() );
|
|
my $date = time::datetime_to_array( $comment->{event_start} );
|
|
my $delta_days = time::days_between( $today, $date );
|
|
|
|
log::error( $config, 'add_comment.cgi: no comments allowed, yet' )
|
|
if $delta_days > $config->{permissions}->{no_new_comments_before};
|
|
|
|
log::error( $config, 'add_comment.cgi: no comments allowed anymore' )
|
|
if $delta_days < -1 * $config->{permissions}->{no_new_comments_after};
|
|
|
|
return {
|
|
template => $template,
|
|
comment => $comment
|
|
};
|
|
}
|
|
|
|
sub escape_text {
|
|
my $s = shift;
|
|
$s =~ s/^\s+//g;
|
|
$s =~ s/\s+$//g;
|
|
|
|
#remove broken HTML
|
|
$s =~ s/<[a-z\!\?\[\/][^\>]+?\>//gi;
|
|
$s =~ s/<[a-z\!\?\[\/]\>//gi;
|
|
|
|
$s = markup::escapeHtml($s);
|
|
$s =~ s/[\n\r]+/\<br \/\>/g;
|
|
$s =~ s/\<br \/\>/\<br \/\>\n/g;
|
|
$s =~ s/\<br \/\>\s*$//g;
|
|
return $s;
|
|
}
|
|
|