make generated ego key available in continuation when creating egos
authorChristian Grothoff <christian@grothoff.org>
Wed, 8 May 2019 12:54:42 +0000 (14:54 +0200)
committerChristian Grothoff <christian@grothoff.org>
Wed, 8 May 2019 12:54:42 +0000 (14:54 +0200)
doc/man/gnunet-identity.1
src/identity/gnunet-identity.c
src/identity/identity_api.c
src/identity/plugin_rest_identity.c
src/identity/test_identity.c
src/identity/test_identity_defaults.c
src/include/gnunet_identity_service.h

index 0163c895bf08d1aeabc027903a24aadbc69955f3..3f4510d994f2c60f68ac9c5de9230f77c286f0c8 100644 (file)
@@ -65,6 +65,8 @@ Needs to be used together with option
 Print the help page.
 .It d | \-display
 Display all of our egos.
+.It v | \-verbose
+Be verbose, in particular outputs the public key of freshly created egos.
 .It m | \-monitor
 Run in monitor mode, listing all ouf our egos until CTRL-C is pressed.
 Each ego is listed together with a unique pointer value; if egos are renamed, that pointer value remains the same; if egos are deleted, they are listed one more time with a name of "<null>".
index 051f08cd380b8fb3c800baf206798229221a9612..5833057105f7d3ebe747a372c331ba40fe634f43 100644 (file)
@@ -50,6 +50,11 @@ static int list;
  */
 static int monitor;
 
+/**
+ * Was "verbose" specified?
+ */
+static unsigned int verbose;
+
 /**
  * -C option
  */
@@ -164,22 +169,37 @@ delete_finished (void *cls,
  * Creation operation finished.
  *
  * @param cls pointer to operation handle
+ * @param pk private key of the ego, or NULL on error
  * @param emsg error message, NULL on success
  */
 static void
 create_finished (void *cls,
+                const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
                 const char *emsg)
 {
   struct GNUNET_IDENTITY_Operation **op = cls;
 
   *op = NULL;
-  if (NULL != emsg)
+  if (NULL == pk)
   {
     fprintf (stderr,
             _("Failed to create ego: %s\n"),
             emsg);
     global_ret = 1;
   }
+  else if (verbose)
+  {
+    struct GNUNET_CRYPTO_EcdsaPublicKey pub;
+    char *pubs;
+    
+    GNUNET_CRYPTO_ecdsa_key_get_public (pk,
+                                       &pub);
+    pubs = GNUNET_CRYPTO_ecdsa_public_key_to_string (&pub);
+    fprintf (stdout,
+            "%s\n",
+            pubs);
+    GNUNET_free (pubs);
+  }
   test_finished ();
 }
 
@@ -383,7 +403,7 @@ main (int argc, char *const *argv)
                                  "SUBSYSTEM",
                                  gettext_noop ("set default identity to EGO for a subsystem SUBSYSTEM (use together with -e)"),
                                  &set_subsystem),
-
+    GNUNET_GETOPT_option_verbose (&verbose),
     GNUNET_GETOPT_OPTION_END
   };
   int res;
index a058c54266d68d65b0c846d637e2325f92b93bd4..f16500ab5905459bc0bf9a849df6cc85c5a03cfb 100644 (file)
@@ -88,13 +88,24 @@ struct GNUNET_IDENTITY_Operation
 
   /**
    * Continuation to invoke with the result of the transmission; @e cb
-   * will be NULL in this case.
+   * and @e create_cont will be NULL in this case.
    */
   GNUNET_IDENTITY_Continuation cont;
 
+  /**
+   * Continuation to invoke with the result of the transmission; @e cb
+   * and @a cb will be NULL in this case.
+   */
+  GNUNET_IDENTITY_CreateContinuation create_cont;
+
+  /**
+   * Private key to return to @e create_cont, or NULL.
+   */
+  struct GNUNET_CRYPTO_EcdsaPrivateKey *pk;
+  
   /**
    * Continuation to invoke with the result of the transmission for
-   * 'get' operations (@e cont will be NULL in this case).
+   * 'get' operations (@e cont and @a create_cont will be NULL in this case).
    */
   GNUNET_IDENTITY_Callback cb;
 
@@ -259,6 +270,11 @@ reschedule_connect (struct GNUNET_IDENTITY_Handle *h)
               NULL,
               NULL,
               NULL);
+    else if (NULL != op->create_cont)
+      op->create_cont (op->cls,
+                      NULL,
+                      "Failed to communicate with the identity service");
+    GNUNET_free_non_null (op->pk);
     GNUNET_free (op);
   }
   GNUNET_CONTAINER_multihashmap_iterate (h->egos,
@@ -350,6 +366,11 @@ handle_identity_result_code (void *cls,
               str);
   else if (NULL != op->cb)
     op->cb (op->cls, NULL, NULL, NULL);
+  else if (NULL != op->create_cont)
+    op->create_cont (op->cls,
+                    (NULL == str) ? op->pk : NULL,
+                    str);
+  GNUNET_free_non_null (op->pk);
   GNUNET_free (op);
 }
 
@@ -761,7 +782,7 @@ GNUNET_IDENTITY_set (struct GNUNET_IDENTITY_Handle *h,
 struct GNUNET_IDENTITY_Operation *
 GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h,
                        const char *name,
-                       GNUNET_IDENTITY_Continuation cont,
+                       GNUNET_IDENTITY_CreateContinuation cont,
                        void *cont_cls)
 {
   struct GNUNET_IDENTITY_Operation *op;
@@ -780,7 +801,7 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h,
   }
   op = GNUNET_new (struct GNUNET_IDENTITY_Operation);
   op->h = h;
-  op->cont = cont;
+  op->create_cont = cont;
   op->cls = cont_cls;
   GNUNET_CONTAINER_DLL_insert_tail (h->op_head,
                                    h->op_tail,
@@ -792,7 +813,7 @@ GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *h,
   crm->reserved = htons (0);
   pk = GNUNET_CRYPTO_ecdsa_key_create ();
   crm->private_key = *pk;
-  GNUNET_free (pk);
+  op->pk = pk;
   GNUNET_memcpy (&crm[1],
           name,
           slen);
@@ -924,6 +945,12 @@ GNUNET_IDENTITY_cancel (struct GNUNET_IDENTITY_Operation *op)
 {
   op->cont = NULL;
   op->cb = NULL;
+  op->create_cont = NULL;
+  if (NULL != op->pk)
+  {
+    GNUNET_free (op->pk);
+    op->pk = NULL;
+  }
 }
 
 
@@ -957,6 +984,7 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h)
     GNUNET_CONTAINER_DLL_remove (h->op_head,
                                 h->op_tail,
                                 op);
+    GNUNET_free_non_null (op->pk);
     GNUNET_free (op);
   }
   if (NULL != h->mq)
index 89f590d3e223ce2fcdde76c99e8131552894b465..e6537070a248bf919ca44c8bf93cb1e4fa981584 100644 (file)
@@ -641,6 +641,26 @@ do_finished (void *cls, const char *emsg)
 }
 
 
+/**
+ * Processing finished, when creating an ego.
+ *
+ * @param cls request handle
+ * @param private key of the ego, or NULL on error
+ * @param emsg error message
+ */
+static void
+do_finished_create (void *cls,
+                   const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+                   const char *emsg)
+{
+  struct RequestHandle *handle = cls;
+
+  (void) pk;
+  do_finished (handle,
+              emsg);
+}
+
+
 /**
  * Processing edit ego with EgoEntry ego_entry
  *
@@ -1014,7 +1034,7 @@ ego_create (struct GNUNET_REST_RequestHandle *con_handle,
   json_decref (data_js);
   handle->response_code = MHD_HTTP_CREATED;
   handle->op = GNUNET_IDENTITY_create (handle->identity_handle, handle->name,
-                                      &do_finished, handle);
+                                      &do_finished_create, handle);
 }
 
 /**
index cfd759050e064164a31641cbefb5e38e30eb3a24..1633948015ac459eb40b5c5b3bd5b587422b6437 100644 (file)
@@ -253,12 +253,15 @@ success_rename_cont (void *cls,
  * Called with events about created ego.
  *
  * @param cls NULL
+ * @param pk private key of the ego, or NULL on error
  * @param emsg error message
  */
 static void
 create_cb (void *cls,
+          const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
           const char *emsg)
 {
+  GNUNET_assert (NULL != pk);
   GNUNET_assert (NULL == emsg);
   op = GNUNET_IDENTITY_rename (h,
                               "test-id",
index a7559cd949d9b5a251528c8ff61e3e77673bcd4a..bcd75e84ceb077a8937fb11a58620a1348f77609 100644 (file)
@@ -225,13 +225,16 @@ notification_cb (void *cls,
  * Called with events about created ego.
  *
  * @param cls NULL
+ * @param pk private key of the ego, or NULL on error
  * @param emsg error message
  */
 static void
 create_cb (void *cls,
+          const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
           const char *emsg)
 {
   GNUNET_assert (NULL == emsg);
+  GNUNET_assert (NULL != pk);
   op = NULL;
 }
 
index 086f924d673e4f78fab5fc67f6d9448f17b04535..043a7177088ec1ce2fc3742f5aa6ff546e086d20 100644 (file)
@@ -214,6 +214,20 @@ void
 GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h);
 
 
+/**
+ * Function called once the requested operation has
+ * been completed.
+ *
+ * @param cls closure
+ * @param pk private key, NULL on error
+ * @param emsg error message, NULL on success
+ */
+typedef void
+(*GNUNET_IDENTITY_CreateContinuation)(void *cls,
+                                     const struct GNUNET_CRYPTO_EcdsaPrivateKey *pk,
+                                     const char *emsg);
+
+
 /**
  * Create a new ego with the given name.
  *
@@ -226,7 +240,7 @@ GNUNET_IDENTITY_disconnect (struct GNUNET_IDENTITY_Handle *h);
 struct GNUNET_IDENTITY_Operation *
 GNUNET_IDENTITY_create (struct GNUNET_IDENTITY_Handle *id,
                        const char *name,
-                       GNUNET_IDENTITY_Continuation cont,
+                       GNUNET_IDENTITY_CreateContinuation cont,
                        void *cont_cls);