/* -*- LPC -*- */ /* * $Locker: $ * $Id: file_browser.c,v 1.4 2003/03/21 04:50:28 ceres Exp $ * * */ //Source browser by Wodan #include <http.h> #include <assert.h> #include <player_handler.h> string this_file; string *action_info, action; void create(){ this_file = __FILE__[strsrch(__FILE__, "/", - 1) + 1..]; } int done_dirs; string make_dir_list(string done, mixed *file_info){ int size; string file = file_info[1]; if((size = file_info[0]) == -1) return done; if(size == 0) return sprintf("%s<B><A HREF=\"%s?path=%s/&action=%s\">%s/</A></B><br> ", done, this_file, file, action, file); if(!done_dirs){ done += "<br>"; done_dirs = 1; } if(!call_other(action_info[0], action_info[1], file)) return done; return sprintf("%s<B><A HREF=\"%s?%s=%s\"><strong>%s</strong></A></B><br> ", done, action_info[2], action_info[3], file, file); } mixed *get_full_dir(string path){ mixed *ret = map(get_dir(path, -1), (:({$1[1] >= 0, $(path) + $1[0]}):)); ret = sort_array(ret, function(mixed *a, mixed *b){ if(a[0] < b[0]) return -1; if(a[0] > b[0]) return 1; if(a[1] < b[1]) return -1; if(a[1] > b[1]) return 1; return 0; }); return ret; } string www_request(string, mapping args, class http_request req){ string ret; if(!args["path"]) args["path"] = "/"; if(!(req->user && args["action"])) return "Something bad is wrong."; action_info = explode(args["action"], ","); action_info[0] = "/www" + action_info[0]; action = args["action"]; if(!PLAYER_HANDLER->test_creator(req->user)) return "You are not a creator!"; done_dirs = 0; if(!unguarded((:master()->valid_read($(args["path"]), $(req->user), "cat"):))) return sprintf("You don't have read permission for %s", args["path"]); ret = sprintf(@END <html><head><title> Browsing %s</title></head> <body bgcolor="#ffffff" TEXT="#000030" LINK="#4a529c" VLINK="#b57339"> <strong>Path:</strong> %s<BR><BR> %s<BR> %s<br> <i><a href="mailto:wodan.discworld@discworld.imaginary.com">wodan.discworld@discworld.imaginary.com</font></a></i><br> </body> </html> END , args["path"], args["path"] , unguarded((: implode(get_full_dir($(args["path"])), (:make_dir_list:), "<br>"):)) , "/www/footer"->www_function("footer", ([ ]), req, 0, 1)); return ret; }