[docs]@hook()asyncdefstartup(app,context):admin_user,admin_pass=awaitinitialize_admin(USER_DATA_ROOT,app)ifadmin_user:created_admin["username"]=admin_usercreated_admin["password"]=admin_passconsole.print(f"Created admin user: {created_admin['username']} password: {created_admin['password']}",style="yellow on dark_blue")
[docs]defgenerate_random_credentials(prefix:str="admin",length:int=8)->Tuple[str,str]:"""Generate random admin username and password."""chars=string.ascii_letters+string.digitsrandom_suffix=''.join(random.choices(chars,k=length))random_pass=''.join(random.choices(chars+"!@#$%^&*",k=16))returnf"{prefix}{random_suffix}",random_pass
[docs]asyncdefcheck_for_admin(user_data_root:str)->bool:"""Check if any admin user exists."""ifnotos.path.exists(user_data_root):returnFalseforusernameinos.listdir(user_data_root):auth_file=os.path.join(user_data_root,username,"auth.json")ifos.path.exists(auth_file):withopen(auth_file,'r')asf:try:auth_data=UserAuth(**json.load(f))if"admin"inauth_data.roles:returnTrueexcept:continuereturnFalse
[docs]@service()asyncdefinitialize_admin(user_data_root:str,app)->Tuple[Optional[str],Optional[str]]:"""Check for and create admin user if needed. Returns tuple of (username, password) if created, (None, None) if admin exists. This should be called during system startup to ensure at least one admin exists. The admin user will have 'admin', 'verified', and 'user' roles. """args=app.state.cmd_argsprint("args",args)username=Nonepassword=Noneadmin_user=Noneadmin_pass=Noneifargs.admin_user:admin_user=args.admin_useradmin_pass=args.admin_passwordifadmin_userandadmin_pass:username=admin_userpassword=admin_passelse:ifawaitcheck_for_admin(user_data_root):returnNone,None# Check environment variables firstenv_user=os.environ.get('ADMIN_USER')env_pass=os.environ.get('ADMIN_PASS')# If no admin exists, either use env credentials or generate new onesusername=env_userpassword=env_passifnot(usernameandpassword):username,password=generate_random_credentials()username='admin'print("\n"+"="*50)print("INITIAL ADMIN CREDENTIALS GENERATED:")print(f"Username: {username}")print(f"Password: {password}")print("="*50+"\n")# Create admin user with appropriate rolesuser_data=UserCreate(username=username,password=password,email=os.environ.get('ADMIN_EMAIL','admin@admin.com'))try:awaitcreate_user(user_data,roles=["admin","verified"],skip_verification=True# Admin is automatically verified)exceptExceptionase:# if it has 'exists' in the error message, then it's a duplicate userif'exists'instr(e):print("Admin user already exists")passelse:raiseereturnusername,password