mirror of
https://github.com/hackertron/LucidLoanMachine.git
synced 2026-01-09 18:37:58 -05:00
268 lines
9.6 KiB
Python
268 lines
9.6 KiB
Python
import gradio as gr
|
|
import json
|
|
import os
|
|
import tempfile
|
|
from typing import Dict, Any, Optional
|
|
import traceback
|
|
|
|
# Import the existing skills
|
|
from extract_pdf_skill import process_pdf_from_url
|
|
from verify_tlsn_proof import verify_tlsn_proof, save_tlsn_proof
|
|
|
|
def handle_loan_application(
|
|
name: str,
|
|
loan_amount: float,
|
|
country: str,
|
|
bank: str,
|
|
has_income: bool,
|
|
email: str,
|
|
no_default_history: bool
|
|
) -> str:
|
|
"""
|
|
Handle the initial loan application form
|
|
"""
|
|
# Create a JSON with the loan application details
|
|
application_data = {
|
|
"first_name": name.split()[0] if len(name.split()) > 0 else "",
|
|
"last_name": name.split()[1] if len(name.split()) > 1 else "",
|
|
"loan_amount": loan_amount,
|
|
"country": country,
|
|
"bank": bank,
|
|
"income": "Yes" if has_income else "No",
|
|
"history": "No defaults" if no_default_history else "Has defaults",
|
|
"email": email
|
|
}
|
|
|
|
# Save to bank.json
|
|
with open("bank.json", "w") as f:
|
|
json.dump(application_data, f, indent=4)
|
|
|
|
return f"Application data saved successfully:\n\n{json.dumps(application_data, indent=4)}"
|
|
|
|
def handle_email_verification(raw_email: str) -> str:
|
|
"""
|
|
Handle the email verification step
|
|
"""
|
|
if not raw_email:
|
|
return "Please provide the raw email content."
|
|
|
|
# Save the raw email to a file
|
|
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".eml")
|
|
try:
|
|
temp_file.write(raw_email.encode('utf-8'))
|
|
temp_file.close()
|
|
|
|
# Verify DKIM signature
|
|
result = verify_dkim_signature(temp_file.name)
|
|
|
|
# Try to extract relevant information from the email
|
|
# This is a placeholder - in a real implementation, you would extract more information
|
|
email_info = "Email processed successfully. DKIM verification results are shown in the console."
|
|
|
|
return email_info
|
|
except Exception as e:
|
|
return f"Error processing email: {str(e)}"
|
|
finally:
|
|
# Clean up
|
|
if os.path.exists(temp_file.name):
|
|
os.remove(temp_file.name)
|
|
|
|
def handle_email_upload(email_file) -> str:
|
|
"""
|
|
Handle uploaded email file
|
|
"""
|
|
if email_file is None:
|
|
return "No file uploaded"
|
|
|
|
try:
|
|
# Read the file content
|
|
with open(email_file.name, "r", encoding="utf-8", errors="ignore") as f:
|
|
email_content = f.read()
|
|
|
|
# Process the email
|
|
return handle_email_verification(email_content)
|
|
except Exception as e:
|
|
return f"Error processing email file: {str(e)}"
|
|
|
|
def handle_salary_verification(pdf_url: str) -> str:
|
|
"""
|
|
Handle the salary slip verification
|
|
"""
|
|
if not pdf_url:
|
|
return "Please provide a valid PDF URL."
|
|
|
|
try:
|
|
# Process the PDF
|
|
text = process_pdf_from_url(pdf_url)
|
|
|
|
if not text:
|
|
return "Failed to extract text from the PDF. Please check the URL and try again."
|
|
|
|
# Here we would extract information like account number, bank balance, etc.
|
|
# This is a simplified example
|
|
info_extract = "PDF processed successfully. Extracted text: " + text[:300] + "..."
|
|
|
|
# Try to update bank.json with additional information
|
|
try:
|
|
with open("bank.json", "r") as f:
|
|
bank_data = json.load(f)
|
|
|
|
# Here you would extract and add more data
|
|
bank_data["pdf_verified"] = True
|
|
|
|
with open("bank.json", "w") as f:
|
|
json.dump(bank_data, f, indent=4)
|
|
|
|
info_extract += "\n\nBank application data updated with PDF verification."
|
|
except Exception as e:
|
|
info_extract += f"\n\nWarning: Could not update application data: {str(e)}"
|
|
|
|
return info_extract
|
|
except Exception as e:
|
|
return f"Error processing PDF: {str(e)}"
|
|
|
|
def handle_tlsn_proof_text(proof_json: str) -> Dict[str, Any]:
|
|
"""
|
|
Handle TLSN proof verification from pasted JSON
|
|
"""
|
|
if not proof_json:
|
|
return {"success": False, "error": "Please provide the TLSN proof JSON."}
|
|
|
|
try:
|
|
# Save the proof to a file
|
|
save_result = save_tlsn_proof(proof_json)
|
|
if not save_result["success"]:
|
|
return save_result
|
|
|
|
# Verify the proof
|
|
result = verify_tlsn_proof(proof_json)
|
|
return result
|
|
except Exception as e:
|
|
traceback.print_exc() # Print the full exception traceback to console
|
|
return {"success": False, "error": f"Error processing TLSN proof: {str(e)}"}
|
|
|
|
def handle_tlsn_proof_upload(proof_file) -> Dict[str, Any]:
|
|
"""
|
|
Handle TLSN proof verification from uploaded file
|
|
"""
|
|
if proof_file is None:
|
|
return {"success": False, "error": "No file uploaded"}
|
|
|
|
try:
|
|
# Read the file
|
|
with open(proof_file.name, "r", encoding="utf-8") as f:
|
|
proof_json = f.read()
|
|
|
|
# Process the proof
|
|
return handle_tlsn_proof_text(proof_json)
|
|
except Exception as e:
|
|
traceback.print_exc() # Print the full exception traceback to console
|
|
return {"success": False, "error": f"Error processing TLSN proof file: {str(e)}"}
|
|
|
|
def create_ui():
|
|
"""
|
|
Create the Gradio UI
|
|
"""
|
|
with gr.Blocks(title="Lucid Loan Machine") as app:
|
|
gr.Markdown("# 💰 Lucid Loan Machine (LLM)")
|
|
gr.Markdown("## A secure loan application system powered by AI and zero-knowledge proofs")
|
|
|
|
with gr.Tab("Loan Application"):
|
|
gr.Markdown("### 📝 Complete this form to start your loan application")
|
|
with gr.Row():
|
|
with gr.Column():
|
|
name_input = gr.Textbox(label="Full Name")
|
|
loan_amount_input = gr.Number(label="Loan Amount")
|
|
country_input = gr.Textbox(label="Country")
|
|
bank_input = gr.Textbox(label="Bank")
|
|
has_income_input = gr.Checkbox(label="Do you have a job/proof of income?")
|
|
email_input = gr.Textbox(label="Email")
|
|
no_default_history_input = gr.Checkbox(label="No history of not paying back loans?")
|
|
submit_button = gr.Button("Submit Application")
|
|
|
|
with gr.Column():
|
|
application_output = gr.Textbox(label="Application Status", lines=10)
|
|
|
|
with gr.Tab("Email Verification"):
|
|
gr.Markdown("### 📧 Verify your identity with email verification")
|
|
with gr.Row():
|
|
with gr.Column():
|
|
gr.Markdown("#### Paste Raw Email")
|
|
raw_email_input = gr.Textbox(label="Raw Email Content", lines=15)
|
|
email_submit_button = gr.Button("Verify Email")
|
|
|
|
with gr.Column():
|
|
gr.Markdown("#### Or Upload Email File")
|
|
email_file_input = gr.File(label="Email File")
|
|
email_upload_button = gr.Button("Verify Uploaded Email")
|
|
|
|
email_verification_output = gr.Textbox(label="Email Verification Result", lines=10)
|
|
|
|
with gr.Tab("Salary Slip Verification"):
|
|
gr.Markdown("### 💼 Verify your income with a salary slip")
|
|
with gr.Row():
|
|
with gr.Column():
|
|
pdf_url_input = gr.Textbox(label="Salary Slip PDF URL")
|
|
pdf_submit_button = gr.Button("Verify Salary Slip")
|
|
|
|
with gr.Column():
|
|
salary_verification_output = gr.Textbox(label="Salary Verification Result", lines=10)
|
|
|
|
with gr.Tab("TLSN Proof Verification"):
|
|
gr.Markdown("### 🔐 Verify website data with TLSN proof")
|
|
with gr.Row():
|
|
with gr.Column():
|
|
gr.Markdown("#### Paste TLSN Proof JSON")
|
|
tlsn_proof_input = gr.Textbox(label="TLSN Proof JSON", lines=15)
|
|
tlsn_submit_button = gr.Button("Verify TLSN Proof")
|
|
|
|
with gr.Column():
|
|
gr.Markdown("#### Or Upload TLSN Proof File")
|
|
tlsn_file_input = gr.File(label="TLSN Proof File")
|
|
tlsn_upload_button = gr.Button("Verify Uploaded TLSN Proof")
|
|
|
|
tlsn_verification_output = gr.JSON(label="TLSN Verification Result")
|
|
|
|
# Set up event handlers
|
|
submit_button.click(
|
|
handle_loan_application,
|
|
inputs=[name_input, loan_amount_input, country_input, bank_input,
|
|
has_income_input, email_input, no_default_history_input],
|
|
outputs=application_output
|
|
)
|
|
|
|
email_submit_button.click(
|
|
handle_email_verification,
|
|
inputs=[raw_email_input],
|
|
outputs=email_verification_output
|
|
)
|
|
|
|
email_upload_button.click(
|
|
handle_email_upload,
|
|
inputs=[email_file_input],
|
|
outputs=email_verification_output
|
|
)
|
|
|
|
pdf_submit_button.click(
|
|
handle_salary_verification,
|
|
inputs=[pdf_url_input],
|
|
outputs=salary_verification_output
|
|
)
|
|
|
|
tlsn_submit_button.click(
|
|
handle_tlsn_proof_text,
|
|
inputs=[tlsn_proof_input],
|
|
outputs=tlsn_verification_output
|
|
)
|
|
|
|
tlsn_upload_button.click(
|
|
handle_tlsn_proof_upload,
|
|
inputs=[tlsn_file_input],
|
|
outputs=tlsn_verification_output
|
|
)
|
|
|
|
return app
|
|
|
|
if __name__ == "__main__":
|
|
app = create_ui()
|
|
app.launch() |