From 8b1f8712a843f7ad83f12b2959c5885472001c92 Mon Sep 17 00:00:00 2001
From: "Donald F. Coffin"
Date: Sun, 7 Jun 2026 17:10:07 -0400
Subject: [PATCH 1/5] fix(#175): add Home link to custodian + customer portal
navbars
The customer self-service page was a dead end (navbar linked only to itself and
Logout). Add a persistent "Home" item (-> /) to both portal navbar fragments so
every authenticated page has a consistent way back to the site landing.
Verified: custodian and customer pages each render one Home link; Home resolves
(200) from a customer session.
Co-Authored-By: Claude Opus 4.8
---
.../src/main/resources/templates/fragments/layout.html | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/openespi-datacustodian/src/main/resources/templates/fragments/layout.html b/openespi-datacustodian/src/main/resources/templates/fragments/layout.html
index 2552fad5..5a349acf 100644
--- a/openespi-datacustodian/src/main/resources/templates/fragments/layout.html
+++ b/openespi-datacustodian/src/main/resources/templates/fragments/layout.html
@@ -76,7 +76,11 @@
+ Third Parties pages are not yet available, so no dead links are shown.
+ A Home link is always present so no page is a dead end (#175). -->
+
From 697be634a2a1aa02964544a108a4e5580378684c Mon Sep 17 00:00:00 2001
From: "Donald F. Coffin"
Date: Sun, 7 Jun 2026 17:32:03 -0400
Subject: [PATCH 2/5] =?UTF-8?q?fix(#175):=20portal=20nav=20polish=20?=
=?UTF-8?q?=E2=80=94=20user=20dropdown,=20customer=20link,=20About=20page,?=
=?UTF-8?q?=20footer=20cleanup?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Follow-on navbar/footer consistency fixes from browser testing:
- User menu: replace the awkward "Custodian: name" / "Welcome, name" text + loose
Logout button with a proper user dropdown (username ▾ → Logout) in both the
custodian and customer navbars, matching the main header.
- Logged-in customers can reach their authorizations from anywhere: the shared
header now shows a "My Authorizations" link for ROLE_USER (e.g. on the home page).
- Footer dead links: add a real public About page (/about — implementation/version
info; replaces legacy about.jsp) and remove the Terms of Service / Usage Policy
links rather than ship stale EnergyOS-era boilerplate or fabricated legal text.
- Home "Learn more about Green Button" now links to greenbuttonalliance.org.
- /about added to the session chain (public).
Verified: /about 200 (public); custodian/customer user dropdowns + logout; customer
home shows My Authorizations; learn-more → GBA. datacustodian suite 160/0.
Co-Authored-By: Claude Opus 4.8
---
.../CustomerLoginSecurityConfiguration.java | 4 +-
.../datacustodian/web/AboutController.java | 49 +++++++++++++++++
.../src/main/resources/templates/about.html | 34 ++++++++++++
.../resources/templates/fragments/layout.html | 53 ++++++++++++-------
.../src/main/resources/templates/home.html | 2 +-
5 files changed, 121 insertions(+), 21 deletions(-)
create mode 100644 openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/web/AboutController.java
create mode 100644 openespi-datacustodian/src/main/resources/templates/about.html
diff --git a/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/config/CustomerLoginSecurityConfiguration.java b/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/config/CustomerLoginSecurityConfiguration.java
index 5c622527..43ec7ef1 100644
--- a/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/config/CustomerLoginSecurityConfiguration.java
+++ b/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/config/CustomerLoginSecurityConfiguration.java
@@ -96,6 +96,7 @@ public SecurityFilterChain customerLoginSecurityFilterChain(
RequestMatcher matcher = new OrRequestMatcher(
pp.matcher("/"),
pp.matcher("/home"),
+ pp.matcher("/about"),
pp.matcher("/login"),
pp.matcher("/logout"),
pp.matcher("/custodian/**"),
@@ -111,7 +112,8 @@ public SecurityFilterChain customerLoginSecurityFilterChain(
// session-stored token. Right shape for vanilla form login.
.csrf(Customizer.withDefaults())
.authorizeHttpRequests(authz -> authz
- .requestMatchers(pp.matcher("/"), pp.matcher("/home"), pp.matcher("/login")).permitAll()
+ .requestMatchers(pp.matcher("/"), pp.matcher("/home"), pp.matcher("/about"),
+ pp.matcher("/login")).permitAll()
.anyRequest().authenticated())
.formLogin(form -> form
.loginPage("/login")
diff --git a/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/web/AboutController.java b/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/web/AboutController.java
new file mode 100644
index 00000000..ce6a34c2
--- /dev/null
+++ b/openespi-datacustodian/src/main/java/org/greenbuttonalliance/espi/datacustodian/web/AboutController.java
@@ -0,0 +1,49 @@
+/*
+ *
+ * Copyright (c) 2025 Green Button Alliance, Inc.
+ *
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.greenbuttonalliance.espi.datacustodian.web;
+
+import org.springframework.boot.SpringBootVersion;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * Public "About" page (#175). Replaces the legacy about.jsp build-info table with a small,
+ * non-sensitive summary of the running implementation. Public (footer-linked from every page,
+ * including the anonymous login page).
+ */
+@Controller
+public class AboutController {
+
+ @GetMapping("/about")
+ public String about(Model model) {
+ Map info = new LinkedHashMap<>();
+ String version = AboutController.class.getPackage().getImplementationVersion();
+ info.put("Implementation", "OpenESPI Green Button Data Custodian");
+ info.put("Version", version != null ? version : "(development build)");
+ info.put("Java version", System.getProperty("java.version", "—"));
+ info.put("Spring Boot version", SpringBootVersion.getVersion());
+ model.addAttribute("info", info);
+ return "about";
+ }
+}
diff --git a/openespi-datacustodian/src/main/resources/templates/about.html b/openespi-datacustodian/src/main/resources/templates/about.html
new file mode 100644
index 00000000..7f95c011
--- /dev/null
+++ b/openespi-datacustodian/src/main/resources/templates/about.html
@@ -0,0 +1,34 @@
+
+
+
+ About - Green Button Data Custodian
+
+
+
+
+
+
+
About
+
+ A reference implementation of the NAESB ESPI (Green Button) Data Custodian, maintained by the
+ Green Button Alliance.
+
From 041adfc4481a91dd1530fff05b429de5e3b5784e Mon Sep 17 00:00:00 2001
From: "Donald F. Coffin"
Date: Sun, 7 Jun 2026 19:21:32 -0400
Subject: [PATCH 3/5] fix(#175): fix logout dropdown (Bootstrap JS) + allow
creating admins
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- Logout dropdown was dead on the new portal pages: Bootstrap's JS was only
loaded ad-hoc at the bottom of some templates, not on the pages that include
just the head/footer fragments. Load the Bootstrap bundle once (deferred) in
the head fragment so every page has working dropdown/collapse, and remove the
now-duplicate bottom