[Openvas-commits] r2847 - in trunk/openvas-manager: . src

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Thu Mar 19 17:57:25 CET 2009


Author: mattm
Date: 2009-03-19 17:57:22 +0100 (Thu, 19 Mar 2009)
New Revision: 2847

Modified:
   trunk/openvas-manager/ChangeLog
   trunk/openvas-manager/src/manage.c
   trunk/openvas-manager/src/manage.h
   trunk/openvas-manager/src/omp.c
   trunk/openvas-manager/src/otp.c
Log:
Add per-report directories.  Add initial OMP MODIFY_REPORT.

Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog	2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/ChangeLog	2009-03-19 16:57:22 UTC (rev 2847)
@@ -1,6 +1,23 @@
 2009-03-19  Matthew Mundell <matt at mundell.ukfsn.org>
 
-    Update OTP BYE handling for reconnecting to the server during an OMP
+	Add per-report directories.  Add initial OMP MODIFY_REPORT.
+
+	* src/omp.c (client_state_t): Add MODIFY_REPORT states.
+	(omp_xml_handle_start_element, omp_xml_handle_text): Add MODIFY_REPORT
+	 handling.
+	(omp_xml_handle_end_element): In CLIENT_GET_REPORT get the report from the
+	report's directory.  Add MODIFY_REPORT handling.
+
+	* src/otp.c (save_report): Save report to a dedicated directory.
+
+	* src/manage.h (set_report_parameter): New header.
+
+	* src/manage.c (set_report_parameter): New function.
+	(delete_report): Account for per-report directory.
+
+2009-03-19  Matthew Mundell <matt at mundell.ukfsn.org>
+
+	Update OTP BYE handling for reconnecting to the server during an OMP
 	session.
 
 	* src/openvasmd.c (serve_client): Move session creation and freeing to

Modified: trunk/openvas-manager/src/manage.c
===================================================================
--- trunk/openvas-manager/src/manage.c	2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/manage.c	2009-03-19 16:57:22 UTC (rev 2847)
@@ -147,45 +147,51 @@
   unsigned int id;
   if (sscanf (report_id, "%u", &id) == 1)
     {
-      gchar* base_name;
       static char buffer[11]; /* (expt 2 32) => 4294967296 */
 
       sprintf (buffer, "%010u", id);
-      base_name = g_strdup_printf ("%s.nbe", buffer);
       gchar* link_name;
       link_name = g_build_filename (PREFIX
                                     "/var/lib/openvas/mgr/users/",
                                     current_credentials.username,
                                     "reports",
-                                    base_name,
+                                    buffer,
                                     NULL);
-      g_free (base_name);
       // FIX glib access setuid note
-      if (g_file_test (link_name,
-                       G_FILE_TEST_EXISTS && G_FILE_TEST_IS_SYMLINK))
+      if (g_file_test (link_name, G_FILE_TEST_IS_SYMLINK)
+          && g_file_test (link_name, G_FILE_TEST_IS_DIR))
         {
-          GError* link_error = NULL;
-          gchar* name = g_file_read_link (link_name, &link_error);
-          if (link_error || unlink (name))
+          GError* error = NULL;
+          gchar* name = g_file_read_link (link_name, &error);
+          if (error)
             {
-              if (link_error)
-                {
-                  fprintf (stderr,
-                           "Failed to read report symlink: %s.\n",
-                           link_error->message);
-                  g_error_free (link_error);
-                }
+              fprintf (stderr,
+                       "Failed to read report symlink: %s.\n",
+                       error->message);
+              g_error_free (error);
               g_free (name);
               g_free (link_name);
-              return link_error ? -3 : -4;
+              return -3;
             }
+          else if (rmdir_recursively (name, &error) == FALSE)
+            {
+              fprintf (stderr,
+                       "Failed to remove %s: %s.\n",
+                       name,
+                       error->message);
+              g_error_free (error);
+              g_free (name);
+              g_free (link_name);
+              return -4;
+            }
           else
             {
               if (unlink (link_name))
                 /* Just log the error. */
                 fprintf (stderr,
-                         "Failed to remove report symlink %s.\n",
-                         link_name);
+                         "Failed to remove report symlink %s: %s.\n",
+                         link_name,
+                         strerror (errno));
               g_free (name);
               g_free (link_name);
               return 0;
@@ -198,6 +204,57 @@
     return -1;
 }
 
+/**
+ * @brief Set a report parameter.
+ *
+ * @param[in]  report     The ID of the report.
+ * @param[in]  parameter  The name of the parameter (in any case): COMMENT.
+ * @param[in]  value      The value of the parameter.
+ *
+ * @return 0 success, -1 failed to scan ID, -2 parameter name error,
+ *         -3 failed to write parameter to disk.
+ */
+int
+set_report_parameter (char* report_id, const char* parameter, char* value)
+{
+  tracef ("   set_report_parameter %s %s\n", report_id, parameter);
+  if (strncasecmp ("COMMENT", parameter, 7) == 0)
+    {
+      unsigned int id;
+      if (sscanf (report_id, "%u", &id) == 1)
+        {
+          static char buffer[11]; /* (expt 2 32) => 4294967296 */
+
+          sprintf (buffer, "%010u", id);
+          gchar* name;
+          name = g_build_filename (PREFIX
+                                   "/var/lib/openvas/mgr/users/",
+                                   current_credentials.username,
+                                   "reports",
+                                   buffer,
+                                   "comment",
+                                   NULL);
+          GError* error = NULL;
+          g_file_set_contents (name, value, -1, &error);
+          if (error)
+            {
+              fprintf (stderr,
+                       "Failed to save comment to %s: %s.\n",
+                       name,
+                       error->message);
+              g_free (name);
+              return -3;
+            }
+          g_free (name);
+        }
+      else
+        return -1;
+    }
+  else
+    return -2;
+  return 0;
+}
+
 
 /* Tasks. */
 

Modified: trunk/openvas-manager/src/manage.h
===================================================================
--- trunk/openvas-manager/src/manage.h	2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/manage.h	2009-03-19 16:57:22 UTC (rev 2847)
@@ -60,6 +60,9 @@
 int
 delete_report (const char*);
 
+int
+set_report_parameter (char*, const char*, char*);
+
 
 /* Tasks. */
 

Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c	2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/omp.c	2009-03-19 16:57:22 UTC (rev 2847)
@@ -124,6 +124,10 @@
   CLIENT_GET_REPORT,
   CLIENT_GET_REPORT_ID,
   CLIENT_GET_RULES,
+  CLIENT_MODIFY_REPORT,
+  CLIENT_MODIFY_REPORT_REPORT_ID,
+  CLIENT_MODIFY_REPORT_PARAMETER,
+  CLIENT_MODIFY_REPORT_VALUE,
   CLIENT_MODIFY_TASK,
   CLIENT_MODIFY_TASK_TASK_ID,
   CLIENT_MODIFY_TASK_PARAMETER,
@@ -258,6 +262,8 @@
           set_client_state (CLIENT_GET_REPORT);
         else if (strncasecmp ("GET_RULES", element_name, 9) == 0)
           set_client_state (CLIENT_GET_RULES);
+        else if (strncasecmp ("MODIFY_REPORT", element_name, 13) == 0)
+          set_client_state (CLIENT_MODIFY_REPORT);
         else if (strncasecmp ("MODIFY_TASK", element_name, 11) == 0)
           set_client_state (CLIENT_MODIFY_TASK);
         else if (strncasecmp ("NEW_TASK", element_name, 8) == 0)
@@ -447,6 +453,26 @@
           }
         break;
 
+      case CLIENT_MODIFY_REPORT:
+        if (strncasecmp ("REPORT_ID", element_name, 9) == 0)
+          set_client_state (CLIENT_MODIFY_REPORT_REPORT_ID);
+        else if (strncasecmp ("PARAMETER", element_name, 9) == 0)
+          set_client_state (CLIENT_MODIFY_REPORT_PARAMETER);
+        else if (strncasecmp ("VALUE", element_name, 5) == 0)
+          set_client_state (CLIENT_MODIFY_REPORT_VALUE);
+        else
+          {
+            SEND_TO_CLIENT ("<modify_report_response>"
+                            "<status>402</status>"
+                            "</modify_report_response>");
+            set_client_state (CLIENT_AUTHENTIC);
+            g_set_error (error,
+                         G_MARKUP_ERROR,
+                         G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+                         "Error");
+          }
+        break;
+
       case CLIENT_MODIFY_TASK:
         if (strncasecmp ("TASK_ID", element_name, 7) == 0)
           set_client_state (CLIENT_MODIFY_TASK_TASK_ID);
@@ -1011,20 +1037,18 @@
         if (current_task_task_id
             && sscanf (current_task_task_id, "%u", &id) == 1)
           {
-            gchar* base_name;
             static char buffer[11]; /* (expt 2 32) => 4294967296 */
 
             free_string_var (&current_task_task_id);
 
             sprintf (buffer, "%010u", id);
-            base_name = g_strdup_printf ("%s.nbe", buffer);
             gchar* name = g_build_filename (PREFIX
                                             "/var/lib/openvas/mgr/users/",
                                             current_credentials.username,
                                             "reports",
-                                            base_name,
+                                            buffer,
+                                            "report.nbe",
                                             NULL);
-            g_free (base_name);
             // FIX glib access setuid note
             if (g_file_test (name, G_FILE_TEST_EXISTS))
               {
@@ -1137,6 +1161,59 @@
         set_client_state (CLIENT_DELETE_TASK);
         break;
 
+      case CLIENT_MODIFY_REPORT:
+        if (current_task_task_id
+            && modify_task_parameter
+            && modify_task_value)
+          {
+            int ret = set_report_parameter (current_task_task_id,
+                                            modify_task_parameter,
+                                            modify_task_value);
+            free_string_var (&modify_task_parameter);
+            free_string_var (&modify_task_value);
+            free_string_var (&current_task_task_id);
+            switch (ret)
+              {
+                case 0:
+                  SEND_TO_CLIENT ("<modify_report_response>"
+                                  "<status>200</status>");
+                  break;
+                case -1: /* Failed to scan ID. */
+                case -2: /* Parameter name error. */
+                  SEND_TO_CLIENT ("<modify_report_response>"
+                                  "<status>40x</status>");
+                  break;
+                case -3: /* Failed to write to disk. */
+                default:
+                  SEND_TO_CLIENT ("<modify_report_response>"
+                                  "<status>50x</status>");
+                  break;
+              }
+          }
+        else
+          {
+            free_string_var (&modify_task_parameter);
+            free_string_var (&modify_task_value);
+            free_string_var (&current_task_task_id);
+            SEND_TO_CLIENT ("<modify_report_response>"
+                            "<status>500</status>");
+          }
+        SEND_TO_CLIENT ("</modify_report_response>");
+        set_client_state (CLIENT_AUTHENTIC);
+        break;
+      case CLIENT_MODIFY_REPORT_PARAMETER:
+        assert (strncasecmp ("PARAMETER", element_name, 9) == 0);
+        set_client_state (CLIENT_MODIFY_REPORT);
+        break;
+      case CLIENT_MODIFY_REPORT_REPORT_ID:
+        assert (strncasecmp ("REPORT_ID", element_name, 9) == 0);
+        set_client_state (CLIENT_MODIFY_REPORT);
+        break;
+      case CLIENT_MODIFY_REPORT_VALUE:
+        assert (strncasecmp ("VALUE", element_name, 5) == 0);
+        set_client_state (CLIENT_MODIFY_REPORT);
+        break;
+
       case CLIENT_MODIFY_TASK:
         {
           assert (current_client_task == NULL);
@@ -1391,12 +1468,16 @@
   tracef ("   XML   text: %s\n", text);
   switch (client_state)
     {
+      case CLIENT_MODIFY_REPORT_PARAMETER:
+        append_string (&modify_task_parameter, text);
+        break;
+      case CLIENT_MODIFY_REPORT_VALUE:
+        append_string (&modify_task_value, text);
+        break;
+
       case CLIENT_MODIFY_TASK_PARAMETER:
         append_string (&modify_task_parameter, text);
         break;
-      case CLIENT_MODIFY_TASK_TASK_ID:
-        append_string (&current_task_task_id, text);
-        break;
       case CLIENT_MODIFY_TASK_VALUE:
         append_string (&modify_task_value, text);
         break;
@@ -1424,8 +1505,10 @@
 
       case CLIENT_ABORT_TASK_TASK_ID:
       case CLIENT_DELETE_REPORT_ID:
+      case CLIENT_DELETE_TASK_TASK_ID:
       case CLIENT_GET_REPORT_ID:
-      case CLIENT_DELETE_TASK_TASK_ID:
+      case CLIENT_MODIFY_REPORT_REPORT_ID:
+      case CLIENT_MODIFY_TASK_TASK_ID:
       case CLIENT_START_TASK_TASK_ID:
       case CLIENT_STATUS_TASK_ID:
         append_string (&current_task_task_id, text);

Modified: trunk/openvas-manager/src/otp.c
===================================================================
--- trunk/openvas-manager/src/otp.c	2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/otp.c	2009-03-19 16:57:22 UTC (rev 2847)
@@ -273,7 +273,8 @@
  * @param[in]  task       The task.
  *
  * @return 0 success, -1 failed to open file, -2 failed to close file,
- *         -3 failed to symlink file to task dir.
+ *         -3 failed to symlink file to task dir, -4 failed to create dir,
+ *         -5 failed to generate ID.
  */
 int
 save_report (task_t* task)
@@ -286,32 +287,12 @@
 
   if (task_id_string (task, &id)) return -1;
 
-  gchar* dir_name = g_build_filename (PREFIX
-                                      "/var/lib/openvas/mgr/users/",
-                                      current_credentials.username,
-                                      "tasks",
-                                      id,
-                                      "reports",
-                                      NULL);
-
   gchar* user_dir_name = g_build_filename (PREFIX
                                            "/var/lib/openvas/mgr/users/",
                                            current_credentials.username,
                                            "reports",
                                            NULL);
 
-  /* Ensure task reports directory exists. */
-
-  if (g_mkdir_with_parents (dir_name, 33216 /* -rwx------ */) == -1)
-    {
-      fprintf (stderr, "Failed to create report dir %s: %s\n",
-               dir_name,
-               strerror (errno));
-      g_free (user_dir_name);
-      g_free (dir_name);
-      return -1;
-    }
-
   /* Ensure user reports directory exists. */
 
   if (g_mkdir_with_parents (user_dir_name, 33216 /* -rwx------ */) == -1)
@@ -320,38 +301,71 @@
                user_dir_name,
                strerror (errno));
       g_free (user_dir_name);
-      g_free (dir_name);
-      return -1;
+      return -4;
     }
 
-  /* Generate report name. */
+  /* Generate report directory name. */
 
   // FIX OID
-  static char buffer[15]; /* (expt 2 32) => 4294967296 + .nbe */
-  int length = sprintf (buffer, "%010u.nbe", task->report_count);
+  static char buffer[11]; /* (expt 2 32) => 4294967296 */
+  int length = sprintf (buffer, "%010u", task->report_count);
   assert (length < 15);
   if (length < 4)
     {
       fprintf (stderr, "Failed to generate report id.\n");
       g_free (user_dir_name);
-      g_free (dir_name);
-      return -1;
+      return -5;
     }
 
-  gchar* name = g_build_filename (dir_name, buffer, NULL);
-  g_free (dir_name);
+  gchar* dir_name = g_build_filename (PREFIX
+                                      "/var/lib/openvas/mgr/users/",
+                                      current_credentials.username,
+                                      "tasks",
+                                      id,
+                                      "reports",
+                                      buffer,
+                                      NULL);
 
   gchar* symlink_name = g_build_filename (user_dir_name, buffer, NULL);
   g_free (user_dir_name);
 
+  /* Ensure task report directory exists. */
+
+  if (g_mkdir_with_parents (dir_name, 33216 /* -rwx------ */) == -1)
+    {
+      fprintf (stderr, "Failed to create report dir %s: %s\n",
+               dir_name,
+               strerror (errno));
+      g_free (dir_name);
+      g_free (symlink_name);
+      return -4;
+    }
+
+  /* Link report directory into task directory. */
+
+  if (symlink (dir_name, symlink_name))
+    {
+      rmdir (dir_name);
+      fprintf (stderr, "Failed to symlink %s to %s\n",
+               dir_name,
+               symlink_name);
+      g_free (dir_name);
+      g_free (symlink_name);
+      return -3;
+    }
+
   /* Write report. */
 
+  gchar* name = g_build_filename (dir_name, "report.nbe", NULL);
+
   FILE* file = fopen (name, "w");
   if (file == NULL)
     {
+      rmdir (dir_name);
       fprintf (stderr, "Failed to open report file %s: %s\n",
                name,
                strerror (errno));
+      g_free (dir_name);
       g_free (name);
       g_free (symlink_name);
       return -1;
@@ -373,29 +387,19 @@
   if (fclose (file))
     {
       unlink (name);
+      rmdir (dir_name);
       fprintf (stderr, "Failed to close report file %s: %s\n",
                name,
                strerror (errno));
+      g_free (dir_name);
       g_free (name);
       g_free (symlink_name);
       return -2;
     }
 
-  /* Link report into task directory. */
-
-  if (symlink (name, symlink_name))
-    {
-      unlink (name);
-      fprintf (stderr, "Failed to symlink %s to %s\n",
-               name,
-               symlink_name);
-      g_free (name);
-      g_free (symlink_name);
-      return -3;
-    }
-
   task->report_count++;
 
+  g_free (dir_name);
   g_free (name);
   g_free (symlink_name);
   return 0;



More information about the Openvas-commits mailing list