Example #1
0
def client_auth(sock, addr):
    """Authenticate the client."""
    ba_req, err = mysock.recv(sock, BUF_LEN)
    if err != None:
        LOG.warning("can't recv auth req %s:%s" % addr)
        return None, AUTH_RES_UNKNOWN_ERR
    
    auth_req = packet.AuthReq(ba_req)
    if not auth_req.cek_valid():
        LOG.fatal("Bad AuthReq packet")
        return None, AUTH_RES_PKT_ERR
    
    auth_rsp = packet.AuthRsp()
    auth_res = AUTH_RES_OK
    
    user, password = auth_req.get_userpassword()
    if client_auth_rpc(user, password) != True:
        LOG.debug("auth rpc failed for user %s at %s" % (user, addr))
        auth_rsp.build(packet.AUTH_RSP_BAD_USERPASS)
        auth_res = AUTH_RES_UNKNOWN_ERR
    else:
        auth_rsp.build(packet.AUTH_RSP_OK)
        
    written, err = mysock.send_all(sock, auth_rsp.payload)
    if err != None or written < len(auth_rsp.payload):
        LOG.error("send auth reply failed.%s:%s" % addr)
        return user, AUTH_RES_UNKNOWN_ERR
    
    return user, auth_res
Example #2
0
def do_auth(user, password, server_sock):
    """Doing roomahost authentication."""
    auth_req = packet.AuthReq()
    auth_req.build(user, password)
    
    written, err = mysock.send(server_sock, auth_req.payload)
    
    #sending packet failed
    if err != None or written < len(auth_req.payload):
        print "can't send auth req to server.err = ", err
        return False
    
    #receiving reply failed
    ba_rsp, err = mysock.recv(server_sock, 1024)
    if err != None:
        print "failed to get auth reply"
        return False
    
    #bad username/password
    rsp = packet.AuthRsp(ba_rsp)
    if rsp.get_val() != packet.AUTH_RSP_OK:
        print "Authentication failed"
        if rsp.get_val() == packet.AUTH_RSP_BAD_USERPASS:
            print "Bad user/password"
            print "Please check your user/password"
        return False
    return True
Example #3
0
def accept_host_rsp(h_sock):
    '''accept host response.
    enqueue it to rsp_list.
    '''
    #get HostConn object
    h_conn = get_host_conn_by_sock(h_sock)
    if h_conn == None:
        print "FATAL UNHANDLED ERROR:can't get h_conn"
        sys.exit(-1)
        
    #receive the response
    ba_rsp, err = mysock.recv(h_sock, HOST_BUF_LEN)
    if err != None:
        print "FATAL ERROR. error recv resp from host"
        sys.exit(-1)
    
    if len(ba_rsp) == 0:
        LOG.debug("ses_id %d closed", h_conn.ses_id)
        h_sock.close()
        h_conn.ended = True
    
    if h_conn.first_rsp_recvd == False:
        #ba = rewrite_first_rsp(ba, "192.168.56.10", 80, "paijo.master.lan", 80)
        h_conn.first_rsp_recvd = True
        
    h_conn.rsp_list.append(ba_rsp)
Example #4
0
def handle_peer(sock, addr):
    '''Peer connection handler.'''
    #LOG.debug("new_peer.addr = %s %s" % addr)
    
    #get request
    ba_req, err = mysock.recv(sock, BUF_LEN)
    if err != None or len(ba_req) == 0:
        return
    
    #get client name
    client_name = get_client_name(ba_req, BASE_DOMAIN)
    
    if client_name is None:
        LOG.warning("client name not found.aaddr = %s:%s" % addr)
        sock.close()
        return
    
    #check client status
    client_status = authstat.client_status(client_name) 
    if client_status != authstat.RH_STATUS_OK:
        LOG.info("Access denied. Client status for %s is %d." % (client_name, client_status))
        mysock.send_all(sock, authstat.client_status_msg(client_status, client_name))
        return
    
    #get pointer to client mq
    client_mq = get_client_mq(client_name)
    
    if client_mq == None:
        handle_client_offline(client_name, sock)
        return
    
    #register peer to client
    peer = Peer(sock, addr, client_name, client_mq)
    peer.ses_id = register_peer(peer)
    
    if peer.ses_id == None:
        LOG.error("can't add peer. MAX_CONN REACHED %s" % client_name)
        peer.close()
        return
    
    #forward request packet to client
    forward_reqpkt_to_client(client_mq, peer.ses_id, ba_req)
    peer.trf_req += len(ba_req)
    
    while True:
        #fetch response packet
        try:
            for _ in xrange(0, Peer.RSP_FORWARD_NUM):
                msg = peer.in_mq.get_nowait()
                rsp = msg['pkt']
                peer.rsp_list.append(rsp)
        except gevent.queue.Empty:
            pass
        
        #select() sock utk write jika ada RSP-pkt
        wlist = []
        if len(peer.rsp_list) > 0:
            wlist.append(sock)
            
        rsocks, wsocks, _ = select.select([sock], wlist , [], 0.1)
        
        #rsocks can be read
        if len(rsocks) > 0:
            ba_req, err = mysock.recv(sock, BUF_LEN)
            if len(ba_req) == 0:
                peer.ended = True
                break    
            elif len(ba_req) > 0:
                forward_reqpkt_to_client(client_mq, peer.ses_id, ba_req)
                peer.trf_req += len(ba_req)
        
        if len(wsocks) > 0:
            is_ok = peer.forward_rsp_pkt()
        
        if peer.ended == True:
            break
        
        gevent.sleep(0)
    
    peer.close()
    
    #send usage to server
    authstat.report_usage(client_name, peer.trf_req, peer.trf_rsp)