feat: ✨ move org name and logo to db
This commit is contained in:
Executable
+88
@@ -0,0 +1,88 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Reset a user's password (admin CLI). Uses MYSQL_* env vars from .env."""
|
||||
|
||||
import argparse
|
||||
import getpass
|
||||
import os
|
||||
import secrets
|
||||
import sys
|
||||
|
||||
from dotenv import load_dotenv
|
||||
from flask import Flask
|
||||
|
||||
os.chdir(os.path.dirname(os.path.abspath(__file__)))
|
||||
load_dotenv()
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost')
|
||||
app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user')
|
||||
app.config['MYSQL_PASSWORD'] = os.environ.get('MYSQL_PASSWORD', 'password')
|
||||
app.config['MYSQL_DATABASE'] = os.environ.get('MYSQL_DATABASE', 'ipam')
|
||||
|
||||
from db import get_db_connection, hash_password
|
||||
|
||||
|
||||
def reset_password(email, password):
|
||||
email = email.strip()
|
||||
if not email:
|
||||
raise SystemExit('Email is required.')
|
||||
|
||||
conn = get_db_connection(app)
|
||||
try:
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('SELECT id, name FROM User WHERE email = %s', (email,))
|
||||
row = cursor.fetchone()
|
||||
if not row:
|
||||
raise SystemExit(f'No user found with email: {email}')
|
||||
|
||||
user_id, name = row
|
||||
cursor.execute(
|
||||
'UPDATE User SET password = %s WHERE id = %s',
|
||||
(hash_password(password), user_id),
|
||||
)
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
return name
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description='Reset an IPAM user password.',
|
||||
)
|
||||
parser.add_argument('email', help='User email address')
|
||||
parser.add_argument(
|
||||
'--password', '-p',
|
||||
help='New password (prompted securely if omitted)',
|
||||
)
|
||||
parser.add_argument(
|
||||
'--generate', '-g',
|
||||
action='store_true',
|
||||
help='Generate a random password and print it',
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.generate and args.password:
|
||||
raise SystemExit('Use either --password or --generate, not both.')
|
||||
|
||||
if args.generate:
|
||||
password = secrets.token_urlsafe(16)
|
||||
elif args.password:
|
||||
password = args.password
|
||||
else:
|
||||
password = getpass.getpass('New password: ')
|
||||
confirm = getpass.getpass('Confirm password: ')
|
||||
if password != confirm:
|
||||
raise SystemExit('Passwords do not match.')
|
||||
|
||||
if not password:
|
||||
raise SystemExit('Password cannot be empty.')
|
||||
|
||||
name = reset_password(args.email, password)
|
||||
print(f'Password reset for {name} ({args.email}).')
|
||||
if args.generate:
|
||||
print(f'Generated password: {password}')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user