Add some return-type guards in CStoreEditor.pm.
authorJason Stephenson <jstephenson@mvlc.org>
Mon, 8 Aug 2011 14:24:18 +0000 (10:24 -0400)
committerJason Stephenson <jstephenson@mvlc.org>
Mon, 8 Aug 2011 14:24:18 +0000 (10:24 -0400)
Check that return types from $self->json_query are arrayrefs before
actually using the returned values in the allowed and objects_allowed
methods of CStoreEditor.pm.

This should prevent some crashes that I've seen when permission checks
fail for some unknown reason (database timeouts?) while retrieving and
paying bills.

Signed-off-by: Jason Stephenson <jstephenson@mvlc.org>
Open-ILS/src/perlmods/lib/OpenILS/Utils/CStoreEditor.pm

index 03237ca..7826d29 100644 (file)
@@ -517,15 +517,15 @@ my $OBJECT_PERM_QUERY = {
 };
 
 sub allowed {
-       my( $self, $perm, $org, $object, $hint ) = @_;
-       my $uid = $self->requestor->id;
-       $org ||= $self->requestor->ws_ou;
+    my( $self, $perm, $org, $object, $hint ) = @_;
+    my $uid = $self->requestor->id;
+    $org ||= $self->requestor->ws_ou;
 
     my $perms = (ref($perm) eq 'ARRAY') ? $perm : [$perm];
 
     for $perm (@$perms) {
-           $self->log(I, "checking perms user=$uid, org=$org, perm=$perm");
-    
+        $self->log(I, "checking perms user=$uid, org=$org, perm=$perm");
+
         if($object) {
             my $params;
             if(ref $object) {
@@ -539,12 +539,14 @@ sub allowed {
             push(@$params, $org) if $org;
             $OBJECT_PERM_QUERY->{select}->{au}->[0]->{params} = $params;
             $OBJECT_PERM_QUERY->{where}->{id} = $uid;
-            return 1 if $U->is_true($self->json_query($OBJECT_PERM_QUERY)->[0]->{has_perm});
+            my $r = $self->json_query($OBJECT_PERM_QUERY);
+            return 1 if (ref($r) eq 'ARRAY' and $U->is_true($r->[0]->{has_perm}));
 
         } else {
             $PERM_QUERY->{select}->{au}->[0]->{params} = [$perm, $org];
             $PERM_QUERY->{where}->{id} = $uid;
-            return 1 if $U->is_true($self->json_query($PERM_QUERY)->[0]->{has_perm});
+            my $r = $self->json_query($PERM_QUERY);
+            return 1 if (ref($r) eq 'ARRAY' and $U->is_true($r->[0]->{has_perm}));
         }
     }
 
@@ -577,9 +579,11 @@ sub objects_allowed {
                 '+ppl' => {code => $perm}
             }
         };
-    
+
         my $list = $self->json_query($query);
-        push(@ids, 0+$_->{object_id}) for @$list;
+        if (ref($list) eq 'ARRAY') {
+            push(@ids, 0+$_->{object_id}) for @$list;
+        }
     }
 
    my %trim;