Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.webServer.walk
on walk (path, adrfilepath) { //returns boolean, if true, the file/folder was found <<Changes <<1/7/02; 11:47:04 AM by JES <<Files/folders which begin with '.' are invisible -- they're a 404. <<12/9/01; 7:00:30 AM by DW <<Folders would not 404, now they do. <<8/12/01; 4:17:38 PM by JES <<Fixed a bug in the code that returns false if the file is invisible: We were checking for the file as named in the request path, instead of the file found by radio.file.locateFileIgnoringExtension. <<8/11/01; 5:33:27 PM by JES <<Invisible files/folders return a 404 File Not Found error. <<6/15/01; 12:33:33 AM by PBS <<Removed the multiple checks for objectName containing ".." -- also removed the stack, because now it's not needed. <<Fixed bug where URLs such as /real/file/fake/extra/bits would get you the same as /real/file -- those should return a 404. <<5/6/01; 7:48:47 AM by DW <<It's easier to work on the walk code if it's in a separate script. local (nomad = user.radio.prefs.wwwfolder); local (objectName, pc = file.getPathChar ()); while (sizeOf (path) > 0) { path = string.popLeading (path, '/'); objectName = string.nthField (path, '/', 1); path = string.delete (path, 1, sizeOf (objectName)); bundle { //DW and PBS 08/09/00: close security hole <<if objectName beginsWith ".." //DW 08/09/00: close security hole//08/02/01 JES: This is now handled by radio.webServer.responder <<scriptError ("Can't process objects with names beginning with \"..\".") if objectName contains "\\" { //PBS 08/09/00: \ character not allowed scriptError ("Can't process objects with names containing \"\\\".")}; if objectName contains ":" { //PBS 08/09/00: : character not allowed scriptError ("Can't process objects with names containing \":\".")}}; bundle { //JES 01/07/02: close security hole if objectName beginsWith "." { if sizeOf (objectName) > 1 { return (false)}}}; local (nextnomad = nomad + objectName); if sizeOf (path) > 0 { //if we're not at the terminus, this better be a folder local (subfolder = nextnomad + pc); if not file.exists (subfolder) { //doesn't exist, it's a 404 return (false)}; if not file.isfolder (subfolder) { //not a folder -- it's a 404. return (false)}; if not file.isVisible (subfolder) { //invisible folders cause a 404. return (false)}; nomad = subfolder} else { //it's the final part of the path, a request for a folder or file if not (file.exists (nextnomad)) { //is it a 404 File Not Found? if not radio.file.locateFileIgnoringExtension (nextnomad, adrfilepath) { return (false)}; if file.isVisible (adrfilepath^) { //found a visible file -- return true. (adrfilepath^ is already set.) return (true)} else { //invisible files are a 404. return (false)}}; adrfilepath^ = nextnomad; return (true)}}} <<bundle //test code <<local (f) <<walk ("/", @f) <<walk ("/stories/", @f) <<dialog.alert (f)
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.