2022-02-17 21:51:09 +09:00
|
|
|
import base64
|
|
|
|
import hashlib
|
|
|
|
|
|
|
|
import werkzeug.security
|
|
|
|
from quart import current_app
|
|
|
|
|
|
|
|
from anonstream.utils.colour import generate_colour, generate_maximum_contrast_colour, colour_to_color
|
|
|
|
|
|
|
|
CONFIG = current_app.config
|
|
|
|
|
|
|
|
def _generate_tripcode_digest_legacy(password):
|
|
|
|
hexdigest, _ = werkzeug.security._hash_internal(
|
|
|
|
'pbkdf2:sha256:150000',
|
2022-03-05 18:36:57 +09:00
|
|
|
CONFIG['SECRET_KEY_STRING'],
|
2022-02-17 21:51:09 +09:00
|
|
|
password,
|
|
|
|
)
|
|
|
|
digest = bytes.fromhex(hexdigest)
|
|
|
|
return base64.b64encode(digest)[:8].decode()
|
|
|
|
|
2022-03-05 18:36:57 +09:00
|
|
|
def _generate_tripcode_digest(password):
|
2022-02-17 21:51:09 +09:00
|
|
|
parts = CONFIG['SECRET_KEY'] + b'tripcode\0' + password.encode()
|
|
|
|
digest = hashlib.sha256(parts).digest()
|
|
|
|
return base64.b64encode(digest)[:8].decode()
|
|
|
|
|
2022-03-05 18:36:57 +09:00
|
|
|
def generate_tripcode_digest(password):
|
|
|
|
algorithm = (
|
|
|
|
_generate_tripcode_digest_legacy
|
|
|
|
if CONFIG['CHAT_LEGACY_TRIPCODE_ALGORITHM'] else
|
|
|
|
_generate_tripcode_digest
|
|
|
|
)
|
|
|
|
return algorithm(password)
|
|
|
|
|
|
|
|
def generate_tripcode(password):
|
|
|
|
digest = generate_tripcode_digest(password)
|
2022-02-17 21:51:09 +09:00
|
|
|
background_colour = generate_colour(
|
|
|
|
seed='tripcode-background\0' + digest,
|
|
|
|
bg=CONFIG['CHAT_BACKGROUND_COLOUR'],
|
|
|
|
contrast=5.0,
|
|
|
|
)
|
|
|
|
foreground_colour = generate_maximum_contrast_colour(
|
|
|
|
seed='tripcode-foreground\0' + digest,
|
|
|
|
bg=background_colour,
|
|
|
|
)
|
|
|
|
return {
|
|
|
|
'digest': digest,
|
|
|
|
'background_color': colour_to_color(background_colour),
|
|
|
|
'foreground_color': colour_to_color(foreground_colour),
|
|
|
|
}
|