def get(url): """ A smart way to get identity from cache. If not cached in memory but found on disk - will cache from disk. """ if has_idurl(url): return idget(url) else: try: partfilename = nameurl.UrlFilename(url) except: lg.out(1, "identitydb.get ERROR %s is incorrect" % str(url)) return None filename = os.path.join(settings.IdentityCacheDir(), partfilename) if not os.path.exists(filename): lg.out( 6, "identitydb.get file %s not exist" % os.path.basename(filename)) return None idxml = bpio.ReadTextFile(filename) if idxml: idobj = identity.identity(xmlsrc=idxml) url2 = idobj.getIDURL() if url == url2: idset(url, idobj) return idobj else: lg.out(1, "identitydb.get ERROR url=%s url2=%s" % (url, url2)) return None lg.out(6, "identitydb.get %s not found" % nameurl.GetName(url)) return None
def get_filename(idurl): try: partfilename = nameurl.UrlFilename(idurl) except: lg.out(1, "identitydb.get_filename ERROR %s is incorrect" % str(idurl)) return None return os.path.join(settings.IdentityCacheDir(), partfilename)
def clear(exclude_list=None): """ Clear the database, indexes and cached files from disk. """ global _Contact2IDURL global _IPPort2IDURL global _IDURL2Contacts global _IdentityCache global _IdentityCacheIDs global _IdentityCacheModifiedTime lg.out(4, "identitydb.clear") _IdentityCache.clear() _IdentityCacheIDs.clear() _IdentityCacheModifiedTime.clear() _Contact2IDURL.clear() _IPPort2IDURL.clear() _IDURL2Contacts.clear() iddir = settings.IdentityCacheDir() if not os.path.exists(iddir): return for file_name in os.listdir(iddir): path = os.path.join(iddir, file_name) if not os.access(path, os.W_OK): continue if exclude_list: idurl = nameurl.FilenameUrl(file_name) if idurl in exclude_list: continue os.remove(path) lg.out(6, 'identitydb.clear remove ' + path) fire_cache_updated_callbacks()
def get_filename(idurl): idurl = id_url.to_original(idurl) try: partfilename = nameurl.UrlFilename(idurl) except: lg.err("idurl %r is not correct" % idurl) return None return os.path.join(settings.IdentityCacheDir(), partfilename)
def init(): """ Need to call before all other methods. Check to exist and create a folder to keep all cached identities. """ lg.out(4, "identitydb.init") iddir = settings.IdentityCacheDir() if not os.path.exists(iddir): lg.out(8, 'identitydb.init create folder ' + iddir) bpio._dir_make(iddir)
def has_file(idurl): """ """ try: partfilename = nameurl.UrlFilename(idurl) except: lg.out(1, "identitydb.has_file ERROR %s is not correct" % str(idurl)) return None filename = os.path.join(settings.IdentityCacheDir(), partfilename) return os.path.exists(filename)
def remove(url): """ Top method to remove identity from cache - also remove local file. """ filename = os.path.join(settings.IdentityCacheDir(), nameurl.UrlFilename(url)) if os.path.isfile(filename): lg.out(6, "identitydb.remove file %s" % filename) try: os.remove(filename) except: lg.exc() idremove(url)
def update(idurl, xml_src): """ This is a correct method to update an identity in the local cache. PREPRO need to check that date or version is after old one so not vulnerable to replay attacks. """ idurl = id_url.to_original(idurl) try: newid = identity.identity(xmlsrc=xml_src) except: lg.exc() return False if not newid.isCorrect(): lg.err("incorrect identity : %r" % idurl) return False try: if not newid.Valid(): lg.err("identity not valid : %r" % idurl) return False except: lg.exc() return False filename = os.path.join(settings.IdentityCacheDir(), nameurl.UrlFilename(idurl)) if os.path.exists(filename): oldidentityxml = bpio.ReadTextFile(filename) oldidentity = identity.identity(xmlsrc=oldidentityxml) if oldidentity.publickey != newid.publickey: # TODO: SECURITY add some kind of black list to be able to block certain IP's if the DDoS me lg.err( "new public key does not match with old, SECURITY VIOLATION : %r" % idurl) return False if oldidentity.signature != newid.signature: if _Debug: lg.out( _DebugLevel, 'identitydb.update have new data for %r' % nameurl.GetName(idurl)) else: idset(idurl, newid) return True # publickeys match so we can update it bpio.WriteTextFile(filename, xml_src) idset(idurl, newid) return True
def update(idurl, xml_src): """ This is a correct method to update an identity in the local cache. PREPRO need to check that date or version is after old one so not vulnerable to replay attacks. """ idurl = strng.to_bin(idurl) try: newid = identity.identity(xmlsrc=xml_src) except: lg.exc() return False if not newid.isCorrect(): lg.out(1, "identitydb.update ERROR incorrect identity : %r" % idurl) return False try: if not newid.Valid(): lg.out(1, "identitydb.update ERROR identity not Valid : %r" % idurl) return False except: lg.exc() return False filename = os.path.join(settings.IdentityCacheDir(), nameurl.UrlFilename(idurl)) if os.path.exists(filename): oldidentityxml = bpio.ReadTextFile(filename) oldidentity = identity.identity(xmlsrc=oldidentityxml) if oldidentity.publickey != newid.publickey: lg.out( 1, "identitydb.update ERROR new publickey does not match old, SECURITY VIOLATION : %r" % idurl) return False if oldidentity.signature != newid.signature: lg.out( 6, 'identitydb.update have new data for %r' % nameurl.GetName(idurl)) else: idset(idurl, newid) return True # publickeys match so we can update it bpio.WriteTextFile(filename, xml_src) idset(idurl, newid) return True
def init(): """ Need to call before all other methods. Check to exist and create a folder to keep all cached identities. """ lg.out(4, "identitydb.init") id_cache_dir = settings.IdentityCacheDir() if not os.path.exists(id_cache_dir): lg.out(8, 'identitydb.init create folder %r' % id_cache_dir) bpio._dir_make(id_cache_dir) # make sure to read and cache all known identities at startup for id_filename in os.listdir(id_cache_dir): idurl = nameurl.FilenameUrl(id_filename) get_ident(idurl)
def remove(idurl): """ Top method to remove identity from cache - also remove local file. """ idurl = id_url.to_original(idurl) filename = os.path.join(settings.IdentityCacheDir(), nameurl.UrlFilename(idurl)) if os.path.isfile(filename): if _Debug: lg.out(_DebugLevel, "identitydb.remove file %r" % filename) try: os.remove(filename) except: lg.exc() idremove(idurl) return True
def get_ident(idurl): """ A smart way to get identity from cache. If not cached in memory but found locally - read it from disk. """ idurl = id_url.to_original(idurl) if has_idurl(idurl): return idget(idurl) try: partfilename = nameurl.UrlFilename(idurl) except: if _Debug: lg.out(_DebugLevel, "identitydb.get_ident ERROR %r is incorrect" % idurl) return None if not partfilename: if _Debug: lg.out(_DebugLevel, "identitydb.get_ident ERROR %r is empty" % idurl) return None filename = os.path.join(settings.IdentityCacheDir(), partfilename) if not os.path.exists(filename): if _Debug: lg.out( _DebugLevel, "identitydb.get_ident file %r not exist" % os.path.basename(filename)) return None idxml = bpio.ReadTextFile(filename) if not idxml: if _Debug: lg.out( _DebugLevel, "identitydb.get_ident %s not found" % nameurl.GetName(idurl)) return None idobj = identity.identity(xmlsrc=idxml) idurl_orig = idobj.getIDURL() if idurl == idurl_orig.original(): idset(idurl, idobj) return idobj lg.err("not found identity object idurl=%r idurl_orig=%r" % (idurl, idurl_orig)) return None