From 9f30675794f5063b3603b24178a6643a974502cf Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Wed, 5 Aug 2026 07:23:51 +0000 Subject: [PATCH 1/9] Commit: 9d111af2 --- .openapi-generator/FILES | 1 + .../documentreader/webclient/gen/__init__.py | 3 + .../webclient/gen/models/__init__.py | 2 + .../webclient/gen/models/image_qa.py | 10 ++- .../gen/models/occlusion_check_params.py | 82 +++++++++++++++++++ 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 regula/documentreader/webclient/gen/models/occlusion_check_params.py diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index 7aa8e86..a508126 100755 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -143,6 +143,7 @@ regula/documentreader/webclient/gen/models/mrz_rows_item.py regula/documentreader/webclient/gen/models/mrz_test_quality.py regula/documentreader/webclient/gen/models/mrz_test_quality_item.py regula/documentreader/webclient/gen/models/mrz_test_quality_result.py +regula/documentreader/webclient/gen/models/occlusion_check_params.py regula/documentreader/webclient/gen/models/ocr_security_text_item.py regula/documentreader/webclient/gen/models/ocr_security_text_result.py regula/documentreader/webclient/gen/models/one_candidate.py diff --git a/regula/documentreader/webclient/gen/__init__.py b/regula/documentreader/webclient/gen/__init__.py index 1207645..79e348c 100644 --- a/regula/documentreader/webclient/gen/__init__.py +++ b/regula/documentreader/webclient/gen/__init__.py @@ -157,6 +157,7 @@ "MrzPositionItem", "OCRSecurityTextItem", "OCRSecurityTextResult", + "OcclusionCheckParams", "OneCandidate", "OneCandidateItem", "OriginalSymbol", @@ -429,6 +430,7 @@ from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem as MrzPositionItem from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem as OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult as OCRSecurityTextResult + from regula.documentreader.webclient.gen.models.occlusion_check_params import OcclusionCheckParams as OcclusionCheckParams from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate as OneCandidate from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem as OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol as OriginalSymbol @@ -707,6 +709,7 @@ from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem as MrzPositionItem from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem as OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult as OCRSecurityTextResult +from regula.documentreader.webclient.gen.models.occlusion_check_params import OcclusionCheckParams as OcclusionCheckParams from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate as OneCandidate from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem as OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol as OriginalSymbol diff --git a/regula/documentreader/webclient/gen/models/__init__.py b/regula/documentreader/webclient/gen/models/__init__.py index 5eb8b79..24019d9 100644 --- a/regula/documentreader/webclient/gen/models/__init__.py +++ b/regula/documentreader/webclient/gen/models/__init__.py @@ -141,6 +141,7 @@ from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult + from regula.documentreader.webclient.gen.models.occlusion_check_params import OcclusionCheckParams from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol @@ -400,6 +401,7 @@ from regula.documentreader.webclient.gen.models.mrz_position_item import MrzPositionItem from regula.documentreader.webclient.gen.models.ocr_security_text_item import OCRSecurityTextItem from regula.documentreader.webclient.gen.models.ocr_security_text_result import OCRSecurityTextResult +from regula.documentreader.webclient.gen.models.occlusion_check_params import OcclusionCheckParams from regula.documentreader.webclient.gen.models.one_candidate import OneCandidate from regula.documentreader.webclient.gen.models.one_candidate_item import OneCandidateItem from regula.documentreader.webclient.gen.models.original_symbol import OriginalSymbol diff --git a/regula/documentreader/webclient/gen/models/image_qa.py b/regula/documentreader/webclient/gen/models/image_qa.py index a376892..f3946ce 100644 --- a/regula/documentreader/webclient/gen/models/image_qa.py +++ b/regula/documentreader/webclient/gen/models/image_qa.py @@ -13,6 +13,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Union from regula.documentreader.webclient.gen.models.glares_check_params import GlaresCheckParams from regula.documentreader.webclient.gen.models.input_image_quality_checks import InputImageQualityChecks +from regula.documentreader.webclient.gen.models.occlusion_check_params import OcclusionCheckParams from typing import Optional, Set from typing_extensions import Self from pydantic import SkipValidation, Field @@ -31,7 +32,8 @@ class ImageQA(BaseModel): document_position_indent: SkipValidation[Optional[int]] = Field(alias="documentPositionIndent", default=None, description="This parameter specifies the necessary margin. Default 0.") expected_pass: SkipValidation[Optional[List[InputImageQualityChecks]]] = Field(alias="expectedPass", default=None, description="This parameter controls the quality checks that the image should pass to be considered a valid input during the scanning process.") glares_check_params: SkipValidation[Optional[GlaresCheckParams]] = Field(alias="glaresCheckParams", default=None) - __properties: ClassVar[List[str]] = ["brightnessThreshold", "dpiThreshold", "angleThreshold", "focusCheck", "glaresCheck", "colornessCheck", "moireCheck", "documentPositionIndent", "expectedPass", "glaresCheckParams"] + occlusion_check_params: SkipValidation[Optional[OcclusionCheckParams]] = Field(alias="occlusionCheckParams", default=None) + __properties: ClassVar[List[str]] = ["brightnessThreshold", "dpiThreshold", "angleThreshold", "focusCheck", "glaresCheck", "colornessCheck", "moireCheck", "documentPositionIndent", "expectedPass", "glaresCheckParams", "occlusionCheckParams"] model_config = ConfigDict( populate_by_name=True, @@ -77,6 +79,9 @@ def to_dict(self) -> Dict[str, Any]: # override the default output from pydantic by calling `to_dict()` of glares_check_params if self.glares_check_params and isinstance(self.glares_check_params, GlaresCheckParams): _dict['glaresCheckParams'] = self.glares_check_params.to_dict() + # override the default output from pydantic by calling `to_dict()` of occlusion_check_params + if self.occlusion_check_params and isinstance(self.occlusion_check_params, OcclusionCheckParams): + _dict['occlusionCheckParams'] = self.occlusion_check_params.to_dict() return _dict @classmethod @@ -98,7 +103,8 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "moireCheck": obj.get("moireCheck"), "documentPositionIndent": obj.get("documentPositionIndent"), "expectedPass": obj.get("expectedPass"), - "glaresCheckParams": GlaresCheckParams.from_dict(obj["glaresCheckParams"]) if obj.get("glaresCheckParams") is not None else None + "glaresCheckParams": GlaresCheckParams.from_dict(obj["glaresCheckParams"]) if obj.get("glaresCheckParams") is not None else None, + "occlusionCheckParams": OcclusionCheckParams.from_dict(obj["occlusionCheckParams"]) if obj.get("occlusionCheckParams") is not None else None }) return _obj diff --git a/regula/documentreader/webclient/gen/models/occlusion_check_params.py b/regula/documentreader/webclient/gen/models/occlusion_check_params.py new file mode 100644 index 0000000..983165a --- /dev/null +++ b/regula/documentreader/webclient/gen/models/occlusion_check_params.py @@ -0,0 +1,82 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + +from pydantic import BaseModel, ConfigDict, Field, StrictFloat, StrictInt +from typing import Any, ClassVar, Dict, List, Optional, Union +from typing import Optional, Set +from typing_extensions import Self +from pydantic import SkipValidation, Field + +class OcclusionCheckParams(BaseModel): + """ + OcclusionCheckParams + """ # noqa: E501 + max_occlusion_part: SkipValidation[Optional[float]] = Field(alias="maxOcclusionPart", default=None, description="The maximum size for the occluded area of a document; only those exceeding this size will be validated") + __properties: ClassVar[List[str]] = ["maxOcclusionPart"] + + model_config = ConfigDict( + populate_by_name=True, + validate_assignment=True, + protected_namespaces=(), + arbitrary_types_allowed=True, + use_enum_values=True + ) + + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.model_dump(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> Optional[Self]: + """Create an instance of OcclusionCheckParams from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self) -> Dict[str, Any]: + """Return the dictionary representation of the model using alias. + + This has the following differences from calling pydantic's + `self.model_dump(by_alias=True)`: + + * `None` is only added to the output dict for nullable fields that + were set at model initialization. Other fields with value `None` + are ignored. + """ + excluded_fields: Set[str] = set([ + ]) + + _dict = self.model_dump( + by_alias=True, + exclude=excluded_fields, + exclude_none=True, + ) + return _dict + + @classmethod + def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: + """Create an instance of OcclusionCheckParams from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return cls.model_validate(obj) + + _obj = cls.model_validate({ + "maxOcclusionPart": obj.get("maxOcclusionPart") + }) + return _obj + + From eab3f522afae8dbcf58544824665a8d2e6e01d9c Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 7 Aug 2026 07:29:31 +0000 Subject: [PATCH 2/9] Commit: 514c757e --- regula/documentreader/webclient/gen/models/image_qa.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/regula/documentreader/webclient/gen/models/image_qa.py b/regula/documentreader/webclient/gen/models/image_qa.py index f3946ce..ea2c76d 100644 --- a/regula/documentreader/webclient/gen/models/image_qa.py +++ b/regula/documentreader/webclient/gen/models/image_qa.py @@ -32,8 +32,9 @@ class ImageQA(BaseModel): document_position_indent: SkipValidation[Optional[int]] = Field(alias="documentPositionIndent", default=None, description="This parameter specifies the necessary margin. Default 0.") expected_pass: SkipValidation[Optional[List[InputImageQualityChecks]]] = Field(alias="expectedPass", default=None, description="This parameter controls the quality checks that the image should pass to be considered a valid input during the scanning process.") glares_check_params: SkipValidation[Optional[GlaresCheckParams]] = Field(alias="glaresCheckParams", default=None) + occlusion_check: SkipValidation[Optional[bool]] = Field(alias="occlusionCheck", default=None, description="This option enables the occlusion detection to identify cases where parts of a document are covered by fingers, hands, or other objects during image capture.") occlusion_check_params: SkipValidation[Optional[OcclusionCheckParams]] = Field(alias="occlusionCheckParams", default=None) - __properties: ClassVar[List[str]] = ["brightnessThreshold", "dpiThreshold", "angleThreshold", "focusCheck", "glaresCheck", "colornessCheck", "moireCheck", "documentPositionIndent", "expectedPass", "glaresCheckParams", "occlusionCheckParams"] + __properties: ClassVar[List[str]] = ["brightnessThreshold", "dpiThreshold", "angleThreshold", "focusCheck", "glaresCheck", "colornessCheck", "moireCheck", "documentPositionIndent", "expectedPass", "glaresCheckParams", "occlusionCheck", "occlusionCheckParams"] model_config = ConfigDict( populate_by_name=True, @@ -104,6 +105,7 @@ def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]: "documentPositionIndent": obj.get("documentPositionIndent"), "expectedPass": obj.get("expectedPass"), "glaresCheckParams": GlaresCheckParams.from_dict(obj["glaresCheckParams"]) if obj.get("glaresCheckParams") is not None else None, + "occlusionCheck": obj.get("occlusionCheck"), "occlusionCheckParams": OcclusionCheckParams.from_dict(obj["occlusionCheckParams"]) if obj.get("occlusionCheckParams") is not None else None }) return _obj From 79cefeea99066a9f67edbac20e094b11bb193e69 Mon Sep 17 00:00:00 2001 From: Artsiom Tsybulko Date: Mon, 10 Aug 2026 14:57:38 +0300 Subject: [PATCH 3/9] 63554 - add env, tenant to recognition_request --- .../webclient/ext/models/recognition_request.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/regula/documentreader/webclient/ext/models/recognition_request.py b/regula/documentreader/webclient/ext/models/recognition_request.py index 2504a42..0b4a19c 100755 --- a/regula/documentreader/webclient/ext/models/recognition_request.py +++ b/regula/documentreader/webclient/ext/models/recognition_request.py @@ -69,6 +69,7 @@ def __init__( images: List[Union[RecognitionImage, bytes, Base64String]] = None, container_list: ContainerList = None, tag=None, system_info: ProcessSystemInfo = ProcessSystemInfo(), + tenant: str = None, env: str = None ): input_images = [] if images: @@ -81,12 +82,16 @@ def __init__( processParam=process_params, List=input_images, systemInfo=system_info, - tag=tag + tag=tag, + tenant=tenant, + env=env ) if container_list: super().__init__( processParam=process_params, ContainerList=container_list, systemInfo=system_info, - tag=tag + tag=tag, + tenant=tenant, + env=env ) From 6885e5e9411c137f5ed94e4d65dbe8461744d7fb Mon Sep 17 00:00:00 2001 From: Andrey Novik Date: Fri, 14 Aug 2026 10:20:26 +0300 Subject: [PATCH 4/9] chore: migrate to reusable workflows (#63091) - Replace local sast.yaml with inline local copy (public repo), preserve exclude_paths; SHA-pinned - Replace local trivy-scan.yaml with inline local copy (public repo); SHA-pinned - Add verify-linked-issue.yaml as inline local copy (public repo); SHA-pinned - Replace back-merge-handler.yml with reusable back-merge@f9848fa (main) - Update renovate.json to canonical template --- .github/workflows/back-merge.yaml | 16 +++++++ .github/workflows/sast.yaml | 43 +++++++------------ .github/workflows/trivy-scan.yaml | 33 ++++++++------ .github/workflows/verify-linked-issue.yaml | 50 ++++++++++++++++++++++ renovate.json | 42 ++++++++++++++++++ 5 files changed, 142 insertions(+), 42 deletions(-) create mode 100644 .github/workflows/back-merge.yaml create mode 100644 .github/workflows/verify-linked-issue.yaml create mode 100644 renovate.json diff --git a/.github/workflows/back-merge.yaml b/.github/workflows/back-merge.yaml new file mode 100644 index 0000000..37f44cd --- /dev/null +++ b/.github/workflows/back-merge.yaml @@ -0,0 +1,16 @@ +name: Back Merge + +on: + push: + branches: + - master + - stable + +jobs: + back-merge: + uses: regulaforensics/reusable-workflows/.github/workflows/back-merge.yaml@f9848fa9ec1ae1e6285b56200ac1f24fbfaee0c3 # main + with: + source_branch: ${{ github.ref_name }} + merge_pairs: "master:stable,stable:develop" + secrets: + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/sast.yaml b/.github/workflows/sast.yaml index 2c68e11..dd1c08b 100644 --- a/.github/workflows/sast.yaml +++ b/.github/workflows/sast.yaml @@ -1,4 +1,8 @@ -name: Semgrep SAST +# This repository is public and cannot call reusable workflows from a private +# repository (regulaforensics/reusable-workflows). The logic below is a local +# copy that mirrors the reusable workflow exactly. SHA pins are kept up-to-date +# by Renovate (see renovate.json). +name: SAST on: pull_request: @@ -10,49 +14,32 @@ on: - main - master -env: - # Fail workflow or not if vulnerabilities found - FAIL_ON_VULNERABILITIES: true - # List of paths (space separated) to ignore - # Supports PATTERNS - # EXCLUDE_PATHS: 'foo bar/baz file.txt dir/*.yml' - EXCLUDE_PATHS: 'generator-templates regula/documentreader/webclient/gen .github' - # List of rules (space separated) to ignore - # EXCLUDE_RULES: 'generic.secrets.security.detected-aws-account-id.detected-aws-account-id' - # See https://github.com/semgrep/semgrep-rules for rules registry - EXCLUDE_RULES: '' - jobs: semgrep: name: semgrep-oss/scan runs-on: ubuntu-latest container: - image: semgrep/semgrep + image: semgrep/semgrep@sha256:bdf7013b2c3634a487671158da77c554f531742326b543a9464d2adf6c433ac8 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Scan shell: bash + env: + EXCLUDE_PATHS: 'generator-templates regula/documentreader/webclient/gen .github' + EXCLUDE_RULES: '' run: | EXCLUDED_PATHS=() - if [[ ! -z $EXCLUDE_PATHS ]]; then + if [[ -n "$EXCLUDE_PATHS" ]]; then for path in $EXCLUDE_PATHS; do - EXCLUDED_PATHS+=("--exclude $path") + EXCLUDED_PATHS+=("--exclude" "$path") done fi EXCLUDED_RULES=() - if [[ ! -z $EXCLUDE_RULES ]]; then + if [[ -n "$EXCLUDE_RULES" ]]; then for rule in $EXCLUDE_RULES; do - EXCLUDED_RULES+=("--exclude-rule $rule") + EXCLUDED_RULES+=("--exclude-rule" "$rule") done fi - if [[ $FAIL_ON_VULNERABILITIES == "true" ]]; then - semgrep scan --config auto ${EXCLUDED_PATHS[@]} ${EXCLUDED_RULES[@]} --error --verbose - elif [[ $FAIL_ON_VULNERABILITIES == "false" ]]; then - semgrep scan --config auto ${EXCLUDED_PATHS[@]} ${EXCLUDED_RULES[@]} --error --verbose || true - else - echo "Bad FAIL_ON_VULNERABILITIES env var value" - exit 1 - fi - + semgrep scan --config auto "${EXCLUDED_PATHS[@]}" "${EXCLUDED_RULES[@]}" --error --verbose diff --git a/.github/workflows/trivy-scan.yaml b/.github/workflows/trivy-scan.yaml index 450c83c..df8bcfc 100644 --- a/.github/workflows/trivy-scan.yaml +++ b/.github/workflows/trivy-scan.yaml @@ -1,27 +1,32 @@ +# This repository is public and cannot call reusable workflows from a private +# repository (regulaforensics/reusable-workflows). The logic below is a local +# copy that mirrors the reusable workflow exactly. SHA pins are kept up-to-date +# by Renovate (see renovate.json). name: Trivy Scan on: pull_request: branches: - - main - - master - develop + - staging + - production - stable + - main + - master jobs: trivy-scan: - name: Scanner runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v3 + - name: Checkout code + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - name: Run Trivy vulnerability scanner in fs mode - uses: aquasecurity/trivy-action@master - with: - scan-type: 'fs' - exit-code: '1' - ignore-unfixed: true - severity: 'CRITICAL,HIGH,MEDIUM,LOW' - env: - TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db:2 + - name: Run Trivy scanner + uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 + with: + scan-type: 'fs' + exit-code: '1' + ignore-unfixed: true + severity: 'CRITICAL,HIGH,MEDIUM,LOW' + env: + TRIVY_DB_REPOSITORY: public.ecr.aws/aquasecurity/trivy-db:2 diff --git a/.github/workflows/verify-linked-issue.yaml b/.github/workflows/verify-linked-issue.yaml new file mode 100644 index 0000000..a7801a6 --- /dev/null +++ b/.github/workflows/verify-linked-issue.yaml @@ -0,0 +1,50 @@ +# This repository is public and cannot call reusable workflows from a private +# repository (regulaforensics/reusable-workflows). The logic below is a local +# copy that mirrors the reusable workflow exactly. SHA pins are kept up-to-date +# by Renovate (see renovate.json). +name: Verify Issue + +on: + pull_request: + types: [edited, synchronize, opened, reopened] + +jobs: + verify_linked_issue: + runs-on: ubuntu-latest + name: PR has a linked issue. + steps: + - name: Verify Linked Issue + uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 + with: + script: | + const skipBranchPattern = ''; + const issueUrlPattern = 'https://redmine.regulaforensics.com/'; + const clickupUrlPattern = 'https://app.clickup.com/'; + const pr = context.payload.pull_request; + + if (skipBranchPattern && pr.head.ref.startsWith(skipBranchPattern)) { + console.log(`Skipping verification — branch "${pr.head.ref}" matches skip pattern "${skipBranchPattern}".`); + return; + } + + if (!pr.body) { + console.log("No Linked Issue Found!"); + core.setFailed('No linked issue found in the pull request description.'); + return; + } + + const hasRedmineIssue = issueUrlPattern && pr.body.includes(issueUrlPattern); + const hasClickupIssue = clickupUrlPattern && pr.body.includes(clickupUrlPattern); + + if (!hasRedmineIssue && !hasClickupIssue) { + console.log("No Linked Issue Found!"); + core.setFailed('No linked issue found in the pull request description.'); + return; + } + + if (hasRedmineIssue) { + console.log(`Linked issue found matching pattern "${issueUrlPattern}".`); + } + if (hasClickupIssue) { + console.log(`Linked issue found matching pattern "${clickupUrlPattern}".`); + } diff --git a/renovate.json b/renovate.json new file mode 100644 index 0000000..d952d9d --- /dev/null +++ b/renovate.json @@ -0,0 +1,42 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended", + "helpers:pinGitHubActionDigests" + ], + "enabledManagers": [ + "github-actions" + ], + "labels": [ + "dependencies" + ], + "prBodyNotes": [ + "https://redmine.regulaforensics.com/issues/58096" + ], + "packageRules": [ + { + "description": "Update all GitHub Actions to latest, including major version bumps", + "matchManagers": [ + "github-actions" + ], + "groupName": "GitHub Actions dependencies", + "groupSlug": "github-actions-deps", + "matchUpdateTypes": [ + "major", + "minor", + "patch", + "pin", + "digest" + ], + "schedule": [ + "before 6am on wednesday" + ], + "automerge": false, + "enabled": true + } + ], + "github-actions": { + "enabled": true, + "pinDigests": true + } +} From 5323d83c9d79221e6d5aa549e6c8420ce8e5f408 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 09:43:53 +0000 Subject: [PATCH 5/9] chore(deps): pin dependencies --- .github/workflows/back-merge-handler.yml | 4 ++-- .github/workflows/run-smoke-test.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/back-merge-handler.yml b/.github/workflows/back-merge-handler.yml index 0346f03..9c11220 100644 --- a/.github/workflows/back-merge-handler.yml +++ b/.github/workflows/back-merge-handler.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest if: github.ref_name == 'master' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: runs-on: ubuntu-latest if: github.ref_name == 'stable' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 with: fetch-depth: 0 diff --git a/.github/workflows/run-smoke-test.yml b/.github/workflows/run-smoke-test.yml index d3eeded..42a2399 100755 --- a/.github/workflows/run-smoke-test.yml +++ b/.github/workflows/run-smoke-test.yml @@ -11,9 +11,9 @@ jobs: run_smoke_test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@0717577d45739eb3c851188b29f50ed6c0b2194e # v2 - name: Set up Python - uses: actions/setup-python@v2 + uses: actions/setup-python@e9aba2c848f5ebd159c070c61ea2c4e2b122355e # v2 with: python-version: 3.9 - name: Install pipenv From 8fd25705a63b3414fc772f94f98b6b68e36eb6c8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 10:14:06 +0000 Subject: [PATCH 6/9] chore(deps): update semgrep/semgrep docker digest to 65dcd44 --- .github/workflows/sast.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sast.yaml b/.github/workflows/sast.yaml index dd1c08b..336b15d 100644 --- a/.github/workflows/sast.yaml +++ b/.github/workflows/sast.yaml @@ -19,7 +19,7 @@ jobs: name: semgrep-oss/scan runs-on: ubuntu-latest container: - image: semgrep/semgrep@sha256:bdf7013b2c3634a487671158da77c554f531742326b543a9464d2adf6c433ac8 + image: semgrep/semgrep@sha256:65dcd4408adda7c183a6b4550cb1e9b19f7f627a6fbb7e0559bd466bedc44d7b steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Scan From e4d57e3f9482884e14d32c17d71966318c9109ef Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 10:14:12 +0000 Subject: [PATCH 7/9] chore(deps): update github actions dependencies to v7 --- .github/workflows/back-merge-handler.yml | 4 ++-- .github/workflows/run-smoke-test.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/back-merge-handler.yml b/.github/workflows/back-merge-handler.yml index 9c11220..f6a5269 100644 --- a/.github/workflows/back-merge-handler.yml +++ b/.github/workflows/back-merge-handler.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest if: github.ref_name == 'master' steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 @@ -49,7 +49,7 @@ jobs: runs-on: ubuntu-latest if: github.ref_name == 'stable' steps: - - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: fetch-depth: 0 diff --git a/.github/workflows/run-smoke-test.yml b/.github/workflows/run-smoke-test.yml index 42a2399..7e10a6f 100755 --- a/.github/workflows/run-smoke-test.yml +++ b/.github/workflows/run-smoke-test.yml @@ -11,9 +11,9 @@ jobs: run_smoke_test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@0717577d45739eb3c851188b29f50ed6c0b2194e # v2 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 - name: Set up Python - uses: actions/setup-python@e9aba2c848f5ebd159c070c61ea2c4e2b122355e # v2 + uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7 with: python-version: 3.9 - name: Install pipenv From 6bc0f3704db3d4ecf97786efe2fdfe66ff462291 Mon Sep 17 00:00:00 2001 From: Andrey Novik Date: Mon, 24 Aug 2026 11:08:13 +0300 Subject: [PATCH 8/9] chore: remove verify-linked-issue workflow (#64393) --- .github/workflows/verify-linked-issue.yaml | 50 ---------------------- 1 file changed, 50 deletions(-) delete mode 100644 .github/workflows/verify-linked-issue.yaml diff --git a/.github/workflows/verify-linked-issue.yaml b/.github/workflows/verify-linked-issue.yaml deleted file mode 100644 index a7801a6..0000000 --- a/.github/workflows/verify-linked-issue.yaml +++ /dev/null @@ -1,50 +0,0 @@ -# This repository is public and cannot call reusable workflows from a private -# repository (regulaforensics/reusable-workflows). The logic below is a local -# copy that mirrors the reusable workflow exactly. SHA pins are kept up-to-date -# by Renovate (see renovate.json). -name: Verify Issue - -on: - pull_request: - types: [edited, synchronize, opened, reopened] - -jobs: - verify_linked_issue: - runs-on: ubuntu-latest - name: PR has a linked issue. - steps: - - name: Verify Linked Issue - uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0 - with: - script: | - const skipBranchPattern = ''; - const issueUrlPattern = 'https://redmine.regulaforensics.com/'; - const clickupUrlPattern = 'https://app.clickup.com/'; - const pr = context.payload.pull_request; - - if (skipBranchPattern && pr.head.ref.startsWith(skipBranchPattern)) { - console.log(`Skipping verification — branch "${pr.head.ref}" matches skip pattern "${skipBranchPattern}".`); - return; - } - - if (!pr.body) { - console.log("No Linked Issue Found!"); - core.setFailed('No linked issue found in the pull request description.'); - return; - } - - const hasRedmineIssue = issueUrlPattern && pr.body.includes(issueUrlPattern); - const hasClickupIssue = clickupUrlPattern && pr.body.includes(clickupUrlPattern); - - if (!hasRedmineIssue && !hasClickupIssue) { - console.log("No Linked Issue Found!"); - core.setFailed('No linked issue found in the pull request description.'); - return; - } - - if (hasRedmineIssue) { - console.log(`Linked issue found matching pattern "${issueUrlPattern}".`); - } - if (hasClickupIssue) { - console.log(`Linked issue found matching pattern "${clickupUrlPattern}".`); - } From 0b78579efa9698da5858ab2dbab885245f5fcf1e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 31 Aug 2026 11:09:36 +0000 Subject: [PATCH 9/9] Commit: 32ad978e --- .openapi-generator/FILES | 1 + .../documentreader/webclient/gen/__init__.py | 3 ++ .../webclient/gen/models/__init__.py | 2 ++ .../webclient/gen/models/process_params.py | 2 +- .../gen/models/rfid_access_control.py | 31 +++++++++++++++++++ .../gen/models/rfid_application_type.py | 2 ++ .../gen/models/rfid_password_type.py | 1 + 7 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 regula/documentreader/webclient/gen/models/rfid_access_control.py diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index a508126..7cb8630 100755 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -178,6 +178,7 @@ regula/documentreader/webclient/gen/models/result_item.py regula/documentreader/webclient/gen/models/result_mrz_detector.py regula/documentreader/webclient/gen/models/result_mrz_detector_item.py regula/documentreader/webclient/gen/models/rfid_a_chip.py +regula/documentreader/webclient/gen/models/rfid_access_control.py regula/documentreader/webclient/gen/models/rfid_access_control_info.py regula/documentreader/webclient/gen/models/rfid_access_control_procedure_type.py regula/documentreader/webclient/gen/models/rfid_access_key.py diff --git a/regula/documentreader/webclient/gen/__init__.py b/regula/documentreader/webclient/gen/__init__.py index 79e348c..aed4fff 100644 --- a/regula/documentreader/webclient/gen/__init__.py +++ b/regula/documentreader/webclient/gen/__init__.py @@ -198,6 +198,7 @@ "ResultMRZDetector", "ResultMRZDetectorItem", "RfidAChip", + "RfidAccessControl", "RfidAccessControlInfo", "RfidAccessControlProcedureType", "RfidAccessKey", @@ -471,6 +472,7 @@ from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector as ResultMRZDetector from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem as ResultMRZDetectorItem from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip as RfidAChip + from regula.documentreader.webclient.gen.models.rfid_access_control import RfidAccessControl as RfidAccessControl from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo as RfidAccessControlInfo from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType as RfidAccessControlProcedureType from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey as RfidAccessKey @@ -750,6 +752,7 @@ from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector as ResultMRZDetector from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem as ResultMRZDetectorItem from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip as RfidAChip +from regula.documentreader.webclient.gen.models.rfid_access_control import RfidAccessControl as RfidAccessControl from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo as RfidAccessControlInfo from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType as RfidAccessControlProcedureType from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey as RfidAccessKey diff --git a/regula/documentreader/webclient/gen/models/__init__.py b/regula/documentreader/webclient/gen/models/__init__.py index 24019d9..66c9489 100644 --- a/regula/documentreader/webclient/gen/models/__init__.py +++ b/regula/documentreader/webclient/gen/models/__init__.py @@ -182,6 +182,7 @@ from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip + from regula.documentreader.webclient.gen.models.rfid_access_control import RfidAccessControl from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey @@ -442,6 +443,7 @@ from regula.documentreader.webclient.gen.models.result_mrz_detector import ResultMRZDetector from regula.documentreader.webclient.gen.models.result_mrz_detector_item import ResultMRZDetectorItem from regula.documentreader.webclient.gen.models.rfid_a_chip import RfidAChip +from regula.documentreader.webclient.gen.models.rfid_access_control import RfidAccessControl from regula.documentreader.webclient.gen.models.rfid_access_control_info import RfidAccessControlInfo from regula.documentreader.webclient.gen.models.rfid_access_control_procedure_type import RfidAccessControlProcedureType from regula.documentreader.webclient.gen.models.rfid_access_key import RfidAccessKey diff --git a/regula/documentreader/webclient/gen/models/process_params.py b/regula/documentreader/webclient/gen/models/process_params.py index e9c670d..3212de2 100644 --- a/regula/documentreader/webclient/gen/models/process_params.py +++ b/regula/documentreader/webclient/gen/models/process_params.py @@ -48,7 +48,7 @@ class ProcessParams(BaseModel): image_output_max_width: SkipValidation[Optional[int]] = Field(alias="imageOutputMaxWidth", default=None, description="This parameter allows setting maximum width in pixels of output images and thus reducing image size to desired. Does not change the aspect ratio. Changes disabled if equals to 0. Default 0.") scenario: SkipValidation[Scenario] = Field(alias="scenario") result_type_output: SkipValidation[Optional[List[Result]]] = Field(alias="resultTypeOutput", default=None, description="Types of results to return in response. See 'Result' enum for available options") - double_page_spread: SkipValidation[Optional[bool]] = Field(alias="doublePageSpread", default=None, description="Enable this option if the image you provide contains double page spread of the passport and you want to process both pages in one go. It makes sense to use it for documents that have meaningful information on both pages, like Russian domestic passport, or some others. Disabled by default.") + double_page_spread: SkipValidation[Optional[bool]] = Field(alias="doublePageSpread", default=None, description="This option can be set to true if the image you provide contains double page spread of the passport and you want to process both pages in one go. It makes sense to use it for documents that have meaningful information on both pages. If disabled, only one page is extracted.") generate_double_page_spread_image: SkipValidation[Optional[bool]] = Field(alias="generateDoublePageSpreadImage", default=None, description="When enabled together with \"doublePageSpread\" and there is a passport with two pages spread in the image, pages will be cropped, straightened and aligned together, as if the document was captured on a flatbed scanner. Disabled by default.") field_types_filter: SkipValidation[Optional[List[TextFieldType]]] = Field(alias="fieldTypesFilter", default=None, description="If a document contains Visual zone, you can set the list of field types to extract. In this case, other fields are skipped during the processing, i.e. document recognition becomes faster. This filter is not applicable to the MRZ, barcode or RFID. If the fieldTypesFilter is empty, all fields are extracted. Empty by default. If fieldTypesFilter and fieldTypesIgnoreFilter are used simultaneously, fieldTypesFilter takes priority.") field_types_ignore_filter: SkipValidation[Optional[List[TextFieldType]]] = Field(alias="fieldTypesIgnoreFilter", default=None, description="If a document contains a Visual zone, you can specify a list of field types that should be excluded from extraction. All field types listed in this array are skipped during processing, while the remaining fields are recognized. This filter is not applicable to the MRZ, barcode or RFID. If the fieldTypesIgnoreFilter is empty, all fields are extracted. Empty by default. If fieldTypesFilter and fieldTypesIgnoreFilter are used simultaneously, fieldTypesFilter takes priority.") diff --git a/regula/documentreader/webclient/gen/models/rfid_access_control.py b/regula/documentreader/webclient/gen/models/rfid_access_control.py new file mode 100644 index 0000000..03efe29 --- /dev/null +++ b/regula/documentreader/webclient/gen/models/rfid_access_control.py @@ -0,0 +1,31 @@ +# coding: utf-8 + +""" + Generated by: https://openapi-generator.tech +""" + +from __future__ import annotations +import json +from enum import Enum +from typing_extensions import Self + + +class RfidAccessControl(int, Enum): + """ + RfidAccessControl + """ + + """ + allowed enum values + """ + DEFAULT = 0 + CHIP_ACCESS_BAC = 1 + CHIP_ACCESS_PACE = 2 + LOCAL_PIN = 3 + + @classmethod + def from_json(cls, json_str: str) -> Self: + """Create an instance of RfidAccessControl from a JSON string""" + return cls(json.loads(json_str)) + + diff --git a/regula/documentreader/webclient/gen/models/rfid_application_type.py b/regula/documentreader/webclient/gen/models/rfid_application_type.py index 70e9fb6..86df9cf 100644 --- a/regula/documentreader/webclient/gen/models/rfid_application_type.py +++ b/regula/documentreader/webclient/gen/models/rfid_application_type.py @@ -27,6 +27,8 @@ class RfidApplicationType(int, Enum): LDS2_VisaRecords = 6 LDS2_AddBiometrics = 7 eDTC_PC = 8 + APPLET_ROOT = 50 + USER_DEFINED = 100 @classmethod def from_json(cls, json_str: str) -> Self: diff --git a/regula/documentreader/webclient/gen/models/rfid_password_type.py b/regula/documentreader/webclient/gen/models/rfid_password_type.py index e2c9bb2..edc8401 100644 --- a/regula/documentreader/webclient/gen/models/rfid_password_type.py +++ b/regula/documentreader/webclient/gen/models/rfid_password_type.py @@ -26,6 +26,7 @@ class RfidPasswordType(int, Enum): PIN_E_SIGN = 5 SAI = 6 MRZ_HASH = 7 + PIN_LOCAL = 8 @classmethod def from_json(cls, json_str: str) -> Self: