1
0
Fork 0
mirror of https://github.com/perlbot/perlbuut-pastebin synced 2025-06-07 14:17:26 -04:00

putting this onto prod because it fixes a bug

This commit is contained in:
Ryan Voots 2021-04-20 14:10:27 -04:00
parent 4b192004e1
commit 8c27b3e2b9
3 changed files with 62 additions and 16 deletions

View file

@ -3,8 +3,11 @@ memcached=true
evalserver=true evalserver=true
blogspam=false blogspam=false
[database]
dsc="postgresql://perlbot_pastebin:wrorkEvopCagyadMoighinIgiloinnAl:drepHodNorchoibTessiraypGacWobjoolbyewd9OsofogerObhypBeurvackidnipBifreTwusGikghiavratuckTujtie@localhost/perlbot_pastes_dev"
[mojolicious.hypnotoad] [mojolicious.hypnotoad]
listen=["http://localhost:3000"] listen=["http://localhost:3001"]
[memcached] [memcached]
namespace="pastebin" namespace="pastebin"

View file

@ -12,3 +12,4 @@ requires 'Mojolicious::Plugin::BlogSpam';
requires 'Mojolicious::Plugin::RemoteAddr'; requires 'Mojolicious::Plugin::RemoteAddr';
requires 'App::EvalServerAdvanced::Protocol'; requires 'App::EvalServerAdvanced::Protocol';
requires 'Future::Mojo'; requires 'Future::Mojo';
requires 'Regexp::Assemble';

View file

@ -4,28 +4,50 @@ use strict;
use warnings; use warnings;
use DBI; use DBI;
use App::Config;
use Mojo::Base '-base'; use Mojo::Base '-base';
use DateTime; use DateTime;
use Mojo::Pg;
use Regexp::Assemble;
# TODO config for dbname # TODO config for dbname
# has 'dbh' => sub {DBI->connect("dbi:SQLite:dbname=pastes.db", "", "", {RaiseError => 1, sqlite_unicode => 1})}; # has 'dbh' => sub {DBI->connect("dbi:SQLite:dbname=pastes.db", "", "", {RaiseError => 1, sqlite_unicode => 1})};
has 'dbh' => sub {DBI->connect("dbi:Pg:dbname=perlbot_pastes", "perlbot_pastebin", "wrorkEvopCagyadMoighinIgiloinnAl:drepHodNorchoibTessiraypGacWobjoolbyewd9OsofogerObhypBeurvackidnipBifreTwusGikghiavratuckTujtie", {RaiseError => 1, sqlite_unicode => 1})}; my $cfg = App::Config::get_config('database');
has 'pg' => sub {
Mojo::Pg->new($cfg->{dsc});
};
has 'asndbh' => sub {DBI->connect("dbi:SQLite:dbname=asn.db", "", "", {RaiseError => 1, sqlite_unicode => 1})}; has 'asndbh' => sub {DBI->connect("dbi:SQLite:dbname=asn.db", "", "", {RaiseError => 1, sqlite_unicode => 1})};
sub insert_pastebin { sub insert_pastebin {
my $self = shift; my $self = shift;
my $dbh = $self->dbh;
my ($paste, $who, $what, $where, $expire, $lang, $ip) = @_; my ($paste, $who, $what, $where, $expire, $lang, $ip) = @_;
$expire = undef if !$expire; # make sure it's null if it's empty $expire = undef if !$expire; # make sure it's null if it's empty
$dbh->do(q{INSERT INTO posts (paste, who, "where", what, "when", "expiration", "language", "ip") VALUES (?, ?, ?, ?, ?, ?, ?, ?)}, {}, $paste, $who, $where, $what, time(), $expire, $lang, $ip); my $id = $self->pg->db->insert('posts',
my $id = $dbh->last_insert_id('', '', 'posts', 'id'); {
paste => $paste,
who => $who,
where => $where,
when => time(),
expiration => $expire,
language => $lang,
ip => $ip
}, {returning => 'id'})->hash->{id};
# TODO this needs to retry when it fails. # TODO this needs to retry when it fails.
my @chars = ('a'..'z', 1..9); my @chars = ('a'..'z', 1..9);
my $slug = join '', map {$chars[rand() *@chars]} 1..6; my $slug = join '', map {$chars[rand() *@chars]} 1..6;
$dbh->do("INSERT INTO slugs (post_id, slug) VAlUES (?, ?)", {}, $id, $slug);
$self->pg->db->insert(
'slugs',
{
post_id => $id,
slug => $slug
}
);
return $slug; return $slug;
} }
@ -33,15 +55,14 @@ sub insert_pastebin {
sub get_paste { sub get_paste {
my ($self, $pasteid) = @_; my ($self, $pasteid) = @_;
my $dbh = $self->dbh; my $row = $self->pg->db->query(q{
my $row = $dbh->selectrow_hashref(q{
SELECT p.* SELECT p.*
FROM posts p FROM posts p
LEFT JOIN slugs s ON p.id = s.post_id LEFT JOIN slugs s ON p.id = s.post_id
WHERE s.slug = ? WHERE s.slug = ?
ORDER BY s.slug DESC ORDER BY s.slug DESC
LIMIT 1 LIMIT 1
}, {}, $pasteid); }, $pasteid)->hash;
my $when = delete $row->{when}; my $when = delete $row->{when};
@ -62,10 +83,16 @@ sub get_paste {
sub banned_word_list_re { sub banned_word_list_re {
my $self = shift; my $self = shift;
my $data = $self->dbh->selectall_arrayref("SELECT word FROM banned_words WHERE deleted <> 1"); my $data = $self->pg->db->select(
'banned_words',
['word'],
{-not_bool => 'deleted'})
->hashes
->map(sub { quotemeta $_->{word} });
my $re_str = join '|', map {quotemeta $_->[0]} @$data; my $ra = Regexp::Assemble->new();
my $re = qr/($re_str)/i; $ra->add(@$data);
my $re = $ra->re;
return $re; return $re;
} }
@ -73,17 +100,32 @@ sub banned_word_list_re {
sub get_asn_for_ip { sub get_asn_for_ip {
my ($self, $ip) = @_; my ($self, $ip) = @_;
my ($asn) = @{$self->asndbh->selectrow_arrayref("SELECT asn FROM asn WHERE ? >= start AND ? <= end", {}, $ip, $ip) || []}[0]; my $data = $self->pg->db->select(
return $asn; 'asn',
['asn'],
{start => {'<=' => $ip},
end => {'>=' => $ip}})
->hashes
->map(sub { $_->{asn} });
return $data->[0];
} }
sub is_banned_ip { sub is_banned_ip {
my ($self, $_ip) = @_; my ($self, $_ip) = @_;
return 0 if ($_ip =~ /:/); # ignore ipv6 stuff for now return 0 if ($_ip =~ /:/); # ignore ipv6 stuff for now
my $ip = sprintf("%03d.%03d.%03d.%03d", split(/\./, $_ip)); my $ip = sprintf("%03d.%03d.%03d.%03d", split(/\./, $_ip));
my $asn = $self->get_asn_for_ip($ip); my $asn = $self->get_asn_for_ip($ip);
my $row_ar = $self->dbh->selectall_arrayref("SELECT * FROM banned_ips i LEFT JOIN banned_asns a WHERE (i.ip = ? AND i.deleted <> 1) OR (a.asn = ? AND a.deleted <> 1)", {}, $ip, $asn);
my $row_ar = $self->pg->db->query(
q{
SELECT 1
FROM banned_ips i
LEFT JOIN banned_asns a ON 1=1
WHERE (i.ip = ? AND NOT i.deleted) OR (a.asn = ? AND NOT a.deleted)
},
$ip, $asn)->hashes;
return 0+@$row_ar; return 0+@$row_ar;
} }