call listen before accept
[oweals/gnunet.git] / src / reclaim / plugin_rest_reclaim.c
index 38ffc4ddb604f3023e8f5b21ba9ec232e9e50dfb..9a75b2d16cb2281bfb43605907c0fc8d9ab3312b 100644 (file)
    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/>.
-   */
+
+   SPDX-License-Identifier: AGPL3.0-or-later
+ */
 /**
  * @author Martin Schanzenbach
  * @author Philippe Buschmann
  * @brief GNUnet reclaim REST plugin
  *
  */
-
 #include "platform.h"
-#include "gnunet_rest_plugin.h"
-#include "gnunet_identity_service.h"
-#include "gnunet_gns_service.h"
-#include "gnunet_gnsrecord_lib.h"
-#include "gnunet_namestore_service.h"
-#include "gnunet_rest_lib.h"
-#include "gnunet_jsonapi_lib.h"
-#include "gnunet_jsonapi_util.h"
 #include "microhttpd.h"
-#include <jansson.h>
 #include <inttypes.h>
-#include "gnunet_signatures.h"
+#include <jansson.h>
+#include "gnunet_gns_service.h"
+#include "gnunet_gnsrecord_lib.h"
+#include "gnunet_identity_service.h"
 #include "gnunet_reclaim_attribute_lib.h"
 #include "gnunet_reclaim_service.h"
+#include "gnunet_rest_lib.h"
+#include "gnunet_rest_plugin.h"
+#include "gnunet_signatures.h"
+#include "json_reclaim.h"
 
 /**
  * REST root namespace
  */
 #define GNUNET_REST_API_NS_IDENTITY_CONSUME "/reclaim/consume"
 
-/**
- * Attribute key
- */
-#define GNUNET_REST_JSONAPI_RECLAIM_ATTRIBUTE "attribute"
-
-/**
- * Ticket key
- */
-#define GNUNET_REST_JSONAPI_IDENTITY_TICKET "ticket"
-
-
-/**
- * Value key
- */
-#define GNUNET_REST_JSONAPI_RECLAIM_ATTRIBUTE_VALUE "value"
-
 /**
  * State while collecting all egos
  */
@@ -98,7 +81,7 @@ const struct GNUNET_CONFIGURATION_Handle *cfg;
 /**
  * HTTP methods allows for this plugin
  */
-static charallow_methods;
+static char *allow_methods;
 
 /**
  * @brief struct returned by the initialization function of the plugin
@@ -177,16 +160,6 @@ struct RequestHandle
    */
   struct GNUNET_REST_RequestHandle *rest_handle;
 
-  /**
-   * Handle to NAMESTORE
-   */
-  struct GNUNET_NAMESTORE_Handle *namestore_handle;
-
-  /**
-   * Iterator for NAMESTORE
-   */
-  struct GNUNET_NAMESTORE_ZoneIterator *namestore_handle_it;
-
   /**
    * Attribute claim list
    */
@@ -260,8 +233,7 @@ struct RequestHandle
   /**
    * Response object
    */
-  struct GNUNET_JSONAPI_Document *resp_object;
-
+  json_t *resp_object;
 };
 
 /**
@@ -275,10 +247,10 @@ cleanup_handle (struct RequestHandle *handle)
   struct GNUNET_RECLAIM_ATTRIBUTE_ClaimListEntry *claim_tmp;
   struct EgoEntry *ego_entry;
   struct EgoEntry *ego_tmp;
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Cleaning up\n");
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Cleaning up\n");
   if (NULL != handle->resp_object)
-    GNUNET_JSONAPI_document_delete (handle->resp_object);
+    json_decref (handle->resp_object);
   if (NULL != handle->timeout_task)
     GNUNET_SCHEDULER_cancel (handle->timeout_task);
   if (NULL != handle->identity_handle)
@@ -293,22 +265,18 @@ cleanup_handle (struct RequestHandle *handle)
     GNUNET_free (handle->url);
   if (NULL != handle->emsg)
     GNUNET_free (handle->emsg);
-  if (NULL != handle->namestore_handle)
-    GNUNET_NAMESTORE_disconnect (handle->namestore_handle);
-  if ( NULL != handle->attr_list )
+  if (NULL != handle->attr_list)
   {
-    for (claim_entry = handle->attr_list->list_head;
-    NULL != claim_entry;)
+    for (claim_entry = handle->attr_list->list_head; NULL != claim_entry;)
     {
       claim_tmp = claim_entry;
       claim_entry = claim_entry->next;
-      GNUNET_free(claim_tmp->claim);
-      GNUNET_free(claim_tmp);
+      GNUNET_free (claim_tmp->claim);
+      GNUNET_free (claim_tmp);
     }
     GNUNET_free (handle->attr_list);
   }
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;)
+  for (ego_entry = handle->ego_head; NULL != ego_entry;)
   {
     ego_tmp = ego_entry;
     ego_entry = ego_entry->next;
@@ -316,13 +284,10 @@ cleanup_handle (struct RequestHandle *handle)
     GNUNET_free (ego_tmp->keystring);
     GNUNET_free (ego_tmp);
   }
-  if (NULL != handle->attr_it)
-  {
-    GNUNET_free(handle->attr_it);
-  }
   GNUNET_free (handle);
 }
 
+
 static void
 cleanup_handle_delayed (void *cls)
 {
@@ -342,9 +307,8 @@ do_error (void *cls)
   struct MHD_Response *resp;
   char *json_error;
 
-  GNUNET_asprintf (&json_error, "{ \"error\" : \"%s\" }",
-                  handle->emsg);
-  if ( 0 == handle->response_code )
+  GNUNET_asprintf (&json_error, "{ \"error\" : \"%s\" }", handle->emsg);
+  if (0 == handle->response_code)
   {
     handle->response_code = MHD_HTTP_BAD_REQUEST;
   }
@@ -379,10 +343,9 @@ collect_error_cb (void *cls)
   do_error (handle);
 }
 
+
 static void
-finished_cont (void *cls,
-               int32_t success,
-               const char *emsg)
+finished_cont (void *cls, int32_t success, const char *emsg)
 {
   struct RequestHandle *handle = cls;
   struct MHD_Response *resp;
@@ -406,11 +369,11 @@ finished_cont (void *cls,
 static void
 return_response (void *cls)
 {
-  charresult_str;
+  char *result_str;
   struct RequestHandle *handle = cls;
   struct MHD_Response *resp;
 
-  GNUNET_JSONAPI_document_serialize (handle->resp_object, &result_str);
+  result_str = json_dumps (handle->resp_object, 0);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Result %s\n", result_str);
   resp = GNUNET_REST_create_response (result_str);
   handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
@@ -418,11 +381,13 @@ return_response (void *cls)
   cleanup_handle (handle);
 }
 
+
 static void
 collect_finished_cb (void *cls)
 {
   struct RequestHandle *handle = cls;
-  //Done
+
+  // Done
   handle->attr_it = NULL;
   handle->ticket_it = NULL;
   GNUNET_SCHEDULER_add_now (&return_response, handle);
@@ -434,51 +399,41 @@ collect_finished_cb (void *cls)
  *
  */
 static void
-ticket_collect (void *cls,
-                const struct GNUNET_RECLAIM_Ticket *ticket)
+ticket_collect (void *cls, const struct GNUNET_RECLAIM_Ticket *ticket)
 {
-  struct GNUNET_JSONAPI_Resource *json_resource;
+  json_t *json_resource;
   struct RequestHandle *handle = cls;
   json_t *value;
-  chartmp;
+  char *tmp;
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding ticket\n");
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
-                                             sizeof (uint64_t));
-  json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_IDENTITY_TICKET,
-                                                       tmp);
+  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd, sizeof(uint64_t));
+  json_resource = json_object ();
   GNUNET_free (tmp);
-  GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
+  json_array_append (handle->resp_object, json_resource);
 
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
-                                             sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+  tmp =
+    GNUNET_STRINGS_data_to_string_alloc (&ticket->identity,
+                                         sizeof(struct
+                                                GNUNET_CRYPTO_EcdsaPublicKey));
   value = json_string (tmp);
-  GNUNET_JSONAPI_resource_add_attr (json_resource,
-                                    "issuer",
-                                    value);
+  json_object_set_new (json_resource, "issuer", value);
   GNUNET_free (tmp);
-  json_decref (value);
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
-                                             sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
+  tmp =
+    GNUNET_STRINGS_data_to_string_alloc (&ticket->audience,
+                                         sizeof(struct
+                                                GNUNET_CRYPTO_EcdsaPublicKey));
   value = json_string (tmp);
-  GNUNET_JSONAPI_resource_add_attr (json_resource,
-                                    "audience",
-                                    value);
+  json_object_set_new (json_resource, "audience", value);
   GNUNET_free (tmp);
-  json_decref (value);
-  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd,
-                                             sizeof (uint64_t));
+  tmp = GNUNET_STRINGS_data_to_string_alloc (&ticket->rnd, sizeof(uint64_t));
   value = json_string (tmp);
-  GNUNET_JSONAPI_resource_add_attr (json_resource,
-                                    "rnd",
-                                    value);
+  json_object_set_new (json_resource, "rnd", value);
   GNUNET_free (tmp);
-  json_decref (value);
   GNUNET_RECLAIM_ticket_iteration_next (handle->ticket_it);
 }
 
 
-
 /**
  * List tickets for identity request
  *
@@ -488,7 +443,7 @@ ticket_collect (void *cls,
  */
 static void
 list_tickets_cont (struct GNUNET_REST_RequestHandle *con_handle,
-                   const charurl,
+                   const char *url,
                    void *cls)
 {
   const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
@@ -496,10 +451,10 @@ list_tickets_cont (struct GNUNET_REST_RequestHandle *con_handle,
   struct EgoEntry *ego_entry;
   char *identity;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting tickets for %s.\n",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Getting tickets for %s.\n",
               handle->url);
-  if ( strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) >=
-       strlen (handle->url))
+  if (strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) >= strlen (handle->url))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
     GNUNET_SCHEDULER_add_now (&do_error, handle);
@@ -507,66 +462,54 @@ list_tickets_cont (struct GNUNET_REST_RequestHandle *con_handle,
   }
   identity = handle->url + strlen (GNUNET_REST_API_NS_IDENTITY_TICKETS) + 1;
 
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
     if (0 == strcmp (identity, ego_entry->identifier))
       break;
-  handle->resp_object = GNUNET_JSONAPI_document_new ();
+  handle->resp_object = json_array ();
 
   if (NULL == ego_entry)
   {
-    //Done
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
-                identity);
+    // Done
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n", identity);
     GNUNET_SCHEDULER_add_now (&return_response, handle);
     return;
   }
   priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
   handle->idp = GNUNET_RECLAIM_connect (cfg);
-  handle->ticket_it = GNUNET_RECLAIM_ticket_iteration_start (handle->idp,
-                                                                       priv_key,
-                                                                       &collect_error_cb,
-                                                                       handle,
-                                                                       &ticket_collect,
-                                                                       handle,
-                                                                       &collect_finished_cb,
-                                                                       handle);
+  handle->ticket_it =
+    GNUNET_RECLAIM_ticket_iteration_start (handle->idp,
+                                           priv_key,
+                                           &collect_error_cb,
+                                           handle,
+                                           &ticket_collect,
+                                           handle,
+                                           &collect_finished_cb,
+                                           handle);
 }
 
 
 static void
 add_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
-                    const charurl,
+                    const char *url,
                     void *cls)
 {
   const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
-  const char* identity;
-  const char* name_str;
-  const char* value_str;
-  const char* exp_str;
-
+  const char *identity;
   struct RequestHandle *handle = cls;
   struct EgoEntry *ego_entry;
-  struct MHD_Response *resp;
   struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attribute;
-  struct GNUNET_JSONAPI_Document *json_obj;
-  struct GNUNET_JSONAPI_Resource *json_res;
   struct GNUNET_TIME_Relative exp;
-  char term_data[handle->rest_handle->data_size+1];
-  json_t *value_json;
+  char term_data[handle->rest_handle->data_size + 1];
   json_t *data_json;
-  json_t *exp_json;
   json_error_t err;
-  struct GNUNET_JSON_Specification docspec[] = {
-    GNUNET_JSON_spec_jsonapi_document (&json_obj),
-    GNUNET_JSON_spec_end()
-  };
+  struct GNUNET_JSON_Specification attrspec[] =
+  { GNUNET_RECLAIM_JSON_spec_claim (&attribute), GNUNET_JSON_spec_end () };
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding an attribute for %s.\n",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Adding an attribute for %s.\n",
               handle->url);
-  if ( strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) >=
-       strlen (handle->url))
+  if (strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) >= strlen (handle->url))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
     GNUNET_SCHEDULER_add_now (&do_error, handle);
@@ -574,17 +517,14 @@ add_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
   }
   identity = handle->url + strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) + 1;
 
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
     if (0 == strcmp (identity, ego_entry->identifier))
       break;
 
   if (NULL == ego_entry)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Identity unknown (%s)\n", identity);
-    GNUNET_JSONAPI_document_delete (json_obj);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Identity unknown (%s)\n", identity);
     return;
   }
   identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
@@ -599,75 +539,36 @@ add_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
   GNUNET_memcpy (term_data,
                  handle->rest_handle->data,
                  handle->rest_handle->data_size);
-  data_json = json_loads (term_data,
-                          JSON_DECODE_ANY,
-                          &err);
+  data_json = json_loads (term_data, JSON_DECODE_ANY, &err);
   GNUNET_assert (GNUNET_OK ==
-                 GNUNET_JSON_parse (data_json, docspec,
-                                    NULL, NULL));
+                 GNUNET_JSON_parse (data_json, attrspec, NULL, NULL));
   json_decref (data_json);
-  if (NULL == json_obj)
+  if (NULL == attribute)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unable to parse JSONAPI Object from %s\n",
+                "Unable to parse attribute from %s\n",
                 term_data);
     GNUNET_SCHEDULER_add_now (&do_error, handle);
     return;
   }
-  if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Cannot create more than 1 resource! (Got %d)\n",
-                GNUNET_JSONAPI_document_resource_count (json_obj));
-    GNUNET_JSONAPI_document_delete (json_obj);
-    GNUNET_SCHEDULER_add_now (&do_error, handle);
-    return;
-  }
-  json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
-  if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
-                                                       GNUNET_REST_JSONAPI_RECLAIM_ATTRIBUTE))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unsupported JSON data type\n");
-    GNUNET_JSONAPI_document_delete (json_obj);
-    resp = GNUNET_REST_create_response (NULL);
-    handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
-    cleanup_handle (handle);
-    return;
-  }
-  name_str = GNUNET_JSONAPI_resource_get_id (json_res);
-  exp_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                "exp");
-  exp_str = json_string_value (exp_json);
-  if (NULL == exp_str) {
-    exp = GNUNET_TIME_UNIT_HOURS;
-  } else {
-    if (GNUNET_OK != GNUNET_STRINGS_fancy_time_to_relative (exp_str,
-                                           &exp)) {
-      exp = GNUNET_TIME_UNIT_HOURS;
-    }
-  }
-
-  value_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                  "value");
-  value_str = json_string_value (value_json);
-  attribute = GNUNET_RECLAIM_ATTRIBUTE_claim_new (name_str,
-                                                      GNUNET_RECLAIM_ATTRIBUTE_TYPE_STRING,
-                                                      value_str,
-                                                      strlen (value_str) + 1);
+  /**
+   * New ID for attribute
+   */
+  if (0 == attribute->id)
+    attribute->id =
+      GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_STRONG, UINT64_MAX);
   handle->idp = GNUNET_RECLAIM_connect (cfg);
+  exp = GNUNET_TIME_UNIT_HOURS;
   handle->idp_op = GNUNET_RECLAIM_attribute_store (handle->idp,
-                                                             identity_priv,
-                                                             attribute,
-                                                             &exp,
-                                                             &finished_cont,
-                                                             handle);
-  GNUNET_free (attribute);
-  GNUNET_JSONAPI_document_delete (json_obj);
+                                                   identity_priv,
+                                                   attribute,
+                                                   &exp,
+                                                   &finished_cont,
+                                                   handle);
+  GNUNET_JSON_parse_free (attrspec);
 }
 
 
-
 /**
  * Collect all attributes for an ego
  *
@@ -677,39 +578,38 @@ attr_collect (void *cls,
               const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
               const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr)
 {
-  struct GNUNET_JSONAPI_Resource *json_resource;
   struct RequestHandle *handle = cls;
-  json_t *value;
-  char* tmp_value;
-  
+  json_t *attr_obj;
+  const char *type;
+  char *tmp_value;
+  char *id_str;
+
   if ((NULL == attr->name) || (NULL == attr->data))
   {
     GNUNET_RECLAIM_get_attributes_next (handle->attr_it);
     return;
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
-              attr->name);
-  json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_RECLAIM_ATTRIBUTE,
-                                               attr->name);
-  GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n", attr->name);
 
   tmp_value = GNUNET_RECLAIM_ATTRIBUTE_value_to_string (attr->type,
-                                           attr->data,
-                                           attr->data_size);
-
-  value = json_string (tmp_value);
-
-  GNUNET_JSONAPI_resource_add_attr (json_resource,
-                                    "value",
-                                    value);
-  json_decref (value);
-  GNUNET_free(tmp_value);
+                                                        attr->data,
+                                                        attr->data_size);
+
+  attr_obj = json_object ();
+  json_object_set_new (attr_obj, "value", json_string (tmp_value));
+  json_object_set_new (attr_obj, "name", json_string (attr->name));
+  type = GNUNET_RECLAIM_ATTRIBUTE_number_to_typename (attr->type);
+  json_object_set_new (attr_obj, "type", json_string (type));
+  id_str = GNUNET_STRINGS_data_to_string_alloc (&attr->id, sizeof(uint64_t));
+  json_object_set_new (attr_obj, "id", json_string (id_str));
+  json_array_append (handle->resp_object, attr_obj);
+  json_decref (attr_obj);
+  GNUNET_free (tmp_value);
   GNUNET_RECLAIM_get_attributes_next (handle->attr_it);
 }
 
 
-
 /**
  * List attributes for identity request
  *
@@ -719,7 +619,7 @@ attr_collect (void *cls,
  */
 static void
 list_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
-                     const charurl,
+                     const char *url,
                      void *cls)
 {
   const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
@@ -727,10 +627,10 @@ list_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
   struct EgoEntry *ego_entry;
   char *identity;
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Getting attributes for %s.\n",
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Getting attributes for %s.\n",
               handle->url);
-  if ( strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) >=
-       strlen (handle->url))
+  if (strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) >= strlen (handle->url))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
     GNUNET_SCHEDULER_add_now (&do_error, handle);
@@ -738,62 +638,131 @@ list_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
   }
   identity = handle->url + strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) + 1;
 
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
     if (0 == strcmp (identity, ego_entry->identifier))
       break;
-  handle->resp_object = GNUNET_JSONAPI_document_new ();
+  handle->resp_object = json_array ();
 
 
   if (NULL == ego_entry)
   {
-    //Done
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n",
-                identity);
+    // Done
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n", identity);
     GNUNET_SCHEDULER_add_now (&return_response, handle);
     return;
   }
   priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
   handle->idp = GNUNET_RECLAIM_connect (cfg);
   handle->attr_it = GNUNET_RECLAIM_get_attributes_start (handle->idp,
-                                                                   priv_key,
-                                                                   &collect_error_cb,
-                                                                   handle,
-                                                                   &attr_collect,
-                                                                   handle,
-                                                                   &collect_finished_cb,
-                                                                   handle);
+                                                         priv_key,
+                                                         &collect_error_cb,
+                                                         handle,
+                                                         &attr_collect,
+                                                         handle,
+                                                         &collect_finished_cb,
+                                                         handle);
+}
+
+
+static void
+delete_finished_cb (void *cls, int32_t success, const char *emsg)
+{
+  struct RequestHandle *handle = cls;
+  struct MHD_Response *resp;
+
+  resp = GNUNET_REST_create_response (emsg);
+  if (GNUNET_OK != success)
+  {
+    GNUNET_SCHEDULER_add_now (&do_error, handle);
+    return;
+  }
+  handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
+  GNUNET_SCHEDULER_add_now (&cleanup_handle_delayed, handle);
+}
+
+
+/**
+ * List attributes for identity request
+ *
+ * @param con_handle the connection handle
+ * @param url the url
+ * @param cls the RequestHandle
+ */
+static void
+delete_attribute_cont (struct GNUNET_REST_RequestHandle *con_handle,
+                       const char *url,
+                       void *cls)
+{
+  const struct GNUNET_CRYPTO_EcdsaPrivateKey *priv_key;
+  struct RequestHandle *handle = cls;
+  struct GNUNET_RECLAIM_ATTRIBUTE_Claim attr;
+  struct EgoEntry *ego_entry;
+  char *identity_id_str;
+  char *identity;
+  char *id;
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Deleting attributes.\n");
+  if (strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) >= strlen (handle->url))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "No identity given.\n");
+    GNUNET_SCHEDULER_add_now (&do_error, handle);
+    return;
+  }
+  identity_id_str =
+    strdup (handle->url + strlen (GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES) + 1);
+  identity = strtok (identity_id_str, "/");
+  id = strtok (NULL, "/");
+  if ((NULL == identity) || (NULL == id))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Malformed request.\n");
+    GNUNET_free (identity_id_str);
+    GNUNET_SCHEDULER_add_now (&do_error, handle);
+    return;
+  }
+
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
+       ego_entry = ego_entry->next)
+    if (0 == strcmp (identity, ego_entry->identifier))
+      break;
+  handle->resp_object = json_array ();
+  if (NULL == ego_entry)
+  {
+    // Done
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Ego %s not found.\n", identity);
+    GNUNET_free (identity_id_str);
+    GNUNET_SCHEDULER_add_now (&return_response, handle);
+    return;
+  }
+  priv_key = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
+  handle->idp = GNUNET_RECLAIM_connect (cfg);
+  memset (&attr, 0, sizeof(struct GNUNET_RECLAIM_ATTRIBUTE_Claim));
+  GNUNET_STRINGS_string_to_data (id, strlen (id), &attr.id, sizeof(uint64_t));
+  attr.name = "";
+  handle->idp_op = GNUNET_RECLAIM_attribute_delete (handle->idp,
+                                                    priv_key,
+                                                    &attr,
+                                                    &delete_finished_cb,
+                                                    handle);
+  GNUNET_free (identity_id_str);
 }
 
 
 static void
 revoke_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
-                    const charurl,
+                    const char *url,
                     void *cls)
 {
   const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
-  const char* identity_str;
-  const char* audience_str;
-  const char* rnd_str;
-
   struct RequestHandle *handle = cls;
   struct EgoEntry *ego_entry;
-  struct MHD_Response *resp;
-  struct GNUNET_RECLAIM_Ticket ticket;
-  struct GNUNET_JSONAPI_Document *json_obj;
-  struct GNUNET_JSONAPI_Resource *json_res;
+  struct GNUNET_RECLAIM_Ticket *ticket = NULL;
   struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
-  char term_data[handle->rest_handle->data_size+1];
-  json_t *rnd_json;
-  json_t *identity_json;
-  json_t *audience_json;
+  char term_data[handle->rest_handle->data_size + 1];
   json_t *data_json;
   json_error_t err;
-  struct GNUNET_JSON_Specification docspec[] = {
-    GNUNET_JSON_spec_jsonapi_document (&json_obj),
-    GNUNET_JSON_spec_end()
-  };
+  struct GNUNET_JSON_Specification tktspec[] =
+  { GNUNET_RECLAIM_JSON_spec_ticket (&ticket), GNUNET_JSON_spec_end () };
 
   if (0 >= handle->rest_handle->data_size)
   {
@@ -805,101 +774,61 @@ revoke_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
   GNUNET_memcpy (term_data,
                  handle->rest_handle->data,
                  handle->rest_handle->data_size);
-  data_json = json_loads (term_data,
-                          JSON_DECODE_ANY,
-                          &err);
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_JSON_parse (data_json, docspec,
-                                    NULL, NULL));
-  json_decref (data_json);
-  if (NULL == json_obj)
+  data_json = json_loads (term_data, JSON_DECODE_ANY, &err);
+  if ((NULL == data_json) ||
+      (GNUNET_OK != GNUNET_JSON_parse (data_json, tktspec, NULL, NULL)))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unable to parse JSONAPI Object from %s\n",
-                term_data);
+    handle->emsg = GNUNET_strdup ("Not a ticket!\n");
     GNUNET_SCHEDULER_add_now (&do_error, handle);
+    GNUNET_JSON_parse_free (tktspec);
+    if (NULL != data_json)
+      json_decref (data_json);
     return;
   }
-  if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
+  json_decref (data_json);
+  if (NULL == ticket)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Cannot create more than 1 resource! (Got %d)\n",
-                GNUNET_JSONAPI_document_resource_count (json_obj));
-    GNUNET_JSONAPI_document_delete (json_obj);
+                "Unable to parse ticket from %s\n",
+                term_data);
     GNUNET_SCHEDULER_add_now (&do_error, handle);
     return;
   }
-  json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
-  if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
-                                                       GNUNET_REST_JSONAPI_IDENTITY_TICKET))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unsupported JSON data type\n");
-    GNUNET_JSONAPI_document_delete (json_obj);
-    resp = GNUNET_REST_create_response (NULL);
-    handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
-    cleanup_handle (handle);
-    return;
-  }
-  rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                "rnd");
-  identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                     "issuer");
-  audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                     "audience");
-  rnd_str = json_string_value (rnd_json);
-  identity_str = json_string_value (identity_json);
-  audience_str = json_string_value (audience_json);
-
-  GNUNET_STRINGS_string_to_data (rnd_str,
-                                 strlen (rnd_str),
-                                 &ticket.rnd,
-                                 sizeof (uint64_t));
-  GNUNET_STRINGS_string_to_data (identity_str,
-                                 strlen (identity_str),
-                                 &ticket.identity,
-                                 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-  GNUNET_STRINGS_string_to_data (audience_str,
-                                 strlen (audience_str),
-                                 &ticket.audience,
-                                 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;
+
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
   {
-    GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
-                                        &tmp_pk);
-    if (0 == memcmp (&ticket.identity,
+    GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &tmp_pk);
+    if (0 == memcmp (&ticket->identity,
                      &tmp_pk,
-                     sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+                     sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
       break;
   }
   if (NULL == ego_entry)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Identity unknown (%s)\n", identity_str);
-    GNUNET_JSONAPI_document_delete (json_obj);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Identity unknown\n");
+    GNUNET_JSON_parse_free (tktspec);
     return;
   }
   identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
 
   handle->idp = GNUNET_RECLAIM_connect (cfg);
   handle->idp_op = GNUNET_RECLAIM_ticket_revoke (handle->idp,
-                                                           identity_priv,
-                                                           &ticket,
-                                                           &finished_cont,
-                                                           handle);
-  GNUNET_JSONAPI_document_delete (json_obj);
+                                                 identity_priv,
+                                                 ticket,
+                                                 &finished_cont,
+                                                 handle);
+  GNUNET_JSON_parse_free (tktspec);
 }
 
+
 static void
 consume_cont (void *cls,
               const struct GNUNET_CRYPTO_EcdsaPublicKey *identity,
               const struct GNUNET_RECLAIM_ATTRIBUTE_Claim *attr)
 {
   struct RequestHandle *handle = cls;
-  struct GNUNET_JSONAPI_Resource *json_resource;
+  char *val_str;
   json_t *value;
 
   if (NULL == identity)
@@ -908,46 +837,39 @@ consume_cont (void *cls,
     return;
   }
 
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n",
-              attr->name);
-  json_resource = GNUNET_JSONAPI_resource_new (GNUNET_REST_JSONAPI_RECLAIM_ATTRIBUTE,
-                                               attr->name);
-  GNUNET_JSONAPI_document_resource_add (handle->resp_object, json_resource);
-
-  value = json_string (attr->data);
-  GNUNET_JSONAPI_resource_add_attr (json_resource,
-                                    "value",
-                                    value);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Adding attribute: %s\n", attr->name);
+  val_str = GNUNET_RECLAIM_ATTRIBUTE_value_to_string (attr->type,
+                                                      attr->data,
+                                                      attr->data_size);
+  if (NULL == val_str)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Failed to parse value for: %s\n",
+                attr->name);
+    return;
+  }
+  value = json_string (val_str);
+  json_object_set_new (handle->resp_object, attr->name, value);
   json_decref (value);
+  GNUNET_free (val_str);
 }
 
+
 static void
 consume_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
-                     const charurl,
+                     const char *url,
                      void *cls)
 {
   const struct GNUNET_CRYPTO_EcdsaPrivateKey *identity_priv;
-  const char* identity_str;
-  const char* audience_str;
-  const char* rnd_str;
-
   struct RequestHandle *handle = cls;
   struct EgoEntry *ego_entry;
-  struct MHD_Response *resp;
-  struct GNUNET_RECLAIM_Ticket ticket;
-  struct GNUNET_JSONAPI_Document *json_obj;
-  struct GNUNET_JSONAPI_Resource *json_res;
+  struct GNUNET_RECLAIM_Ticket *ticket;
   struct GNUNET_CRYPTO_EcdsaPublicKey tmp_pk;
-  char term_data[handle->rest_handle->data_size+1];
-  json_t *rnd_json;
-  json_t *identity_json;
-  json_t *audience_json;
+  char term_data[handle->rest_handle->data_size + 1];
   json_t *data_json;
   json_error_t err;
-  struct GNUNET_JSON_Specification docspec[] = {
-    GNUNET_JSON_spec_jsonapi_document (&json_obj),
-    GNUNET_JSON_spec_end()
-  };
+  struct GNUNET_JSON_Specification tktspec[] =
+  { GNUNET_RECLAIM_JSON_spec_ticket (&ticket), GNUNET_JSON_spec_end () };
 
   if (0 >= handle->rest_handle->data_size)
   {
@@ -959,96 +881,50 @@ consume_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
   GNUNET_memcpy (term_data,
                  handle->rest_handle->data,
                  handle->rest_handle->data_size);
-  data_json = json_loads (term_data,
-                          JSON_DECODE_ANY,
-                          &err);
-  GNUNET_assert (GNUNET_OK ==
-                 GNUNET_JSON_parse (data_json, docspec,
-                                    NULL, NULL));
-  json_decref (data_json);
-  if (NULL == json_obj)
+  data_json = json_loads (term_data, JSON_DECODE_ANY, &err);
+  if (NULL == data_json)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unable to parse JSONAPI Object from %s\n",
+                "Unable to parse JSON Object from %s\n",
                 term_data);
     GNUNET_SCHEDULER_add_now (&do_error, handle);
     return;
   }
-  if (1 != GNUNET_JSONAPI_document_resource_count (json_obj))
+  if (GNUNET_OK != GNUNET_JSON_parse (data_json, tktspec, NULL, NULL))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Cannot create more than 1 resource! (Got %d)\n",
-                GNUNET_JSONAPI_document_resource_count (json_obj));
-    GNUNET_JSONAPI_document_delete (json_obj);
+    handle->emsg = GNUNET_strdup ("Not a ticket!\n");
     GNUNET_SCHEDULER_add_now (&do_error, handle);
+    GNUNET_JSON_parse_free (tktspec);
+    json_decref (data_json);
     return;
   }
-  json_res = GNUNET_JSONAPI_document_get_resource (json_obj, 0);
-  if (GNUNET_NO == GNUNET_JSONAPI_resource_check_type (json_res,
-                                                       GNUNET_REST_JSONAPI_IDENTITY_TICKET))
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unsupported JSON data type\n");
-    GNUNET_JSONAPI_document_delete (json_obj);
-    resp = GNUNET_REST_create_response (NULL);
-    handle->proc (handle->proc_cls, resp, MHD_HTTP_CONFLICT);
-    cleanup_handle (handle);
-    return;
-  }
-  rnd_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                "rnd");
-  identity_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                     "identity");
-  audience_json = GNUNET_JSONAPI_resource_read_attr (json_res,
-                                                     "audience");
-  rnd_str = json_string_value (rnd_json);
-  identity_str = json_string_value (identity_json);
-  audience_str = json_string_value (audience_json);
-
-  GNUNET_STRINGS_string_to_data (rnd_str,
-                                 strlen (rnd_str),
-                                 &ticket.rnd,
-                                 sizeof (uint64_t));
-  GNUNET_STRINGS_string_to_data (identity_str,
-                                 strlen (identity_str),
-                                 &ticket.identity,
-                                 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-  GNUNET_STRINGS_string_to_data (audience_str,
-                                 strlen (audience_str),
-                                 &ticket.audience,
-                                 sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey));
-
-  for (ego_entry = handle->ego_head;
-       NULL != ego_entry;
+  for (ego_entry = handle->ego_head; NULL != ego_entry;
        ego_entry = ego_entry->next)
   {
-    GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego,
-                                        &tmp_pk);
-    if (0 == memcmp (&ticket.audience,
+    GNUNET_IDENTITY_ego_get_public_key (ego_entry->ego, &tmp_pk);
+    if (0 == memcmp (&ticket->audience,
                      &tmp_pk,
-                     sizeof (struct GNUNET_CRYPTO_EcdsaPublicKey)))
+                     sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)))
       break;
   }
   if (NULL == ego_entry)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Identity unknown (%s)\n", identity_str);
-    GNUNET_JSONAPI_document_delete (json_obj);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Identity unknown\n");
+    GNUNET_JSON_parse_free (tktspec);
     return;
   }
   identity_priv = GNUNET_IDENTITY_ego_get_private_key (ego_entry->ego);
-  handle->resp_object = GNUNET_JSONAPI_document_new ();
+  handle->resp_object = json_object ();
   handle->idp = GNUNET_RECLAIM_connect (cfg);
   handle->idp_op = GNUNET_RECLAIM_ticket_consume (handle->idp,
-                                                            identity_priv,
-                                                            &ticket,
-                                                            &consume_cont,
-                                                            handle);
-  GNUNET_JSONAPI_document_delete (json_obj);
+                                                  identity_priv,
+                                                  ticket,
+                                                  &consume_cont,
+                                                  handle);
+  GNUNET_JSON_parse_free (tktspec);
 }
 
 
-
 /**
  * Respond to OPTIONS request
  *
@@ -1058,22 +934,21 @@ consume_ticket_cont (struct GNUNET_REST_RequestHandle *con_handle,
  */
 static void
 options_cont (struct GNUNET_REST_RequestHandle *con_handle,
-              const charurl,
+              const char *url,
               void *cls)
 {
   struct MHD_Response *resp;
   struct RequestHandle *handle = cls;
 
-  //For now, independent of path return all options
+  // For now, independent of path return all options
   resp = GNUNET_REST_create_response (NULL);
-  MHD_add_response_header (resp,
-                           "Access-Control-Allow-Methods",
-                           allow_methods);
+  MHD_add_response_header (resp, "Access-Control-Allow-Methods", allow_methods);
   handle->proc (handle->proc_cls, resp, MHD_HTTP_OK);
   cleanup_handle (handle);
   return;
 }
 
+
 /**
  * Handle rest request
  *
@@ -1083,27 +958,37 @@ static void
 init_cont (struct RequestHandle *handle)
 {
   struct GNUNET_REST_RequestHandlerError err;
-  static const struct GNUNET_REST_RequestHandler handlers[] = {
-    {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES, &list_attribute_cont},
-    {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES, &add_attribute_cont},
-    {MHD_HTTP_METHOD_GET, GNUNET_REST_API_NS_IDENTITY_TICKETS, &list_tickets_cont},
-    {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_REVOKE, &revoke_ticket_cont},
-    {MHD_HTTP_METHOD_POST, GNUNET_REST_API_NS_IDENTITY_CONSUME, &consume_ticket_cont},
-    {MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_RECLAIM,
-      &options_cont},
-    GNUNET_REST_HANDLER_END
-  };
-
-  if (GNUNET_NO == GNUNET_REST_handle_request (handle->rest_handle,
-                                               handlers,
-                                               &err,
-                                               handle))
+  static const struct GNUNET_REST_RequestHandler handlers[] =
+  { { MHD_HTTP_METHOD_GET,
+      GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES,
+      &list_attribute_cont },
+    { MHD_HTTP_METHOD_POST,
+      GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES,
+      &add_attribute_cont },
+    { MHD_HTTP_METHOD_DELETE,
+      GNUNET_REST_API_NS_RECLAIM_ATTRIBUTES,
+      &delete_attribute_cont },
+    { MHD_HTTP_METHOD_GET,
+      GNUNET_REST_API_NS_IDENTITY_TICKETS,
+      &list_tickets_cont },
+    { MHD_HTTP_METHOD_POST,
+      GNUNET_REST_API_NS_IDENTITY_REVOKE,
+      &revoke_ticket_cont },
+    { MHD_HTTP_METHOD_POST,
+      GNUNET_REST_API_NS_IDENTITY_CONSUME,
+      &consume_ticket_cont },
+    { MHD_HTTP_METHOD_OPTIONS, GNUNET_REST_API_NS_RECLAIM, &options_cont },
+    GNUNET_REST_HANDLER_END };
+
+  if (GNUNET_NO ==
+      GNUNET_REST_handle_request (handle->rest_handle, handlers, &err, handle))
   {
     handle->response_code = err.error_code;
     GNUNET_SCHEDULER_add_now (&do_error, handle);
   }
 }
 
+
 /**
  * If listing is enabled, prints information about the egos.
  *
@@ -1153,24 +1038,27 @@ list_ego (void *cls,
     init_cont (handle);
     return;
   }
-  if (ID_REST_STATE_INIT == handle->state) {
+  if (ID_REST_STATE_INIT == handle->state)
+  {
     ego_entry = GNUNET_new (struct EgoEntry);
     GNUNET_IDENTITY_ego_get_public_key (ego, &pk);
-    ego_entry->keystring =
-      GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
+    ego_entry->keystring = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pk);
     ego_entry->ego = ego;
     ego_entry->identifier = GNUNET_strdup (identifier);
-    GNUNET_CONTAINER_DLL_insert_tail(handle->ego_head,handle->ego_tail, ego_entry);
+    GNUNET_CONTAINER_DLL_insert_tail (handle->ego_head,
+                                      handle->ego_tail,
+                                      ego_entry);
   }
-
 }
 
+
 static void
-rest_identity_process_request(struct GNUNET_REST_RequestHandle *rest_handle,
-                              GNUNET_REST_ResultProcessor proc,
-                              void *proc_cls)
+rest_identity_process_request (struct GNUNET_REST_RequestHandle *rest_handle,
+                               GNUNET_REST_ResultProcessor proc,
+                               void *proc_cls)
 {
   struct RequestHandle *handle = GNUNET_new (struct RequestHandle);
+
   handle->response_code = 0;
   handle->timeout = GNUNET_TIME_UNIT_FOREVER_REL;
   handle->proc_cls = proc_cls;
@@ -1179,22 +1067,16 @@ rest_identity_process_request(struct GNUNET_REST_RequestHandle *rest_handle,
   handle->rest_handle = rest_handle;
 
   handle->url = GNUNET_strdup (rest_handle->url);
-  if (handle->url[strlen (handle->url)-1] == '/')
-    handle->url[strlen (handle->url)-1] = '\0';
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Connecting...\n");
-  handle->identity_handle = GNUNET_IDENTITY_connect (cfg,
-                                                     &list_ego,
-                                                     handle);
-  handle->namestore_handle = GNUNET_NAMESTORE_connect (cfg);
+  if (handle->url[strlen (handle->url) - 1] == '/')
+    handle->url[strlen (handle->url) - 1] = '\0';
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connecting...\n");
+  handle->identity_handle = GNUNET_IDENTITY_connect (cfg, &list_ego, handle);
   handle->timeout_task =
-    GNUNET_SCHEDULER_add_delayed (handle->timeout,
-                                  &do_timeout,
-                                  handle);
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              "Connected\n");
+    GNUNET_SCHEDULER_add_delayed (handle->timeout, &do_timeout, handle);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Connected\n");
 }
 
+
 /**
  * Entry point for the plugin.
  *
@@ -1209,8 +1091,8 @@ libgnunet_plugin_rest_reclaim_init (void *cls)
 
   cfg = cls;
   if (NULL != plugin.cfg)
-    return NULL;                /* can only initialize once! */
-  memset (&plugin, 0, sizeof (struct Plugin));
+    return NULL; /* can only initialize once! */
+  memset (&plugin, 0, sizeof(struct Plugin));
   plugin.cfg = cfg;
   api = GNUNET_new (struct GNUNET_REST_Plugin);
   api->cls = &plugin;
@@ -1225,7 +1107,7 @@ libgnunet_plugin_rest_reclaim_init (void *cls)
                    MHD_HTTP_METHOD_OPTIONS);
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-              _("Identity Provider REST API initialized\n"));
+              _ ("Identity Provider REST API initialized\n"));
   return api;
 }
 
@@ -1241,6 +1123,7 @@ libgnunet_plugin_rest_reclaim_done (void *cls)
 {
   struct GNUNET_REST_Plugin *api = cls;
   struct Plugin *plugin = api->cls;
+
   plugin->cfg = NULL;
 
   GNUNET_free_non_null (allow_methods);
@@ -1250,4 +1133,5 @@ libgnunet_plugin_rest_reclaim_done (void *cls)
   return NULL;
 }
 
+
 /* end of plugin_rest_reclaim.c */