示例#1
0
 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
示例#2
0
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
示例#3
0
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()
示例#4
0
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)
示例#5
0
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
示例#6
0
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)