Esempio n. 1
0
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
Esempio n. 2
0
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)
Esempio n. 3
0
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()
Esempio n. 4
0
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)
Esempio n. 5
0
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)
Esempio n. 6
0
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)
Esempio n. 7
0
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)
Esempio n. 8
0
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
Esempio n. 9
0
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
Esempio n. 10
0
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)
Esempio n. 11
0
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
Esempio n. 12
0
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