split repo_find_pubkeys from repo_verify_sigdata
authorMichael Schroeder <mls@suse.de>
Mon, 18 Nov 2013 10:31:05 +0000 (11:31 +0100)
committerMichael Schroeder <mls@suse.de>
Mon, 18 Nov 2013 10:31:05 +0000 (11:31 +0100)
bindings/solv.i
ext/libsolvext.ver
ext/repo_pubkey.c
ext/repo_pubkey.h

index ef658f4..da032a9 100644 (file)
@@ -1629,6 +1629,19 @@ rb_eval_string(
     return sel;
   }
 
+#ifdef ENABLE_PUBKEY
+  %newobject find_pubkey;
+  XSolvable *find_pubkey(const char *keyid) {
+    Queue q;
+    Id p;
+    queue_init(&q);
+    repo_find_pubkeys($self, keyid, &q);
+    p = q.count ? q.elements[0] : 0;
+    queue_free(&q);
+    return new_XSolvable($self->pool, p);
+  }
+#endif
+
   bool __eq__(Repo *repo) {
     return $self == repo;
   }
index 8b096b8..edede2a 100644 (file)
@@ -37,6 +37,7 @@ SOLV_1.0 {
                repo_add_susetags;
                repo_add_updateinfoxml;
                repo_add_zyppdb_products;
+               repo_find_pubkeys;
                repo_verify_sigdata;
                rpm_byfp;
                rpm_byrpmdbid;
index b1a9aa0..50066cc 100644 (file)
@@ -1147,10 +1147,8 @@ solvsig_free(Solvsig *ss)
   solv_free(ss);
 }
 
-#ifdef ENABLE_PGPVRFY
-
 static int
-repo_verify_sigdata_cmp(const void *va, const void *vb, void *dp)
+repo_find_pubkeys_cmp(const void *va, const void *vb, void *dp)
 {
   Pool *pool = dp;
   Id a = *(Id *)va;
@@ -1159,33 +1157,45 @@ repo_verify_sigdata_cmp(const void *va, const void *vb, void *dp)
   return strcmp(pool_id2str(pool, pool->solvables[b].evr), pool_id2str(pool, pool->solvables[a].evr));
 }
 
+void
+repo_find_pubkeys(Repo *repo, const char *keyid, Queue *q)
+{
+  Id p;
+  Solvable *s;
+
+  queue_empty(q);
+  if (!keyid)
+    return;
+  queue_init(q);
+  FOR_REPO_SOLVABLES(repo, p, s)
+    {
+      const char *kidstr, *evr = pool_id2str(s->repo->pool, s->evr);
+
+      if (!evr || strncmp(evr, keyid + 8, 8) != 0)
+       continue;
+      kidstr = solvable_lookup_str(s, PUBKEY_KEYID);
+      if (kidstr && !strcmp(kidstr, keyid))
+        queue_push(q, p);
+    }
+  if (q->count > 1)
+    solv_sort(q->elements, q->count, sizeof(Id), repo_find_pubkeys_cmp, repo->pool);
+}
+
+#ifdef ENABLE_PGPVRFY
+
 /* warning: does not check key expiry/revokation, like gpgv or rpm */
 /* returns the Id of the pubkey that verified the signature */
 Id
 repo_verify_sigdata(Repo *repo, unsigned char *sigdata, int sigdatal, const char *keyid)
 {
   Id p;
-  Solvable *s;
   Queue q;
   int i;
 
   if (!sigdata || !keyid)
     return 0;
   queue_init(&q);
-  FOR_REPO_SOLVABLES(repo, p, s)
-    {
-      const char *evr = pool_id2str(s->repo->pool, s->evr);
-      const char *kidstr;
-
-      if (!evr || strncmp(evr, keyid + 8, 8) != 0)
-       continue;
-      kidstr = solvable_lookup_str(s, PUBKEY_KEYID);
-      if (!kidstr || strcmp(kidstr, keyid) != 0)
-        continue;
-      queue_push(&q, p);
-    }
-  if (q.count > 1)
-    solv_sort(q.elements, q.count, sizeof(Id), repo_verify_sigdata_cmp, repo->pool);
+  repo_find_pubkeys(repo, keyid, &q);
   for (i = 0; i < q.count; i++)
     {
       int pubdatal;
index e3c8fb8..cfe9def 100644 (file)
@@ -33,4 +33,5 @@ void solvsig_free(Solvsig *ss);
 Id solvsig_verify(Solvsig *ss, Repo *repo, Chksum *chk);
 
 Id repo_verify_sigdata(Repo *repo, unsigned char *sigdata, int sigdatal, const char *keyid);
+void repo_find_pubkeys(Repo *repo, const char *keyid, Queue *q);