|
|
|
|
@ -26,6 +26,7 @@
|
|
|
|
|
#define SAILJAIL_KEY_ORGANIZATION_NAME "OrganizationName"
|
|
|
|
|
#define SAILJAIL_KEY_APPLICATION_NAME "ApplicationName"
|
|
|
|
|
#define SAILJAIL_KEY_PERMISSIONS "Permissions"
|
|
|
|
|
#define SAILJAIL_KEY_MODE "Mode"
|
|
|
|
|
#define NEMO_KEY_APPLICATION_TYPE "X-Nemo-Application-Type"
|
|
|
|
|
#define NEMO_KEY_SINGLE_INSTANCE "X-Nemo-Single-Instance"
|
|
|
|
|
#define MAEMO_KEY_FIXED_ARGS "X-Maemo-Fixed-Args"
|
|
|
|
|
@ -49,6 +50,10 @@
|
|
|
|
|
#define PERMISSIONMGR_SIGNAL_APP_CHANGED "ApplicationChanged"
|
|
|
|
|
#define PERMISSIONMGR_SIGNAL_APP_REMOVED "ApplicationRemoved"
|
|
|
|
|
|
|
|
|
|
/* Sailjaild errors */
|
|
|
|
|
#define CODE_INVALID_ARGS "org.freedesktop.DBus.Error.InvalidArgs"
|
|
|
|
|
#define ERROR_INVALID_APPNAME "Invalid application name: "
|
|
|
|
|
|
|
|
|
|
static DBusConnection *
|
|
|
|
|
sailjail_connect_bus(void)
|
|
|
|
|
{
|
|
|
|
|
@ -121,7 +126,7 @@ iter_at(DBusMessageIter *iter, int type)
|
|
|
|
|
static GHashTable *
|
|
|
|
|
sailjail_application_info(DBusConnection *con, const char *desktop)
|
|
|
|
|
{
|
|
|
|
|
GHashTable *info = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
|
|
|
|
|
GHashTable *info = NULL;
|
|
|
|
|
DBusError err = DBUS_ERROR_INIT;
|
|
|
|
|
DBusMessage *req = NULL;
|
|
|
|
|
DBusMessage *rsp = NULL;
|
|
|
|
|
@ -140,7 +145,10 @@ sailjail_application_info(DBusConnection *con, const char *desktop)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!(rsp = dbus_connection_send_with_reply_and_block(con, req, DBUS_TIMEOUT_INFINITE, &err))) {
|
|
|
|
|
error("method call failed: %s: %s", err.name, err.message);
|
|
|
|
|
if (strcmp(err.name, CODE_INVALID_ARGS) ||
|
|
|
|
|
strncmp(err.message, ERROR_INVALID_APPNAME, strlen(ERROR_INVALID_APPNAME))) {
|
|
|
|
|
error("method call failed: %s: %s", err.name, err.message);
|
|
|
|
|
}
|
|
|
|
|
goto EXIT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -160,6 +168,8 @@ sailjail_application_info(DBusConnection *con, const char *desktop)
|
|
|
|
|
goto EXIT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
info = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_variant_unref);
|
|
|
|
|
|
|
|
|
|
DBusMessageIter ArrayIter;
|
|
|
|
|
dbus_message_iter_recurse(&bodyIter, &ArrayIter);
|
|
|
|
|
while (!iter_at(&ArrayIter, DBUS_TYPE_INVALID)) {
|
|
|
|
|
@ -557,3 +567,29 @@ EXIT:
|
|
|
|
|
|
|
|
|
|
return allowed;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool sailjail_sandbox(const char *desktop)
|
|
|
|
|
{
|
|
|
|
|
bool sandboxed = false;
|
|
|
|
|
DBusConnection *con = NULL;
|
|
|
|
|
GHashTable *info = NULL;
|
|
|
|
|
const char *mode;
|
|
|
|
|
|
|
|
|
|
if (!(con = sailjail_connect_bus()))
|
|
|
|
|
goto EXIT;
|
|
|
|
|
|
|
|
|
|
if (!(info = sailjail_application_info(con, desktop)))
|
|
|
|
|
goto EXIT;
|
|
|
|
|
|
|
|
|
|
if ((mode = appinfo_string(info, SAILJAIL_KEY_MODE)) && g_strcmp0(mode, "None")) {
|
|
|
|
|
// Mode is either "Normal" or "Compatibility"
|
|
|
|
|
sandboxed = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EXIT:
|
|
|
|
|
if (info)
|
|
|
|
|
g_hash_table_destroy(info);
|
|
|
|
|
sailjail_disconnect_bus(con);
|
|
|
|
|
|
|
|
|
|
return sandboxed;
|
|
|
|
|
}
|
|
|
|
|
|