Browse Source

Cleanup OTB Cloud portal UI and handoff helper v0.1.2

master
Don Kingdon 3 weeks ago
parent
commit
508dfb7ab1
  1. 23
      PROJECT_STATE.md
  2. 7
      README.md
  3. 2
      VERSION
  4. 5
      app/templates/auth/handoff_error.html
  5. 5
      app/templates/auth/login_required.html
  6. 3
      app/templates/cloud/dashboard.html
  7. 4
      app/templates/portal_base.html
  8. 4
      scripts/make_test_handoff.py

23
PROJECT_STATE.md

@ -4,7 +4,7 @@
OTB Cloud OTB Cloud
## Current version ## Current version
v0.1.1 v0.1.2
## Build date ## Build date
2026-04-12 2026-04-12
@ -53,24 +53,25 @@ Each device should have:
- Main blueprint - Main blueprint
- Auth blueprint - Auth blueprint
- MariaDB connection helper - MariaDB connection helper
- Signed handoff placeholder route - Signed handoff endpoint
- Auth-protected dashboard - Auth-protected dashboard
- Local temporary portal base template - Temporary portal base template
- SQL schema file - SQL schema file
- DB bootstrap script - DB bootstrap script
- Storage bootstrap scripts - Storage bootstrap scripts
- Gunicorn systemd service on vault3
- Mintme reverse proxy in place
## Immediate next tasks ## Immediate next tasks
1. Create MariaDB database and otb_cloud DB user 1. Patch OTB Billing to add OTB Cloud services card
2. Run schema bootstrap script 2. Add signed handoff redirect route in OTB Billing
3. Install Python requirements into venv 3. Replace temporary portal base with shared portal template structure
4. Start local Flask test run on 127.0.0.1:5090 4. Build file library and upload endpoints
5. Add real shared `portal_base.html` integration from OTB portal 5. Add upload audit logging
6. Build file library and upload endpoints 6. Add first real storage browsing page
7. Add OTB Billing service-card integration
## Notes ## Notes
Original uploaded files should remain preserved and effectively read-only. Original uploaded files should remain preserved and effectively read-only.
Any user-facing edits or processing outputs should create derivative files. Any user-facing edits or processing outputs should create derivative files.
Admin access should require owner-issued one-time support authorization. Admin access should require owner-issued one-time support authorization.
The current auth handoff is a placeholder scaffold using a shared secret and HMAC signature. This version cleans up the temporary UI while keeping the same signed handoff endpoint for OTB Billing integration.

7
README.md

@ -1,5 +1,12 @@
# OTB Cloud # OTB Cloud
## v0.1.2 - 2026-04-12
- Cleaned up unauthenticated OTB Cloud pages
- Hid Dashboard/Logout navigation when not authenticated
- Updated portal-required messaging for production-style flow
- Updated handoff error page wording
- Updated test handoff helper to load `.env` automatically
## v0.1.1 - 2026-04-12 ## v0.1.1 - 2026-04-12
- Added app config module and MariaDB connection helper - Added app config module and MariaDB connection helper
- Added signed portal handoff placeholder routes - Added signed portal handoff placeholder routes

2
VERSION

@ -1 +1 @@
v0.1.1 v0.1.2

5
app/templates/auth/handoff_error.html

@ -1,10 +1,13 @@
{% extends "portal_base.html" %} {% extends "portal_base.html" %}
{% block title %}Handoff Error{% endblock %} {% block title %}Portal Handoff Error{% endblock %}
{% block content %} {% block content %}
<div class="card"> <div class="card">
<h1>Portal handoff failed</h1> <h1>Portal handoff failed</h1>
<p class="muted">{{ message }}</p> <p class="muted">{{ message }}</p>
<div class="warn" style="margin-top:16px;">
Please return to the OTB Billing portal and try launching OTB Cloud again.
</div>
</div> </div>
{% endblock %} {% endblock %}

5
app/templates/auth/login_required.html

@ -6,11 +6,10 @@
<div class="card"> <div class="card">
<h1>Portal login required</h1> <h1>Portal login required</h1>
<p class="muted"> <p class="muted">
OTB Cloud does not allow direct unauthenticated access. OTB Cloud is available only through a signed handoff from the OTB Billing portal.
This app is intended to be reached through the OTB Billing portal handoff.
</p> </p>
<div class="warn" style="margin-top:16px;"> <div class="warn" style="margin-top:16px;">
Current status: direct local scaffold only. Real portal handoff wiring is next. Please return to the OTB Billing portal and open OTB Cloud from your Services page.
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

3
app/templates/cloud/dashboard.html

@ -30,7 +30,8 @@
<div class="card"> <div class="card">
<h2 style="margin-top:0;">Current scope</h2> <h2 style="margin-top:0;">Current scope</h2>
<p class="muted"> <p class="muted">
v0.1.1 provides portal-handoff scaffolding, tenant bootstrap, device records, and an authenticated dashboard. OTB Cloud is now running as a portal-linked secure storage service.
Next steps are real OTB Billing handoff integration, file library pages, and upload endpoints.
</p> </p>
</div> </div>
</div> </div>

4
app/templates/portal_base.html

@ -93,8 +93,10 @@
<div class="nav"> <div class="nav">
<div class="brand">OTB Cloud</div> <div class="brand">OTB Cloud</div>
<div class="nav-links"> <div class="nav-links">
{% if session.get("otb_user_id") %}
<a href="/dashboard">Dashboard</a> <a href="/dashboard">Dashboard</a>
<a href="/auth/logout">Logout</a> <a href="/auth/logout">Logout</a>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
@ -105,7 +107,7 @@
<div class="footer"> <div class="footer">
<div class="wrap"> <div class="wrap">
Temporary local portal base template for OTB Cloud v0.1.1. Replace this with the shared OTB portal base during integration. OTB Cloud is a portal-linked secure backup and storage service for Outsidethebox.top.
</div> </div>
</div> </div>
</body> </body>

4
scripts/make_test_handoff.py

@ -5,6 +5,10 @@ import os
import time import time
import urllib.parse import urllib.parse
from dotenv import load_dotenv
load_dotenv()
secret = os.getenv("OTB_PORTAL_SHARED_SECRET", "change-me") secret = os.getenv("OTB_PORTAL_SHARED_SECRET", "change-me")
uid = os.getenv("OTB_TEST_UID", "1001") uid = os.getenv("OTB_TEST_UID", "1001")
email = os.getenv("OTB_TEST_EMAIL", "client@example.com") email = os.getenv("OTB_TEST_EMAIL", "client@example.com")

Loading…
Cancel
Save