|
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 |
7713c7 |
from => $self->config('mail_sender'),
|
|
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 |
7713c7 |
$self->plugin('EmailMailer' => $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 |
|
|
Yann |
dbdaff |
if (defined $self->config('ldap') || defined $self->config('htpasswd')) {
|
|
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 |
|
|
Luc Didry |
8b68d7 |
if (defined $self->config('ldap') && 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 |
7713c7 |
->to('Mail#render_share_mail')
|
|
Luc Didry |
25ab7e |
->name('mail');
|
|
Luc Didry |
995a38 |
|
|
Luc Didry |
995a38 |
# Submit mail
|
|
Luc Didry |
25ab7e |
$r->post('/m')
|
|
Luc Didry |
ba0ad4 |
->to('Mail#send_share_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;
|