Make REQUEST_AGPL messages configurable and add handler by default
authorAlessio Vanni <vannilla@firemail.cc>
Wed, 27 May 2020 13:01:30 +0000 (15:01 +0200)
committerChristian Grothoff <christian@grothoff.org>
Wed, 27 May 2020 20:37:08 +0000 (22:37 +0200)
This makes two changes:

* Add a field to `struct GNUNET_OS_ProjectData' containing a URL (as a string)
pointing to the source code of the application.

* If the field is not NULL, add a handler for the REQUEST_AGPL messages
sending the specified URL to the client.

The handler is added both in client-service communications (i.e. local
services that don't make requests to other peers in the network) and in
peer-peer communications (CADET.)  This way, any client (local or remote with
CADET) can request the source code location using a standardized mechanism
instead of writing ad-hoc solutions (unless the service/peer explicitly
specifies a NULL pointer.)

Signed-off-by: Christian Grothoff <christian@grothoff.org>
src/cadet/cadet_api.c
src/include/gnunet_os_lib.h
src/include/gnunet_protocols.h
src/util/os_installation.c
src/util/service.c

index 68bd4c290b8b4c389d73e2f58a8dd41829070a73..3a75266b73e6fd0c2a7bf667b51b4ca0258ab71c 100644 (file)
@@ -994,6 +994,32 @@ GNUNET_CADET_connect (const struct GNUNET_CONFIGURATION_Handle *cfg)
 }
 
 
+/**
+ * Function to return link to AGPL source upon request.
+ *
+ * @param cls closure with the identification of the client
+ * @param msg AGPL request
+ */
+static void
+return_agpl (void *cls, const struct GNUNET_MessageHeader *msg)
+{
+  struct GNUNET_SERVICE_Client *client = cls;
+  struct GNUNET_MQ_Handle *mq;
+  struct GNUNET_MQ_Envelope *env;
+  struct GNUNET_MessageHeader *res;
+  size_t slen;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
+
+  (void) msg;
+  slen = strlen (pd->agpl_url) + 1;
+  env = GNUNET_MQ_msg_extra (res, GNUNET_MESSAGE_TYPE_RESPONSE_AGPL, slen);
+  memcpy (&res[1], GNUNET_AGPL_URL, slen);
+  mq = GNUNET_SERVICE_client_get_mq (client);
+  GNUNET_MQ_send (mq, env);
+  GNUNET_SERVICE_client_continue (client);
+}
+
+
 /**
  * Open a port to receive incomming MQ-based channels.
  *
@@ -1016,6 +1042,7 @@ GNUNET_CADET_open_port (struct GNUNET_CADET_Handle *h,
                         const struct GNUNET_MQ_MessageHandler *handlers)
 {
   struct GNUNET_CADET_Port *p;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
 
   GNUNET_assert (NULL != connects);
   GNUNET_assert (NULL != disconnects);
@@ -1039,7 +1066,9 @@ GNUNET_CADET_open_port (struct GNUNET_CADET_Handle *h,
   p->cls = connects_cls;
   p->window_changes = window_changes;
   p->disconnects = disconnects;
-  p->handlers = GNUNET_MQ_copy_handlers (handlers);
+  p->handlers = (NULL == pd->agpl_url)
+    ? GNUNET_MQ_copy_handlers (handlers)
+    : GNUNET_MQ_copy_handlers2 (handlers, &return_agpl, NULL);
 
   GNUNET_assert (GNUNET_OK == open_port_cb (h, &p->id, p));
   return p;
index a6188c1cae6ef30018f0ce5b70cf6a9b0e1117a5..b583cc493afdb9e2d3e995f8a3731c2442a68f93 100644 (file)
@@ -287,6 +287,14 @@ struct GNUNET_OS_ProjectData
    * If this field is NULL, the path is automatically inferred.
    */
   char *gettext_path;
+
+  /**
+   * URL pointing to the source code of the application.  Required for AGPL.
+   * Setting this to NULL disables the built-in mechanism, but you must
+   * provide it in some other way.  If non-NULL, message type 1 and 2 are
+   * reserved.
+   */
+  char *agpl_url;
 };
 
 
index 3b05fb8bb915e43f297fd797db03daf021ba6c51..282bb53d1bbfc1cf9c6d8b658ea690bba27c0bc2 100644 (file)
@@ -50,25 +50,29 @@ extern "C" {
 #endif
 
 /*******************************************************************************
- * UTIL message types
- ******************************************************************************/
+* Deprecated
+*****************************************************************************/
 
 /**
  * Test if service is online.
  *
  * @deprecated!
  */
-#define GNUNET_MESSAGE_TYPE_TEST 1
+#define GNUNET_MESSAGE_TYPE_TEST 0
+
+/*******************************************************************************
+* AGPL source code download
+* *****************************************************************************/
 
 /**
- * Dummy messages for testing / benchmarking.
+ * Message to request source code link.
  */
-#define GNUNET_MESSAGE_TYPE_DUMMY 2
+#define GNUNET_MESSAGE_TYPE_REQUEST_AGPL 1
 
 /**
- * Another dummy messages for testing / benchmarking.
+ * Source code link.
  */
-#define GNUNET_MESSAGE_TYPE_DUMMY2 3
+#define GNUNET_MESSAGE_TYPE_RESPONSE_AGPL 2
 
 /*******************************************************************************
  * RESOLVER message types
@@ -85,18 +89,18 @@ extern "C" {
 #define GNUNET_MESSAGE_TYPE_RESOLVER_RESPONSE 5
 
 /*******************************************************************************
-* AGPL source code download
-*****************************************************************************/
+ * UTIL message types
+ ******************************************************************************/
 
 /**
- * Message to request source code link.
+ * Dummy messages for testing / benchmarking.
  */
-#define GNUNET_MESSAGE_TYPE_REQUEST_AGPL 6
+#define GNUNET_MESSAGE_TYPE_DUMMY 6
 
 /**
- * Source code link.
+ * Another dummy messages for testing / benchmarking.
  */
-#define GNUNET_MESSAGE_TYPE_RESPONSE_AGPL 7
+#define GNUNET_MESSAGE_TYPE_DUMMY2 7
 
 
 /*******************************************************************************
index dcd31dc2ccb39208ccd6f84c8e1c1d9f2e8fe8a7..714df6957bbf736c2c4382bfaf6ae8c1235688f2 100644 (file)
@@ -70,6 +70,7 @@ static const struct GNUNET_OS_ProjectData default_pd = {
   .is_gnu = 1,
   .gettext_domain = PACKAGE,
   .gettext_path = NULL,
+  .agpl_url = GNUNET_AGPL_URL,
 };
 
 /**
index 9dc14eba967486bb4e890d4446cc79e36f4e42f5..ea078b19bd5253b15c1779f6471214e95b25abd1 100644 (file)
@@ -1823,9 +1823,10 @@ return_agpl (void *cls, const struct GNUNET_MessageHeader *msg)
   struct GNUNET_MQ_Envelope *env;
   struct GNUNET_MessageHeader *res;
   size_t slen;
+  const struct GNUNET_OS_ProjectData *pd = GNUNET_OS_project_data_get ();
 
   (void) msg;
-  slen = strlen (GNUNET_AGPL_URL) + 1;
+  slen = strlen (pd->agpl_url) + 1;
   env = GNUNET_MQ_msg_extra (res, GNUNET_MESSAGE_TYPE_RESPONSE_AGPL, slen);
   memcpy (&res[1], GNUNET_AGPL_URL, slen);
   mq = GNUNET_SERVICE_client_get_mq (client);
@@ -2019,7 +2020,9 @@ GNUNET_SERVICE_run_ (int argc,
   sh.connect_cb = connect_cb;
   sh.disconnect_cb = disconnect_cb;
   sh.cb_cls = cls;
-  sh.handlers = GNUNET_MQ_copy_handlers (handlers);
+  sh.handlers = (NULL == pd->agpl_url)
+    ? GNUNET_MQ_copy_handlers (handlers)
+    : GNUNET_MQ_copy_handlers2 (handlers, &return_agpl, NULL);
   sh.service_name = service_name;
   sh.ret = 0;
   /* setup subsystems */