def get_json_data(self): """ Get user credentials json data from Keypad Controller Returns ------ ret: bool Success if json data was extracted data: Dict User credentials dict from Keypad Controller address: tuple IP address and port of Keypad Controller """ ret = True print("Waiting for packet") buf, address = udp_utils.receive_pkt(self.socket, self.open_port) print("Got packet") data, err = udp_utils.decode_data(buf) print("{} {}".format(data, err)) if(address is None or address[0] is None): ret = False elif(data is None): # An error occurred error_mes = udp_utils.create_error(err) try: udp_utils.send_pkt(self.socket, error_mes, address[0], kc_port) except: print("Failed to send error packet, recovered") pass ret = False return ret, data, address
def wait_dc_ack(socket, safe, thread_port): """ Wait Ack from Door Controller Parameters --------- socket: Socket socket to send possible error safe: int safe number thread_port: int Port of current thread Returns ------ Str Ack from Door Controller """ ack = None # Wait for ack from dc. Error occurs if timeout happens 3 times. for i in range(3): buf, address = udp_utils.receive_pkt(socket, thread_port) if buf != None: break if address is None: print("Timeout occured when waiting for DC") elif buf is None: # Error error_mes = udp_utils.create_error(address) udp_utils.send_pkt(socket, error_mes, address, dc_port) else: ack, error = udp_utils.decode_ack(buf) if ack is None: # Error error_mes = udp_utils.create_error(error) udp_utils.send_pkt(socket, error_mes, address, dc_port) return ack
def action_thread(safe, hashed_passcode, user_code, sender_port, sender_ip): """ Action thread main logic. Verify credentials in database, update database, unlock safe. Parameters --------- safe: int safe number hashed_passcode: Str User hashed passcodes user_code: Str User code sender_port: Str Port of Keypad Controller sender_ip: Str IP address of Keypad Controller Returns ------ void """ # Create socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) thread_port = random.randint(1000,50000) server_address = ('', thread_port) s.bind(server_address) # Verify credentials in database and update database logs success, user_name = check_database_authentication({'user_code': user_code, 'hashed_passcode': hashed_passcode, 'safe': safe}) update_database_logs(user_code, safe, success) # Unlock safe upon successfull credentials if(success and safes_map.get(safe) != None): ack = unlock_safe(s, safe, thread_port, safes_map.get(safe)) print("Ack got back is: {}".format(ack)) if not ack: success = False # Create and send ack to Keypad Controller ack_kc = udp_utils.create_ack(success) print("Sending to: address: {} port: {}".format(sender_ip, kc_port)) udp_utils.send_pkt(s, ack_kc, sender_ip[0], kc_port) if(success and safes_map.get(safe) is not None): wait_dc_ack(s, safe, thread_port) print("Closed connection") s.close()
def send_ack_kc(success): """ Unlocks safe by sending request to unlock safe to Door Controller Parameters --------- socket: Socket socket to send request safe: int safe number thread_port: int Port of current thread dc_address: Str IP address of Door Controller Returns ------ Str Ack from Door Controller """ ack = udp_utils.create_ack(success) udp_utils.send_pkt(ack, kc_address, kc_port)
def unlock_safe(socket, safe, thread_port, dc_address): """ Unlocks safe by sending request to unlock safe to Door Controller Parameters --------- socket: Socket socket to send request safe: int safe number thread_port: int Port of current thread dc_address: Str IP address of Door Controller Returns ------ Str Ack from Door Controller """ command, _ = udp_utils.create_command(True) udp_utils.send_pkt(socket, command, dc_address, dc_port) ack = wait_dc_ack(socket, safe, thread_port) return ack
def send_user_data_udp(user_code, hashed_passcode, safe_number, ip_addr, port, s): '''Will send a DATA packet to the Access System over UDP with the user credentials.''' creds = {'user_code': user_code, 'hashed_passcode': hashed_passcode, 'safe_number': safe_number} data_pkt = utils.create_data(creds) utils.send_pkt(s, data_pkt, ip_addr, port)