def __init__(self, sec_params, name, port, host, provider_id, privk=None, pubk=None): self.name = name self.port = port self.host = host self.privk = privk or sec_params.group.G.order().random() self.pubk = pubk or (self.privk * sec_params.group.G.generator()) self.crypto_client = ClientCore((sec_params, self.config_params), self.name, self.port, self.host, self.privk, self.pubk) self.provider = Provider(name=provider_id)
def select_all_providers(self): providers_info = self.select_all('Providers') providers = [] for prv in providers_info: providers.append( Provider(str(prv[1]), prv[2], str(prv[3]), petlib.pack.decode(prv[4]))) return providers
class LoopixClient(DatagramProtocol): jsonReader = JSONReader( os.path.join(os.path.dirname(__file__), 'config.json')) config_params = jsonReader.get_client_config_params() output_buffer = Queue() process_queue = ProcessQueue() reactor = reactor resolvedAdrs = {} def __init__(self, sec_params, name, port, host, provider_id, privk=None, pubk=None): self.name = name self.port = port self.host = host self.privk = privk or sec_params.group.G.order().random() self.pubk = pubk or (self.privk * sec_params.group.G.generator()) self.crypto_client = ClientCore((sec_params, self.config_params), self.name, self.port, self.host, self.privk, self.pubk) self.provider = Provider(name=provider_id) self.latency_file = open('latency.csv', 'a') def startProtocol(self): log.msg("[%s] > Started" % self.name) self.get_network_info() self.get_provider_data() self.subscribe_to_provider() self.turn_on_packet_processing() self.make_loop_stream() self.make_drop_stream() self.make_real_stream() def get_network_info(self): self.dbManager = DatabaseManager(self.config_params.DATABASE_NAME) self.register_mixes(self.dbManager.select_all_mixnodes()) self.register_providers(self.dbManager.select_all_providers()) self.register_friends(self.dbManager.select_all_clients()) self.provider = self.dbManager.select_provider_by_name( self.provider.name) log.msg("[%s] > Registered network information" % self.name) def get_provider_data(self): self.provider = self.dbManager.select_provider_by_name( self.provider.name) try: result = socket.gethostbyname(self.provider.host) self.provider = self.provider._replace(host=result) except socket.gaierror, err: print(err)
def loopix_providers(): sec_params = SphinxParams(header_len=1024) dbManager.create_providers_table('Providers') providers = [] pubs_providers = [] for i in range(3): p = LoopixProvider(sec_params, 'Provider%d' % (i + 1), 9995 - i, '1.2.%d.4' % i) p.transport = proto_helpers.FakeDatagramTransport() p.config_params = p.config_params._replace(DATABASE_NAME='test.db') providers.append(p) dbManager.insert_row_into_table('Providers', [ None, p.name, p.port, p.host, sqlite3.Binary(petlib.pack.encode(p.pubk)) ]) pubs_providers = [ Provider(p.name, p.port, p.host, p.pubk) for p in providers ] return providers, pubs_providers
def select_provider_by_name(self, param_val): self.cursor.execute("SELECT * FROM Providers WHERE name = ?", [str(param_val)]) plist = self.cursor.fetchone() return Provider(str(plist[1]), plist[2], str(plist[3]), petlib.pack.decode(plist[4]))
class LoopixClient(DatagramProtocol): jsonReader = JSONReader(os.path.join(os.path.dirname(__file__), 'config.json')) config_params = jsonReader.get_client_config_params() output_buffer = Queue() process_queue = ProcessQueue() reactor = reactor resolvedAdrs = {} def __init__(self, sec_params, name, port, host, provider_id, privk=None, pubk=None): self.name = name self.port = port self.host = host self.privk = privk or sec_params.group.G.order().random() self.pubk = pubk or (self.privk * sec_params.group.G.generator()) self.crypto_client = ClientCore((sec_params, self.config_params), self.name, self.port, self.host, self.privk, self.pubk) self.provider = Provider(name=provider_id) def startProtocol(self): log.msg("[%s] > Started" % self.name) self.get_network_info() self.get_provider_data() self.subscribe_to_provider() self.turn_on_packet_processing() self.make_loop_stream() self.make_drop_stream() self.make_real_stream() def get_network_info(self): self.dbManager = DatabaseManager(self.config_params.DATABASE_NAME) self.register_mixes(self.dbManager.select_all_mixnodes()) self.register_providers(self.dbManager.select_all_providers()) self.register_friends(self.dbManager.select_all_clients()) self.provider = self.dbManager.select_provider_by_name(self.provider.name) log.msg("[%s] > Registered network information" % self.name) def get_provider_data(self): self.provider = self.dbManager.select_provider_by_name(self.provider.name) d = twisted.names.client.getHostByName(self.provider.host) d.addCallback(self.resolve_provider_address) def resolve_provider_address(self, result): self.provider = self.provider._replace(host = result) def subscribe_to_provider(self): lc = task.LoopingCall(self.send, ['SUBSCRIBE', self.name, self.host, self.port]) lc.start(self.config_params.TIME_PULL, now=True) def register_mixes(self, mixes): self.pubs_mixes = group_layered_topology(mixes) def register_providers(self, providers): self.pubs_providers = providers def register_friends(self, clients): self.befriended_clients = clients def turn_on_packet_processing(self): self.retrieve_messages() self.reactor.callLater(20.0, self.get_and_addCallback, self.handle_packet) log.msg("[%s] > Turned on retrieving and processing of messages" % self.name) def retrieve_messages(self): lc = task.LoopingCall(self.send, ['PULL', self.name]) lc.start(self.config_params.TIME_PULL, now=True) def get_and_addCallback(self, function): self.process_queue.get().addCallback(function) def datagramReceived(self, data, (host, port)): self.process_queue.put(data)
class LoopixClient(DatagramProtocol): jsonReader = JSONReader( os.path.join(os.path.dirname(__file__), 'config.json')) config_params = jsonReader.get_client_config_params() output_buffer = Queue() process_queue = ProcessQueue() reactor = reactor resolvedAdrs = {} number_of_chunks = 4 #depends on the quality/size of frame buffering = 200 #equals to pull size for simplicity on metrics stream_length = 1000000 #to chnage this consider adding more space to the body. 1 space for every digit stream_buffer = [[None for x in range(number_of_chunks)] for y in range(stream_length)] #hashtable for chunks chunk_count = [0] * stream_length #hashtable to know a frame is full frames_received = 0 frames_played = 0 playing = False video_ended = False def __init__(self, sec_params, name, port, host, provider_id, privk=None, pubk=None): self.name = name self.port = port self.host = host self.privk = privk or sec_params.group.G.order().random() self.pubk = pubk or (self.privk * sec_params.group.G.generator()) self.crypto_client = ClientCore((sec_params, self.config_params), self.name, self.port, self.host, self.privk, self.pubk) self.provider = Provider(name=provider_id) def startProtocol(self): log.msg("[%s] > Started" % self.name) self.get_network_info() self.get_provider_data() self.subscribe_to_provider() self.turn_on_packet_processing() #self.make_loop_stream() #self.make_drop_stream() self.make_real_stream() if self.name != 'Client1': self.send_video('../../example3.mp4', self.befriended_clients[0]) def get_network_info(self): self.dbManager = DatabaseManager(self.config_params.DATABASE_NAME) self.register_mixes(self.dbManager.select_all_mixnodes()) self.register_providers(self.dbManager.select_all_providers()) self.register_friends(self.dbManager.select_all_clients()) self.provider = self.dbManager.select_provider_by_name( self.provider.name) log.msg("[%s] > Registered network information" % self.name) def get_provider_data(self): self.provider = self.dbManager.select_provider_by_name( self.provider.name) d = twisted.names.client.getHostByName(self.provider.host) d.addCallback(self.resolve_provider_address) def resolve_provider_address(self, result): self.provider = self.provider._replace(host=result) def subscribe_to_provider(self): lc = task.LoopingCall(self.send, ['SUBSCRIBE', self.name, self.host, self.port]) lc.start(self.config_params.TIME_PULL, now=True) def register_mixes(self, mixes): self.pubs_mixes = group_layered_topology(mixes) def register_providers(self, providers): self.pubs_providers = providers def register_friends(self, clients): self.befriended_clients = clients def turn_on_packet_processing(self): self.retrieve_messages() self.reactor.callLater(20.0, self.get_and_addCallback, self.handle_packet) log.msg("[%s] > Turned on retrieving and processing of messages" % self.name) def retrieve_messages(self): lc = task.LoopingCall(self.send, ['PULL', self.name]) lc.start(self.config_params.TIME_PULL, now=True) def get_and_addCallback(self, function): self.process_queue.get().addCallback(function) def datagramReceived(self, data, (host, port)): self.process_queue.put(data)