from flask import Flask, request, jsonify import re from datetime import datetime import logging app = Flask(__name__) # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) class PasswordValidator: @staticmethod def is_strong_password(password: str) -> tuple[bool, str]: """ Validates password strength based on the following rules: - Minimum 12 characters - At least one uppercase letter - At least one lowercase letter - At least one number - At least one special character - No common patterns """ if len(password) < 12: return False, "Password must be at least 12 characters long" if not re.search(r'[A-Z]', password): return False, "Password must contain at least one uppercase letter" if not re.search(r'[a-z]', password): return False, "Password must contain at least one lowercase letter" if not re.search(r'\d', password): return False, "Password must contain at least one number" if not re.search(r'[!@#$%^&*(),.?":{}|<>]', password): return False, "Password must contain at least one special character" # Check for common patterns common_patterns = [ r'12345', r'qwerty', r'password', r'admin', r'abc123' ] for pattern in common_patterns: if re.search(pattern, password.lower()): return False, f"Password contains a common pattern: {pattern}" return True, "Password meets all requirements" @app.route('/api/signup', methods=['POST']) def signup(): try: data = request.get_json() if not data: return jsonify({ 'success': False, 'message': 'No data provided' }), 400 # Extract required fields email = data.get('email') password = data.get('password') username = data.get('username') # Validate required fields if not all([email, password, username]): return jsonify({ 'success': False, 'message': 'Missing required fields: email, password, and username are required' }), 400 # Validate email format email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' if not re.match(email_pattern, email): return jsonify({ 'success': False, 'message': 'Invalid email format' }), 400 # Validate password strength is_strong, message = PasswordValidator.is_strong_password(password) if not is_strong: return jsonify({ 'success': False, 'message': f'Password is not strong enough: {message}' }), 400 # TODO: Add your database logic here to save the user # Make sure to hash the password before storing it! # Log successful signup attempt (excluding sensitive data) logger.info(f"Successful signup attempt for user: {username} at {datetime.utcnow()}") return jsonify({ 'success': True, 'message': 'User registered successfully', 'data': { 'username': username, 'email': email } }), 201 except Exception as e: logger.error(f"Error during signup: {str(e)}") return jsonify({ 'success': False, 'message': 'An error occurred during signup' }), 500 if __name__ == '__main__': app.run(debug=False)