source: cows_wps/trunk/cows_wps/controllers/dirlist.py @ 7004

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/cows_wps/trunk/cows_wps/controllers/dirlist.py@7004
Revision 7004, 1.9 KB checked in by astephen, 10 years ago (diff)

secured dirlist.py controller.

Line 
1import logging
2import os
3
4from pylons import request, response, session, tmpl_context as c
5from pylons.controllers.util import abort, redirect_to
6
7from cows_wps.renderer.ui_renderer import *
8from cows_wps.controllers import *
9from cows_wps.lib.ui.proc_config import *
10
11from cows_wps.utils.create_process_config import createProcessConfig
12
13log = logging.getLogger(__name__)
14
15
16class DirlistController(BaseController):
17
18    def index(self, limit=20):
19        """
20        Takes in an argument and returns a JSON/text list of directories or matching paths.
21        """
22        path = request.params.get("path", None)
23        if path == None:
24            return "Please provide an argument path=<Something>"
25
26        proc_id = request.params.get("proc_id", None)
27        if proc_id == None:
28            return "Please provide a valid proc_id."
29
30        try:
31            proc_config = createProcessConfig(proc_id)["Capabilities"]
32            basedir = proc_config["DataInputs"]["FilePath"]["basedir"]
33            basedir = basedir.rstrip("/")
34        except:
35            return "Unrecognised proc_id: %s" % proc_id
36
37        dr = os.path.split(path)[0]
38        if not os.path.isdir(dr):
39            return "Please provide a valid directory."
40        elif dr.find(basedir) < 0 and dr != basedir:
41            return "Invalid directory or not allowed."
42
43        items = [os.path.join(dr, x) for x in os.listdir(dr) if x[0] != "."]
44        items.sort()
45
46        if len(items) > limit:
47            items = items[:limit] + ["...more than I can be bothered to list..."]
48
49        if os.path.isdir(path):
50            return str([str(i) for i in items])
51
52        litems = [i.lower() for i in items]
53        lpath = path.lower()
54        resp = []
55
56        for (i, item) in enumerate(litems):
57            if item.find(lpath) == 0:
58                resp.append(items[i])
59
60        return str([str(i) for i in resp])
61
Note: See TracBrowser for help on using the repository browser.