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

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Thu Mar 12 20:21:50 CET 2009


Author: mattm
Date: 2009-03-12 20:21:48 +0100 (Thu, 12 Mar 2009)
New Revision: 2753

Modified:
   trunk/openvas-manager/ChangeLog
   trunk/openvas-manager/src/omp.c
Log:
Add OMP DELETE_REPORT.

Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog	2009-03-12 19:16:47 UTC (rev 2752)
+++ trunk/openvas-manager/ChangeLog	2009-03-12 19:21:48 UTC (rev 2753)
@@ -1,5 +1,13 @@
-2009-03-11  Matthew Mundell <matt at mundell.ukfsn.org>
+2009-03-12  Matthew Mundell <matt at mundell.ukfsn.org>
 
+	Add OMP DELETE_REPORT.
+
+	* src/otm.c (client_state_t): Add DELETE_REPORT states.
+	(omp_xml_handle_start_element, omp_xml_handle_end_element,
+	omp_xml_handle_text): Add DELETE_REPORT handling.
+
+2009-03-12  Matthew Mundell <matt at mundell.ukfsn.org>
+
 	* src/otp.c (save_report): Move the actual report into the task directory.
 
 2009-03-11  Matthew Mundell <matt at mundell.ukfsn.org>

Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c	2009-03-12 19:16:47 UTC (rev 2752)
+++ trunk/openvas-manager/src/omp.c	2009-03-12 19:21:48 UTC (rev 2753)
@@ -112,6 +112,8 @@
   CLIENT_CREDENTIALS,
   CLIENT_CREDENTIALS_USERNAME,
   CLIENT_CREDENTIALS_PASSWORD,
+  CLIENT_DELETE_REPORT,
+  CLIENT_DELETE_REPORT_ID,
   CLIENT_DELETE_TASK,
   CLIENT_DELETE_TASK_TASK_ID,
   CLIENT_GET_DEPENDENCIES,
@@ -238,6 +240,8 @@
           }
         else if (strncasecmp ("ABORT_TASK", element_name, 10) == 0)
           set_client_state (CLIENT_ABORT_TASK);
+        else if (strncasecmp ("DELETE_REPORT", element_name, 13) == 0)
+          set_client_state (CLIENT_DELETE_REPORT);
         else if (strncasecmp ("DELETE_TASK", element_name, 11) == 0)
           set_client_state (CLIENT_DELETE_TASK);
         else if (strncasecmp ("GET_DEPENDENCIES", element_name, 16) == 0)
@@ -317,6 +321,22 @@
           }
         break;
 
+      case CLIENT_DELETE_REPORT:
+        if (strncasecmp ("REPORT_ID", element_name, 9) == 0)
+          set_client_state (CLIENT_DELETE_REPORT_ID);
+        else
+          {
+            SEND_TO_CLIENT ("<delete_report_response>"
+                            "<status>402</status>"
+                            "</delete_report_response>");
+            set_client_state (CLIENT_AUTHENTIC);
+            g_set_error (error,
+                         G_MARKUP_ERROR,
+                         G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+                         "Error");
+          }
+        break;
+
       case CLIENT_DELETE_TASK:
         if (strncasecmp ("TASK_ID", element_name, 7) == 0)
           set_client_state (CLIENT_DELETE_TASK_TASK_ID);
@@ -951,6 +971,80 @@
         set_client_state (CLIENT_AUTHENTIC);
         break;
 
+      case CLIENT_DELETE_REPORT:
+        {
+          assert (strncasecmp ("DELETE_REPORT", element_name, 13) == 0);
+          unsigned int id;
+          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* link_name;
+              link_name = g_build_filename (PREFIX
+                                            "/var/lib/openvas/mgr/users/",
+                                            current_credentials.username,
+                                            "reports",
+                                            base_name,
+                                            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))
+                {
+                  GError* link_error = NULL;
+                  gchar* name = g_file_read_link (link_name, &link_error);
+                  if (link_error || unlink (name))
+                    {
+                      if (link_error)
+                        {
+                          fprintf (stderr,
+                                   "Failed to read report symlink: %s.\n",
+                                   link_error->message);
+                          g_error_free (link_error);
+                        }
+                      g_free (name);
+                      g_free (link_name);
+                      SEND_TO_CLIENT ("<delete_report_response>"
+                                      "<status>50x</status>");
+                    }
+                  else
+                    {
+                      if (unlink (link_name))
+                        /* Just log the error. */
+                        fprintf (stderr,
+                                 "Failed to remove report symlink %s.\n",
+                                 link_name);
+                      g_free (name);
+                      g_free (link_name);
+                      SEND_TO_CLIENT ("<delete_report_response>"
+                                      "<status>200</status>");
+                    }
+                }
+              else
+                SEND_TO_CLIENT ("<delete_report_response>"
+                                "<status>40x</status>");
+            }
+          else
+            {
+              free_string_var (&current_task_task_id);
+              SEND_TO_CLIENT ("<delete_report_response>"
+                              "<status>500</status>");
+            }
+          SEND_TO_CLIENT ("</delete_report_response>");
+          set_client_state (CLIENT_AUTHENTIC);
+        }
+        break;
+      case CLIENT_DELETE_REPORT_ID:
+        assert (strncasecmp ("REPORT_ID", element_name, 9) == 0);
+        set_client_state (CLIENT_DELETE_REPORT);
+        break;
+
       case CLIENT_GET_REPORT:
         assert (strncasecmp ("GET_REPORT", element_name, 10) == 0);
         unsigned int id;
@@ -971,6 +1065,7 @@
                                             base_name,
                                             NULL);
             g_free (base_name);
+            // FIX glib access setuid note
             if (g_file_test (name, G_FILE_TEST_EXISTS))
               {
                 gchar* content;
@@ -1364,6 +1459,7 @@
         break;
 
       case CLIENT_ABORT_TASK_TASK_ID:
+      case CLIENT_DELETE_REPORT_ID:
       case CLIENT_GET_REPORT_ID:
       case CLIENT_DELETE_TASK_TASK_ID:
       case CLIENT_START_TASK_TASK_ID:



More information about the Openvas-commits mailing list