summaryrefslogtreecommitdiffstats
path: root/module/remote/thriftbackend/Processor.py
diff options
context:
space:
mode:
Diffstat (limited to 'module/remote/thriftbackend/Processor.py')
-rw-r--r--module/remote/thriftbackend/Processor.py77
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