| import gradio as gr | |
| from keylock_component import KeylockDecoderComponent, AppServerLogic | |
| shared_server_logic = AppServerLogic() | |
| MOCK_CREDENTIALS = { | |
| "demo-user": {"password": "password123"}, | |
| "admin-user": {"password": "adminpass"} | |
| } | |
| with gr.Blocks(theme=gr.themes.Soft(primary_hue="sky")) as demo: | |
| gr.Markdown("# π KeyLock Application Login") | |
| with gr.Row(): | |
| with gr.Column(scale=2): | |
| gr.Markdown("### 1. Login with Credentials") | |
| gr.Markdown("Enter credentials manually, or use a KeyLock image to auto-fill them.") | |
| username_input = gr.Textbox(label="Username", interactive=True) | |
| password_input = gr.Textbox(label="Password", type="password", interactive=True) | |
| login_button = gr.Button("Login", variant="primary") | |
| login_status = gr.Markdown() | |
| with gr.Column(scale=3): | |
| gr.Markdown("### 2. Use a KeyLock Image to Auto-Fill") | |
| keylock_decoder = KeylockDecoderComponent( | |
| server_logic=shared_server_logic | |
| ) | |
| def handle_login(username, password): | |
| user_data = MOCK_CREDENTIALS.get(username) | |
| if user_data and user_data["password"] == password: | |
| gr.Info(f"Login Successful! Welcome, {username}.") | |
| return f"<p style='color:green;font-weight:bold'>β Login successful for {username}.</p>" | |
| else: | |
| gr.Error("Login Failed: Invalid username or password.") | |
| return f"<p style='color:red;font-weight:bold'>β Login failed.</p>" | |
| def autofill_from_key(decoder_result): | |
| if decoder_result and decoder_result.get("status") == "Success": | |
| payload = decoder_result.get("payload", {}) | |
| user = payload.get("USER", "") | |
| user_data = MOCK_CREDENTIALS.get(user) | |
| password = user_data.get("password", "") if user_data else "" | |
| return gr.update(value=user), gr.update(value=password) | |
| return gr.update(), gr.update() | |
| keylock_decoder.change( | |
| fn=autofill_from_key, | |
| inputs=[keylock_decoder], | |
| outputs=[username_input, password_input] | |
| ) | |
| login_button.click( | |
| fn=handle_login, | |
| inputs=[username_input, password_input], | |
| outputs=[login_status] | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |