forked from 3wordchant/capsul-flask
Add basic "create" API..
.. using server-side API tokens
This commit is contained in:
@ -1,8 +1,8 @@
|
||||
|
||||
import re
|
||||
|
||||
# I was never able to get this type hinting to work correctly
|
||||
# from psycopg2.extensions import connection as Psycopg2Connection, cursor as Psycopg2Cursor
|
||||
import hashlib
|
||||
from nanoid import generate
|
||||
from flask import current_app
|
||||
from typing import List
|
||||
@ -17,7 +17,6 @@ class DBModel:
|
||||
self.cursor = cursor
|
||||
|
||||
|
||||
|
||||
# ------ LOGIN ---------
|
||||
|
||||
|
||||
@ -43,6 +42,16 @@ class DBModel:
|
||||
self.connection.commit()
|
||||
|
||||
return (token, ignoreCaseMatches)
|
||||
|
||||
def authenticate_token(self, token):
|
||||
m = hashlib.md5()
|
||||
m.update(token.encode('utf-8'))
|
||||
hash_token = m.hexdigest()
|
||||
self.cursor.execute("SELECT email FROM api_tokens WHERE token = %s", (hash_token, ))
|
||||
result = self.cursor.fetchall()
|
||||
if len(result) == 1:
|
||||
return result[0]
|
||||
return None
|
||||
|
||||
def consume_token(self, token):
|
||||
self.cursor.execute("SELECT email FROM login_tokens WHERE token = %s and created > (NOW() - INTERVAL '20 min')", (token, ))
|
||||
@ -132,6 +141,32 @@ class DBModel:
|
||||
self.cursor.execute( "DELETE FROM ssh_public_keys where email = %s AND name = %s", (email, name) )
|
||||
self.connection.commit()
|
||||
|
||||
def list_api_tokens(self, email):
|
||||
self.cursor.execute(
|
||||
"SELECT id, token, name, created FROM api_tokens WHERE email = %s",
|
||||
(email, )
|
||||
)
|
||||
return list(map(
|
||||
lambda x: dict(id=x[0], token=x[1], name=x[2], created=x[3]),
|
||||
self.cursor.fetchall()
|
||||
))
|
||||
|
||||
def generate_api_token(self, email, name):
|
||||
token = generate()
|
||||
m = hashlib.md5()
|
||||
m.update(token.encode('utf-8'))
|
||||
hash_token = m.hexdigest()
|
||||
self.cursor.execute(
|
||||
"INSERT INTO api_tokens (email, name, token) VALUES (%s, %s, %s)",
|
||||
(email, name, hash_token)
|
||||
)
|
||||
self.connection.commit()
|
||||
return token
|
||||
|
||||
def delete_api_token(self, email, id_):
|
||||
self.cursor.execute( "DELETE FROM api_tokens where email = %s AND id = %s", (email, id_))
|
||||
self.connection.commit()
|
||||
|
||||
def list_vms_for_account(self, email):
|
||||
self.cursor.execute("""
|
||||
SELECT vms.id, vms.public_ipv4, vms.public_ipv6, vms.size, vms.os, vms.created, vms.deleted, vm_sizes.dollars_per_month
|
||||
@ -479,8 +514,3 @@ class DBModel:
|
||||
#cursor.close()
|
||||
|
||||
return to_return
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user