[sysprof/wip/chergert/sysprof-3] libsysprof-ui: allow restricting remote proxy



commit 66aae9fa82a76fe32186fa1141dd542db9ff6927
Author: Christian Hergert <chergert redhat com>
Date:   Sun May 19 22:36:20 2019 -0700

    libsysprof-ui: allow restricting remote proxy

 src/helpers.c                          | 145 +++++++++++++++++++++++++++++++++
 src/helpers.h                          |  43 +++++-----
 src/libsysprof/sysprof-helpers.c       |   7 ++
 src/libsysprof/sysprof-helpers.h       |   1 +
 src/libsysprof/sysprof-process-model.c |  15 +++-
 src/libsysprof/sysprof-process-model.h |   3 +
 src/sysprofd/ipc-service-impl.c        | 138 +------------------------------
 src/tests/test-model-filter.c          |   1 +
 src/tests/test-process-model.c         |   1 +
 9 files changed, 196 insertions(+), 158 deletions(-)
---
diff --git a/src/helpers.c b/src/helpers.c
index 603ee99..3673df3 100644
--- a/src/helpers.c
+++ b/src/helpers.c
@@ -404,3 +404,148 @@ helpers_list_processes_finish (GAsyncResult  *result,
 
   return FALSE;
 }
+
+static gboolean
+needs_escape (const gchar *str)
+{
+  for (; *str; str++)
+    {
+      if (g_ascii_isspace (*str) || *str == '\'' || *str == '"')
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+postprocess_cmdline (gchar **str,
+                     gsize   len)
+{
+  g_autoptr(GPtrArray) parts = g_ptr_array_new_with_free_func (g_free);
+  g_autofree gchar *instr = NULL;
+  const gchar *begin = NULL;
+
+  if (len == 0)
+    return;
+
+  instr = *str;
+
+  for (gsize i = 0; i < len; i++)
+    {
+      if (!begin && instr[i])
+        {
+          begin = &instr[i];
+        }
+      else if (begin && instr[i] == '\0')
+        {
+          if (needs_escape (begin))
+            g_ptr_array_add (parts, g_shell_quote (begin));
+          else
+            g_ptr_array_add (parts, g_strdup (begin));
+
+          begin = NULL;
+        }
+    }
+
+  /* If the last byte was not \0, as can happen with prctl(), then we need
+   * to add it here manually.
+   */
+  if (begin)
+    {
+      if (needs_escape (begin))
+        g_ptr_array_add (parts, g_shell_quote (begin));
+      else
+        g_ptr_array_add (parts, g_strdup (begin));
+    }
+
+  g_ptr_array_add (parts, NULL);
+
+  *str = g_strjoinv (" ", (gchar **)parts->pdata);
+}
+
+static void
+postprocess_rstrip (gchar **str,
+                    gsize   len)
+{
+  g_strchomp (*str);
+}
+
+static void
+add_pid_proc_file_to (gint          pid,
+                      const gchar  *name,
+                      GVariantDict *dict,
+                      void (*postprocess) (gchar **, gsize))
+{
+  g_autofree gchar *path = NULL;
+  g_autofree gchar *contents = NULL;
+  gsize len;
+
+  g_assert (pid > -1);
+  g_assert (name != NULL);
+  g_assert (dict != NULL);
+
+  path = g_strdup_printf ("/proc/%d/%s", pid, name);
+
+  if (g_file_get_contents (path, &contents, &len, NULL))
+    {
+      if (postprocess)
+        postprocess (&contents, len);
+      g_variant_dict_insert (dict, name, "s", contents);
+    }
+}
+
+
+GVariant *
+helpers_get_process_info (const gchar *attributes)
+{
+  GVariantBuilder builder;
+  g_autofree gint *processes = NULL;
+  gsize n_processes = 0;
+  gboolean want_statm;
+  gboolean want_cmdline;
+  gboolean want_comm;
+  gboolean want_maps;
+  gboolean want_mountinfo;
+
+  if (attributes == NULL)
+    attributes = "";
+
+  want_statm = !!strstr (attributes, "statm");
+  want_cmdline = !!strstr (attributes, "cmdline");
+  want_maps = !!strstr (attributes, "maps");
+  want_mountinfo = !!strstr (attributes, "mountinfo");
+  want_comm = !!strstr (attributes, "comm");
+
+  g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
+
+  if (helpers_list_processes (&processes, &n_processes))
+    {
+      for (guint i = 0; i < n_processes; i++)
+        {
+          gint pid = processes[i];
+          GVariantDict dict;
+
+          g_variant_dict_init (&dict, NULL);
+          g_variant_dict_insert (&dict, "pid", "i", pid, NULL);
+
+          if (want_statm)
+            add_pid_proc_file_to (pid, "statm", &dict, postprocess_rstrip);
+
+          if (want_cmdline)
+            add_pid_proc_file_to (pid, "cmdline", &dict, postprocess_cmdline);
+
+          if (want_comm)
+            add_pid_proc_file_to (pid, "comm", &dict, postprocess_rstrip);
+
+          if (want_maps)
+            add_pid_proc_file_to (pid, "maps", &dict, postprocess_rstrip);
+
+          if (want_mountinfo)
+            add_pid_proc_file_to (pid, "mountinfo", &dict, postprocess_rstrip);
+
+          g_variant_builder_add_value (&builder, g_variant_dict_end (&dict));
+        }
+    }
+
+  return g_variant_take_ref (g_variant_builder_end (&builder));
+}
diff --git a/src/helpers.h b/src/helpers.h
index 0aa0470..faaae31 100644
--- a/src/helpers.h
+++ b/src/helpers.h
@@ -27,26 +27,27 @@
 
 G_BEGIN_DECLS
 
-gboolean helpers_can_see_pids          (void);
-gboolean helpers_list_processes        (gint32              **processes,
-                                        gsize                *n_processes);
-void     helpers_list_processes_async  (GCancellable         *cancellable,
-                                        GAsyncReadyCallback   callback,
-                                        gpointer              user_data);
-gboolean helpers_list_processes_finish (GAsyncResult         *result,
-                                        gint32              **processes,
-                                        gsize                *n_processes,
-                                        GError              **error);
-gboolean helpers_perf_event_open       (GVariant             *options,
-                                        gint32                pid,
-                                        gint32                cpu,
-                                        gint                  group_fd,
-                                        guint64               flags,
-                                        gint                 *out_fd);
-gboolean helpers_get_proc_file         (const gchar          *path,
-                                        gchar               **contents,
-                                        gsize                *len);
-gboolean helpers_get_proc_fd           (const gchar          *path,
-                                        gint                 *out_fd);
+gboolean  helpers_can_see_pids          (void);
+gboolean  helpers_list_processes        (gint32              **processes,
+                                         gsize                *n_processes);
+void      helpers_list_processes_async  (GCancellable         *cancellable,
+                                         GAsyncReadyCallback   callback,
+                                         gpointer              user_data);
+gboolean  helpers_list_processes_finish (GAsyncResult         *result,
+                                         gint32              **processes,
+                                         gsize                *n_processes,
+                                         GError              **error);
+gboolean  helpers_perf_event_open       (GVariant             *options,
+                                         gint32                pid,
+                                         gint32                cpu,
+                                         gint                  group_fd,
+                                         guint64               flags,
+                                         gint                 *out_fd);
+gboolean  helpers_get_proc_file         (const gchar          *path,
+                                         gchar               **contents,
+                                         gsize                *len);
+gboolean  helpers_get_proc_fd           (const gchar          *path,
+                                         gint                 *out_fd);
+GVariant *helpers_get_process_info      (const gchar          *attributes);
 
 G_END_DECLS
diff --git a/src/libsysprof/sysprof-helpers.c b/src/libsysprof/sysprof-helpers.c
index 06512a8..b8e60db 100644
--- a/src/libsysprof/sysprof-helpers.c
+++ b/src/libsysprof/sysprof-helpers.c
@@ -627,6 +627,7 @@ sysprof_helpers_authorize_finish (SysprofHelpers  *self,
 gboolean
 sysprof_helpers_get_process_info (SysprofHelpers  *self,
                                   const gchar     *attributes,
+                                  gboolean         no_proxy,
                                   GCancellable    *cancellable,
                                   GVariant       **info,
                                   GError         **error)
@@ -636,6 +637,12 @@ sysprof_helpers_get_process_info (SysprofHelpers  *self,
   g_assert (!cancellable || G_IS_CANCELLABLE (cancellable));
   g_assert (info != NULL);
 
+  if (no_proxy)
+    {
+      *info = helpers_get_process_info (attributes);
+      return TRUE;
+    }
+
   return ipc_service_call_get_process_info_sync (self->proxy, attributes, info, cancellable, error);
 }
 
diff --git a/src/libsysprof/sysprof-helpers.h b/src/libsysprof/sysprof-helpers.h
index 99aae85..3cce84a 100644
--- a/src/libsysprof/sysprof-helpers.h
+++ b/src/libsysprof/sysprof-helpers.h
@@ -75,6 +75,7 @@ gboolean        sysprof_helpers_get_proc_file_finish   (SysprofHelpers
                                                         GError                 **error);
 gboolean        sysprof_helpers_get_process_info       (SysprofHelpers          *self,
                                                         const gchar             *attributes,
+                                                        gboolean                 no_proxy,
                                                         GCancellable            *cancellable,
                                                         GVariant               **info,
                                                         GError                 **error);
diff --git a/src/libsysprof/sysprof-process-model.c b/src/libsysprof/sysprof-process-model.c
index 93e0755..ec7e676 100644
--- a/src/libsysprof/sysprof-process-model.c
+++ b/src/libsysprof/sysprof-process-model.c
@@ -32,8 +32,9 @@
 struct _SysprofProcessModel
 {
   GObject    parent_instance;
-  guint      reload_source;
   GPtrArray *items;
+  guint      reload_source;
+  guint      no_proxy : 1;
 };
 
 static void list_model_iface_init (GListModelInterface *iface);
@@ -181,6 +182,7 @@ sysprof_process_model_reload_worker (GTask        *task,
                                      gpointer      task_data,
                                      GCancellable *cancellable)
 {
+  SysprofProcessModel *self = source_object;
   SysprofHelpers *helpers = sysprof_helpers_get_default ();
   g_autoptr(GPtrArray) ret = NULL;
   g_autoptr(GVariant) info = NULL;
@@ -190,7 +192,7 @@ sysprof_process_model_reload_worker (GTask        *task,
 
   ret = g_ptr_array_new_with_free_func (g_object_unref);
 
-  if (sysprof_helpers_get_process_info (helpers, "pid,cmdline,comm", NULL, &info, NULL))
+  if (sysprof_helpers_get_process_info (helpers, "pid,cmdline,comm", self->no_proxy, NULL, &info, NULL))
     {
       gsize n_children = g_variant_n_children (info);
 
@@ -294,3 +296,12 @@ list_model_iface_init (GListModelInterface *iface)
   iface->get_n_items = sysprof_process_model_get_n_items;
   iface->get_item = sysprof_process_model_get_item;
 }
+
+void
+sysprof_process_model_set_no_proxy (SysprofProcessModel *self,
+                                    gboolean             no_proxy)
+{
+  g_return_if_fail (SYSPROF_IS_PROCESS_MODEL (self));
+
+  self->no_proxy = !!no_proxy;
+}
diff --git a/src/libsysprof/sysprof-process-model.h b/src/libsysprof/sysprof-process-model.h
index 2084e60..9737b77 100644
--- a/src/libsysprof/sysprof-process-model.h
+++ b/src/libsysprof/sysprof-process-model.h
@@ -38,6 +38,9 @@ G_DECLARE_FINAL_TYPE (SysprofProcessModel, sysprof_process_model, SYSPROF, PROCE
 SYSPROF_AVAILABLE_IN_ALL
 SysprofProcessModel *sysprof_process_model_new          (void);
 SYSPROF_AVAILABLE_IN_ALL
+void                 sysprof_process_model_set_no_proxy (SysprofProcessModel *self,
+                                                         gboolean             no_proxy);
+SYSPROF_AVAILABLE_IN_ALL
 void                 sysprof_process_model_reload       (SysprofProcessModel *self);
 SYSPROF_AVAILABLE_IN_ALL
 void                 sysprof_process_model_queue_reload (SysprofProcessModel *self);
diff --git a/src/sysprofd/ipc-service-impl.c b/src/sysprofd/ipc-service-impl.c
index c2d8ed2..0da8acd 100644
--- a/src/sysprofd/ipc-service-impl.c
+++ b/src/sysprofd/ipc-service-impl.c
@@ -237,151 +237,19 @@ ipc_service_impl_g_authorize_method (GDBusInterfaceSkeleton *skeleton,
   return ret;
 }
 
-static gboolean
-needs_escape (const gchar *str)
-{
-  for (; *str; str++)
-    {
-      if (g_ascii_isspace (*str) || *str == '\'' || *str == '"')
-        return TRUE;
-    }
-
-  return FALSE;
-}
-
-static void
-postprocess_cmdline (gchar **str,
-                     gsize   len)
-{
-  g_autoptr(GPtrArray) parts = g_ptr_array_new_with_free_func (g_free);
-  g_autofree gchar *instr = NULL;
-  const gchar *begin = NULL;
-
-  if (len == 0)
-    return;
-
-  instr = *str;
-
-  for (gsize i = 0; i < len; i++)
-    {
-      if (!begin && instr[i])
-        {
-          begin = &instr[i];
-        }
-      else if (begin && instr[i] == '\0')
-        {
-          if (needs_escape (begin))
-            g_ptr_array_add (parts, g_shell_quote (begin));
-          else
-            g_ptr_array_add (parts, g_strdup (begin));
-
-          begin = NULL;
-        }
-    }
-
-  /* If the last byte was not \0, as can happen with prctl(), then we need
-   * to add it here manually.
-   */
-  if (begin)
-    {
-      if (needs_escape (begin))
-        g_ptr_array_add (parts, g_shell_quote (begin));
-      else
-        g_ptr_array_add (parts, g_strdup (begin));
-    }
-
-  g_ptr_array_add (parts, NULL);
-
-  *str = g_strjoinv (" ", (gchar **)parts->pdata);
-}
-
-static void
-postprocess_rstrip (gchar **str,
-                    gsize   len)
-{
-  g_strchomp (*str);
-}
-
-static void
-add_pid_proc_file_to (gint          pid,
-                      const gchar  *name,
-                      GVariantDict *dict,
-                      void (*postprocess) (gchar **, gsize))
-{
-  g_autofree gchar *path = NULL;
-  g_autofree gchar *contents = NULL;
-  gsize len;
-
-  g_assert (pid > -1);
-  g_assert (name != NULL);
-  g_assert (dict != NULL);
-
-  path = g_strdup_printf ("/proc/%d/%s", pid, name);
-
-  if (g_file_get_contents (path, &contents, &len, NULL))
-    {
-      if (postprocess)
-        postprocess (&contents, len);
-      g_variant_dict_insert (dict, name, "s", contents);
-    }
-}
-
 static gboolean
 ipc_service_impl_handle_get_process_info (IpcService            *service,
                                           GDBusMethodInvocation *invocation,
                                           const gchar           *attributes)
 {
-  GVariantBuilder builder;
-  g_autofree gint *processes = NULL;
-  gsize n_processes = 0;
-  gboolean want_statm;
-  gboolean want_cmdline;
-  gboolean want_comm;
-  gboolean want_maps;
-  gboolean want_mountinfo;
+  g_autoptr(GVariant) res = NULL;
 
   g_assert (IPC_IS_SERVICE (service));
   g_assert (G_IS_DBUS_METHOD_INVOCATION (invocation));
   g_assert (attributes != NULL);
 
-  want_statm = !!strstr (attributes, "statm");
-  want_cmdline = !!strstr (attributes, "cmdline");
-  want_maps = !!strstr (attributes, "maps");
-  want_mountinfo = !!strstr (attributes, "mountinfo");
-  want_comm = !!strstr (attributes, "comm");
-
-  g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
-
-  if (helpers_list_processes (&processes, &n_processes))
-    {
-      for (guint i = 0; i < n_processes; i++)
-        {
-          gint pid = processes[i];
-          GVariantDict dict;
-
-          g_variant_dict_init (&dict, NULL);
-          g_variant_dict_insert (&dict, "pid", "i", pid, NULL);
-
-          if (want_statm)
-            add_pid_proc_file_to (pid, "statm", &dict, postprocess_rstrip);
-
-          if (want_cmdline)
-            add_pid_proc_file_to (pid, "cmdline", &dict, postprocess_cmdline);
-
-          if (want_comm)
-            add_pid_proc_file_to (pid, "comm", &dict, postprocess_rstrip);
-
-          if (want_maps)
-            add_pid_proc_file_to (pid, "maps", &dict, postprocess_rstrip);
-
-          if (want_mountinfo)
-            add_pid_proc_file_to (pid, "mountinfo", &dict, postprocess_rstrip);
-
-          g_variant_builder_add_value (&builder, g_variant_dict_end (&dict));
-        }
-    }
-
-  ipc_service_complete_get_process_info (service, invocation, g_variant_builder_end (&builder));
+  res = helpers_get_process_info (attributes);
+  ipc_service_complete_get_process_info (service, invocation, res);
 
   return TRUE;
 }
diff --git a/src/tests/test-model-filter.c b/src/tests/test-model-filter.c
index 4c2d0a5..fb856a6 100644
--- a/src/tests/test-model-filter.c
+++ b/src/tests/test-model-filter.c
@@ -143,6 +143,7 @@ test_process (void)
 
   filter = sysprof_model_filter_new (G_LIST_MODEL (model));
 
+  sysprof_process_model_set_no_proxy (model, TRUE);
   sysprof_process_model_reload (model);
 
   for (guint i = 0; i < G_N_ELEMENTS (searches); i++)
diff --git a/src/tests/test-process-model.c b/src/tests/test-process-model.c
index ca42e56..42e347c 100644
--- a/src/tests/test-process-model.c
+++ b/src/tests/test-process-model.c
@@ -78,6 +78,7 @@ main (gint argc,
   gtk_container_add (GTK_CONTAINER (scroller), list);
 
   model = sysprof_process_model_new ();
+  sysprof_process_model_set_no_proxy (model, TRUE);
   filter = sysprof_model_filter_new (G_LIST_MODEL (model));
   gtk_list_box_bind_model (GTK_LIST_BOX (list), G_LIST_MODEL (filter), create_row, NULL, NULL);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]