コード例 #1
0
ファイル: g4dslistener.py プロジェクト: kichkasch/ioids
 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))
コード例 #2
0
ファイル: g4dslistener.py プロジェクト: kichkasch/ioids
    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)
コード例 #3
0
ファイル: g4dslistener.py プロジェクト: kichkasch/ioids
    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()
コード例 #4
0
ファイル: g4dslistener.py プロジェクト: kichkasch/ioids
             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