Typo fixes and new gpgme_get_op_info
authorWerner Koch <wk@gnupg.org>
Tue, 28 Aug 2001 11:11:10 +0000 (11:11 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 28 Aug 2001 11:11:10 +0000 (11:11 +0000)
13 files changed:
trunk/AUTHORS
trunk/NEWS
trunk/TODO
trunk/complus/README
trunk/complus/vbtest.vbs
trunk/gpgme/ChangeLog
trunk/gpgme/context.h
trunk/gpgme/gpgme.c
trunk/gpgme/gpgme.h
trunk/gpgme/key.c
trunk/gpgme/ops.h
trunk/gpgme/sign.c
trunk/tests/t-sign.c

index 8a87e949493b179ceac6ea9ed977c7e236ab560e..5cc9c295752779b755ea53c354b67a3ce27cbd62 100644 (file)
@@ -1,5 +1,5 @@
 Program: gpgme
-Maintainer: <gpgme@g10code.com>
+Maintainer: wk@g10gnupg.org
 
 
 FSF <gnu@gnu.org>
index c5bb19a2092e15337cbe5d9b879a0cfa5cf66387..6d21d0e70e481aedc7090a8f1ddb524571dfddd0 100644 (file)
@@ -1,3 +1,7 @@
+
+ * New function gpgme_get_op_info which can be used to get the micalg
+   parameter needed for MOSS.
+
 Noteworthy changes in version 0.2.2 (2001-06-12)
 ------------------------------------------------
  
index 7724065b454c5936399e475f6ff6ce3a02c521b8..c24446fd89533bba1f1abea71f311a7dd436adc9 100644 (file)
@@ -11,5 +11,4 @@
   another flag or a callback?
 
 * There is no status response if we have no usable recipients - must
-  add one to gpg so that gpgme_encrypt does return with an error.
-
+  add one to gpg so that gpgme_encrypt does return with an error.
\ No newline at end of file
index 30fc30d9b2d0ccf1dddcb5022cf7697fa8124538..7dc3bb1d03fe704154ae151ac73708b65029181e 100644 (file)
@@ -63,7 +63,7 @@ Using Gpgcom
 Gpgcom currently support only encryption but will be extended to the
 full range of operations GnuPG provides. The 2 examples should goive
 yopu a hint on how to use it.  We suggest that you always set armor to
-true, so that the returned text is a string.  IF you don't use armor,
+true, so that the returned text is a string.  If you don't use armor,
 the "ciphertext" property will return an array with the binary
 message.
 
index 7ea346da41f8559c577c83ce4384f0b7acf4d8dd..8246b45635b07ac0de582f517855bb36c122180d 100644 (file)
@@ -13,7 +13,7 @@ gpg.textmode = true
 gpg.plaintext = "This is the secret message."  'or: InputBox('Enter message:")
 
 ' Set the Recipient.  You may also use a keyID or an fingerprint
-gpg.addrecipient "alice"
+gpg.AddRecipient "alice"
 
 ' And encrypt the stuff
 gpg.encrypt
index 8ca3caa014b1428143a78947bc57c8c8a4555db5..5dc5dfe4905bacd64ab65e2146559931fb769c28 100644 (file)
@@ -1,10 +1,18 @@
+2001-08-28  Werner Koch  <wk@gnupg.org>
+
+       * gpgme.c, gpgme.h (gpgme_get_op_info): New.
+       (_gpgme_set_op_info): New. 
+       (_gpgme_release_result): Reset the op_info here.
+       * sign.c (append_xml_siginfo): New.
+       (sign_status_handler): Store the sig create information.
+
 2001-07-31  Werner Koch  <wk@gnupg.org>
 
        * encrypt.c (gpgme_op_encrypt): Hack to detect no valid recipients.
 
 2001-07-30  Werner Koch  <wk@gnupg.org>
 
-       * gpgme.c (gpgme_get_armor,gpgme_get_texmode): New.
+       * gpgme.c (gpgme_get_armor,gpgme_get_textmode): New.
 
        * rungpg.c (build_argv): Disable armor comments
        * w32-io.c (build_commandline): Need to add quotes here
index a1992697ea333a0226e2364f8aaeeb36c0107409..662889f90b515f8985bcb3be6aebeb88ac68c098 100644 (file)
@@ -75,6 +75,7 @@ struct gpgme_context_s {
     } result;
 
     GpgmeData notation;    /* last signature notation */
+    GpgmeData op_info;     /* last operation info */
 
     GpgmeKey tmp_key;       /* used by keylist.c */
     volatile int key_cond;  /* something new is available */
index b473feb60356f35478176aa747521ff1ad8f8b73..1140c4c8bf06c74e218aa4e72e5be150b46b029b 100644 (file)
@@ -99,6 +99,7 @@ _gpgme_release_result ( GpgmeCtx c )
 
     c->result.verify = NULL;
     c->result_type = RESULT_TYPE_NONE;
+    _gpgme_set_op_info (c, NULL);
 }
 
 
@@ -137,6 +138,57 @@ gpgme_get_notation ( GpgmeCtx c )
     return _gpgme_data_get_as_string ( c->notation );
 }
 
+
+/**
+ * gpgme_get_op_info:
+ * @c: the context 
+ * @reserved: 
+ * 
+ * Return information about the last information.  The caller has to
+ * free the string.  NULL is returned if there is not previous
+ * operation available or the operation has not yet finished.
+ *
+ * Here is a sample information we return:
+<GnupgOperationInfo>
+  <signature>
+    <detached/> <!-- or cleartext or standard -->
+    <algo>17</algo>
+    <hashalgo>2</hashalgo>
+    <micalg>pgp-sha1</micalg>
+    <sigclass>01</sigclass>
+    <created>9222222</created>
+    <fpr>121212121212121212</fpr>
+  </signature>
+</GnupgOperationInfo>
+ * 
+ * Return value: NULL for no info available or an XML string 
+ **/
+char *
+gpgme_get_op_info ( GpgmeCtx c, int reserved )
+{
+    if (!c || reserved)
+        return NULL; /*invalid value */
+    return _gpgme_data_get_as_string (c->op_info);
+}
+
+/*
+ * Store the data object with the operation info in the
+ * context. Caller should not use that object anymore.  
+ */
+void
+_gpgme_set_op_info (GpgmeCtx c, GpgmeData info)
+{
+    assert (c);
+
+    gpgme_data_release (c->op_info); 
+    c->op_info = NULL;
+
+    if (info)
+        c->op_info = info;
+}
+
+
 /**
  * gpgme_set_armor:
  * @c: the contect 
index d4082d2f1018d27424e771e2e43f3013c6f79e13..7d5fde9ed952313d83b28833a42f98ff970e317c 100644 (file)
@@ -183,8 +183,7 @@ GpgmeKey   gpgme_signers_enum (const GpgmeCtx c, int seq);
 const char *gpgme_get_sig_status (GpgmeCtx c, int idx,
                                   GpgmeSigStat *r_stat, time_t *r_created );
 GpgmeError gpgme_get_sig_key (GpgmeCtx c, int idx, GpgmeKey *r_key);
-
-
+char *gpgme_get_op_info (GpgmeCtx c, int reserved);
 
 
 /* Functions to handle recipients */
index 966675e3ad42cf7d5c16626a9bdf0b8641e77a40..a4649df37793d81f3a92a655b44ba4ceb36788a7 100644 (file)
@@ -116,8 +116,8 @@ void
 _gpgme_key_cache_add (GpgmeKey key)
 {
     struct subkey_s *k;
-#warning debug code
-    if (!key || getenv("gpgme_no_cache") )
+
+    if (!key)
         return;
 
     /* FIXME: add locking */
@@ -609,7 +609,7 @@ gpgme_key_get_as_xml ( GpgmeKey key )
     /*add_tag_and_time (d, "expires", key->expires );*/
     _gpgme_data_append_string (d, "  </mainkey>\n");
 
-    /* Now the user IDs.  We are listing the last one firs becuase this is
+    /* Now the user IDs.  We are listing the last one first because this is
      * the primary one. */
     for (u = key->uids; u && u->next; u = u->next )
         ;
index 668a18d2579445a10479f7897645cebb702b3c48..20a551bbcf6318678566f2aaf3625bccd2b9b9ed 100644 (file)
@@ -26,6 +26,7 @@
 
 /*-- gpgme.c --*/
 void _gpgme_release_result ( GpgmeCtx c );
+void _gpgme_set_op_info (GpgmeCtx c, GpgmeData info);
 
 /*-- wait.c --*/
 GpgmeCtx _gpgme_wait_on_condition ( GpgmeCtx c,
index f71e0d6466d902431fa8edd0ed837cd5843b775a..b92ea806520f7d1b8b57a0ba1086e9b2b7be6b47 100644 (file)
 #include "context.h"
 #include "ops.h"
 
+#define SKIP_TOKEN_OR_RETURN(a) do { \
+    while (*(a) && *(a) != ' ') (a)++; \
+    while (*(a) == ' ') (a)++; \
+    if (!*(a)) \
+        return; /* oops */ \
+} while (0)
+
+
+
 
 struct  sign_result_s {
     int no_passphrase;
@@ -37,18 +46,99 @@ struct  sign_result_s {
     char *userid_hint;
     char *passphrase_info;
     int bad_passphrase;
+    GpgmeData xmlinfo;
 };
 
 
 void
 _gpgme_release_sign_result ( SignResult res )
 {
+    gpgme_data_release (res->xmlinfo);
     xfree (res->userid_hint);
     xfree (res->passphrase_info);
     xfree (res);
 }
 
 
+/* parse the args and save the information 
+ * <type> <pubkey algo> <hash algo> <class> <timestamp> <key fpr>
+ * in an XML structure.  With args of NULL the xml structure is closed.
+ */
+static void
+append_xml_siginfo (GpgmeData *rdh, char *args)
+{
+    GpgmeData dh;
+    char helpbuf[100];
+    int i;
+    char *s;
+    unsigned long ul;
+
+    if ( !*rdh ) {
+        if (gpgme_data_new (rdh)) {
+            return; /* fixme: We are ignoring out-of-core */
+        }
+        dh = *rdh;
+        _gpgme_data_append_string (dh, "<GnupgOperationInfo>\n");
+    }
+    else {
+        dh = *rdh;
+        _gpgme_data_append_string (dh, "  </signature>\n");
+    }
+
+    if (!args) { /* just close the XML containter */
+        _gpgme_data_append_string (dh, "</GnupgOperationInfo>\n");
+        return;
+    }
+
+    _gpgme_data_append_string (dh, "  <signature>\n");
+    
+    _gpgme_data_append_string (dh,
+                               *args == 'D'? "    <detached/>\n":
+                               *args == 'C'? "    <cleartext/>\n":
+                               *args == 'S'? "    <standard/>\n":"");
+    SKIP_TOKEN_OR_RETURN (args);
+
+    sprintf (helpbuf, "    <algo>%d</algo>\n", atoi (args));
+    _gpgme_data_append_string (dh, helpbuf);
+    SKIP_TOKEN_OR_RETURN (args);
+
+    i = atoi (args);
+    sprintf (helpbuf, "    <hashalgo>%d</hashalgo>\n", atoi (args));
+    _gpgme_data_append_string (dh, helpbuf);
+    switch (i) {
+      case  1: s = "pgp-md5"; break;
+      case  2: s = "pgp-sha1"; break;
+      case  3: s = "pgp-ripemd160"; break;
+      case  5: s = "pgp-md2"; break;
+      case  6: s = "pgp-tiger192"; break;
+      case  7: s = "pgp-haval-5-160"; break;
+      case  8: s = "pgp-sha256"; break;
+      case  9: s = "pgp-sha384"; break;
+      case 10: s = "pgp-sha512"; break;
+      default: s = "pgp-unknown"; break;
+    }
+    sprintf (helpbuf, "    <micalg>%s</micalg>\n", s);
+    _gpgme_data_append_string (dh,helpbuf);
+    SKIP_TOKEN_OR_RETURN (args);
+    
+    sprintf (helpbuf, "    <sigclass>%.2s</sigclass>\n", args);
+    _gpgme_data_append_string (dh, helpbuf);
+    SKIP_TOKEN_OR_RETURN (args);
+
+    ul = strtoul (args, NULL, 10);
+    sprintf (helpbuf, "    <created>%lu</created>\n", ul);
+    _gpgme_data_append_string (dh, helpbuf);
+    SKIP_TOKEN_OR_RETURN (args);
+
+    /* count the length of the finperprint */
+    for (i=0; args[i] && args[i] != ' '; i++)
+        ;
+    _gpgme_data_append_string (dh, "    <fpr>");
+    _gpgme_data_append (dh, args, i);
+    _gpgme_data_append_string (dh, "</fpr>\n");
+}
+
+
 
 static void
 sign_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
@@ -68,6 +158,11 @@ sign_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
 
     switch (code) {
       case STATUS_EOF:
+        if (ctx->result.sign->okay) {
+            append_xml_siginfo (&ctx->result.sign->xmlinfo, NULL);
+            _gpgme_set_op_info (ctx, ctx->result.sign->xmlinfo);
+            ctx->result.sign->xmlinfo = NULL;
+        }
         break;
 
       case STATUS_USERID_HINT:
@@ -98,10 +193,8 @@ sign_status_handler ( GpgmeCtx ctx, GpgStatusCode code, char *args )
 
       case STATUS_SIG_CREATED: 
         /* fixme: we have no error return for multiple signatures */
+        append_xml_siginfo (&ctx->result.sign->xmlinfo, args);
         ctx->result.sign->okay =1;
-        /* parse the line and save the information 
-         * <type> <pubkey algo> <hash algo> <class> <timestamp> <key fpr>
-         */
         break;
 
       default:
@@ -242,7 +335,7 @@ gpgme_op_sign_start ( GpgmeCtx c, GpgmeData in, GpgmeData out,
     }
     _gpgme_data_set_mode (out, GPGME_DATA_MODE_IN );
 
-    /* Tell the gpg object about the data */
+    /* tell the gpg object about the data */
     _gpgme_gpg_add_data ( c->gpg, in, 0 );
     _gpgme_gpg_add_data ( c->gpg, out, 1 );
 
@@ -295,6 +388,7 @@ gpgme_op_sign ( GpgmeCtx c, GpgmeData in, GpgmeData out, GpgmeSigMode mode )
                 err = mk_error (No_Passphrase);
             else if (!c->result.sign->okay)
                 err = mk_error (No_Data); /* Hmmm: choose a better error? */
+            
         }
         c->pending = 0;
     }
index f57a1eaabc01f168655833cfbe95c7676174cf90..65822c9dba3ce9c5849bcdb2ec8e527970df8654 100644 (file)
                                 exit (1); }                               \
                              } while(0)
 
+static void
+print_op_info (GpgmeCtx c)
+{
+    char *s = gpgme_get_op_info (c, 0);
+
+    if (!s)
+        puts ("<!-- no operation info available -->");
+    else {
+        puts (s);
+        free (s);
+    }
+}
+
 static void
 print_data ( GpgmeData dh )
 {
@@ -95,6 +108,7 @@ main (int argc, char **argv )
     fail_if_err (err);
     fflush (NULL);
     fputs ("Begin Result:\n", stdout );
+    print_op_info (ctx);
     print_data (out);
     fputs ("End Result.\n", stdout );
     gpgme_data_release (out);
@@ -106,6 +120,7 @@ main (int argc, char **argv )
     err = gpgme_op_sign (ctx, in, out, GPGME_SIG_MODE_DETACH );
     fail_if_err (err);
     fflush (NULL);
+    print_op_info (ctx);
     fputs ("Begin Result:\n", stdout );
     print_data (out);
     fputs ("End Result.\n", stdout );
@@ -119,6 +134,7 @@ main (int argc, char **argv )
     err = gpgme_op_sign (ctx, in, out, GPGME_SIG_MODE_CLEAR );
     fail_if_err (err);
     fflush (NULL);
+    print_op_info (ctx);
     fputs ("Begin Result:\n", stdout );
     print_data (out);
     fputs ("End Result.\n", stdout );