/* Do not remove the headers from this file! see /USAGE for more info. */ // A non-line-mode editor for LP Muds... // Rust@Lima Bean (viega@list.org) 1-26-97 // // This still wants a file browser embedded, and a lot of cosmetic overhaul. #include <ports.h> #define MY_URL sprintf("http://%s:%d/scgi/webed.c", __HOST__, PORT_HTTP) #include <security.h> inherit M_ACCESS; // These functions need to be in an inheritable... private mixed get_priv(mapping form) { if(adminp(form["user"])) { return 1; } return form["user"]; } private string HTML_encode(string str) { string retval = ""; int len = strlen(str); for(int i=0; i<len; i++) { switch(str[i]) { case '&': retval += "&"; break; case '<': retval += "<"; break; case '>': retval += ">"; break; case '"': retval += """; break; default: retval += str[i..i]; break; } } return retval; } string format_editor(string user, string password, string filename, string contents) { string output; if(!user) user = ""; if(!password) password = ""; output = "<html><title>Web Ed</title><body><h1>Web Ed - An LP Mud editor</h1>\n"; output += sprintf("<form action='%s' method='POST'>\n", MY_URL); output +="<table><tr><td>"; output += sprintf("Wizard name: </td><td><INPUT name=user type=TEXT value='%s' " "size=10><p>\n</td></tr>", HTML_encode(user)); output += sprintf("<tr><td>Password:</td><td> <INPUT name=password type=PASSWORD value='%s' " "size=10><p></td></tr>\n", HTML_encode(password)); output += "<tr><td>File To Load:</td><td> <INPUT name=loadfile type=TEXT size=60 value=''></td> \n"; output +="<td><INPUT name=load type=submit value='Load File'></td></tr>\n"; if(contents) { output += sprintf("<tr><td>Save As:</td><td> <input type=text name=saveas size=60 value=%s> </td>\n", HTML_encode(filename)); output +="<td><INPUT name=save type=submit value='Save File'></td></tr>\n"; output +="<tr><td></td><td></td><td><INPUT name=reload type=submit value=Reload File></td></tr>\n<p>"; } output = output + "</table>\n"; if (contents) { array inh; object ob; output +="<hr><font size=+1><strong>Editing: " + HTML_encode(filename) + "</strong></font><p>"; /* if ((ob = load_object(filename)) && sizeof(inh = inherit_list(ob))) { string tmp; inh = ({ "<OPTION VALUE='" + HTML_encode(inh[0]) + "' SELECTED>" + HTML_encode(inh[0]) }) + map(inh[1..], (: "<OPTION VALUE='"+HTML_encode($1)+"'>"+HTML_encode($1) :)); tmp = implode(inh, " "); output += "<SELECT NAME='inh'>" + tmp + "</SELECT>"; output += "<INPUT name=loadinh type=submit value='Load Inherited File'><p>"; } */ output += sprintf("<TEXTAREA name=contents ROWS=36 COLS=80 WRAP=off>" "%s</TEXTAREA>\n", HTML_encode(contents)); } output += "</body></html>"; return output; } string display_error(string error, mapping form) { return sprintf("<table border=1><tr><td><font size=+2>%s</font></td></tr>" "</table><p>%s\n", error, format_editor(form["user"], form["password"], form["saveas"], form["contents"])); } int validate_user(mapping form) { string array info; string val; if(!form["user"] || !form["password"]) { return 0; } if(!wizardp(form["user"])) { return 0; } set_privilege(1); info = unguarded(1, (:USER_D->query_variable($(form["user"]), ({"password"})):)); set_privilege(0); if(!info) { return 0; } val = crypt(form["password"], info[0]); if(val == info[0]) { if(adminp(form["user"])) { set_privilege(1); } else { set_privilege(form["user"]); } return 1; } return 0; } // Error checking all over this function, please. string save_text_to_file(mapping form) { string filename = form["saveas"]; string contents = replace_string(form["contents"], "\r\n", "\n"); int result; if(!validate_user(form)) { return display_error("Login info is incorrect", form); } result = unguarded(get_priv(form), (: write_file($(filename), $(contents), 1) :)); if(!result) { return display_error(sprintf("%s: COULD NOT SAVE FILE.\n", filename), form); } return format_editor(form["user"], form["password"], filename, form["contents"]); } string load_file(mapping form) { string filename; string text; if(!validate_user(form)) { return display_error("Login info is incorrect", form); } filename = evaluate_path(form["loadfile"]); if(is_directory(filename)) { return display_error(sprintf("%s: Is a DIRECTORY.\n", filename), form); } if(!is_file(filename)) { form["contents"] = ""; form["saveas"] = filename; return display_error(sprintf("%s: New file\n", filename), form); } text = unguarded(get_priv(form), (: read_file($(filename)) :)); if(!text) { return display_error(sprintf("%s: Permission to read denied.\n", filename), form); } else { form["saveas"] = filename; return format_editor(form["user"], form["password"], filename, text); } } string reload_file(mapping form) { form["loadfile"] = form["saveas"]; return load_file(form); } string main(mapping form) { string fname; set_privilege(0); /* Just in case */ if(!mapp(form)) { return format_editor(0,0,0,0); } if(form["save"]) { return save_text_to_file(form); } else { if(form["reload"]) { return reload_file(form); } else { if(form["load"]) { return load_file(form); } else { if (form["loadinh"]) { form["loadfile"] = form["inh"]; return load_file(form); } else return format_editor(0,0,0,0); } } } }