import pandas as pd import numpy as np import joblib import gradio as gr import os import tempfile # Set a custom directory for Gradio's temporary files os.environ["GRADIO_TEMP"] = tempfile.mkdtemp() # Load model model = joblib.load("password_checker_model.pkl") # Mapping of numerical predictions to descriptive labels STRENGTH_MAPPING = { 0: "Weak", 1: "Fairly Strong", 2: "Strong" } def extract_password_features(password): """Extract features from the password for model prediction.""" features = { 'length': len(password), 'has upper': int(any(c.isupper() for c in password)), 'has lower': int(any(c.islower() for c in password)), 'has digit': int(any(c.isdigit() for c in password)), 'has symbol': int(any(not c.isalnum() for c in password)), 'count upper': sum(1 for c in password if c.isupper()), 'count lower': sum(1 for c in password if c.islower()), 'count digits': sum(1 for c in password if c.isdigit()), 'count symbols': sum(1 for c in password if not c.isalnum()), } return pd.DataFrame([features]) def check_password_strength(password): """Predict the strength of the password using the loaded model.""" try: if not password: return "Error: Password cannot be empty." features_df = extract_password_features(password) # Verify that feature names match the model's expectations if list(features_df.columns) != list(model.feature_names_in_): return f"Error: Feature names mismatch. Expected {model.feature_names_in_}, got {list(features_df.columns)}" prediction = model.predict(features_df)[0] # Map numerical prediction to descriptive label if prediction not in STRENGTH_MAPPING: return f"Error: Invalid prediction value {prediction}. Expected values are {list(STRENGTH_MAPPING.keys())}." return f"Password Strength: {STRENGTH_MAPPING[prediction]}" except Exception as e: return f"Error: {str(e)}" # Gradio Interface with gr.Blocks(title="Password Strength Checker") as iface: gr.Markdown( """ # Password Strength Checker Enter a password to evaluate its strength. The model will classify it as **Weak**, **Fairly Strong**, or **Strong**. """ ) password_input = gr.Textbox( label="Enter Password", placeholder="Type your password here...", type="password" ) output = gr.Textbox(label="Predicted Strength") submit_button = gr.Button("Check Strength") submit_button.click( fn=check_password_strength, inputs=password_input, outputs=output ) # Launch the interface if __name__ == "__main__": iface.launch()