feat(sync): 支持升级实例创建临时管理员
This commit is contained in:
@@ -24,7 +24,7 @@ def main():
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument(
|
||||
"command",
|
||||
choices=["serve", "initialize", "migrate", "create-user", "cleanup-uploads", "backup", "restore"],
|
||||
choices=["serve", "initialize", "migrate", "create-user", "bootstrap-user", "cleanup-uploads", "backup", "restore"],
|
||||
)
|
||||
parser.add_argument("--workers", type=int, choices=[1, 2], default=2)
|
||||
parser.add_argument("--username")
|
||||
@@ -80,6 +80,15 @@ def main():
|
||||
elif args.command == "create-user":
|
||||
db.migrate()
|
||||
db.add_user(args.username or input("用户名: "), getpass.getpass("密码(至少12字符): "))
|
||||
elif args.command == "bootstrap-user":
|
||||
db.migrate()
|
||||
bootstrap = db.prepare_bootstrap_user(force=True)
|
||||
print(json.dumps({
|
||||
"event": "SYNC_BOOTSTRAP_CREDENTIALS",
|
||||
"username": bootstrap["username"],
|
||||
"password": bootstrap["password"],
|
||||
"must_change_credentials": True,
|
||||
}), flush=True)
|
||||
elif args.command == "serve":
|
||||
db.migrate()
|
||||
bootstrap = db.prepare_bootstrap_user()
|
||||
|
||||
@@ -68,7 +68,7 @@ class Database:
|
||||
conn.execute(text("INSERT INTO users VALUES (:id,:name,:password)"),
|
||||
{"id": secrets.token_hex(16), "name": username, "password": password_hash(password)})
|
||||
|
||||
def prepare_bootstrap_user(self):
|
||||
def prepare_bootstrap_user(self, *, force=False):
|
||||
"""在账户尚未固定时生成本次服务启动专用的临时密码。"""
|
||||
password = secrets.token_urlsafe(24)
|
||||
with self.transaction() as conn:
|
||||
@@ -78,11 +78,14 @@ class Database:
|
||||
run(conn, "DELETE FROM bootstrap_state")
|
||||
state = None
|
||||
if not state:
|
||||
if row(conn, "SELECT id FROM users LIMIT 1"):
|
||||
if row(conn, "SELECT id FROM users LIMIT 1") and not force:
|
||||
return None
|
||||
user_id = secrets.token_hex(16)
|
||||
username = "admin"
|
||||
if row(conn, "SELECT id FROM users WHERE username=:name", name=username):
|
||||
username = "bootstrap-admin-" + secrets.token_hex(3)
|
||||
run(conn, "INSERT INTO users VALUES (:id,:name,:password)",
|
||||
id=user_id, name="admin", password=password_hash(password))
|
||||
id=user_id, name=username, password=password_hash(password))
|
||||
run(conn, "INSERT INTO bootstrap_state VALUES (:user,:created)",
|
||||
user=user_id, created=int(time.time()))
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user