db.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import hashlib
  2. import hmac
  3. import binascii
  4. import os
  5. import tornado.gen
  6. import psycopg2
  7. import momoko
  8. import config
  9. def hash_pw(password, salt=None):
  10. if salt is None:
  11. salt = os.urandom(16)
  12. h = hmac.new(salt, password.encode('utf-8'), hashlib.sha256)
  13. hashed = h.hexdigest()
  14. salt_hex = binascii.hexlify(salt).decode()
  15. return hashed, salt_hex
  16. class MomokoDB:
  17. db = momoko.Pool(dsn='dbname=%s user=%s' % (config.db.database, config.db.user), size=2)
  18. @tornado.gen.coroutine
  19. def execute(self, query, *args):
  20. result = yield momoko.Op(self.db.execute, query, args, cursor_factory=psycopg2.extras.DictCursor)
  21. return result
  22. @tornado.gen.coroutine
  23. def create_user(self, username, password):
  24. hashed_password, salt = hash_pw(password)
  25. query = 'INSERT INTO users (username, password, salt) VALUES (%s, %s, %s);'
  26. yield self.execute(query, username, hashed_password, salt)
  27. @tornado.gen.coroutine
  28. def get_user(self, username):
  29. query = 'SELECT * FROM users WHERE username=%s;'
  30. cursor = yield self.execute(query, username)
  31. return cursor.fetchone()
  32. @tornado.gen.coroutine
  33. def check_user(self, username, password):
  34. user = yield self.get_user(username)
  35. if not user:
  36. return
  37. salt = binascii.unhexlify(bytes(user['salt'], 'ascii'))
  38. hashed, _ = hash_pw(password, salt)
  39. print(hashed)
  40. print(user['password'])
  41. if hashed == user['password']:
  42. return user