Allow having no captcha, add registration test
[scpubgit/stemmaweb.git] / lib / stemmaweb / Controller / Users.pm
CommitLineData
19262e3d 1package stemmaweb::Controller::Users;
2use Moose;
3use namespace::autoclean;
4
85990daf 5use Google::JWT;
6
7use JSON::MaybeXS;
8use JSON::WebToken;
9
10use MIME::Base64;
11
19262e3d 12BEGIN {extends 'CatalystX::Controller::Auth'; }
b74843e5 13with 'Catalyst::TraitFor::Controller::reCAPTCHA';
19262e3d 14
15=head1 NAME
16
17stemmaweb::Controller::Users - Catalyst Controller
18
19=head1 DESCRIPTION
20
b74843e5 21The Users controller is based on L<CatalystX::Controller::Auth>, see
22there for most of the functionality. Any localised parts are described
23below.
24
25This controller uses L<Catalyst::TraitFor::Controller::reCAPTCHA> to
26create and check a reCaptcha form shown on the C<register> form to
27help prevent spam signups.
19262e3d 28
29=head1 METHODS
30
31=cut
32
33sub base :Chained('/') :PathPart('') :CaptureArgs(0)
34{
35 my ( $self, $c ) = @_;
1628e97a 36
19262e3d 37 $self->next::method( $c );
38}
39
40=head2 index
41
b74843e5 42The index action is not currently used.
43
19262e3d 44=cut
45
46sub index :Path :Args(0) {
47 my ( $self, $c ) = @_;
48
49 $c->response->body('Matched stemmaweb::Controller::Users in Users.');
50}
51
b74843e5 52=head2 login with openid
53
54Logging in with openid/google requires two passes through the login
55action, on the 2nd pass the C<openid-check> value is passed in when
56the openid providing webserver links the user back to the stemmaweb
eb38afbc 57site. This adaptation to the C<login> action sets the realm we are
b74843e5 58authenticating against to be C<openid> in this case.
59
60=cut
61
b600c671 62before login => sub {
63 my($self, $c) = @_;
64 $c->req->param( realm => 'openid')
65 if $c->req->param('openid-check');
83ed6665 66
67 if ($c->req->params->{email} && $c->req->params->{id_token}) {
68 $c->req->param( realm => 'google');
69 }
740a6e04 70
71 $c->stash->{google_client_id} = $c->config->{'Authentication::Credential::Google'}->{client_id};
b600c671 72};
19262e3d 73
b74843e5 74=head2 register with recaptcha
75
76This adapts the C<register> action to add the recaptcha HTML to the
77page, and verify the recaptcha info entered is correct when the form
78is submitted. If the recaptcha is not correct, we just redisplay the
79form with an error message.
80
81=cut
82
83before register => sub {
84 my ($self, $c) = @_;
85
32d1fbf8 86 warn $c->config->{'Registration'}->{'no_recaptcha'};
87
b74843e5 88 ## Puts HTML into stash in "recaptcha" key.
32d1fbf8 89 if (!$c->config->{'Registration'}->{'no_recaptcha'}) {
90 $c->forward('captcha_get');
91 }
b74843e5 92
93 ## When submitting, check recaptcha passes, else re-draw form
94 if($c->req->method eq 'POST') {
32d1fbf8 95 if ( !$c->config->{'Registration'}->{'no_recaptcha'} && !$c->forward('captcha_check') ) {
b74843e5 96 ## Need these two lines to detach, so end can draw the correct template again:
97 my $form = $self->form_handler->new( active => [ $self->login_id_field, 'password', 'confirm_password' ] );
98 $c->stash( template => $self->register_template, form => $form );
99
100 $c->detach();
101 }
102 }
103};
104
eb38afbc 105=head2 success
106
107A stub page returned on login / registration success.
108
109=cut
110
111sub success :Local :Args(0) {
112 my ( $self, $c ) = @_;
113
114 $c->load_status_msgs;
115 $c->stash->{template} = 'auth/success.tt';
116}
117
118=head2 post_logout
119
120Return to the index page, not to the login page.
121
122=cut
123
124sub post_logout {
125 my( $self, $c ) = @_;
126 $c->response->redirect( $c->uri_for_action( '/index' ) );
127 $c->detach;
128}
129
19262e3d 130=head1 AUTHOR
131
132A clever guy
133
134=head1 LICENSE
135
136This library is free software. You can redistribute it and/or modify
137it under the same terms as Perl itself.
138
139=cut
140
141__PACKAGE__->meta->make_immutable;
142
1431;