db.py 1.2 KB

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