mirror of https://github.com/hak5/ToorChat.git
Merge branch 'master' of https://github.com/hathcox/ToorChat
Conflicts: libtoorchat.py toorchat.pymaster
commit
cf72a8c6f6
|
@ -1,6 +1,21 @@
|
||||||
|
import os
|
||||||
|
import httplib
|
||||||
|
from threading import Thread
|
||||||
|
|
||||||
USER_NAME_SIZE = 9
|
USER_NAME_SIZE = 9
|
||||||
|
|
||||||
|
|
||||||
|
def get_web_site(visual, site):
|
||||||
|
''' This is a threaded message to query a website and create message to pass back '''
|
||||||
|
try:
|
||||||
|
connection = httplib.HTTPConnection(site)
|
||||||
|
connection.request("GET", "/")
|
||||||
|
result = connection.getresponse().read()
|
||||||
|
visual.message_quque.append(result)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class ToorChatProtocol():
|
class ToorChatProtocol():
|
||||||
''' This is a class to allow for easy of use with anything to do with messaging '''
|
''' This is a class to allow for easy of use with anything to do with messaging '''
|
||||||
def __init__(self, device):
|
def __init__(self, device):
|
||||||
|
@ -8,9 +23,9 @@ class ToorChatProtocol():
|
||||||
self.PACKET_END = "\xFF\xBE\xEF\xFF"
|
self.PACKET_END = "\xFF\xBE\xEF\xFF"
|
||||||
self.device = device
|
self.device = device
|
||||||
|
|
||||||
def send_message(self, message = "", user = None):
|
def send_chat_message(self, message = "", user = None):
|
||||||
''' This is used to send a simple message over the toorchat protocol '''
|
''' This is used to send a simple message over the toorchat protocol '''
|
||||||
msg = ToorChatMessage(message, user)
|
msg = ToorMessage(message, user)
|
||||||
self.device.RFxmit(msg.to_string())
|
self.device.RFxmit(msg.to_string())
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
@ -29,21 +44,34 @@ class ToorChatProtocol():
|
||||||
return None
|
return None
|
||||||
else
|
else
|
||||||
return frequency
|
return frequency
|
||||||
|
def send_web_request(self, site = ""):
|
||||||
|
'''This is used to attempt to get anyone who is registered as a server to load a website on your behalf '''
|
||||||
|
if site != "":
|
||||||
|
request = ToorMessage(site, None, ToorChatProtocol.get_web_request_type())
|
||||||
|
self.device.RFxmit(request.to_string())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parse_message(cls, raw_message):
|
def parse_message(cls, raw_message):
|
||||||
message = ToorChatMessage()
|
message = ToorMessage()
|
||||||
message.raw = raw_message
|
message.raw = raw_message
|
||||||
start_index = raw_message.find(ToorChatProtocol.get_packet_start())
|
start_index = raw_message.find(ToorChatProtocol.get_packet_start())
|
||||||
end_index = raw_message.find(ToorChatProtocol.get_packet_end())
|
end_index = raw_message.find(ToorChatProtocol.get_packet_end())
|
||||||
if start_index == -1 or end_index == -1:
|
if start_index == -1 or end_index == -1:
|
||||||
return None
|
return None
|
||||||
message.start = raw_message[start_index:start_index + 4]
|
message.start = raw_message[start_index:start_index + 4]
|
||||||
message.xid = raw_message[start_index + 4: start_index + 12]
|
message.type = raw_message[start_index + 4: start_index + 5]
|
||||||
message.user = raw_message[start_index + 12: start_index + 21]
|
message.xid = raw_message[start_index + 5: start_index + 13]
|
||||||
message.data = raw_message[start_index + 21: end_index]
|
message.user = raw_message[start_index + 13: start_index + 22]
|
||||||
|
message.data = raw_message[start_index + 22: end_index]
|
||||||
message.end = raw_message[end_index: end_index+4]
|
message.end = raw_message[end_index: end_index+4]
|
||||||
return message
|
return message
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_web_messages(cls, site, visual):
|
||||||
|
'''This is query the webpage and make thoose messages '''
|
||||||
|
thread = Thread(target=get_web_site, args=(visual, site))
|
||||||
|
thread.start()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_packet_start(cls):
|
def get_packet_start(cls):
|
||||||
return "\xFF\xDE\xAD\xFF"
|
return "\xFF\xDE\xAD\xFF"
|
||||||
|
@ -52,13 +80,22 @@ class ToorChatProtocol():
|
||||||
def get_packet_end(cls):
|
def get_packet_end(cls):
|
||||||
return "\xFF\xBE\xEF\xFF"
|
return "\xFF\xBE\xEF\xFF"
|
||||||
|
|
||||||
class ToorChatMessage():
|
@classmethod
|
||||||
|
def get_chat_type(cls):
|
||||||
|
return "1"
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_web_request_type(cls):
|
||||||
|
return "2"
|
||||||
|
|
||||||
|
class ToorMessage():
|
||||||
''' This is a simple Message object wrapper to make things cleaner '''
|
''' This is a simple Message object wrapper to make things cleaner '''
|
||||||
|
|
||||||
def __init__(self, message = "", user = None):
|
def __init__(self, message = "", user = None, type=ToorChatProtocol.get_chat_type()):
|
||||||
self.raw = None
|
self.raw = None
|
||||||
self.start = ToorChatProtocol.get_packet_start()
|
self.start = ToorChatProtocol.get_packet_start()
|
||||||
self.xid = self.get_random_xid()
|
self.xid = self.get_random_xid()
|
||||||
|
self.type = type
|
||||||
if user != None:
|
if user != None:
|
||||||
self.user = user
|
self.user = user
|
||||||
if len(self.user) < USER_NAME_SIZE:
|
if len(self.user) < USER_NAME_SIZE:
|
||||||
|
@ -69,10 +106,10 @@ class ToorChatMessage():
|
||||||
self.end = ToorChatProtocol.get_packet_end()
|
self.end = ToorChatProtocol.get_packet_end()
|
||||||
|
|
||||||
def get_random_xid(self):
|
def get_random_xid(self):
|
||||||
return "44444444"
|
return os.urandom(8)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.start + self.xid + self.user + self.data + self.end
|
return self.start +self.type+ self.xid + self.user + self.data + self.end
|
||||||
|
|
||||||
def to_string(self):
|
def to_string(self):
|
||||||
return self.__str__()
|
return self.__str__()
|
27
toorchat.py
27
toorchat.py
|
@ -18,7 +18,13 @@ def thread_run(visual):
|
||||||
msg, timestamp = visual.badge.RFrecv()
|
msg, timestamp = visual.badge.RFrecv()
|
||||||
toor_message = ToorChatProtocol.parse_message(msg)
|
toor_message = ToorChatProtocol.parse_message(msg)
|
||||||
if toor_message != None:
|
if toor_message != None:
|
||||||
visual.message_queue.append(toor_message)
|
if toor_message.type == ToorChatProtocol.get_chat_type():
|
||||||
|
visual.message_queue.append(toor_message)
|
||||||
|
if toor_message.type == ToorChatProtocol.get_web_request_type():
|
||||||
|
#If we are registered as a server, lets typ to make that request
|
||||||
|
if visual.server:
|
||||||
|
ToorChatProtocol.get_web_messages(toor_message.data, visual)
|
||||||
|
|
||||||
except ChipconUsbTimeoutException:
|
except ChipconUsbTimeoutException:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -26,8 +32,6 @@ class Visualizer():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.screen = curses.initscr()
|
self.screen = curses.initscr()
|
||||||
# curses.noecho()
|
|
||||||
# curses.cbreak()
|
|
||||||
self.screen.nodelay(1)
|
self.screen.nodelay(1)
|
||||||
self.badge = RfCat(idx=0)
|
self.badge = RfCat(idx=0)
|
||||||
self.badge.setModeRX()
|
self.badge.setModeRX()
|
||||||
|
@ -38,6 +42,10 @@ class Visualizer():
|
||||||
self.frequency = None
|
self.frequency = None
|
||||||
#This when set to True will kill the thread
|
#This when set to True will kill the thread
|
||||||
self.exit = False
|
self.exit = False
|
||||||
|
self.server = False
|
||||||
|
|
||||||
|
def set_server(self):
|
||||||
|
self.server = True
|
||||||
|
|
||||||
def start(self):
|
def start(self):
|
||||||
self.__start_recv_thread__()
|
self.__start_recv_thread__()
|
||||||
|
@ -56,7 +64,7 @@ class Visualizer():
|
||||||
self.last_message_index = 0
|
self.last_message_index = 0
|
||||||
while True:
|
while True:
|
||||||
self.screen_max_y, self.screen_max_x = self.screen.getmaxyx()
|
self.screen_max_y, self.screen_max_x = self.screen.getmaxyx()
|
||||||
self.screen.addstr(0, 1, "[S] Send Message [U] Set User Name [C] Set Channel [F] Set Frequency")
|
self.screen.addstr(0, 1, "[S] Send Message [U] Set User Name [C] Set Channel [F] Set Frequency [W] Load Webpage")
|
||||||
self.__add_message_to_screen__()
|
self.__add_message_to_screen__()
|
||||||
entry = self.screen.getch()
|
entry = self.screen.getch()
|
||||||
if entry == curses.KEY_RESIZE:
|
if entry == curses.KEY_RESIZE:
|
||||||
|
@ -64,7 +72,7 @@ class Visualizer():
|
||||||
if entry == ord('s'):
|
if entry == ord('s'):
|
||||||
self.screen.nodelay(0)
|
self.screen.nodelay(0)
|
||||||
user_input = self.screen.getstr(1, 1, 60)
|
user_input = self.screen.getstr(1, 1, 60)
|
||||||
old_message = self.protocol.send_message(user_input, self.user)
|
old_message = self.protocol.send_chat_message(user_input, self.user)
|
||||||
self.message_queue.append(old_message)
|
self.message_queue.append(old_message)
|
||||||
self.screen.nodelay(1)
|
self.screen.nodelay(1)
|
||||||
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
||||||
|
@ -84,6 +92,10 @@ class Visualizer():
|
||||||
self.screen.nodelay(0)
|
self.screen.nodelay(0)
|
||||||
user_input = self.screen.getstr(1, 1, 60)
|
user_input = self.screen.getstr(1, 1, 60)
|
||||||
self.frequency = self.protocol.change_frequency(user_input)
|
self.frequency = self.protocol.change_frequency(user_input)
|
||||||
|
if entry == ord('w'):
|
||||||
|
self.screen.nodelay(0)
|
||||||
|
user_input = self.screen.getstr(1, 1, 60)
|
||||||
|
self.protocol.send_web_request(user_input)
|
||||||
self.screen.nodelay(1)
|
self.screen.nodelay(1)
|
||||||
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
self.screen.addstr(1,1," "*(self.screen_max_x-3))
|
||||||
|
|
||||||
|
@ -113,4 +125,9 @@ class Visualizer():
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
visual = Visualizer()
|
visual = Visualizer()
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
if sys.argv[1] == "-s":
|
||||||
|
visual.set_server()
|
||||||
visual.start()
|
visual.start()
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue