diff options
Diffstat (limited to 'lib/JWebmail')
-rw-r--r-- | lib/JWebmail/Model/ReadMails/MockJSON.pm | 2 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/Helper.pm | 48 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/I18N.pm | 4 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/I18N2.pm | 15 | ||||
-rw-r--r-- | lib/JWebmail/Plugin/ServerSideSessionData.pm | 30 |
5 files changed, 46 insertions, 53 deletions
diff --git a/lib/JWebmail/Model/ReadMails/MockJSON.pm b/lib/JWebmail/Model/ReadMails/MockJSON.pm index f77cd2a..7decb7d 100644 --- a/lib/JWebmail/Model/ReadMails/MockJSON.pm +++ b/lib/JWebmail/Model/ReadMails/MockJSON.pm @@ -69,7 +69,7 @@ sub read_headers_for { } my $s = sub { my $sort_by = $sort; - my $rev = $sort_by !~ m/^![[:lower:]]+/ ? 1 : -1; + my $rev = $sort_by !~ m/^!/ ? 1 : -1; $sort_by =~ s/^!//; return (($a->{$sort_by}||$a->{head}{$sort_by}) cmp ($b->{$sort_by}||$b->{head}{$sort_by})) * $rev; }; diff --git a/lib/JWebmail/Plugin/Helper.pm b/lib/JWebmail/Plugin/Helper.pm index be147fe..cd72bfa 100644 --- a/lib/JWebmail/Plugin/Helper.pm +++ b/lib/JWebmail/Plugin/Helper.pm @@ -1,13 +1,14 @@ package JWebmail::Plugin::Helper; -use Mojo::Base 'Mojolicious::Plugin'; +use Mojo::Base Mojolicious::Plugin; use List::Util qw(all min max); -use Mojo::Util qw(encode decode b64_encode b64_decode xml_escape); use POSIX qw(floor round log ceil); +use Mojo::Util qw(encode decode b64_encode b64_decode xml_escape); + use constant TRUE_RANDOM => eval { require Crypt::URandom; Crypt::URandom->import('urandom'); 1 }; -use constant HMAC => eval { require Digest::HMAC_MD5; Digest::HMAC_MD5->import('hmac_md5'); 1 }; +use constant HMAC_MD5 => eval { require Digest::HMAC_MD5; Digest::HMAC_MD5->import('hmac_md5'); 1 }; ### filter and checks for mojo validator @@ -32,7 +33,7 @@ sub mail_line { ) | ( $mail_addr ))$ - /xno; + /xn; } @@ -80,13 +81,14 @@ sub print_sizes2 { } -sub d { qr/([[:digit:]]{$_[0]})/ } +my sub d { "([[:digit:]]{$_[0]})" } sub parse_iso_date { - state $rx = d(4).'-'.d(2).'-'.d(2).'T'.d(2).':'.d(2).':'.d(2); - my @d = shift =~ m/$rx/; - if (!all { defined $_ } @d) { + state $rx = do { my $re = d(4).'-'.d(2).'-'.d(2).'T'.d(2).':'.d(2).':'.d(2); qr/$re/a }; + my @d = shift =~ /$rx/; + if (@d != 6) { # TODO + warn "issue when parsing date"; } return { year => $d[0], @@ -155,15 +157,17 @@ sub _rand_data { sub session_passwd { my ($c, $passwd) = @_; + my $secAlg = $c->config->{session}{secure}; - warn_cram($c); + die "you need to install Digest::HMAC_MD5 for cram to work" + if !HMAC_MD5 && $secAlg eq 'cram'; warn_crypt($c); if (defined $passwd) { # set - if ( HMAC && lc($c->config->{session}{secure}) eq 'cram' ) { + if ($secAlg eq 'cram') { $c->session(S_PASSWD() => $passwd ? b64_encode(hmac_md5($passwd, $c->app->secrets->[0]), '') : ''); } - elsif (lc($c->config->{session}{secure}) eq 's3d') { + elsif ($secAlg eq 's3d') { unless ($passwd) { $c->s3d(S_PASSWD, ''); delete $c->session->{S_OTP_S3D_PW()}; @@ -171,7 +175,7 @@ sub session_passwd { } die "'$passwd' contains invalid character \\n" if $passwd =~ /\n/; if (length $passwd < 20) { - $passwd .= "\n" . " " x (20 - length($passwd) - 1); + $passwd .= "\n" . ' ' x (20 - length($passwd) - 1); } my $rand_bytes = _rand_data(length $passwd); $c->s3d(S_PASSWD, b64_encode(encode('UTF-8', $passwd) ^ $rand_bytes, '')); @@ -182,10 +186,11 @@ sub session_passwd { } } else { # get - if ( HMAC && lc($c->config->{'session'}{secure}) eq 'cram' ) { + if ($secAlg eq 'cram') { + wantarray or warn "you forgot the challenge"; return ($c->app->secrets->[0], $c->session(S_PASSWD)); } - elsif (lc($c->config->{'session'}{secure}) eq 's3d') { + elsif ($secAlg eq 's3d') { my $pw = b64_decode($c->s3d(S_PASSWD) || ''); my $otp = b64_decode($c->session(S_OTP_S3D_PW) || ''); my ($res) = split "\n", decode('UTF-8', $pw ^ $otp), 2; @@ -197,24 +202,13 @@ sub session_passwd { } } -sub warn_cram { - my $c = shift; - - state $once = 0; - - if ( !HMAC && !$once && lc($c->config->{'session'}{secure}) eq 'cram' ) { - $c->log->warn("cram requires Digest::HMAC_MD5. Falling back to 'none'."); - $once = 1; - } -} - sub warn_crypt { my $c = shift; state $once = 0; - if ( !TRUE_RANDOM && !$once && lc($c->config->{'session'}{secure}) eq 's3d' ) { - $c->log->warn("Falling back to pseudo random generation. Please install Crypt::Random"); + if ( !TRUE_RANDOM && !$once && lc($c->config->{session}{secure}) eq 's3d' ) { + $c->log->warn("Falling back to pseudo random generation. Please install Crypt::URandom"); $once = 1; } } diff --git a/lib/JWebmail/Plugin/I18N.pm b/lib/JWebmail/Plugin/I18N.pm index 6d58932..55b1a39 100644 --- a/lib/JWebmail/Plugin/I18N.pm +++ b/lib/JWebmail/Plugin/I18N.pm @@ -45,7 +45,7 @@ sub register { { local $" = ','; - $i18n_log->debug("loaded languages (@languages)"); + $i18n_log->info("loaded languages (@languages)"); } $self->_language_loaded( { map { $_ => 1 } @languages } ); @@ -55,7 +55,7 @@ sub register { my ($lang, $word) = @_; $TXT->{$lang}{$word} || scalar( local $" = ' ', - $lang && $word ? $app->log->debug('[' . __PACKAGE__ . "] missing translation for $lang:$word @{[ caller(2) ]}[0..2]") : (), + $lang && $word ? $app->log->warn('[' . __PACKAGE__ . "] missing translation for $lang:$word @{[ caller(2) ]}[0..2]") : (), '', ) }; diff --git a/lib/JWebmail/Plugin/I18N2.pm b/lib/JWebmail/Plugin/I18N2.pm index c951eec..61f87d6 100644 --- a/lib/JWebmail/Plugin/I18N2.pm +++ b/lib/JWebmail/Plugin/I18N2.pm @@ -125,8 +125,10 @@ sub register { } } - $app->defaults(default_language => $defaultLang); - $app->defaults(languages => [$t->languages]); + $app->defaults( + default_language => $defaultLang, + languages => [$t->languages], + ); # add translator as helper $app->helper(l => sub { @@ -142,16 +144,13 @@ sub register { return $res; }); - # modify incoming url - $app->hook(before_dispatch => sub { + # modify incoming and generated urls + $app->hook(before_routes => sub { my $c = shift; + unshift @{ $c->req->url->path->parts }, '' unless $t->languages($c->req->url->path->parts->[0] || ''); - }); - # modify generated url - $app->hook(before_dispatch => sub { - my $c = shift; $c->match(JWebmail::Plugin::I18N2::Match->new( root => $c->app->routes, _i18n2_stash => $c->stash, diff --git a/lib/JWebmail/Plugin/ServerSideSessionData.pm b/lib/JWebmail/Plugin/ServerSideSessionData.pm index d416c00..40772eb 100644 --- a/lib/JWebmail/Plugin/ServerSideSessionData.pm +++ b/lib/JWebmail/Plugin/ServerSideSessionData.pm @@ -1,13 +1,13 @@ package JWebmail::Plugin::ServerSideSessionData v1.1.0; -use Mojo::Base 'Mojolicious::Plugin'; +use Mojo::Base Mojolicious::Plugin; + +use Fcntl qw(:DEFAULT :seek); +use Time::HiRes 'sleep'; use Mojo::JSON qw(decode_json encode_json); use Mojo::File; -use Fcntl ':DEFAULT', ':seek'; -use Time::HiRes 'sleep'; - use constant { S_KEY => 's3d.key', @@ -16,11 +16,11 @@ use constant { ADVANCE_ON_FAILURE => 10, # seconds to retry to acquire the lock }; + has 'session_directory'; has 'expiration'; has 'cleanup_interval'; - -has 'next_cleanup' => 0; +has _next_cleanup => 0; # read and potentially update file return bool @@ -30,8 +30,8 @@ sub _rw_cleanup_file { my $self = shift; my $time = shift; - my $lock_name = $self->session_directory->child(CLEANUP_FILE_NAME . ".lock"); - my $info_name = $self->session_directory->child(CLEANUP_FILE_NAME . ".info"); + my $lock_name = $self->session_directory->child(CLEANUP_FILE_NAME . '.lock'); + my $info_name = $self->session_directory->child(CLEANUP_FILE_NAME . '.info'); my ($lock, $ctr, $rmlock); until (sysopen($lock, $lock_name, O_WRONLY | O_CREAT | O_EXCL)) { @@ -46,7 +46,7 @@ sub _rw_cleanup_file { $rmlock = 1; next; } - $self->next_cleanup($time + ADVANCE_ON_FAILURE); + $self->_next_cleanup($time + ADVANCE_ON_FAILURE); return 0; } sleep(0.01); # TODO: better spin locking @@ -60,12 +60,12 @@ sub _rw_cleanup_file { use autodie; open(my $info, -e $info_name ? '+<' : '+>', $info_name); - my $next_time = $info->getline; - $next_time = 0 unless ($next_time//'') =~ /^\d+$/; + my $next_time = $info->getline // ''; + $next_time = 0 unless $next_time =~ /^\d+$/a; chomp $next_time; if ($next_time > $time) { $info->close; - $self->next_cleanup($next_time); + $self->_next_cleanup($next_time); return 0; } else { @@ -73,7 +73,7 @@ sub _rw_cleanup_file { $info->seek(0, SEEK_SET); $info->say($time + $self->cleanup_interval); $info->close; - $self->next_cleanup($time + $self->cleanup_interval); + $self->_next_cleanup($time + $self->cleanup_interval); return 1; } }; @@ -86,7 +86,7 @@ sub cleanup_files { my $self = shift; my $t = time; - if ($self->next_cleanup < $t && $self->_rw_cleanup_file($t)) { + if ($self->_next_cleanup < $t && $self->_rw_cleanup_file($t)) { for ($self->session_directory->list->each) { if ( $_->stat->mtime + $self->expiration < $t ) { $_->remove; @@ -127,7 +127,7 @@ sub s3d { $data->{$key} = $val; $file->spurt(encode_json $data, "\n"); - return; + return $self; } else { # get return defined $key ? $data->{$key} : $data; |