Пример #1
0
 def exec_command(self, command, args, client_socket):
     if command == 'uptime':
         up = time.strftime("%H:%M:%S", time.gmtime(self.uptime()))
         message.send_msg(message.COMMAND,
                          "Server uptime is {} seconds\n".format(up),
                          client_socket)
     elif command == 'rooms':
         message.send_msg(
             message.COMMAND,
             "Chatrooms available: {}\n".format(self.list_chatrooms()),
             client_socket)
     elif command == 'users':
         if args:
             d_parse = re.search(r"^(\w+)", args)
             if d_parse:
                 message.send_msg(
                     message.COMMAND, "Users online in #{}: {}\n".format(
                         args, self.list_users_in_room(args)),
                     client_socket)
         else:
             message.send_msg(
                 message.COMMAND,
                 "Users online: {}\n".format(self.list_users()),
                 client_socket)
     elif command == 'help':
         user = self.server.client_users[client_socket]
         message.send_msg(
             message.COMMAND, "Server commands: \n{}\n".format(
                 self.build_help(user.is_admin)), client_socket)
     elif command == 'kick':
         self.server.kick_user(client_socket, args)
Пример #2
0
def admin_message_send():
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if to == 'all':
        for b_username in r_session.smembers('users'):
            send_msg(b_username.decode('utf-8'), subject, send_content, 3600 * 24 * 7)

    else:
        send_msg(to, subject, send_content, 3600 * 24)

    return redirect(url_for(endpoint='admin_message'))
Пример #3
0
def admin_message_send():
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if to == 'all':
        for b_username in r_session.smembers('users'):
            send_msg(b_username.decode('utf-8'), subject,
                     send_content, 3600 * 24 * 7)

    else:
        send_msg(to, subject, send_content, 3600 * 24)

    return redirect(url_for(endpoint='admin_message'))
Пример #4
0
def start_client():
    with socketcontext(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        thread.start_new_thread(post_listener, (s,))
        username = raw_input("Provide a username: ")
        while True:
            msg = raw_input()
            message.send_msg(s, username, msg)
Пример #5
0
 def run(self):
     print("processing search request")
     self.datareceive = recv_msg(self.c)
     self.publickey = pickle.loads(self.datareceive)
     self.results, = evaluate([filefeatures, self.publickey, 'encrypt_m'])
     self.datasend = pickle.dumps(self.results)
     send_msg(self.c, self.datasend)
     print("compelete")
     self.c.close()
Пример #6
0
def retrieve_menu(data):
    ''' Retrieve menu of options '''

    user_phone = data['user_phone']
    trigger_message_sid = data['trigger_message_sid']
    from_ = conf.twilio_num_from_

    msg = """Menu\n1.MENU to see options\n2.CREATE to start a new task\n3.DELETE to remove a task\n4.EXIT to restart conversation"""
    send_msg(msg, user_phone, from_)
Пример #7
0
 def run(self):
     print("processing mail request")
     self.datareceive = recv_msg(self.c)
     self.filenum = pickle.loads(self.datareceive)
     self.mailcontent = open(filenames[self.filenum],
                             'rb').read().decode('utf-8', 'ignore')
     self.datasend = pickle.dumps(self.mailcontent)
     send_msg(self.c, self.datasend)
     print("compelete")
     self.c.close()
def sendAESData(msg, server, nounce):
    try:
        hash = getHash(msg)
        data = str(msg) + ";" + str(hash)
        print data
        encrypt = AESCipher(nounce).encrypt(data)
        send_msg(server, encrypt)
    except Exception as e:
        print "Unable to send AES encrypted data"
        print e
    return 0
Пример #9
0
    def do_send(self, line):
        addr = db.data.find("data", "all")[0]['addr']
        to = raw_input("To: ")
	if len(to) != 32:
		if len(str(addressbook.check_entry(to))) != 32:
			print "Address Invalid."
			return
		else:
			to = str(addressbook.check_entry(to))
        title = raw_input("Title: ")
        msg = raw_input("Message: ")
        if not to or not title or not msg:
            print "You need to fill out all the fields."
        else:
	    print message.send_msg(msg, title, to, addr)
Пример #10
0
 def do_send(self, line):
     addr = db.data.find("data", "all")[0]['addr']
     to = raw_input("To: ")
     if len(to) != 32:
         if len(str(addressbook.check_entry(to))) != 32:
             print "Address Invalid."
             return
         else:
             to = str(addressbook.check_entry(to))
     title = raw_input("Title: ")
     msg = raw_input("Message: ")
     if not to or not title or not msg:
         print "You need to fill out all the fields."
     else:
         print message.send_msg(msg, title, to, addr)
Пример #11
0
def admin_message_send():
    send_type = request.values.get('type')
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if send_type == 'message':
        user = session.get('user_info')
        if to == 'all':
            for b_username in r_session.smembers('users'):
                send_msg(b_username.decode('utf-8'), subject, send_content,
                         3600 * 24 * 31, user.get('username'))

        else:
            send_msg(to, subject, send_content, 3600 * 24 * 31,
                     user.get('username'))
    else:
        from mailsand import send_email
        from mailsand import validateEmail
        to_set = set(to.split(';'))
        to_list = list()
        for email in to_set:
            if validateEmail(email) == 1:
                to_list.append(email)
        config_key = '%s:%s' % ('user', 'system')
        config_info = json.loads(r_session.get(config_key).decode('utf-8'))
        mail = dict()
        mail['to'] = ",".join(to_list)
        mail['subject'] = subject
        mail['text'] = send_content
        if not send_email(mail, config_info):
            session['error_message'] = '发送失败,请检查邮件配置'

    return redirect(url_for(endpoint='admin_message'))
Пример #12
0
def send(key=None):
    session = bottle.request.environ.get('beaker.session')

    # 不正なアクセスでないかチェック
    if not key == session.id:
        return bottle.template('error', error=valid.state('lost_key'))

    # ユーザ宛に確認用メールを送信
    to_addr = '*****@*****.**'
    # to_addr = '{isc_account}@mail.kyutech.jp'.format(**session)
    subject = 'Account request validation'
    for_user = message.write_first(session)
    msg = message.create_msg(FROM_ADDR, to_addr, subject, for_user)
    message.send_msg(SMTP_SVR, msg)

    return bottle.template('send')
Пример #13
0
    def rpc_call(self, destination, action, *args, **kwargs):
        '''
        Sends (using the protocol specified in message.py) a message to
        the specified destination machine.

        If the send times out, the other machine is considered as having failed,
        and the socket to that machine closed.

        :param destination: MID to which to send the message
        :param action: action of this message (message type, i.e. GETSTATUS)
        :param args: arguments to the message
        :param kwargs: additional (dict-type) arguments to the message
        :return: decoded response to the message
        '''
        msg = self.create_msg(action, *args, **kwargs)
        # self.dprint('Action %s sent to %d', action.name, destination)
        try:
            sock = None
            with self.socket_lock:
                if destination in self.mid_to_sockets:
                    sock = self.mid_to_sockets[destination]

            if sock:
                send_msg(sock, msg)
                if 'expect_response' in kwargs and kwargs['expect_response'] == True:
                    resp = recv_msg(sock)
                else:
                    return None
            else:
                raise RuntimeError()

            return decode_msg(resp)
        except socket.timeout:
            return None
        except (RuntimeError, socket.error) as e:
            with self.socket_lock:
                try:
                    self.mid_to_sockets[destination].shutdown(socket.SHUT_RDWR)
                    self.mid_to_sockets[destination].close()
                except Exception:
                    pass
                if destination in self.mid_to_sockets:
                    del self.mid_to_sockets[destination]
                self.dprint('I think machine %d died' % destination)

        return None
Пример #14
0
def admin_message_send():
    send_type = request.values.get('type')
    to = request.values.get('to')
    subject = request.values.get('subject')
    summary = request.values.get('summary')
    content = request.values.get('content')

    if subject == '':
        session['error_message'] = '标题为必填。'
        return redirect(url_for('admin_message'))

    if to == '':
        session['error_message'] = '收件方必填。'
        return redirect(url_for('admin_message'))

    if summary == '':
        session['error_message'] = '简介必填'
        return redirect(url_for('admin_message'))

    send_content = '{:<30}'.format(summary) + content
    if send_type=='message':
        user = session.get('user_info')
        if to == 'all':
            for b_username in r_session.smembers('users'):
                send_msg(b_username.decode('utf-8'), subject, send_content, 3600 * 24 * 31, user.get('username'))
    
        else:
            send_msg(to, subject, send_content, 3600 * 24 * 31,user.get('username'))
    else:
        from mailsand import send_email
        from mailsand import validateEmail
        to_set=set(to.split(';'))
        to_list=list()
        for email in to_set:
            if validateEmail(email) == 1:
                to_list.append(email)
        config_key = '%s:%s' % ('user', 'system')
        config_info = json.loads(r_session.get(config_key).decode('utf-8'))
        mail = dict()
        mail['to'] = ",".join(to_list)
        mail['subject'] = subject
        mail['text'] = send_content
        if not send_email(mail,config_info):
            session['error_message']='发送失败,请检查邮件配置'
        
    return redirect(url_for(endpoint='admin_message'))
Пример #15
0
def finish(key=None):
    session = bottle.request.environ.get('beaker.session')

    # 不正なアクセスでないかチェック
    if not key == session.id:
        return bottle.template('error', error=valid.state('lost_key'))

    # 承認待ちリストに突っ込む
    database.insert(session)

    # 運用部宛に申請依頼メールを送信
    subject = 'Request for account ({club_account})'.format(**session)
    for_admin = message.write_second(session)
    msg = message.create_msg(FROM_ADDR, ADMIN_ADDR, subject, for_admin)
    message.send_msg(SMTP_SVR, msg)

    # セッションを削除
    session.delete()

    return bottle.template('finish')
Пример #16
0
def submit_feedback():
    user = session.get('user_info')
    subject = request.values.get('subject')
    content = str(request.values.get('content')).replace('\n','<br/>')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    receiver = config_info.get('feedback_user')
    if receiver is None:
        session['error_message']='管理员尚未配置工单处理账户,请敦促管理员~'
        return redirect(url_for('comments'))
    session['info_message']=send_msg(receiver,subject,content,3600 * 24 * 31,user.get('username'))
    return redirect(url_for('comments'))
Пример #17
0
def create_reminder(data):
    ''' Thread for setting up a new reminder '''

    current_date = datetime.now()
    trigger_message_sid = data['trigger_message_sid']
    trigger_text = data['trigger_text']
    user_phone = data['user_phone']
    from_ = conf.twilio_num_from_

    # Intro
    msg = '''Hello! Today is going to be a  great one :) What's one thing that you have been putting off or want to accomplish?'''
    send_msg(msg, user_phone, from_)

    thread_data = {
        'trigger_message_sid': trigger_message_sid,
        'user_phone': user_phone,
        'thread_id': '0',
        'position_id': '1',
        'thread_data': json.dumps({'trigger_text': trigger_text})
    }

    insert_into_table(thread_data, 'kema_thread')
Пример #18
0
def submit_feedback():
    user = session.get('user_info')
    subject = request.values.get('subject')
    content = str(request.values.get('content')).replace('\n', '<br/>')
    config_key = '%s:%s' % ('user', 'system')
    config_info = json.loads(r_session.get(config_key).decode('utf-8'))
    receiver = config_info.get('feedback_user')
    if receiver is None:
        session['error_message'] = '管理员尚未配置工单处理账户,请敦促管理员~'
        return redirect(url_for('comments'))
    session['info_message'] = send_msg(receiver, subject, content,
                                       3600 * 24 * 31, user.get('username'))
    return redirect(url_for('comments'))
Пример #19
0
def delete_reminder(data):
    ''' Deletes a reminder '''

    user_phone = data['user_phone']
    trigger_message_sid = data['trigger_message_sid']
    from_ = conf.twilio_num_from_

    task_list = retrieve_reminders(data)

    # Store data in thread
    thread_data = {
        'trigger_message_sid': trigger_message_sid,
        'user_phone': user_phone,
        'thread_id': '2',
        'position_id': '1',
        'thread_data': json.dumps({'task_list': task_list})
    }

    insert_into_table(thread_data, 'kema_thread')

    msg = """Respond with the number of the task you would like to remove"""
    send_msg(msg, user_phone, from_)
Пример #20
0
def retrieve_reminders(data):
    ''' Retrieve active tasks '''

    trigger_message_sid = data['trigger_message_sid']
    trigger_text = data['trigger_text']
    user_phone = data['user_phone']
    from_ = conf.twilio_num_from_
    thread_id = '1'

    # Extract task data
    sql = '''
        SELECT
            trigger_message_sid,
            task,
            RANK() OVER (PARTITION BY user_phone ORDER BY update_datetime DESC) AS ordering
        FROM
            kema_schedule
        WHERE
            user_phone = %s
            AND CURRENT_DATE BETWEEN schedule_start AND schedule_end
        ORDER BY
            ordering ASC
        LIMIT 5;
        '''
    task_list = select_from_table(sql, (user_phone, ))

    # Send message with task list
    task_str = '\n  '.join([
        '{}. {}'.format(task_num, task)
        for (msg_sid, task, task_num) in task_list
    ])
    msg = """
    Here are your active tasks:\n{}\n0. NONE
    """.format(task_str)
    send_msg(msg, user_phone, from_)

    return task_list
Пример #21
0
def reply(to, title):
    num = check()
    if request.method == 'POST':
        to = request.form['to']
        if len(to) != 32:
            check_ = db.addressdb.find("addresses", "all")
            for x in check_:
                for y in x:
                    if y == to:
                        to = x[y]
        title = request.form['title']
        msg = request.form['message']
        check_ = message.send_msg(msg, title, to, addr)
        check_ = """<script>alert("{0}");window.location = '/';</script>""".format(check_)
        return check_
    
    return render_template("reply.html", title=title, to=to, addr=addr, num=str(len(num)))
Пример #22
0
def send():
    num = check()
    if request.method == 'POST':
        to = request.form['to'].replace(" ", '')
        if "," in to:
            t = to.split(",")
        else:
            t = []
            t.append(to)
        for to in t:
            if len(to) != 32:
                check_ = db.addressdb.find("addresses", "all")
                for x in check_:
                    for y in x:
                        if y == to:
                            to = x[y]
            title = request.form['title']
            msg = request.form['message']
            check_ = message.send_msg(msg, title, to, addr)
            check_ = """<script>alert("{0}");window.location = '/';</script>""".format(check_)
        return check_
    
    return render_template("send.html", addr=addr, num=str(len(num)))
Пример #23
0
def broadcast_messages(server):
    while not message_queue.empty():
        username, content = message_queue.get()
        for s in connected_sockets:
            if s != server:
                message.send_msg(s, username, content)
Пример #24
0
def onUserConnect(client, userBrokerSessionKey, userPbKey, pukey, prkey):
    brokerFlag = True
    while brokerFlag:
        sellerFlag = True
        ipadd = decryptAESData(client, userBrokerSessionKey)
        #DH Authentication Successful and Now can transmit messages
        #Now get Seller Ip address from the user and connect to the Seller
        print ipadd
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        port = int(ipadd.split(":")[1])
        server.connect((ipadd.split(":")[0], port))
        server.send("Broker")
        sellerPbKey = exchangeSellerRSAPbKey(server, pukey)
        print "Seller Pb Key received"
        print sellerPbKey
        if sellerPbKey:
            #Diffie-Hellman Key Exchange Starts here
            sendData(getDHkey(prDHkey), server, sellerPbKey)
            print "Broker - Seller Key Exchange successful"
            print "DH exchange starts"
            data = decryptMsg(server.recv(1024), prkey)
            sellerNounce = getHash(getSessionKey(data, prDHkey))
            print "DH Authentication successful"
            client.send(sellerPbKey)
            #client.send(sellerPbKey)
            userSellerPbKey = client.recv(1024)
            server.send(userSellerPbKey)
            print userSellerPbKey
            sellerDhKey = server.recv(2048)
            client.send(sellerDhKey)
            userDhkey = client.recv(1024)
            server.send(userDhkey)
            while sellerFlag:
                broucher = recv_msg(server)
                send_msg(client, broucher)
                userinp = recv_msg(client)
                send_msg(server, userinp)
                price = recv_msg(server)
                send_msg(client, price)
                data = decryptAESData(client, userBrokerSessionKey)
                dbTransact = data.split("~")[0]
                sign = data.split("~")[1]
                date = str(
                    datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
                if "No Purchase" not in data and verifySign(
                        dbTransact, userPbKey, sign):
                    print "User authenticated Seller"
                    price = dbTransact.split(";")[0]
                    if price:
                        confFile = open("paymentDB/payment.csv", "a")
                        data = str(
                            getHash(pukey) + ";" + dbTransact + ";" + date +
                            ";" + sign + ";" + sellerPbKey)
                        confFile.write(data.replace(";", ","))
                        confFile.write("\n")
                        confFile.close()
                        sendAESData("Paid " + str(price), server, sellerNounce)
                        img = recv_msg(server)
                        send_msg(client, img)
                        repeatq = recv_msg(server)
                        send_msg(client, repeatq)
                        data = decryptAESData(client, userBrokerSessionKey)
                        sendAESData(data.split(":B")[1], server, sellerNounce)
                        print data.split(":B")[0]
                        if data.split(":B")[0] == "broker":
                            print "Ending connection with seller"
                            sellerFlag = False
                        elif data.split(":B")[0] == "quit":
                            sellerFlag = False
                            brokerFlag = False
                        else:
                            print "Continuing connection with seller"
                else:
                    print "Purchase Aborted."
                    server.close()
                    client.close()
    return None
Пример #25
0
 def broadcast(self, msg):
     for user in self.users:
         message.send_msg(message.NORMAL, msg + "\n", user.sock)
Пример #26
0
def broadcast_messages(server):
    while not message_queue.empty():
        username, content = message_queue.get()
        for s in connected_sockets:
            if s != server:
                message.send_msg(s, username, content)
Пример #27
0
    def send_msg(self, msg):

        send_msg(msg, self.user_phone, self.from_)
Пример #28
0
 def send_message(self, msg, client_socket):
     broad_range = [x for x in self.users if x.sock != client_socket]
     for user in broad_range:
         message.send_msg(message.NORMAL, msg + "\n", user.sock)
Пример #29
0
def lambda_inbound_message_handler(event, context):

    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    logger.info(event)

    # Format data stream to dictionary
    data = urllib.parse.unquote(event['body'])
    data = json.loads(data)
    # data = event['body']
    logger.info(data)

    ###### FOR TESTING ########
    # from twilio.rest import Client
    # from message import send_msg
    # send_msg('This is a test message', conf.twilio_num_to, conf.twilio_num_from_)
    ###### FOR TESTING ########

    user_phone = data['user_phone']

    ### The following commands stop all existing threads ###

    # Check for STOP request and exit all threads if found
    if data['trigger_text'].lower() in ('stop', 'exit'):
        clear_thread_for_user_phone(user_phone)
        send_msg('Ok, restarting all conversations.', conf.twilio_num_to,
                 conf.twilio_num_from_)
        return

    # Trigger thread to delete task
    if 'delete' in data['trigger_text'].lower(
    ) or 'delete task' in data['trigger_text'].lower():
        delete_reminder(data)
        return

    # Go to Menu
    if 'menu' in data['trigger_text'].lower(
    ) or 'option' in data['trigger_text'].lower():
        retrieve_menu(data)
        return

    # Check for CREATE request and exit all threads if found
    if data['trigger_text'].lower() in ('create', 'new', 'new task',
                                        'create task', 'start new',
                                        'start task'):
        clear_thread_for_user_phone(user_phone)
        create_reminder(data)
        return

    ### End of commands that stop all existing threads ###

    # Check for position in previous conversation
    trigger_message_sid, thread_id, position_id = check_user_thread_position(
        user_phone, data)
    if trigger_message_sid:
        # Reset trigger message SID if continuing a conversation thread
        data['trigger_message_sid'] = trigger_message_sid
        # Clear any other threads
        clear_thread_for_user_phone(
            user_phone, exclude_trigger_message_sid=trigger_message_sid)

    # If last conversation not ended
    print(trigger_message_sid, thread_id, position_id)
    if thread_id == '1':
        # Continue thread to send reminder
        if position_id == '1':
            # Ask barrier
            reminder_node_1(data)  # Replace with API endpoint eventually
        elif position_id == '2':
            # Update barrier for single task
            reminder_node_2(data)
        elif position_id == '3':
            # Check status or ask barrier for multi-task
            reminder_node_3(data)
        elif position_id == '4':
            # Update barrier for multiple task
            reminder_node_4(data)
        elif position_id == '5':
            # End or update schedule for completed tasks
            reminder_node_5(data)
        elif position_id == '6':
            # End or update schedule for completed tasks (multiple)
            reminder_node_6(data)
        else:
            raise ValueError(
                'position_id {} does not exist for thread_id {}'.format(
                    position_id, thread_id))

    elif thread_id == '0':
        # Continue thread to create new reminder
        if position_id == '1':
            create_node_1(data)  # Replace with API endpoint eventually
        elif position_id == '2':
            create_node_2(data)
        elif position_id == '3':
            create_node_3(data)
        elif position_id == '4':
            create_node_4(data)
        elif position_id == '5':
            create_node_5(data)
        else:
            raise ValueError(
                'position_id {} does not exist for thread_id {}'.format(
                    position_id, thread_id))

    elif thread_id == '2':
        # Continue thread to create new reminder
        if position_id == '1':
            delete_reminder_node_1(
                data)  # Replace with API endpoint eventually
        else:
            raise ValueError(
                'position_id {} does not exist for thread_id {}'.format(
                    position_id, thread_id))

    # Else start new task
    else:
        print('Clearing thread')
        clear_thread_for_user_phone(user_phone)
        create_reminder(data)
Пример #30
-1
        def process(sock):
            try:
                while True:
                    mm = recv_msg(sock)
                    msg = decode_msg(mm)
                    # self.dprint('Received %s', msg['action'].name)

                    if msg['kwargs']['migration_id'] != self.migration_id:
                        self.dprint('Migration id mismatch (%d != %d), ignoring message %s', msg['kwargs']['migration_id'], self.migration_id, msg)
                        continue

                    response = {}
                    if msg['action'] == Action.GETSTATUS:
                        response = self.get_status_handler(msg)
                    elif self.status == IslandStatus.MIGRATION_READY:
                        if msg['action'] == Action.SEND_PREPARE_NACK:
                            response = self.prepare_nack_handler(msg)
                        elif msg['action'] == Action.SEND_ACCEPT_NACK:
                            response = self.accept_nack_handler(msg)
                        elif msg['action'] == Action.SEND_PREPARE:
                            response = self.prepare_handler(msg)
                        elif msg['action'] == Action.SEND_PROMISE:
                            response = self.promise_handler(msg)
                        elif msg['action'] == Action.SEND_ACCEPT:
                            response = self.accept_handler(msg)
                        elif msg['action'] == Action.SEND_ACCEPTED:
                            response = self.accepted_handler(msg)
                    else:
                        self.dprint('Cannot handle message')
                   
                    if self.test_failures:
                        # Force a timeout with probability 1% for testing purposes
                        if random.random() < 0.01:
                            # Oopsies network is slow
                            time.sleep(1.5)
                    
                    if response:
                        send_msg(sock, response)

            except RuntimeError as e:
                pass

            try:
                sock.shutdown(socket.SHUT_RDWR)
                sock.close()
            except Exception:
                pass