kopia lustrzana https://github.com/snarfed/bridgy-fed
42 wiersze
1.4 KiB
Python
42 wiersze
1.4 KiB
Python
|
"""Datastore model classes.
|
||
|
|
||
|
Based on webfinger-unofficial/user.py.
|
||
|
"""
|
||
|
from django_salmon import magicsigs
|
||
|
from google.appengine.ext import ndb
|
||
|
from oauth_dropins.webutil.models import StringIdModel
|
||
|
|
||
|
|
||
|
class MagicKey(StringIdModel):
|
||
|
"""Stores a user's public/private key pair used for Magic Signatures.
|
||
|
|
||
|
The key name is USERNAME@DOMAIN.
|
||
|
|
||
|
The modulus and exponent properties are all encoded as base64url (ie URL-safe
|
||
|
base64) strings as described in RFC 4648 and section 5.1 of the Magic
|
||
|
Signatures spec.
|
||
|
|
||
|
Magic Signatures are used to sign Salmon slaps. Details:
|
||
|
http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-magicsig-01.html
|
||
|
http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html
|
||
|
"""
|
||
|
mod = ndb.StringProperty(required=True)
|
||
|
public_exponent = ndb.StringProperty(required=True)
|
||
|
private_exponent = ndb.StringProperty(required=True)
|
||
|
|
||
|
@staticmethod
|
||
|
@ndb.transactional
|
||
|
def get_or_create(uri):
|
||
|
"""Loads and returns a MagicKey from the datastore. Creates it if necessary."""
|
||
|
key = MagicKey.get_by_id(uri)
|
||
|
|
||
|
if not key:
|
||
|
# this uses urandom(), and does some nontrivial math, so it can take a
|
||
|
# while depending on the amount of randomness available on the system.
|
||
|
pubexp, mod, privexp = magicsigs.generate()
|
||
|
key = MagicKey(id=uri, mod=mod, public_exponent=pubexp,
|
||
|
private_exponent=privexp)
|
||
|
key.put()
|
||
|
|
||
|
return key
|