Skip to content
Snippets Groups Projects
Commit 80b02a47 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

Traewelling: Warn when bearer token is about to expire

parent 5e2813e3
No related branches found
No related tags found
No related merge requests found
...@@ -4,6 +4,8 @@ use strict; ...@@ -4,6 +4,8 @@ use strict;
use warnings; use warnings;
use 5.020; use 5.020;
use DateTime;
use DateTime::Format::Strptime;
use Mojo::Promise; use Mojo::Promise;
sub new { sub new {
...@@ -182,10 +184,16 @@ sub login_p { ...@@ -182,10 +184,16 @@ sub login_p {
} }
else { else {
$token = $tx->result->json->{token}; $token = $tx->result->json->{token};
# As of 2020-10-04, Traewelling tokens expire one year after they
# are generated
my $expiry_dt = DateTime->now( time_zone => 'Europe/Berlin' )
->add( years => 1 );
$self->{model}->link( $self->{model}->link(
uid => $uid, uid => $uid,
email => $email, email => $email,
token => $token token => $token,
expires => $expiry_dt
); );
return $self->get_user_p( $uid, $token ); return $self->get_user_p( $uid, $token );
} }
......
...@@ -37,24 +37,29 @@ sub link { ...@@ -37,24 +37,29 @@ sub link {
my $log = [ [ $self->now->epoch, "Erfolgreich angemeldet" ] ]; my $log = [ [ $self->now->epoch, "Erfolgreich angemeldet" ] ];
my $data = { my $data = {
log => $log,
expires => $opt{expires}->epoch,
};
my $user_entry = {
user_id => $opt{uid}, user_id => $opt{uid},
email => $opt{email}, email => $opt{email},
push_sync => 0, push_sync => 0,
pull_sync => 0, pull_sync => 0,
token => $opt{token}, token => $opt{token},
data => JSON->new->encode( { log => $log } ), data => JSON->new->encode($data),
}; };
$self->{pg}->db->insert( $self->{pg}->db->insert(
'traewelling', 'traewelling',
$data, $user_entry,
{ {
on_conflict => \ on_conflict => \
'(user_id) do update set email = EXCLUDED.email, token = EXCLUDED.token, push_sync = false, pull_sync = false, data = null, errored = false, latest_run = null' '(user_id) do update set email = EXCLUDED.email, token = EXCLUDED.token, push_sync = false, pull_sync = false, data = null, errored = false, latest_run = null'
} }
); );
return $data; return $user_entry;
} }
sub set_user { sub set_user {
...@@ -96,6 +101,16 @@ sub get { ...@@ -96,6 +101,16 @@ sub get {
for my $log_entry ( @{ $res_h->{data}{log} // [] } ) { for my $log_entry ( @{ $res_h->{data}{log} // [] } ) {
$log_entry->[0] = epoch_to_dt( $log_entry->[0] ); $log_entry->[0] = epoch_to_dt( $log_entry->[0] );
} }
$res_h->{expires_on} = epoch_to_dt( $res_h->{data}{expires} );
my $expires_in = ( $res_h->{data}{expires} // 0 ) - $self->now->epoch;
if ( $expires_in < 0 ) {
$res_h->{expired} = 1;
}
elsif ( $expires_in < 14 * 24 * 3600 ) {
$res_h->{expiring} = 1;
}
return $res_h; return $res_h;
} }
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
<span class="card-title">Einstellungen zu öffentlichen Account-Daten geändert</span> <span class="card-title">Einstellungen zu öffentlichen Account-Daten geändert</span>
% } % }
% elsif ($success eq 'traewelling') { % elsif ($success eq 'traewelling') {
<span class="card-title">Traewelling-Verknüpfung aktualisiert</span> <span class="card-title">Träwelling-Verknüpfung aktualisiert</span>
% } % }
% elsif ($success eq 'use_history') { % elsif ($success eq 'use_history') {
<span class="card-title">Einstellungen zu vorgeschlagenen Verbindungen geändert</span> <span class="card-title">Einstellungen zu vorgeschlagenen Verbindungen geändert</span>
...@@ -123,11 +123,17 @@ ...@@ -123,11 +123,17 @@
<span style="color: #999999;">Nicht verknüpft</span> <span style="color: #999999;">Nicht verknüpft</span>
% } % }
% elsif ($traewelling->{errored}) { % elsif ($traewelling->{errored}) {
Fehlerhaft <i class="material-icons">error</i> Fehlerhaft <i class="material-icons" aria-hidden="true">error</i>
% } % }
% else { % else {
Verknüpft mit <%= $traewelling->{data}{user_name} // $traewelling->{email} %> Verknüpft mit <%= $traewelling->{data}{user_name} // $traewelling->{email} %>
% if ($traewelling->{pull_sync}) { % if ($traewelling->{expired}) {
– Login-Token abgelaufen <i class="material-icons" aria-hidden="true">error</i>
% }
% elsif ($traewelling->{expiring}) {
– Login-Token läuft bald ab <i class="material-icons" aria-hidden="true">warning</i>
% }
% elsif ($traewelling->{pull_sync}) {
– Checkins in Träwelling werden von travelynx übernommen – Checkins in Träwelling werden von travelynx übernommen
% } % }
% elsif ($traewelling->{push_sync}) { % elsif ($traewelling->{push_sync}) {
......
...@@ -117,7 +117,7 @@ ...@@ -117,7 +117,7 @@
% else { % else {
%= $traewelling->{email} %= $traewelling->{email}
% } % }
verknüpft. verknüpft. Der Login-Token läuft <%= $traewelling->{expires_on}->strftime('am %d.%m.%Y um %H:%M Uhr') %> ab.
</p> </p>
</div> </div>
</div> </div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment