desktop: Fix destruction of applications that fallback to the desktop role
[src/agl-compositor.git] / src / policy-default.c
index 16c8b2d..a09bb1a 100644 (file)
 #include "ivi-compositor.h"
 #include "policy.h"
 
+#ifdef HAVE_SMACK
+#include <sys/smack.h>
+#endif
+
+#include <string.h>
+
 /*
  * default policy implementation allows every action to be possible
  *
@@ -71,6 +77,60 @@ ivi_policy_default_surface_activate_default(struct ivi_surface *surf, void *user
        return true;
 }
 
+static bool
+ivi_policy_default_surface_advertise_state_change(struct ivi_surface *surf, void *user_data)
+{
+       /* verify that the surface should sent as notification */
+       return true;
+}
+
+#ifdef HAVE_SMACK
+static bool
+ivi_policy_default_shell_bind_interface(void *client, void *interface)
+{
+       struct wl_interface *shell_interface = interface;
+       struct wl_client *conn_client = client;
+
+       pid_t pid, uid, gid;
+       int client_fd;
+       char *label;
+       bool ret = false;
+
+       wl_client_get_credentials(conn_client, &pid, &uid, &gid);
+
+       client_fd = wl_client_get_fd(conn_client);
+       if (smack_new_label_from_socket(client_fd, &label) < 0) {
+               return ret;
+       }
+
+       if (strcmp(shell_interface->name, "agl_shell") == 0)
+               if (strcmp(label, "User::App::homescreen") == 0)
+                       ret = true;
+
+       if (strcmp(shell_interface->name, "agl_shell_desktop") == 0)
+               if (strcmp(label, "User::App::launcher") == 0 ||
+                   strcmp(label, "User::App::alexa-viewer") == 0 ||
+                   strcmp(label, "User::App::tbtnavi") == 0 ||
+                   strcmp(label, "User::App::hvac") == 0)
+                       ret = true;
+
+       if (ret)
+               weston_log("Client with pid %d, uid %d, gid %d, allowed "
+                               "to bind to %s for label %s\n", pid, uid, gid,
+                               shell_interface->name, label);
+
+       /* client responsible for free'ing */
+       free(label);
+       return ret;
+}
+#else
+static bool
+ivi_policy_default_shell_bind_interface(void *client, void *interface)
+{
+       return true;
+}
+#endif
+
 static bool
 ivi_policy_default_allow_to_add(void *user_data)
 {
@@ -105,6 +165,8 @@ static const struct ivi_policy_api policy_api = {
        .surface_activate = ivi_policy_default_surface_activate,
        .surface_deactivate = ivi_policy_default_surface_deactivate,
        .surface_activate_by_default = ivi_policy_default_surface_activate_default,
+       .surface_advertise_state_change = ivi_policy_default_surface_advertise_state_change,
+       .shell_bind_interface = ivi_policy_default_shell_bind_interface,
        .policy_rule_allow_to_add = ivi_policy_default_allow_to_add,
        .policy_rule_try_event = ivi_policy_default_try_event,
 };
@@ -116,5 +178,6 @@ ivi_policy_init(struct ivi_compositor *ivi)
        if (!ivi->policy)
                return -1;
 
+       weston_log("Installing 'allow-all' policy engine\n");
        return 0;
 }