diff options
Diffstat (limited to 'module/remote/thriftbackend/Processor.py')
-rw-r--r-- | module/remote/thriftbackend/Processor.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/module/remote/thriftbackend/Processor.py b/module/remote/thriftbackend/Processor.py new file mode 100644 index 000000000..683697d1c --- /dev/null +++ b/module/remote/thriftbackend/Processor.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- + +from pyload.remote.thriftbackend.thriftgen.pyload import Pyload + +class Processor(Pyload.Processor): + def __init__(self, *args, **kwargs): + Pyload.Processor.__init__(self, *args, **kwargs) + self.authenticated = {} + + def process(self, iprot, oprot): + trans = oprot.trans + if trans not in self.authenticated: + self.authenticated[trans] = False + oldclose = trans.close + + def wrap(): + if self in self.authenticated: + del self.authenticated[trans] + oldclose() + + trans.close = wrap + authenticated = self.authenticated[trans] + (name, type, seqid) = iprot.readMessageBegin() + + # unknown method + if name not in self._processMap: + iprot.skip(Pyload.TType.STRUCT) + iprot.readMessageEnd() + x = Pyload.TApplicationException(Pyload.TApplicationException.UNKNOWN_METHOD, 'Unknown function %s' % name) + oprot.writeMessageBegin(name, Pyload.TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + + # not logged in + elif not authenticated and not name == "login": + iprot.skip(Pyload.TType.STRUCT) + iprot.readMessageEnd() + # 20 - Not logged in (in situ declared error code) + x = Pyload.TApplicationException(20, 'Not logged in') + oprot.writeMessageBegin(name, Pyload.TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + + elif not authenticated and name == "login": + args = Pyload.login_args() + args.read(iprot) + iprot.readMessageEnd() + result = Pyload.login_result() + # api login + self.authenticated[trans] = self._handler.checkAuth(args.username, args.password, trans.remoteaddr[0]) + + result.success = True if self.authenticated[trans] else False + oprot.writeMessageBegin("login", Pyload.TMessageType.REPLY, seqid) + result.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + + elif self._handler.isAuthorized(name, authenticated): + self._processMap[name](self, seqid, iprot, oprot) + + else: + #no permission + iprot.skip(Pyload.TType.STRUCT) + iprot.readMessageEnd() + # 21 - Not authorized + x = Pyload.TApplicationException(21, 'Not authorized') + oprot.writeMessageBegin(name, Pyload.TMessageType.EXCEPTION, seqid) + x.write(oprot) + oprot.writeMessageEnd() + oprot.trans.flush() + return + + return True |