js: Move storePermission to C.
This commit is contained in:
		
							
								
								
									
										106
									
								
								src/ssb.js.c
									
									
									
									
									
								
							
							
						
						
									
										106
									
								
								src/ssb.js.c
									
									
									
									
									
								
							| @@ -2394,6 +2394,111 @@ static JSValue _tf_ssb_sync(JSContext* context, JSValueConst this_val, int argc, | ||||
| 	return JS_UNDEFINED; | ||||
| } | ||||
|  | ||||
| typedef struct _set_user_permission_t | ||||
| { | ||||
| 	tf_ssb_t* ssb; | ||||
| 	JSContext* context; | ||||
| 	const char* user; | ||||
| 	const char* package_owner; | ||||
| 	const char* package_name; | ||||
| 	const char* permission; | ||||
| 	bool allow; | ||||
| 	bool result; | ||||
| 	JSValue promise[2]; | ||||
| } set_user_permission_t; | ||||
|  | ||||
| static void _tf_ssb_set_user_permission_work(tf_ssb_t* ssb, void* user_data) | ||||
| { | ||||
| 	set_user_permission_t* work = user_data; | ||||
|  | ||||
| 	JSMallocFunctions funcs = { 0 }; | ||||
| 	tf_get_js_malloc_functions(&funcs); | ||||
| 	JSRuntime* runtime = JS_NewRuntime2(&funcs, NULL); | ||||
| 	JSContext* context = JS_NewContext(runtime); | ||||
|  | ||||
| 	/* XXX: Do this with one DB writer. */ | ||||
| 	const char* settings = tf_ssb_db_get_property(ssb, "core", "settings"); | ||||
| 	if (settings) | ||||
| 	{ | ||||
| 		JSValue settings_value = JS_ParseJSON(context, settings, strlen(settings), NULL); | ||||
| 		JSValue user_permissions = JS_GetPropertyStr(context, settings_value, "userPermissions"); | ||||
| 		if (JS_IsUndefined(user_permissions)) | ||||
| 		{ | ||||
| 			user_permissions = JS_NewObject(context); | ||||
| 			JS_SetPropertyStr(context, settings_value, "userPermissions", JS_DupValue(context, user_permissions)); | ||||
| 		} | ||||
| 		JSValue user = JS_GetPropertyStr(context, user_permissions, work->user); | ||||
| 		if (JS_IsUndefined(user)) | ||||
| 		{ | ||||
| 			user = JS_NewObject(context); | ||||
| 			JS_SetPropertyStr(context, user_permissions, work->user, JS_DupValue(context, user)); | ||||
| 		} | ||||
| 		JSValue package_owner = JS_GetPropertyStr(context, user, work->package_owner); | ||||
| 		if (JS_IsUndefined(package_owner)) | ||||
| 		{ | ||||
| 			package_owner = JS_NewObject(context); | ||||
| 			JS_SetPropertyStr(context, user, work->package_owner, JS_DupValue(context, package_owner)); | ||||
| 		} | ||||
| 		JSValue package_name = JS_GetPropertyStr(context, package_owner, work->package_name); | ||||
| 		if (JS_IsUndefined(package_name)) | ||||
| 		{ | ||||
| 			package_name = JS_NewObject(context); | ||||
| 			JS_SetPropertyStr(context, package_owner, work->package_name, package_name); | ||||
| 		} | ||||
| 		JSValue permission = JS_GetPropertyStr(context, package_name, work->permission); | ||||
| 		if (JS_ToBool(context, permission) != work->allow) | ||||
| 		{ | ||||
| 			JS_SetPropertyStr(context, package_name, work->permission, JS_NewBool(context, work->allow)); | ||||
| 			JSValue settings_json = JS_JSONStringify(context, settings_value, JS_NULL, JS_NULL); | ||||
| 			const char* settings_string = JS_ToCString(context, settings_json); | ||||
| 			work->result = tf_ssb_db_set_property(ssb, "core", "settings", settings_string); | ||||
| 			JS_FreeCString(context, settings_string); | ||||
| 			JS_FreeValue(context, settings_json); | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			work->result = true; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	JS_FreeContext(context); | ||||
| 	JS_FreeRuntime(runtime); | ||||
| } | ||||
|  | ||||
| static void _tf_ssb_set_user_permission_after_work(tf_ssb_t* ssb, int status, void* user_data) | ||||
| { | ||||
| 	set_user_permission_t* work = user_data; | ||||
| 	JSContext* context = work->context; | ||||
| 	JS_FreeCString(context, work->user); | ||||
| 	JS_FreeCString(context, work->package_owner); | ||||
| 	JS_FreeCString(context, work->package_name); | ||||
| 	JS_FreeCString(context, work->permission); | ||||
| 	JSValue error = JS_Call(context, work->result ? work->promise[0] : work->promise[0], JS_UNDEFINED, 0, NULL); | ||||
| 	tf_util_report_error(context, error); | ||||
| 	JS_FreeValue(context, error); | ||||
| 	JS_FreeValue(context, work->promise[0]); | ||||
| 	JS_FreeValue(context, work->promise[1]); | ||||
| 	tf_free(work); | ||||
| } | ||||
|  | ||||
| static JSValue _tf_ssb_set_user_permission(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv) | ||||
| { | ||||
| 	set_user_permission_t* set = tf_malloc(sizeof(set_user_permission_t)); | ||||
| 	*set = (set_user_permission_t) | ||||
| 	{ | ||||
| 		.ssb = JS_GetOpaque(this_val, _tf_ssb_classId), | ||||
| 		.context = context, | ||||
| 		.user = JS_ToCString(context, argv[0]), | ||||
| 		.package_owner = JS_ToCString(context, argv[1]), | ||||
| 		.package_name = JS_ToCString(context, argv[2]), | ||||
| 		.permission = JS_ToCString(context, argv[3]), | ||||
| 		.allow = JS_ToBool(context, argv[4]), | ||||
| 	}; | ||||
| 	JSValue result = JS_NewPromiseCapability(context, set->promise); | ||||
| 	tf_ssb_run_work(set->ssb, _tf_ssb_set_user_permission_work, _tf_ssb_set_user_permission_after_work, set); | ||||
| 	return result; | ||||
| } | ||||
|  | ||||
| void tf_ssb_register(JSContext* context, tf_ssb_t* ssb) | ||||
| { | ||||
| 	JS_NewClassID(&_tf_ssb_classId); | ||||
| @@ -2420,6 +2525,7 @@ void tf_ssb_register(JSContext* context, tf_ssb_t* ssb) | ||||
| 	JS_SetPropertyStr(context, object, "getPrivateKey", JS_NewCFunction(context, _tf_ssb_getPrivateKey, "getPrivateKey", 2)); | ||||
| 	JS_SetPropertyStr(context, object, "privateMessageEncrypt", JS_NewCFunction(context, _tf_ssb_private_message_encrypt, "privateMessageEncrypt", 4)); | ||||
| 	JS_SetPropertyStr(context, object, "privateMessageDecrypt", JS_NewCFunction(context, _tf_ssb_private_message_decrypt, "privateMessageDecrypt", 3)); | ||||
| 	JS_SetPropertyStr(context, object, "setUserPermission", JS_NewCFunction(context, _tf_ssb_set_user_permission, "setUserPermission", 5)); | ||||
| 	/* Write. */ | ||||
| 	JS_SetPropertyStr(context, object, "appendMessageWithIdentity", JS_NewCFunction(context, _tf_ssb_appendMessageWithIdentity, "appendMessageWithIdentity", 3)); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user