package PiTube; use Mojo::Base 'Mojolicious'; use Mojo::Home; use Mojo::Pg; use Net::OAuth2::Profile::WebServer; use Mojolicious::Plugin::Authentication; use Mojolicious::Plugin::Authorization; use PiTube::Schema; sub startup { my $self = shift; # Nacteni konfigurace my $cfg = $self->plugin('Config'); $self->helper( cfg => sub { return $cfg; } ); $self->secrets($cfg->{session}{secrets}); $self->plugin('PiTube::Helpers::OAuth2'); my $home = Mojo::Home->new()->detect; my $pg = Mojo::Pg->new ->dsn($cfg->{database}{dsn}) ->username($cfg->{database}{user}) ->password($cfg->{database}{password}) ; $pg->migrations->from_file("$home/sql/migrations.sql"); $pg->migrations->migrate(); # Spojeni s databazi my $schema = PiTube::Schema->connect($cfg->{database}); $self->helper( schema => sub { return $schema; } ); $self->plugin('authentication', { autoload_user => 1, load_user => sub { my $c = shift; return $c->schema->resultset('User')->find({ uuid => $c->session->{oauth}{sub} }); }, validate_user => sub { my $c = shift; return undef if ! $c->session->{oauth}; return $c->session->{oauth}{sub}; }, }); $self->plugin('Authorization' => { is_role => sub { my ($c, $role, $extradata) = @_; return 0 if ! $c->session->{oauth}; my $client = 'pitube'; if ( $role =~ s/\@(.+)$// ) { $client = $1; } return 0 if ! $c->session->{oauth}{resource_access}{$client}; my %client_roles = map { $_ => 1 } @{ $c->session->{oauth}{resource_access}{$client}{roles} }; return exists $client_roles{$role} ? 1 : 0; }, user_privs => sub {}, has_priv => sub {}, user_role => sub {}, fail_render => { status => 401, json => {} }, }); my $r = $self->routes; $r->get('/')->to(cb => sub { shift->render('index'); }); $r->get('/streams')->to('Stream#list'); $r->get('/oauth2')->to('OAuth2#callback'); $r->get('/logout')->to('OAuth2#do_logout'); $r->post('/callback')->to('NginxRTMP#callback'); $r->get('/play/:key')->to('Stream#player'); $r->get('/hls/*')->to('Stream#hls'); } 1;