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 8b68d7
use Lufi::DB::Invitation;
Luc Didry 913ae9
use Date::Language;
Luc Didry 5684cb
Luc Didry 5684cb
sub register {
Luc Didry 5684cb
    my ($self, $app) = @_;
Luc Didry 5684cb
Luc Didry 164698
    # PgURL helper
Luc Didry 164698
    if ($app->config('dbtype') eq 'postgresql' || $app->config('dbtype') eq 'mysql') {
Luc Didry 164698
        $app->plugin('PgURLHelper');
Luc Didry 164698
    }
Luc Didry 164698
Luc Didry 18499a
    if ($app->config('dbtype') eq 'postgresql') {
Luc Didry 164698
        require Mojo::Pg;
Luc Didry 164698
        $app->helper(dbi => \&_pg);
Luc Didry 18499a
Luc Didry 18499a
        # Database migration
Luc Didry 164698
        my $migrations = Mojo::Pg::Migrations->new(pg => $app->dbi);
Luc Didry 18499a
        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/pg.sql')->migrate(0)->migrate($migrations->latest);
Luc Didry 18499a
        } else {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/pg.sql')->migrate($migrations->latest);
Luc Didry 18499a
        }
Luc Didry 44507c
    } elsif ($app->config('dbtype') eq 'mysql') {
Luc Didry 44507c
        require Mojo::mysql;
Luc Didry 44507c
        $app->helper(dbi => \&_mysql);
Luc Didry 44507c
Luc Didry 44507c
        # Database migration
Luc Didry 44507c
        my $migrations = Mojo::mysql::Migrations->new(mysql => $app->dbi);
Luc Didry 44507c
        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/mysql.sql')->migrate(0)->migrate($migrations->latest);
Luc Didry 44507c
        } else {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/mysql.sql')->migrate($migrations->latest);
Luc Didry 44507c
        }
Luc Didry 18499a
    } elsif ($app->config('dbtype') eq 'sqlite') {
Luc Didry 164698
        require Mojo::SQLite;
Luc Didry 164698
        $app->helper(dbi => \&_sqlite);
Luc Didry 164698
Luc Didry 164698
        # Database migration
Luc Didry 164698
        # Have to create $sql before using its migrations attribute, otherwise, it won't work
Luc Didry 164698
        my $sql        = $app->dbi;
Luc Didry 164698
        my $migrations = $sql->migrations;
Luc Didry 164698
        if ($app->mode eq 'development' && $ENV{LUFI_DEV}) {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/sqlite.sql')->migrate(0)->migrate($migrations->latest);
Luc Didry 164698
        } else {
Luc Didry 883ea8
            $migrations->from_file('utilities/migrations/sqlite.sql')->migrate($migrations->latest);
Luc Didry d909b8
        }
Luc Didry 25ab7e
Luc Didry 25ab7e
        # Check if passwd column is missing
Luc Didry 164698
        my $columns = $app->dbi->db->query('PRAGMA table_info(files)')->hashes;
Luc Didry 25ab7e
        my $pwd_col = 0;
Luc Didry 25ab7e
        $columns->each(sub {
Luc Didry 25ab7e
            my ($e, $num) = @_;
Luc Didry 25ab7e
            $pwd_col = 1 if $e->{name} eq 'passwd';
Luc Didry 25ab7e
        });
Luc Didry 25ab7e
        $app->dbi->db->query('ALTER TABLE files ADD COLUMN passwd TEXT') unless $pwd_col;
Luc Didry 5684cb
    }
Luc Didry 5684cb
Luc Didry 8b68d7
    $app->helper(provisioning            => \&_provisioning);
Luc Didry 8b68d7
    $app->helper(get_empty               => \&_get_empty);
Luc Didry 8b68d7
    $app->helper(ip                      => \&_ip);
Luc Didry 8b68d7
    $app->helper(default_delay           => \&_default_delay);
Luc Didry 8b68d7
    $app->helper(max_delay               => \&_max_delay);
Luc Didry 8b68d7
    $app->helper(is_selected             => \&_is_selected);
Luc Didry 8b68d7
    $app->helper(stop_upload             => \&_stop_upload);
Luc Didry 8b68d7
    $app->helper(create_invitation_token => \&_create_invitation_token);
Luc Didry 8b68d7
    $app->helper(is_guest                => \&_is_guest);
Luc Didry 913ae9
    $app->helper(get_date_lang           => \&_get_date_lang);
Luc Didry 17600f
    $app->helper(git_version             => \&_git_version);
Luc Didry 5684cb
}
Luc Didry 5684cb
Luc Didry d909b8
sub _pg {
Luc Didry 164698
    my $c = shift;
Luc Didry d909b8
Luc Didry 17600f
    my $pgdb = $c->config('pgdb');
Luc Didry 17600f
    my $port = (defined $pgdb->{port}) ? $pgdb->{port}: 5432;
Luc Didry 17600f
    my $addr = $c->pg_url({
Luc Didry 44507c
        host => $pgdb->{host}, port => $port, database => $pgdb->{database}, user => $pgdb->{user}, pwd => $pgdb->{pwd}
Luc Didry 44507c
    });
Luc Didry 44507c
    state $pg = Mojo::Pg->new($addr);
Luc Didry 44507c
    $pg->max_connections($pgdb->{max_connections}) if defined $pgdb->{max_connections};
Luc Didry d909b8
    return $pg;
Luc Didry d909b8
}
Luc Didry d909b8
Luc Didry 44507c
sub _mysql {
Luc Didry 17600f
    my $c = shift;
Luc Didry 44507c
Luc Didry 17600f
    my $mysqldb = $c->config('mysqldb');
Luc Didry 17600f
    my $port    = (defined $mysqldb->{port}) ? $mysqldb->{port}: 3306;
Luc Didry 17600f
    my $addr    = $c->pg_url({
Luc Didry 44507c
        host => $mysqldb->{host}, port => $port, database => $mysqldb->{database}, user => $mysqldb->{user}, pwd => $mysqldb->{pwd}
Luc Didry 44507c
    });
Luc Didry 44507c
    $addr =~ s/postgresql/mysql/;
Luc Didry 44507c
    state $mysql = Mojo::mysql->new($addr);
Luc Didry 44507c
    $mysql->max_connections($mysqldb->{max_connections}) if defined $mysqldb->{max_connections};
Luc Didry 44507c
    return $mysql;
Luc Didry 44507c
}
Luc Didry 44507c
Luc Didry 164698
sub _sqlite {
Luc Didry 164698
    my $c = shift;
Luc Didry 164698
Luc Didry 164698
    state $sqlite = Mojo::SQLite->new('sqlite:'.$c->app->config('db_path'));
Luc Didry 164698
    return $sqlite;
Luc Didry 164698
}
Luc Didry 164698
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 17600f
    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 _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 8b68d7
sub _create_invitation_token {
Luc Didry 8b68d7
    my $c = shift;
Luc Didry 8b68d7
Luc Didry 8b68d7
    return $c->shortener(32);
Luc Didry 8b68d7
}
Luc Didry 8b68d7
Luc Didry 8b68d7
sub _is_guest {
Luc Didry 8b68d7
    my $c     = shift;
Luc Didry 8b68d7
    my $token = shift;
Luc Didry 8b68d7
Luc Didry 8b68d7
    my $invitation = Lufi::DB::Invitation->new(app => $c->app)->from_token($token);
Luc Didry 8b68d7
    return $invitation if ($invitation && $invitation->is_valid);
Luc Didry 8b68d7
    return 0;
Luc Didry 8b68d7
}
Luc Didry 8b68d7
Luc Didry 913ae9
my %date_langs = (
Luc Didry 913ae9
    aa => 'Afar',
Luc Didry 913ae9
    am => 'Amharic',
Luc Didry 913ae9
    pt => 'Brazilian',
Luc Didry 913ae9
    bg => 'Bulgarian',
Luc Didry 913ae9
    zh => 'Chinese',
Luc Didry 913ae9
    cs => 'Czech',
Luc Didry 913ae9
    da => 'Danish',
Luc Didry 913ae9
    nl => 'Dutch',
Luc Didry 913ae9
    fi => 'Finnish',
Luc Didry 913ae9
    en => 'English',
Luc Didry 913ae9
    fr => 'French',
Luc Didry 913ae9
    de => 'German',
Luc Didry 913ae9
    el => 'Greek',
Luc Didry 913ae9
    hu => 'Hungarian',
Luc Didry 913ae9
    is => 'Icelandic',
Luc Didry 913ae9
    it => 'Italian',
Luc Didry 913ae9
    nn => 'Norwegian',
Luc Didry 913ae9
    om => 'Oromo',
Luc Didry 2c98a3
    oc => 'Occitan',
Luc Didry 913ae9
    ro => 'Romanian',
Luc Didry 913ae9
    ru => 'Russian',
Luc Didry 913ae9
    so => 'Somali',
Luc Didry 913ae9
    es => 'Spanish',
Luc Didry 913ae9
    sv => 'Swedish',
Luc Didry 913ae9
    ti => 'Tigrinya',
Luc Didry 913ae9
    tk => 'Turkish',
Luc Didry 913ae9
);
Luc Didry 913ae9
Luc Didry 913ae9
sub _get_date_lang {
Luc Didry 17600f
    my $c = shift;
Luc Didry 913ae9
Luc Didry 913ae9
    my $l = $c->languages();
Luc Didry 913ae9
Luc Didry 913ae9
    return Date::Language->new($date_langs{$l}) if $date_langs{$l};
Luc Didry 913ae9
Luc Didry 913ae9
    $l =~ s/^(..).*/$1/;
Luc Didry 913ae9
    return Date::Language->new($date_langs{$l}) if $date_langs{$l};
Luc Didry 913ae9
Luc Didry 913ae9
    return Date::Language->new('English');
Luc Didry 913ae9
}
Luc Didry 913ae9
Luc Didry 17600f
sub _git_version {
Luc Didry 17600f
    my $c = shift;
Luc Didry 17600f
Luc Didry 007dd1
    my $last_tag    = `git describe --tags --abbrev=0`;
Luc Didry 17600f
    my $last_commit = `git rev-parse HEAD`;
Luc Didry 17600f
    chomp $last_tag;
Luc Didry 17600f
    chomp $last_commit;
Luc Didry 17600f
Luc Didry 17600f
    return {
Luc Didry 17600f
        tag    => $last_tag,
Luc Didry 17600f
        commit => $last_commit
Luc Didry 17600f
    }
Luc Didry 17600f
}
Luc Didry 17600f
Luc Didry 5684cb
1;