package BurguillosInfo::Controller::Metrics; use v5.34.1; use strict; use warnings; use Data::Dumper; use BurguillosInfo::Tracking; use Mojo::Base 'Mojolicious::Controller', '-signatures'; use DateTime::Format::ISO8601; use DateTime::Format::Mail; use Crypt::Bcrypt qw/bcrypt bcrypt_check/; my $tracking; my $iso8601 = DateTime::Format::ISO8601->new; sub request { shift; eval { my $c = shift; my $app = $c->app; if ( !defined $tracking ) { $tracking = BurguillosInfo::Tracking->new($app); } $tracking->register_request($c); }; if ($@) { say STDERR $@; } } sub stats { my $self = shift; if ( !$self->valid_login ) { $self->res->headers->location('/stats/login'); $self->render( text => 'You must login', status => 302 ); return; } $self->session( expiration => 0 ); my $data = $tracking->get_global_data($self); my $data_per_url = $tracking->get_data_for_urls($self); my $google_data = $tracking->get_google_data($self); $self->_filter_data_per_url($data_per_url); $self->_filter_data_per_url($google_data); $self->render( tracking_data => $data, tracking_by_url => $data_per_url, google_data => $google_data ); } sub _filter_data_per_url ( $self, $data_per_url ) { my $filter = $self->param('filter'); if ( !defined $filter ) { return; } my @new_data_per_url; if ( $filter eq 'remove-extensions' ) { for my $url (@$data_per_url) { if ( $url->{path} =~ /\.\w+$/ ) { next; } push @new_data_per_url, $url; } } @$data_per_url = @new_data_per_url; } sub submit_login { my $self = shift; if ( $self->valid_login ) { $self->res->headers->location('/stats'); $self->render( text => 'Already logged in.', status => 302 ); return; } my $password = $self->param('password'); if ( !defined $password ) { $self->render( text => 'No password passed.', status => 400 ); return; } my $bcrypted_pass = $self->config->{bcrypt_pass_stats}; if ( !defined $bcrypted_pass ) { warn "No bcrypt pass."; $self->render( text => 'Server error.', status => 500 ); return; } say $password; say $bcrypted_pass; if ( !bcrypt_check( $password, $bcrypted_pass ) ) { $self->render( text => 'Wrong password', status => 401 ); return; } say STDERR 'Login success.'; my $expiration_date = DateTime->now->add( days => 1 ); $self->session->{login} = "date_end_login:$expiration_date"; $self->res->headers->location('/stats'); $self->render( text => 'Login success.', status => 302 ); return; } sub valid_login { my $self = shift; my $login_cookie = $self->session->{login}; if ( !defined $login_cookie ) { return; } my ($date_text) = $login_cookie =~ /^date_end_login:(.*)$/; my $date; eval { $date = $iso8601->parse_datetime($date_text); }; if ($@) { warn "Bad date in cookie $login_cookie."; return; } my $current_date = DateTime->now(); if ( $current_date > $date ) { return; } return 1; } sub login { my $self = shift; if ( $self->valid_login ) { $self->res->headers->location('/stats'); $self->render( text => 'You are already logged in.', status => 302 ); return; } $self->render; } 1;