Luc Didry 91e078
# vim:set sw=4 ts=4 sts=4 ft=perl expandtab:
Luc Didry 91e078
package Lufi;
Luc Didry 91e078
use Mojo::Base 'Mojolicious';
Luc Didry 7c8ac6
use Mojolicious::Sessions;
Luc Didry 0ec7f7
use Mojo::File;
Luc Didry 377a48
use Email::Valid;
Luc Didry 377a48
use Data::Validate::URI qw(is_web_uri);
Luc Didry b57ed7
use Lufi::DefaultConfig qw($default_config);
Luc Didry 91e078
Luc Didry 91e078
$ENV{MOJO_MAX_WEBSOCKET_SIZE} = 100485760; # 10 * 1024 * 1024 = 10MiB
Luc Didry 91e078
Luc Didry 91e078
# This method will run once at server start
Luc Didry 91e078
sub startup {
Luc Didry 91e078
    my $self = shift;
Luc Didry 91e078
Luc Didry 91e078
    my $config = $self->plugin('Config' => {
Luc Didry b57ed7
        default => $default_config
Luc Didry 91e078
    });
Luc Didry 91e078
Luc Didry 377a48
    die 'You need to provide a contact information in lufi.conf!' unless (defined($self->config('contact')));
Luc Didry 377a48
    die 'You need to provide a **report** information in lufi.conf!' unless (defined($self->config('report')));
Luc Didry 377a48
Luc Didry 377a48
    if (Email::Valid->address($self->config('report'))) {
Luc Didry 377a48
        $self->config('report' => 'mailto:'.$self->config('report'));
Luc Didry 377a48
    } elsif (!is_web_uri($self->config('report'))) {
Luc Didry 377a48
        die 'You need to provide an email address or an URL as report information in lufi.conf!';
Luc Didry 377a48
    }
Luc Didry 377a48
Luc Didry 3e3e84
    $self->config('prefix', $self->config('prefix').'/') unless substr($self->config('prefix'), -1) eq '/';
Luc Didry adf0a4
Luc Didry adf0a4
    # Themes handling
Luc Didry 218c4a
    $self->plugin('FiatTux::Themes');
Luc Didry 91e078
Luc Didry ae8934
    # Mail config
Luc Didry ae8934
    my $mail_config = {
Luc Didry ae8934
        type     => 'text/plain',
Luc Didry ae8934
        encoding => 'quoted-printable',
Luc Didry ae8934
        how      => $self->config('mail')->{'how'}
Luc Didry ae8934
    };
Luc Didry ae8934
    $mail_config->{howargs} = $self->config('mail')->{'howargs'} if (defined $self->config('mail')->{'howargs'});
Luc Didry ae8934
Luc Didry ae8934
    $self->plugin('Mail' => $mail_config);
Luc Didry ae8934
Luc Didry 91e078
    # Internationalization
juju4 f2433c
    my $lib = $self->home->rel_file('themes/'.$config->{theme}.'/lib');
Luc Didry da9c06
    eval qq(use lib "$lib");
Luc Didry 91e078
    $self->plugin('I18N');
Luc Didry 91e078
Luc Didry 91e078
    # Debug
Luc Didry 91e078
    $self->plugin('DebugDumperHelper');
Luc Didry 91e078
Luc Didry b61880
    # Compress static assets
Luc Didry b61880
    $self->plugin('GzipStatic');
Luc Didry b61880
Luc Didry 377ba0
    # Headers
Luc Didry 377ba0
    $self->plugin('Lufi::Plugin::Headers');
Luc Didry b61880
Luc Didry 13e855
    # Fiat Tux helpers
Luc Didry 13e855
    $self->plugin('FiatTux::Helpers');
Luc Didry 13e855
Luc Didry 13e855
    # Authentication
Luc Didry 13e855
    $self->plugin('FiatTux::GrantAccess');
Luc Didry ac8d76
Luc Didry ac8d76
    # Secrets
Luc Didry adf0a4
    $self->secrets($self->config('secrets'));
Luc Didry 91e078
Luc Didry 91e078
    # Helpers
Luc Didry 5684cb
    $self->plugin('Lufi::Plugin::Helpers');
Luc Didry 13e855
Luc Didry 8d6f10
    # Now helpers has been loaded, time to check Swift container
Luc Didry 8d6f10
    if ($config->{swift}) {
Luc Didry 8d6f10
        $self->check_swift_container();
Luc Didry 0b2ad4
        $self->log->info('EXPERIMENTAL Using Swift object storage');
Luc Didry 8d6f10
    }
Luc Didry 8d6f10
Luc Didry 6958b7
    # Recurrent task
Luc Didry 5e248e
    my $config_file = $ENV{MOJO_CONFIG} || $self->moniker.'.conf';
Luc Didry 6958b7
    Mojo::IOLoop->recurring(2 => sub {
Luc Didry 6958b7
        my $loop = shift;
Luc Didry 6958b7
Luc Didry 5e248e
        my $lockfile = Mojo::File->new($config_file)->basename('.conf').'-provisioning.lock';
Luc Didry 222fe5
        if (-e $lockfile) {
Luc Didry 222fe5
            my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks) = stat($lockfile);
Luc Didry 222fe5
Luc Didry 222fe5
            # Remove the lockfile if more than 20 seconds old
Luc Didry 634707
            if ($mtime && time - $mtime > 20) {
Luc Didry 222fe5
                unlink $lockfile if -e $lockfile; # if -e just to be sure the file hasn’t been removed while checking it
Luc Didry 222fe5
            } else {
Luc Didry 222fe5
                return;
Luc Didry 222fe5
            }
Luc Didry 222fe5
        }
Luc Didry 0ec7f7
Luc Didry dead27
        Mojo::File->new($lockfile)->open('>'); # Create the file, like ->touch() but does not croak on fail
Luc Didry 0ec7f7
Luc Didry 6958b7
        $self->provisioning();
Luc Didry 0ec7f7
Luc Didry dead27
        unlink $lockfile if -e $lockfile;
Luc Didry 6958b7
    });
Luc Didry 91e078
Luc Didry 91e078
    # Create directory if needed
Luc Didry 8d6f10
    if (!defined($config->{swift})) {
Luc Didry 8d6f10
        mkdir($self->config('upload_dir'), 0700) unless (-d $self->config('upload_dir'));
Luc Didry 8d6f10
        die ('The upload directory ('.$self->config('upload_dir').') is not writable') unless (-w $self->config('upload_dir'));
Luc Didry 8d6f10
    }
Luc Didry 91e078
Luc Didry 7c8ac6
    # Configure sessions
Luc Didry 7c8ac6
    my $sessions = Mojolicious::Sessions->new;
Luc Didry 7c8ac6
    $sessions->cookie_name('lufi');
Luc Didry 7c8ac6
    $sessions->cookie_path($self->config('prefix'));
Luc Didry 7c8ac6
    $self->sessions($sessions);
Luc Didry 7c8ac6
Luc Didry 91e078
    # Default layout
Luc Didry 91e078
    $self->defaults(layout => 'default');
Luc Didry 91e078
Luc Didry 91e078
    # Router
Luc Didry 91e078
    my $r = $self->routes;
Luc Didry 91e078
Luc Didry 91e078
    # Page for files uploading
Luc Didry 25ab7e
    $r->get('/')
Luc Didry 25ab7e
      ->to('Misc#index')
Luc Didry 25ab7e
      ->name('index');
Luc Didry 91e078
Luc Didry 986e77
    $r->get('/lang/:l')
Luc Didry 986e77
      ->to('Misc#change_lang')
Luc Didry 986e77
      ->name('lang');
Luc Didry 986e77
mildis 537764
    if (defined $self->config('ldap') || defined $self->config('htpasswd') || defined $self->config('auth_headers')) {
Luc Didry ac8d76
        # Login page
Luc Didry 25ab7e
        $r->get('/login')
Luc Didry 25ab7e
          ->to('Auth#login_page');
Luc Didry 25ab7e
Luc Didry ac8d76
        # Authentication
Luc Didry 25ab7e
        $r->post('/login')
Luc Didry 25ab7e
          ->to('Auth#login');
Luc Didry 25ab7e
Luc Didry ac8d76
        # Logout page
Luc Didry da7cb6
        $r->post('/logout')
Luc Didry e41b08
          ->to('Auth#log_out')
Luc Didry 25ab7e
          ->name('logout');
Luc Didry 8b68d7
mildis 537764
        if ((defined $self->config('ldap') || defined $self->config('auth_headers')) && defined $self->config('invitations')) {
Luc Didry 8b68d7
            # Invitation creation page
Luc Didry 8b68d7
            $r->get('/invite')
Luc Didry 8b68d7
              ->name('invite')
Luc Didry 8b68d7
              ->to('Invitation#new_invite');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # Send invitation
Luc Didry 8b68d7
            $r->post('/invite')
Luc Didry 8b68d7
              ->to('Invitation#send_invite');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # Get my invitations
Luc Didry 8b68d7
            $r->get('/invite/list')
Luc Didry 8b68d7
              ->name('invite_list')
Luc Didry 8b68d7
              ->to('Invitation#my_invitations');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # Delete invitations
Luc Didry 8b68d7
            $r->post('/invite/list/delete')
Luc Didry 8b68d7
              ->name('invite_list_delete')
Luc Didry 8b68d7
              ->to('Invitation#delete_invitations');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # Resend invitation mail
Luc Didry 8b68d7
            $r->post('/invite/list/resend')
Luc Didry 8b68d7
              ->name('invite_list_resend')
Luc Didry 8b68d7
              ->to('Invitation#resend_invitations');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # Toggle invitations visibility
Luc Didry 8b68d7
            $r->post('/invite/list/visibility')
Luc Didry 8b68d7
              ->name('invite_list_visibility')
Luc Didry 8b68d7
              ->to('Invitation#toggle_invitations_visibility');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # I’m a guest
Luc Didry 8b68d7
            $r->get('/guest/:token')
Luc Didry 8b68d7
              ->name('guest')
Luc Didry 8b68d7
              ->to('Invitation#guest');
Luc Didry 8b68d7
Luc Didry 8b68d7
            # I’m a guest and I sent all my files
Luc Didry 8b68d7
            $r->post('/guest/:token/send_mail')
Luc Didry 8b68d7
              ->name('guest_send_mail')
Luc Didry 8b68d7
              ->to('Invitation#send_mail_to_ldap_user');
Luc Didry 8b68d7
        }
Luc Didry ac8d76
    }
Luc Didry ac8d76
Luc Didry 99abed
    # About page
Luc Didry 25ab7e
    $r->get('/about')
Luc Didry 25ab7e
      ->to('Misc#about')
Luc Didry 25ab7e
      ->name('about');
Luc Didry 99abed
Luc Didry 53342a
    # About config API endpoint
Luc Didry 53342a
    $r->get('/about/config')
Luc Didry 53342a
      ->to('Misc#config_infos')
Luc Didry 53342a
      ->name('config');
Luc Didry 53342a
Luc Didry c2e926
    # Generated js files
Luc Didry 25ab7e
    $r->get('/partial/:file')
Luc Didry 25ab7e
      ->to('Misc#js_files')
Luc Didry 25ab7e
      ->name('partial');
Luc Didry c2e926
Luc Didry 1c2cee
    # Get instance stats
Luc Didry 1c2cee
    $r->get('/fullstats')
Luc Didry 1c2cee
        ->to('Misc#fullstats')
Luc Didry 1c2cee
        ->name('fullstats');
Luc Didry 1c2cee
Luc Didry 91e078
    # Get a file
Luc Didry 25ab7e
    $r->get('/r/:short')
Luc Didry 25ab7e
      ->to('Files#r')
Luc Didry 25ab7e
      ->name('render');
Luc Didry 91e078
Luc Didry ac8d76
    # List of files (use localstorage, so the server know nothing about files)
Luc Didry 25ab7e
    $r->get('/files')
Luc Didry 25ab7e
      ->to('Files#files')
Luc Didry 25ab7e
      ->name('files');
Luc Didry 91e078
Luc Didry 91e078
    # Get counter informations about a file
Luc Didry 25ab7e
    $r->post('/c')
Luc Didry 25ab7e
      ->to('Files#get_counter')
Luc Didry 25ab7e
      ->name('counter');
Luc Didry 91e078
Luc Didry 91e078
    # Get counter informations about a file
Luc Didry 25ab7e
    $r->get('/d/:short/:token')
Luc Didry 25ab7e
      ->to('Files#delete')
Luc Didry 25ab7e
      ->name('delete');
Luc Didry 91e078
Luc Didry 41cb17
    # Get some informations about delays
Luc Didry 25ab7e
    $r->get('/delays')
Luc Didry 25ab7e
      ->to('Misc#delays')
Luc Didry 25ab7e
      ->name('delays');
Luc Didry 41cb17
Luc Didry 995a38
    # Get mail page
Luc Didry 25ab7e
    $r->get('/m')
Luc Didry 25ab7e
      ->to('Mail#render_mail')
Luc Didry 25ab7e
      ->name('mail');
Luc Didry 995a38
Luc Didry 995a38
    # Submit mail
Luc Didry 25ab7e
    $r->post('/m')
Luc Didry 5845f3
      ->to('Mail#send_mail') unless $self->config('disable_mail_sending');
Luc Didry 91e078
Luc Didry 91e078
    # Upload files websocket
Luc Didry 25ab7e
    $r->websocket('/upload')
Luc Didry 25ab7e
      ->to('Files#upload')
Luc Didry 25ab7e
      ->name('upload');
Luc Didry 91e078
Luc Didry 91e078
    # Get files websocket
Luc Didry 25ab7e
    $r->websocket('/download/:short')
Luc Didry 25ab7e
      ->to('Files#download')
Luc Didry 25ab7e
      ->name('download');
Luc Didry 91e078
}
Luc Didry 91e078
Luc Didry 91e078
1;