try running permissions advice after editing
This implies it must be side-effect free. We still need to figure out how to convey that to the computer owner.
This commit is contained in:
parent
855eafd1d9
commit
ffd600b111
24
src/teliva.c
24
src/teliva.c
|
@ -1305,6 +1305,23 @@ static void render_permissions_screen() {
|
||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Try running the function to test for errors. If code has an error, leave it
|
||||||
|
* on the stack and return non-zero */
|
||||||
|
int validate_file_operations_predicate() {
|
||||||
|
lua_getglobal(trustedL, "file_operation_permitted");
|
||||||
|
lua_pushstring(trustedL, "foo");
|
||||||
|
lua_pushstring(trustedL, "r");
|
||||||
|
if (lua_pcall(trustedL, 2 /*args*/, 1 /*result*/, /*errfunc*/0)) {
|
||||||
|
/* TODO: error handling. Or should we use errfunc above? */
|
||||||
|
}
|
||||||
|
int status = 1;
|
||||||
|
if (lua_isboolean(trustedL, -1)) {
|
||||||
|
lua_pop(trustedL, 1);
|
||||||
|
status = 0;
|
||||||
|
}
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static int load_file_operations_predicate(const char* body) {
|
static int load_file_operations_predicate(const char* body) {
|
||||||
char buffer[1024] = {0};
|
char buffer[1024] = {0};
|
||||||
strcpy(buffer, "function file_operation_permitted(filename, mode)\n");
|
strcpy(buffer, "function file_operation_permitted(filename, mode)\n");
|
||||||
|
@ -1313,11 +1330,12 @@ static int load_file_operations_predicate(const char* body) {
|
||||||
strncat(buffer, "\n", 1020);
|
strncat(buffer, "\n", 1020);
|
||||||
strncat(buffer, "end\n", 1020);
|
strncat(buffer, "end\n", 1020);
|
||||||
return luaL_loadbuffer(trustedL, buffer, strlen(buffer), "file_operation_permitted")
|
return luaL_loadbuffer(trustedL, buffer, strlen(buffer), "file_operation_permitted")
|
||||||
|| docall(trustedL, 0, 1);
|
|| docall(trustedL, 0, 1)
|
||||||
|
|| validate_file_operations_predicate();
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void editNonCode2(char* filename);
|
extern void editNonCode2(char* filename);
|
||||||
extern void resumeNonCodeEdit();
|
extern void resumeNonCodeEdit2();
|
||||||
static void edit_file_operations_predicate_body() {
|
static void edit_file_operations_predicate_body() {
|
||||||
static char file_operations_predicate_body_buffer[512];
|
static char file_operations_predicate_body_buffer[512];
|
||||||
/* save to disk */
|
/* save to disk */
|
||||||
|
@ -1348,7 +1366,7 @@ static void edit_file_operations_predicate_body() {
|
||||||
break;
|
break;
|
||||||
Previous_error = lua_tostring(trustedL, -1);
|
Previous_error = lua_tostring(trustedL, -1);
|
||||||
if (Previous_error == NULL) Previous_error = "(error object is not a string)";
|
if (Previous_error == NULL) Previous_error = "(error object is not a string)";
|
||||||
resumeNonCodeEdit();
|
resumeNonCodeEdit2();
|
||||||
lua_pop(trustedL, 1);
|
lua_pop(trustedL, 1);
|
||||||
}
|
}
|
||||||
file_operations_predicate_body = file_operations_predicate_body_buffer;
|
file_operations_predicate_body = file_operations_predicate_body_buffer;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user