[Pkg-privacy-commits] [msva-perl] 324/356: updated Crypt::Monkeysphere::Validator to provide a lookup() function (instead of query()): useful for looking up a specific key or fingerprint

Ximin Luo infinity0 at moszumanska.debian.org
Mon Aug 24 07:42:09 UTC 2015


This is an automated email from the git hooks/post-receive script.

infinity0 pushed a commit to branch debian
in repository msva-perl.

commit 7dac3646ed1ddc10345ed1eb0b8ce77003f96da1
Author: Daniel Kahn Gillmor <dkg at fifthhorseman.net>
Date:   Wed Apr 20 15:52:22 2011 -0400

    updated Crypt::Monkeysphere::Validator to provide a lookup() function (instead of query()): useful for looking up a specific key or fingerprint
---
 Crypt/Monkeysphere/MSVA.pm          |   4 +-
 Crypt/Monkeysphere/Validator.pm     | 144 ++++++++++++++++++++----------------
 unit-tests/20.validator/20.remote.t |   4 +-
 3 files changed, 83 insertions(+), 69 deletions(-)

diff --git a/Crypt/Monkeysphere/MSVA.pm b/Crypt/Monkeysphere/MSVA.pm
index fd3540b..6d27a2b 100755
--- a/Crypt/Monkeysphere/MSVA.pm
+++ b/Crypt/Monkeysphere/MSVA.pm
@@ -675,11 +675,11 @@
 						     gnupg=>$gnupg,
 						     logger=>$logger);
 
-    my $uid_query=$validator->query(uid=>$uid,fpr=>$fpr, key=>$key );
+    my $uid_query=$validator->lookup(uid=>$uid,fpr=>$fpr,key=>$key);
 
     # only show the marginal UI if the UID of the corresponding
     # key is not fully valid.
-    if (scalar(@{$uid_query->{valid_keys}}) > 0) {
+    if (defined($uid_query->{valid_key})) {
       $ret->{valid} = JSON::true;
       $ret->{message} = sprintf('Successfully validated "%s" through the OpenPGP Web of Trust.', $uid);
     } else {
diff --git a/Crypt/Monkeysphere/Validator.pm b/Crypt/Monkeysphere/Validator.pm
index b49c7a6..732001b 100644
--- a/Crypt/Monkeysphere/Validator.pm
+++ b/Crypt/Monkeysphere/Validator.pm
@@ -15,14 +15,41 @@ Arguments
 
      Param hash, all optional.
 
-     context => 'e-mail' | 'https' | 'ssh', etc.
-			control what counts as a suitable user IDs.
+     context => 'e-mail|https|ssh|...'
+			control what counts as suitable user IDs and key capabilities.
 
      kspolicy => 'always|never|unlessvalid'
-			when to fetch keys from keyserver.
+			when to fetch keys and key updates from keyserver.
 
   (plus arguments for Crypt::Monkeysphere::{Keyserver,Logger}::new )
 
+=head2 lookup
+
+Arguments
+
+    Param hash.
+
+    uid => (mandatory) OpenPGP User ID desired.
+
+    fpr => fingerprint of the key to compare
+
+    key => hash of pubkey parameters as Math::BigInt values
+
+one of either fpr or key must be supplied.
+
+Return Value
+
+    Returns a hashref
+
+    If the lookup succeeded, then the hashref has a key named
+    valid_key that points to a hashref { fingerprint => $fpr, val =>
+    $validity }.
+
+    If no fully-valid keys+userid were found, but some keys matched
+    with less-than-valid user IDs, then the hashref has a key named
+    subvalid_keys that points to an arrayref of { fingerprint => $fpr,
+    val => $validity } hashrefs.
+
 =cut
 
 sub new {
@@ -58,79 +85,66 @@ sub test_capable {
   return 0;
 }
 
-sub query{
+sub _tryquery {
   my $self=shift;
-  my %opts=@_;
-
-  my $uid=$opts{uid} || croak "uid argument is mandatory";
-  my $fpr=$opts{fpr};
-  my $key=$opts{key};
+  my %args=@_;
 
-  my $gpgquery = defined($fpr) ?  '0x'.$fpr : '='.$uid;
+  my $uid=$args{uid} || croak "uid argument is mandatory";
+  my $fpr=$args{fpr};
+  my $key=$args{key};
+  defined($fpr) || defined($key) || croak "Must supply either a fingerprint or a key";
 
-  my $ret= { valid_keys => [],
-	     subvalid_keys => [] };
+  my $subvalid_keys = [];
 
-  # setup variables
-  my $lastloop = 0;
-  my $foundvalid = 0;
+  my $gpgquery = defined($fpr) ? '0x'.$fpr : '='.$uid;
 
-  if ($self->{kspolicy} eq 'always') {
-    if (defined $fpr) {
-      $self->fetch_fpr($fpr);
-    } else {
-      $self->fetch_uid($uid);
-    }
-    $lastloop = 1;
-  } elsif ($self->{kspolicy} eq 'never') {
-    $lastloop = 1;
-  }
-
-  while (1) {
-    foreach my $gpgkey ($self->{gnupg}->get_public_keys($gpgquery)) {
-      my $validity = '-';
-      foreach my $tryuid ($gpgkey->user_ids) {
-	if ($tryuid->as_string eq $uid) {
-	  $validity = $tryuid->validity;
-	}
+  foreach my $gpgkey ($self->{gnupg}->get_public_keys($gpgquery)) {
+    my $validity = '-';
+    foreach my $tryuid ($gpgkey->user_ids) {
+      if ($tryuid->as_string eq $uid) {
+        $validity = $tryuid->validity;
       }
-      # treat primary keys just like subkeys:
-      foreach my $subkey ($gpgkey, @{$gpgkey->subkeys}) {
-          if ((!defined($key) && (!defined($fpr))) ||
-	      (defined($key) && $self->keycomp($key, $subkey)) ||
-              (defined($fpr) && ($subkey->fingerprint->as_hex_string eq $fpr))) {
-	    $self->log('verbose', "key 0x%s matches...\n",$subkey->hex_id);
-	    if ($self->test_capable($subkey) ) {
-	      if ($validity =~ /^[fu]$/) {
-		$foundvalid = 1;
-		$self->log('verbose', "...and is fully valid!\n");
-		push(@{$ret->{valid_keys}},
-		     { fingerprint => $subkey->fingerprint, val => $validity });
-		last;
-	      } else {
-		$self->log('verbose', "...but is not fully valid (%s).\n",$validity);
-		push(@{$ret->{subvalid_keys}},
-		     {fingerprint => $subkey->fingerprint, val => $validity }) if $lastloop;
-	      }
-	    }
-	  }
-	}
-      last if ($foundvalid);
     }
-    if ($lastloop || $foundvalid) {
-      last;
-    } else {
-      if (!$foundvalid) {
-        if (defined $fpr) {
-          $self->fetch_fpr($fpr);
-        } else {
-          $self->fetch_uid($uid);
+    # treat primary keys just like subkeys:
+    foreach my $subkey ($gpgkey, @{$gpgkey->subkeys}) {
+      if ((defined($key) && $self->keycomp($key, $subkey)) ||
+          (defined($fpr) && ($subkey->fingerprint->as_hex_string eq $fpr))) {
+        $self->log('verbose', "key 0x%s matches...\n",$subkey->hex_id);
+        if ($self->test_capable($subkey) ) {
+          if ($validity =~ /^[fu]$/) {
+            $self->log('verbose', "...and is fully valid!\n");
+            # we have a key that matches with a valid userid -- no need to look further.
+            return {valid_key => { fingerprint => $subkey->fingerprint, val => $validity }};
+          } else {
+            $self->log('verbose', "...but is not fully valid (%s).\n",$validity);
+            push(@{$subvalid_keys},
+                 {fingerprint => $subkey->fingerprint, val => $validity });
+          }
         }
       }
-      $lastloop = 1;
     }
   }
-  return $ret;
+  return { subvalid_keys => $subvalid_keys };
+}
+
+sub lookup {
+  my $self=shift;
+  my %opts=@_;
+
+  if ($self->{kspolicy} eq 'unlessvalid') {
+    my $ret = $self->_tryquery(uid => $opts{uid}, fpr => $opts{fpr}, key => $opts{key}, subvalid => 0);
+    return $ret
+      if exists($ret->{valid_key});
+  };
+
+  if ($self->{kspolicy} ne 'never') {
+    if (defined($opts{fpr})) {
+      $self->fetch_fpr($opts{fpr});
+    } else {
+      $self->fetch_uid($opts{uid});
+    }
+  }
+  return $self->_tryquery(uid => $opts{uid}, fpr => $opts{fpr}, key => $opts{key}, subvalid => 1);
 }
 
 sub keycomp {
diff --git a/unit-tests/20.validator/20.remote.t b/unit-tests/20.validator/20.remote.t
index 509399b..1f3125c 100644
--- a/unit-tests/20.validator/20.remote.t
+++ b/unit-tests/20.validator/20.remote.t
@@ -24,11 +24,11 @@ my $validator=new Crypt::Monkeysphere::Validator(gnupg=>$gnupg,
 
 isa_ok($validator,'Crypt::Monkeysphere::Validator');
 
-my $return=$validator->query(uid=>$uid);
+my $return=$validator->lookup(uid=>$uid,fpr=>'F8841978E8FA6FC65D3405155A5EA5837BD0B401');
 
 print Dumper($return) if ($ENV{MSTEST_DEBUG});
 
-ok(scalar @{$return->{valid_keys}} > 0);
+ok(defined($return->{valid_key}));
 
 
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-privacy/packages/msva-perl.git



More information about the Pkg-privacy-commits mailing list