OSDN Git Service

* Model::Users: acl2 related function() can receive srcid
authorhylom <hylom@users.sourceforge.jp>
Thu, 4 May 2017 11:44:42 +0000 (20:44 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 4 May 2017 11:44:42 +0000 (20:44 +0900)
src/newslash_web/lib/Newslash/Model/Users.pm
src/newslash_web/t/models/users.t

index 6082748..522cd1c 100644 (file)
@@ -471,21 +471,33 @@ sub _select {
 }
 
 sub _select_acl2 {
-    my ($self, $key, $uid) = @_;
-    return if ($key ne 'uid');
+    my ($self, $key, $value) = @_;
+    my $sql;
 
-    my $sql = <<"EOSQL";
+    if ($key eq 'uid') {
+        $sql = <<"EOSQL";
 SELECT * FROM al2
   WHERE srcid = ?
 EOSQL
+    }
+    elsif ($key eq 'srcid') {
+        $sql = <<"EOSQL";
+SELECT * FROM al2
+  WHERE srcid = CAST(CONV(?, 16, 10) AS UNSIGNED)
+EOSQL
+    }
+    else {
+        return;
+    }
+
     my $dbh = $self->connect_db;
     my $sth = $dbh->prepare($sql);
-    $sth->execute($uid);
+    $sth->execute($value);
     my $rs = $sth->fetchall_arrayref(+{});
     $self->disconnect_db();
 
     return if !$rs;
-    return {srcid => $uid, value => 0, values => [], updatecount => 0} if @$rs == 0;
+    return {srcid => $value, value => 0, values => [], updatecount => 0} if @$rs == 0;
 
     my @values;
 
@@ -510,19 +522,30 @@ EOSQL
 }
 
 sub _select_acl2_log {
-    my ($self, $key, $uid) = @_;
-    return if ($key ne 'uid');
+    my ($self, $key, $value) = @_;
+    my $sql;
 
-    my $sql = <<"EOSQL";
+    if ($key eq 'uid') {
+        $sql = <<"EOSQL";
 SELECT al2_log.*, al2_log_comments.comment, al2_types.title, users.nickname FROM al2_log
   JOIN al2_types USING(al2tid)
   JOIN al2_log_comments USING(al2lid)
   JOIN users ON users.uid = al2_log.adminuid
   WHERE al2_log.srcid = ?
 EOSQL
+    } elsif ($key eq 'srcid') {
+        $sql = <<"EOSQL";
+SELECT al2_log.*, al2_log_comments.comment, al2_types.title, users.nickname FROM al2_log
+  JOIN al2_types USING(al2tid)
+  JOIN al2_log_comments USING(al2lid)
+  JOIN users ON users.uid = al2_log.adminuid
+  WHERE al2_log.srcid = CAST(CONV(?, 16, 10) AS UNSIGNED)
+EOSQL
+
+    }
     my $dbh = $self->connect_db;
     my $sth = $dbh->prepare($sql);
-    $sth->execute($uid);
+    $sth->execute($value);
     my $rs = $sth->fetchall_arrayref(+{});
     $self->disconnect_db();
 
@@ -1113,13 +1136,24 @@ sub acl2_types {
     return $rs;
 }
 
-sub update_acl2 {
-    my ($self, $uid, $admin_uid, $types, $comment) = @_;
+sub _update_acl2 {
+    my ($self, $type, $srcid, $admin_uid, $types, $comment) = @_;
     my $acl2_types = $self->acl2_types;
     my $acl2_tids = [];
     my $value = 0;
 
-    my $current_acl2 = $self->select(target => "acl2", uid => $uid);
+    my $sql_srcid;
+    if ($type eq 'srcid') {
+        $sql_srcid = "CAST(CONV(?, 16, 10) AS UNSIGNED)";
+    }
+    elsif ($type eq 'uid') {
+        $sql_srcid = "?";
+    }
+    else {
+        return;
+    }
+
+    my $current_acl2 = $self->_select_acl2($type => $srcid);
     my $need_clear = {};
     if ($current_acl2) {
         for my $val (@{$current_acl2->{values}}) {
@@ -1130,9 +1164,9 @@ sub update_acl2 {
     my $dbh = $self->start_transaction;
     my $sql = <<"EOSQL";
 INSERT INTO al2_log
-    (srcid, ts,    adminuid, al2tid, val)
+    (srcid,      ts,    adminuid, al2tid, val)
   VALUES
-    (?,     NOW(), ?,        ?,      "set")
+    ($sql_srcid, NOW(), ?,        ?,      "set")
 EOSQL
     my $sth = $dbh->prepare($sql);
 
@@ -1142,7 +1176,7 @@ EOSQL
     for my $type (@$types) {
         my $type = $acl2_types->{$type};
         next if !$type;
-        $rs = $sth->execute($uid, $admin_uid, $type->{al2tid});
+        $rs = $sth->execute($srcid, $admin_uid, $type->{al2tid});
         if (!defined $rs) {
             $self->set_error($dbh->errstr, $dbh->err);
             $self->rollback;
@@ -1161,13 +1195,13 @@ EOSQL
     # clear al2_log
     $sql = <<"EOSQL";
 INSERT INTO al2_log
-    (srcid, ts,    adminuid, al2tid, val)
+    (srcid,      ts,    adminuid, al2tid, val)
   VALUES
-    (?,     NOW(), ?,        ?,      "clear")
+    ($sql_srcid, NOW(), ?,        ?,      "clear")
 EOSQL
     $sth = $dbh->prepare($sql);
     for my $tid (keys %$need_clear) {
-        $rs = $sth->execute($uid, $admin_uid, $tid);
+        $rs = $sth->execute($srcid, $admin_uid, $tid);
         if (!defined $rs) {
             $self->set_error($dbh->errstr, $dbh->err);
             $self->rollback;
@@ -1197,15 +1231,15 @@ EOSQL
     # update al2
     $sql = <<"EOSQL";
 INSERT INTO al2
-    (srcid, value, updatecount) 
+    (srcid,      value, updatecount) 
   VALUES
-    (?,     ?,     0)
+    ($sql_srcid, ?,     0)
   ON DUPLICATE KEY UPDATE 
     value = ?,
     updatecount = updatecount + 1
 EOSQL
     $sth = $dbh->prepare($sql);
-    $rs = $sth->execute($uid, $value, $value);
+    $rs = $sth->execute($srcid, $value, $value);
     if (!defined $rs) {
         $self->set_error($dbh->errstr, $dbh->err);
         $self->rollback;
@@ -1217,6 +1251,15 @@ EOSQL
     return 1;
 }
 
+
+sub update_acl2_by_srcid {
+    return shift->_update_acl2("srcid", @_);
+}
+
+sub update_acl2 {
+    return shift->_update_acl2("uid", @_);
+}
+
 sub update_message_config {
     my $self = shift;
     return if $self->check_readonly;
index 2a2083b..f93e5ec 100644 (file)
@@ -6,7 +6,7 @@ use Test::More;
 use Test::Mojo;
 use Data::Dumper;
 
-use Newslash::Util::Test qw(delete_user create_admin_user);
+use Newslash::Util::Test qw(delete_user create_admin_user srcid);
 
 my $t = Test::Mojo->new('Newslash::Web');
 my $users = $t->app->model('users');
@@ -98,6 +98,17 @@ subtest 'acl2' => sub {
     my $log = pop @$rs;
     is($log->{comment}, "testing 3", "valid comment of acl2_log");
 
+    my $user = $users->select(uid => $uid);
+    my $srcid24 = srcid("192.168.1.1", 24);
+    $rs = $users->update_acl2_by_srcid($srcid24, $admin->{uid}, [qw(spammer)], "testing 4");
+    ok($rs, "update_acl2_by_srcid");
+
+    $rs = $users->_select_acl2(srcid => $srcid24);
+    ok($rs, "select by srcid => acl2");
+    is($rs->{value}, (1 << 9), "valid value of acl2 set by srcid");
+
+    $rs = $users->update_acl2_by_srcid($srcid24, $admin->{uid}, [], "testing 5");
+    ok($rs, "update_acl2_by_srcid (2)");
 };
 
 subtest 'update users' => sub {