package JWebmail::Model::ReadMails::MockMaildir; use Mojo::Base 'JWebmail::Model::ReadMails::QMailAuthuser'; use Mojo::JSON 'decode_json'; use Digest::HMAC_MD5 'hmac_md5_hex'; use constant { VALID_USER => 'mockmaildir@example.org', VALID_PW => '12345', }; has user => sub { $ENV{USER} }; has maildir => 't/'; has extractor => 'perl'; our %EXTRACTORS = ( perl => 'perl script/qmauth.pl', python => 'python script/qmauth.py', rust => 'extract/target/debug/jwebmail-extract', ); sub new { my $cls = shift; my %args = @_ == 1 ? %$_[0] : @_; my $self = bless {%args}, ref $cls || $cls; $self->user; $self->maildir; $self->next::method(prog => $EXTRACTORS{$self->extractor}); return $self; } sub verify_user { my $self = shift; my $auth = shift; my $passwd = $auth->{password}->show_password; if ($auth->{challenge}) { return $auth->{user} eq VALID_USER && $passwd eq hmac_md5_hex($auth->{challenge}, VALID_PW); } else { return $auth->{user} eq VALID_USER && $passwd eq VALID_PW; } } sub build_and_run { my $self = shift; my ($auth, $mode, $args) = @_; my $mail_user = 'maildir'; my $exec = $EXTRACTORS{$self->extractor} . ' ' . join(' ', map { my $x = s/(['\\])/\\$1/gr; "'$x'" } ($self->maildir, $self->user, $mail_user, $mode, @$args)); my $pid = open(my $reader, '-|', $exec) or die 'failed to create subprocess'; my $input = <$reader>; waitpid($pid, 0); my $rc = $? >> 8; my $resp; if ($rc == 3 || $rc == 0) { eval { $resp = decode_json $input; }; if (my $err = $@) { $resp = {error => "decoding error '$err'"}; $rc ||= 1; }; } elsif ($rc) { $resp = {error => "qmauth returned code: $rc"}; } local $" = ', '; die "error @{[%$resp]}" if $rc; return $resp; } 1