}
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) {
#define PAKFIRE_KEY_H
#include <gpgme.h>
+#include <time.h>
#include <pakfire/types.h>
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 {
#define PAKFIRE_UTIL_H
#include <stddef.h>
+#include <time.h>
void pakfire_oom(size_t num, size_t len);
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);
#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>
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);
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;
+}
# 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;
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <pakfire/constants.h>
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;