Source code for keys

"""
keyring module
==============

"""
from google.appengine.ext import db
from google.appengine.api import memcache
import pickle
import base64
import random

KEYRING_SIZE = 14


[docs]def generate_raw_key(): """ generate raw key :returns: generated key :rtype: string """ return base64.b64encode(repr(random.uniform(1, 1000)))
[docs]def generate_marker(): """ regenerate_raw_key implementation satisfies needs :returns: generated key :rtype: string """ return generate_raw_key()
[docs]def generate_key(): """ generate key :returns: generated key pair :rtype: tuple of string """ return (generate_raw_key(), generate_marker())
[docs]class Keyring(db.Model): """ Keyring db model Attributes: * `data` - `encoded key data` """ data = db.TextProperty()
[docs]def refresh(): """ refresh keys :returns: fresh keys :rtype: list of key pairs """ keys = [generate_key() for keys in xrange(KEYRING_SIZE)] delete() setkeys(keys) return keys
[docs]def setkeys(keys): """ set keys :param list keys: [required] list of key pairs """ encoded = pickle.dumps(keys) db.put(Keyring(data=encoded)) memcache.set('keyring', encoded)
[docs]def rotate(): """ rotate keys """ keys = [i for i in data()] keys.pop() for i in xrange(KEYRING_SIZE - len(keys)): keys.insert(0, generate_key()) delete() setkeys(keys)
[docs]def delete(): """ delete keyring """ db.delete(_db_get())
[docs]def _db_get(): """ get keyring from db :returns: keyring :rtype: `Keyring <#keys.Keyring>`_ """ query = db.GqlQuery('SELECT * FROM Keyring') keyring = query.fetch(1) return keyring
[docs]def data(): """ get keys :returns: key :rtype: string """ # read from the memcache keyring = memcache.get('keyring') if keyring is None: # read from the database keyring = _db_get() if len(keyring) > 0: memcache.set('keyring', keyring[0].data) keyring = pickle.loads(str(keyring[0].data)) else: keyring = refresh() else: keyring = pickle.loads(str(keyring)) for key in keyring: yield key
[docs]def current(): """ get current key :returns: get next key :rtype: string """ return data().next()

This Page