45d9d07563
This reverts commit 52aeecd450
.
The updated patch is still not correct enough, namely it processes cases
where the JS .rules do not provide an answer and the “implicit” value
should be returned incorrectly.
972 lines
36 KiB
Diff
972 lines
36 KiB
Diff
Update polkit to use a more recent version of the mozjs library.
|
|
|
|
This is falls into a few general categorizes. Further C macros
|
|
have been replaced with C++ methods. Types which are native (bool)
|
|
are now used, rather than mozjs specific ones (JS_Bool). Further
|
|
most of the API's now require rooted handles, rather than js value
|
|
types so, we temporarily root many of the values we are passing into
|
|
the API. Plus the usual API churn (removal of the argv methods,
|
|
changes to the compile/evaluate sequences, etc) is dealt with.
|
|
|
|
Currently mozjs38 is about two years old, and so it has a slightly
|
|
better security/etc statement. Gnome has moved off mozjs24 and is
|
|
intending to land on mozjs38 in the near future. Lets try to keep
|
|
polkit in step with gnome.
|
|
|
|
Signed-off-by: Jeremy Linton <jeremy.linton at arm.com>
|
|
---
|
|
configure.ac | 2 +-
|
|
src/polkitbackend/polkitbackendjsauthority.cpp | 422 +++++++++++++------------
|
|
2 files changed, 213 insertions(+), 211 deletions(-)
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index af2c8dd..093f5ea 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -82,7 +82,7 @@ AC_DEFINE([GLIB_VERSION_MIN_REQUIRED], [GLIB_VERSION_2_30],
|
|
AC_DEFINE([GLIB_VERSION_MAX_ALLOWED], [G_ENCODE_VERSION(2,34)],
|
|
[Notify us when we'll need to transition away from g_type_init()])
|
|
|
|
-PKG_CHECK_MODULES(LIBJS, [mozjs-24])
|
|
+PKG_CHECK_MODULES(LIBJS, [mozjs-38])
|
|
|
|
AC_SUBST(LIBJS_CFLAGS)
|
|
AC_SUBST(LIBJS_CXXFLAGS)
|
|
diff --git a/src/polkitbackend/polkitbackendjsauthority.cpp b/src/polkitbackend/polkitbackendjsauthority.cpp
|
|
index 6a0b4ab..68bc147 100644
|
|
--- a/src/polkitbackend/polkitbackendjsauthority.cpp
|
|
+++ b/src/polkitbackend/polkitbackendjsauthority.cpp
|
|
@@ -30,6 +30,7 @@
|
|
#include <netdb.h>
|
|
#endif
|
|
#include <string.h>
|
|
+#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
|
#include <glib/gstdio.h>
|
|
#include <locale.h>
|
|
#include <glib/gi18n-lib.h>
|
|
@@ -43,9 +44,13 @@
|
|
#include <systemd/sd-login.h>
|
|
#endif /* HAVE_LIBSYSTEMD */
|
|
|
|
+#pragma GCC diagnostic ignored "-Winvalid-offsetof"
|
|
#include <jsapi.h>
|
|
+#pragma GCC diagnostic error "-Winvalid-offsetof"
|
|
+#include "js/Conversions.h"
|
|
|
|
#include "initjs.h" /* init.js */
|
|
+#pragma GCC diagnostic error "-Wdeprecated-declarations"
|
|
|
|
#ifdef JSGC_USE_EXACT_ROOTING
|
|
/* See https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/GC/Exact_Stack_Rooting
|
|
@@ -75,9 +80,9 @@ struct _PolkitBackendJsAuthorityPrivate
|
|
|
|
JSRuntime *rt;
|
|
JSContext *cx;
|
|
- JSObject *js_global;
|
|
+ JS::RootedObject *js_global;
|
|
JSAutoCompartment *ac;
|
|
- JSObject *js_polkit;
|
|
+ JS::RootedObject *js_polkit;
|
|
|
|
GThread *runaway_killer_thread;
|
|
GMutex rkt_init_mutex;
|
|
@@ -92,9 +97,10 @@ struct _PolkitBackendJsAuthorityPrivate
|
|
GList *scripts;
|
|
};
|
|
|
|
-static JSBool execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
|
|
- JSScript *script,
|
|
- jsval *rval);
|
|
+static bool execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
|
|
+ JS::RootedScript *script,
|
|
+ JS::RootedValue *rval);
|
|
+
|
|
|
|
static void utils_spawn (const gchar *const *argv,
|
|
guint timeout_seconds,
|
|
@@ -153,15 +159,6 @@ G_DEFINE_TYPE (PolkitBackendJsAuthority, polkit_backend_js_authority, POLKIT_BAC
|
|
static JSClass js_global_class = {
|
|
"global",
|
|
JSCLASS_GLOBAL_FLAGS,
|
|
- JS_PropertyStub,
|
|
- JS_DeletePropertyStub,
|
|
- JS_PropertyStub,
|
|
- JS_StrictPropertyStub,
|
|
- JS_EnumerateStub,
|
|
- JS_ResolveStub,
|
|
- JS_ConvertStub,
|
|
- NULL,
|
|
- JSCLASS_NO_OPTIONAL_MEMBERS
|
|
};
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
@@ -169,20 +166,11 @@ static JSClass js_global_class = {
|
|
static JSClass js_polkit_class = {
|
|
"Polkit",
|
|
0,
|
|
- JS_PropertyStub,
|
|
- JS_DeletePropertyStub,
|
|
- JS_PropertyStub,
|
|
- JS_StrictPropertyStub,
|
|
- JS_EnumerateStub,
|
|
- JS_ResolveStub,
|
|
- JS_ConvertStub,
|
|
- NULL,
|
|
- JSCLASS_NO_OPTIONAL_MEMBERS
|
|
};
|
|
|
|
-static JSBool js_polkit_log (JSContext *cx, unsigned argc, jsval *vp);
|
|
-static JSBool js_polkit_spawn (JSContext *cx, unsigned argc, jsval *vp);
|
|
-static JSBool js_polkit_user_is_in_netgroup (JSContext *cx, unsigned argc, jsval *vp);
|
|
+static bool js_polkit_log (JSContext *cx, unsigned argc, jsval *vp);
|
|
+static bool js_polkit_spawn (JSContext *cx, unsigned argc, jsval *vp);
|
|
+static bool js_polkit_user_is_in_netgroup (JSContext *cx, unsigned argc, jsval *vp);
|
|
|
|
static JSFunctionSpec js_polkit_functions[] =
|
|
{
|
|
@@ -288,16 +276,16 @@ load_scripts (PolkitBackendJsAuthority *authority)
|
|
|
|
for (l = files; l != NULL; l = l->next)
|
|
{
|
|
+ bool ret;
|
|
const gchar *filename = (gchar *)l->data;
|
|
JS::RootedScript script(authority->priv->cx);
|
|
JS::CompileOptions options(authority->priv->cx);
|
|
- JS::RootedObject obj(authority->priv->cx,authority->priv->js_global);
|
|
options.setUTF8(true);
|
|
- script = JS::Compile (authority->priv->cx,
|
|
- obj, options,
|
|
- filename);
|
|
+ ret = JS::Compile (authority->priv->cx,
|
|
+ *authority->priv->js_global, options,
|
|
+ filename, &script);
|
|
|
|
- if (script == NULL)
|
|
+ if (ret != true)
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
"Error compiling script %s",
|
|
@@ -306,9 +294,10 @@ load_scripts (PolkitBackendJsAuthority *authority)
|
|
}
|
|
|
|
/* evaluate the script */
|
|
- jsval rval;
|
|
+ JS::RootedValue rval(authority->priv->cx);
|
|
+
|
|
if (!execute_script_with_runaway_killer (authority,
|
|
- script,
|
|
+ &script,
|
|
&rval))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
@@ -331,15 +320,13 @@ load_scripts (PolkitBackendJsAuthority *authority)
|
|
static void
|
|
reload_scripts (PolkitBackendJsAuthority *authority)
|
|
{
|
|
- jsval argv[1] = {JSVAL_NULL};
|
|
- jsval rval = JSVAL_NULL;
|
|
-
|
|
JS_BeginRequest (authority->priv->cx);
|
|
+ JS::AutoValueArray<1> argv(authority->priv->cx);
|
|
+ JS::RootedValue rval(authority->priv->cx);
|
|
|
|
if (!JS_CallFunctionName(authority->priv->cx,
|
|
- authority->priv->js_polkit,
|
|
+ *authority->priv->js_polkit,
|
|
"_deleteRules",
|
|
- 0,
|
|
argv,
|
|
&rval))
|
|
{
|
|
@@ -442,7 +429,9 @@ polkit_backend_js_authority_constructed (GObject *object)
|
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (object);
|
|
gboolean entered_request = FALSE;
|
|
|
|
- authority->priv->rt = JS_NewRuntime (8L * 1024L * 1024L, JS_USE_HELPER_THREADS);
|
|
+ JS_Init();
|
|
+
|
|
+ authority->priv->rt = JS_NewRuntime (8L * 1024L * 1024L);
|
|
if (authority->priv->rt == NULL)
|
|
goto fail;
|
|
|
|
@@ -450,13 +439,7 @@ polkit_backend_js_authority_constructed (GObject *object)
|
|
if (authority->priv->cx == NULL)
|
|
goto fail;
|
|
|
|
- /* TODO: JIT'ing doesn't work will with killing runaway scripts... I think
|
|
- * this is just a SpiderMonkey bug. So disable the JIT for now.
|
|
- */
|
|
- JS_SetOptions (authority->priv->cx,
|
|
- JSOPTION_VAROBJFIX
|
|
- /* | JSOPTION_JIT | JSOPTION_METHODJIT*/);
|
|
- JS_SetErrorReporter(authority->priv->cx, report_error);
|
|
+ JS_SetErrorReporter(authority->priv->rt, report_error);
|
|
JS_SetContextPrivate (authority->priv->cx, authority);
|
|
|
|
JS_BeginRequest(authority->priv->cx);
|
|
@@ -465,45 +448,49 @@ polkit_backend_js_authority_constructed (GObject *object)
|
|
{
|
|
JS::CompartmentOptions compart_opts;
|
|
compart_opts.setVersion(JSVERSION_LATEST);
|
|
- authority->priv->js_global = JS_NewGlobalObject (authority->priv->cx, &js_global_class, NULL, compart_opts);
|
|
-
|
|
+ JSAutoRequest ar(authority->priv->cx);
|
|
+
|
|
+ authority->priv->js_global = new JS::RootedObject(authority->priv->cx,
|
|
+ JS_NewGlobalObject (authority->priv->cx,
|
|
+ &js_global_class,
|
|
+ nullptr,
|
|
+ JS::DontFireOnNewGlobalHook,
|
|
+ compart_opts));
|
|
if (authority->priv->js_global == NULL)
|
|
goto fail;
|
|
|
|
- authority->priv->ac = new JSAutoCompartment(authority->priv->cx, authority->priv->js_global);
|
|
-
|
|
+ authority->priv->ac = new JSAutoCompartment(authority->priv->cx, *authority->priv->js_global);
|
|
if (authority->priv->ac == NULL)
|
|
goto fail;
|
|
|
|
- JS_AddObjectRoot (authority->priv->cx, &authority->priv->js_global);
|
|
-
|
|
- if (!JS_InitStandardClasses (authority->priv->cx, authority->priv->js_global))
|
|
+ if (!JS_InitStandardClasses (authority->priv->cx, *authority->priv->js_global))
|
|
goto fail;
|
|
|
|
- authority->priv->js_polkit = JS_DefineObject (authority->priv->cx,
|
|
- authority->priv->js_global,
|
|
- "polkit",
|
|
- &js_polkit_class,
|
|
- NULL,
|
|
- JSPROP_ENUMERATE);
|
|
+ authority->priv->js_polkit = new JS::RootedObject(authority->priv->cx,
|
|
+ JS_DefineObject (authority->priv->cx,
|
|
+ *authority->priv->js_global,
|
|
+ "polkit",
|
|
+ &js_polkit_class,
|
|
+ JSPROP_ENUMERATE));
|
|
if (authority->priv->js_polkit == NULL)
|
|
goto fail;
|
|
- JS_AddObjectRoot (authority->priv->cx, &authority->priv->js_polkit);
|
|
|
|
if (!JS_DefineFunctions (authority->priv->cx,
|
|
- authority->priv->js_polkit,
|
|
+ *authority->priv->js_polkit,
|
|
js_polkit_functions))
|
|
goto fail;
|
|
|
|
- if (!JS_EvaluateScript (authority->priv->cx,
|
|
- authority->priv->js_global,
|
|
- init_js, strlen (init_js), /* init.js */
|
|
+ JS::CompileOptions options(authority->priv->cx);
|
|
+ options.setUTF8(true);
|
|
+ JS::RootedValue result(authority->priv->cx);
|
|
+
|
|
+ if (!JS::Evaluate(authority->priv->cx,
|
|
+ *authority->priv->js_global,
|
|
+ options,
|
|
"init.js", /* filename */
|
|
- 0, /* lineno */
|
|
- NULL)) /* rval */
|
|
- {
|
|
+ &result
|
|
+ ))
|
|
goto fail;
|
|
- }
|
|
|
|
if (authority->priv->rules_dirs == NULL)
|
|
{
|
|
@@ -571,14 +558,15 @@ polkit_backend_js_authority_finalize (GObject *object)
|
|
g_strfreev (authority->priv->rules_dirs);
|
|
|
|
JS_BeginRequest (authority->priv->cx);
|
|
- JS_RemoveObjectRoot (authority->priv->cx, &authority->priv->js_polkit);
|
|
+ delete authority->priv->js_polkit;
|
|
+ delete authority->priv->js_global;
|
|
delete authority->priv->ac;
|
|
- JS_RemoveObjectRoot (authority->priv->cx, &authority->priv->js_global);
|
|
JS_EndRequest (authority->priv->cx);
|
|
|
|
JS_DestroyContext (authority->priv->cx);
|
|
JS_DestroyRuntime (authority->priv->rt);
|
|
- /* JS_ShutDown (); */
|
|
+
|
|
+ JS_ShutDown();
|
|
|
|
G_OBJECT_CLASS (polkit_backend_js_authority_parent_class)->finalize (object);
|
|
}
|
|
@@ -661,21 +649,22 @@ polkit_backend_js_authority_class_init (PolkitBackendJsAuthorityClass *klass)
|
|
/* authority->priv->cx must be within a request */
|
|
static void
|
|
set_property_str (PolkitBackendJsAuthority *authority,
|
|
- JSObject *obj,
|
|
+ JS::RootedObject *obj,
|
|
const gchar *name,
|
|
const gchar *value)
|
|
{
|
|
JSString *value_jsstr;
|
|
- jsval value_jsval;
|
|
+ JS::Value value_jsval;
|
|
value_jsstr = JS_NewStringCopyZ (authority->priv->cx, value);
|
|
value_jsval = STRING_TO_JSVAL (value_jsstr);
|
|
- JS_SetProperty (authority->priv->cx, obj, name, &value_jsval);
|
|
+ JS::RootedValue svalue(authority->priv->cx, value_jsval);
|
|
+ JS_SetProperty (authority->priv->cx, *obj, name, svalue);
|
|
}
|
|
|
|
/* authority->priv->cx must be within a request */
|
|
static void
|
|
set_property_strv (PolkitBackendJsAuthority *authority,
|
|
- JSObject *obj,
|
|
+ JS::RootedObject *obj,
|
|
const gchar *name,
|
|
GPtrArray *value)
|
|
{
|
|
@@ -683,7 +672,8 @@ set_property_strv (PolkitBackendJsAuthority *authority,
|
|
JSObject *array_object;
|
|
guint n;
|
|
|
|
- array_object = JS_NewArrayObject (authority->priv->cx, 0, NULL);
|
|
+ array_object = JS_NewArrayObject (authority->priv->cx, 0);
|
|
+ JS::RootedObject rooted_array_object(authority->priv->cx, array_object);
|
|
|
|
for (n = 0; n < value->len; n++)
|
|
{
|
|
@@ -691,36 +681,39 @@ set_property_strv (PolkitBackendJsAuthority *authority,
|
|
jsval val;
|
|
|
|
jsstr = JS_NewStringCopyZ (authority->priv->cx, (char *)g_ptr_array_index(value, n));
|
|
- val = STRING_TO_JSVAL (jsstr);
|
|
- JS_SetElement (authority->priv->cx, array_object, n, &val);
|
|
+ JS::RootedString svalue(authority->priv->cx, jsstr);
|
|
+ JS_SetElement (authority->priv->cx, rooted_array_object, (uint32_t)n, svalue);
|
|
}
|
|
|
|
value_jsval = OBJECT_TO_JSVAL (array_object);
|
|
- JS_SetProperty (authority->priv->cx, obj, name, &value_jsval);
|
|
+ JS::RootedValue svalue(authority->priv->cx, value_jsval);
|
|
+ JS_SetProperty (authority->priv->cx, *obj, name, svalue);
|
|
}
|
|
|
|
/* authority->priv->cx must be within a request */
|
|
static void
|
|
set_property_int32 (PolkitBackendJsAuthority *authority,
|
|
- JSObject *obj,
|
|
+ JS::RootedObject *obj,
|
|
const gchar *name,
|
|
gint32 value)
|
|
{
|
|
jsval value_jsval;
|
|
value_jsval = INT_TO_JSVAL ((gint32) value);
|
|
- JS_SetProperty (authority->priv->cx, obj, name, &value_jsval);
|
|
+ JS::RootedValue svalue(authority->priv->cx, value_jsval);
|
|
+ JS_SetProperty (authority->priv->cx, *obj, name, svalue);
|
|
}
|
|
|
|
/* authority->priv->cx must be within a request */
|
|
static void
|
|
set_property_bool (PolkitBackendJsAuthority *authority,
|
|
- JSObject *obj,
|
|
+ JS::RootedObject *obj,
|
|
const gchar *name,
|
|
gboolean value)
|
|
{
|
|
jsval value_jsval;
|
|
- value_jsval = BOOLEAN_TO_JSVAL ((JSBool) value);
|
|
- JS_SetProperty (authority->priv->cx, obj, name, &value_jsval);
|
|
+ value_jsval = BOOLEAN_TO_JSVAL ((bool) value);
|
|
+ JS::RootedValue svalue(authority->priv->cx, value_jsval);
|
|
+ JS_SetProperty (authority->priv->cx, *obj, name, svalue);
|
|
}
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
@@ -732,11 +725,10 @@ subject_to_jsval (PolkitBackendJsAuthority *authority,
|
|
PolkitIdentity *user_for_subject,
|
|
gboolean subject_is_local,
|
|
gboolean subject_is_active,
|
|
- jsval *out_jsval,
|
|
+ JS::RootedValue *out_jsval,
|
|
GError **error)
|
|
{
|
|
gboolean ret = FALSE;
|
|
- jsval ret_jsval;
|
|
const char *src;
|
|
JSObject *obj;
|
|
pid_t pid;
|
|
@@ -747,19 +739,21 @@ subject_to_jsval (PolkitBackendJsAuthority *authority,
|
|
char *seat_str = NULL;
|
|
char *session_str = NULL;
|
|
|
|
+ JS::CompileOptions options(authority->priv->cx);
|
|
+ options.setUTF8(true);
|
|
+
|
|
src = "new Subject();";
|
|
- if (!JS_EvaluateScript (authority->priv->cx,
|
|
- authority->priv->js_global,
|
|
- src, strlen (src),
|
|
- __FILE__, __LINE__,
|
|
- &ret_jsval))
|
|
+
|
|
+ if (!JS::Evaluate(authority->priv->cx,
|
|
+ *authority->priv->js_global,
|
|
+ options,
|
|
+ src, strlen (src),
|
|
+ out_jsval))
|
|
{
|
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Evaluating '%s' failed", src);
|
|
goto out;
|
|
}
|
|
|
|
- obj = JSVAL_TO_OBJECT (ret_jsval);
|
|
-
|
|
if (POLKIT_IS_UNIX_PROCESS (subject))
|
|
{
|
|
pid = polkit_unix_process_get_pid (POLKIT_UNIX_PROCESS (subject));
|
|
@@ -832,14 +826,17 @@ subject_to_jsval (PolkitBackendJsAuthority *authority,
|
|
}
|
|
}
|
|
|
|
- set_property_int32 (authority, obj, "pid", pid);
|
|
- set_property_str (authority, obj, "user", user_name);
|
|
- set_property_strv (authority, obj, "groups", groups);
|
|
- set_property_str (authority, obj, "seat", seat_str);
|
|
- set_property_str (authority, obj, "session", session_str);
|
|
- set_property_bool (authority, obj, "local", subject_is_local);
|
|
- set_property_bool (authority, obj, "active", subject_is_active);
|
|
-
|
|
+ {
|
|
+ JS::RootedObject outret(authority->priv->cx, &out_jsval->toObject());
|
|
+
|
|
+ set_property_int32 (authority, &outret, "pid", pid);
|
|
+ set_property_str (authority, &outret, "user", user_name);
|
|
+ set_property_strv (authority, &outret, "groups", groups);
|
|
+ set_property_str (authority, &outret, "seat", seat_str);
|
|
+ set_property_str (authority, &outret, "session", session_str);
|
|
+ set_property_bool (authority, &outret, "local", subject_is_local);
|
|
+ set_property_bool (authority, &outret, "active", subject_is_active);
|
|
+ }
|
|
ret = TRUE;
|
|
|
|
out:
|
|
@@ -849,9 +846,6 @@ subject_to_jsval (PolkitBackendJsAuthority *authority,
|
|
if (groups != NULL)
|
|
g_ptr_array_unref (groups);
|
|
|
|
- if (ret && out_jsval != NULL)
|
|
- *out_jsval = ret_jsval;
|
|
-
|
|
return ret;
|
|
}
|
|
|
|
@@ -862,48 +856,50 @@ static gboolean
|
|
action_and_details_to_jsval (PolkitBackendJsAuthority *authority,
|
|
const gchar *action_id,
|
|
PolkitDetails *details,
|
|
- jsval *out_jsval,
|
|
+ JS::RootedValue *out_jsval,
|
|
GError **error)
|
|
{
|
|
gboolean ret = FALSE;
|
|
- jsval ret_jsval;
|
|
const char *src;
|
|
JSObject *obj;
|
|
gchar **keys;
|
|
guint n;
|
|
|
|
+ JS::CompileOptions options(authority->priv->cx);
|
|
+ options.setUTF8(true);
|
|
+
|
|
src = "new Action();";
|
|
- if (!JS_EvaluateScript (authority->priv->cx,
|
|
- authority->priv->js_global,
|
|
- src, strlen (src),
|
|
- __FILE__, __LINE__,
|
|
- &ret_jsval))
|
|
+ if (!JS::Evaluate(authority->priv->cx,
|
|
+ *authority->priv->js_global,
|
|
+ options,
|
|
+ src, strlen (src),
|
|
+ out_jsval))
|
|
{
|
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Evaluating '%s' failed", src);
|
|
goto out;
|
|
}
|
|
|
|
- obj = JSVAL_TO_OBJECT (ret_jsval);
|
|
+ {
|
|
+ JS::RootedObject outret(authority->priv->cx, &out_jsval->toObject());
|
|
|
|
- set_property_str (authority, obj, "id", action_id);
|
|
+ set_property_str (authority, &outret, "id", action_id);
|
|
|
|
- keys = polkit_details_get_keys (details);
|
|
- for (n = 0; keys != NULL && keys[n] != NULL; n++)
|
|
- {
|
|
- gchar *key;
|
|
- const gchar *value;
|
|
- key = g_strdup_printf ("_detail_%s", keys[n]);
|
|
- value = polkit_details_lookup (details, keys[n]);
|
|
- set_property_str (authority, obj, key, value);
|
|
- g_free (key);
|
|
- }
|
|
- g_strfreev (keys);
|
|
+ keys = polkit_details_get_keys (details);
|
|
+ for (n = 0; keys != NULL && keys[n] != NULL; n++)
|
|
+ {
|
|
+ gchar *key;
|
|
+ const gchar *value;
|
|
+ key = g_strdup_printf ("_detail_%s", keys[n]);
|
|
+ value = polkit_details_lookup (details, keys[n]);
|
|
+ set_property_str (authority, &outret, key, value);
|
|
+ g_free (key);
|
|
+ }
|
|
+ g_strfreev (keys);
|
|
+ }
|
|
|
|
ret = TRUE;
|
|
|
|
out:
|
|
- if (ret && out_jsval != NULL)
|
|
- *out_jsval = ret_jsval;
|
|
|
|
return ret;
|
|
}
|
|
@@ -939,7 +935,7 @@ runaway_killer_thread_func (gpointer user_data)
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
-static JSBool
|
|
+static bool
|
|
js_operation_callback (JSContext *cx)
|
|
{
|
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (JS_GetContextPrivate (cx));
|
|
@@ -953,7 +949,7 @@ js_operation_callback (JSContext *cx)
|
|
if (!authority->priv->rkt_timeout_pending)
|
|
{
|
|
g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
|
|
- return JS_TRUE;
|
|
+ return true;
|
|
}
|
|
authority->priv->rkt_timeout_pending = FALSE;
|
|
g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
|
|
@@ -962,12 +958,11 @@ js_operation_callback (JSContext *cx)
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority), "Terminating runaway script");
|
|
|
|
/* Throw an exception - this way the JS code can ignore the runaway script handling */
|
|
- JS_SetOperationCallback (authority->priv->cx, NULL);
|
|
val_str = JS_NewStringCopyZ (cx, "Terminating runaway script");
|
|
val = STRING_TO_JSVAL (val_str);
|
|
- JS_SetPendingException (authority->priv->cx, val);
|
|
- JS_SetOperationCallback (authority->priv->cx, js_operation_callback);
|
|
- return JS_FALSE;
|
|
+ JS::RootedValue svalue(authority->priv->cx, val);
|
|
+ JS_SetPendingException (authority->priv->cx, svalue);
|
|
+ return false;
|
|
}
|
|
|
|
static gboolean
|
|
@@ -980,7 +975,7 @@ rkt_on_timeout (gpointer user_data)
|
|
g_mutex_unlock (&authority->priv->rkt_timeout_pending_mutex);
|
|
|
|
/* Supposedly this is thread-safe... */
|
|
- JS_TriggerOperationCallback (authority->priv->rt);
|
|
+ JS_RequestInterruptCallback (authority->priv->rt);
|
|
|
|
/* keep source around so we keep trying to kill even if the JS bit catches the exception
|
|
* thrown in js_operation_callback()
|
|
@@ -1004,49 +999,48 @@ runaway_killer_setup (PolkitBackendJsAuthority *authority)
|
|
/* ... rkt_on_timeout() will then poke the JSContext so js_operation_callback() is
|
|
* called... and from there we throw an exception
|
|
*/
|
|
- JS_SetOperationCallback (authority->priv->cx, js_operation_callback);
|
|
+ JS_SetInterruptCallback (authority->priv->rt, js_operation_callback);
|
|
+
|
|
}
|
|
|
|
static void
|
|
runaway_killer_teardown (PolkitBackendJsAuthority *authority)
|
|
{
|
|
- JS_SetOperationCallback (authority->priv->cx, NULL);
|
|
+ JS_SetInterruptCallback (authority->priv->rt, NULL);
|
|
g_source_destroy (authority->priv->rkt_source);
|
|
g_source_unref (authority->priv->rkt_source);
|
|
authority->priv->rkt_source = NULL;
|
|
}
|
|
|
|
-static JSBool
|
|
+static bool
|
|
execute_script_with_runaway_killer (PolkitBackendJsAuthority *authority,
|
|
- JSScript *script,
|
|
- jsval *rval)
|
|
+ JS::RootedScript *script,
|
|
+ JS::RootedValue *rval)
|
|
{
|
|
- JSBool ret;
|
|
+ bool ret;
|
|
|
|
runaway_killer_setup (authority);
|
|
ret = JS_ExecuteScript (authority->priv->cx,
|
|
- authority->priv->js_global,
|
|
- script,
|
|
+ *authority->priv->js_global,
|
|
+ *script,
|
|
rval);
|
|
runaway_killer_teardown (authority);
|
|
|
|
return ret;
|
|
}
|
|
|
|
-static JSBool
|
|
+static bool
|
|
call_js_function_with_runaway_killer (PolkitBackendJsAuthority *authority,
|
|
const char *function_name,
|
|
- unsigned argc,
|
|
- jsval *argv,
|
|
- jsval *rval)
|
|
+ JS::AutoValueArray<2> *argv,
|
|
+ JS::RootedValue *rval)
|
|
{
|
|
- JSBool ret;
|
|
+ bool ret;
|
|
runaway_killer_setup (authority);
|
|
ret = JS_CallFunctionName(authority->priv->cx,
|
|
- authority->priv->js_polkit,
|
|
+ *authority->priv->js_polkit,
|
|
function_name,
|
|
- argc,
|
|
- argv,
|
|
+ *argv,
|
|
rval);
|
|
runaway_killer_teardown (authority);
|
|
return ret;
|
|
@@ -1066,17 +1060,18 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
{
|
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
|
|
GList *ret = NULL;
|
|
- jsval argv[2] = {JSVAL_NULL, JSVAL_NULL};
|
|
- jsval rval = JSVAL_NULL;
|
|
+ JS::AutoValueArray<2> argv(authority->priv->cx);
|
|
+ JS::RootedValue argv0(authority->priv->cx);
|
|
+ JS::RootedValue argv1(authority->priv->cx);
|
|
+ JS::RootedValue rval(authority->priv->cx);
|
|
guint n;
|
|
GError *error = NULL;
|
|
- JSString *ret_jsstr;
|
|
gchar *ret_str = NULL;
|
|
gchar **ret_strs = NULL;
|
|
|
|
JS_BeginRequest (authority->priv->cx);
|
|
|
|
- if (!action_and_details_to_jsval (authority, action_id, details, &argv[0], &error))
|
|
+ if (!action_and_details_to_jsval (authority, action_id, details, &argv0, &error))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
"Error converting action and details to JS object: %s",
|
|
@@ -1090,7 +1085,7 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
user_for_subject,
|
|
subject_is_local,
|
|
subject_is_active,
|
|
- &argv[1],
|
|
+ &argv1,
|
|
&error))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
@@ -1099,11 +1094,12 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
g_clear_error (&error);
|
|
goto out;
|
|
}
|
|
-
|
|
+ argv[0].setObject(argv0.toObject());
|
|
+ argv[1].setObject(argv1.toObject());
|
|
if (!call_js_function_with_runaway_killer (authority,
|
|
"_runAdminRules",
|
|
- G_N_ELEMENTS (argv),
|
|
- argv,
|
|
+ // G_N_ELEMENTS (argv),
|
|
+ &argv,
|
|
&rval))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
@@ -1111,14 +1107,17 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
goto out;
|
|
}
|
|
|
|
- if (!JSVAL_IS_STRING (rval))
|
|
+ if (!rval.isString())
|
|
{
|
|
g_warning ("Expected a string");
|
|
goto out;
|
|
}
|
|
|
|
- ret_jsstr = JSVAL_TO_STRING (rval);
|
|
- ret_str = g_utf16_to_utf8 (JS_GetStringCharsZ (authority->priv->cx, ret_jsstr), -1, NULL, NULL, NULL);
|
|
+ {
|
|
+ JS::RootedString ToUtf8(authority->priv->cx,rval.toString());
|
|
+ ret_str = JS_EncodeStringToUTF8(authority->priv->cx, ToUtf8);
|
|
+ }
|
|
+
|
|
if (ret_str == NULL)
|
|
{
|
|
g_warning ("Error converting resulting string to UTF-8: %s", error->message);
|
|
@@ -1136,8 +1135,8 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
if (identity == NULL)
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
- "Identity `%s' is not valid, ignoring",
|
|
- identity_str);
|
|
+ "Identity `%s' is not valid, ignoring ret strs %s",
|
|
+ identity_str, ret_str);
|
|
}
|
|
else
|
|
{
|
|
@@ -1148,7 +1147,7 @@ polkit_backend_js_authority_get_admin_auth_identities (PolkitBackendInteractiveA
|
|
|
|
out:
|
|
g_strfreev (ret_strs);
|
|
- g_free (ret_str);
|
|
+ JS_free(authority->priv->cx, ret_str);
|
|
/* fallback to root password auth */
|
|
if (ret == NULL)
|
|
ret = g_list_prepend (ret, polkit_unix_user_new (0));
|
|
@@ -1175,17 +1174,18 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
{
|
|
PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (_authority);
|
|
PolkitImplicitAuthorization ret = implicit;
|
|
- jsval argv[2] = {JSVAL_NULL, JSVAL_NULL};
|
|
- jsval rval = JSVAL_NULL;
|
|
+ JS::AutoValueArray<2> argv(authority->priv->cx);
|
|
+ JS::RootedValue argv0(authority->priv->cx);
|
|
+ JS::RootedValue argv1(authority->priv->cx);
|
|
+ JS::RootedValue rval(authority->priv->cx);
|
|
GError *error = NULL;
|
|
- JSString *ret_jsstr;
|
|
- const jschar *ret_utf16;
|
|
+
|
|
gchar *ret_str = NULL;
|
|
gboolean good = FALSE;
|
|
|
|
JS_BeginRequest (authority->priv->cx);
|
|
|
|
- if (!action_and_details_to_jsval (authority, action_id, details, &argv[0], &error))
|
|
+ if (!action_and_details_to_jsval (authority, action_id, details, &argv0, &error))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
"Error converting action and details to JS object: %s",
|
|
@@ -1199,7 +1199,7 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
user_for_subject,
|
|
subject_is_local,
|
|
subject_is_active,
|
|
- &argv[1],
|
|
+ &argv1,
|
|
&error))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
@@ -1209,10 +1209,13 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
goto out;
|
|
}
|
|
|
|
+ argv[0].setObject(argv0.toObject());
|
|
+ argv[1].setObject(argv1.toObject());
|
|
+
|
|
if (!call_js_function_with_runaway_killer (authority,
|
|
"_runRules",
|
|
- G_N_ELEMENTS (argv),
|
|
- argv,
|
|
+ // G_N_ELEMENTS (argv),
|
|
+ &argv,
|
|
&rval))
|
|
{
|
|
polkit_backend_authority_log (POLKIT_BACKEND_AUTHORITY (authority),
|
|
@@ -1220,22 +1223,17 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
goto out;
|
|
}
|
|
|
|
- if (JSVAL_IS_NULL (rval))
|
|
- {
|
|
- /* this fine, means there was no match, use implicit authorizations */
|
|
- good = TRUE;
|
|
- goto out;
|
|
- }
|
|
-
|
|
- if (!JSVAL_IS_STRING (rval))
|
|
+ if (!rval.isString())
|
|
{
|
|
g_warning ("Expected a string");
|
|
goto out;
|
|
}
|
|
|
|
- ret_jsstr = JSVAL_TO_STRING (rval);
|
|
- ret_utf16 = JS_GetStringCharsZ (authority->priv->cx, ret_jsstr);
|
|
- ret_str = g_utf16_to_utf8 (ret_utf16, -1, NULL, NULL, &error);
|
|
+ {
|
|
+ JS::RootedString ToUtf8(authority->priv->cx,rval.toString());
|
|
+ ret_str = JS_EncodeStringToUTF8(authority->priv->cx, ToUtf8);
|
|
+ }
|
|
+
|
|
if (ret_str == NULL)
|
|
{
|
|
g_warning ("Error converting resulting string to UTF-8: %s", error->message);
|
|
@@ -1257,7 +1255,7 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
out:
|
|
if (!good)
|
|
ret = POLKIT_IMPLICIT_AUTHORIZATION_NOT_AUTHORIZED;
|
|
- g_free (ret_str);
|
|
+ JS_free(authority->priv->cx, ret_str);
|
|
|
|
JS_MaybeGC (authority->priv->cx);
|
|
|
|
@@ -1268,26 +1266,26 @@ polkit_backend_js_authority_check_authorization_sync (PolkitBackendInteractiveAu
|
|
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
-static JSBool
|
|
+static bool
|
|
js_polkit_log (JSContext *cx,
|
|
unsigned argc,
|
|
jsval *vp)
|
|
{
|
|
/* PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (JS_GetContextPrivate (cx)); */
|
|
- JSBool ret = JS_FALSE;
|
|
+ bool ret = false;
|
|
JSString *str;
|
|
char *s;
|
|
|
|
- if (!JS_ConvertArguments (cx, argc, JS_ARGV (cx, vp), "S", &str))
|
|
- goto out;
|
|
+ JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
+ str = JS::ToString(cx, args[0]);
|
|
|
|
s = JS_EncodeString (cx, str);
|
|
JS_ReportWarning (cx, s);
|
|
JS_free (cx, s);
|
|
|
|
- ret = JS_TRUE;
|
|
+ ret = true;
|
|
|
|
- JS_SET_RVAL (cx, vp, JSVAL_VOID); /* return undefined */
|
|
+ args.rval().setUndefined(); //returned undefined
|
|
out:
|
|
return ret;
|
|
}
|
|
@@ -1353,13 +1351,13 @@ spawn_cb (GObject *source_object,
|
|
g_main_loop_quit (data->loop);
|
|
}
|
|
|
|
-static JSBool
|
|
+static bool
|
|
js_polkit_spawn (JSContext *cx,
|
|
- unsigned js_argc,
|
|
+ unsigned argc,
|
|
jsval *vp)
|
|
{
|
|
/* PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (JS_GetContextPrivate (cx)); */
|
|
- JSBool ret = JS_FALSE;
|
|
+ bool ret = false;
|
|
JSObject *array_object;
|
|
gchar *standard_output = NULL;
|
|
gchar *standard_error = NULL;
|
|
@@ -1372,11 +1370,13 @@ js_polkit_spawn (JSContext *cx,
|
|
GMainLoop *loop = NULL;
|
|
SpawnData data = {0};
|
|
guint n;
|
|
+ JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
|
|
- if (!JS_ConvertArguments (cx, js_argc, JS_ARGV (cx, vp), "o", &array_object))
|
|
- goto out;
|
|
+ array_object=JS::ToObject(cx, args[0]);
|
|
+
|
|
+ JS::RootedObject opts(cx, array_object);
|
|
|
|
- if (!JS_GetArrayLength (cx, array_object, &array_len))
|
|
+ if (!JS_GetArrayLength (cx, opts, &array_len))
|
|
{
|
|
JS_ReportError (cx, "Failed to get array length");
|
|
goto out;
|
|
@@ -1387,18 +1387,19 @@ js_polkit_spawn (JSContext *cx,
|
|
{
|
|
jsval elem_val;
|
|
char *s;
|
|
+ JS::RootedValue elemval(cx, elem_val);
|
|
|
|
- if (!JS_GetElement (cx, array_object, n, &elem_val))
|
|
+ if (!JS_GetElement (cx, opts, n, &elemval))
|
|
{
|
|
JS_ReportError (cx, "Failed to get element %d", n);
|
|
goto out;
|
|
}
|
|
- if (!JSVAL_IS_STRING (elem_val))
|
|
- {
|
|
+ if (!elemval.isString())
|
|
+ {
|
|
JS_ReportError (cx, "Element %d is not a string", n);
|
|
goto out;
|
|
- }
|
|
- s = JS_EncodeString (cx, JSVAL_TO_STRING (elem_val));
|
|
+ }
|
|
+ s = JS_EncodeString (cx, elemval.toString());
|
|
argv[n] = g_strdup (s);
|
|
JS_free (cx, s);
|
|
}
|
|
@@ -1456,10 +1457,10 @@ js_polkit_spawn (JSContext *cx,
|
|
goto out;
|
|
}
|
|
|
|
- ret = JS_TRUE;
|
|
+ ret = true;
|
|
|
|
ret_jsstr = JS_NewStringCopyZ (cx, standard_output);
|
|
- JS_SET_RVAL (cx, vp, STRING_TO_JSVAL (ret_jsstr));
|
|
+ args.rval().setString(ret_jsstr);
|
|
|
|
out:
|
|
g_strfreev (argv);
|
|
@@ -1476,21 +1477,22 @@ js_polkit_spawn (JSContext *cx,
|
|
/* ---------------------------------------------------------------------------------------------------- */
|
|
|
|
|
|
-static JSBool
|
|
+static bool
|
|
js_polkit_user_is_in_netgroup (JSContext *cx,
|
|
unsigned argc,
|
|
jsval *vp)
|
|
{
|
|
/* PolkitBackendJsAuthority *authority = POLKIT_BACKEND_JS_AUTHORITY (JS_GetContextPrivate (cx)); */
|
|
- JSBool ret = JS_FALSE;
|
|
+ bool ret = false;
|
|
JSString *user_str;
|
|
JSString *netgroup_str;
|
|
char *user;
|
|
char *netgroup;
|
|
- JSBool is_in_netgroup = JS_FALSE;
|
|
+ bool is_in_netgroup = false;
|
|
+ JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
|
|
|
|
- if (!JS_ConvertArguments (cx, argc, JS_ARGV (cx, vp), "SS", &user_str, &netgroup_str))
|
|
- goto out;
|
|
+ user_str = JS::ToString(cx, args[0]);
|
|
+ netgroup_str = JS::ToString(cx, args[1]);
|
|
|
|
user = JS_EncodeString (cx, user_str);
|
|
netgroup = JS_EncodeString (cx, netgroup_str);
|
|
@@ -1500,15 +1502,15 @@ js_polkit_user_is_in_netgroup (JSContext *cx,
|
|
user,
|
|
NULL)) /* domain */
|
|
{
|
|
- is_in_netgroup = JS_TRUE;
|
|
+ is_in_netgroup = true;
|
|
}
|
|
|
|
JS_free (cx, netgroup);
|
|
JS_free (cx, user);
|
|
|
|
- ret = JS_TRUE;
|
|
+ ret = true;
|
|
|
|
- JS_SET_RVAL (cx, vp, BOOLEAN_TO_JSVAL (is_in_netgroup));
|
|
+ args.rval().setBoolean(is_in_netgroup);
|
|
out:
|
|
return ret;
|
|
}
|
|
--
|
|
2.11.0
|