|
Luc Didry |
5684cb |
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
|
|
Luc Didry |
5684cb |
package Lufi::Plugin::Helpers;
|
|
Luc Didry |
5684cb |
use Mojo::Base 'Mojolicious::Plugin';
|
|
Luc Didry |
d909b8 |
use Lufi::DB::File;
|
|
Luc Didry |
5684cb |
use Data::Entropy qw(entropy_source);
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub register {
|
|
Luc Didry |
5684cb |
my ($self, $app) = @_;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
d909b8 |
$app->plugin('PgURLHelper');
|
|
Luc Didry |
18499a |
|
|
Luc Didry |
18499a |
if ($app->config('dbtype') eq 'postgresql') {
|
|
Luc Didry |
18499a |
use Mojo::Pg;
|
|
Luc Didry |
18499a |
$app->helper(pg => \&_pg);
|
|
Luc Didry |
18499a |
|
|
Luc Didry |
18499a |
# Database migration
|
|
Luc Didry |
18499a |
my $migrations = Mojo::Pg::Migrations->new(pg => $app->pg);
|
|
Luc Didry |
18499a |
if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
|
|
Luc Didry |
18499a |
$migrations->from_file('utilities/migrations_pg.sql')->migrate(0)->migrate(1);
|
|
Luc Didry |
18499a |
} else {
|
|
Luc Didry |
18499a |
$migrations->from_file('utilities/migrations_pg.sql')->migrate(1);
|
|
Luc Didry |
18499a |
}
|
|
Luc Didry |
18499a |
} elsif ($app->config('dbtype') eq 'sqlite') {
|
|
Luc Didry |
d909b8 |
# SQLite database migration if needed
|
|
Luc Didry |
d909b8 |
use Lufi::DB::SQLite;
|
|
Luc Didry |
d909b8 |
my $columns = Lufi::DB::SQLite::Files->table_info;
|
|
Luc Didry |
d909b8 |
my $pwd_col = 0;
|
|
Luc Didry |
d909b8 |
foreach my $col (@{$columns}) {
|
|
Luc Didry |
d909b8 |
$pwd_col = 1 if $col->{name} eq 'passwd';
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
unless ($pwd_col) {
|
|
Luc Didry |
d909b8 |
Lufi::DB::SQLite->do('ALTER TABLE files ADD COLUMN passwd TEXT;');
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
$app->helper(provisioning => \&_provisioning);
|
|
Luc Didry |
5684cb |
$app->helper(get_empty => \&_get_empty);
|
|
Luc Didry |
5684cb |
$app->helper(shortener => \&_shortener);
|
|
Luc Didry |
5684cb |
$app->helper(ip => \&_ip);
|
|
Luc Didry |
5684cb |
$app->helper(default_delay => \&_default_delay);
|
|
Luc Didry |
5684cb |
$app->helper(max_delay => \&_max_delay);
|
|
Luc Didry |
5684cb |
$app->helper(is_selected => \&_is_selected);
|
|
Luc Didry |
5684cb |
$app->helper(stop_upload => \&_stop_upload);
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
d909b8 |
sub _pg {
|
|
Luc Didry |
d909b8 |
my $c = shift;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
state $pg = Mojo::Pg->new($c->app->pg_url($c->app->config('pgdb')));
|
|
Luc Didry |
d909b8 |
return $pg;
|
|
Luc Didry |
d909b8 |
}
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
5684cb |
sub _provisioning {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
# Create some short patterns for provisioning
|
|
Luc Didry |
d909b8 |
my $ldfile = Lufi::DB::File->new(app => $c->app);
|
|
Luc Didry |
d909b8 |
if ($ldfile->count_empty < $c->app->config('provisioning')) {
|
|
Luc Didry |
d909b8 |
for (my $i = 0; $i < $c->app->config('provis_step'); $i++) {
|
|
Luc Didry |
d909b8 |
my $short;
|
|
Luc Didry |
d909b8 |
do {
|
|
Luc Didry |
d909b8 |
$short = $c->shortener($c->app->config('length'));
|
|
Luc Didry |
d909b8 |
} while ($ldfile->already_exists($short));
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
$ldfile->created_at(undef)->short($short)->write;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _get_empty {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
d909b8 |
my $ldfile = Lufi::DB::File->new(app => $c->app)->get_empty;
|
|
Luc Didry |
d909b8 |
|
|
Luc Didry |
d909b8 |
return $ldfile;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _shortener {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
my $length = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
my @chars = ('a'..'z','A'..'Z','0'..'9', '-', '_');
|
|
Luc Didry |
5684cb |
my $result = '';
|
|
Luc Didry |
5684cb |
foreach (1..$length) {
|
|
Luc Didry |
5684cb |
$result .= $chars[entropy_source->get_int(scalar(@chars))];
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
return $result;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _ip {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
my $proxy = $c->req->headers->header('X-Forwarded-For');
|
|
Luc Didry |
5684cb |
my $ip = ($proxy) ? $proxy : $c->tx->remote_address;
|
|
Luc Didry |
5684cb |
my $remote_port = (defined($c->req->headers->header('X-Remote-Port'))) ? $c->req->headers->header('X-Remote-Port') : $c->tx->remote_port;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
return "$ip remote port:$remote_port";
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _default_delay {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
d909b8 |
return $c->app->config('default_delay') if ($c->app->config('default_delay') >= 0);
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
warn "default_delay set to a negative value. Default to 0.";
|
|
Luc Didry |
5684cb |
return 0;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _max_delay {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
d909b8 |
return $c->app->config('max_delay') if ($c->app->config('max_delay') >= 0);
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
warn "max_delay set to a negative value. Default to 0.";
|
|
Luc Didry |
5684cb |
return 0;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _is_selected {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
my $num = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
return ($num == $c->max_delay) ? 'selected="selected"' : '' if ($c->max_delay && !$c->default_delay);
|
|
Luc Didry |
5684cb |
return ($num == $c->default_delay) ? 'selected="selected"' : '';
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
sub _stop_upload {
|
|
Luc Didry |
5684cb |
my $c = shift;
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
if (-f 'stop-upload' || -f 'stop-upload.manual') {
|
|
Luc Didry |
5684cb |
return 1;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
return 0;
|
|
Luc Didry |
5684cb |
}
|
|
Luc Didry |
5684cb |
|
|
Luc Didry |
5684cb |
1;
|