OSDN Git Service

Eventd::Hander::User: add change_email handler
authorhylom <hylom@users.sourceforge.jp>
Wed, 7 Nov 2018 12:15:55 +0000 (21:15 +0900)
committerhylom <hylom@users.sourceforge.jp>
Wed, 7 Nov 2018 12:15:55 +0000 (21:15 +0900)
src/newslash_web/lib/Newslash/Eventd/Handler/User.pm

index 32871d4..e7830ed 100644 (file)
@@ -1,31 +1,14 @@
 package Newslash::Eventd::Handler::User;
 use Mojo::Base 'Newslash::Eventd::Handler';
 use Data::Dumper;
+use Email::Valid;
 
 
-sub _reset_password {
-    my ($self, $uid) = @_;
-    my $users = $self->app->model('users');
-
-    # generate new token
-    my $token = $users->passwords->generate_random_password;
-    my $hashed_token = $users->passwords->encrypt_password($token);
-
-    my $rs = $users->update(uid => $uid,
-                            newpasswd => $hashed_token,
-                            newpasswd_ts => { function => "NOW()" });
-    if (!$rs) {
-        $self->app->log->error("Users: password reset error! uid: $uid");
-        return;
-    }
-
-    return $token;
-}
-
 sub login {
     my ($self, $item) = @_;
     $self->app->log->debug("event user/login processing... uid: $uid");
 
+    # do nothing
     $self->inactivate_event($item->{event_id}, 0);
     return;
 }
@@ -34,6 +17,7 @@ sub logout {
     my ($self, $item) = @_;
     $self->app->log->debug("event user/logout processing... uid: $uid");
 
+    # do nothing
     $self->inactivate_event($item->{event_id}, 0);
     return;
 }
@@ -52,10 +36,10 @@ sub create {
         $self->inactivate_event($item->{event_id}, -1);
         return;
     }
-    $self->app->log->debug("event user create processing... uid: $uid");
+    $self->app->log->debug("event user/create processing... uid: $uid");
 
     # generate new token
-    my $token = $self->_reset_password($uid);
+    my $token = $self->app->users->generate_password_reset_token($uid);
     if (!$token) {
         $self->app->log->error("event user/create failed: password reset failed, uid: $uid");
         $self->inactivate_event($item->{event_id}, -1);
@@ -93,13 +77,13 @@ sub update_password {
         $self->inactivate_event($item->{event_id}, -1);
         return;
     }
-    $self->app->log->debug("event user updatepw processing... uid: $uid");
+    $self->app->log->debug("event user/updatepw processing... uid: $uid");
 
     # send message
     my $render_params = { nickname => $the_user->{nickname} };
-    my $rs = $self->app->sendmail(to => $the_user,
-                                  template => "message/password_update",
-                                  params => $render_params);
+    my $rs = $self->send_email(to => $the_user,
+                               template => "message/password_update",
+                               params => $render_params);
 
     if (!$rs) {
         # error !
@@ -112,6 +96,63 @@ sub update_password {
     return;
 }
 
+sub change_email {
+    my ($self, $item) = @_;
+    my $users = $self->app->model('users');
+    my $uid = $item->{source_user_id};
+    my $the_user = $users->select(uid => $uid);
+
+    # check the user exists
+    if (!$the_user) {
+        # error !
+        $self->app->log->error("event user/change_email faild: no uid $uid");
+        $self->inactivate_event($item->{event_id}, -1);
+        return;
+    }
+    $self->app->log->debug("event user/change_email processing... uid: $uid");
+
+    my $param = $users->param->select(uid => $uid);
+    my $email = $param->{new_email};
+
+    # check new email address
+    if (!$email || !Email::Valid->address($email)) {
+        $self->app->log->error("event user/change_email faild: invalid email, uid: $uid");
+        $self->inactivate_event($item->{event_id}, -1);
+        return;
+    }
+
+    my $token = $self->app->users->generate_email_change_token($uid, $email);
+    if (!$token) {
+        $self->app->log->error("event user/updatepw faild: token generation error, uid: $uid");
+        $self->inactivate_event($item->{event_id}, -1);
+        return;
+    }
+
+    # send notify message
+    my $render_params = { nickname => $the_user->{nickname},
+                          token => $token
+                        };
+    my $rs = $self->send_email(to => $the_user,
+                               template => "message/change_email_notify",
+                               params => $render_params);
+
+    if (!$rs) {
+        # error !
+        $self->app->log->error("event user/updatepw faild: sendmail error, uid: $uid");
+        $self->inactivate_event($item->{event_id}, -1);
+        return;
+    }
+
+    # send message to new address
+    my $rs = $self->send_email(to => $email,
+                               template => "message/change_email",
+                               params => $render_params);
+
+    # done
+    $self->inactivate_event($item->{event_id}, 0);
+    return;
+}
+
 sub reset_password {
     my ($self, $item) = @_;
 
@@ -126,10 +167,10 @@ sub reset_password {
         $self->inactivate_event($item->{event_id}, -1);
         return;
     }
-    $self->app->log->debug("event user resetpw processing... uid: $uid");
+    $self->app->log->debug("event user/resetpw processing... uid: $uid");
 
     # generate new token
-    my $token = $self->_reset_password($uid);
+    my $token = $self->app->users->generate_password_reset_token($uid);
     if (!$token) {
         $self->app->log->error("event user/resetpw failed: password reset failed, uid: $uid");
         $self->inactivate_event($item->{event_id}, -1);