File size: 3,445 Bytes
811fa8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6feefab
811fa8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c65ec45
811fa8b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import gradio as gr
from .server import (
    get_public_key,
    get_server_info,
    decode_data,
    generate_rsa_keys,
    PUBLIC_KEY_PEM_STRING,
    KEYLOCK_STATUS_MESSAGE
)

theme = gr.themes.Soft()

with gr.Blocks(title="Secure Decoder API", theme=theme) as demo:
    gr.Markdown("# πŸ” Secure KeyLock Decoder & Auth API")
    gr.Markdown("This application provides secure API endpoints to decrypt data from images and perform mock authentication.")
    gr.Markdown("This Server Base URL: https://broadfield-dev-keylock-auth-server-repo.hf.space")

    with gr.Tabs():
        with gr.TabItem("πŸš€ API Documentation"):
            gr.Markdown("## How to Use This API")
            gr.Markdown(
                "This server exposes three main API endpoints for programmatic use:\n"
                "1.  **`/keylock-info`**: A `GET` request returns a JSON object with server metadata.\n"
                "2.  **`/keylock-pub`**: A `GET` request returns the server's public RSA key required for encryption.\n"
                "3.  **`/keylock-server`**: A `POST` request with a base64-encoded image string decrypts the data and uses it to authenticate."
            )
            gr.Markdown("### Required Payload for Authentication")
            gr.Markdown("Your client must encrypt a JSON object containing `API_KEY` and `USER` keys.")
            gr.Code(
                language="json",
                label="Example JSON Payload to Encrypt",
                value='{\n  "API_KEY": "sk-12345-abcde",\n  "USER": "demo-user"\n}'
            )
            gr.Markdown("### Server's Public Key")
            gr.Code(value=PUBLIC_KEY_PEM_STRING, language="python", label="Server Public Key (from /keylock-pub)")

        with gr.TabItem("βš™οΈ Server Status & Admin"):
            gr.Markdown("## Server Status")
            gr.Textbox(label="Private Key Status", value=KEYLOCK_STATUS_MESSAGE, interactive=False, lines=3)
            gr.Markdown("---")
            with gr.Accordion("πŸ”‘ Admin: Key Pair Generator", open=False):
                gr.Markdown(
                    "**For Administrators Only.** Use this tool to generate a new RSA key pair for the server. "
                    "**This does NOT automatically apply the keys.** To use them, you must:\n"
                    "1.  Copy the **Private Key** and update the `KEYLOCK_PRIV_KEY` secret in your deployment environment.\n"
                    "2.  Restart the server for the changes to take effect. The public key will be derived automatically."
                )
                gen_keys_button = gr.Button("βš™οΈ Generate New 2048-bit Key Pair", variant="secondary")
                with gr.Row():
                    output_private_key = gr.Textbox(lines=10, label="Generated Private Key (KEEP THIS SECRET)", interactive=False, show_copy_button=True)
                    output_public_key = gr.Textbox(lines=10, label="Generated Public Key (will be auto-derived)", interactive=False, show_copy_button=True)
                gen_keys_button.click(fn=generate_rsa_keys, inputs=None, outputs=[output_private_key, output_public_key])

    with gr.Row(visible=False):
        gr.Interface(fn=get_public_key, inputs=None, outputs=gr.Textbox(), api_name="keylock-pub")
        gr.Interface(fn=get_server_info, inputs=None, outputs=gr.JSON(), api_name="keylock-info")
        gr.Interface(fn=decode_data, inputs=gr.Textbox(), outputs=gr.JSON(), api_name="keylock-server")