convert fs publish to MQ
[oweals/gnunet.git] / src / gnsrecord / gnsrecord_crypto.c
index 336fb93c22c9cabf974ff0b0aaee0a5246448aa2..fcd37358034ae93b0413b68ed04870da0a2bd946 100644 (file)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2009-2013 Christian Grothoff (and other contributing authors)
+     Copyright (C) 2009-2013 GNUnet e.V.
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -14,8 +14,8 @@
 
      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
-     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-     Boston, MA 02111-1307, USA.
+     Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+     Boston, MA 02110-1301, USA.
 */
 
 /**
@@ -92,24 +92,33 @@ GNUNET_GNSRECORD_block_create (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key,
   struct GNUNET_CRYPTO_EcdsaPrivateKey *dkey;
   struct GNUNET_CRYPTO_SymmetricInitializationVector iv;
   struct GNUNET_CRYPTO_SymmetricSessionKey skey;
+  struct GNUNET_GNSRECORD_Data rdc[rd_count];
   uint32_t rd_count_nbo;
   unsigned int i;
+  struct GNUNET_TIME_Absolute now;
 
   if (payload_len > GNUNET_GNSRECORD_MAX_BLOCK_SIZE)
     return NULL;
-  /* sanity check */
+  /* convert relative to absolute times */
+  now = GNUNET_TIME_absolute_get ();
   for (i=0;i<rd_count;i++)
+  {
+    rdc[i] = rd[i];
     if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION))
-      {
-        /* encrypted blocks must never have relative expiration times, skip! */
-        GNUNET_break (0);
-        return NULL;
-      }
+    {
+      struct GNUNET_TIME_Relative t;
+
+      /* encrypted blocks must never have relative expiration times, convert! */
+      rdc[i].flags &= ~GNUNET_GNSRECORD_RF_RELATIVE_EXPIRATION;
+      t.rel_value_us = rdc[i].expiration_time;
+      rdc[i].expiration_time = GNUNET_TIME_absolute_add (now, t).abs_value_us;
+    }
+  }
   /* serialize */
   rd_count_nbo = htonl (rd_count);
   memcpy (payload, &rd_count_nbo, sizeof (uint32_t));
   GNUNET_assert (payload_len ==
-                GNUNET_GNSRECORD_records_serialize (rd_count, rd,
+                GNUNET_GNSRECORD_records_serialize (rd_count, rdc,
                                                     payload_len, &payload[sizeof (uint32_t)]));
   block = GNUNET_malloc (sizeof (struct GNUNET_GNSRECORD_Block) +
                         sizeof (uint32_t) + payload_len);
@@ -217,6 +226,7 @@ GNUNET_GNSRECORD_block_decrypt (const struct GNUNET_GNSRECORD_Block *block,
       struct GNUNET_GNSRECORD_Data rd[rd_count];
       unsigned int i;
       unsigned int j;
+      unsigned int k;
       struct GNUNET_TIME_Absolute now;
 
       if (GNUNET_OK !=
@@ -239,8 +249,33 @@ GNUNET_GNSRECORD_block_decrypt (const struct GNUNET_GNSRECORD_Block *block,
           GNUNET_break_op (0);
           continue;
         }
-        if (rd[i].expiration_time >= now.abs_value_us)
+
+        if (0 != (rd[i].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD))
+        {
+          int include_record = GNUNET_YES;
+          /* Shadow record, figure out if we have a not expired active record */
+          for (k=0;k<rd_count;k++)
+          {
+            if (k == i)
+              continue;
+            if (rd[i].expiration_time < now.abs_value_us)
+              include_record = GNUNET_NO; /* Shadow record is expired */
+            if ((rd[k].record_type == rd[i].record_type)
+                && (rd[k].expiration_time >= now.abs_value_us)
+                && (0 == (rd[k].flags & GNUNET_GNSRECORD_RF_SHADOW_RECORD)))
+              include_record = GNUNET_NO; /* We have a non-expired, non-shadow record of the same type */
+          }
+          if (GNUNET_YES == include_record)
+          {
+            rd[i].flags ^= GNUNET_GNSRECORD_RF_SHADOW_RECORD; /* Remove Flag */
+            if (j != i)
+              rd[j] = rd[i];
+            j++;
+          }
+        }
+        else if (rd[i].expiration_time >= now.abs_value_us)
         {
+          /* Include this record */
           if (j != i)
             rd[j] = rd[i];
           j++;