Advertisement
Guest User

Untitled

a guest
Aug 28th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.03 KB | None | 0 0
  1. use Mojolicious::Lite;
  2.  
  3. use DBM::Deep;
  4. use Mojo::JWT;
  5.  
  6. plugin 'Bcrypt';
  7. plugin 'Minion' => {File => 'minion.db'};
  8.  
  9. app->minion->add_task(send_email => sub {
  10. my ($job, $address, $subject, $body) = @_;
  11.  
  12. require Email::Sender::Simple;
  13. require Email::Simple;
  14. require Email::Sender::Transport::Print;
  15.  
  16. my $email = Email::Simple->create(
  17. header => [
  18. To => $address,
  19. From => 'me@nobody.com',
  20. Subject => $subject,
  21. ],
  22. body => $body,
  23. );
  24. my $transport = Email::Sender::Transport::Print->new;
  25. Email::Sender::Simple->send($email, {transport => $transport});
  26. });
  27.  
  28. helper email => sub { shift->minion->enqueue(send_email => [@_]) };
  29.  
  30. helper jwt => sub { Mojo::JWT->new(secret => shift->app->secrets->[0] || die) };
  31.  
  32. helper to_index => sub {
  33. my ($c, $msg) = @_;
  34. $c->flash(message => $msg) if $msg;
  35. $c->redirect_to('index');
  36. };
  37.  
  38. helper users => sub { DBM::Deep->new('users.db') };
  39.  
  40. any '/' => sub {
  41. my $c = shift;
  42. $c->render('logged_in') if $c->session('username');
  43. } => 'index';
  44.  
  45. any '/logout' => sub { shift->session(expires => 1)->to_index };
  46.  
  47. post '/sign_in' => sub {
  48. my $c = shift;
  49. my $username = $c->param('username');
  50. return $c->to_index("Username $username not found")
  51. unless my $user = $c->users->{$username};
  52.  
  53. return $c->to_index("Username $username has not been confirmed")
  54. unless $user->{confirmed};
  55.  
  56. return $c->to_index('Password not correct')
  57. unless $c->bcrypt_validate($c->param('password') || '', $user->{password});
  58.  
  59. $c->session(username => $username)->to_index;
  60. };
  61.  
  62. post '/sign_up' => sub {
  63. my $c = shift;
  64.  
  65. my $username = $c->param('username');
  66. return $c->to_index("Username $username is taken")
  67. if $c->users->{$username};
  68.  
  69. return $c->to_index('Password cannot be blank')
  70. unless my $password = $c->param('password');
  71.  
  72. return $c->to_index('Email cannot be blank')
  73. unless my $email = $c->param('email');
  74.  
  75. $c->users->{$username} = {
  76. email => $email,
  77. password => $c->bcrypt($password),
  78. confirmed => 0,
  79. };
  80. my $jwt = $c->jwt->claims({username => $username})->encode;
  81. my $url = $c->url_for('confirm')->to_abs->query(jwt => $jwt);
  82. $c->email($email, 'Confirm registration', "Please visit $url to confirm");
  83. $c->to_index('registration complete, please confirm via email');
  84. };
  85.  
  86. get '/confirm' => sub {
  87. my $c = shift;
  88. my $username = $c->jwt->decode($c->param('jwt'))->{username};
  89. $c->users->{$username}{confirmed} = 1;
  90. $c->to_index('registration confirmed, please log in');
  91. };
  92.  
  93. app->start;
  94.  
  95. __DATA__
  96.  
  97. @@ index.html.ep
  98.  
  99. <p>Hello Guest!</p>
  100. <p><%= flash('message') || 'Sign in or sign up!' %></p>
  101.  
  102. %= form_for sign_in => begin
  103. %= label_for username => 'Username'
  104. %= text_field 'username'
  105.  
  106. %= label_for password => 'Password'
  107. %= password_field 'password'
  108.  
  109. %= label_for email => 'Email'
  110. %= email_field 'email', placeholder => 'sign up only'
  111.  
  112. <br>
  113. %= submit_button 'Sign In'
  114. %= submit_button 'Sign Up', formaction => url_for('sign_up')
  115. % end
  116.  
  117. @@ logged_in.html.ep
  118.  
  119. <p>Welcome back <%= session 'username' %>!</p>
  120. <p><%= link_to 'Log out' => 'logout' %>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement