Ignore:
Timestamp:
06/21/10 16:02:12 (11 years ago)
Author:
sc
Message:

client_thinkgear:

  • ThinkGear? authorization added
  • response processing added

configuration:

  • comment/whitespace cleanup

server_thinkgear:

File:
1 edited

Legend:

Unmodified
Added
Removed
  • remote_control/puzzlebox_brainstorms_server_thinkgear.py

    r56 r57  
    1212# 
    1313##################################################################### 
     14# To do: 
     15#  - Server starts session sending data stream per command received 
     16#       instead of once per connection 
     17##################################################################### 
    1418 
    1519import os, signal, sys, time 
     
    3842MESSAGE_FREQUENCY_TIMER = 1 # 1 Hz 
    3943BLINK_FREQUENCY_TIMER = 10 # 10 seconds 
     44 
     45DEFAULT_AUTHORIZATION_MESSAGE = \ 
     46        {"isAuthorized": True} 
     47                # Tells the client whether the server has authorized 
     48                # access to the user's headset data. The value is 
     49                # either true or false. 
    4050 
    4151DEFAULT_SIGNAL_LEVEL_MESSAGE = \ 
     
    4757 
    4858DEFAULT_EEG_POWER_MESSAGE = \ 
    49         {'eegPower': { \ 
     59        {"eegPower": { \ 
    5060                'lowGamma': 0, \ 
    5161                'highGamma': 0, \ 
     
    6171 
    6272DEFAULT_ESENSE_MESSAGE = \ 
    63         {'eSense': { \ 
     73        {"eSense": { \ 
    6474                'meditation': 0, \ 
    6575                'attention': 0, \ 
     
    7080          # and 100 is an excess of that attribute. 
    7181                
    72 DEFAULT_BLINK_MESSAGE = {"blinkStrength": 100} 
     82DEFAULT_BLINK_MESSAGE = {"blinkStrength": 255} 
    7383        # The strength of a detected blink. This is 
    7484        # an integer in the range of 0-255. 
     
    100110                self.status_packet = DEFAULT_PACKET 
    101111                self.client_connected = False 
    102          
    103          
    104         ################################################################## 
     112 
     113 
     114        ################################################################## 
     115 
     116        def validate_checksum(self, checksum): 
     117 
     118                '''The key used by the client application to identify  
     119itself. This must be 40 hexadecimal characters, ideally generated 
     120using an SHA-1 digest. The appKey is an identifier that is unique 
     121to each application, rather than each instance of an application. 
     122It is used by the server to bypass the authorization process if a 
     123user had previously authorized the requesting client. To reduce 
     124the chance of overlap with the appKey of other applications,  
     125the appKey should be generated using an SHA-1 digest.''' 
     126 
     127                is_valid = True 
     128 
     129                hexadecimal_characters = '0123456789abcdef' 
     130 
     131                if len(checksum) != 40: 
     132                        is_valid = False 
     133                else: 
     134                        for character in checksum: 
     135                                if character not in hexadecimal_characters: 
     136                                        is_valid = False 
     137 
     138                return(is_valid) 
     139         
     140         
     141        ################################################################## 
     142 
     143        def authorize_client(self, data): 
     144 
     145                '''The client must initiate an authorization request 
     146and the server must authorize the client before the 
     147server will start transmitting any headset data.''' 
     148 
     149                is_authorized = self.validate_checksum(data['appKey']) 
     150 
     151                # A human-readable name identifying the client 
     152                # application. This can be a maximum of 255 characters. 
     153                 
     154                if len(data['appName']) > 255: 
     155                        is_authorized = False 
     156 
     157 
     158                return(is_authorized) 
     159                         
     160 
     161        ################################################################## 
    105162         
    106163        def process_data(self, data): 
    107164                 
    108165                d = defer.Deferred() 
    109  
    110166 
    111167                # Special socket handling for Flash applications 
     
    113169                        response = FLASH_SOCKET_POLICY_FILE 
    114170 
    115                 else: 
    116                         response = DEFAULT_RESPONSE_MESSAGE 
     171                elif (type(data) == type({}) and \ 
     172                      data.has_key('appName') and \ 
     173                      data.has_key('appKey')): 
     174                        authorized = self.authorize_client(data) 
     175 
     176                        response = DEFAULT_AUTHORIZATION_MESSAGE 
     177 
     178                        response = {} 
     179                        response['isAuthorized'] = authorized 
     180 
     181 
     182                else: 
     183                        response = DEFAULT_RESPONSE_MESSAGE 
    117184 
    118185                 
    119186                if self.DEBUG: 
    120                         print "--> [ThinkGear Emulator] Received:", 
     187                        print "<-- [ThinkGear Emulator] Received:", 
    121188                        print data 
    122189                 
    123190                if response: 
    124191                        d.callback(response) 
     192 
    125193                 
    126194                return d 
     
    130198         
    131199        def process_connection_lost(self): 
    132                  
    133                 print "--> [ThinkGear Emulator] Connection lost" 
     200 
     201                if self.DEBUG: 
     202                        print "--> [ThinkGear Emulator] Connection lost" 
     203 
    134204                self.client_connected = False 
     205 
     206                self.looping_timer.stop() 
    135207 
    136208 
     
    172244                 
    173245                if self.DEBUG: 
    174                         print "--> [ThinkGear Emulator] Client connected" 
     246                        print "<-- [ThinkGear Emulator] Client connected" 
    175247                         
    176248                self.factory.start_updating() 
     
    198270                        return 
    199271                 
    200                 data = json.loads(line) 
    201  
    202                 if self.DEBUG: 
    203                         print "line received:", 
    204                         print data 
    205  
    206                 d = self.factory.process_data("%s" % data) 
    207                 d.addCallback(self.send_response) 
     272##                data = json.loads(line) 
     273## 
     274##                if self.DEBUG: 
     275##                      print "line received:", 
     276##                      print data 
     277## 
     278##              d = self.factory.process_data("%s" % data) 
     279##              d.addCallback(self.send_response) 
     280 
     281 
     282                self.dataReceived(line) 
    208283 
    209284         
     
    244319                        self.data_chunk = "" 
    245320 
    246                         d = self.factory.process_data("%s" % data_to_process) 
     321                        d = self.factory.process_data(data_to_process) 
    247322                        d.addCallback(self.send_response) 
    248323         
     
    254329                # Special socket handling for Flash applications 
    255330                if (response == FLASH_SOCKET_POLICY_FILE): 
    256                         self.sendLine(response) 
    257 ##                        self.transport.write(response) 
     331##                      self.transport.write(response) 
     332                        self.sendLine(response) 
     333 
    258334                else: 
    259335                        response = json.dumps(response) 
     
    262338                if self.factory.client_connected: 
    263339                        if self.DEBUG: 
    264                                 print "--> [ThinkGear Emulator] Sending:", 
     340                                print "----> [ThinkGear Emulator] Sending:", 
    265341                                print response 
    266342 
Note: See TracChangeset for help on using the changeset viewer.