예제 #1
0
def regenerate_key(key_id, k=None, save=False):
    if key_id is None or key_id not in keys_by_id:
        raise ResourceNotFound
    if keys_by_id[key_id].master or not keys_by_id[key_id].dynamic:
        raise FunctionFailed('Master and static keys can not be changed')
    key = keys_by_id[key_id]
    old_key = key.key
    key.set_key(gen_random_str() if k is None else k)
    keys[key.key] = keys.pop(old_key)
    key.set_modified(save)
    return key.key
예제 #2
0
def append_token(key_id, user=None):
    i = 0
    while True:
        token = 'token:' + gen_random_str()
        if token not in tokens:
            break
        i += 1
        if i > 3:
            return False
    tokens[token] = {'u': user, 'ki': key_id, 't': time.time()}
    logging.debug('{} added. user: {}, key id: {}'.format(
        token[:12], user, key_id))
    return token
예제 #3
0
def add_api_key(key_id=None, save=False):
    if key_id is None: raise FunctionFailed
    if key_id in keys_by_id: raise ResourceAlreadyExists
    key_hash = gen_random_str()
    key = APIKey(key_hash, key_id)
    key.master = False
    key.dynamic = True
    key.set_prop('hosts_allow', '0.0.0.0/0', save)
    keys_by_id[key.key_id] = key
    keys[key.key] = key
    result = key.serialize()
    if key_id in keys_to_delete:
        keys_to_delete.remove(key_id)
    return result
예제 #4
0
def add_api_key(key_id=None, save=False):
    with key_lock:
        if key_id is None:
            raise FunctionFailed
        if key_id in keys_by_id:
            raise ResourceAlreadyExists
        key_value = gen_random_str(length=64)
        key = APIKey(key_value, key_id)
        key.master = False
        key.dynamic = True
        key.set_prop('hosts_allow', '0.0.0.0/0', save)
        keys_by_id[key.key_id] = key
        keys[key.key] = key
        result = key.serialize()
        if key_id in keys_to_delete:
            keys_to_delete.remove(key_id)
        for k, v in combined_keys_cache.items():
            ckey = keys_by_id[v]
            if key_id in ckey.combined_from:
                ckey.need_recombine = True
        return result
예제 #5
0
def create_combined_key(key_ids=[]):
    with key_lock:
        _key_ids = [k for k in sorted(key_ids) if k in keys_by_id]
        if not _key_ids:
            raise ValueError(f'no such API keys: {key_ids}')
        _combined_id = ','.join(_key_ids)
        try:
            return combined_keys_cache[_combined_id]
        except KeyError:
            # setup combined key
            ckey_value = gen_random_str(length=64)
            ckey_id = f'comb:{"+".join(_key_ids)}'
            combined_key = APIKey(ckey_value, ckey_id)
            combined_key.master = False
            combined_key.dynamic = True
            combined_key.temporary = True
            combined_key.combined_from = _key_ids
            combined_key.need_recombine = True
            # register
            keys_by_id[ckey_id] = combined_key
            keys[ckey_value] = combined_key
            combined_keys_cache[_combined_id] = ckey_id
    return ckey_id