From 9a2708aa9d6f1fe98bef5e92e77508029a710eb4 Mon Sep 17 00:00:00 2001 From: Cort Buffington Date: Fri, 22 Jul 2016 21:41:22 -0500 Subject: [PATCH] Mostly Authenticated and Logged in... --- hb_config.py | 28 ++++++++++++++-------------- hblink.py | 42 +++++++++++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/hb_config.py b/hb_config.py index 7ea6b1b..bcacd5c 100644 --- a/hb_config.py +++ b/hb_config.py @@ -45,23 +45,23 @@ def build_config(_config_file): 'MASTER_IP': gethostbyname(config.get(section, 'MASTER_IP')), 'MASTER_PORT': config.getint(section, 'MASTER_PORT'), 'PASSPHRASE': config.get(section, 'PASSPHRASE'), - 'CALLSIGN': config.get(section, 'CALLSIGN'), + 'CALLSIGN': config.get(section, 'CALLSIGN').rjust(8), 'RADIO_ID': hex(int(config.get(section, 'RADIO_ID')))[2:].rjust(8,'0').decode('hex'), - 'RX_FREQ': config.get(section, 'RX_FREQ'), - 'TX_FREQ': config.get(section, 'TX_FREQ'), - 'TX_POWER': config.get(section, 'TX_POWER'), - 'COLORCODE': config.get(section, 'COLORCODE'), - 'LATITUDE': config.get(section, 'LATITUDE'), - 'LONGITUDE': config.get(section, 'LONGITUDE'), - 'HEIGHT': config.get(section, 'HEIGHT'), - 'LOCATION': config.get(section, 'LOCATION'), - 'DESCRIPTION': config.get(section, 'DESCRIPTION'), - 'URL': config.get(section, 'URL'), - 'SOFTWARE_ID': config.get(section, 'SOFTWARE_ID'), - 'PACKAGE_ID': config.get(section, 'PACKAGE_ID') + 'RX_FREQ': config.get(section, 'RX_FREQ').rjust(9), + 'TX_FREQ': config.get(section, 'TX_FREQ').rjust(9), + 'TX_POWER': config.get(section, 'TX_POWER').rjust(2), + 'COLORCODE': config.get(section, 'COLORCODE').rjust(2), + 'LATITUDE': config.get(section, 'LATITUDE').rjust(8), + 'LONGITUDE': config.get(section, 'LONGITUDE').rjust(9), + 'HEIGHT': config.get(section, 'HEIGHT').rjust(3), + 'LOCATION': config.get(section, 'LOCATION').rjust(20), + 'DESCRIPTION': config.get(section, 'DESCRIPTION').rjust(20), + 'URL': config.get(section, 'URL').rjust(124), + 'SOFTWARE_ID': config.get(section, 'SOFTWARE_ID').rjust(40), + 'PACKAGE_ID': config.get(section, 'PACKAGE_ID').rjust(40) }}) CONFIG['CLIENTS'][section].update({'STATS': { - 'CONNECTED': False, + 'CONNECTION': 'NO', # NO, RTPL_SENT, AUTHENTICATED, CONFIG, YES 'PINGS_SENT': 0, 'PINGS_ACKD': 0, 'PING_OUTSTANDING': False, diff --git a/hblink.py b/hblink.py index 0e26d49..118a1ef 100755 --- a/hblink.py +++ b/hblink.py @@ -107,10 +107,12 @@ class HBCLIENT(DatagramProtocol): self._peer_maintenance_loop = self._peer_maintenance.start(10) def peer_maintenance_loop(self): - if self._stats['CONNECTED'] == False: + if self._stats['CONNECTION'] == 'NO': self.send_packet(RPTL+self._config['RADIO_ID']) - - logger.debug('(%s) Sending ping to Master', self._client) + self._stats['CONNECTION'] = 'RTPL_SENT' + logger.debug('(%s) Sending login request to master', self._client) + if self._stats['CONNECTION'] == 'YES': + logger.debug('(%s) Sending ping to Master', self._client) ###### change timing after connected: self._peer_maintenance_loop = self._peer_maintenance._reschedule(60) def send_packet(self, _packet): @@ -126,10 +128,36 @@ class HBCLIENT(DatagramProtocol): elif _command == 'MSTN': # Actually MSTNAK -- a NACK from the master print('MSTNAC Received') elif _command == 'RPTA': # Actually RPTACK -- an ACK from the master - _login_int32 = _data[6:10] - logger.info('(%s) Repeater Login ACK Received with 32bit ID: %s', self._client, h(_login_int32)) - _pass_hash = a(sha256(h(_login_int32).upper()+self._config['PASSPHRASE']).hexdigest()) - self.send_packet('RPTK'+self._config['RADIO_ID']+_pass_hash) + if self._stats['CONNECTION'] == 'RTPL_SENT': + _login_int32 = _data[6:10] + logger.info('(%s) Repeater Login ACK Received with 32bit ID: %s', self._client, h(_login_int32)) + + _pass_hash = sha256(_login_int32+self._config['PASSPHRASE']).hexdigest() + _pass_hash = a(_pass_hash) + self.send_packet('RPTK'+self._config['RADIO_ID']+_pass_hash) + self._stats['CONNECTION'] = 'AUTHENTICATED' + elif self._stats['CONNECTION'] == 'AUTHENTICATED': + if _data[6:10] == self._config['RADIO_ID']: + logger.info('(%s) Repeater Authentication Accepted', self._client) + _config_packet = self._config['CALLSIGN']+\ + self._config['RADIO_ID']+\ + self._config['RX_FREQ']+\ + self._config['TX_FREQ']+\ + self._config['TX_POWER']+\ + self._config['COLORCODE']+\ + self._config['LATITUDE']+\ + self._config['LONGITUDE']+\ + self._config['HEIGHT']+\ + self._config['LOCATION']+\ + self._config['DESCRIPTION']+\ + self._config['URL']+\ + self._config['SOFTWARE_ID']+\ + self._config['PACKAGE_ID'] + + self.send_packet('RPTC'+_config_packet) + print(len('RPTC'+_config_packet)) + + elif _command == 'RPTP': # Actually RPTPONG -- a reply to MSTPING (send by client) print('RPTPONG Received') elif _command == 'MSTC': # Actually MSTCL -- notify the master this client is closing