From 42a7fe212f62e16ccfa0c1f23ff540125e8cef31 Mon Sep 17 00:00:00 2001 From: DanBpx Date: Thu, 28 Aug 2025 10:09:49 +0300 Subject: [PATCH 1/4] docs enforcement workflow support --- .github/workflows/docs_enforcement.yml | 57 ++++++++++++++++++++++++++ CHANGELOG.md | 4 ++ 2 files changed, 61 insertions(+) create mode 100644 .github/workflows/docs_enforcement.yml diff --git a/.github/workflows/docs_enforcement.yml b/.github/workflows/docs_enforcement.yml new file mode 100644 index 00000000..213c85c7 --- /dev/null +++ b/.github/workflows/docs_enforcement.yml @@ -0,0 +1,57 @@ +name: Documentation Enforcement + +env: + PLATFORM: java-sdk + +on: + pull_request: + branches: + - 'master' + +jobs: + extract_version: + runs-on: ubuntu-latest + name: Extract release version + outputs: + version: ${{ steps.version.outputs.value }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Get package version + id: version + run: echo "value=$(node -p -e "require('./px_metadata.json').version")" >> "$GITHUB_OUTPUT" + + check_open_docs_pr: + runs-on: ubuntu-latest + name: Check for Open Docs PR + needs: extract_version + steps: + - name: Construct expected branch name + id: branch_details + run: | + VERSION=${{ needs.extract_version.outputs.version }} + BRANCH_NAME="${{ env.PLATFORM }}-${VERSION}-doc-update" + echo "Expected branch name is: $BRANCH_NAME" + echo "branch_name=$BRANCH_NAME" >> "$GITHUB_OUTPUT" + + - name: Check for open PR from docs branch + env: + GH_TOKEN: ${{ secrets.CONNECT_PULL_TOKEN }} + DOCS_REPO: ${{ github.repository_owner }}/public-docs + EXPECTED_BRANCH_NAME: ${{ steps.branch_details.outputs.branch_name }} + run: | + echo "Searching for an open PR from branch '$EXPECTED_BRANCH_NAME' in repo '$DOCS_REPO'..." + + if gh pr list --repo "$DOCS_REPO" --state open --base main --limit 100 --json headRefName --jq '.[].headRefName' | grep -qFx "$EXPECTED_BRANCH_NAME"; then + echo "✅ Success! Found an open PR from branch: '$EXPECTED_BRANCH_NAME'" + else + echo "❌ Failure! Could not find an open PR in '$DOCS_REPO' from a branch with the exact name: '$EXPECTED_BRANCH_NAME'" + echo "Please ensure a documentation PR has been opened against the 'main' branch before merging this release." + exit 1 + fi \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b502004..12ff21a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## [X.X.X] (YYYY-MM-DD) + +- Added Documentation enforcement workflow - verify that the documentation is up to date with the latest changes in the codebase + ## [v6.14.2](https://github.com/PerimeterX/perimeterx-java-sdk/compare/6.14.2...HEAD) (2025-06-15) - Added Cross Tab Session cookie support on risk_api and async activities From 744d3a236f6a225a118ccfec488f3587e56c645a Mon Sep 17 00:00:00 2001 From: DanBpx Date: Wed, 3 Sep 2025 14:20:23 +0300 Subject: [PATCH 2/4] telemetry by risk feature support --- CHANGELOG.md | 1 + src/main/java/com/perimeterx/api/PerimeterX.java | 9 +++++++++ .../com/perimeterx/http/mock/MockPXClientFactory.java | 4 ++-- .../java/com/perimeterx/internals/PXS2SValidator.java | 3 +++ src/main/java/com/perimeterx/models/PXContext.java | 1 + .../com/perimeterx/models/httpmodels/RiskResponse.java | 3 +++ src/test/java/testutils/PXClientMock.java | 2 +- 7 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12ff21a6..57af3d8e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [X.X.X] (YYYY-MM-DD) - Added Documentation enforcement workflow - verify that the documentation is up to date with the latest changes in the codebase +- Added Telemetry by Risk support ## [v6.14.2](https://github.com/PerimeterX/perimeterx-java-sdk/compare/6.14.2...HEAD) (2025-06-15) - Added Cross Tab Session cookie support on risk_api and async activities diff --git a/src/main/java/com/perimeterx/api/PerimeterX.java b/src/main/java/com/perimeterx/api/PerimeterX.java index 5409ab0e..a2587b93 100644 --- a/src/main/java/com/perimeterx/api/PerimeterX.java +++ b/src/main/java/com/perimeterx/api/PerimeterX.java @@ -266,6 +266,15 @@ public void pxPostVerify(ResponseWrapper response, PXContext context) throws PXE if (response != null && !configuration.isAdditionalS2SActivityHeaderEnabled() && context.isContainCredentialsIntelligence()) { handleAdditionalS2SActivityWithCI(response, context); } + + if (context.isShouldSendTelemetry()) { + try { + activityHandler.handleEnforcerTelemetryActivity(this.configuration, UpdateReason.COMMAND, context); + } catch (Exception e) { + context.logger.error("Failed to send telemetry activity: " + e.getMessage()); + } + } + context.logger.sendMemoryLogs(this.configuration, context); } } catch (Exception e) { diff --git a/src/main/java/com/perimeterx/http/mock/MockPXClientFactory.java b/src/main/java/com/perimeterx/http/mock/MockPXClientFactory.java index f6863636..5b61a3c4 100644 --- a/src/main/java/com/perimeterx/http/mock/MockPXClientFactory.java +++ b/src/main/java/com/perimeterx/http/mock/MockPXClientFactory.java @@ -9,13 +9,13 @@ private MockPXClientFactory() { public static PXClient createPassAllPXClient() { return MockPXClient.builder() - .riskResponse(new RiskResponse("uuid", 0, 0, "c", null, null, "", "", "", "")) + .riskResponse(new RiskResponse("uuid", 0, 0, "c", null, null, "", "", "", "", null)) .build(); } public static PXClient createBlockAllPXClient() { return MockPXClient.builder() - .riskResponse(new RiskResponse("uuid", 0, 100, "c", null, null, "", "", "", "")) + .riskResponse(new RiskResponse("uuid", 0, 100, "c", null, null, "", "", "", "", null)) .build(); } } diff --git a/src/main/java/com/perimeterx/internals/PXS2SValidator.java b/src/main/java/com/perimeterx/internals/PXS2SValidator.java index 95ce5d8c..967c0a10 100644 --- a/src/main/java/com/perimeterx/internals/PXS2SValidator.java +++ b/src/main/java/com/perimeterx/internals/PXS2SValidator.java @@ -113,6 +113,9 @@ private void updateContextFromResponse(PXContext pxContext, RiskResponse respons if (response.getAdditionalRiskInfo() != null) { pxContext.setAdditionalRiskInfo(response.getAdditionalRiskInfo()); } + if (response.getTelemetryRequested() != null && response.getTelemetryRequested()) { + pxContext.setShouldSendTelemetry(true); + } } private boolean isResponseValid(RiskResponse response) { diff --git a/src/main/java/com/perimeterx/models/PXContext.java b/src/main/java/com/perimeterx/models/PXContext.java index f8c8cc41..68d30304 100644 --- a/src/main/java/com/perimeterx/models/PXContext.java +++ b/src/main/java/com/perimeterx/models/PXContext.java @@ -222,6 +222,7 @@ public class PXContext { private String pxhd; private PXHDSource pxhdSource; private boolean isMonitoredRequest; + private boolean shouldSendTelemetry = false; private LoginData loginData; private UUID requestId; private Set sensitiveHeaders; diff --git a/src/main/java/com/perimeterx/models/httpmodels/RiskResponse.java b/src/main/java/com/perimeterx/models/httpmodels/RiskResponse.java index 2bee458a..a26ec5f8 100644 --- a/src/main/java/com/perimeterx/models/httpmodels/RiskResponse.java +++ b/src/main/java/com/perimeterx/models/httpmodels/RiskResponse.java @@ -36,6 +36,9 @@ public class RiskResponse { @JsonProperty("additional_risk_info") private String additionalRiskInfo; + @JsonProperty("telemetry_requested") + private Boolean telemetryRequested; + @JsonCreator public RiskResponse(@JsonProperty(value = "uuid", required = true) String uuid) { this.uuid = uuid; diff --git a/src/test/java/testutils/PXClientMock.java b/src/test/java/testutils/PXClientMock.java index 6b76801d..b7e17a83 100644 --- a/src/test/java/testutils/PXClientMock.java +++ b/src/test/java/testutils/PXClientMock.java @@ -51,7 +51,7 @@ public RiskResponse riskApiCall(PXContext pxContext) { ObjectMapper mapper = new ObjectMapper(); ObjectNode dataEnrichment = mapper.createObjectNode(); dataEnrichment.put("cookieMonster", "ilai"); - RiskResponse riskResponse = new RiskResponse("uuid", 0, this.score, "c", null, dataEnrichment, "", "", "", ""); + RiskResponse riskResponse = new RiskResponse("uuid", 0, this.score, "c", null, dataEnrichment, "", "", "", "", null); if (forceChallenge) { riskResponse.setAction("j"); riskResponse.setActionData(new RiskResponseBody()); From 670b77e57f074541bb4d4e9f13275d0fe4701450 Mon Sep 17 00:00:00 2001 From: DanBpx Date: Wed, 3 Sep 2025 15:52:41 +0300 Subject: [PATCH 3/4] PR changes --- .../java/com/perimeterx/api/PerimeterX.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/perimeterx/api/PerimeterX.java b/src/main/java/com/perimeterx/api/PerimeterX.java index a2587b93..22a92084 100644 --- a/src/main/java/com/perimeterx/api/PerimeterX.java +++ b/src/main/java/com/perimeterx/api/PerimeterX.java @@ -267,19 +267,20 @@ public void pxPostVerify(ResponseWrapper response, PXContext context) throws PXE handleAdditionalS2SActivityWithCI(response, context); } - if (context.isShouldSendTelemetry()) { - try { - activityHandler.handleEnforcerTelemetryActivity(this.configuration, UpdateReason.COMMAND, context); - } catch (Exception e) { - context.logger.error("Failed to send telemetry activity: " + e.getMessage()); - } - } - context.logger.sendMemoryLogs(this.configuration, context); } } catch (Exception e) { context.logger.error("Failed to post verify response. Error :: ", e.getMessage()); } + + // Handle telemetry separately with more specific error handling + if (context != null && context.isShouldSendTelemetry()) { + try { + activityHandler.handleEnforcerTelemetryActivity(this.configuration, UpdateReason.COMMAND, context); + } catch (Exception e) { + context.logger.error("Failed to send telemetry activity: " + e.getMessage()); + } + } } private void handleAdditionalS2SActivityWithCI(ResponseWrapper response, PXContext context) throws PXException { From fc3a8914addfc0463208930226f0ceb302330ecb Mon Sep 17 00:00:00 2001 From: DanBpx Date: Wed, 3 Sep 2025 18:00:39 +0300 Subject: [PATCH 4/4] release v6.15.0 --- CHANGELOG.md | 3 +-- README.md | 2 +- pom.xml | 2 +- px_metadata.json | 2 +- web/pom.xml | 2 +- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57af3d8e..8d702f34 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,6 @@ # Change Log -## [X.X.X] (YYYY-MM-DD) - +## [v6.15.0](https://github.com/PerimeterX/perimeterx-java-sdk/compare/6.15.0...HEAD) (2025-09-03) - Added Documentation enforcement workflow - verify that the documentation is up to date with the latest changes in the codebase - Added Telemetry by Risk support diff --git a/README.md b/README.md index edd35c1e..431e3c02 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # [PerimeterX](http://www.perimeterx.com) Java SDK -> Latest stable version: [v6.14.2](https://search.maven.org/#artifactdetails%7Ccom.perimeterx%7Cperimeterx-sdk%7C6.15.0%7Cjar) +> Latest stable version: [v6.15.0](https://search.maven.org/#artifactdetails%7Ccom.perimeterx%7Cperimeterx-sdk%7C6.15.0%7Cjar) ## Table of Contents diff --git a/pom.xml b/pom.xml index 8cfc7cd6..1df8cf3a 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ PerimeterX JAVA SDK com.perimeterx perimeterx-sdk - 6.14.2 + 6.15.0 jar PerimeterX Java SDK diff --git a/px_metadata.json b/px_metadata.json index 62d6972b..6b821421 100644 --- a/px_metadata.json +++ b/px_metadata.json @@ -1,5 +1,5 @@ { - "version": "6.14.2", + "version": "6.15.0", "supported_features": [ "advanced_blocking_response", "bypass_monitor_header", diff --git a/web/pom.xml b/web/pom.xml index 0a228be3..f064b74d 100644 --- a/web/pom.xml +++ b/web/pom.xml @@ -65,7 +65,7 @@ 8 8 - 6.14.2 + 6.15.0