editing file permissions

This commit is contained in:
Kartik K. Agaram 2022-01-02 21:33:49 -08:00
parent e07fe0c87a
commit 2d0bb4438c
2 changed files with 76 additions and 42 deletions

View File

@ -1246,7 +1246,6 @@ static void editorNonCodeMenu(void) {
attrset(A_NORMAL); attrset(A_NORMAL);
} }
/* return true if user chose to back into the big picture view */
void editNonCode(char* filename) { void editNonCode(char* filename) {
Quit = 0; Quit = 0;
Back_to_big_picture = 0; Back_to_big_picture = 0;
@ -1264,6 +1263,28 @@ void editNonCode(char* filename) {
} }
} }
void editNonCode2(char* filename) {
Quit = 0;
Back_to_big_picture = 0;
initEditor();
E.startcol = LINE_NUMBER_SPACE;
E.startrow = 1; /* space for function header */
E.endrow = 10; /* nudge people to keep function short */
editorOpen(filename);
while(!Quit) {
/* update on resize */
E.cols = COLS-LINE_NUMBER_SPACE;
editorRefreshScreen(editorNonCodeMenu);
int y, x;
getyx(stdscr, y, x);
mvaddstr(0, 0, "function file_operation_permitted(filename, mode)");
mvaddstr(E.startrow + E.numrows - E.rowoff, 0, "end");
mvaddstr(y, x, "");
int c = getch();
editorProcessKeypress2(c);
}
}
/* return true if user chose to back into the big picture view */ /* return true if user chose to back into the big picture view */
int editFrom(lua_State* L, char* filename, int rowoff, int coloff, int cy, int cx) { int editFrom(lua_State* L, char* filename, int rowoff, int coloff, int cy, int cx) {
Quit = 0; Quit = 0;

View File

@ -51,8 +51,8 @@ static const char* trim(const char* in) {
return result; return result;
} }
const char* default_file_operations_predicate = "function file_operation_permitted(filename, mode)\n return false\nend"; const char* default_file_operations_predicate_body = "return false";
const char* file_operations_predicate; const char* file_operations_predicate_body;
int net_operations_permitted = false; int net_operations_permitted = false;
static void render_permissions(lua_State* L); static void render_permissions(lua_State* L);
@ -104,7 +104,7 @@ static void render_permissions(lua_State* L) {
attrset(A_NORMAL); attrset(A_NORMAL);
mvaddstr(LINES-1, COLS-12, ""); mvaddstr(LINES-1, COLS-12, "");
int file_colors = COLOR_PAIR_SAFE; int file_colors = COLOR_PAIR_SAFE;
if (file_operations_predicate && strcmp(default_file_operations_predicate, trim(file_operations_predicate)) != 0) if (file_operations_predicate_body && strcmp(default_file_operations_predicate_body, trim(file_operations_predicate_body)) != 0)
file_colors = COLOR_PAIR_WARN; file_colors = COLOR_PAIR_WARN;
int net_colors = net_operations_permitted ? COLOR_PAIR_WARN : COLOR_PAIR_SAFE; int net_colors = net_operations_permitted ? COLOR_PAIR_WARN : COLOR_PAIR_SAFE;
if (file_colors == COLOR_PAIR_WARN && net_colors == COLOR_PAIR_WARN) { if (file_colors == COLOR_PAIR_WARN && net_colors == COLOR_PAIR_WARN) {
@ -1096,7 +1096,9 @@ static void render_permissions_screen() {
attrset(A_NORMAL); attrset(A_NORMAL);
mvaddstr(7, 5, "File operations"); mvaddstr(7, 5, "File operations");
int y = render_wrapped_text(7, 30, COLS-5, file_operations_predicate); mvaddstr(7, 30, "function file_operation_permitted(filename, mode)");
int y = render_wrapped_text(8, 32, COLS-5, file_operations_predicate_body);
mvaddstr(y, 30, "end");
y += 2; y += 2;
int net_colors = net_operations_permitted ? COLOR_PAIR_WARN : COLOR_PAIR_SAFE; int net_colors = net_operations_permitted ? COLOR_PAIR_WARN : COLOR_PAIR_SAFE;
@ -1116,14 +1118,14 @@ static void render_permissions_screen() {
default: default:
abort(); abort();
} }
++y; y++;
attroff(A_REVERSE); attroff(A_REVERSE);
attroff(COLOR_PAIR(net_colors)); attroff(COLOR_PAIR(net_colors));
mvaddstr(y, 30, "(No nuance available for network operations.)"); mvaddstr(y, 30, "(No nuance available for network operations.)");
int file_operations_safe = strcmp(default_file_operations_predicate, trim(file_operations_predicate)) == 0; int file_operations_safe = strcmp(default_file_operations_predicate_body, trim(file_operations_predicate_body)) == 0;
int net_operations_safe = (net_operations_permitted == 0); int net_operations_safe = (net_operations_permitted == 0);
int file_operations_unsafe = strcmp("return true", trim(file_operations_predicate)) == 0; int file_operations_unsafe = strcmp("return true", trim(file_operations_predicate_body)) == 0;
int net_operations_unsafe = (net_operations_permitted != 0); int net_operations_unsafe = (net_operations_permitted != 0);
if (file_operations_safe && net_operations_safe) { if (file_operations_safe && net_operations_safe) {
attron(COLOR_PAIR(COLOR_PAIR_SAFE)); attron(COLOR_PAIR(COLOR_PAIR_SAFE));
@ -1156,33 +1158,34 @@ static void render_permissions_screen() {
refresh(); refresh();
} }
extern void editNonCode2(char* filename);
extern void resumeNonCodeEdit(); extern void resumeNonCodeEdit();
static void edit_file_operations_predicate() { static void edit_file_operations_predicate_body() {
static char file_operations_predicate_buffer[512]; static char file_operations_predicate_body_buffer[512];
/* save to disk */ /* save to disk */
char outfilename[] = "teliva_file_operations_predicate_XXXXXX"; char outfilename[] = "teliva_file_operations_predicate_body_XXXXXX";
int outfd = mkstemp(outfilename); int outfd = mkstemp(outfilename);
if (outfd == -1) { if (outfd == -1) {
endwin(); endwin();
perror("edit_file_operations_predicate: error in creating temporary file"); perror("edit_file_operations_predicate_body: error in creating temporary file");
abort(); abort();
} }
FILE* out = fdopen(outfd, "w"); FILE* out = fdopen(outfd, "w");
assert(out != NULL); assert(out != NULL);
fprintf(out, "%s", file_operations_predicate); fprintf(out, "%s", file_operations_predicate_body);
fclose(out); fclose(out);
rename(outfilename, "teliva_file_operations_predicate"); rename(outfilename, "teliva_file_operations_predicate_body");
editNonCode("teliva_file_operations_predicate"); editNonCode2("teliva_file_operations_predicate_body");
// error handling // error handling
assert(trustedL); assert(trustedL);
int oldtop = lua_gettop(trustedL); int oldtop = lua_gettop(trustedL);
while (1) { while (1) {
int status; int status;
memset(file_operations_predicate_buffer, '\0', 512); memset(file_operations_predicate_body_buffer, '\0', 512);
FILE* in = fopen("teliva_file_operations_predicate", "r"); FILE* in = fopen("teliva_file_operations_predicate_body", "r");
fread(file_operations_predicate_buffer, 500, 1, in); /* TODO: error message if file too large */ fread(file_operations_predicate_body_buffer, 500, 1, in); /* TODO: error message if file too large */
fclose(in); fclose(in);
status = luaL_loadbuffer(trustedL, file_operations_predicate_buffer, strlen(file_operations_predicate_buffer), "file_operation_permitted") status = luaL_loadbuffer(trustedL, file_operations_predicate_body_buffer, strlen(file_operations_predicate_body_buffer), "file_operation_permitted")
|| docall(trustedL, 0, 1); || docall(trustedL, 0, 1);
if (status == 0 || lua_isnil(trustedL, -1)) if (status == 0 || lua_isnil(trustedL, -1))
break; break;
@ -1191,10 +1194,10 @@ static void edit_file_operations_predicate() {
resumeNonCodeEdit(); resumeNonCodeEdit();
lua_pop(trustedL, 1); lua_pop(trustedL, 1);
} }
file_operations_predicate = file_operations_predicate_buffer; file_operations_predicate_body = file_operations_predicate_body_buffer;
if (lua_gettop(trustedL) != oldtop) { if (lua_gettop(trustedL) != oldtop) {
endwin(); endwin();
printf("edit_file_operations_predicate: memory leak %d -> %d\n", oldtop, lua_gettop(trustedL)); printf("edit_file_operations_predicate_body: memory leak %d -> %d\n", oldtop, lua_gettop(trustedL));
exit(1); exit(1);
} }
} }
@ -1207,7 +1210,7 @@ static void permissions_view() {
case CTRL_X: case CTRL_X:
return; return;
case CTRL_F: case CTRL_F:
edit_file_operations_predicate(); edit_file_operations_predicate_body();
break; break;
case CTRL_N: case CTRL_N:
net_operations_permitted = !net_operations_permitted; net_operations_permitted = !net_operations_permitted;
@ -1255,11 +1258,11 @@ static void save_permissions_to_user_configuration(lua_State* L) {
const char* image_name = lua_tostring(L, -1); const char* image_name = lua_tostring(L, -1);
if (strcmp(image_name, Image_name) != 0) { if (strcmp(image_name, Image_name) != 0) {
fprintf(out, "- image_name: %s\n", image_name); fprintf(out, "- image_name: %s\n", image_name);
fprintf(out, " file_operations_predicate:\n"); fprintf(out, " file_operations_predicate_body:\n");
lua_getfield(L, -2, "file_operations_predicate"); lua_getfield(L, -2, "file_operations_predicate_body");
if (!lua_isnil(L, -1)) if (!lua_isnil(L, -1))
emit_multiline_string(out, lua_tostring(L, -1)); emit_multiline_string(out, lua_tostring(L, -1));
lua_pop(L, 1); /* file_operations_predicate */ lua_pop(L, 1); /* file_operations_predicate_body */
lua_getfield(L, -2, "net_operations_permitted"); lua_getfield(L, -2, "net_operations_permitted");
fprintf(out, " net_operations_permitted: %s\n", lua_tostring(L, -1)); fprintf(out, " net_operations_permitted: %s\n", lua_tostring(L, -1));
lua_pop(L, 1); /* net_operations_permitted */ lua_pop(L, 1); /* net_operations_permitted */
@ -1268,9 +1271,9 @@ static void save_permissions_to_user_configuration(lua_State* L) {
} }
lua_settop(L, oldtop); lua_settop(L, oldtop);
fprintf(out, "- image_name: %s\n", Image_name); fprintf(out, "- image_name: %s\n", Image_name);
fprintf(out, " file_operations_predicate:\n"); fprintf(out, " file_operations_predicate_body:\n");
assert(file_operations_predicate); assert(file_operations_predicate_body);
emit_multiline_string(out, file_operations_predicate); emit_multiline_string(out, file_operations_predicate_body);
fprintf(out, " net_operations_permitted: %d\n", net_operations_permitted); fprintf(out, " net_operations_permitted: %d\n", net_operations_permitted);
fclose(out); fclose(out);
if (in) fclose(in); if (in) fclose(in);
@ -1278,21 +1281,26 @@ static void save_permissions_to_user_configuration(lua_State* L) {
} }
static void load_permissions_from_user_configuration(lua_State* L) { static void load_permissions_from_user_configuration(lua_State* L) {
static char file_operations_predicate_buffer[512]; static char file_operations_predicate_body_buffer[512];
initialize_trustedL(); initialize_trustedL();
file_operations_predicate = default_file_operations_predicate; char file_operations_predicate_buffer[1024];
int status = luaL_loadbuffer(trustedL, file_operations_predicate, strlen(file_operations_predicate), "file_operation_permitted") memset(file_operations_predicate_buffer, '\0', 1024);
file_operations_predicate_body = default_file_operations_predicate_body;
strcpy(file_operations_predicate_buffer, "function file_operation_permitted(filename, mode)\n");
strncat(file_operations_predicate_buffer, file_operations_predicate_body, 1020);
strncat(file_operations_predicate_buffer, "\nend", 1020);
int status = luaL_loadbuffer(trustedL, file_operations_predicate_buffer, strlen(file_operations_predicate_buffer), "file_operation_permitted")
|| docall(trustedL, 0, 1); || docall(trustedL, 0, 1);
if (status != 0 && lua_isnil(trustedL, -1)) { if (status != 0 && lua_isnil(trustedL, -1)) {
endwin(); endwin();
printf("can't load default file operations predicate\n"); printf("can't load default file operations predicate_body\n");
exit(1); exit(1);
} }
const char* rcfilename = user_configuration_filename(); const char* rcfilename = user_configuration_filename();
FILE* in = fopen(rcfilename, "r"); FILE* in = fopen(rcfilename, "r");
if (in == NULL) return; if (in == NULL) return;
file_operations_predicate = default_file_operations_predicate; file_operations_predicate_body = default_file_operations_predicate_body;
assert(file_operations_predicate); assert(file_operations_predicate_body);
/* read entries from rcfilename and look for a match with the current /* read entries from rcfilename and look for a match with the current
* Image_name. */ * Image_name. */
int oldtop = lua_gettop(L); int oldtop = lua_gettop(L);
@ -1302,13 +1310,13 @@ static void load_permissions_from_user_configuration(lua_State* L) {
lua_getfield(L, -1, "image_name"); lua_getfield(L, -1, "image_name");
const char* image_name = lua_tostring(L, -1); const char* image_name = lua_tostring(L, -1);
if (strcmp(image_name, Image_name) == 0) { if (strcmp(image_name, Image_name) == 0) {
lua_getfield(L, -2, "file_operations_predicate"); lua_getfield(L, -2, "file_operations_predicate_body");
if (!lua_isnil(L, -1)) { if (!lua_isnil(L, -1)) {
memset(file_operations_predicate_buffer, '\0', 512); memset(file_operations_predicate_body_buffer, '\0', 512);
strncpy(file_operations_predicate_buffer, lua_tostring(L, -1), 500); strncpy(file_operations_predicate_body_buffer, lua_tostring(L, -1), 500);
file_operations_predicate = file_operations_predicate_buffer; file_operations_predicate_body = file_operations_predicate_body_buffer;
} }
lua_pop(L, 1); /* file_operations_predicate */ lua_pop(L, 1); /* file_operations_predicate_body */
lua_getfield(L, -2, "net_operations_permitted"); lua_getfield(L, -2, "net_operations_permitted");
net_operations_permitted = lua_tointeger(L, -1); net_operations_permitted = lua_tointeger(L, -1);
lua_pop(L, 1); /* net_operations_permitted */ lua_pop(L, 1); /* net_operations_permitted */
@ -1318,14 +1326,19 @@ static void load_permissions_from_user_configuration(lua_State* L) {
lua_settop(L, oldtop); lua_settop(L, oldtop);
fclose(in); fclose(in);
/* trusted section */ /* trusted section */
assert(file_operations_predicate); assert(file_operations_predicate_body);
status = luaL_loadbuffer(trustedL, file_operations_predicate, strlen(file_operations_predicate), "file_operation_permitted") strcpy(file_operations_predicate_buffer, "function file_operation_permitted(filename, mode)\n");
strncat(file_operations_predicate_buffer, file_operations_predicate_body, 1020);
if (file_operations_predicate_buffer[strlen(file_operations_predicate_buffer)-1] != '\n')
strncat(file_operations_predicate_buffer, "\n", 1020);
strncat(file_operations_predicate_buffer, "end", 1020);
status = luaL_loadbuffer(trustedL, file_operations_predicate_buffer, strlen(file_operations_predicate_buffer), "file_operation_permitted")
|| docall(trustedL, 0, 1); || docall(trustedL, 0, 1);
if (status == 0 || lua_isnil(trustedL, -1)) if (status == 0 || lua_isnil(trustedL, -1))
return; return;
/* TODO: more graceful error handling */ /* TODO: more graceful error handling */
endwin(); endwin();
printf("error in loading file operations predicate from %s\n", rcfilename); printf("error in loading file operations predicate_body from %s\n", rcfilename);
exit(1); exit(1);
} }