Commit 978084f7 by Őry Máté

properly check command arguments

fixes #6
parent 50c7b745
......@@ -15,6 +15,7 @@ import tarfile
from os.path import expanduser, join, exists
from os import mkdir, environ
from glob import glob
from inspect import getargspec
from StringIO import StringIO
from base64 import decodestring
from shutil import rmtree, move
......@@ -346,21 +347,26 @@ class SerialLineReceiver(SerialLineReceiverBase):
self.send_response(response='status',
args=args)
def handle_command(self, command, args):
def _get_command(self, command, args):
if not isinstance(command, basestring) or command.startswith('_'):
raise Exception(u'Invalid command: %s' % command)
for k, v in args.iteritems():
if not (isinstance(v, int) or isinstance(v, float) or
isinstance(v, basestring)):
raise Exception(u'Invalid argument: %s' % k)
raise AttributeError(u'Invalid command: %s' % command)
try:
func = getattr(Context, command)
except AttributeError as e:
raise AttributeError(u'Command not found: %s (%s)' % (command, e))
# check for unexpected keyword arguments
argspec = getargspec(func)
if argspec.keywords is None: # _operation doesn't take ** args
unexpected_kwargs = set(args) - set(argspec.args)
if unexpected_kwargs:
raise TypeError("Command got unexpected keyword arguments: "
"%s" % ", ".join(unexpected_kwargs))
return func
def handle_command(self, command, args):
func = self._get_command(command, args)
retval = func(**args)
except (AttributeError, TypeError) as e:
raise Exception(u'Command not found: %s (%s)' % (command, e))
else:
self.send_response(
response=func.__name__,
args={'retval': retval, 'uuid': args.get('uuid', None)})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment