This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 55f2405e20 Fixed: AdminServer no longer starts without a configured 
admin key
55f2405e20 is described below

commit 55f2405e20b9bf7ced317b3ab0fe80e4bf4b59eb
Author: Mridul Pathak <[email protected]>
AuthorDate: Mon Sep 21 18:29:11 2026 +0530

    Fixed: AdminServer no longer starts without a configured admin key
    
    The AdminServer socket container previously used a fixed default value for 
ofbiz.admin.key shipped in start.properties. It now stays disabled (the 
existing no-op path already used when the port is unset) until an operator 
configures a real key. The generateSecretKeys Gradle task now also provisions a 
random ofbiz.admin.key alongside the existing JWT and password secret keys, so 
./gradlew loadAll and the Docker image build continue to get a working, unique 
key with no extra steps.
---
 build.gradle                                       | 15 ++++++-----
 .../ofbiz/base/container/AdminServerContainer.java | 29 +++++++++++++++-------
 .../org/apache/ofbiz/base/start/start.properties   |  4 ++-
 3 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/build.gradle b/build.gradle
index ba847603e9..95f7a522da 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1166,11 +1166,10 @@ task reEncryptAllSecrets(group: sysadminGroup,
 }
 
 task generateSecretKeys(group: sysadminGroup,
-        description: 'Generate cryptographically secure 512-bit (64-char) 
secret keys for JWT token signing and password encryption, and write them to 
security.properties') {
+        description: 'Generate cryptographically secure secret keys for JWT 
token signing, password encryption, '
+                + 'and AdminServer authentication, and write them to their 
properties files') {
     doLast {
-        def propertiesFile = 
file('framework/security/config/security.properties')
-
-        def generateAndWriteKey = { String propertyName ->
+        def generateAndWriteKey = { File propertiesFile, String propertyName ->
             def content = propertiesFile.text
             def escapedName = propertyName.replace('.', '\\.')
             // Only generate a key if the property is missing or commented out
@@ -1189,8 +1188,12 @@ task generateSecretKeys(group: sysadminGroup,
             propertiesFile.text = content
         }
 
-        generateAndWriteKey('login.secret_key_string')
-        generateAndWriteKey('security.token.key')
+        def securityPropertiesFile = 
file('framework/security/config/security.properties')
+        generateAndWriteKey(securityPropertiesFile, 'login.secret_key_string')
+        generateAndWriteKey(securityPropertiesFile, 'security.token.key')
+
+        def startPropertiesFile = 
file('framework/start/src/main/resources/org/apache/ofbiz/base/start/start.properties')
+        generateAndWriteKey(startPropertiesFile, 'ofbiz.admin.key')
 
         println "Secret key generation complete. Keep any new keys secret and 
do not commit them to version control."
     }
diff --git 
a/framework/base/src/main/java/org/apache/ofbiz/base/container/AdminServerContainer.java
 
b/framework/base/src/main/java/org/apache/ofbiz/base/container/AdminServerContainer.java
index 3e1bf0c24d..f775a9bfed 100644
--- 
a/framework/base/src/main/java/org/apache/ofbiz/base/container/AdminServerContainer.java
+++ 
b/framework/base/src/main/java/org/apache/ofbiz/base/container/AdminServerContainer.java
@@ -55,22 +55,33 @@ public final class AdminServerContainer implements 
Container {
     @Override
     public void init(List<StartupCommand> ofbizCommands, String name, String 
configFile) throws ContainerException {
         this.name = name;
-        try {
-            serverSocket = new ServerSocket(cfg.getAdminPort(), 1, 
cfg.getAdminAddress());
-        } catch (IOException e) {
-            String msg = "Couldn't create server socket(" + 
cfg.getAdminAddress() + ":" + cfg.getAdminPort() + ")";
-            throw new ContainerException(msg, e);
-        }
-
-        if (cfg.getAdminPort() > 0) {
+        if (cfg.getAdminPort() > 0 && isAdminKeyConfigured()) {
+            try {
+                serverSocket = new ServerSocket(cfg.getAdminPort(), 1, 
cfg.getAdminAddress());
+            } catch (IOException e) {
+                String msg = "Couldn't create server socket(" + 
cfg.getAdminAddress() + ":" + cfg.getAdminPort() + ")";
+                throw new ContainerException(msg, e);
+            }
             serverThread = new Thread(this::run, "OFBiz-AdminServer");
         } else {
             serverThread = new Thread("OFBiz-AdminServer"); // Dummy thread
-            System.out.println("Admin socket not configured; set to port 0");
+            if (cfg.getAdminPort() > 0) {
+                System.out.println("Admin socket disabled; ofbiz.admin.key is 
not configured. Run "
+                        + "'./gradlew generateSecretKeys' or set 
ofbiz.admin.key to a unique secret to enable it.");
+            } else {
+                System.out.println("Admin socket not configured; set to port 
0");
+            }
         }
         serverThread.setDaemon(false);
     }
 
+    // The AdminServer must never come up authenticated by a value shipped in 
public source code:
+    // treat a missing/blank key, or the Config default sentinel, as "not 
configured".
+    private boolean isAdminKeyConfigured() {
+        String adminKey = cfg.getAdminKey();
+        return UtilValidate.isNotEmpty(adminKey) && !"NA".equals(adminKey);
+    }
+
     // Listens for administration commands.
     private void run() {
         System.out.println("Admin socket configured on - " + 
cfg.getAdminAddress() + ":" + cfg.getAdminPort());
diff --git 
a/framework/start/src/main/resources/org/apache/ofbiz/base/start/start.properties
 
b/framework/start/src/main/resources/org/apache/ofbiz/base/start/start.properties
index 7cc6194809..47ba3c06ee 100644
--- 
a/framework/start/src/main/resources/org/apache/ofbiz/base/start/start.properties
+++ 
b/framework/start/src/main/resources/org/apache/ofbiz/base/start/start.properties
@@ -39,9 +39,11 @@ ofbiz.start.loaders=main
 #     Default ofbiz.admin.host 127.0.0.1
 #     Default ofbiz.admin.port 0
 #     Default ofbiz.admin.key NA
+#     The admin socket stays disabled until ofbiz.admin.key is set to a unique 
secret.
+#     Run './gradlew generateSecretKeys' to generate one, or set it manually.
 #ofbiz.admin.host=
 ofbiz.admin.port=10523
-ofbiz.admin.key=so3du5kasd5dn
+ofbiz.admin.key=
 
 # -- Enable the JVM shutdown hook. Default is true
 #ofbiz.enable.hook=false

Reply via email to