From: Quentin Smith Date: Mon, 10 Aug 2009 03:38:06 +0000 (-0400) Subject: Write handler for create form, and consolidate code to require POST into a CherryPy... X-Git-Tag: 0.1.0^2~50 X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-web.git/commitdiff_plain/cdcd6b7a886dbc7f3908e70ce646ed7ad7c49546 Write handler for create form, and consolidate code to require POST into a CherryPy tool svn path=/package_branches/invirt-web/cherrypy-rebased/; revision=2685 --- diff --git a/code/main.py b/code/main.py index ba892bf..e068e48 100755 --- a/code/main.py +++ b/code/main.py @@ -146,6 +146,36 @@ console will suffer artifacts. mapping=help_mapping) help._cp_config['tools.require_login.on'] = False + def parseCreate(self, fields): + kws = dict([(kw, fields.get(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()]) + validate = validation.Validate(cherrypy.request.login, cherrypy.request.state, strict=True, **kws) + return dict(contact=cherrypy.request.login, name=validate.name, description=validate.description, memory=validate.memory, + disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type), + cdrom=getattr(validate, 'cdrom', None), + autoinstall=getattr(validate, 'autoinstall', None)) + + @cherrypy.expose + @cherrypy.tools.mako(filename="/list.mako") + @cherrypy.tools.require_POST() + def create(self, **fields): + """Handler for create requests.""" + try: + parsed_fields = self.parseCreate(fields) + machine = controls.createVm(cherrypy.request.login, cherrypy.request.state, **parsed_fields) + except InvalidInput, err: + pass + else: + err = None + cherrypy.request.state.clear() #Changed global state + d = getListDict(cherrypy.request.login, cherrypy.request.state) + d['err'] = err + if err: + for field in fields.keys(): + setattr(d['defaults'], field, fields.get(field)) + else: + d['new_machine'] = parsed_fields['name'] + return d + @cherrypy.expose @cherrypy.tools.mako(filename="/helloworld.mako") def helloworld(self, **kwargs): @@ -218,10 +248,9 @@ console will suffer artifacts. return d @cherrypy.expose @cherrypy.tools.mako(filename="/command.mako") + @cherrypy.tools.require_POST() def command(self, command_name, machine_id, **kwargs): """Handler for running commands like boot and delete on a VM.""" - if cherrypy.request.method != "POST": - raise InvalidInput("request.method", command_name, "You must execute commands via POST") back = kwargs.get('back', None) try: d = controls.commandResult(cherrypy.request.login, cherrypy.request.state, command_name, machine_id, kwargs) @@ -337,33 +366,6 @@ def hasVnc(status): return 'location' in d return False -def parseCreate(username, state, fields): - kws = dict([(kw, fields.getfirst(kw)) for kw in 'name description owner memory disksize vmtype cdrom autoinstall'.split()]) - validate = validation.Validate(username, state, strict=True, **kws) - return dict(contact=username, name=validate.name, description=validate.description, memory=validate.memory, - disksize=validate.disksize, owner=validate.owner, machine_type=getattr(validate, 'vmtype', Defaults.type), - cdrom=getattr(validate, 'cdrom', None), - autoinstall=getattr(validate, 'autoinstall', None)) - -def create(username, state, path, fields): - """Handler for create requests.""" - try: - parsed_fields = parseCreate(username, state, fields) - machine = controls.createVm(username, state, **parsed_fields) - except InvalidInput, err: - pass - else: - err = None - state.clear() #Changed global state - d = getListDict(username, state) - d['err'] = err - if err: - for field in fields.keys(): - setattr(d['defaults'], field, fields.getfirst(field)) - else: - d['new_machine'] = parsed_fields['name'] - return templates.list(searchList=[d]) - def getListDict(username, state): """Gets the list of local variables used by list.tmpl.""" @@ -652,7 +654,6 @@ def throwError(_, __, ___, ____): mapping = dict( modify=modify, - create=create, unauth=unauthFront, admin=admin, overlord=admin, diff --git a/code/view.py b/code/view.py index 87a527b..e1ba854 100644 --- a/code/view.py +++ b/code/view.py @@ -82,6 +82,14 @@ def require_login(): cherrypy.tools.require_login = cherrypy.Tool('on_start_resource', require_login, priority=150) +def require_POST(): + """If the request isn't a POST request, raise 405 Method Not Allowed""" + if cherrypy.request.method != "POST": + raise cherrypy.HTTPError(405, + "You must submit this request with POST") + +cherrypy.tools.require_POST = cherrypy.Tool('on_start_resource', require_POST, priority=150) + def remote_user_login(): """Get the current user based on the SSL or GSSAPI environment variables""" environ = cherrypy.request.wsgi_environ