toga-ai 1.0.212 → 1.0.213
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/knowledge/1.0/apps/tools/INDEX.md +2 -2
- package/knowledge/1.0/apps/tools/architecture.md +18 -3
- package/knowledge/1.0/apps/tools/features/persona-gated-navigation.md +22 -1
- package/knowledge/1.0/apps/tools/features/saml-sso-auth.md +3 -0
- package/knowledge/1.0/apps/tools/workflows/deploy-to-elastic-beanstalk-al2023.md +8 -6
- package/package.json +1 -1
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
| Doc | Summary | Files |
|
|
4
4
|
|-----|---------|-------|
|
|
5
|
-
| [Tools (1.0 Internal-Tools App) Architecture](architecture.md) | **Tools** is a standalone 1.0 (`App_`) application that houses many small internal tools behind simple interfaces, gated by Client_True staff persona. | tools/index.php, tools/_/app/framework.php, tools/_/app/frameworkindex.php, tools/_/app/auth.php, tools/_/app/nav.php, tools/common/header.php, tools/common/footer.php, tools/mvc/get.php, tools/mvc/_TEMPLATE/get.php, tools/docs/ADDING_A_TOOL.md |
|
|
5
|
+
| [Tools (1.0 Internal-Tools App) Architecture](architecture.md) | **Tools** is a standalone 1.0 (`App_`) application that houses many small internal tools behind simple interfaces, gated by Client_True staff persona. | tools/index.php, tools/_/app/framework.php, tools/_/app/frameworkindex.php, tools/assets/img/favicon/favicon.ico, tools/assets/img/favicon/favicon-32x32.png, tools/assets/img/favicon/favicon-16x16.png, tools/assets/img/favicon/apple-touch-icon.png, tools/_/app/auth.php, tools/_/app/nav.php, tools/common/header.php, tools/common/footer.php, tools/mvc/get.php, tools/mvc/_TEMPLATE/get.php, tools/docs/ADDING_A_TOOL.md |
|
|
6
6
|
| [Tools — Developers Folder (UUID & Password Generators)](features/developer-tools.md) | The first two tools shipped in the Tools app, both under the **Developers** folder and gated to personas **Development Team** / **TOGa Technology**. | tools/mvc/developers/uuid/get.php, tools/mvc/developers/password/get.php |
|
|
7
|
-
| [Tools Persona-Gated Navigation (App_Nav)](features/persona-gated-navigation.md) | `App_Nav` is the Tools app's two-level, **persona-gated** navigation. | tools/_/app/nav.php |
|
|
7
|
+
| [Tools Persona-Gated Navigation (App_Nav)](features/persona-gated-navigation.md) | `App_Nav` is the Tools app's two-level, **persona-gated** navigation. | tools/_/app/nav.php, tools/mvc/get.php |
|
|
8
8
|
| [Tools SAML SSO Consumer & Persona-Gated Auth (App_Auth)](features/saml-sso-auth.md) | `App_Auth` is the Tools app's authentication layer: it consumes the SAML gateway `?saml=` handoff (see the 2.0 SAML downstream integration contract), establishe | tools/_/app/auth.php, tools/mvc/sso/initiate/get.php, tools/mvc/sso/get.php, tools/mvc/login/get.php, tools/mvc/login/post.php, tools/mvc/logout/get.php, tools/mvc/get.php, tools/config.production.ini |
|
|
9
9
|
| [Deploying Tools to Elastic Beanstalk (PHP 8.5 / Amazon Linux 2023)](workflows/deploy-to-elastic-beanstalk-al2023.md) | How the **Tools** 1.0 app boots on Elastic Beanstalk running `PHP 8.5 on 64bit Amazon Linux 2023/4.13.1 (aarch64)`. | tools/.ebextensions/004_http_to_https.config, tools/.ebextensions/006_mount-s3fs.config, tools/.ebextensions/007_setup_export_cache_folders.config, tools/.ebextensions/008_setup_ldap.config, tools/.ebextensions/009_setup_phpini.config, tools/.ebextensions/020_setup_git_libraries.config, tools/.ebextensions/050_register_instance_to_shared_application_load_balancer.config, tools/ebs/git.json |
|
|
@@ -6,12 +6,16 @@ project: Tools
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: architecture
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-06-
|
|
9
|
+
updated: 2026-06-26
|
|
10
10
|
owners: [jcardinal]
|
|
11
11
|
files:
|
|
12
12
|
- tools/index.php
|
|
13
13
|
- tools/_/app/framework.php
|
|
14
14
|
- tools/_/app/frameworkindex.php
|
|
15
|
+
- tools/assets/img/favicon/favicon.ico
|
|
16
|
+
- tools/assets/img/favicon/favicon-32x32.png
|
|
17
|
+
- tools/assets/img/favicon/favicon-16x16.png
|
|
18
|
+
- tools/assets/img/favicon/apple-touch-icon.png
|
|
15
19
|
- tools/_/app/auth.php
|
|
16
20
|
- tools/_/app/nav.php
|
|
17
21
|
- tools/common/header.php
|
|
@@ -57,14 +61,22 @@ calling the parent initialize.
|
|
|
57
61
|
|
|
58
62
|
No per-host `stylePath` subfolder — one `assets/css/style.css`. Uses TOGA Technology logos in
|
|
59
63
|
`assets/img` (`toga-brandmark-white.png` in the dark sidebar; `toga-horizontal-colored.png` on
|
|
60
|
-
login
|
|
64
|
+
login). **Favicons are app-local** under `assets/img/favicon/` (`apple-touch-icon.png` 180x180,
|
|
65
|
+
`favicon-32x32.png`, `favicon-16x16.png`, `favicon.ico`, sourced from togatech.com) and registered
|
|
66
|
+
in `_/app/frameworkindex.php` — **not** the shared `resources/images/favicon/` (Agilant) set
|
|
67
|
+
referenced via `__ASSETS__`. **Convention:** a per-app favicon/brand asset belongs under that app's
|
|
68
|
+
own `/assets`, never the shared `resources` repo, so changing one 1.0 app's favicon never affects
|
|
69
|
+
sibling apps. A fixed left two-column shell: dark left sidebar (`.app-nav`) with brand at top,
|
|
61
70
|
persona-filtered nav in the middle, pinned footer with the user's name + a ghost "Log out"
|
|
62
71
|
button; content area on the right. **No top header bar** (see Critical rules).
|
|
63
72
|
|
|
64
73
|
## Home route
|
|
65
74
|
|
|
66
75
|
`/` (`mvc/get.php`) renders a persona-filtered dashboard of available tools (tiles grouped by
|
|
67
|
-
folder) when logged in, via `App_Nav::visibleGroups()
|
|
76
|
+
folder) when logged in, via `App_Nav::visibleGroups()`. When **not** logged in, `/` immediately
|
|
77
|
+
routes to `/login` (one-step SSO sign-in — no intermediate welcome card). A persona-less but
|
|
78
|
+
authenticated user gets the dashboard's explicit empty-state (see
|
|
79
|
+
`features/persona-gated-navigation.md`).
|
|
68
80
|
|
|
69
81
|
## Adding a tool
|
|
70
82
|
|
|
@@ -79,3 +91,6 @@ Create `mvc/<folder>/<tool>/get.php` (copy `mvc/_TEMPLATE/get.php`), add one ent
|
|
|
79
91
|
**accepted this for now** (developer decision, 2026-06-25). Future remediation: git-ignore the
|
|
80
92
|
config files and rotate all exposed credentials. (Location only — no values recorded here.)
|
|
81
93
|
- **SSO initiation + replay defense are open items** — see `features/saml-sso-auth.md`.
|
|
94
|
+
|
|
95
|
+
## Change history
|
|
96
|
+
- 2026-06-26 — Documented app-local favicons under `assets/img/favicon/` (registered in `_/app/frameworkindex.php`, not the shared `resources/` set) + the per-app-asset convention; refreshed the home-route description for one-step SSO sign-in and the persona-less empty-state (jcardinal)
|
|
@@ -6,10 +6,11 @@ project: Tools
|
|
|
6
6
|
client: shared
|
|
7
7
|
type: feature
|
|
8
8
|
status: active
|
|
9
|
-
updated: 2026-06-
|
|
9
|
+
updated: 2026-06-26
|
|
10
10
|
owners: [jcardinal]
|
|
11
11
|
files:
|
|
12
12
|
- tools/_/app/nav.php
|
|
13
|
+
- tools/mvc/get.php
|
|
13
14
|
related:
|
|
14
15
|
- ../architecture.md
|
|
15
16
|
- ./saml-sso-auth.md
|
|
@@ -40,5 +41,25 @@ An action's `route` (e.g. `/developers/uuid`) maps **1:1** to `mvc/<route>/get.p
|
|
|
40
41
|
tool means creating that file and adding one entry to `definition()` — see
|
|
41
42
|
`docs/ADDING_A_TOOL.md` and the architecture doc.
|
|
42
43
|
|
|
44
|
+
## Authorization model — authentication and authorization are separate
|
|
45
|
+
|
|
46
|
+
**Authentication (SSO) and authorization (persona-gated nav) are independent.** Any valid,
|
|
47
|
+
active Client_True user authenticates and gets a session (see
|
|
48
|
+
[saml-sso-auth](./saml-sso-auth.md)) **regardless of personas** — having zero matching personas
|
|
49
|
+
does **not** block login. Authorization is then applied entirely by `App_Nav::definition()`
|
|
50
|
+
folder/action `personas` gates.
|
|
51
|
+
|
|
52
|
+
**Persona-less user (authenticated, zero tools):** `App_Nav::render()` skips every folder/action
|
|
53
|
+
the user lacks personas for, and skips now-empty groups, so the left rail renders **no links**.
|
|
54
|
+
The home dashboard (`mvc/get.php`) detects the empty result and shows an explicit empty-state
|
|
55
|
+
rather than a blank page:
|
|
56
|
+
- subtitle: *"There are no tools available for you to see."*
|
|
57
|
+
- a card: *"Your account doesn't have access to any tools. Tool access is granted by persona —
|
|
58
|
+
if you believe you should have access, contact the development team."* + a Log out action.
|
|
59
|
+
|
|
60
|
+
This is intentional: a valid user is never shown a broken/blank dashboard, and access is granted
|
|
61
|
+
purely by assigning personas — no code change is needed to grant a user access to an existing tool.
|
|
62
|
+
|
|
43
63
|
## Change history
|
|
64
|
+
- 2026-06-26 — Documented the authorization model: authentication (SSO) and authorization (persona-gated nav) are separate — any valid user logs in regardless of personas; a persona-less user gets an empty left rail and an explicit dashboard empty-state ("no tools available", contact-dev card + Log out) instead of a blank page (jcardinal)
|
|
44
65
|
- 2026-06-25 — Built App_Nav: hard-coded two-level persona-gated navigation; render() for the left rail, visibleGroups() for the dashboard, personasForRoute() for page self-guarding; route maps 1:1 to mvc/<route>/get.php (jcardinal)
|
|
@@ -68,6 +68,9 @@ auto-created.
|
|
|
68
68
|
### Page guarding
|
|
69
69
|
- `requireAuth([personas])` at the top of each page; `hasAnyPersona()` is `array_intersect`
|
|
70
70
|
against the cached session personas. App_Nav uses the same cached data to filter the nav.
|
|
71
|
+
- **Authentication ≠ authorization.** A session establishes for **any** valid/active user even
|
|
72
|
+
when they have **zero** matching personas; in that case the nav is empty and the dashboard shows
|
|
73
|
+
an explicit empty-state — see [persona-gated-navigation](./persona-gated-navigation.md).
|
|
71
74
|
|
|
72
75
|
### Dev bypass (double-gated, fails closed in prod)
|
|
73
76
|
`mvc/login/post.php` permits **email-only** login **only** when config `[internal] dev_mode`
|
|
@@ -117,16 +117,18 @@ setup — the git clone (`020`) deliberately does **not** use it (see gotchas).
|
|
|
117
117
|
e.g. `GIT=$(which git || echo /usr/bin/git)`.
|
|
118
118
|
- **cfn-init `files:` runs before `container_commands`** — the correct pattern for writing a
|
|
119
119
|
script and then executing it in the same config.
|
|
120
|
-
- **A SAML SSO return-leg "connection timeout" is
|
|
120
|
+
- **A SAML SSO return-leg "connection timeout" is a missing HTTPS listener, not code. (CONFIRMED + RESOLVED.)**
|
|
121
121
|
When the gateway's return redirect to `https://<host>/sso` times out in the browser, verify the
|
|
122
122
|
**EB/ALB HTTPS (443) listener + ACM cert cover the EXACT return hostname before debugging
|
|
123
|
-
PHP/SAML.**
|
|
124
|
-
no 443 listener
|
|
125
|
-
|
|
126
|
-
`curl
|
|
127
|
-
|
|
123
|
+
PHP/SAML.** Root cause for Tools was **confirmed**: the `tools.togatech.com` EB environment had
|
|
124
|
+
**no HTTPS (443) listener configured at all**. Adding the HTTPS:443 listener (with an ACM cert
|
|
125
|
+
covering the exact return hostname) fixed the SSO return leg completely — **no code change was
|
|
126
|
+
involved.** Diagnosis signature: `curl` to the public `https://` URL **from the instance itself**
|
|
127
|
+
returns `http=000` after the full timeout, while `curl http://127.0.0.1` with a `Host:` header
|
|
128
|
+
returns `200` fast. Reusable for any TOGA app behind Elastic Beanstalk.
|
|
128
129
|
|
|
129
130
|
## Change history
|
|
131
|
+
- 2026-06-26 — CONFIRMED + RESOLVED the SAML SSO return-leg gotcha: the `tools.togatech.com` EB environment had no HTTPS (443) listener at all; adding the HTTPS:443 listener + ACM cert covering the exact return hostname fixed the SSO return leg with no code change (jcardinal)
|
|
130
132
|
- 2026-06-26 — Added the SAML SSO return-leg gotcha: a "connection timeout" on `https://<host>/sso` was a missing EB/ALB HTTPS (443) listener for the new `togatech.com` hostname (not PHP/SAML); documented the curl `http=000` vs `127.0.0.1` 200 diagnosis (jcardinal)
|
|
131
133
|
- 2026-06-26 — Documented the AL2 → AL2023 (PHP 8.5) EB migration for Tools: package renames
|
|
132
134
|
(`libstdc++48`→`libstdc++`, `php73-ldap`→`php-ldap`, drop `libcurl`), php ini via cfn-init
|
package/package.json
CHANGED