REST/NAMESTORE: rework API
[oweals/gnunet.git] / src / reclaim / reclaim_api.c
index cfa0cbbfb0b9cfad18f6092dc3df7f9af238b849..e0ca9adf37d2190b4c72c2f92de55cc3a4ddb2ac 100644 (file)
@@ -11,7 +11,7 @@
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      Affero General Public License for more details.
-    
+
      You should have received a copy of the GNU Affero General Public License
      along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
  * @author Martin Schanzenbach
  */
 #include "platform.h"
+
 #include "gnunet_util_lib.h"
+
 #include "gnunet_constants.h"
-#include "gnunet_protocols.h"
 #include "gnunet_mq_lib.h"
-#include "gnunet_reclaim_service.h"
+#include "gnunet_protocols.h"
 #include "gnunet_reclaim_attribute_lib.h"
+#include "gnunet_reclaim_service.h"
 #include "reclaim.h"
 
-#define LOG(kind,...) GNUNET_log_from (kind, "reclaim-api",__VA_ARGS__)
+#define LOG(kind, ...) GNUNET_log_from (kind, "reclaim-api", __VA_ARGS__)
 
 
 /**
@@ -96,9 +98,9 @@ struct GNUNET_RECLAIM_Operation
    * Closure for @e cont or @e cb.
    */
   void *cls;
-
 };
 
+
 /**
  * Handle for a ticket iterator operation
  */
@@ -126,7 +128,7 @@ struct GNUNET_RECLAIM_TicketIterator
   GNUNET_SCHEDULER_TaskCallback finish_cb;
 
   /**
-   * Closure for @e error_cb.
+   * Closure for @e finish_cb.
    */
   void *finish_cb_cls;
 
@@ -160,7 +162,6 @@ struct GNUNET_RECLAIM_TicketIterator
    * The operation id this zone iteration operation has
    */
   uint32_t r_id;
-
 };
 
 
@@ -181,7 +182,7 @@ struct GNUNET_RECLAIM_AttributeIterator
   struct GNUNET_RECLAIM_AttributeIterator *prev;
 
   /**
-   * Main handle to access the idp.
+   * Main handle to access the service.
    */
   struct GNUNET_RECLAIM_Handle *h;
 
@@ -191,7 +192,7 @@ struct GNUNET_RECLAIM_AttributeIterator
   GNUNET_SCHEDULER_TaskCallback finish_cb;
 
   /**
-   * Closure for @e error_cb.
+   * Closure for @e finish_cb.
    */
   void *finish_cb_cls;
 
@@ -230,12 +231,11 @@ struct GNUNET_RECLAIM_AttributeIterator
    * The operation id this zone iteration operation has
    */
   uint32_t r_id;
-
 };
 
 
 /**
- * Handle for the service.
+ * Handle to the service.
  */
 struct GNUNET_RECLAIM_Handle
 {
@@ -284,7 +284,6 @@ struct GNUNET_RECLAIM_Handle
    */
   struct GNUNET_RECLAIM_TicketIterator *ticket_it_tail;
 
-
   /**
    * Currently pending transmission request, or NULL for none.
    */
@@ -293,7 +292,7 @@ struct GNUNET_RECLAIM_Handle
   /**
    * Task doing exponential back-off trying to reconnect.
    */
-  struct GNUNET_SCHEDULER_Task * reconnect_task;
+  struct GNUNET_SCHEDULER_Task *reconnect_task;
 
   /**
    * Time for next connect retry.
@@ -314,9 +313,9 @@ struct GNUNET_RECLAIM_Handle
    * Are we polling for incoming messages right now?
    */
   int in_receive;
-
 };
 
+
 /**
  * Try again to connect to the service.
  *
@@ -325,6 +324,7 @@ struct GNUNET_RECLAIM_Handle
 static void
 reconnect (struct GNUNET_RECLAIM_Handle *h);
 
+
 /**
  * Reconnect
  *
@@ -350,14 +350,13 @@ force_reconnect (struct GNUNET_RECLAIM_Handle *handle)
 {
   GNUNET_MQ_destroy (handle->mq);
   handle->mq = NULL;
-  handle->reconnect_backoff
-    = GNUNET_TIME_STD_BACKOFF (handle->reconnect_backoff);
-  handle->reconnect_task
-    = GNUNET_SCHEDULER_add_delayed (handle->reconnect_backoff,
-                                    &reconnect_task,
-                                    handle);
+  handle->reconnect_backoff =
+      GNUNET_TIME_STD_BACKOFF (handle->reconnect_backoff);
+  handle->reconnect_task = GNUNET_SCHEDULER_add_delayed (
+      handle->reconnect_backoff, &reconnect_task, handle);
 }
 
+
 /**
  * Free @a it.
  *
@@ -368,22 +367,25 @@ free_it (struct GNUNET_RECLAIM_AttributeIterator *it)
 {
   struct GNUNET_RECLAIM_Handle *h = it->h;
 
-  GNUNET_CONTAINER_DLL_remove (h->it_head,
-                               h->it_tail,
-                               it);
+  GNUNET_CONTAINER_DLL_remove (h->it_head, h->it_tail, it);
   if (NULL != it->env)
     GNUNET_MQ_discard (it->env);
   GNUNET_free (it);
 }
 
+/**
+ * Free @a op
+ *
+ * @param op the operation to free
+ */
 static void
-free_op (struct GNUNET_RECLAIM_Operationop)
+free_op (struct GNUNET_RECLAIM_Operation *op)
 {
   if (NULL == op)
     return;
   if (NULL != op->env)
     GNUNET_MQ_discard (op->env);
-  GNUNET_free(op);
+  GNUNET_free (op);
 }
 
 
@@ -396,23 +398,22 @@ free_op (struct GNUNET_RECLAIM_Operation* op)
  * @param error error code
  */
 static void
-mq_error_handler (void *cls,
-                  enum GNUNET_MQ_Error error)
+mq_error_handler (void *cls, enum GNUNET_MQ_Error error)
 {
   struct GNUNET_RECLAIM_Handle *handle = cls;
   force_reconnect (handle);
 }
 
+
 /**
  * Handle an incoming message of type
- * #GNUNET_MESSAGE_TYPE_NAMESTORE_RECORD_STORE_RESPONSE
+ * #GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE
  *
  * @param cls
  * @param msg the message we received
  */
 static void
-handle_attribute_store_response (void *cls,
-                             const struct AttributeStoreResultMessage *msg)
+handle_success_response (void *cls, const struct SuccessResultMessage *msg)
 {
   struct GNUNET_RECLAIM_Handle *h = cls;
   struct GNUNET_RECLAIM_Operation *op;
@@ -427,24 +428,18 @@ handle_attribute_store_response (void *cls,
     return;
 
   res = ntohl (msg->op_result);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Received ATTRIBUTE_STORE_RESPONSE with result %d\n",
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Received SUCCESS_RESPONSE with result %d\n",
        res);
 
   /* TODO: add actual error message to response... */
   if (GNUNET_SYSERR == res)
-    emsg = _("failed to store record\n");
+    emsg = _ ("failed to store record\n");
   else
     emsg = NULL;
   if (NULL != op->as_cb)
-    op->as_cb (op->cls,
-              res,
-              emsg);
-  GNUNET_CONTAINER_DLL_remove (h->op_head,
-                               h->op_tail,
-                               op);
+    op->as_cb (op->cls, res, emsg);
+  GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
   free_op (op);
-
 }
 
 
@@ -465,8 +460,7 @@ check_consume_ticket_result (void *cls,
 
   msg_len = ntohs (msg->header.size);
   attrs_len = ntohs (msg->attrs_len);
-  if (msg_len != sizeof (struct ConsumeTicketResultMessage) + attrs_len)
-  {
+  if (msg_len != sizeof (struct ConsumeTicketResultMessage) + attrs_len) {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
@@ -491,8 +485,7 @@ handle_consume_ticket_result (void *cls,
   uint32_t r_id = ntohl (msg->id);
 
   attrs_len = ntohs (msg->attrs_len);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Processing attribute result.\n");
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Processing attribute result.\n");
 
 
   for (op = h->op_head; NULL != op; op = op->next)
@@ -504,33 +497,20 @@ handle_consume_ticket_result (void *cls,
   {
     struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs;
     struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *le;
-    attrs = GNUNET_RECLAIM_ATTRIBUTE_list_deserialize ((char*)&msg[1],
-                                        attrs_len);
-    if (NULL != op->ar_cb)
-    {
-      if (NULL == attrs)
-      {
-        op->ar_cb (op->cls,
-                   &msg->identity,
-                   NULL);
-      }
-      else
-      {
+    attrs =
+        GNUNET_RECLAIM_ATTRIBUTE_list_deserialize ((char *)&msg[1], attrs_len);
+    if (NULL != op->ar_cb) {
+      if (NULL == attrs) {
+        op->ar_cb (op->cls, &msg->identity, NULL);
+      } else {
         for (le = attrs->list_head; NULL != le; le = le->next)
-          op->ar_cb (op->cls,
-                     &msg->identity,
-                     le->claim);
+          op->ar_cb (op->cls, &msg->identity, le->claim);
         GNUNET_RECLAIM_ATTRIBUTE_list_destroy (attrs);
       }
     }
-    if (NULL != op)
-    {
-      op->ar_cb (op->cls,
-                 NULL,
-                 NULL);
-      GNUNET_CONTAINER_DLL_remove (h->op_head,
-                                   h->op_tail,
-                                   op);
+    if (NULL != op) {
+      op->ar_cb (op->cls, NULL, NULL);
+      GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
       free_op (op);
     }
     return;
@@ -548,16 +528,14 @@ handle_consume_ticket_result (void *cls,
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
  */
 static int
-check_attribute_result (void *cls,
-                        const struct AttributeResultMessage *msg)
+check_attribute_result (void *cls, const struct AttributeResultMessage *msg)
 {
   size_t msg_len;
   size_t attr_len;
 
   msg_len = ntohs (msg->header.size);
   attr_len = ntohs (msg->attr_len);
-  if (msg_len != sizeof (struct AttributeResultMessage) + attr_len)
-  {
+  if (msg_len != sizeof (struct AttributeResultMessage) + attr_len) {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
@@ -573,8 +551,7 @@ check_attribute_result (void *cls,
  * @param msg the message we received
  */
 static void
-handle_attribute_result (void *cls,
-                         const struct AttributeResultMessage *msg)
+handle_attribute_result (void *cls, const struct AttributeResultMessage *msg)
 {
   static struct GNUNET_CRYPTO_EcdsaPrivateKey identity_dummy;
   struct GNUNET_RECLAIM_Handle *h = cls;
@@ -584,8 +561,7 @@ handle_attribute_result (void *cls,
   uint32_t r_id = ntohl (msg->id);
 
   attr_len = ntohs (msg->attr_len);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Processing attribute result.\n");
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Processing attribute result.\n");
 
 
   for (it = h->it_head; NULL != it; it = it->next)
@@ -597,54 +573,36 @@ handle_attribute_result (void *cls,
   if ((NULL == it) && (NULL == op))
     return;
 
-  if ( (0 == (memcmp (&msg->identity,
-                      &identity_dummy,
-                      sizeof (identity_dummy)))) )
-  {
-    if ((NULL == it) && (NULL == op))
-    {
+  if ((0 ==
+       (memcmp (&msg->identity, &identity_dummy, sizeof (identity_dummy))))) {
+    if ((NULL == it) && (NULL == op)) {
       GNUNET_break (0);
       force_reconnect (h);
       return;
     }
-    if (NULL != it)
-    {
+    if (NULL != it) {
       if (NULL != it->finish_cb)
         it->finish_cb (it->finish_cb_cls);
       free_it (it);
     }
-    if (NULL != op)
-    {
+    if (NULL != op) {
       if (NULL != op->ar_cb)
-        op->ar_cb (op->cls,
-                   NULL,
-                   NULL);
-      GNUNET_CONTAINER_DLL_remove (h->op_head,
-                                   h->op_tail,
-                                   op);
+        op->ar_cb (op->cls, NULL, NULL);
+      GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
       free_op (op);
-
     }
     return;
   }
 
   {
     struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr;
-    attr = GNUNET_RECLAIM_ATTRIBUTE_deserialize ((char*)&msg[1],
-                                                  attr_len);
-    if (NULL != it)
-    {
+    attr = GNUNET_RECLAIM_ATTRIBUTE_deserialize ((char *)&msg[1], attr_len);
+    if (NULL != it) {
       if (NULL != it->proc)
-        it->proc (it->proc_cls,
-                  &msg->identity,
-                  attr);
-    } else if (NULL != op)
-    {
+        it->proc (it->proc_cls, &msg->identity, attr);
+    } else if (NULL != op) {
       if (NULL != op->ar_cb)
-        op->ar_cb (op->cls,
-                   &msg->identity,
-                   attr);
-
+        op->ar_cb (op->cls, &msg->identity, attr);
     }
     GNUNET_free (attr);
     return;
@@ -661,14 +619,12 @@ handle_attribute_result (void *cls,
  * @return #GNUNET_OK on success, #GNUNET_SYSERR on error
  */
 static int
-check_ticket_result (void *cls,
-                     const struct TicketResultMessage *msg)
+check_ticket_result (void *cls, const struct TicketResultMessage *msg)
 {
   size_t msg_len;
 
   msg_len = ntohs (msg->header.size);
-  if (msg_len < sizeof (struct TicketResultMessage))
-  {
+  if (msg_len < sizeof (struct TicketResultMessage)) {
     GNUNET_break (0);
     return GNUNET_SYSERR;
   }
@@ -676,7 +632,6 @@ check_ticket_result (void *cls,
 }
 
 
-
 /**
  * Handle an incoming message of type
  * #GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT
@@ -685,8 +640,7 @@ check_ticket_result (void *cls,
  * @param msg the message we received
  */
 static void
-handle_ticket_result (void *cls,
-                      const struct TicketResultMessage *msg)
+handle_ticket_result (void *cls, const struct TicketResultMessage *msg)
 {
   struct GNUNET_RECLAIM_Handle *handle = cls;
   struct GNUNET_RECLAIM_Operation *op;
@@ -704,13 +658,9 @@ handle_ticket_result (void *cls,
   if ((NULL == op) && (NULL == it))
     return;
   msg_len = ntohs (msg->header.size);
-  if (NULL != op)
-  {
-    GNUNET_CONTAINER_DLL_remove (handle->op_head,
-                                 handle->op_tail,
-                                 op);
-    if (msg_len == sizeof (struct TicketResultMessage))
-    {
+  if (NULL != op) {
+    GNUNET_CONTAINER_DLL_remove (handle->op_head, handle->op_tail, op);
+    if (msg_len == sizeof (struct TicketResultMessage)) {
       if (NULL != op->tr_cb)
         op->tr_cb (op->cls, NULL);
     } else {
@@ -721,12 +671,10 @@ handle_ticket_result (void *cls,
     free_op (op);
     return;
   } else if (NULL != it) {
-    if (msg_len == sizeof (struct TicketResultMessage))
-    {
+    if (msg_len == sizeof (struct TicketResultMessage)) {
       if (NULL != it->tr_cb)
         GNUNET_CONTAINER_DLL_remove (handle->ticket_it_head,
-                                     handle->ticket_it_tail,
-                                     it);
+                                     handle->ticket_it_tail, it);
       it->finish_cb (it->finish_cb_cls);
       GNUNET_free (it);
     } else {
@@ -756,8 +704,7 @@ handle_revoke_ticket_result (void *cls,
   uint32_t r_id = ntohl (msg->id);
   int32_t success;
 
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Processing revocation result.\n");
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Processing revocation result.\n");
 
 
   for (op = h->op_head; NULL != op; op = op->next)
@@ -767,15 +714,10 @@ handle_revoke_ticket_result (void *cls,
     return;
   success = ntohl (msg->success);
   {
-    if (NULL != op->rvk_cb)
-    {
-      op->rvk_cb (op->cls,
-                  success,
-                  NULL);
+    if (NULL != op->rvk_cb) {
+      op->rvk_cb (op->cls, success, NULL);
     }
-    GNUNET_CONTAINER_DLL_remove (h->op_head,
-                                 h->op_tail,
-                                 op);
+    GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
     free_op (op);
     return;
   }
@@ -783,7 +725,6 @@ handle_revoke_ticket_result (void *cls,
 }
 
 
-
 /**
  * Try again to connect to the service.
  *
@@ -793,44 +734,33 @@ static void
 reconnect (struct GNUNET_RECLAIM_Handle *h)
 {
   struct GNUNET_MQ_MessageHandler handlers[] = {
-    GNUNET_MQ_hd_fixed_size (attribute_store_response,
-                             GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE_RESPONSE,
-                             struct AttributeStoreResultMessage,
-                             h),
-    GNUNET_MQ_hd_var_size (attribute_result,
-                           GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT,
-                           struct AttributeResultMessage,
-                           h),
-    GNUNET_MQ_hd_var_size (ticket_result,
-                           GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT,
-                           struct TicketResultMessage,
-                           h),
-    GNUNET_MQ_hd_var_size (consume_ticket_result,
-                           GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET_RESULT,
-                           struct ConsumeTicketResultMessage,
-                           h),
-    GNUNET_MQ_hd_fixed_size (revoke_ticket_result,
-                             GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET_RESULT,
-                             struct RevokeTicketResultMessage,
-                             h),
-    GNUNET_MQ_handler_end ()
-  };
+      GNUNET_MQ_hd_fixed_size (success_response,
+                               GNUNET_MESSAGE_TYPE_RECLAIM_SUCCESS_RESPONSE,
+                               struct SuccessResultMessage, h),
+      GNUNET_MQ_hd_var_size (attribute_result,
+                             GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_RESULT,
+                             struct AttributeResultMessage, h),
+      GNUNET_MQ_hd_var_size (ticket_result,
+                             GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_RESULT,
+                             struct TicketResultMessage, h),
+      GNUNET_MQ_hd_var_size (consume_ticket_result,
+                             GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET_RESULT,
+                             struct ConsumeTicketResultMessage, h),
+      GNUNET_MQ_hd_fixed_size (revoke_ticket_result,
+                               GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET_RESULT,
+                               struct RevokeTicketResultMessage, h),
+      GNUNET_MQ_handler_end ()};
   struct GNUNET_RECLAIM_Operation *op;
 
   GNUNET_assert (NULL == h->mq);
-  LOG (GNUNET_ERROR_TYPE_DEBUG,
-       "Connecting to reclaim service.\n");
-
-  h->mq = GNUNET_CLIENT_connect (h->cfg,
-                                 "reclaim",
-                                 handlers,
-                                 &mq_error_handler,
-                                 h);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "Connecting to reclaim service.\n");
+
+  h->mq =
+      GNUNET_CLIENT_connect (h->cfg, "reclaim", handlers, &mq_error_handler, h);
   if (NULL == h->mq)
     return;
   for (op = h->op_head; NULL != op; op = op->next)
-    GNUNET_MQ_send_copy (h->mq,
-                         op->env);
+    GNUNET_MQ_send_copy (h->mq, op->env);
 }
 
 
@@ -848,8 +778,7 @@ GNUNET_RECLAIM_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
   h = GNUNET_new (struct GNUNET_RECLAIM_Handle);
   h->cfg = cfg;
   reconnect (h);
-  if (NULL == h->mq)
-  {
+  if (NULL == h->mq) {
     GNUNET_free (h);
     return NULL;
   }
@@ -870,9 +799,7 @@ GNUNET_RECLAIM_cancel (struct GNUNET_RECLAIM_Operation *op)
 {
   struct GNUNET_RECLAIM_Handle *h = op->h;
 
-  GNUNET_CONTAINER_DLL_remove (h->op_head,
-                               h->op_tail,
-                               op);
+  GNUNET_CONTAINER_DLL_remove (h->op_head, h->op_tail, op);
   free_op (op);
 }
 
@@ -886,13 +813,11 @@ void
 GNUNET_RECLAIM_disconnect (struct GNUNET_RECLAIM_Handle *h)
 {
   GNUNET_assert (NULL != h);
-  if (NULL != h->mq)
-  {
+  if (NULL != h->mq) {
     GNUNET_MQ_destroy (h->mq);
     h->mq = NULL;
   }
-  if (NULL != h->reconnect_task)
-  {
+  if (NULL != h->reconnect_task) {
     GNUNET_SCHEDULER_cancel (h->reconnect_task);
     h->reconnect_task = NULL;
   }
@@ -904,7 +829,7 @@ GNUNET_RECLAIM_disconnect (struct GNUNET_RECLAIM_Handle *h)
  * Store an attribute.  If the attribute is already present,
  * it is replaced with the new attribute.
  *
- * @param h handle to the reclaim
+ * @param h handle to the re:claimID service
  * @param pkey private key of the identity
  * @param attr the attribute value
  * @param exp_interval the relative expiration interval for the attribute
@@ -913,12 +838,12 @@ GNUNET_RECLAIM_disconnect (struct GNUNET_RECLAIM_Handle *h)
  * @return handle to abort the request
  */
 struct GNUNET_RECLAIM_Operation *
-GNUNET_RECLAIM_attribute_store (struct GNUNET_RECLAIM_Handle *h,
-                                          const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
-                                          const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr,
-                                          const struct GNUNET_TIME_Relative *exp_interval,
-                                          GNUNET_RECLAIM_ContinuationWithStatus cont,
-                                          void *cont_cls)
+GNUNET_RECLAIM_attribute_store (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+    const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr,
+    const struct GNUNET_TIME_Relative *exp_interval,
+    GNUNET_RECLAIM_ContinuationWithStatus cont, void *cont_cls)
 {
   struct GNUNET_RECLAIM_Operation *op;
   struct AttributeStoreMessage *sam;
@@ -929,26 +854,62 @@ GNUNET_RECLAIM_attribute_store (struct GNUNET_RECLAIM_Handle *h,
   op->as_cb = cont;
   op->cls = cont_cls;
   op->r_id = h->r_id_gen++;
-  GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
-                                    h->op_tail,
-                                    op);
+  GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
   attr_len = GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (attr);
-  op->env = GNUNET_MQ_msg_extra (sam,
-                                 attr_len,
+  op->env = GNUNET_MQ_msg_extra (sam, attr_len,
                                  GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_STORE);
   sam->identity = *pkey;
   sam->id = htonl (op->r_id);
   sam->exp = GNUNET_htonll (exp_interval->rel_value_us);
 
-  GNUNET_RECLAIM_ATTRIBUTE_serialize (attr,
-                                       (char*)&sam[1]);
+  GNUNET_RECLAIM_ATTRIBUTE_serialize (attr, (char *)&sam[1]);
 
   sam->attr_len = htons (attr_len);
   if (NULL != h->mq)
-    GNUNET_MQ_send_copy (h->mq,
-                         op->env);
+    GNUNET_MQ_send_copy (h->mq, op->env);
   return op;
+}
 
+
+/**
+ * Delete an attribute. Tickets used to share this attribute are updated
+ * accordingly.
+ *
+ * @param h handle to the re:claimID service
+ * @param pkey Private key of the identity to add an attribute to
+ * @param attr The attribute
+ * @param cont Continuation to call when done
+ * @param cont_cls Closure for @a cont
+ * @return handle Used to to abort the request
+ */
+struct GNUNET_RECLAIM_Operation *
+GNUNET_RECLAIM_attribute_delete (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *pkey,
+    const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr,
+    GNUNET_RECLAIM_ContinuationWithStatus cont, void *cont_cls)
+{
+  struct GNUNET_RECLAIM_Operation *op;
+  struct AttributeDeleteMessage *dam;
+  size_t attr_len;
+
+  op = GNUNET_new (struct GNUNET_RECLAIM_Operation);
+  op->h = h;
+  op->as_cb = cont;
+  op->cls = cont_cls;
+  op->r_id = h->r_id_gen++;
+  GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
+  attr_len = GNUNET_RECLAIM_ATTRIBUTE_serialize_get_size (attr);
+  op->env = GNUNET_MQ_msg_extra (dam, attr_len,
+                                 GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_DELETE);
+  dam->identity = *pkey;
+  dam->id = htonl (op->r_id);
+  GNUNET_RECLAIM_ATTRIBUTE_serialize (attr, (char *)&dam[1]);
+
+  dam->attr_len = htons (attr_len);
+  if (NULL != h->mq)
+    GNUNET_MQ_send_copy (h->mq, op->env);
+  return op;
 }
 
 
@@ -964,28 +925,25 @@ GNUNET_RECLAIM_attribute_store (struct GNUNET_RECLAIM_Handle *h,
  * On normal completion, @a finish_cb proc will be
  * invoked.
  *
- * @param h handle to the idp
- * @param identity identity to access
- * @param error_cb function to call on error (i.e. disconnect),
+ * @param h Handle to the re:claimID service
+ * @param identity Identity to iterate over
+ * @param error_cb Function to call on error (i.e. disconnect),
  *        the handle is afterwards invalid
- * @param error_cb_cls closure for @a error_cb
- * @param proc function to call on each attribute; it
- *        will be called repeatedly with a value (if available)
- * @param proc_cls closure for @a proc
- * @param finish_cb function to call on completion
+ * @param error_cb_cls Closure for @a error_cb
+ * @param proc Function to call on each attribute
+ * @param proc_cls Closure for @a proc
+ * @param finish_cb Function to call on completion
  *        the handle is afterwards invalid
- * @param finish_cb_cls closure for @a finish_cb
- * @return an iterator handle to use for iteration
+ * @param finish_cb_cls Closure for @a finish_cb
+ * @return an iterator Handle to use for iteration
  */
 struct GNUNET_RECLAIM_AttributeIterator *
-GNUNET_RECLAIM_get_attributes_start (struct GNUNET_RECLAIM_Handle *h,
-                                               const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
-                                               GNUNET_SCHEDULER_TaskCallback error_cb,
-                                               void *error_cb_cls,
-                                               GNUNET_RECLAIM_AttributeResult proc,
-                                               void *proc_cls,
-                                               GNUNET_SCHEDULER_TaskCallback finish_cb,
-                                               void *finish_cb_cls)
+GNUNET_RECLAIM_get_attributes_start (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+    GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls,
+    GNUNET_RECLAIM_AttributeResult proc, void *proc_cls,
+    GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
 {
   struct GNUNET_RECLAIM_AttributeIterator *it;
   struct GNUNET_MQ_Envelope *env;
@@ -1003,9 +961,7 @@ GNUNET_RECLAIM_get_attributes_start (struct GNUNET_RECLAIM_Handle *h,
   it->proc_cls = proc_cls;
   it->r_id = rid;
   it->identity = *identity;
-  GNUNET_CONTAINER_DLL_insert_tail (h->it_head,
-                                    h->it_tail,
-                                    it);
+  GNUNET_CONTAINER_DLL_insert_tail (h->it_head, h->it_tail, it);
   env = GNUNET_MQ_msg (msg,
                        GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_START);
   msg->id = htonl (rid);
@@ -1013,8 +969,7 @@ GNUNET_RECLAIM_get_attributes_start (struct GNUNET_RECLAIM_Handle *h,
   if (NULL == h->mq)
     it->env = env;
   else
-    GNUNET_MQ_send (h->mq,
-                    env);
+    GNUNET_MQ_send (h->mq, env);
   return it;
 }
 
@@ -1032,16 +987,15 @@ GNUNET_RECLAIM_get_attributes_next (struct GNUNET_RECLAIM_AttributeIterator *it)
   struct AttributeIterationNextMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg (msg,
-                       GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT);
+  env =
+      GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_NEXT);
   msg->id = htonl (it->r_id);
-  GNUNET_MQ_send (h->mq,
-                  env);
+  GNUNET_MQ_send (h->mq, env);
 }
 
 
 /**
- * Stops iteration and releases the idp handle for further calls.  Must
+ * Stops iteration and releases the handle for further calls. Must
  * be called on any iteration that has not yet completed prior to calling
  * #GNUNET_RECLAIM_disconnect.
  *
@@ -1054,38 +1008,36 @@ GNUNET_RECLAIM_get_attributes_stop (struct GNUNET_RECLAIM_AttributeIterator *it)
   struct GNUNET_MQ_Envelope *env;
   struct AttributeIterationStopMessage *msg;
 
-  if (NULL != h->mq)
-  {
+  if (NULL != h->mq) {
     env = GNUNET_MQ_msg (msg,
                          GNUNET_MESSAGE_TYPE_RECLAIM_ATTRIBUTE_ITERATION_STOP);
     msg->id = htonl (it->r_id);
-    GNUNET_MQ_send (h->mq,
-                    env);
+    GNUNET_MQ_send (h->mq, env);
   }
   free_it (it);
 }
 
 
-/** TODO
- * Issues a ticket to another identity. The identity may use
- * @GNUNET_RECLAIM_authorization_ticket_consume to consume the ticket
- * and retrieve the attributes specified in the AttributeList.
+/**
+ * Issues a ticket to another relying party. The identity may use
+ * @GNUNET_RECLAIM_ticket_consume to consume the ticket
+ * and retrieve the attributes specified in the attribute list.
  *
  * @param h the reclaim to use
- * @param iss the issuing identity
- * @param rp the subject of the ticket (the relying party)
+ * @param iss the issuing identity (= the user)
+ * @param rp the subject of the ticket (the relying party)
  * @param attrs the attributes that the relying party is given access to
  * @param cb the callback
  * @param cb_cls the callback closure
  * @return handle to abort the operation
  */
 struct GNUNET_RECLAIM_Operation *
-GNUNET_RECLAIM_ticket_issue (struct GNUNET_RECLAIM_Handle *h,
-                                       const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
-                                       const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
-                                       const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs,
-                                       GNUNET_RECLAIM_TicketCallback cb,
-                                       void *cb_cls)
+GNUNET_RECLAIM_ticket_issue (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *iss,
+    const struct GNUNET_CRYPTO_EcdsaPublicKey *rp,
+    const struct GNUNET_RECLAIM_ATTRIBUTE_ClaimList *attrs,
+    GNUNET_RECLAIM_TicketCallback cb, void *cb_cls)
 {
   struct GNUNET_RECLAIM_Operation *op;
   struct IssueTicketMessage *tim;
@@ -1096,44 +1048,41 @@ GNUNET_RECLAIM_ticket_issue (struct GNUNET_RECLAIM_Handle *h,
   op->tr_cb = cb;
   op->cls = cb_cls;
   op->r_id = h->r_id_gen++;
-  GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
-                                    h->op_tail,
-                                    op);
+  GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
   attr_len = GNUNET_RECLAIM_ATTRIBUTE_list_serialize_get_size (attrs);
-  op->env = GNUNET_MQ_msg_extra (tim,
-                                 attr_len,
+  op->env = GNUNET_MQ_msg_extra (tim, attr_len,
                                  GNUNET_MESSAGE_TYPE_RECLAIM_ISSUE_TICKET);
   tim->identity = *iss;
   tim->rp = *rp;
   tim->id = htonl (op->r_id);
 
-  GNUNET_RECLAIM_ATTRIBUTE_list_serialize (attrs,
-                                            (char*)&tim[1]);
+  GNUNET_RECLAIM_ATTRIBUTE_list_serialize (attrs, (char *)&tim[1]);
 
   tim->attr_len = htons (attr_len);
   if (NULL != h->mq)
-    GNUNET_MQ_send_copy (h->mq,
-                         op->env);
+    GNUNET_MQ_send_copy (h->mq, op->env);
   return op;
 }
 
+
 /**
  * Consumes an issued ticket. The ticket is persisted
  * and used to retrieve identity information from the issuer
  *
  * @param h the reclaim to use
- * @param identity the identity that is the subject of the issued ticket (the relying party)
+ * @param identity the identity that is the subject of the issued ticket (the
+ * relying party)
  * @param ticket the issued ticket to consume
  * @param cb the callback to call
  * @param cb_cls the callback closure
  * @return handle to abort the operation
  */
 struct GNUNET_RECLAIM_Operation *
-GNUNET_RECLAIM_ticket_consume (struct GNUNET_RECLAIM_Handle *h,
-                                         const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
-                                         const struct GNUNET_RECLAIM_Ticket *ticket,
-                                         GNUNET_RECLAIM_AttributeResult cb,
-                                         void *cb_cls)
+GNUNET_RECLAIM_ticket_consume (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+    const struct GNUNET_RECLAIM_Ticket *ticket,
+    GNUNET_RECLAIM_AttributeResult cb, void *cb_cls)
 {
   struct GNUNET_RECLAIM_Operation *op;
   struct ConsumeTicketMessage *ctm;
@@ -1143,24 +1092,19 @@ GNUNET_RECLAIM_ticket_consume (struct GNUNET_RECLAIM_Handle *h,
   op->ar_cb = cb;
   op->cls = cb_cls;
   op->r_id = h->r_id_gen++;
-  GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
-                                    h->op_tail,
-                                    op);
-  op->env = GNUNET_MQ_msg_extra (ctm,
-                                 sizeof (const struct GNUNET_RECLAIM_Ticket),
-                                 GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET);
+  GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
+  op->env =
+      GNUNET_MQ_msg_extra (ctm, sizeof (const struct GNUNET_RECLAIM_Ticket),
+                           GNUNET_MESSAGE_TYPE_RECLAIM_CONSUME_TICKET);
   ctm->identity = *identity;
   ctm->id = htonl (op->r_id);
 
-  GNUNET_memcpy ((char*)&ctm[1],
-                 ticket,
+  GNUNET_memcpy ((char *)&ctm[1], ticket,
                  sizeof (const struct GNUNET_RECLAIM_Ticket));
 
   if (NULL != h->mq)
-    GNUNET_MQ_send_copy (h->mq,
-                         op->env);
+    GNUNET_MQ_send_copy (h->mq, op->env);
   return op;
-
 }
 
 
@@ -1182,23 +1126,18 @@ GNUNET_RECLAIM_ticket_consume (struct GNUNET_RECLAIM_Handle *h,
  * @return an iterator handle to use for iteration
  */
 struct GNUNET_RECLAIM_TicketIterator *
-GNUNET_RECLAIM_ticket_iteration_start (struct GNUNET_RECLAIM_Handle *h,
-                                                 const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
-                                                 GNUNET_SCHEDULER_TaskCallback error_cb,
-                                                 void *error_cb_cls,
-                                                 GNUNET_RECLAIM_TicketCallback proc,
-                                                 void *proc_cls,
-                                                 GNUNET_SCHEDULER_TaskCallback finish_cb,
-                                                 void *finish_cb_cls)
+GNUNET_RECLAIM_ticket_iteration_start (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+    GNUNET_SCHEDULER_TaskCallback error_cb, void *error_cb_cls,
+    GNUNET_RECLAIM_TicketCallback proc, void *proc_cls,
+    GNUNET_SCHEDULER_TaskCallback finish_cb, void *finish_cb_cls)
 {
   struct GNUNET_RECLAIM_TicketIterator *it;
-  struct GNUNET_CRYPTO_EcdsaPublicKey identity_pub;
   struct GNUNET_MQ_Envelope *env;
   struct TicketIterationStartMessage *msg;
   uint32_t rid;
 
-  GNUNET_CRYPTO_ecdsa_key_get_public (identity,
-                                      &identity_pub);
   rid = h->r_id_gen++;
   it = GNUNET_new (struct GNUNET_RECLAIM_TicketIterator);
   it->h = h;
@@ -1209,87 +1148,21 @@ GNUNET_RECLAIM_ticket_iteration_start (struct GNUNET_RECLAIM_Handle *h,
   it->tr_cb = proc;
   it->cls = proc_cls;
   it->r_id = rid;
-  GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
-                                    h->ticket_it_tail,
-                                    it);
-  env = GNUNET_MQ_msg (msg,
-                       GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START);
-  msg->id = htonl (rid);
-  msg->identity = identity_pub;
-  msg->is_audience = htonl (GNUNET_NO);
-  if (NULL == h->mq)
-    it->env = env;
-  else
-    GNUNET_MQ_send (h->mq,
-                    env);
-  return it;
-
-}
-
-
-/**
- * Lists all tickets that have been issued to remote
- * identites (relying parties)
- *
- * @param h the reclaim to use
- * @param identity the issuing identity
- * @param error_cb function to call on error (i.e. disconnect),
- *        the handle is afterwards invalid
- * @param error_cb_cls closure for @a error_cb
- * @param proc function to call on each ticket; it
- *        will be called repeatedly with a value (if available)
- * @param proc_cls closure for @a proc
- * @param finish_cb function to call on completion
- *        the handle is afterwards invalid
- * @param finish_cb_cls closure for @a finish_cb
- * @return an iterator handle to use for iteration
- */
-struct GNUNET_RECLAIM_TicketIterator *
-GNUNET_RECLAIM_ticket_iteration_start_rp (struct GNUNET_RECLAIM_Handle *h,
-                                                    const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
-                                                    GNUNET_SCHEDULER_TaskCallback error_cb,
-                                                    void *error_cb_cls,
-                                                    GNUNET_RECLAIM_TicketCallback proc,
-                                                    void *proc_cls,
-                                                    GNUNET_SCHEDULER_TaskCallback finish_cb,
-                                                    void *finish_cb_cls)
-{
-  struct GNUNET_RECLAIM_TicketIterator *it;
-  struct GNUNET_MQ_Envelope *env;
-  struct TicketIterationStartMessage *msg;
-  uint32_t rid;
-
-  rid = h->r_id_gen++;
-  it = GNUNET_new (struct GNUNET_RECLAIM_TicketIterator);
-  it->h = h;
-  it->error_cb = error_cb;
-  it->error_cb_cls = error_cb_cls;
-  it->finish_cb = finish_cb;
-  it->finish_cb_cls = finish_cb_cls;
-  it->tr_cb = proc;
-  it->cls = proc_cls;
-  it->r_id = rid;
-  GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head,
-                                    h->ticket_it_tail,
-                                    it);
-  env = GNUNET_MQ_msg (msg,
-                       GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START);
+  GNUNET_CONTAINER_DLL_insert_tail (h->ticket_it_head, h->ticket_it_tail, it);
+  env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_START);
   msg->id = htonl (rid);
   msg->identity = *identity;
-  msg->is_audience = htonl (GNUNET_YES);
   if (NULL == h->mq)
     it->env = env;
   else
-    GNUNET_MQ_send (h->mq,
-                    env);
+    GNUNET_MQ_send (h->mq, env);
   return it;
-
-
 }
 
+
 /**
- * Calls the record processor specified in #GNUNET_RECLAIM_ticket_iteration_start
- * for the next record.
+ * Calls the ticket processor specified in
+ * #GNUNET_RECLAIM_ticket_iteration_start for the next record.
  *
  * @param it the iterator
  */
@@ -1300,16 +1173,14 @@ GNUNET_RECLAIM_ticket_iteration_next (struct GNUNET_RECLAIM_TicketIterator *it)
   struct TicketIterationNextMessage *msg;
   struct GNUNET_MQ_Envelope *env;
 
-  env = GNUNET_MQ_msg (msg,
-                       GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT);
+  env = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_NEXT);
   msg->id = htonl (it->r_id);
-  GNUNET_MQ_send (h->mq,
-                  env);
+  GNUNET_MQ_send (h->mq, env);
 }
 
 
 /**
- * Stops iteration and releases the idp handle for further calls.  Must
+ * Stops iteration and releases the handle for further calls.  Must
  * be called on any iteration that has not yet completed prior to calling
  * #GNUNET_RECLAIM_disconnect.
  *
@@ -1322,22 +1193,23 @@ GNUNET_RECLAIM_ticket_iteration_stop (struct GNUNET_RECLAIM_TicketIterator *it)
   struct GNUNET_MQ_Envelope *env;
   struct TicketIterationStopMessage *msg;
 
-  if (NULL != h->mq)
-  {
-    env = GNUNET_MQ_msg (msg,
-                         GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP);
+  if (NULL != h->mq) {
+    env =
+        GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_RECLAIM_TICKET_ITERATION_STOP);
     msg->id = htonl (it->r_id);
-    GNUNET_MQ_send (h->mq,
-                    env);
+    GNUNET_MQ_send (h->mq, env);
   }
   GNUNET_free (it);
 }
 
+
 /**
  * Revoked an issued ticket. The relying party will be unable to retrieve
- * updated attributes.
+ * attributes. Other issued tickets remain unaffected.
+ * This includes tickets issued to other relying parties as well as to
+ * other tickets issued to the audience specified in this ticket.
  *
- * @param h the reclaim to use
+ * @param h the identity provider to use
  * @param identity the issuing identity
  * @param ticket the ticket to revoke
  * @param cb the callback
@@ -1345,11 +1217,11 @@ GNUNET_RECLAIM_ticket_iteration_stop (struct GNUNET_RECLAIM_TicketIterator *it)
  * @return handle to abort the operation
  */
 struct GNUNET_RECLAIM_Operation *
-GNUNET_RECLAIM_ticket_revoke (struct GNUNET_RECLAIM_Handle *h,
-                                        const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
-                                        const struct GNUNET_RECLAIM_Ticket *ticket,
-                                        GNUNET_RECLAIM_ContinuationWithStatus cb,
-                                        void *cb_cls)
+GNUNET_RECLAIM_ticket_revoke (
+    struct GNUNET_RECLAIM_Handle *h,
+    const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity,
+    const struct GNUNET_RECLAIM_Ticket *ticket,
+    GNUNET_RECLAIM_ContinuationWithStatus cb, void *cb_cls)
 {
   struct GNUNET_RECLAIM_Operation *op;
   struct RevokeTicketMessage *msg;
@@ -1361,25 +1233,18 @@ GNUNET_RECLAIM_ticket_revoke (struct GNUNET_RECLAIM_Handle *h,
   op->rvk_cb = cb;
   op->cls = cb_cls;
   op->r_id = rid;
-  GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
-                                    h->op_tail,
-                                    op);
-  op->env = GNUNET_MQ_msg_extra (msg,
-                             sizeof (struct GNUNET_RECLAIM_Ticket),
-                             GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET);
+  GNUNET_CONTAINER_DLL_insert_tail (h->op_head, h->op_tail, op);
+  op->env = GNUNET_MQ_msg_extra (msg, sizeof (struct GNUNET_RECLAIM_Ticket),
+                                 GNUNET_MESSAGE_TYPE_RECLAIM_REVOKE_TICKET);
   msg->id = htonl (rid);
   msg->identity = *identity;
-  GNUNET_memcpy (&msg[1],
-                 ticket,
-                 sizeof (struct GNUNET_RECLAIM_Ticket));
+  GNUNET_memcpy (&msg[1], ticket, sizeof (struct GNUNET_RECLAIM_Ticket));
   if (NULL != h->mq) {
-    GNUNET_MQ_send (h->mq,
-                    op->env);
+    GNUNET_MQ_send (h->mq, op->env);
     op->env = NULL;
   }
   return op;
 }
 
 
-
 /* end of reclaim_api.c */