annotate piecrust/admin/bcryptfallback.py @ 1188:a7c43131d871

bake: Fix file write flushing problem with Python 3.8+ Writing the cache files fails in Python 3.8 because it looks like flushing behaviour has changed. We need to explicitly flush. And even then, in very rare occurrences, it looks like it can still run into racing conditions, so we do a very hacky and ugly "retry" loop when fetching cached data :(
author Ludovic Chabant <ludovic@chabant.com>
date Tue, 15 Jun 2021 22:36:23 -0700
parents 28c388fc18b2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
1 import hashlib
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
2 import logging
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
3
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
4
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
5 print_warning = False
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
6 logger = logging.getLogger(__name__)
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
7
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
8
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
9 try:
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
10 from bcrypt import hashpw, gensalt
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
11 except ImportError:
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
12 print_warning = True
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
13
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
14 def hashpw(password, *args, **kwargs):
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
15 return hashlib.sha512(password).hexdigest().encode('utf8')
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
16
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
17 def gensalt(*args, **kwargs):
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
18 return b''
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
19
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
20
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
21 try:
1151
0d699f04968c cm: Update dependencies and fix imports of Flask plugins.
Ludovic Chabant <ludovic@chabant.com>
parents: 783
diff changeset
22 from flask_bcrypt import Bcrypt
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
23 except ImportError:
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
24 try:
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
25 from flask.ext.bcrypt import Bcrypt
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
26 except ImportError:
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
27 print_warning = True
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
28
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
29 def generate_password_hash(password):
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
30 return hashlib.sha512(password.encode('utf8')).hexdigest()
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
31
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
32 def check_password_hash(reference, check):
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
33 check_hash = hashlib.sha512(check.encode('utf8')).hexdigest()
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
34 return check_hash == reference
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
35
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
36 class SHA512Fallback(object):
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
37 is_fallback_bcrypt = True
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
38
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
39 def __init__(self, app=None):
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
40 self.generate_password_hash = generate_password_hash
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
41 self.check_password_hash = check_password_hash
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
42
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
43 def init_app(self, app):
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
44 app.bcrypt = self
772
3885421c29a3 admin: Make the whole FoodTruck site into a blueprint.
Ludovic Chabant <ludovic@chabant.com>
parents: 640
diff changeset
45
1176
28c388fc18b2 cm: Upgrade flask-login and flask-bcrypt.
Ludovic Chabant <ludovic@chabant.com>
parents: 1151
diff changeset
46 Bcrypt = SHA512Fallback
640
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
47
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
48
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
49 if print_warning:
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
50 logging.warning("Bcrypt not available... falling back to SHA512.")
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
51 logging.warning("Run `pip install Flask-Bcrypt` for more secure "
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
52 "password hashing.")
59968ee07a07 admin: Don't require `bcrypt` for running FoodTruck with `chef`.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff changeset
53