diff --git a/lib/Lufi.pm b/lib/Lufi.pm index ffce232..e48d4ce 100755 --- a/lib/Lufi.pm +++ b/lib/Lufi.pm @@ -2,7 +2,6 @@ package Lufi; use Mojo::Base 'Mojolicious'; use LufiDB; -use Data::Entropy qw(entropy_source); use Net::LDAP; use Apache::Htpasswd; @@ -139,105 +138,7 @@ sub startup { $self->secrets($self->config('secrets')); # Helpers - $self->helper( - provisioning => sub { - my $c = shift; - - # Create some short patterns for provisioning - if (LufiDB::Files->count('WHERE created_at IS NULL') < $c->config('provisioning')) { - for (my $i = 0; $i < $c->config('provis_step'); $i++) { - if (LufiDB->begin) { - my $short; - do { - $short= $c->shortener($c->config('length')); - } while (LufiDB::Files->count('WHERE short = ?', $short)); - - LufiDB::Files->create( - short => $short - ); - LufiDB->commit; - } - } - } - } - ); - - $self->helper( - get_empty => sub { - my $c = shift; - - my @records = LufiDB::Files->select('WHERE created_at IS NULL LIMIT 1'); - return $records[0]; - } - ); - - $self->helper( - shortener => sub { - my $c = shift; - my $length = shift; - - my @chars = ('a'..'z','A'..'Z','0'..'9', '-', '_'); - my $result = ''; - foreach (1..$length) { - $result .= $chars[entropy_source->get_int(scalar(@chars))]; - } - return $result; - } - ); - - $self->helper( - ip => sub { - my $c = shift; - my $proxy = $c->req->headers->header('X-Forwarded-For'); - my $ip = ($proxy) ? $proxy : $c->tx->remote_address; - my $remote_port = (defined($c->req->headers->header('X-Remote-Port'))) ? $c->req->headers->header('X-Remote-Port') : $c->tx->remote_port; - - return "$ip remote port:$remote_port"; - } - ); - - $self->helper( - default_delay => sub { - my $c = shift; - - return $c->config('default_delay') if ($c->config('default_delay') >= 0); - - warn "default_delay set to a negative value. Default to 0."; - return 0; - } - ); - - $self->helper( - max_delay => sub { - my $c = shift; - - return $c->config('max_delay') if ($c->config('max_delay') >= 0); - - warn "max_delay set to a negative value. Default to 0."; - return 0; - } - ); - - $self->helper( - is_selected => sub { - my $c = shift; - my $num = shift; - - return ($num == $c->max_delay) ? 'selected="selected"' : '' if ($c->max_delay && !$c->default_delay); - return ($num == $c->default_delay) ? 'selected="selected"' : ''; - } - ); - - $self->helper( - stop_upload => sub { - my $c = shift; - - if (-f 'stop-upload' || -f 'stop-upload.manual') { - return 1; - } - return 0; - } - ); + $self->plugin('Lufi::Plugin::Helpers'); # Hooks $self->hook( after_dispatch => sub { @@ -252,16 +153,6 @@ sub startup { mkdir($self->config('upload_dir'), 0700) unless (-d $self->config('upload_dir')); die ('The upload directory ('.$self->config('upload_dir').') is not writable') unless (-w $self->config('upload_dir')); - # SQLite database migration if needed - my $columns = LufiDB::Files->table_info; - my $pwd_col = 0; - foreach my $col (@{$columns}) { - $pwd_col = 1 if $col->{name} eq 'passwd'; - } - unless ($pwd_col) { - LufiDB->do('ALTER TABLE files ADD COLUMN passwd TEXT;'); - } - # Default layout $self->defaults(layout => 'default'); diff --git a/lib/Lufi/Plugin/Helpers.pm b/lib/Lufi/Plugin/Helpers.pm new file mode 100644 index 0000000..cda1381 --- /dev/null +++ b/lib/Lufi/Plugin/Helpers.pm @@ -0,0 +1,114 @@ +# vim:set sw=4 ts=4 sts=4 ft=perl expandtab: +package Lufi::Plugin::Helpers; +use Mojo::Base 'Mojolicious::Plugin'; +use Data::Entropy qw(entropy_source); +use LufiDB; + +sub register { + my ($self, $app) = @_; + + # SQLite database migration if needed + my $columns = LufiDB::Files->table_info; + my $pwd_col = 0; + foreach my $col (@{$columns}) { + $pwd_col = 1 if $col->{name} eq 'passwd'; + } + unless ($pwd_col) { + LufiDB->do('ALTER TABLE files ADD COLUMN passwd TEXT;'); + } + + $app->helper(provisioning => \&_provisioning); + $app->helper(get_empty => \&_get_empty); + $app->helper(shortener => \&_shortener); + $app->helper(ip => \&_ip); + $app->helper(default_delay => \&_default_delay); + $app->helper(max_delay => \&_max_delay); + $app->helper(is_selected => \&_is_selected); + $app->helper(stop_upload => \&_stop_upload); +} + +sub _provisioning { + my $c = shift; + + # Create some short patterns for provisioning + if (LufiDB::Files->count('WHERE created_at IS NULL') < $c->config('provisioning')) { + for (my $i = 0; $i < $c->config('provis_step'); $i++) { + if (LufiDB->begin) { + my $short; + do { + $short= $c->shortener($c->config('length')); + } while (LufiDB::Files->count('WHERE short = ?', $short)); + + LufiDB::Files->create( + short => $short + ); + LufiDB->commit; + } + } + } +} + +sub _get_empty { + my $c = shift; + + my @records = LufiDB::Files->select('WHERE created_at IS NULL LIMIT 1'); + return $records[0]; +} + +sub _shortener { + my $c = shift; + my $length = shift; + + my @chars = ('a'..'z','A'..'Z','0'..'9', '-', '_'); + my $result = ''; + foreach (1..$length) { + $result .= $chars[entropy_source->get_int(scalar(@chars))]; + } + return $result; +} + +sub _ip { + my $c = shift; + my $proxy = $c->req->headers->header('X-Forwarded-For'); + my $ip = ($proxy) ? $proxy : $c->tx->remote_address; + my $remote_port = (defined($c->req->headers->header('X-Remote-Port'))) ? $c->req->headers->header('X-Remote-Port') : $c->tx->remote_port; + + return "$ip remote port:$remote_port"; +} + +sub _default_delay { + my $c = shift; + + return $c->config('default_delay') if ($c->config('default_delay') >= 0); + + warn "default_delay set to a negative value. Default to 0."; + return 0; +} + +sub _max_delay { + my $c = shift; + + return $c->config('max_delay') if ($c->config('max_delay') >= 0); + + warn "max_delay set to a negative value. Default to 0."; + return 0; +} + +sub _is_selected { + my $c = shift; + my $num = shift; + + return ($num == $c->max_delay) ? 'selected="selected"' : '' if ($c->max_delay && !$c->default_delay); + return ($num == $c->default_delay) ? 'selected="selected"' : ''; +} + +sub _stop_upload { + my $c = shift; + + if (-f 'stop-upload' || -f 'stop-upload.manual') { + return 1; + } + return 0; +} + +1;