Trace.AI / password_checker.py
SilverDragon9's picture
Create password_checker.py
44f9354 verified
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()