polkit/polkit-mozjs38.patch

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