def listen(self): """ Listen for messages on the fifo. Once, a message arrives, pass it on to the g4ds system. """ while 1: messages = self._receiveOne(multiple = 1) for message in messages: message = self._decryptSession(message) ## from messagewrapper import getGenericWrapper args, datas = getGenericWrapper().unwrapArgsAndDatas('servicemessage', message) serviceid = args['serviceid'] if args.has_key('disconnect'): if int(args['disconnect']): self._g4ds.unregisterClient(serviceid) break destinationMember = args['destinationmember'] destinationCommunity = args['destinationcommunity'] actionstring = args['actionstring'] message = datas['message'] # we add one more wrapping here in order to put some data for the service ## from messagewrapper import getGenericWrapper args = {} datas = {} args['actionstring'] = actionstring datas['message'] = message message = getGenericWrapper().wrapArgsAndDatas('serviceargs', args, datas) try: self._g4ds.newMessage(serviceid, destinationMember, destinationCommunity, message) except G4dsException, msg: getDefaultLogger().newMessage(SERVICES_CLIENT_SENDINGERROR, 'Could not send message for service %s: %s' %(serviceid, msg))
def g4dsCallBack(self, msg, senderid, serviceid, communityid, messageid): """ Callback function; to be passed to the g4ds module. Each receiving message for this application will be passed to this function by the g4ds system. """ ## from messagewrapper import getGenericWrapper args, datas = getGenericWrapper().unwrapArgsAndDatas('serviceargs', msg) actionstring = args['actionstring'] if not getAuthorisationController().validate(senderid, serviceid, actionstring): return msg = datas['message'] metadata = {} metadata['senderid'] = senderid metadata['serviceid'] = serviceid metadata['communityid'] = communityid metadata['messageid'] = messageid metadata['actionstring'] = actionstring wrapped = getGenericWrapper().wrapArgsAndDatas('servicemetadata', metadata, datas) ## ciphered = self._encryptSession(msg) ciphered = self._encryptSession(wrapped) self._sendOne(ciphered)
def serve(self, g4ds, data, number): """ Serves one cconnected service. """ self._g4ds = g4ds # let's try to delete first - we never know; maybe somebody hasn't cleant up properly before - somebody?? heheh :) self._cleanUp(number) self._name_pipe_in = config.FIFO_PATH_IN + "." + str(number) self._name_pipe_out = config.FIFO_PATH_OUT + "." + str(number) import stat os.mkfifo(self._name_pipe_in, 0666) os.chmod(self._name_pipe_in, stat.S_IWOTH | stat.S_IRWXU | stat.S_IWGRP) os.mkfifo(self._name_pipe_out, 0666) os.chmod(self._name_pipe_out, stat.S_IROTH | stat.S_IRWXU | stat.S_IRGRP) try: message = self._receiveOne() args, datas = getGenericWrapper().unwrapArgsAndDatas('rendevous', message) serviceid = args['serviceid'] plain = datas['plain'] signature = datas['signature'] # check first of all, whether we know the service try: servicerepository.getServiceManager().getService(serviceid) except KeyError, msg: args = {} args['sucess'] = '0' args['errormessage'] = 'Service id unknown on this node - service could not be loaded. You might have to apply service description to G4DS.' message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, {}) self._sendOne(message) return sucess = 0 keys = self._loadPublicKeys() rsa = getAlgorithmController().getAlgorithm('rsa') usedKey = None for key in keys: if rsa.validate(plain, signature, key): sucess = 1 usedKey = key break args = {} datas = {} if sucess: args['sucess'] = '1' sessionkey = self._createSessionKey() # encrypt the session key with the public key of the application cipheredSessionKey = rsa.encrypt(sessionkey, usedKey) self._sessionkey = sessionkey datas['sessionkey'] = cipheredSessionKey message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, datas) self._sendOne(message) try: self._g4ds.registerClient(serviceid, self.g4dsCallBack) except G4dsException, msg: args['sucess'] = '0' args['errormesssage'] = str(list(msg)) message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, {}) self._sendOne(message) self.listen()
self._sessionkey = sessionkey datas['sessionkey'] = cipheredSessionKey message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, datas) self._sendOne(message) try: self._g4ds.registerClient(serviceid, self.g4dsCallBack) except G4dsException, msg: args['sucess'] = '0' args['errormesssage'] = str(list(msg)) message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, {}) self._sendOne(message) self.listen() else: args['sucess'] = '0' message = getGenericWrapper().wrapArgsAndDatas('rendevous',args, {}) self._sendOne(message) except IOError, msg: # looks like, the client changed his mind and did not connect # let's clean up then self._cleanUp(number) #print "error %s" %(msg) return def _encryptSession(self, msg): """ Encrypts a message with the session key. """ from SSLCrypto import key