1 package App::EzPz::Web;
3 use Module::Runtime qw(use_module);
4 use App::EzPz::UserStore;
8 has users => (is => 'lazy');
12 my $config = $self->config;
13 return App::EzPz::UserStore->new(
14 htpasswd_file => $config->{htpasswd_file},
15 ($config->{ezmlm_bindir}
17 bindir => $config->{ezmlm_bindir},
18 list_base_dir => $config->{list_base_dir},
26 htpasswd_file => 'test-setup/lists/htpasswd',
27 ezmlm_bindir => 'test-setup/ezmlm/bin',
28 list_base_dir => 'test-setup/lists',
32 sub dispatch_request {
34 my $users = $self->users;
37 return if $_[PSGI_ENV]->{REMOTE_USER};
38 return use_module('Plack::Middleware::Auth::Basic')->new(
39 authenticator => sub { $users->check_password(@_) }
43 $current_user = $users->get(my $name = $_[PSGI_ENV]->{REMOTE_USER});
45 401, [ 'Content-type' => 'text/plain' ], [ "No such user $name" ]
46 ] unless $current_user;
50 $self->_render_front_page($current_user);
53 my $list = $current_user->get_list($_[1]);
57 $self->_list_dispatchers($list, \$error),
58 sub () { $self->_render_list_page($list, $error) };
60 sub (/deny/|/allow/|/mod/|/digest/) {
62 my $sublist = $list->${\$_[1]};
63 $self->_list_dispatchers($sublist, \$error),
64 sub () { $self->_render_sublist_page($sublist, $error) };
70 sub _list_dispatchers {
71 my ($self, $list, $error_ref) = @_;
74 eval { $list->add_member($_[1]); 1 }
75 or ${$error_ref} = $@;
79 eval { $list->remove_member($_[1]); 1 }
80 or ${$error_ref} = $@;
87 my ($self, $name) = @_;
88 my $my_file = __FILE__;
90 return HTML::Zoom->from_file("${my_file}/_templates/${name}.html");
94 my ($self, $name, $code) = @_;
96 200, [ 'Content-type' => 'text/html' ],
97 [ $self->_zoom_for($name)->${\sub { local $_ = $_[0]; &$code }}->to_html ]
101 sub _render_front_page {
102 my ($self, $user) = @_;
103 return $self->_render_page(index => sub {
104 $_->replace_content('.user-name',$user->username)
109 $_->select('.list-link')
110 ->replace_content($name)
112 ->set_attribute(href => "/list/${name}/");
119 sub _render_list_page {
120 shift->_render_listcore_page(
122 map [ ucfirst($_)." list", "${_}/" ], qw(allow deny mod digest)
127 sub _render_sublist_page {
128 shift->_render_listcore_page(
129 @_, [ [ "Back to list", "../" ] ],
133 sub _render_listcore_page {
134 my ($self, $list, $error, $links) = @_;
135 $self->_render_page(list => sub {
136 $_->replace_content('.list-name', $list->name)
137 ->replace_content('.error', $error||'')
138 ->repeat('.list-link', [
140 my ($name, $href) = @$_;
142 $_->select('.list-link-anchor')
143 ->replace_content($name)
145 ->set_attribute(href => $href);
149 ->repeat('.list-member', [
153 $_->replace_content('.list-member-name', $email)
154 ->set_attribute('.list-member-remove', value => $email);
161 __PACKAGE__->run_if_script;