add notes on API tokens when they are allocated

This commit is contained in:
Min RK
2018-01-12 17:42:14 -08:00
parent d82de98001
commit aa23b01a57
4 changed files with 40 additions and 24 deletions

View File

@@ -155,12 +155,12 @@ class User(Base):
running=sum(bool(s.server) for s in self._orm_spawners),
)
def new_api_token(self, token=None, generated=True):
def new_api_token(self, token=None, generated=True, note=''):
"""Create a new API token
If `token` is given, load that token.
"""
return APIToken.new(token=token, user=self, generated=generated)
return APIToken.new(token=token, user=self, note='', generated=generated)
@classmethod
def find(cls, db, name):
@@ -216,11 +216,11 @@ class Service(Base):
server = relationship(Server, primaryjoin=_server_id == Server.id)
pid = Column(Integer)
def new_api_token(self, token=None, generated=True):
def new_api_token(self, token=None, generated=True, note=''):
"""Create a new API token
If `token` is given, load that token.
"""
return APIToken.new(token=token, service=self, generated=generated)
return APIToken.new(token=token, service=self, note=note, generated=generated)
@classmethod
def find(cls, db, name):
@@ -230,6 +230,7 @@ class Service(Base):
"""
return db.query(cls).filter(cls.name == name).first()
class Hashed(object):
"""Mixin for tables with hashed tokens"""
prefix_length = 4
@@ -266,7 +267,7 @@ class Hashed(object):
def match(self, token):
"""Is this my token?"""
return compare_token(self.hashed, token)
@classmethod
def check_token(cls, db, token):
"""Check if a token is acceptable"""
@@ -281,7 +282,7 @@ class Hashed(object):
@classmethod
def find_prefix(cls, db, token):
"""Start the query for matching token.
Returns an SQLAlchemy query already filtered by prefix-matches.
"""
prefix = token[:cls.prefix_length]
@@ -303,6 +304,7 @@ class Hashed(object):
if orm_token.match(token):
return orm_token
class APIToken(Hashed, Base):
"""An API token"""
__tablename__ = 'api_tokens'
@@ -363,7 +365,7 @@ class APIToken(Hashed, Base):
return orm_token
@classmethod
def new(cls, token=None, user=None, service=None, generated=True):
def new(cls, token=None, user=None, service=None, note='', generated=True):
"""Generate a new API token for a user or service"""
assert user or service
assert not (user and service)
@@ -377,7 +379,7 @@ class APIToken(Hashed, Base):
cls.check_token(db, token)
# two stages to ensure orm_token.generated has been set
# before token setter is called
orm_token = cls(generated=generated)
orm_token = cls(generated=generated, note=note or '')
orm_token.token = token
if user:
assert user.id is not None