Add mail-based account recovery
use Digest::SHA qw/hmac_sha256/;
use MIME::Base64 qw/encode_base64url decode_base64url/;
use Blerg::Database;
-use URI::Escape;
use Mail::Message;
use JSON;
use strict;
use Digest::SHA qw/hmac_sha256/;
use MIME::Base64 qw/encode_base64url/;
use Blerg::Database;
+use Mail::Message;
+use Time::HiRes qw/sleep/;
use strict;
use v5.10;
print generate_reset_url($username, $validity);
}
when ('mail') {
+ print header(-type => 'application/json');
+
+ if (!(defined $q->param('username') and defined $q->param('email'))) {
+ say '{"status": "failed"}';
+ next REQUEST;
+ }
+
+ # Sleep for a bit to scramble the timing
+ sleep(rand(1.0) + 1);
+
+ # From here on, we report success so as not to leak user information
+ my $username = $q->param('username');
+ if (!Blerg::Database::exists($username)) {
+ say '{"status": "success"}';
+ next REQUEST;
+ }
+
# check that the user has a validated mail address
- # generate reset message
- # send mail
+ my $email_conf_path = Blerg::Database::configuration->{data_path} . "/$username/email";
+ my $email;
+ if (!open EMAIL, $email_conf_path) {
+ say '{"status": "success"}';
+ next REQUEST;
+ }
+ $email = <EMAIL>;
+ close EMAIL;
+
+ if ($q->param('email') ne $email) {
+ say '{"status": "success"}';
+ next REQUEST;
+ }
+
+ my $url = generate_reset_url($username, 900);
+ Mail::Message->build(
+ From => Mail::Address->new('BlergBot', 'noreply@blerg.cc'),
+ To => $email,
+ Subject => 'Blërg Password Recovery',
+ Mail::Message::Field->new('Content-Type', 'text/plain', 'charset="utf8"'),
+ data => <<EMAIL
+Here's a 15-minute recovery link to reset your password.
+
+$url
+
+If you didn't request a password reset, please ignore this email.
+
+- Blërg!
+EMAIL
+ )->send;
+
+ say '{"status": "success"}';
}
when ('validate') {
print header(-type => 'application/json');