aboutsummaryrefslogtreecommitdiffstats
path: root/URPM.xs
diff options
context:
space:
mode:
Diffstat (limited to 'URPM.xs')
-rw-r--r--URPM.xs219
1 files changed, 30 insertions, 189 deletions
diff --git a/URPM.xs b/URPM.xs
index da0067b..c394dbc 100644
--- a/URPM.xs
+++ b/URPM.xs
@@ -128,11 +128,9 @@ typedef struct s_Package* URPM__Package;
static ssize_t write_nocheck(int fd, const void *buf, size_t count) {
return write(fd, buf, count);
}
-#ifdef RPM_ORG
static const void* unused_variable(const void *p) {
return p;
}
-#endif
static int rpmError_callback_data;
void rpmError_callback() {
@@ -142,10 +140,6 @@ void rpmError_callback() {
write_nocheck(rpmError_callback_data, rpmlogMessage(), strlen(rpmlogMessage()));
}
-/* needed for importing keys (from rpmio) */
-int rpmioSlurp(const char * fn, const byte ** bp, ssize_t * blenp);
-int b64decode (const char * s, void ** datap, size_t *lenp);
-
static int rpm_codeset_is_utf8 = 0;
static SV*
@@ -3674,193 +3668,40 @@ Urpm_verify_signature(filename)
OUTPUT:
RETVAL
+
int
-Urpm_import_pubkey(...)
- PREINIT:
- int i;
- URPM__DB db = NULL;
- char *root = "/";
- STRLEN block_len = 0;
- char *block = NULL;
- STRLEN filename_len = 0;
- char *filename = NULL;
- rpmts ts;
- const unsigned char *pkt = NULL;
- ssize_t pktlen = 0;
- const byte * b = NULL;
- ssize_t blen;
- int rc;
- CODE:
- for (i = 0; i < items-1; i+=2) {
- STRLEN len;
- char *s = SvPV(ST(i), len);
+Urpm_import_pubkey_file(db, filename)
+ URPM::DB db
+ char * filename
+ PREINIT:
+ const byte * pkt = NULL;
+ size_t pktlen = 0;
+ int rc;
+ CODE:
- if (len == 2 && !memcmp(s, "db", 2)) {
- if (sv_derived_from(ST(i+1), "URPM::DB")) {
- IV tmp = SvIV((SV*)SvRV(ST(i+1)));
- db = INT2PTR(URPM__DB, tmp);
- }
- } else if (len == 4) {
- if (!memcmp(s, "root", 4))
- root = SvPV_nolen(ST(i+1));
- } else if (len == 5) {
- if (!memcmp(s, "block", 5))
- block = SvPV(ST(i+1), block_len);
- } else if (len == 8) {
- if (!memcmp(s, "filename", 8))
- filename = SvPV(ST(i+1), filename_len);
- }
- }
- RETVAL = 1;
- /* get transaction for importing keys, open rpmdb in write mode */
- if (db) {
- ts = db->ts = rpmtsLink(db->ts, "URPM::import_pubkey");
- } else {
- /* compabilty mode to use rpmdb installed on / */
- ts = rpmtsCreate();
- read_config_files(0);
- rpmtsSetRootDir(ts, root);
- rpmtsOpenDB(ts, O_RDWR | O_CREAT);
- }
- rpmtsClean(ts);
- /* from pgpReadPkts the filename should be slurped directly in memory */
- if (filename) {
- rc = rpmioSlurp(filename, &b, &blen);
- } else if (block) {
- blen = block_len;
- b = memcpy(malloc(blen+1), block, blen+1); /* XXX should use xmalloc instead */
- rc = 0;
- } else {
- rc = 0;
- }
- if (rc || b == NULL || blen <= 0) {
- /* error reading file, or no file or block */
- RETVAL = 0;
- } else {
- /* from pgpReadPkts the remaining of method */
- const char * enc = NULL;
- const char * crcenc = NULL;
- byte * dec;
- byte * crcdec;
- size_t declen;
- size_t crclen;
- u_int32_t crcpkt, crc;
- const char * armortype = NULL;
- char * t, * te;
- int pstate = 0;
- int _rc;
-
- rc = PGPARMOR_ERROR; /* XXX assume failure */
-
- if (pgpIsPkt(b)) {
-#ifdef NOTYET /* XXX ASCII Pubkeys only, please. */
- rc = 0; /* XXX fish out pkt type. */
-#endif
- goto exit;
- }
-#define TOKEQ(_s, _tok) (!strncmp((_s), (_tok), sizeof(_tok)-1))
- for (t = (char *)b; t && *t; t = te) {
- if ((te = strchr(t, '\n')) == NULL)
- te = t + strlen(t);
- else
- te++;
-
- switch (pstate) {
- case 0:
- armortype = NULL;
- if (!TOKEQ(t, "-----BEGIN PGP "))
- continue;
- t += sizeof("-----BEGIN PGP ")-1;
-
- _rc = pgpValTok(pgpArmorTbl, t, te);
- if (_rc < 0)
- goto exit;
- if (_rc != PGPARMOR_PUBKEY) /* XXX ASCII Pubkeys only, please. */
- continue;
- armortype = t;
-
- t = te - (sizeof("-----\n")-1);
- if (!TOKEQ(t, "-----\n"))
- continue;
- *t = '\0';
- pstate++;
- /*@switchbreak@*/ break;
- case 1:
- enc = NULL;
- _rc = pgpValTok(pgpArmorKeyTbl, t, te);
- if (_rc >= 0)
- continue;
- if (*t != '\n') {
- pstate = 0;
- continue;
- }
- enc = te; /* Start of encoded packets */
- pstate++;
- /*@switchbreak@*/ break;
- case 2:
- crcenc = NULL;
- if (*t != '=')
- continue;
- *t++ = '\0'; /* Terminate encoded packets */
- crcenc = t; /* Start of encoded crc */
- pstate++;
- /*@switchbreak@*/ break;
- case 3:
- pstate = 0;
- if (!TOKEQ(t, "-----END PGP "))
- goto exit;
- *t = '\0'; /* Terminate encoded crc */
- t += sizeof("-----END PGP ")-1;
-
- if (armortype == NULL) /* XXX can't happen */
- continue;
- _rc = strncmp(t, armortype, strlen(armortype));
- if (_rc)
- continue;
-
- t = te - (sizeof("-----\n")-1);
- if (!TOKEQ(t, "-----\n"))
- goto exit;
-
- if (b64decode(crcenc, (void **)&crcdec, &crclen) != 0)
- continue;
- crcpkt = pgpGrab(crcdec, crclen);
- crcdec = _free(crcdec);
- if (b64decode(enc, (void **)&dec, &declen) != 0)
- goto exit;
- crc = pgpCRC(dec, declen);
- if (crcpkt != crc)
- goto exit;
- b = _free(b);
- b = dec;
- blen = declen;
- rc = PGPARMOR_PUBKEY; /* XXX ASCII Pubkeys only, please. */
- goto exit;
- /*@notreached@*/ /*@switchbreak@*/ break;
- }
+ rpmts ts = rpmtsLink(db->ts, "URPM::import_pubkey_file");
+ rpmtsClean(ts);
+
+ if ((rc = pgpReadPkts(filename, &pkt, &pktlen)) <= 0) {
+ RETVAL = 0;
+ } else if (rc != PGPARMOR_PUBKEY) {
+ RETVAL = 0;
+ } else if (rpmcliImportPubkey(ts, pkt, pktlen) != RPMRC_OK) {
+ RETVAL = 0;
+ } else {
+ RETVAL = 1;
}
- rc = PGPARMOR_NONE;
+ _free(pkt);
+ rpmtsFree(ts);
+ OUTPUT:
+ RETVAL
- exit:
- if (rc > PGPARMOR_NONE)
- pkt = b;
- else if (b != NULL)
- b = _free(b);
- pktlen = blen;
- }
- if (rc < 0) {
- /* import read failed */
- RETVAL = 0;
- } else if (rc != PGPARMOR_PUBKEY) {
- /* not armored public key */
- RETVAL = 0;
- } else if ((rc = rpmcliImportPubkey(ts, pkt, pktlen)) != 0) {
- /* import failed */
- RETVAL = 0;
- }
- rpmtsClean(ts);
- _free(pkt);
- rpmtsFree(ts);
+int
+Urpm_import_pubkey(...)
+ CODE:
+ unused_variable(&items);
+ croak("import_pubkey() is dead. use import_pubkey_file() instead");
+ RETVAL = 1;
OUTPUT:
RETVAL