diff --git a/nomadnet/Directory.py b/nomadnet/Directory.py new file mode 100644 index 0000000..f47c8a8 --- /dev/null +++ b/nomadnet/Directory.py @@ -0,0 +1,101 @@ +import os +import RNS +import LXMF +import RNS.vendor.umsgpack as msgpack + +class Directory: + def __init__(self, app): + self.directory_entries = {} + self.app = app + self.load_from_disk() + + def save_to_disk(self): + try: + packed_list = [] + for source_hash in self.directory_entries: + e = self.directory_entries[source_hash] + packed_list.append((e.source_hash, e.display_name, e.trust_level)) + + file = open(self.app.directorypath, "wb") + file.write(msgpack.packb(packed_list)) + file.close() + except Exception as e: + RNS.log("Could not write directory to disk. Then contained exception was: "+str(e), RNS.LOG_ERROR) + + def load_from_disk(self): + if os.path.isfile(self.app.directorypath): + try: + file = open(self.app.directorypath, "rb") + unpacked_list = msgpack.unpackb(file.read()) + file.close() + + entries = {} + for e in unpacked_list: + entries[e[0]] = DirectoryEntry(e[0], e[1], e[2]) + + self.directory_entries = entries + + except Exception as e: + RNS.log("Could not load directory from disk. The contained exception was: "+str(e), RNS.LOG_ERROR) + + def display_name(self, source_hash): + if source_hash in self.directory_entries: + return self.directory_entries[source_hash].display_name + else: + return None + + def simplest_display_str(self, source_hash): + trust_level = self.trust_level(source_hash) + if trust_level == DirectoryEntry.WARNING or trust_level == DirectoryEntry.UNTRUSTED: + return "<"+RNS.hexrep(source_hash, delimit=False)+">" + else: + if source_hash in self.directory_entries: + return self.directory_entries[source_hash].display_name + else: + return "<"+RNS.hexrep(source_hash, delimit=False)+">" + + def trust_level(self, source_hash, announced_display_name=None): + if source_hash in self.directory_entries: + if announced_display_name == None: + return self.directory_entries[source_hash].trust_level + else: + for entry in self.directory_entries: + e = self.directory_entries[entry] + if e.display_name == announced_display_name: + if e.source_hash != source_hash: + return DirectoryEntry.WARNING + + return self.directory_entries[source_hash].trust_level + else: + return DirectoryEntry.UNKNOWN + + def remember(self, entry): + self.directory_entries[entry.source_hash] = entry + + def forget(self, source_hash): + if source_hash in self.directory_entries: + self.directory_entries.pop(source_hash) + + def find(self, source_hash): + if source_hash in self.directory_entries: + return self.directory_entries[source_hash] + else: + return None + + +class DirectoryEntry: + WARNING = 0x00 + UNTRUSTED = 0x01 + UNKNOWN = 0x02 + TRUSTED = 0xFF + + def __init__(self, source_hash, display_name=None, trust_level=UNKNOWN): + if len(source_hash) == RNS.Identity.TRUNCATED_HASHLENGTH//8: + self.source_hash = source_hash + self.display_name = display_name + if display_name == None: + display_name = source_hash + + self.trust_level = trust_level + else: + raise TypeError("Attempt to add invalid source hash to directory") \ No newline at end of file