-not all uris are ksks
[oweals/gnunet.git] / src / fs / gnunet-pseudonym.c
index e443d1e32a21f7602f912c877a19f88293ac320f..ce0d24506e2a67bd26a98fe12447c919a8706723 100644 (file)
@@ -1,10 +1,10 @@
 /*
      This file is part of GNUnet.
 /*
      This file is part of GNUnet.
-     (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009 Christian Grothoff (and other contributing authors)
+     (C) 2001, 2002, 2004, 2005, 2006, 2007, 2009, 2010 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
-     by the Free Software Foundation; either version 2, or (at your
+     by the Free Software Foundation; either version 3, or (at your
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
      option) any later version.
 
      GNUnet is distributed in the hope that it will be useful, but
 #include "platform.h"
 #include "gnunet_fs_service.h"
 
 #include "platform.h"
 #include "gnunet_fs_service.h"
 
+/**
+ * -C option
+ */
+static char *create_ns;
+
+/**
+ * -D option
+ */
+static char *delete_ns;
+
+/**
+ * -k option
+ */
+static struct GNUNET_FS_Uri *ksk_uri;
+
+/**
+ * -l option.
+ */
+static int print_local_only;
+
+/**
+ * -m option.
+ */
+static struct GNUNET_CONTAINER_MetaData *adv_metadata;
+
+/**
+ * Our block options (-p, -r, -a).
+ */
+static struct GNUNET_FS_BlockOptions bo = { {0LL}, 1, 365, 1 };
+
+/**
+ * -q option given.
+ */
+static int no_remote_printing;
+
+/**
+ * -r option.
+ */
+static char *root_identifier;
+
+/**
+ * -s option.
+ */
+static char *rating_change;
+
+/**
+ * Handle to fs service.
+ */
+static struct GNUNET_FS_Handle *h;
+
+/**
+ * Namespace we are looking at.
+ */
+static struct GNUNET_FS_Namespace *ns;
+
+/**
+ * Our configuration.
+ */
+static const struct GNUNET_CONFIGURATION_Handle *cfg;
+
 static int ret;
 
 static int ret;
 
+static void *
+progress_cb (void *cls, const struct GNUNET_FS_ProgressInfo *info)
+{
+  return NULL;
+}
+
+
+static void
+ns_printer (void *cls, const char *name, const GNUNET_HashCode * id)
+{
+  struct GNUNET_CRYPTO_HashAsciiEncoded enc;
+
+  GNUNET_CRYPTO_hash_to_enc (id, &enc);
+  fprintf (stdout, "%s (%s)\n", name, (const char *) &enc);
+}
+
+
+static int
+pseudo_printer (void *cls, const GNUNET_HashCode * pseudonym,
+                const struct GNUNET_CONTAINER_MetaData *md, int rating)
+{
+  char *id;
+
+  id = GNUNET_PSEUDONYM_id_to_name (cfg, pseudonym);
+  if (id == NULL)
+  {
+    GNUNET_break (0);
+    return GNUNET_OK;
+  }
+  fprintf (stdout, "%s (%d):\n", id, rating);
+  GNUNET_CONTAINER_meta_data_iterate (md, &EXTRACTOR_meta_data_print, stdout);
+  fprintf (stdout, "\n");
+  GNUNET_free (id);
+  return GNUNET_OK;
+}
+
+
+static void
+post_advertising (void *cls, const struct GNUNET_FS_Uri *uri, const char *emsg)
+{
+  GNUNET_HashCode nsid;
+  char *set;
+  int delta;
+
+  if (emsg != NULL)
+  {
+    fprintf (stderr, "%s", emsg);
+    ret = 1;
+  }
+  if (ns != NULL)
+  {
+    if (GNUNET_OK != GNUNET_FS_namespace_delete (ns, GNUNET_NO))
+      ret = 1;
+  }
+  if (NULL != rating_change)
+  {
+    set = rating_change;
+    while ((*set != '\0') && (*set != ':'))
+      set++;
+    if (*set != ':')
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Invalid argument `%s'\n"),
+                  rating_change);
+    }
+    else
+    {
+      *set = '\0';
+      delta = strtol (&set[1], NULL,    /* no error handling yet */
+                      10);
+      if (GNUNET_OK == GNUNET_PSEUDONYM_name_to_id (cfg, rating_change, &nsid))
+      {
+        (void) GNUNET_PSEUDONYM_rank (cfg, &nsid, delta);
+      }
+      else
+      {
+        GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Namespace `%s' unknown.\n"),
+                    rating_change);
+      }
+    }
+    GNUNET_free (rating_change);
+    rating_change = NULL;
+  }
+  if (0 != print_local_only)
+  {
+    GNUNET_FS_namespace_list (h, &ns_printer, NULL);
+  }
+  else if (0 == no_remote_printing)
+  {
+    GNUNET_PSEUDONYM_list_all (cfg, &pseudo_printer, NULL);
+  }
+  GNUNET_FS_stop (h);
+}
+
+
 /**
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
 /**
  * Main function that will be run by the scheduler.
  *
  * @param cls closure
- * @param sched the scheduler to use
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
  * @param args remaining command-line arguments
  * @param cfgfile name of the configuration file used (for saving, can be NULL!)
- * @param cfg configuration
+ * @param c configuration
  */
 static void
  */
 static void
-run (void *cls,
-     struct GNUNET_SCHEDULER_Handle *sched,
-     char *const *args,
-     const char *cfgfile,
-     const struct GNUNET_CONFIGURATION_Handle *cfg)
+run (void *cls, char *const *args, const char *cfgfile,
+     const struct GNUNET_CONFIGURATION_Handle *c)
 {
 {
-  // FIXME
-}
+  char *emsg;
 
 
+  cfg = c;
+  h = GNUNET_FS_start (cfg, "gnunet-pseudonym", &progress_cb, NULL,
+                       GNUNET_FS_FLAGS_NONE, GNUNET_FS_OPTIONS_END);
+  if (NULL != delete_ns)
+  {
+    ns = GNUNET_FS_namespace_create (h, delete_ns);
+    if (ns == NULL)
+    {
+      ret = 1;
+    }
+    else
+    {
+      if (GNUNET_OK != GNUNET_FS_namespace_delete (ns, GNUNET_YES))
+        ret = 1;
+      ns = NULL;
+    }
+  }
+  if (NULL != create_ns)
+  {
+    ns = GNUNET_FS_namespace_create (h, create_ns);
+    if (ns == NULL)
+    {
+      ret = 1;
+    }
+    else
+    {
+      if (NULL != root_identifier)
+      {
+        if (ksk_uri == NULL)
+        {
+          emsg = NULL;
+          ksk_uri = GNUNET_FS_uri_parse ("gnunet://fs/ksk/namespace", &emsg);
+          GNUNET_assert (NULL == emsg);
+        }
+        GNUNET_FS_namespace_advertise (h, ksk_uri, ns, adv_metadata, &bo,
+                                       root_identifier, &post_advertising,
+                                       NULL);
+        return;
+      }
+      else
+      {
+        if (ksk_uri != NULL)
+          fprintf (stderr, _("Option `%s' ignored\n"), "-k");
+      }
+    }
+  }
+  else
+  {
+    if (root_identifier != NULL)
+      fprintf (stderr, _("Option `%s' ignored\n"), "-r");
+    if (ksk_uri != NULL)
+      fprintf (stderr, _("Option `%s' ignored\n"), "-k");
+  }
 
 
-/**
- * gnunet-pseudonym command line options
- */
-static struct GNUNET_GETOPT_CommandLineOption options[] = {
-  // FIXME: options!
-  GNUNET_GETOPT_OPTION_END
-};
+  post_advertising (NULL, NULL, NULL);
+}
 
 
 /**
 
 
 /**
- * The main function to inspect GNUnet directories.
+ * The main function to manipulate GNUnet pseudonyms (and publish
+ * to namespaces).
  *
  * @param argc number of arguments from the command line
  * @param argv command line arguments
  *
  * @param argc number of arguments from the command line
  * @param argv command line arguments
@@ -66,12 +264,48 @@ static struct GNUNET_GETOPT_CommandLineOption options[] = {
 int
 main (int argc, char *const *argv)
 {
 int
 main (int argc, char *const *argv)
 {
+  static const struct GNUNET_GETOPT_CommandLineOption options[] = {
+    {'a', "anonymity", "LEVEL",
+     gettext_noop ("set the desired LEVEL of sender-anonymity"),
+     1, &GNUNET_GETOPT_set_uint, &bo.anonymity_level},
+    {'C', "create", "NAME",
+     gettext_noop ("create or advertise namespace NAME"),
+     1, &GNUNET_GETOPT_set_string, &create_ns},
+    {'D', "delete", "NAME",
+     gettext_noop ("delete namespace NAME "),
+     1, &GNUNET_GETOPT_set_string, &delete_ns},
+    {'k', "keyword", "VALUE",
+     gettext_noop ("add an additional keyword for the advertisment"
+                   " (this option can be specified multiple times)"),
+     1, &GNUNET_FS_getopt_set_keywords, &ksk_uri},
+    {'m', "meta", "TYPE:VALUE",
+     gettext_noop ("set the meta-data for the given TYPE to the given VALUE"),
+     1, &GNUNET_FS_getopt_set_metadata, &adv_metadata},
+    {'o', "only-local", NULL,
+     gettext_noop ("print names of local namespaces"),
+     0, &GNUNET_GETOPT_set_one, &print_local_only},
+    {'p', "priority", "PRIORITY",
+     gettext_noop ("use the given PRIORITY for the advertisments"),
+     1, &GNUNET_GETOPT_set_uint, &bo.content_priority},
+    {'q', "quiet", NULL,
+     gettext_noop ("do not print names of remote namespaces"),
+     0, &GNUNET_GETOPT_set_one, &no_remote_printing},
+    {'r', "replication", "LEVEL",
+     gettext_noop ("set the desired replication LEVEL"),
+     1, &GNUNET_GETOPT_set_uint, &bo.replication_level},
+    {'R', "root", "ID",
+     gettext_noop ("specify ID of the root of the namespace"),
+     1, &GNUNET_GETOPT_set_string, &root_identifier},
+    {'s', "set-rating", "ID:VALUE",
+     gettext_noop ("change rating of namespace ID by VALUE"),
+     1, &GNUNET_GETOPT_set_string, &rating_change},
+    GNUNET_GETOPT_OPTION_END
+  };
+  bo.expiration_time =
+      GNUNET_FS_year_to_time (GNUNET_FS_get_current_year () + 2);
   return (GNUNET_OK ==
   return (GNUNET_OK ==
-          GNUNET_PROGRAM_run (argc,
-                              argv,
-                              "gnunet-pseudonym",
-                              gettext_noop
-                              ("Manage GNUnet pseudonyms."),
+          GNUNET_PROGRAM_run (argc, argv, "gnunet-pseudonym [OPTIONS]",
+                              gettext_noop ("Manage GNUnet pseudonyms."),
                               options, &run, NULL)) ? ret : 1;
 }
 
                               options, &run, NULL)) ? ret : 1;
 }