]> git.ipfire.org Git - pakfire.git/commitdiff
libpakfire: Make key info dumpable and add access to key properties
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Nov 2017 11:58:28 +0000 (12:58 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 24 Nov 2017 11:58:28 +0000 (12:58 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/_pakfire/key.c
src/libpakfire/include/pakfire/key.h
src/libpakfire/include/pakfire/util.h
src/libpakfire/key.c
src/libpakfire/libpakfire.sym
src/libpakfire/util.c

index a950ffd3e337c04cce25ec7b1694351bedb745a1..165716f8754b91bbc9f31985bd73b7585dc45c89 100644 (file)
@@ -78,7 +78,12 @@ static PyObject* Key_repr(KeyObject* self) {
 }
 
 static PyObject* Key_str(KeyObject* self) {
-       return NULL;
+       char* string = pakfire_key_dump(self->key);
+
+       PyObject* object = PyUnicode_FromString(string);
+       pakfire_free(string);
+
+       return object;
 }
 
 static PyObject* Key_get_fingerprint(KeyObject* self) {
index 27073cee9a78a10073eed0d2b693b56190b9f48e..2eae40bfec2dbf232faf35e974de880c8b8c5ede 100644 (file)
@@ -22,6 +22,7 @@
 #define PAKFIRE_KEY_H
 
 #include <gpgme.h>
+#include <time.h>
 
 #include <pakfire/types.h>
 
@@ -37,11 +38,24 @@ PakfireKey pakfire_key_ref(PakfireKey key);
 void pakfire_key_unref(PakfireKey key);
 
 PakfireKey pakfire_key_get(Pakfire pakfire, const char* fingerprint);
+
+// Access key properties
 const char* pakfire_key_get_fingerprint(PakfireKey key);
+const char* pakfire_key_get_uid(PakfireKey key);
+const char* pakfire_key_get_name(PakfireKey key);
+const char* pakfire_key_get_email(PakfireKey key);
+const char* pakfire_key_get_pubkey_algo(PakfireKey key);
+size_t pakfire_key_get_pubkey_length(PakfireKey key);
+time_t pakfire_key_get_created(PakfireKey key);
+time_t pakfire_key_get_expires(PakfireKey key);
+int pakfire_key_is_revoked(PakfireKey key);
+
 PakfireKey pakfire_key_generate(Pakfire pakfire, const char* userid);
 char* pakfire_key_export(PakfireKey key, pakfire_key_export_mode_t mode);
 PakfireKey* pakfire_key_import(Pakfire pakfire, const char* data);
 
+char* pakfire_key_dump(PakfireKey key);
+
 #ifdef PAKFIRE_PRIVATE
 
 struct _PakfireKey {
index d4ba90bdc32230582ced94c66da58dcb705a6c92..ba21e11a03c8768e9e172accda03a565826c65d9 100644 (file)
@@ -22,6 +22,7 @@
 #define PAKFIRE_UTIL_H
 
 #include <stddef.h>
+#include <time.h>
 
 void pakfire_oom(size_t num, size_t len);
 
@@ -34,6 +35,7 @@ void* pakfire_free(void* mem);
 char* pakfire_strdup(const char* s);
 
 char* pakfire_format_size(double size);
+char* pakfire_format_date(time_t t);
 
 char* pakfire_path_join(const char* first, const char* second);
 
index 7c42a360c200e7700a6a9ddb18262170df5050fc..d9b3152c33cd152a9e9f8a1dd71aefadcecc543e 100644 (file)
@@ -22,7 +22,9 @@
 #include <gpgme.h>
 #include <string.h>
 
+#include <pakfire/constants.h>
 #include <pakfire/errno.h>
+#include <pakfire/i18n.h>
 #include <pakfire/key.h>
 #include <pakfire/pakfire.h>
 #include <pakfire/util.h>
@@ -164,6 +166,64 @@ const char* pakfire_key_get_fingerprint(PakfireKey key) {
        return key->gpgkey->fpr;
 }
 
+const char* pakfire_key_get_uid(PakfireKey key) {
+       return key->gpgkey->uids->uid;
+}
+
+const char* pakfire_key_get_name(PakfireKey key) {
+       return key->gpgkey->uids->name;
+}
+
+const char* pakfire_key_get_email(PakfireKey key) {
+       return key->gpgkey->uids->email;
+}
+
+const char* pakfire_key_get_pubkey_algo(PakfireKey key) {
+       switch (key->gpgkey->subkeys->pubkey_algo) {
+               case GPGME_PK_RSA:
+               case GPGME_PK_RSA_E:
+               case GPGME_PK_RSA_S:
+                       return "RSA";
+
+               case GPGME_PK_DSA:
+                       return "DSA";
+
+               case GPGME_PK_ECDSA:
+                       return "ECDSA";
+
+               case GPGME_PK_ECDH:
+                       return "ECDH";
+
+               case GPGME_PK_ECC:
+                       return "ECC";
+
+               case GPGME_PK_EDDSA:
+                       return "EDDSA";
+
+               case GPGME_PK_ELG:
+               case GPGME_PK_ELG_E:
+                       return "ELG";
+       }
+
+       return NULL;
+}
+
+size_t pakfire_key_get_pubkey_length(PakfireKey key) {
+       return key->gpgkey->subkeys->length;
+}
+
+time_t pakfire_key_get_created(PakfireKey key) {
+       return key->gpgkey->subkeys->timestamp;
+}
+
+time_t pakfire_key_get_expires(PakfireKey key) {
+       return key->gpgkey->subkeys->expires;
+}
+
+int pakfire_key_is_revoked(PakfireKey key) {
+       return key->gpgkey->subkeys->revoked;
+}
+
 PakfireKey pakfire_key_generate(Pakfire pakfire, const char* userid) {
        gpgme_ctx_t gpgctx = pakfire_get_gpgctx(pakfire);
        assert(gpgctx);
@@ -308,3 +368,32 @@ FAIL:
 
        return NULL;
 }
+
+char* pakfire_key_dump(PakfireKey key) {
+       char* s = "";
+
+       time_t created = pakfire_key_get_created(key);
+       char* date_created = pakfire_format_date(created);
+
+       asprintf(&s, "pub %s%zu/%s %s",
+               pakfire_key_get_pubkey_algo(key),
+               pakfire_key_get_pubkey_length(key),
+               pakfire_key_get_fingerprint(key),
+               date_created
+       );
+       pakfire_free(date_created);
+
+       const char* uid = pakfire_key_get_uid(key);
+       if (uid) {
+               asprintf(&s, "%s\n    %s", s, uid);
+       }
+
+       time_t expires = pakfire_key_get_expires(key);
+       if (expires) {
+                       char* date_expires = pakfire_format_date(expires);
+                       asprintf(&s, "%s\n    %s: %s", s, _("Expires"), date_expires);
+                       pakfire_free(date_expires);
+       }
+
+       return s;
+}
index bea1d07e713fea56d55c49751aee4447f64b4a2a..dbbae8a9d68933dd7b34c44d2f9f52e83147c9ba 100644 (file)
@@ -71,11 +71,18 @@ global:
 
        # key
        pakfire_key_create;
+       pakfire_key_dump;
        pakfire_key_export;
        pakfire_key_generate;
        pakfire_key_get;
+       pakfire_key_get_email;
        pakfire_key_get_fingerprint;
+       pakfire_key_get_name;
+       pakfire_key_get_pubkey_algo;
+       pakfire_key_get_pubkey_length;
+       pakfire_key_get_uid;
        pakfire_key_import;
+       pakfire_key_is_revoked;
        pakfire_key_list;
        pakfire_key_ref;
        pakfire_key_unref;
index 87490fb50634d36e100da8b292114fa9c945c6af..62411512b190c9c265356c7d02bb80b53ff28d32 100644 (file)
@@ -24,6 +24,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 
 #include <pakfire/constants.h>
 
@@ -100,6 +101,22 @@ char* pakfire_format_size(double size) {
        return pakfire_strdup(string);
 }
 
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wformat-nonliteral"
+static char* pakfire_strftime(const char* format, time_t t) {
+       char string[STRING_SIZE];
+       struct tm* tm = gmtime(&t);
+
+       strftime(string, sizeof(string), format, tm);
+
+       return pakfire_strdup(string);
+}
+#pragma GCC diagnostic pop
+
+char* pakfire_format_date(time_t t) {
+       return pakfire_strftime("%Y-%m-%d", t);
+}
+
 char* pakfire_path_join(const char* first, const char* second) {
        char* buffer;