(parse_timestamp): Detect ISO 8601 timestamps and try
authorWerner Koch <wk@gnupg.org>
Fri, 31 Oct 2003 12:07:48 +0000 (12:07 +0000)
committerWerner Koch <wk@gnupg.org>
Fri, 31 Oct 2003 12:07:48 +0000 (12:07 +0000)
to convert them.

TODO
gpgme/ChangeLog
gpgme/keylist.c
gpgme/verify.c

diff --git a/TODO b/TODO
index 80f4b85..e5841a8 100644 (file)
--- a/TODO
+++ b/TODO
@@ -26,12 +26,13 @@ Hey Emacs, this is -*- outline -*- mode!
 
 * Thread support:
 ** When GNU Pth supports sendmsg/recvmsg, wrap them properly.
+** Without timegm (3) support our ISO time parser is not thread safe.
 
 * New features:
 ** notification system
    We need a simple notification system, probably a simple callback
    with a string and some optional arguments.  This is for example
-   required to notify an application of a changed smartcard,  The
+   required to notify an application of a changed smartcard, The
    application can then do whatever is required.  There are other
    usages too.  This notfication system should be independent of any
    contextes of course.
@@ -56,7 +57,11 @@ Hey Emacs, this is -*- outline -*- mode!
     worked around in a different way
 *** Selecting the symmetric cipher.
 *** Exchanging keys with key servers.
-
+** Allow selection of subkeys
+** Allow to return time stamps in ISO format
+  This allows us to handle years later than 2037 properly.  With the
+  time_t interface they are all mapped to 2037-12-31
+   
 * Documentation
 ** Document validity and trust issues.
 
index 3e36692..2966d6b 100644 (file)
@@ -1,3 +1,8 @@
+2003-10-31  Werner Koch  <wk@gnupg.org>
+
+       * keylist.c (parse_timestamp): Detect ISO 8601 timestamps and try
+       to convert them.
+
 2003-10-10  Marcus Brinkmann  <marcus@g10code.de>
 
        * genkey.c (get_key_parameter): Make a copy of the key parameters.
index 07c9385..9bb5e47 100644 (file)
@@ -122,7 +122,45 @@ parse_timestamp (char *timestamp)
   if (!*timestamp)
     return 0;
 
-  return (time_t) strtoul (timestamp, NULL, 10);
+  if (strlen (timestamp) >= 15 && timestamp[8] == 'T')
+    {
+      struct tm buf;
+      int year;
+
+      year = atoi_4 (timestamp);
+      if (year < 1900)
+        return (time_t)(-1);
+
+      /* Fixme: We would better use a configure test to see whether
+         mktime can handle dates beyond 2038. */
+      if (sizeof (time_t) <= 4 && year >= 2038)
+        return (time_t)2145914603; /* 2037-12-31 23:23:23 */
+
+      memset (&buf, 0, sizeof buf);
+      buf.tm_year = year - 1900;
+      buf.tm_mon = atoi_2 (timestamp+4) - 1; 
+      buf.tm_mday = atoi_2 (timestamp+6);
+      buf.tm_hour = atoi_2 (timestamp+9);
+      buf.tm_min = atoi_2 (timestamp+11);
+      buf.tm_sec = atoi_2 (timestamp+13);
+
+#ifdef HAVE_TIMEGM
+      return timegm (&buf);
+#else
+      {
+        time_t tim;
+        
+        putenv ("TZ=UTC");
+        tim = mktime (&buf);
+#ifdef __GNUC__
+#warning fixme: we must somehow reset TZ here.  It is not threadsafe anyway.
+#endif
+        return tim;
+      }
+#endif /* !HAVE_TIMEGM */
+    }
+  else
+    return (time_t) strtoul (timestamp, NULL, 10);
 }
 
 
index 3f70851..b92e753 100644 (file)
@@ -259,6 +259,8 @@ parse_valid_sig (gpgme_signature_t sig, char *args)
     {
       char *tail;
       errno = 0;
+
+      /* FIXME: We need to cope with ISO time strings here. */
       sig->timestamp = strtol (end, &tail, 0);
       if (errno || end == tail || (*tail && *tail != ' '))
        return gpg_error (GPG_ERR_INV_ENGINE);