OSDN Git Service

Model::Users: implement 'anonymous' method to get anonymous user info
authorhylom <hylom@users.sourceforge.jp>
Tue, 4 Oct 2016 11:13:26 +0000 (20:13 +0900)
committerhylom <hylom@users.sourceforge.jp>
Tue, 4 Oct 2016 11:13:26 +0000 (20:13 +0900)
src/newslash_web/lib/Newslash/Model/Users.pm
src/newslash_web/lib/Newslash/Plugin/UserAuth.pm

index 0259458..9f67bd8 100644 (file)
@@ -29,38 +29,34 @@ sub expire_token {
 }
 
 sub authentification {
-  my ($self, $nickname, $passwd) = @_;
+    my ($self, $nickname, $passwd) = @_;
 
-  my $dbh = $self->connect_db;
-  my $sql = "SELECT * FROM users WHERE nickname = ?";
-  my $sth = $dbh->prepare($sql);
+    my $dbh = $self->connect_db;
+    my $sql = "SELECT * FROM users WHERE nickname = ?";
+    my $sth = $dbh->prepare($sql);
 
-  $sth->execute($nickname);
+    $sth->execute($nickname);
 
-  my $rs = $sth->fetchall_arrayref(+{});
-
-  $sth->finish;
-  $dbh->disconnect();
+    my $rs = $sth->fetchall_arrayref(+{});
 
-  if (@$rs == 0) {
-    return undef;
-  }
+    $sth->finish;
+    $dbh->disconnect();
 
-  my $u = $rs->[0];
-  if ($self->comparePassword($passwd, $u->{passwd}, $u->{uid}, 0, 0)) {
-    my $user = {};
-    for my $item (qw(uid nickname)) {
-      $user->{$item} = $u->{$item};
+    if (@$rs == 0) {
+        return undef;
     }
 
-    my $token = $self->generate_token;
-    while($session_store->{$token}) {
-      $token = $self->generate_token;
+    my $u = $rs->[0];
+    if ($self->comparePassword($passwd, $u->{passwd}, $u->{uid}, 0, 0)) {
+        my $user = $self->_create_user_object($u);
+        my $token = $self->generate_token;
+        while($session_store->{$token}) {
+            $token = $self->generate_token;
+        }
+        $session_store->{$token} = $user;
+        return $token;
     }
-    $session_store->{$token} = $user;
-    return $token;
-  }
-  return undef;
+    return undef;
 }
 
 sub _get_by_token {
@@ -95,26 +91,59 @@ sub _get {
   return $ret;
 }
 
+sub anonymous_user {
+    my $self = shift;
+    my $u = $session_store->{anonymous};
+    if (!$u) {
+        $u = $self->select(uid => 1);
+        $session_store->{anonymous} = $self->_create_user_object($u);
+    }
+    return $u;
+}
+
+sub _create_user_object {
+    my ($self, $user) = @_;
+    my $result = {};
+    for my $k (qw{uid nickname fakeemail homepage sig seclev matchname author}) {
+        $result->{$k} = $user->{$k};
+    }
+    # if seclev is greater than 10000, the user is admin
+    # if seclev is 0, the user is Anonymous user
+    $result->{admin} = $result->{seclev} >= 10000 ? 1 : 0;
+    $result->{login} = $result->{seclev} != 0 ? 1 : 0;
+
+    return $result;
+}
+
 sub select {
-  my ($self, $key, $value) = @_;
+    my ($self, $key, $value) = @_;
+    my $user;
 
-  if ($key eq 'token') {
-    return $self->_get_by_token($value);
-  }
+    if ($key eq 'token') {
+        $user = $self->_get_by_token($value);
+    }
 
-  if ($key eq 'nickname') {
-    return $self->_get(nickname => $value);
-  }
+    if ($key eq 'nickname') {
+        $user = $self->_get(nickname => $value);
+    }
 
-  if ($key eq 'matchname') {
-    return $self->_get(matchname => $value);
-  }
+    if ($key eq 'uid') {
+        $user = $self->_get(uid => $value);
+    }
 
-  if ($key eq 'email') {
-    return $self->_get(realemail => $value);
-  }
+    if ($key eq 'matchname') {
+        $user = $self->_get(matchname => $value);
+    }
 
-  return undef;
+    if ($key eq 'email') {
+        $user = $self->_get(realemail => $value);
+    }
+
+    if ($user) {
+        return $self->_create_user_object($user);
+    }
+
+    return undef;
 }
 
 #========================================================================
index ed66091..23e2f3d 100644 (file)
@@ -1,6 +1,6 @@
 package Newslash::Plugin::UserAuth;
 use Mojo::Base 'Mojolicious::Plugin';
-
+use Data::Dumper;
 sub register {
     my ($self, $app, $conf) = @_;
 
@@ -12,6 +12,9 @@ sub register {
                    if ($session->{token}) {
                        $user = $c->model('users')->select(token => $session->{token});
                    }
+                   if (!$user) {
+                       $user = $c->model('users')->anonymous_user;
+                   }
 
                    $c->stash(user => $user);
                });