aboutsummaryrefslogtreecommitdiffstats
path: root/URPM/Signature.pm
diff options
context:
space:
mode:
Diffstat (limited to 'URPM/Signature.pm')
-rw-r--r--URPM/Signature.pm33
1 files changed, 26 insertions, 7 deletions
diff --git a/URPM/Signature.pm b/URPM/Signature.pm
index e2089e6..b3ca91b 100644
--- a/URPM/Signature.pm
+++ b/URPM/Signature.pm
@@ -2,6 +2,29 @@ package URPM;
use strict;
+#- compare keys to avoid glitches introduced during the importation where
+#- some characters may be modified on the fly by rpm --import...
+sub compare_pubkeys {
+ my ($a, $b, %options) = @_;
+ my $diff = 0;
+ my @a = unpack "C*", $a->{content};
+ my @b = unpack "C*", $b->{content};
+
+ #- default options to use.
+ $options{start} ||= 0;
+ $options{end} ||= @a < @b ? scalar(@b) : scalar(@a);
+ $options{diff} ||= 1;
+
+ #- check element one by one, count all difference (do not work well if elements
+ #- have been inserted/deleted).
+ foreach ($options{start} .. $options{end}) {
+ $a[$_] != $b[$_] and ++$diff;
+ }
+
+ #- diff options give level to consider the key equal (a character is not always the same).
+ $diff <= $options{diff} ? 0 : $diff;
+}
+
#- pare from rpmlib db.
sub parse_pubkeys {
my ($urpm, %options) = @_;
@@ -49,7 +72,7 @@ sub parse_armored_file {
my $inside_block = /^$/ ... /^-----END PGP PUBLIC KEY BLOCK-----$/;
if ($inside_block > 1) {
if ($inside_block =~ /E/) {
- push @l, $content;
+ push @l, +{ content => $content };
$block = undef;
$content = '';
} else {
@@ -60,22 +83,18 @@ sub parse_armored_file {
}
close F or die "unable to parse armored file $file";
- #- check at least one key has been found.
- @l < 1 and die "no key found while parsing armored file";
-
#- check if key has been found, remove from list.
if ($options{only_unknown_keys}) {
@l = grep {
my $found = 0;
foreach my $k (values %{$urpm->{keys} || {}}) {
- $k->{content} eq $_ and $found = 1, last;
+ compare_pubkeys($k, $_) == 0 and $found = 1, last;
}
!$found;
} @l;
}
- #- now return something (true) which reflect what should be found in keys.
- map { +{ content => $_ } } @l;
+ @l;
}
sub import_armored_file {