b37b77ad34
If a remote actor has no icon, we show our local default icon. If we have no icon, we should allow remote instances to show their default icon, instead of sending ours.
96 lines
2.6 KiB
Python
96 lines
2.6 KiB
Python
"""Basic wizard for setting up microblog.pub configuration files."""
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
import bcrypt
|
|
import tomli_w
|
|
from prompt_toolkit import prompt
|
|
from prompt_toolkit.key_binding import KeyBindings
|
|
|
|
from app.key import generate_key
|
|
|
|
_ROOT_DIR = Path().parent.resolve()
|
|
_KEY_PATH = _ROOT_DIR / "data" / "key.pem"
|
|
|
|
|
|
_kb = KeyBindings()
|
|
|
|
|
|
@_kb.add("c-@")
|
|
def _(event):
|
|
"""Save multi-line buffer on CTRL + space"""
|
|
event.current_buffer.validate_and_handle()
|
|
|
|
|
|
def main() -> None:
|
|
print("Welcome to microblog.pub setup wizard\n")
|
|
print("Generating key...")
|
|
if _KEY_PATH.exists():
|
|
yn = ""
|
|
while yn not in ["y", "n"]:
|
|
yn = prompt(
|
|
"WARNING, a key already exists, overwrite it? (y/n): ", default="n"
|
|
).lower()
|
|
if yn == "y":
|
|
generate_key(_KEY_PATH)
|
|
else:
|
|
generate_key(_KEY_PATH)
|
|
|
|
config_file = Path("data/profile.toml")
|
|
|
|
if config_file.exists():
|
|
# Spit out the relative path for the "config artifacts"
|
|
rconfig_file = "data/profile.toml"
|
|
print(
|
|
f"Existing setup detected, please delete {rconfig_file} "
|
|
"before restarting the wizard"
|
|
)
|
|
sys.exit(2)
|
|
|
|
dat: dict[str, Any] = {}
|
|
print("Your identity will be @{username}@{domain}")
|
|
dat["domain"] = prompt("domain: ")
|
|
dat["username"] = prompt("username: ")
|
|
dat["admin_password"] = bcrypt.hashpw(
|
|
prompt("admin password: ", is_password=True).encode(), bcrypt.gensalt()
|
|
).decode()
|
|
dat["name"] = prompt("name (e.g. John Doe): ", default=dat["username"])
|
|
dat["summary"] = prompt(
|
|
(
|
|
"summary (short description, in markdown, "
|
|
"press [CTRL] + [SPACE] to submit):\n"
|
|
),
|
|
key_bindings=_kb,
|
|
multiline=True,
|
|
)
|
|
dat["https"] = True
|
|
proto = "https"
|
|
yn = ""
|
|
while yn not in ["y", "n"]:
|
|
yn = prompt("will the site be served via https? (y/n): ", default="y").lower()
|
|
if yn == "n":
|
|
dat["https"] = False
|
|
proto = "http"
|
|
|
|
print("Note that you can put your icon/avatar in the static/ directory")
|
|
if icon_url := prompt(
|
|
"icon URL: ", default=f'{proto}://{dat["domain"]}/static/nopic.png'
|
|
):
|
|
dat["icon_url"] = icon_url
|
|
dat["secret"] = os.urandom(16).hex()
|
|
|
|
with config_file.open("w") as f:
|
|
f.write(tomli_w.dumps(dat))
|
|
|
|
print("Done")
|
|
sys.exit(0)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
try:
|
|
main()
|
|
except KeyboardInterrupt:
|
|
print("Aborted")
|
|
sys.exit(1)
|