mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

12 files modified
190 ■■■■■ changed files
.github/workflows/build.yml 31 ●●●● patch | view | raw | blame | history
.github/workflows/deploy.yml 30 ●●●● patch | view | raw | blame | history
.github/workflows/release.yml 38 ●●●● patch | view | raw | blame | history
opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java 8 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/lib/launcher_administrator.exe patch | view | raw | blame | history
opendj-server-legacy/lib/opendj_service.exe patch | view | raw | blame | history
opendj-server-legacy/lib/winlauncher.exe patch | view | raw | blame | history
opendj-server-legacy/src/build-tools/windows/service.c 45 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/main/java/org/opends/server/core/LoggerConfigManager.java 8 ●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java 2 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/src/test/java/org/opends/server/replication/GenerationIdTest.java 22 ●●●●● patch | view | raw | blame | history
opendj-server-legacy/tests/unit-tests-testng/resource/config-changes.ldif 6 ●●●●● patch | view | raw | blame | history
.github/workflows/build.yml
@@ -4,7 +4,6 @@
  push:
    branches: [ 'sustaining/4.10.x','master' ]
  pull_request:
    branches: [ 'sustaining/4.10.x','master' ]
jobs:
  build-maven:
@@ -28,17 +27,17 @@
        wine --version
        version="9.4.0"; sudo wget "https://dl.winehq.org/wine/wine-mono/$version/wine-mono-$version-x86.msi" -O /tmp/wine-mono.msi
        wine msiexec /i /tmp/wine-mono.msi
    - uses: actions/checkout@v4
    - uses: actions/checkout@v6
      with:
        fetch-depth: 0
        submodules: recursive
    - name: Java ${{ matrix.Java }} (${{ matrix.os }})
      uses: actions/setup-java@v4
      uses: actions/setup-java@v5
      with:
        java-version: ${{ matrix.java }}
        distribution: 'zulu'
    - name: Cache Maven packages
      uses: actions/cache@v4
      uses: actions/cache@v5
      with:
         path: ~/.m2/repository
         key: ${{ runner.os }}-m2-repository-${{ hashFiles('**/pom.xml') }}
@@ -254,14 +253,14 @@
    - name: Upload Windows exe artifacts
      if: runner.os == 'Windows'
      uses: actions/upload-artifact@v4
      uses: actions/upload-artifact@v7
      with:
        name: windows-exe-${{ matrix.java }}
        retention-days: 5
        path: opendj-server-legacy/src/build-tools/windows/*.exe
    - name: Upload artifacts OpenDJ Server
      uses: actions/upload-artifact@v4
      uses: actions/upload-artifact@v7
      with:
        name: ${{ matrix.os }}-${{ matrix.java }}
        retention-days: 5
@@ -286,7 +285,7 @@
          - 5000:5000
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        uses: actions/download-artifact@v8
        with:
          name: ubuntu-latest-11
      - name: Get latest release version
@@ -296,16 +295,16 @@
          echo "release_version=$git_version_last" >> $GITHUB_ENV
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        uses: docker/metadata-action@v6
        with:
          images: |
            localhost:5000/${{ github.repository }}
          tags: |
            type=raw,value=${{ env.release_version }}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        uses: docker/setup-buildx-action@v4
        with:
          driver-opts: network=host
      - name: Prepare Dockerfile
@@ -315,7 +314,7 @@
          cp ./opendj-server-legacy/target/package/opendj-*.zip ./opendj-packages/opendj-docker
          sed -i -E '/^#COPY opendj/s/^#//' ./opendj-packages/opendj-docker/Dockerfile
      - name: Build image (default)
        uses: docker/build-push-action@v5
        uses: docker/build-push-action@v7
        with:
          context: ./opendj-packages/opendj-docker
          file: ./opendj-packages/opendj-docker/Dockerfile
@@ -350,7 +349,7 @@
          - 5000:5000
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        uses: actions/download-artifact@v8
        with:
          name: ubuntu-latest-11
      - name: Get latest release version
@@ -360,7 +359,7 @@
          echo "release_version=$git_version_last" >> $GITHUB_ENV
      - name: Docker meta 
        id: meta
        uses: docker/metadata-action@v5
        uses: docker/metadata-action@v6
        with:
          images: |
            localhost:5000/${{ github.repository }}
@@ -368,9 +367,9 @@
            type=raw,value=alpine
            type=raw,value=${{ env.release_version }}-alpine
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        uses: docker/setup-buildx-action@v4
        with:
          driver-opts: network=host
      - name: Prepare Dockerfile
@@ -380,7 +379,7 @@
          cp ./opendj-server-legacy/target/package/opendj-*.zip ./opendj-packages/opendj-docker
          sed -i -E '/^#COPY opendj/s/^#//' ./opendj-packages/opendj-docker/Dockerfile-alpine
      - name: Build image
        uses: docker/build-push-action@v5
        uses: docker/build-push-action@v7
        with:
          context: ./opendj-packages/opendj-docker
          file: ./opendj-packages/opendj-docker/Dockerfile-alpine
.github/workflows/deploy.yml
@@ -27,13 +27,13 @@
          wine --version
          version="9.4.0"; sudo wget "https://dl.winehq.org/wine/wine-mono/$version/wine-mono-$version-x86.msi" -O /tmp/wine-mono.msi
          wine msiexec /i /tmp/wine-mono.msi
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: recursive
          ref: ${{ github.event.workflow_run.head_branch }}
      - name: Set up Java for publishing to Maven Central Repository OSS
        uses: actions/setup-java@v4
        uses: actions/setup-java@v5
        with:
          java-version: ${{ github.event.workflow_run.head_branch == 'sustaining/4.10.x' && '8' || '11'}}
          distribution: 'temurin'
@@ -41,7 +41,7 @@
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Cache Maven packages
        uses: actions/cache@v4
        uses: actions/cache@v5
        with:
         path: ~/.m2/repository
         key: ${{ runner.os }}-m2-repository-${{ hashFiles('**/pom.xml') }}
@@ -71,52 +71,52 @@
        continue-on-error: true
        run: mvn javadoc:aggregate
      - name: Upload artifacts OpenDJ Server
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Server
         path: opendj-server-legacy/target/package/*.zip
      - name: Upload artifacts OpenDJ SDK Toolkit
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ SDK Toolkit
         path: opendj-ldap-toolkit/target/*.zip
      - name: Upload artifacts OpenDJ Debian Package
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Debian Package
         path: opendj-packages/opendj-deb/opendj-deb-standard/target/*.deb
      - name: Upload artifacts OpenDJ RPM Package
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ RPM Package
         path: opendj-packages/opendj-rpm/opendj-rpm-standard/target/rpm/opendj/RPMS/noarch/*.rpm
      - name: Upload artifacts OpenDJ MSI Package
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ MSI Package
         path: opendj-packages/opendj-msi/opendj-msi-standard/target/*.msi
      - name: Upload artifacts OpenDJ Docker Packages
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Docker Packages
         path: opendj-packages/opendj-docker/target/Dockerfile.zip
      - name: Upload artifacts OpenDJ Openshift template
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Openshift template
         path: opendj-packages/opendj-openshift-template/*.yaml
      - name: Upload artifacts OpenDJ Doc Generated Reference
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Doc Generated References
         path: opendj-doc-generated-ref/target/*.zip
      - name: Upload artifacts OpenDJ DSML Gateway
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ DSML Gateway
         path: opendj-dsml-servlet/target/*.war
      - name: Upload artifacts OpenDJ Commons REST LDAP Gateway
        uses: actions/upload-artifact@v4
        uses: actions/upload-artifact@v7
        with:
         name: OpenDJ Commons REST LDAP Gateway
         path: opendj-rest2ldap-servlet/target/*.war
@@ -125,7 +125,7 @@
          git config --global user.name "Open Identity Platform Community"
          git config --global user.email "open-identity-platform-opendj@googlegroups.com"
          cd ..
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        continue-on-error: true
        with:
          repository: ${{ github.repository }}.wiki
@@ -145,7 +145,7 @@
          git commit -a -m "upload docs after deploy ${{ github.sha }}"
          git push --quiet --force
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        continue-on-error: true
        with:
          repository: OpenIdentityPlatform/doc.openidentityplatform.org
.github/workflows/release.yml
@@ -31,12 +31,12 @@
          wine --version
          version="9.4.0"; sudo wget "https://dl.winehq.org/wine/wine-mono/$version/wine-mono-$version-x86.msi" -O /tmp/wine-mono.msi
          wine msiexec /i /tmp/wine-mono.msi
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0
          submodules: recursive
      - name: Set up Java for publishing to Maven Central Repository OSS
        uses: actions/setup-java@v4
        uses: actions/setup-java@v5
        with:
          java-version: ${{ github.event.workflow_run.head_branch == 'sustaining/4.10.x' && '8' || '11'}}
          distribution: 'temurin'
@@ -44,7 +44,7 @@
          server-username: MAVEN_USERNAME
          server-password: MAVEN_PASSWORD
      - name: Cache Maven packages
        uses: actions/cache@v4
        uses: actions/cache@v5
        with:
         path: ~/.m2/repository
         key: ${{ runner.os }}-m2-repository-${{ hashFiles('**/pom.xml') }}
@@ -90,7 +90,7 @@
            target/checkout/opendj-doc-generated-ref/target/*.zip
            target/checkout/opendj-dsml-servlet/target/*.war
            target/checkout/opendj-rest2ldap-servlet/target/*.war
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        continue-on-error: true
        with:
          repository: ${{ github.repository }}.wiki
@@ -113,7 +113,7 @@
           git push --quiet --force
           git push --quiet --force origin ${{ github.event.inputs.releaseVersion }}
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        continue-on-error: true
        with:
          repository: OpenIdentityPlatform/doc.openidentityplatform.org
@@ -136,14 +136,14 @@
    needs:
      - release-maven
    steps:
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        with:
          ref: ${{ github.event.inputs.releaseVersion }}
          fetch-depth: 1
          submodules: recursive
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        uses: docker/metadata-action@v6
        with:
          images: |
            ${{ github.repository }}
@@ -152,22 +152,22 @@
            type=raw,value=latest
            type=raw,value=${{ github.event.inputs.releaseVersion }}
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        uses: docker/setup-buildx-action@v4
      - name: Login to DockerHub
        uses: docker/login-action@v3
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Login to GHCR
        uses: docker/login-action@v3
        uses: docker/login-action@v4
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push image
        uses: docker/build-push-action@v5
        uses: docker/build-push-action@v7
        continue-on-error: true
        with:
          context: ./opendj-packages/opendj-docker
@@ -184,14 +184,14 @@
    needs:
      - release-maven
    steps:
      - uses: actions/checkout@v4
      - uses: actions/checkout@v6
        with:
          ref: ${{ github.event.inputs.releaseVersion }}
          fetch-depth: 1
          submodules: recursive
      - name: Docker meta
        id: meta
        uses: docker/metadata-action@v5
        uses: docker/metadata-action@v6
        with:
          images: |
            ${{ github.repository }}
@@ -200,23 +200,23 @@
            type=raw,value=alpine
            type=raw,value=${{ github.event.inputs.releaseVersion }}-alpine
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        uses: docker/setup-qemu-action@v4
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
        uses: docker/setup-buildx-action@v4
      - name: Login to DockerHub
        uses: docker/login-action@v3
        uses: docker/login-action@v4
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - name: Login to GHCR
        uses: docker/login-action@v3
        uses: docker/login-action@v4
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push image
        continue-on-error: true
        uses: docker/build-push-action@v5
        uses: docker/build-push-action@v7
        with:
          context: ./opendj-packages/opendj-docker
          file: ./opendj-packages/opendj-docker/Dockerfile-alpine
opendj-core/src/main/java/org/forgerock/opendj/ldap/spi/LdapMessages.java
@@ -12,6 +12,7 @@
 * information: "Portions Copyright [year] [name of copyright owner]".
 *
 * Copyright 2016 ForgeRock AS.
 * Portions Copyright 2026 3A Systems, LLC.
 */
package org.forgerock.opendj.ldap.spi;
@@ -106,6 +107,13 @@
        private LdapResponseMessage(final byte messageType, final int messageId, final Response content) {
            super(messageType, messageId, content);
        }
        @Override
        public String toString() {
            return "LdapResponseMessage(messageType=" + getMessageType()
                    + ", messageId=" + getMessageId()
                    + ", content=" + getContent() + ")";
        }
    }
    private static abstract class LdapMessageEnvelope<T> {
opendj-server-legacy/lib/launcher_administrator.exe
Binary files differ
opendj-server-legacy/lib/opendj_service.exe
Binary files differ
opendj-server-legacy/lib/winlauncher.exe
Binary files differ
opendj-server-legacy/src/build-tools/windows/service.c
@@ -13,6 +13,7 @@
 *
 * Copyright 2008-2010 Sun Microsystems, Inc.
 * Portions Copyright 2011-2013 ForgeRock AS.
 * Portions Copyright 2026 3A Systems, LLC.
 */
#include "service.h"
@@ -563,12 +564,44 @@
  if (createOk && waitOk)
    {
    BOOL running;
      // Just check once if the server is running or not: since the wait
      // wait was successful, if the server is getting the lock, it already
      // got it.
    isServerRunning(&running, TRUE);
    if (running)
      // The batch file process completed successfully, but the Java server
      // process may not have acquired the lock file yet (especially on
      // Windows 11 where JVM startup can be slower). Retry with a loop
      // similar to the else-if branch below.
      // See: https://github.com/OpenIdentityPlatform/OpenDJ/issues/259
      const DWORD DEFAULT_TRIES = 100;
      int nTries = DEFAULT_TRIES;
      char * nTriesEnv = getenv("OPENDJ_WINDOWS_SERVICE_START_NTRIES");
      BOOL running = FALSE;
      if (nTriesEnv != NULL)
      {
        debug("OPENDJ_WINDOWS_SERVICE_START_NTRIES env var set to %s", nTriesEnv);
        nTries = (int)strtol(nTriesEnv, (char **)NULL, 10);
        if (nTries <= 0)
        {
          nTries = DEFAULT_TRIES;
        }
      }
      else
      {
        debug("OPENDJ_WINDOWS_SERVICE_START_NTRIES is not set.  Using default %d tries.", nTries);
      }
      while ((nTries > 0) && !running)
      {
        nTries--;
        if (isServerRunning(&running, TRUE) != SERVICE_RETURN_OK)
        {
          break;
        }
        if (!running)
        {
          debug("Sleeping for 5 seconds to allow the process to get the lock.  %d tries remaining.",
              nTries);
          Sleep(5000);
        }
      }
      if (running)
      {
        returnValue = SERVICE_RETURN_OK;
        debug("doStartApplication: server running.");
opendj-server-legacy/src/main/java/org/opends/server/core/LoggerConfigManager.java
@@ -13,6 +13,7 @@
 *
 * Copyright 2006-2008 Sun Microsystems, Inc.
 * Portions Copyright 2013-2016 ForgeRock AS.
 * Portions Copyright 2026 3A Systems, LLC.
 */
package org.opends.server.core;
@@ -109,8 +110,13 @@
      {
        SLF4JBridgeHandler.removeHandlersForRootLogger();
        // This is needed to avoid major performance issue. See: http://www.slf4j.org/legacy.html#jul-to-slf4j
        // Limit Grizzly JUL logging to FINE to prevent a ClassCastException in
        // FilterChainContext.toString() (Grizzly bug) when debug logging is enabled.
        // Grizzly 3.0.1 DefaultFilterChain.executeFilter() checks isLoggable(FINEST) but
        // its FilterChainContext.toString() incorrectly casts the message to char[].
        LogManager.getLogManager().readConfiguration(
                new ByteArrayInputStream((".level=" + newLevel).getBytes()));
                new ByteArrayInputStream(
                        (".level=" + newLevel + "\norg.glassfish.grizzly.level=FINE").getBytes()));
        SLF4JBridgeHandler.install();
        currentJulLogLevel = newLevel;
      }
opendj-server-legacy/src/test/java/org/opends/server/backends/ChangelogBackendTestCase.java
@@ -590,6 +590,8 @@
    // write 4 more changes starting from changenumber 5, and search them
    testName = "Multiple/5";
    csns = generateAndPublishUpdateMsgForEachOperationType(testName, false);
    // Wait until all 8 changes are indexed before searching
    assertChangelogAttributesInRootDSE(1, 8);
    searchChangesForEachOperationTypeUsingChangeNumberMode(5, csns, testName);
    // search from the provided change number: 6 (should be the add msg)
opendj-server-legacy/src/test/java/org/opends/server/replication/GenerationIdTest.java
@@ -921,7 +921,7 @@
      replServer3 = createReplicationServer(replServerId3, true, testCase);
      connectServer1ToReplServer(replServer1);
      Thread.sleep(2000); //wait for all RS handshakes to complete
      waitForDomainsOnAllReplicationServers();
      debugInfo("Expect genId are set in all replServers.");
      waitForStableGenerationId(EMPTY_DN_GENID);
@@ -990,7 +990,7 @@
    }
  }
  private void waitForStableGenerationId(final long expectedGenId) throws Exception
  private void waitForDomainsOnAllReplicationServers() throws Exception
  {
    TestTimer timer = new TestTimer.Builder()
      .maxSleep(30, SECONDS)
@@ -1001,6 +1001,24 @@
      @Override
      public void call() throws Exception
      {
        assertNotNull(replServer1.getReplicationServerDomain(baseDN), "domain missing on replServer1");
        assertNotNull(replServer2.getReplicationServerDomain(baseDN), "domain missing on replServer2");
        assertNotNull(replServer3.getReplicationServerDomain(baseDN), "domain missing on replServer3");
      }
    });
  }
  private void waitForStableGenerationId(final long expectedGenId) throws Exception
  {
    TestTimer timer = new TestTimer.Builder()
      .maxSleep(60, SECONDS)
      .sleepTimes(100, MILLISECONDS)
      .toTimer();
    timer.repeatUntilSuccess(new CallableVoid()
    {
      @Override
      public void call() throws Exception
      {
        assertGenIdEquals(expectedGenId);
      }
    });
opendj-server-legacy/tests/unit-tests-testng/resource/config-changes.ldif
@@ -11,6 +11,7 @@
# information: "Portions Copyright [year] [name of copyright owner]".
#
# Copyright 2016 ForgeRock AS.
# Portions Copyright 2026 3A Systems LLC.
dn: cn=config
changetype: modify
replace: ds-cfg-notify-abandoned-operations
@@ -1610,3 +1611,8 @@
-
replace: ds-cfg-default-throwable-stack-frames
ds-cfg-default-throwable-stack-frames: 500
dn: cn=Multimaster Synchronization,cn=Synchronization Providers,cn=config
changetype: modify
replace: ds-cfg-connection-timeout
ds-cfg-connection-timeout: 30000 ms