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
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
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)
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)