UserStore and User classes
[scpubgit/App-EzPz.git] / lib / App / EzPz / UserStore.pm
1 package App::EzPz::UserStore;
2
3 use App::EzPz::User;
4 use Scalar::Util 'blessed';
5 use Authen::Htpasswd;
6 use Moo;
7
8 has ezmlm_bindir => (is => 'ro', required => 1);
9
10 has htpasswd_file => (is => 'ro', required => 1);
11
12 has _htpasswd => (is => 'lazy');
13
14 sub _build__htpasswd {
15   my ($self) = @_;
16   return Authen::Htpasswd->new($self->htpasswd_file);
17 }
18
19 sub all {
20   my ($self) = @_;
21   return map $self->_inflate_user($_), $self->_htpasswd->all_users;
22 }
23
24 sub get {
25   my ($self, $name) = @_;
26   if (my $htp_user = $self->_htpasswd->lookup_user($name)) {
27     return $self->_inflate_user($htp_user);
28   } else {
29     return undef;
30   }
31 }
32
33 sub add {
34   my ($self, $user) = @_;
35   unless (blessed($user)) {
36     $user = App::EzPz::User->new($user);
37   }
38   my $htp_file = $self->_htpasswd;
39   my $htp_user = $user->_htpasswd_user;
40   $htp_file->add_user($htp_user);
41   $htp_user->file($htp_file);
42   return $user;
43 }
44
45 sub remove {
46   my ($self, $user) = @_;
47   $self->_htpasswd->remove_user($user->_htpasswd_user);
48   return $user;
49 }
50
51 sub _inflate_user {
52   my ($self, $htp_user) = @_;
53   return App::EzPz::User->new(
54     htpasswd_user => $htp_user,
55   );
56 }
57
58 sub check_password {
59   my ($self, $name, $password) = @_;
60   return unless my $user = $self->get($name);
61   return $user->check_password($password);
62 }
63
64 1;