From 0a96393a70ffe49d53790439edabf1432eeb0abe Mon Sep 17 00:00:00 2001 From: JanardhanBS-SyncByte Date: Fri, 25 Sep 2026 14:56:40 +0530 Subject: [PATCH 1/4] [issue-1633] Signed-off-by: JanardhanBS-SyncByte --- .github/workflows/push-trigger.yml | 1 + .gitignore | 22 +- AGENTS.md | 130 +--- NOTICE | 192 ++++- README.md | 213 +++++- db_scripts/AGENTS.md | 8 + deploy/AGENTS.md | 3 + helm/AGENTS.md | 3 + kernel/AGENTS.md | 33 + kernel/kernel-auditmanager-api/pom.xml | 274 ++----- .../auditmanager/config/AuditConfig.java | 20 +- .../auditmanager/test/AuditEventTest.java | 50 +- .../auditmanager/test/AuditUtilsTest.java | 263 +++++++ kernel/kernel-auditmanager-service/.gitignore | 3 +- kernel/kernel-auditmanager-service/pom.xml | 401 ++++------ .../kernel-auditmanager-service/run-local.bat | 394 ++++++++++ .../kernel-auditmanager-service/run-local.sh | 367 +++++++++ .../AuditManagerBootApplication.java | 55 +- .../config/AuditExecutorConfig.java | 56 ++ .../config/OpenApiProperties.java | 35 +- .../auditmanager/config/SwaggerConfig.java | 51 +- .../controller/AuditManagerController.java | 2 +- .../resources/application-local.properties | 28 +- .../src/main/resources/bootstrap.properties | 9 +- .../test/AuditManagerTestBootApplication.java | 55 +- .../test/config/TestSecurityConfig.java | 32 +- .../test/controller/AuditControllerTest.java | 8 +- .../test/exception/AuditExceptionTest.java | 8 +- .../test/service/AuditServiceTest.java | 4 +- .../src/test/resources/application.properties | 11 +- .../src/test/resources/bootstrap.properties | 8 +- kernel/pom.xml | 696 ++++++++++++------ licenses/BSD-3-Clause-No-Nuclear-License.txt | 15 + licenses/EDL-1.0.txt | 30 + licenses/NOTICE | 129 +--- .../PostgreSQL.txt | 0 36 files changed, 2470 insertions(+), 1139 deletions(-) create mode 100644 db_scripts/AGENTS.md create mode 100644 deploy/AGENTS.md create mode 100644 helm/AGENTS.md create mode 100644 kernel/AGENTS.md create mode 100644 kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditUtilsTest.java create mode 100644 kernel/kernel-auditmanager-service/run-local.bat create mode 100644 kernel/kernel-auditmanager-service/run-local.sh create mode 100644 kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/AuditExecutorConfig.java create mode 100644 licenses/BSD-3-Clause-No-Nuclear-License.txt create mode 100644 licenses/EDL-1.0.txt rename "licenses/PostgreSQL.txt\342\200\216" => licenses/PostgreSQL.txt (100%) diff --git a/.github/workflows/push-trigger.yml b/.github/workflows/push-trigger.yml index df5ed085..67a24356 100644 --- a/.github/workflows/push-trigger.yml +++ b/.github/workflows/push-trigger.yml @@ -20,6 +20,7 @@ on: - 'master' - '1.*' - 'release*' + - 'issue*' jobs: build-maven-audit-manager: diff --git a/.gitignore b/.gitignore index 579a0cbf..e292e43a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,15 +1,20 @@ +.idea +/.metadata/ +.sonarlint/ +.vscode/ +**/*.iml +*/.classpath +*/.project +*/.settings/ +*/target/ +**/.local/ +kernel/**/.local/ *.class -.mtj.tmp/ *.war *.ear hs_err_pid* -target/ .springBeans -.metadata .factorypath -.classpath -.project -.settings/ .vertx/ bin/ tmp/ @@ -22,10 +27,5 @@ local.properties .loadpath .DS_Store test.txt -.idea/ -.settings/ -.sonarlint/ .recommenders/ /.recommenders/ -**/*.iml -.vscode diff --git a/AGENTS.md b/AGENTS.md index 8673c87e..77882c8c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,122 +1,22 @@ -# AGENTS.md +# audit-manager -This file provides guidance to AI agents when working with code in this repository. +Audit trail · **JDK21 · Boot4.1.1 · Cloud2025.1.3 · no kernel-bom.** Load only the nested `AGENTS.md` for the folder you edit. -## What This Service Does - -`audit-manager` is a MOSIP kernel microservice that provides a centralised, tamper-evident audit trail for the entire MOSIP identity platform. Every other MOSIP service (Registration Processor, ID Authentication, Resident Services, Pre-Registration, etc.) calls this service's single POST endpoint to persist an audit event. The service performs no business logic beyond validating the incoming record and writing it to the `audit.app_audit_log` PostgreSQL table. - -## Build & Test Commands - -All Maven commands must be run from the `kernel/` directory (the Maven multi-module root). - -```bash -# Full build, skip tests and GPG signing (standard dev build) -cd kernel && mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true - -# Build and run all tests -cd kernel && mvn install -Dmaven.javadoc.skip=true -Dgpg.skip=true - -# Run tests for a single module -cd kernel && mvn test -pl kernel-auditmanager-service -Dgpg.skip=true - -# Run a single test class -cd kernel && mvn test -pl kernel-auditmanager-service -Dtest=AuditServiceTest -Dgpg.skip=true - -# Generate OpenAPI JSON (starts service on port 8090, generates JSON, then stops) -cd kernel && mvn verify -pl kernel-auditmanager-service -P openapi-doc-generate-profile -Dgpg.skip=true - -# SonarQube analysis -cd kernel && mvn verify -P sonar -Dsonar.login= -Dgpg.skip=true ``` - -Tests use H2 in-memory with schema `AUDIT` auto-created at startup. No external dependencies needed to run tests. - -## Module Structure - -The project is a two-module Maven build under `kernel/`: - -| Module | Purpose | -|--------|---------| -| `kernel-auditmanager-api` | Shared library: JPA entity, repository, request DTO, validation logic (`AuditUtils`), `AuditHandlerImpl`, and builder | -| `kernel-auditmanager-service` | Runnable Spring Boot service: REST controller, service layer, auth wiring, exception handler, Swagger config | - -`kernel-auditmanager-service` depends on `kernel-auditmanager-api` as a runtime dependency. External MOSIP services that want to log audits programmatically (not via HTTP) can embed `kernel-auditmanager-api` as a library dependency. - -## Request Flow - -``` -POST /v1/auditmanager/audits - → AuditManagerController (service module) - → AuditManagerServiceImpl (service module) - → AuditHandlerImpl.addAudit() (api module) - → AuditUtils.validateAudit() (validates all fields, throws KER-AUD-001 on failure) - → AuditRepository.save() (JPA → audit.app_audit_log) - ← ResponseWrapper { status: true } +audit-manager/ +├── kernel/ # reactor — see kernel/AGENTS.md +│ ├── kernel-auditmanager-api/ +│ └── kernel-auditmanager-service/ # :8081 /v1/auditmanager · run-local.* · Dockerfile +├── db_scripts/mosip_audit/ # PostgreSQL DDL +├── db_upgrade_scripts/ +├── helm/auditmanager/ # chart +├── deploy/ # install.sh · NS=kernel +├── licenses/ · NOTICE · LICENSE +└── README.md # how-to (prefer over expanding this file) ``` -The controller wraps requests in MOSIP's `RequestWrapper` and responses in `ResponseWrapper`. The response body's `status` field is always `true` on success. - -## Database - -- **Schema / table:** `audit.app_audit_log` -- **Primary key:** `log_id` (UUID, auto-generated) -- **DDL strategy:** `spring.jpa.hibernate.ddl-auto=none` — schema is managed by scripts in `db_scripts/mosip_audit/` and upgrade scripts in `db_upgrade_scripts/` -- **Production:** PostgreSQL; connection URL injected via `${audit_database_url}` at runtime from Spring Cloud Config -- **Local dev:** H2 in-memory (`application-local.properties`); H2 console available at `/admin/h2-console/` -- **Tests:** H2 in-memory, schema auto-created via `INIT=CREATE SCHEMA IF NOT EXISTS AUDIT` in the JDBC URL; `schema.sql` in main resources initialises the table for local/dev profiles - -## Configuration & Profiles - -Spring Cloud Config is the source of truth for production config (external `mosip-config` repo, files `application-default.properties` and `kernel-default.properties`). The service name is `kernel-auditmanager-service`. - -Local profiles in `kernel/kernel-auditmanager-service/src/main/resources/`: - -| Profile | DB | Config server | -|---------|-----|---------------| -| `dev` | PostgreSQL at `dev.mosip.net:30090` | disabled (`spring.cloud.config.enabled=false`) | -| `local` | H2 in-memory | disabled | - -Active profile is set in `bootstrap.properties` (`spring.profiles.active=dev`) or overridden at runtime via the `active_profile_env` Docker env var. - -## Authentication & Authorisation - -The service uses `kernel-auth-adapter` (loaded at runtime via `iam_adapter_url_env` in Docker) to validate MOSIP Bearer tokens. The adapter is added to the classpath via `-Dloader.path`. - -Roles permitted to call `POST /audits` are configured via: -```properties -mosip.role.auditmanager.postaudits=INDIVIDUAL,REGISTRATION_ADMIN,REGISTRATION_ADMIN_GENERAL,REGISTRATION_ADMIN_ALL_INDIVIDUAL -``` -These roles are bound in `AuthorizedRolesDTO` and injected into the security config. - -## Docker & Deployment - -The container runs as user `mosip` (UID 1001) on port `8081`. The servlet context path is `/v1/auditmanager`. - -Runtime environment variables expected by the container: - -| Variable | Purpose | -|----------|---------| -| `active_profile_env` | Spring active profile | -| `spring_config_label_env` | Git branch for Spring Cloud Config | -| `spring_config_url_env` | Spring Cloud Config server URL | -| `iam_adapter_url_env` | URL to download `kernel-auth-adapter.jar` | -| `loader_path_env` | Directory for additional JARs (auth adapter) | - -JVM flags are hardcoded in the Dockerfile `CMD`: ZGC with generational mode (`-XX:+UseZGC -XX:+ZGenerational`). Additional JVM tuning is provided via the Helm value `additionalResources.javaOpts` (passed as `JDK_JAVA_OPTIONS`) with a full ZGC tuning profile (heap `-Xms1875m -Xmx3200m`, metaspace limits, GC thread counts, etc.) — see `helm/auditmanager/values.yaml`. - -Helm chart is in `helm/auditmanager/`. Install via `deploy/install.sh [kubeconfig]` which deploys into the `kernel` namespace with Istio injection enabled. Chart version for develop is `0.0.1-develop`. - -## CI/CD - -GitHub Actions (`.github/workflows/push-trigger.yml`) uses reusable workflows from `mosip/kattu@master-java21`: -1. **build-maven-audit-manager** — Maven build at `./kernel/` -2. **publish_to_nexus** — publishes SNAPSHOT artifacts (skipped on master, PRs, and releases) -3. **build-dockers** — builds and pushes `mosipqa/kernel-auditmanager-service` image -4. **sonar_analysis** — SonarQube analysis via sonarcloud.io (skipped on PRs) - -Triggers: pushes to `MOSIP*`, `develop*`, `master`, `1.*`, `release*` branches. +**Prereq:** `../commons/kernel` → `kernel-core` · `kernel-auth-adapter` **1.4.1-SNAPSHOT** -## Version Management +**Build/run:** `cd kernel && mvn clean install "-Dgpg.skip=true"` · `run-local.bat|sh` `init|start|smoke|stop|test|all|docker` -The project version follows `kernel/pom.xml`. All three pom files (`kernel/pom.xml`, `kernel-auditmanager-api/pom.xml`, `kernel-auditmanager-service/pom.xml`) must carry the same version. Internal dependency version properties (`kernel.core.version`, `kernel.audit-api.version`, etc.) are also kept in sync. When bumping versions, update all occurrences of the SNAPSHOT string across all three files. +**Rules:** one folder · Grep/Glob · skip `target/` · pins **1.4.1-SNAPSHOT** · no `kernel-bom`/`kernel-logger-logback` · Jackson2 via `jackson2.bom.version`(**2.22.3**) never Boot `jackson-bom.version` · freeze `POST /v1/auditmanager/audits` · JaCoCo**=100%** (excl constant/config/dto/entity/exception/repository/*BootApplication) · GC flags only in `run-local.*` not Dockerfile diff --git a/NOTICE b/NOTICE index 2df95146..296f58dc 100644 --- a/NOTICE +++ b/NOTICE @@ -1,63 +1,175 @@ -THIRD-PARTY NOTICES +NOTICES -Copyright © MOSIP. +Copyright (c) MOSIP. All rights reserved. -This project includes third-party components distributed under licenses -that require attribution. The following sections list those components -and their respective licenses. +This project is licensed under MPL 2.0 (see LICENSE). Third-party +versions below match kernel/pom.xml and the resolved Maven dependency +tree (checked against Maven Central on 2026-09-25; jars refreshed with +`mvn -U dependency:resolve`). Full license texts: licenses/. + +MOSIP open-source license matrix (compatible with MPL 2.0 / Use with MOSIP): + + License Compatible? Use with MOSIP? Comments + ------------------------------- ------------ ---------------- -------- + BSD (2-Clause, 3-Clause) Yes Yes Code can be combined freely + MIT Yes Yes Code can be combined freely + Apache-2.0 Yes Yes Permissive; meet attribution + MPL-2.0 Yes Yes Code can be combined freely + ISC Yes Yes Keep ISC text + attribution; + ISC code stays ISC; project MPL + EPL No No Differing requirements vs MPL + LGPLv3 Yes No May be included; LGPLv3 may + apply to the combined work + GPLv2 No No No explicit MPL 2.0 compatibility + GPLv3 Yes No Combined work must be GPLv3 + AGPLv3 Yes No Combined work must be AGPLv3 + Creative Commons (software) No No Not designed for software + CC-BY-4.0 — — To be reviewed (creative works) + Python-2.0 Yes Yes Comply with both; keep notices + AFL-2.0 No No Clauses conflict with MPL 2.0 + AFL-2.1 Yes Yes Keep AFL notice + attribution; + AFL code stays AFL; project MPL + ODC-By-1.0 No No Database license; not for software + CDDL-1.0 Yes Yes Weak copyleft coexistence: + each file keeps its license; + include both license texts + Unicode-DFS-2016 Yes Yes Keep Unicode notice/disclaimers; + Unicode files stay Unicode-DFS + BlueOak-1.0.0 Yes Yes Keep license text or link + OFL-1.1 Yes Yes Fonts; include full OFL text + Zlib Yes Yes Include original zlib license text + 0BSD Yes Yes Permissive; broad use/redistribution + +Project-specific dual / electable licenses used by this stack: + EDL-1.0 Yes Yes Elect for Jakarta Persistence + PostgreSQL Yes Yes BSD-style JDBC + Bouncy Castle Yes Yes MIT-style (transitive) + +Dual-licensed jars: MOSIP elects an allowed option (never EPL, GPL, AGPL, or +LGPLv3 as the product license). Where only EPL OR GPL-2.0+CPE is offered +(Jakarta Servlet), those are platform/transitive deps — document here; do not +relicense MOSIP code under them. Dual Apache-2.0 OR LGPL (java-json-tools): +MOSIP elects Apache-2.0. + +Pinned platform (stable GA; not latest milestone): + Spring Boot parent ........ 4.1.1 (latest GA 4.1.x; 4.2.x is milestone) + Spring Cloud BOM .......... 2025.1.3 (latest GA for Boot 4.1; 2026.x is milestone) + springdoc-openapi ......... 3.1.1 + Jackson 2 BOM ............. 2.22.3 (property jackson2.bom.version) + JDK ....................... 21 + Project / MOSIP stack ..... 1.4.1-SNAPSHOT (commons + bio-utils aligned) + modelmapper ............... 2.4.5 (2.x line; 3.x is a major bump — not taken) + +Resolved runtime / compile highlights (service tree, 2026-09-25): + Spring Framework .......... 7.0.9 + Spring Security ........... 7.1.1 + Spring Cloud Context ...... 5.0.3 + Tomcat embed .............. 11.0.24 + Hibernate ORM ............. 7.4.5.Final + HikariCP .................. 7.0.2 + Logback ................... 1.5.38 + SLF4J ..................... 2.0.18 + swagger-ui (webjars) ...... 5.32.14 + Lombok .................... 1.18.46 + H2 (local/test) ........... 2.4.240 + PostgreSQL JDBC ........... 42.7.13 + JUnit Jupiter / Vintage ... 6.0.3 (test) + Mockito ................... 5.23.0 (test) =========================== - Apache License 2.0 +MPL-2.0 (LICENSE / licenses/MPL-2.0.txt) =========================== -• Spring Boot & Spring Security - (Starter Security, Starter Validation, Starter Data JPA, Starter Web, - Configuration Processor, Security Test, Spring Boot Maven Plugin) -• SpringDoc OpenAPI - (SpringDoc OpenAPI Maven Plugin, SpringDoc OpenAPI Starter WebMVC UI) +- This repository (io.mosip.kernel:audit-manager 1.4.1-SNAPSHOT) +- io.mosip.kernel:kernel-auditmanager-api 1.4.1-SNAPSHOT +- io.mosip.kernel:kernel-auditmanager-service 1.4.1-SNAPSHOT +- io.mosip.kernel:kernel-core 1.4.1-SNAPSHOT +- io.mosip.kernel:kernel-auth-adapter 1.4.1-SNAPSHOT +- com.h2database:h2 2.4.240 (MPL-2.0 OR EPL-1.0; MOSIP elects MPL-2.0) -• JSON Simple (com.googlecode.json-simple) +=========================== +MIT License (licenses/MIT.txt) +=========================== + +- org.projectlombok:lombok 1.18.46 (Boot-managed) +- org.slf4j:slf4j-api 2.0.18 (Boot-managed / transitive) +- com.auth0:java-jwt 3.19.4 / jwks-rsa 0.24.1 (transitive via kernel-*) +- org.bouncycastle:bcprov-jdk18on / bcpkix-jdk18on / bcutil-jdk18on (Bouncy Castle Licence; MIT-style) -• Central Publishing Maven Plugin +=========================== +Apache-2.0 (licenses/Apache-2.0.txt) +=========================== -• Git Commit ID Maven Plugin +- Spring Boot 4.1.1 / Spring Framework 7.0.9 / Spring Security 7.1.1 / Spring Cloud 2025.1.3 +- org.springdoc:springdoc-openapi-starter-webmvc-ui 3.1.1 (+ starter-common / webmvc-api) +- org.webjars:swagger-ui 5.32.14 (Apache-2.0; UI assets) +- com.fasterxml.jackson:jackson-bom 2.22.3 (property `jackson2.bom.version`; not Boot's Jackson 3 `jackson-bom.version`) +- com.fasterxml.jackson.core:jackson-annotations 2.22 +- com.fasterxml.jackson.core:jackson-core 2.22.3 +- com.fasterxml.jackson.core:jackson-databind 2.22.3 +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310 / jdk8 (via jackson-bom 2.22.3) +- org.springframework.boot:spring-boot-jackson2 4.1.1 (Jackson 2 ObjectMapper bridge) +- org.modelmapper:modelmapper 2.4.5 +- org.apache.tomcat.embed:* 11.0.24 (Boot-managed) +- com.zaxxer:HikariCP 7.0.2 +- org.hibernate.orm:hibernate-core 7.4.5.Final (Apache-2.0 since 7.0) +- com.github.java-json-tools:* (LGPL-3.0+ OR Apache-2.0; MOSIP elects Apache-2.0) — transitive via kernel-core +- io.micrometer:* / io.prometheus:* (Boot / actuator transitive) +- Maven build plugins (compiler 3.16.0, surefire 3.6.0, jar 3.5.1, source 3.4.0, + javadoc 3.12.0, gpg 3.2.8, deploy 3.2.0, jacoco 0.8.15, + git-commit-id-plugin 4.9.10, central-publishing 0.11.0, sonar 5.8.0.7211) -• Apache Maven Plugins: - - maven-surefire-plugin - - maven-gpg-plugin - - maven-javadoc-plugin - - maven-source-plugin - - maven-jar-plugin - - maven-war-plugin - - maven-compiler-plugin +=========================== +PostgreSQL License (licenses/PostgreSQL.txt) +=========================== -• ModelMapper +- org.postgresql:postgresql 42.7.13 -• Log4j API +=========================== +BSD-3-Clause / BSD-3-Clause-No-Nuclear (licenses/BSD-3-Clause-No-Nuclear-License.txt) +=========================== -• Jackson Datatype JSR310 +- com.github.jai-imageio:jai-imageio-core 1.4.0 (transitive via kernel-core) +- org.hamcrest:hamcrest (test scope) =========================== - Mozilla Public License 2.0 +EDL-1.0 (licenses/EDL-1.0.txt) — elect this side of dual EPL/EDL =========================== -• MOSIP Kernel Libraries - (kernel-bom, kernel-core, kernel-logger-logback, - kernel-auth-adapter, kernel-auditmanager-api) -==================================== - PostgreSQL License (BSD-style) -==================================== -• PostgreSQL JDBC Driver +- jakarta.persistence:jakarta.persistence-api 3.2.0 (Boot / kernel-core transitive) =========================== - Eclipse Public License +EPL-2.0 (+ optional GPL-2.0 with Classpath exception) — platform / test only +(licenses/EPL-2.0.txt) =========================== -• H2 Database Engine (EPL 1.0) -• Jakarta Servlet API (EPL 2.0) +MOSIP matrix: EPL and GPLv2 are not approved product licenses. These jars are +transitive / test-only from Boot and Jakarta EE; MOSIP code remains MPL-2.0. + +- jakarta.servlet:jakarta.servlet-api (EPL-2.0 OR GPL-2.0+CPE) — Boot web +- jakarta.transaction:jakarta.transaction-api (EPL-2.0 OR GPL-2.0+CPE) — transitive +- org.aspectj:aspectjweaver 1.9.25.1 (EPL-2.0) — transitive via kernel-core JPA stack +- org.junit.* / junit-vintage-engine 6.0.3 (EPL-2.0) — test scope only +- org.jacoco:* 0.8.15 (EPL-2.0) — build / coverage only + +=========================== +EPL-1.0 (licenses/EPL-1.0.txt) — dual-license / logging stack +=========================== + +- com.h2database:h2 — alternate to MPL-2.0 (MOSIP elects MPL-2.0; text kept for completeness) +- ch.qos.logback:logback-classic / logback-core 1.5.38 (EPL-1.0 OR LGPL-2.1; Boot-managed) + +=========================== +Artifacts produced +=========================== + +- kernel-auditmanager-api-${version}.jar + Embeddable library (entity, repository, handler, utils). + +- kernel-auditmanager-service-${version}.jar + Fat / runnable Spring Boot service (ZIP layout). Use run-local.bat / + run-local.sh or `java -jar` with config-server / loader.path env vars. ------------------------------------------------------------- -Full license texts for all components are available in the -`license/` directory of this repository. ------------------------------------------------------------- +- …-sources.jar / …-javadoc.jar + Source and API documentation attachments for Maven Central. diff --git a/README.md b/README.md index 3c7a9364..c345780b 100644 --- a/README.md +++ b/README.md @@ -3,40 +3,193 @@ # Audit Manager -## Overview -This repository contains modules used for audit related functionalities. - -## Databases -Refer to [SQL scripts](db_scripts). - -## Build & run (for developers) -The project requires JDK 21.0.3 -and mvn version - 3.9.6. -1. Build and install: - ``` - $ cd kernel - $ mvn install -DskipTests=true -Dmaven.javadoc.skip=true -Dgpg.skip=true - ``` -2. Build Docker for a service: - ``` - $ cd - $ docker build -f Dockerfile - ``` +Centralised, tamper-evident audit trail for the MOSIP identity platform. +Other services call a single HTTP endpoint to persist events into `audit.app_audit_log`. + +| | | +|---|---| +| **JDK** | 21 | +| **Spring Boot** | 4.1.1 (**no** `kernel-bom`) | +| **Spring Cloud** | 2025.1.3 | +| **Module version** | `1.4.1-SNAPSHOT` | +| **HTTP port / context** | `8081` / `/v1/auditmanager` | +| **License** | [MPL 2.0](LICENSE) — see [NOTICE](NOTICE) | + +**Quick links (after `run-local … start`):** + +| Purpose | URL | +|---------|-----| +| Health | http://localhost:8081/v1/auditmanager/actuator/health | +| Swagger UI | http://localhost:8081/v1/auditmanager/swagger-ui/index.html | +| OpenAPI | http://localhost:8081/v1/auditmanager/v3/api-docs | +| Audits API | `POST` http://localhost:8081/v1/auditmanager/audits | + +--- + +## Modules + +| Module | Role | +|--------|------| +| [`kernel-auditmanager-api`](kernel/kernel-auditmanager-api/) | Embeddable library: entity, repository, `AuditUtils`, `AuditHandlerImpl`, builder | +| [`kernel-auditmanager-service`](kernel/kernel-auditmanager-service/) | Runnable Spring Boot service (fat ZIP JAR) | + +``` +POST /v1/auditmanager/audits + → Controller → ServiceImpl → AuditHandlerImpl + → AuditUtils.validate* → KER-AUD-001 on failure + → AuditRepository.save → audit.app_audit_log + ← ResponseWrapper { status: true } +``` + +--- + +## Prerequisites + +- **JDK 21**, **Maven 3.9+** +- **Docker** (optional — for `run-local … docker`) +- Local SNAPSHOTs (or your snapshot repo), aligned with **commons** / **bio-utils** `1.4.1-SNAPSHOT`: + - `commons/kernel` → `kernel-core`, `kernel-auth-adapter` +- Config (production): [mosip-config](https://github.com/mosip/mosip-config) + +--- + +## Build + +```bash +cd kernel +mvn clean install "-Dgpg.skip=true" +``` + +| Goal | Command | +|------|---------| +| Skip tests | `mvn clean install "-DskipTests=true" "-Dgpg.skip=true"` | +| One module | `mvn test -pl kernel-auditmanager-service "-Dgpg.skip=true"` | +| One test class | `mvn test -pl kernel-auditmanager-service "-Dtest=AuditServiceTest" "-Dgpg.skip=true"` | +| Coverage | `*/target/site/jacoco/index.html` (JaCoCo gate **100%** on non-excluded packages) | +| OpenAPI JSON | `mvn verify -pl kernel-auditmanager-service -P openapi-doc-generate-profile "-Dgpg.skip=true"` | + +--- + +## Local setup + +Helpers live next to the runnable module (same style as [`kernel-bio-converter`](https://github.com/mosip/converters)): + +- Windows cmd: `kernel/kernel-auditmanager-service/run-local.bat` +- Linux / macOS / Git Bash: `kernel/kernel-auditmanager-service/run-local.sh` + +Working directory must be **`kernel/kernel-auditmanager-service/`**. Logs and PID: `.local/` (gitignored). + +### Commands + +| Command | What it does | +|---------|----------------| +| `init` | Maven package this module (skip tests) | +| `start` | Start on port **8081**, wait until ready, print URLs | +| `smoke` | `GET …/actuator/health` and Swagger UI | +| `stop` | Stop the process | +| `test` | Maven unit tests | +| `all` | `init` + `test` + `start` + `smoke` | +| `docker` | `init`, docker build, run | +| _(no args)_ / `help` | Usage + endpoint URLs | + +Default profile is **`local`** (H2 in-memory). `start` uses Generational ZGC and MOSIP `--add-opens` / `--enable-preview`. + +### Windows (cmd) + +```bat +cd kernel\kernel-auditmanager-service +run-local.bat init +run-local.bat start +run-local.bat smoke +``` + +```bat +set PORT=8081 +set SPRING_PROFILES_ACTIVE=local +set SPRING_CLOUD_CONFIG_URI=http://localhost:51000 +set SPRING_CLOUD_CONFIG_LABEL=master +set loader_path_env=. +run-local.bat start +``` + +### Linux / macOS / Git Bash + +```bash +cd kernel/kernel-auditmanager-service +chmod +x run-local.sh +./run-local.sh init +./run-local.sh start +./run-local.sh smoke +``` + +### Environment variables + +| Variable | Default | Meaning | +|----------|---------|---------| +| `PORT` | `8081` | HTTP port | +| `SPRING_PROFILES_ACTIVE` | `local` | Spring profile (`local` = H2) | +| `SPRING_CLOUD_CONFIG_URI` | _(empty)_ | Config-server URI | +| `SPRING_CLOUD_CONFIG_LABEL` | _(empty)_ | Config-server label / branch | +| `loader_path_env` | `.` | Extra JARs (`-Dloader.path`, e.g. auth-adapter) | +| `IMAGE` | `kernel-auditmanager-service` | Docker image name | +| `JDK_JAVA_OPTIONS` | _(empty)_ | Extra JVM options for `docker` runs | + +--- ## Configuration -Kernel Audit Manager Service uses the following configuration files that are accessible in this [repository](https://github.com/mosip/mosip-config/tree/master). -Please refer to the required released tagged version for configuration. -1. [Configuration-Application](https://github.com/mosip/mosip-config/blob/master/application-default.properties) -2. [Configuration-Kernel](https://github.com/mosip/mosip-config/blob/master/kernel-default.properties) -## Deploy -To deploy service on Kubernetes cluster using Dockers refer to [Sandbox Deployment](https://docs.mosip.io/1.2.0/deploymentnew/v3-installation). +Production config is served by Spring Cloud Config (`kernel-auditmanager-service`): + +1. [application-default.properties](https://github.com/mosip/mosip-config/blob/master/application-default.properties) +2. [kernel-default.properties](https://github.com/mosip/mosip-config/blob/master/kernel-default.properties) + +Local profiles under `kernel/kernel-auditmanager-service/src/main/resources/`: + +| Profile | DB | Config server | +|---------|-----|---------------| +| `local` | H2 in-memory | disabled | +| `dev` | PostgreSQL (see `application-dev.properties`) | disabled | + +--- + +## Database + +- Schema / table: `audit.app_audit_log` +- DDL: `spring.jpa.hibernate.ddl-auto=none` in prod — scripts in [`db_scripts/mosip_audit/`](db_scripts/) +- Upgrades: [`db_upgrade_scripts/`](db_upgrade_scripts/) + +--- -## Test -Automated functional tests available in [Functional Tests repo](https://github.com/mosip/mosip-functional-tests). +## Docker & deploy -## APIs -API documentation is available [here](https://mosip.github.io/documentation/1.2.0/kernel-auditmanager-service.html). +```bash +cd kernel/kernel-auditmanager-service +docker build -t kernel-auditmanager-service . +# or: run-local.bat docker / ./run-local.sh docker +``` + +Helm: [`helm/auditmanager/`](helm/auditmanager/). Install helper: [`deploy/install.sh`](deploy/). + +Runtime env (container): `active_profile_env`, `spring_config_label_env`, `spring_config_url_env`, `iam_adapter_url_env`, `loader_path_env`. + +--- + +## API + +`POST /audits` with MOSIP `RequestWrapper`. Success body: `ResponseWrapper` with `status: true`. + +Roles (when adapter / `@PreAuthorize` enabled): configured via `mosip.role.auditmanager.postaudits`. + +Functional tests: [mosip-functional-tests](https://github.com/mosip/mosip-functional-tests). + +--- + +## Notices & licenses + +Third-party attributions and the MOSIP license matrix: [NOTICE](NOTICE). Full texts: [`licenses/`](licenses/). + +--- ## License -This project is licensed under the terms of [Mozilla Public License 2.0](LICENSE) + +[Mozilla Public License 2.0](LICENSE) diff --git a/db_scripts/AGENTS.md b/db_scripts/AGENTS.md new file mode 100644 index 00000000..bbd06584 --- /dev/null +++ b/db_scripts/AGENTS.md @@ -0,0 +1,8 @@ +# db_scripts + +``` +mosip_audit/ # DDL · schema AUDIT · table app_audit_log +db_upgrade_scripts/ # versioned upgrades +``` + +Prod: PostgreSQL · service `ddl-auto=none`. Local/test: H2 · profile `local`. diff --git a/deploy/AGENTS.md b/deploy/AGENTS.md new file mode 100644 index 00000000..bdae070c --- /dev/null +++ b/deploy/AGENTS.md @@ -0,0 +1,3 @@ +# deploy + +`install.sh [kubeconfig]` · NS=`kernel` · Istio inject · `copy_cm.sh` · Helm chart `auditmanager` `0.0.1-develop`. Also: `delete.sh` · `restart.sh`. Path Δ → Helm values. diff --git a/helm/AGENTS.md b/helm/AGENTS.md new file mode 100644 index 00000000..e57ba433 --- /dev/null +++ b/helm/AGENTS.md @@ -0,0 +1,3 @@ +# helm/auditmanager + +Chart `auditmanager` · ver `0.0.1-develop` · Bitnami `common` 1.x. Path Δ → `deploy/`. Values/image/tag only — no Java pins here. diff --git a/kernel/AGENTS.md b/kernel/AGENTS.md new file mode 100644 index 00000000..85b5ea69 --- /dev/null +++ b/kernel/AGENTS.md @@ -0,0 +1,33 @@ +# kernel/ + +``` +JDK21 · Maven3.9+ · Boot4.1.1 · Cloud2025.1.3 · jackson2.bom 2.22.3 · MOSIP 1.4.1-SNAPSHOT +└─ mvn clean install "-Dgpg.skip=true" +``` + +``` +reactor +├─ kernel-auditmanager-api # entity · repo · AuditUtils · AuditHandlerImpl · builder +│ └─ no Boot repackage +└─ kernel-auditmanager-service # REST · Boot ZIP · springdoc · actuator · auth-adapter + ├─ :8081 /v1/auditmanager + ├─ run-local.bat|sh → init|start|smoke|stop|test|all|docker + ├─ Swagger: relative server=${server.servlet.path} · Authorize=Authorization apiKey + └─ Dockerfile · loader.path · iam_adapter_url_env +``` + +``` +flow +POST /audits → Controller → ServiceImpl → AuditHandlerImpl +├─ AuditUtils.validate* → KER-AUD-001 +└─ AuditRepository.save → audit.app_audit_log +``` + +``` +rules +├─ siblings omit (DM in parent) +├─ spring-boot-jackson2 · ban kernel-bom · ban kernel-logger-logback +├─ security: auth-adapter (prod) · TestSecurityConfig permitAll (tests) +├─ db: prod=PostgreSQL ddl-auto=none · local|test=H2 schema AUDIT +└─ jacoco=100% excl constant/config/dto/entity/exception/repository/*BootApplication +``` diff --git a/kernel/kernel-auditmanager-api/pom.xml b/kernel/kernel-auditmanager-api/pom.xml index 082a6776..46d5871e 100644 --- a/kernel/kernel-auditmanager-api/pom.xml +++ b/kernel/kernel-auditmanager-api/pom.xml @@ -1,261 +1,111 @@ - - + + 4.0.0 - io.mosip.kernel - kernel-auditmanager-api - 1.4.0-SNAPSHOT - - UTF-8 + + io.mosip.kernel + audit-manager + 1.4.1-SNAPSHOT + - - 21 - 21 - 3.8.0 + kernel-auditmanager-api + kernel-auditmanager-api + + Embeddable MOSIP audit library: JPA entity (audit.app_audit_log), AuditRepository, + AuditRequestDto / AuditRequestBuilder, AuditUtils validation, and AuditHandlerImpl + (persists validated events). Consume from other MOSIP services for in-process auditing, + or transitively via kernel-auditmanager-service. JDK 21, Spring Boot 4.1.1, no kernel-bom. + Depends on kernel-core 1.4.1-SNAPSHOT. + + https://github.com/mosip/audit-manager - 3.0.2 - 3.1.0 - 3.6.3 - 2.3 - 0.11.0 + + + **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,**/proxy/** + + + ${project.basedir}/../../.git + - 1.3.1-rc.1 - - 0.8.11 - **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,"**/proxy/**","**/AuditManagerBootApplication.java -" - **/dto/**,**/entity/**,**/config/** - - - - - - io.mosip.kernel - kernel-bom - ${kernel.core.version} - pom - import - - - + io.mosip.kernel kernel-core - ${kernel.core.version} + org.springframework.boot spring-boot-starter-data-jpa + org.springframework.boot spring-boot-starter-validation + com.h2database h2 runtime + org.postgresql postgresql + org.modelmapper modelmapper - - junit - junit - test - + org.slf4j slf4j-api - - - ossrh - https://central.sonatype.com/repository/maven-snapshots/ - - - ossrh - https://central.sonatype.com/api/v1/publisher - - - - - ossrh - MavenCentralRepository - https://central.sonatype.com/repository/maven-snapshots/ - default - - true - - - + - maven-deploy-plugin - 2.8.1 - - - default-deploy - deploy - - deploy - - - - - - org.sonatype.central - central-publishing-maven-plugin - ${central.publishing.maven.plugin.version} - true + pl.project13.maven + git-commit-id-plugin - ossrh - false + ${project.basedir}/../../.git org.apache.maven.plugins - maven-source-plugin - true - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven.javadoc.version} - - - attach-javadocs - - jar - - - - - none - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - pl.project13.maven - git-commit-id-plugin - 3.0.1 - - - get-the-git-infos - - revision - - validate - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - ${project.basedir}/.git - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.22.0 + maven-deploy-plugin - false false - - ${argLine} --add-opens - java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit - - - org.jacoco - jacoco-maven-plugin - ${jacoco.maven.plugin.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - - - scm:git:git://github.com/mosip/audit-manager.git - scm:git:ssh://github.com:mosip/audit-manager.git - https://github.com/mosip/audit-manager - HEAD - - - - MPL 2.0 - https://www.mozilla.org/en-US/MPL/2.0/ - - - - - mosip - mosip.emailnotifier@gmail.com - MOSIP - https://www.mosip.io - - - Audit manager api - Audit manager api for Mosip - https://github.com/mosip/audit-manager - + + + diff --git a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/config/AuditConfig.java b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/config/AuditConfig.java index 4de7a30b..add2a4ac 100644 --- a/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/config/AuditConfig.java +++ b/kernel/kernel-auditmanager-api/src/main/java/io/mosip/kernel/auditmanager/config/AuditConfig.java @@ -1,26 +1,28 @@ package io.mosip.kernel.auditmanager.config; import org.modelmapper.ModelMapper; -import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.boot.persistence.autoconfigure.EntityScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** - * The configuration class for Audit having package location to scan - * - * @author Dharmesh Khandelwal - * @since 1.0.0 - * + * Audit API configuration: entity scan and ModelMapper bean. + * Component scan is limited to API packages (not the service module). */ @Configuration @EntityScan("io.mosip.kernel.auditmanager.entity") -@ComponentScan("io.mosip.kernel.auditmanager") +@ComponentScan(basePackages = { + "io.mosip.kernel.auditmanager.impl", + "io.mosip.kernel.auditmanager.builder", + "io.mosip.kernel.auditmanager.util", + "io.mosip.kernel.auditmanager.repository" +}) public class AuditConfig { /** - * Creates a new Modelmapper bean - * + * Creates a new ModelMapper bean. + * * @return The {@link ModelMapper} */ @Bean diff --git a/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditEventTest.java b/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditEventTest.java index 2317af7d..3d0004db 100644 --- a/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditEventTest.java +++ b/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditEventTest.java @@ -11,7 +11,8 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit4.SpringRunner; import io.mosip.kernel.auditmanager.builder.AuditRequestBuilder; @@ -20,6 +21,7 @@ import io.mosip.kernel.auditmanager.impl.AuditHandlerImpl; import io.mosip.kernel.auditmanager.repository.AuditRepository; import io.mosip.kernel.auditmanager.request.AuditRequestDto; +import io.mosip.kernel.auditmanager.util.AuditUtils; import io.mosip.kernel.core.auditmanager.exception.AuditManagerException; @RunWith(SpringRunner.class) @@ -29,44 +31,52 @@ public class AuditEventTest { @Autowired private AuditHandlerImpl auditHandlerImpl; - @MockBean + @MockitoBean private AuditRepository auditRepository; - @Test - public void auditBuilderTest() { - - Mockito.when(auditRepository.save(ArgumentMatchers.any(Audit.class))).thenReturn(new Audit()); - - AuditRequestBuilder auditRequestBuilder = new AuditRequestBuilder(); - - auditRequestBuilder.setActionTimeStamp(LocalDateTime.now()).setApplicationId("applicationId") + private AuditRequestDto validRequest() { + return new AuditRequestBuilder().setActionTimeStamp(LocalDateTime.now()).setApplicationId("applicationId") .setApplicationName("applicationName").setCreatedBy("createdBy").setDescription("description") .setEventId("eventId").setEventName("eventName").setEventType("eventType").setHostIp("hostIp") .setHostName("hostName").setId("id").setIdType("idType").setModuleId("moduleId") - .setModuleName("moduleName").setSessionUserId("sessionUserId").setSessionUserName("sessionUserName"); + .setModuleName("moduleName").setSessionUserId("sessionUserId").setSessionUserName("sessionUserName") + .build(); + } - AuditRequestDto auditRequest = auditRequestBuilder.build(); - auditHandlerImpl.addAudit(auditRequest); + @Test + public void auditBuilderTest() { + Mockito.when(auditRepository.save(ArgumentMatchers.any(Audit.class))).thenReturn(new Audit()); + assertThat(auditHandlerImpl.addAudit(validRequest()), is(true)); + } - assertThat(auditHandlerImpl.addAudit(auditRequestBuilder.build()), is(true)); + @Test + public void auditDataAccessFailureReturnsFalse() { + Mockito.when(auditRepository.save(ArgumentMatchers.any(Audit.class))) + .thenThrow(new DataAccessResourceFailureException("db down")); + assertThat(auditHandlerImpl.addAudit(validRequest()), is(false)); } @Test(expected = AuditManagerException.class) public void auditBuilderExceptionTest() { - - Mockito.when(auditRepository.save(ArgumentMatchers.any(Audit.class))).thenReturn(new Audit()); - AuditRequestBuilder auditRequestBuilder = new AuditRequestBuilder(); - auditRequestBuilder.setApplicationId("applicationId").setApplicationName("applicationName") .setCreatedBy("createdBy").setDescription("description").setEventId("eventId").setEventName("eventName") .setEventType("eventType").setHostIp("hostIp").setHostName("hostName").setId("id").setIdType("idType") .setModuleId("moduleId").setModuleName("moduleName").setSessionUserId("sessionUserId") .setSessionUserName("sessionUserName"); + auditHandlerImpl.addAudit(auditRequestBuilder.build()); + } - AuditRequestDto auditRequest = auditRequestBuilder.build(); - auditHandlerImpl.addAudit(auditRequest); + @Test(expected = AuditManagerException.class) + public void validateNullRequest() { + AuditUtils.validateAuditRequestDto(null); + } + @Test(expected = AuditManagerException.class) + public void validateOptionalFieldTooLong() { + AuditRequestDto dto = validRequest(); + dto.setDescription("x".repeat(2049)); + AuditUtils.validateAuditRequestDto(dto); } } \ No newline at end of file diff --git a/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditUtilsTest.java b/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditUtilsTest.java new file mode 100644 index 00000000..d0c5cef5 --- /dev/null +++ b/kernel/kernel-auditmanager-api/src/test/java/io/mosip/kernal/auditmanager/test/AuditUtilsTest.java @@ -0,0 +1,263 @@ +package io.mosip.kernal.auditmanager.test; + +import java.time.LocalDateTime; + +import org.junit.Test; + +import io.mosip.kernel.auditmanager.request.AuditRequestDto; +import io.mosip.kernel.auditmanager.util.AuditUtils; +import io.mosip.kernel.core.auditmanager.exception.AuditManagerException; + +/** + * Exhaustive validation coverage for {@link AuditUtils} (Sonar / JaCoCo 100%). + */ +public class AuditUtilsTest { + + private AuditRequestDto valid() { + AuditRequestDto dto = new AuditRequestDto(); + dto.setActionTimeStamp(LocalDateTime.now()); + dto.setApplicationId("applicationId"); + dto.setApplicationName("applicationName"); + dto.setCreatedBy("createdBy"); + dto.setDescription("description"); + dto.setEventId("eventId"); + dto.setEventName("eventName"); + dto.setEventType("eventType"); + dto.setHostIp("hostIp"); + dto.setHostName("hostName"); + dto.setId("id"); + dto.setIdType("idType"); + dto.setModuleId("moduleId"); + dto.setModuleName("moduleName"); + dto.setSessionUserId("sessionUserId"); + dto.setSessionUserName("sessionUserName"); + return dto; + } + + @Test + public void validRequestPasses() { + AuditUtils.validateAuditRequestDto(valid()); + } + + @Test(expected = AuditManagerException.class) + public void nullRequest() { + AuditUtils.validateAuditRequestDto(null); + } + + @Test(expected = AuditManagerException.class) + public void eventIdEmpty() { + AuditRequestDto dto = valid(); + dto.setEventId(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void eventIdTooLong() { + AuditRequestDto dto = valid(); + dto.setEventId("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void eventNameNull() { + AuditRequestDto dto = valid(); + dto.setEventName(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void eventNameTooLong() { + AuditRequestDto dto = valid(); + dto.setEventName("x".repeat(129)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void eventTypeEmpty() { + AuditRequestDto dto = valid(); + dto.setEventType(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void eventTypeTooLong() { + AuditRequestDto dto = valid(); + dto.setEventType("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void actionTimeStampNull() { + AuditRequestDto dto = valid(); + dto.setActionTimeStamp(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void hostNameEmpty() { + AuditRequestDto dto = valid(); + dto.setHostName(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void hostNameTooLong() { + AuditRequestDto dto = valid(); + dto.setHostName("x".repeat(129)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void hostIpEmpty() { + AuditRequestDto dto = valid(); + dto.setHostIp(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void hostIpTooLong() { + AuditRequestDto dto = valid(); + dto.setHostIp("x".repeat(257)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void applicationIdEmpty() { + AuditRequestDto dto = valid(); + dto.setApplicationId(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void applicationIdTooLong() { + AuditRequestDto dto = valid(); + dto.setApplicationId("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void applicationNameEmpty() { + AuditRequestDto dto = valid(); + dto.setApplicationName(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void applicationNameTooLong() { + AuditRequestDto dto = valid(); + dto.setApplicationName("x".repeat(129)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void sessionUserIdEmpty() { + AuditRequestDto dto = valid(); + dto.setSessionUserId(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void sessionUserIdTooLong() { + AuditRequestDto dto = valid(); + dto.setSessionUserId("x".repeat(257)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void createdByEmpty() { + AuditRequestDto dto = valid(); + dto.setCreatedBy(""); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void createdByTooLong() { + AuditRequestDto dto = valid(); + dto.setCreatedBy("x".repeat(257)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void sessionUserNameTooLong() { + AuditRequestDto dto = valid(); + dto.setSessionUserName("x".repeat(129)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void sessionUserNameNullOk() { + AuditRequestDto dto = valid(); + dto.setSessionUserName(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void idTooLong() { + AuditRequestDto dto = valid(); + dto.setId("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void idNullOk() { + AuditRequestDto dto = valid(); + dto.setId(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void idTypeTooLong() { + AuditRequestDto dto = valid(); + dto.setIdType("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void idTypeNullOk() { + AuditRequestDto dto = valid(); + dto.setIdType(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void moduleNameTooLong() { + AuditRequestDto dto = valid(); + dto.setModuleName("x".repeat(129)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void moduleNameNullOk() { + AuditRequestDto dto = valid(); + dto.setModuleName(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void moduleIdTooLong() { + AuditRequestDto dto = valid(); + dto.setModuleId("x".repeat(65)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void moduleIdNullOk() { + AuditRequestDto dto = valid(); + dto.setModuleId(null); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test(expected = AuditManagerException.class) + public void descriptionTooLong() { + AuditRequestDto dto = valid(); + dto.setDescription("x".repeat(2049)); + AuditUtils.validateAuditRequestDto(dto); + } + + @Test + public void descriptionNullOk() { + AuditRequestDto dto = valid(); + dto.setDescription(null); + AuditUtils.validateAuditRequestDto(dto); + } +} diff --git a/kernel/kernel-auditmanager-service/.gitignore b/kernel/kernel-auditmanager-service/.gitignore index ff6f4831..10ca022b 100644 --- a/kernel/kernel-auditmanager-service/.gitignore +++ b/kernel/kernel-auditmanager-service/.gitignore @@ -5,6 +5,7 @@ *.ear hs_err_pid* target/ +.local/ .metadata .classpath .project @@ -18,4 +19,4 @@ tmp/ local.properties .loadpath .DS_Store -logs/* \ No newline at end of file +logs/* diff --git a/kernel/kernel-auditmanager-service/pom.xml b/kernel/kernel-auditmanager-service/pom.xml index 16ca08b8..3e98dd67 100644 --- a/kernel/kernel-auditmanager-service/pom.xml +++ b/kernel/kernel-auditmanager-service/pom.xml @@ -1,66 +1,93 @@ + + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.mosip.kernel - kernel-auditmanager-service - 1.4.0-SNAPSHOT - - UTF-8 - - - 21 - 21 - 3.8.0 + + io.mosip.kernel + audit-manager + 1.4.1-SNAPSHOT + - 3.0.2 - 3.1.0 - 3.6.3 - 2.3 - 0.11.0 - - - 1.3.1-rc.1 - 1.3.1-rc.1 - 1.4.0-SNAPSHOT - 1.3.1-rc.1 - 1.3.1 - 1.3.1-rc.1 + kernel-auditmanager-service + kernel-auditmanager-service + + Runnable MOSIP Audit Manager Spring Boot service. Exposes POST /v1/auditmanager/audits + (RequestWrapper<AuditRequestDto> → ResponseWrapper<AuditResponseDto>), validates via + kernel-auditmanager-api, persists to audit.app_audit_log (PostgreSQL / H2 local). + Auth via kernel-auth-adapter (loader.path). JDK 21, Boot 4.1.1, Cloud 2025.1.3, + springdoc 3.1.1, Jackson 2 via spring-boot-jackson2. + + https://github.com/mosip/audit-manager - **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,"**/proxy/**","**/AuditManagerBootApplication.java" - **/dto/**,**/entity/**,**/config/** + + + **/dto/**,**/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,**/proxy/**,**/*BootApplication.java + - - - - io.mosip.kernel - kernel-bom - ${kernel.core.version} - pom - import - - - + + - io.mosip.kernel - kernel-core - ${kernel.core.version} + ch.qos.logback + logback-classic - org.postgresql - postgresql + ch.qos.logback + logback-core + + + + io.mosip.kernel + kernel-core + + io.mosip.kernel kernel-auditmanager-api - ${kernel.audit-api.version} + io.mosip.kernel - kernel-logger-logback - ${kernel.logger.version} + kernel-auth-adapter + + + org.springframework.boot + spring-boot-starter + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-jackson2 + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 org.springframework.boot @@ -69,14 +96,19 @@ org.springframework.security spring-security-test + test org.springframework.boot - spring-boot-starter-web + spring-boot-starter-actuator - com.googlecode.json-simple - json-simple + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-bootstrap org.springframework.boot @@ -84,246 +116,111 @@ true - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - - - org.apache.logging.log4j - log4j-api + org.springframework.boot + spring-boot-starter-webmvc-test + test - junit - junit - test + org.postgresql + postgresql - jakarta.servlet - jakarta.servlet-api - provided + org.springdoc + springdoc-openapi-starter-webmvc-ui - org.springdoc - springdoc-openapi-starter-webmvc-ui - 2.5.0 + jakarta.servlet + jakarta.servlet-api + provided - - - - ossrh - https://central.sonatype.com/repository/maven-snapshots/ - - - ossrh - https://central.sonatype.com/api/v1/publisher - - - - - ossrh - MavenCentralRepository - https://central.sonatype.com/repository/maven-snapshots/ - default - - true - - - - - + + + - org.springframework.boot - spring-boot-maven-plugin - 3.2.3 - - true - ZIP - + pl.project13.maven + git-commit-id-plugin + ${git.commit.id.plugin.version} + get-the-git-infos - build-info - repackage + revision - - false - + validate + + true + ${project.build.outputDirectory}/service-git.properties + + ^git.build.(time|version)$ + ^git.commit.id.(abbrev|full)$ + + full + + ${project.basedir}/../../.git + - - maven-deploy-plugin - 2.8.1 - - - default-deploy - deploy - - deploy - - - - - - org.sonatype.central - central-publishing-maven-plugin - ${central.publishing.maven.plugin.version} - true - - ossrh - false - - - - org.apache.maven.plugins - maven-source-plugin - true - 2.2.1 - - - attach-sources - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven.javadoc.version} - - - attach-javadocs - - jar - - - - - none - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - pl.project13.maven - git-commit-id-plugin - 3.0.1 - - - get-the-git-infos - - revision - - validate - - - - true - ${project.build.outputDirectory}/service-git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - ${project.basedir}/.git - - - + org.apache.maven.plugins maven-surefire-plugin - 2.22.0 - false - false - - ${argLine} --add-opens - java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit - + + + io.mosip.kernel:kernel-auth-adapter + + - org.jacoco - jacoco-maven-plugin + org.springframework.boot + spring-boot-maven-plugin + + + ZIP + + build-info - prepare-agent + build-info - report - prepare-package + repackage - report + repackage + + false + - - - - scm:git:git://github.com/mosip/audit-manager.git - scm:git:ssh://github.com:mosip/audit-manager.git - https://github.com/mosip/audit-manager - HEAD - - - - MPL 2.0 - https://www.mozilla.org/en-US/MPL/2.0/ - - - - - mosip - mosip.emailnotifier@gmail.com - MOSIP - https://www.mosip.io - - - Auditmanager service - Independant Audit manager service - https://github.com/mosip/audit-manager + + org.apache.maven.plugins + maven-deploy-plugin + + false + + + + + openapi-doc-generate-profile - - - io.mosip.kernel - kernel-auth-adapter - ${kernel.auth-adapter.version} - - org.springframework.boot spring-boot-maven-plugin - ${spring.boot.version} - true ZIP @@ -343,7 +240,6 @@ --server.port=8090 --server.servlet.path=/app/generic - @@ -352,18 +248,11 @@ stop - - - build-info - repackage - - org.springdoc springdoc-openapi-maven-plugin - 0.2 integration-test @@ -374,7 +263,7 @@ http://localhost:8090/app/generic/v3/api-docs - ${artifactId}-openapi.json + ${project.artifactId}-openapi.json ${project.build.directory} false @@ -383,4 +272,4 @@ - + diff --git a/kernel/kernel-auditmanager-service/run-local.bat b/kernel/kernel-auditmanager-service/run-local.bat new file mode 100644 index 00000000..f6a6cda1 --- /dev/null +++ b/kernel/kernel-auditmanager-service/run-local.bat @@ -0,0 +1,394 @@ +@echo off +setlocal EnableExtensions EnableDelayedExpansion +REM Standalone Windows cmd runner for kernel-auditmanager-service (no .ps1). +REM Linux / macOS / Git Bash: use run-local.sh +REM +REM run-local.bat init | start | smoke | stop | test | all | docker +REM Optional: SPRING_CLOUD_CONFIG_URI SPRING_CLOUD_CONFIG_LABEL PORT JDK_JAVA_OPTIONS +REM loader_path_env SPRING_PROFILES_ACTIVE IMAGE + +set "MODULE_DIR=%~dp0" +if "%MODULE_DIR:~-1%"=="\" set "MODULE_DIR=%MODULE_DIR:~0,-1%" + +set "LOCAL_DIR=%MODULE_DIR%\.local" +set "LOG_DIR=%LOCAL_DIR%\logs" +set "PID_DIR=%LOCAL_DIR%\pids" +set "PID_FILE=%PID_DIR%\auditmanager-service.pid" +set "LOG_FILE=%LOG_DIR%\auditmanager-service.log" +set "ERR_FILE=%LOG_DIR%\auditmanager-service.err.log" +set "MODULE=kernel-auditmanager-service" + +if not defined PORT set "PORT=8081" +if not defined SPRING_PROFILES_ACTIVE set "SPRING_PROFILES_ACTIVE=local" +if not defined IMAGE set "IMAGE=kernel-auditmanager-service" +if not defined loader_path_env set "loader_path_env=." +set "CONTEXT=/v1/auditmanager" +set "BASE=http://127.0.0.1:%PORT%%CONTEXT%" + +set "CMD=%~1" +if "%CMD%"=="" goto :usage +if /I "%CMD%"=="-h" goto :usage +if /I "%CMD%"=="--help" goto :usage +if /I "%CMD%"=="help" goto :usage +if /I "%CMD%"=="init" goto :init +if /I "%CMD%"=="test" goto :test +if /I "%CMD%"=="start" goto :start +if /I "%CMD%"=="stop" goto :stop +if /I "%CMD%"=="smoke" goto :smoke +if /I "%CMD%"=="all" goto :all +if /I "%CMD%"=="docker" goto :docker + +echo error: unknown command '%CMD%' +goto :usage + +:usage +echo Local kernel-auditmanager-service ^(%SPRING_PROFILES_ACTIVE% profile, :%PORT% %CONTEXT%^) +echo. +echo run-local.bat init package this module +echo run-local.bat start run and wait until Spring Boot is ready +echo run-local.bat smoke GET %CONTEXT%/actuator/health +echo run-local.bat stop +echo run-local.bat test Maven tests +echo run-local.bat all init + test + start + smoke +echo run-local.bat docker package, docker build, run +echo. +echo Port: %PORT% ^(override with set PORT=...^) +echo Optional: SPRING_CLOUD_CONFIG_URI SPRING_CLOUD_CONFIG_LABEL JDK_JAVA_OPTIONS IMAGE loader_path_env +echo. +call :print_endpoints +exit /b 1 + +:port_in_use +netstat -ano | findstr /R /C:":%PORT% .*LISTENING" >nul 2>&1 +exit /b %ERRORLEVEL% + +:pid_on_port +set "PORT_PID=" +for /f "tokens=5" %%P in ('netstat -ano ^| findstr /R /C:":%PORT% .*LISTENING"') do set "PORT_PID=%%P" +exit /b 0 + +:ensure_dirs +if not exist "%LOG_DIR%" mkdir "%LOG_DIR%" +if not exist "%PID_DIR%" mkdir "%PID_DIR%" +exit /b 0 + +:check_prereqs +where java >nul 2>&1 +if errorlevel 1 ( + echo error: java is required on PATH + exit /b 1 +) +where mvn >nul 2>&1 +if errorlevel 1 ( + echo error: mvn is required on PATH + exit /b 1 +) +exit /b 0 + +:print_endpoints +echo. +echo auditmanager profile=%SPRING_PROFILES_ACTIVE% port=%PORT% context=%CONTEXT% +echo health %BASE%/actuator/health +echo swagger %BASE%/swagger-ui/index.html +echo swagger-ui %BASE%/swagger-ui.html +echo openapi %BASE%/v3/api-docs +echo audits POST %BASE%/audits +echo. +exit /b 0 + +:find_jar +set "BOOT_JAR=" +for %%F in ("%MODULE_DIR%\target\%MODULE%-*.jar") do ( + set "CAND=%%~nxF" + echo !CAND! | findstr /I /C:".original" /C:"-lib" /C:"sources" /C:"javadoc" >nul + if errorlevel 1 ( + set "BOOT_JAR=%%~fF" + goto :find_jar_done + ) +) +:find_jar_done +if not defined BOOT_JAR ( + echo error: no boot jar in target. Run: %~nx0 init + exit /b 1 +) +for %%S in ("!BOOT_JAR!") do if %%~zS LSS 1048576 ( + echo error: !BOOT_JAR! is not the Boot ZIP ^(no Main-Class^). Run: %~nx0 init + exit /b 1 +) +exit /b 0 + +:is_running +if not exist "%PID_FILE%" exit /b 1 +set /p CHECK_PID=<"%PID_FILE%" +if not defined CHECK_PID exit /b 1 +tasklist /FI "PID eq !CHECK_PID!" 2>nul | findstr /I "!CHECK_PID!" >nul +if errorlevel 1 exit /b 1 +exit /b 0 + +:init +call :check_prereqs +if errorlevel 1 exit /b 1 +echo ==^> packaging %MODULE% ^(skip tests^) +set "SAVED_PROFILE=%SPRING_PROFILES_ACTIVE%" +set "SPRING_PROFILES_ACTIVE=" +pushd "%MODULE_DIR%" +call mvn clean package -DskipTests "-Dgpg.skip=true" "-Dmaven.javadoc.skip=true" +set "RC=%ERRORLEVEL%" +popd +set "SPRING_PROFILES_ACTIVE=%SAVED_PROFILE%" +if not "%RC%"=="0" exit /b %RC% +echo init complete +exit /b 0 + +:test +call :check_prereqs +if errorlevel 1 exit /b 1 +echo ==^> maven tests +set "SAVED_PROFILE=%SPRING_PROFILES_ACTIVE%" +set "SPRING_PROFILES_ACTIVE=" +pushd "%MODULE_DIR%" +call mvn test "-Dgpg.skip=true" "-Dmaven.javadoc.skip=true" +set "RC=%ERRORLEVEL%" +popd +set "SPRING_PROFILES_ACTIVE=%SAVED_PROFILE%" +exit /b %RC% + +:start +echo. +echo ==^> run-local start +call :ensure_dirs +call :check_prereqs +if errorlevel 1 exit /b 1 +call :is_running +if not errorlevel 1 ( + set /p OLD_PID=<"%PID_FILE%" + echo auditmanager-service already running ^(pid !OLD_PID!^) on port %PORT% + call :print_endpoints + exit /b 0 +) +call :port_in_use +if not errorlevel 1 ( + call :pid_on_port + echo auditmanager-service already listening on port %PORT% ^(pid !PORT_PID!^) + if defined PORT_PID > "%PID_FILE%" echo !PORT_PID! + call :print_endpoints + exit /b 0 +) +if exist "%PID_FILE%" del /q "%PID_FILE%" >nul 2>&1 +if exist "%LOG_FILE%" del /q "%LOG_FILE%" >nul 2>&1 +if exist "%ERR_FILE%" del /q "%ERR_FILE%" >nul 2>&1 + +call :find_jar +if errorlevel 1 exit /b 1 + +echo ==^> starting auditmanager-service from %BOOT_JAR% +echo profile=%SPRING_PROFILES_ACTIVE% +echo port=%PORT% +echo context=%CONTEXT% +echo loader.path=%loader_path_env% + +if defined SPRING_CLOUD_CONFIG_URI echo config.uri=%SPRING_CLOUD_CONFIG_URI% +if defined SPRING_CLOUD_CONFIG_LABEL echo config.label=%SPRING_CLOUD_CONFIG_LABEL% +call :print_endpoints + +set "LAUNCH_PS1=%LOCAL_DIR%\launch-auditmanager-service.ps1" +> "%LAUNCH_PS1%" echo $ErrorActionPreference = 'Stop' +>> "%LAUNCH_PS1%" echo $argList = New-Object System.Collections.Generic.List[string] +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:-UseG1GC'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:-UseParallelGC'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:-UseShenandoahGC'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+ExplicitGCInvokesConcurrent'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+UseZGC'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+ZGenerational'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+UnlockExperimentalVMOptions'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+UseStringDeduplication'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+HeapDumpOnOutOfMemoryError'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:+UseCompressedOops'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-XX:MaxGCPauseMillis=200'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-Dfile.encoding=UTF-8'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-Dloader.path=%loader_path_env%'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-Dspring.profiles.active=%SPRING_PROFILES_ACTIVE%'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-Dserver.port=%PORT%'^) +if defined SPRING_CLOUD_CONFIG_URI >> "%LAUNCH_PS1%" echo $argList.Add^('-Dspring.cloud.config.uri=%SPRING_CLOUD_CONFIG_URI%'^) +if defined SPRING_CLOUD_CONFIG_LABEL >> "%LAUNCH_PS1%" echo $argList.Add^('-Dspring.cloud.config.label=%SPRING_CLOUD_CONFIG_LABEL%'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-modules=ALL-SYSTEM'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.xml/jdk.xml.internal=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.lang.reflect=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.lang.stream=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.time=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.time.LocalDate=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.time.LocalDateTime=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/java.time.LocalDateTime.date=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--add-opens'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('java.base/jdk.internal.reflect.DirectMethodHandleAccessor=ALL-UNNAMED'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('--enable-preview'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('-jar'^) +>> "%LAUNCH_PS1%" echo $argList.Add^('%BOOT_JAR%'^) +>> "%LAUNCH_PS1%" echo $p = Start-Process -FilePath 'java' -ArgumentList $argList.ToArray^(^) -WorkingDirectory '%MODULE_DIR%' -RedirectStandardOutput '%LOG_FILE%' -RedirectStandardError '%ERR_FILE%' -WindowStyle Hidden -PassThru +>> "%LAUNCH_PS1%" echo Set-Content -LiteralPath '%PID_FILE%' -Value $p.Id -Encoding ascii +powershell -NoProfile -ExecutionPolicy Bypass -File "%LAUNCH_PS1%" +if errorlevel 1 ( + echo error: failed to start java process + exit /b 1 +) + +echo ==^> waiting for Spring Boot startup on port %PORT% ^(up to 90s^) ... +call :wait_ready 90 +if errorlevel 1 exit /b 1 + +if exist "%PID_FILE%" ( + set /p STARTED_PID=<"%PID_FILE%" + echo pid !STARTED_PID! log %LOG_FILE% +) else ( + call :pid_on_port + if defined PORT_PID ( + > "%PID_FILE%" echo !PORT_PID! + echo pid !PORT_PID! log %LOG_FILE% + ) else ( + echo warn: ready but PID for port %PORT% not resolved + ) +) +echo. +echo auditmanager-service ready +echo port %PORT% +call :print_endpoints +exit /b 0 + +:wait_ready +set /a WAIT_MAX=%~1 +if "!WAIT_MAX!"=="" set /a WAIT_MAX=90 +set /a WAIT_ELAPSED=0 +:wait_ready_loop +if !WAIT_ELAPSED! GEQ !WAIT_MAX! goto :wait_ready_fail + +call :port_in_use +if not errorlevel 1 ( + if exist "%LOG_FILE%" ( + findstr /C:"Started AuditManagerBootApplication" "%LOG_FILE%" >nul 2>&1 + if not errorlevel 1 exit /b 0 + ) +) + +if exist "%LOG_FILE%" ( + findstr /C:"APPLICATION FAILED TO START" /C:"Port %PORT% was already in use" "%LOG_FILE%" >nul 2>&1 + if not errorlevel 1 ( + echo error: startup failed. See %LOG_FILE% + type "%LOG_FILE%" + exit /b 1 + ) +) + +echo ... still starting ^(!WAIT_ELAPSED!s / !WAIT_MAX!s^) +ping -n 3 127.0.0.1 >nul +set /a WAIT_ELAPSED+=2 +goto :wait_ready_loop + +:wait_ready_fail +echo error: Spring Boot did not become ready within !WAIT_MAX!s on port %PORT% +if exist "%LOG_FILE%" type "%LOG_FILE%" +if exist "%ERR_FILE%" type "%ERR_FILE%" +exit /b 1 + +:stop +call :ensure_dirs +set "STOP_PID=" +if exist "%PID_FILE%" set /p STOP_PID=<"%PID_FILE%" +if not defined STOP_PID ( + call :pid_on_port + set "STOP_PID=!PORT_PID!" +) +if not defined STOP_PID ( + echo auditmanager-service is not running + exit /b 0 +) +echo ==^> stopping auditmanager-service ^(%STOP_PID%^) on port %PORT% +taskkill /PID %STOP_PID% /T /F >nul 2>&1 +del /q "%PID_FILE%" >nul 2>&1 +echo stopped. +exit /b 0 + +:http_ok +set "HTTP_CODE=000" +set "HTTP_URL=%~1" +set "HTTP_CODE_FILE=%LOCAL_DIR%\http-code.txt" +curl.exe -sS -o NUL -w "%%{http_code}" --connect-timeout 2 --max-time 3 "%HTTP_URL%" > "%HTTP_CODE_FILE%" 2>nul +if exist "%HTTP_CODE_FILE%" ( + for /f "usebackq delims=" %%C in ("%HTTP_CODE_FILE%") do set "HTTP_CODE=%%C" + del /q "%HTTP_CODE_FILE%" >nul 2>&1 +) +if not defined HTTP_CODE set "HTTP_CODE=000" +if "!HTTP_CODE!"=="" set "HTTP_CODE=000" +exit /b 0 + +:smoke +call :ensure_dirs +echo ==^> waiting for auditmanager-service ^(up to 60s^) +set /a ELAPSED=0 +:smoke_loop +if %ELAPSED% GEQ 60 goto :smoke_fail +if exist "%PID_FILE%" ( + call :is_running + if errorlevel 1 ( + echo error: process exited. See %LOG_FILE% + if exist "%LOG_FILE%" type "%LOG_FILE%" + if exist "%ERR_FILE%" type "%ERR_FILE%" + exit /b 1 + ) +) +call :http_ok "%BASE%/actuator/health" +if "%HTTP_CODE%"=="200" goto :smoke_ok +ping -n 3 127.0.0.1 >nul +set /a ELAPSED+=2 +goto :smoke_loop + +:smoke_ok +echo healthy %BASE%/actuator/health +call :http_ok "%BASE%/swagger-ui/index.html" +echo swagger %BASE%/swagger-ui/index.html HTTP %HTTP_CODE% +if not "%HTTP_CODE%"=="200" ( + echo error: swagger not healthy + exit /b 1 +) +echo smoke ok +call :print_endpoints +exit /b 0 + +:smoke_fail +echo error: not healthy. See %LOG_FILE% +if exist "%LOG_FILE%" type "%LOG_FILE%" +if exist "%ERR_FILE%" type "%ERR_FILE%" +exit /b 1 + +:all +echo ==^> all: init + test + start + smoke +call :init +if errorlevel 1 exit /b 1 +call :test +if errorlevel 1 exit /b 1 +call :start +if errorlevel 1 exit /b 1 +call :smoke +exit /b %ERRORLEVEL% + +:docker +call :init +if errorlevel 1 exit /b 1 +where docker >nul 2>&1 +if errorlevel 1 ( + echo error: docker is required on PATH + exit /b 1 +) +docker rm -f kernel-auditmanager-service >nul 2>&1 +echo ==^> docker build %IMAGE% +docker build -t %IMAGE% "%MODULE_DIR%" +if errorlevel 1 exit /b 1 +call :print_endpoints +docker run --rm -p %PORT%:8081 --name kernel-auditmanager-service -e active_profile_env=%SPRING_PROFILES_ACTIVE% -e spring_config_url_env=%SPRING_CLOUD_CONFIG_URI% -e spring_config_label_env=%SPRING_CLOUD_CONFIG_LABEL% -e JDK_JAVA_OPTIONS=%JDK_JAVA_OPTIONS% %IMAGE% +exit /b %ERRORLEVEL% diff --git a/kernel/kernel-auditmanager-service/run-local.sh b/kernel/kernel-auditmanager-service/run-local.sh new file mode 100644 index 00000000..5e7c552c --- /dev/null +++ b/kernel/kernel-auditmanager-service/run-local.sh @@ -0,0 +1,367 @@ +#!/usr/bin/env bash +# kernel-auditmanager-service local runner — Linux, macOS, Windows Git Bash/MSYS. +# Windows cmd: use run-local.bat (standalone). +# +# ./run-local.sh init | start | smoke | stop | test | all | docker +# Optional: SPRING_CLOUD_CONFIG_URI SPRING_CLOUD_CONFIG_LABEL PORT JDK_JAVA_OPTIONS +# loader_path_env SPRING_PROFILES_ACTIVE IMAGE +set -euo pipefail + +MODULE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOCAL_DIR="${MODULE_DIR}/.local" +LOG_DIR="${LOCAL_DIR}/logs" +PID_DIR="${LOCAL_DIR}/pids" +PORT="${PORT:-8081}" +PID_FILE="${PID_DIR}/auditmanager-service.pid" +LOG_FILE="${LOG_DIR}/auditmanager-service.log" +MODULE="kernel-auditmanager-service" +PROFILE="${SPRING_PROFILES_ACTIVE:-local}" +CONFIG_URI="${SPRING_CLOUD_CONFIG_URI:-}" +CONFIG_LABEL="${SPRING_CLOUD_CONFIG_LABEL:-}" +LOADER_PATH="${loader_path_env:-.}" +IMAGE="${IMAGE:-kernel-auditmanager-service}" +CONTEXT="/v1/auditmanager" +BASE="http://127.0.0.1:${PORT}${CONTEXT}" +UNAME_S="$(uname -s 2>/dev/null || echo unknown)" + +MVN_SKIP=( + "-DskipTests" + "-Dgpg.skip=true" + "-Dmaven.javadoc.skip=true" +) + +usage() { + cat </dev/null 2>&1 || { + echo "error: '$1' is required on PATH" >&2 + exit 1 + } +} + +ensure_dirs() { + mkdir -p "$LOG_DIR" "$PID_DIR" +} + +print_endpoints() { + echo + echo "auditmanager profile=${PROFILE} port=${PORT} context=${CONTEXT}" + echo " health ${BASE}/actuator/health" + echo " swagger ${BASE}/swagger-ui/index.html" + echo " swagger-ui ${BASE}/swagger-ui.html" + echo " openapi ${BASE}/v3/api-docs" + echo " audits POST ${BASE}/audits" + echo +} + +check_prereqs() { + need_cmd java + need_cmd mvn + echo "os: ${UNAME_S}" + local ver + ver="$(java -version 2>&1 | head -n 1 || true)" + echo "java: $ver" + if ! echo "$ver" | grep -E '"21[\. "]' >/dev/null 2>&1; then + echo "warn: JDK 21 is required. Continuing anyway." >&2 + fi +} + +mvn_mod() { + ( + cd "$MODULE_DIR" + unset SPRING_PROFILES_ACTIVE || true + mvn "$@" + ) +} + +find_boot_jar() { + local target="${MODULE_DIR}/target" + local jar + if [[ ! -d "$target" ]]; then + echo "error: not packaged. Run: $0 init" >&2 + exit 1 + fi + for jar in "$target"/${MODULE}-*.jar; do + [[ -f "$jar" ]] || continue + case "$jar" in + *.original|*-lib.jar|*sources*|*javadoc*) continue ;; + esac + if [[ "$(wc -c < "$jar")" -lt 1048576 ]]; then + echo "error: ${jar} is not the Boot ZIP (no Main-Class). Run: $0 init" >&2 + exit 1 + fi + echo "$jar" + return 0 + done + echo "error: no boot jar in ${target}. Run: $0 init" >&2 + exit 1 +} + +is_running() { + [[ -f "$PID_FILE" ]] || return 1 + kill -0 "$(cat "$PID_FILE")" 2>/dev/null +} + +cmd_init() { + check_prereqs + echo "==> packaging ${MODULE} (skip tests)" + mvn_mod clean package "${MVN_SKIP[@]}" + echo "init complete" +} + +cmd_test() { + check_prereqs + echo "==> maven tests" + mvn_mod test "-Dgpg.skip=true" "-Dmaven.javadoc.skip=true" +} + +cmd_start() { + echo + echo "==> run-local start" + ensure_dirs + check_prereqs + if is_running; then + echo "auditmanager-service already running (pid $(cat "$PID_FILE")) on port ${PORT}" + print_endpoints + return 0 + fi + rm -f "$LOG_FILE" + local jar + jar="$(find_boot_jar)" + echo "==> starting auditmanager-service from $(basename "$jar")" + echo " profile=${PROFILE}" + echo " port=${PORT}" + echo " context=${CONTEXT}" + echo " loader.path=${LOADER_PATH}" + if [[ -n "${CONFIG_URI}" ]]; then + echo " config.uri=${CONFIG_URI}" + fi + if [[ -n "${CONFIG_LABEL}" ]]; then + echo " config.label=${CONFIG_LABEL}" + fi + print_endpoints + + local java_args=( + "-XX:-UseG1GC" + "-XX:-UseParallelGC" + "-XX:-UseShenandoahGC" + "-XX:+ExplicitGCInvokesConcurrent" + "-XX:+UseZGC" + "-XX:+ZGenerational" + "-XX:+UnlockExperimentalVMOptions" + "-XX:+UseStringDeduplication" + "-XX:+HeapDumpOnOutOfMemoryError" + "-XX:+UseCompressedOops" + "-XX:MaxGCPauseMillis=200" + "-Dfile.encoding=UTF-8" + "-Dloader.path=${LOADER_PATH}" + "-Dspring.profiles.active=${PROFILE}" + "-Dserver.port=${PORT}" + ) + if [[ -n "${CONFIG_URI}" ]]; then + java_args+=("-Dspring.cloud.config.uri=${CONFIG_URI}") + fi + if [[ -n "${CONFIG_LABEL}" ]]; then + java_args+=("-Dspring.cloud.config.label=${CONFIG_LABEL}") + fi + java_args+=( + "--add-modules=ALL-SYSTEM" + "--add-opens" "java.xml/jdk.xml.internal=ALL-UNNAMED" + "--add-opens" "java.base/java.lang.reflect=ALL-UNNAMED" + "--add-opens" "java.base/java.lang.stream=ALL-UNNAMED" + "--add-opens" "java.base/java.time=ALL-UNNAMED" + "--add-opens" "java.base/java.time.LocalDate=ALL-UNNAMED" + "--add-opens" "java.base/java.time.LocalDateTime=ALL-UNNAMED" + "--add-opens" "java.base/java.time.LocalDateTime.date=ALL-UNNAMED" + "--add-opens" "java.base/jdk.internal.reflect.DirectMethodHandleAccessor=ALL-UNNAMED" + "--enable-preview" + -jar "$jar" + ) + nohup java "${java_args[@]}" >"$LOG_FILE" 2>&1 & + echo $! >"$PID_FILE" + echo "pid $(cat "$PID_FILE") log ${LOG_FILE}" + echo "==> waiting for Spring Boot startup on port ${PORT} (up to 90s) ..." + wait_ready 90 + echo + echo "auditmanager-service ready" + echo " port ${PORT}" + print_endpoints +} + +wait_ready() { + local timeout="${1:-90}" + local elapsed=0 + local code + while [[ "$elapsed" -lt "$timeout" ]]; do + if ! is_running; then + echo "error: process exited during startup. See ${LOG_FILE}" >&2 + tail -n 80 "$LOG_FILE" >&2 || true + return 1 + fi + if grep -q "Started AuditManagerBootApplication" "$LOG_FILE" 2>/dev/null; then + code="$(http_ok "${BASE}/actuator/health")" + if [[ "$code" == "200" ]]; then + return 0 + fi + fi + code="$(http_ok "${BASE}/actuator/health")" + if [[ "$code" == "200" ]]; then + return 0 + fi + if grep -q "APPLICATION FAILED TO START\|Port ${PORT} was already in use" "$LOG_FILE" 2>/dev/null; then + echo "error: startup failed. See ${LOG_FILE}" >&2 + tail -n 80 "$LOG_FILE" >&2 || true + return 1 + fi + echo " ... still starting (${elapsed}s / ${timeout}s)" + sleep 2 + elapsed=$((elapsed + 2)) + done + echo "error: Spring Boot did not become ready within ${timeout}s on port ${PORT}" >&2 + tail -n 80 "$LOG_FILE" >&2 || true + return 1 +} + +http_ok() { + local url="$1" + local code + if command -v curl >/dev/null 2>&1; then + code="$(curl -sS -o /dev/null -w "%{http_code}" --connect-timeout 2 --max-time 3 "$url" 2>/dev/null || true)" + [[ -n "$code" ]] || code="000" + printf '%s' "$code" + return 0 + fi + if command -v python3 >/dev/null 2>&1; then + python3 -c 'import sys,urllib.request +try: + urllib.request.urlopen(sys.argv[1], timeout=3) + print("200") +except Exception: + print("000")' "$url" + return 0 + fi + echo "error: install curl or python3 for smoke checks" >&2 + printf '%s' "000" +} + +cmd_stop() { + ensure_dirs + if ! is_running; then + rm -f "$PID_FILE" + echo "auditmanager-service is not running" + return 0 + fi + local pid + pid="$(cat "$PID_FILE")" + echo "==> stopping auditmanager-service (${pid}) on port ${PORT}" + kill "$pid" 2>/dev/null || true + local i + for i in 1 2 3 4 5 6 7 8 9 10; do + kill -0 "$pid" 2>/dev/null || break + sleep 1 + done + if kill -0 "$pid" 2>/dev/null; then + kill -9 "$pid" 2>/dev/null || true + fi + rm -f "$PID_FILE" + echo "stopped." +} + +cmd_smoke() { + ensure_dirs + local timeout="${1:-60}" + local elapsed=0 + echo "==> waiting for auditmanager-service (up to ${timeout}s)" + while [[ "$elapsed" -lt "$timeout" ]]; do + if [[ -f "$PID_FILE" ]] && ! is_running; then + echo "error: process exited. See ${LOG_FILE}" >&2 + tail -n 40 "$LOG_FILE" >&2 || true + return 1 + fi + local code + code="$(http_ok "${BASE}/actuator/health")" + if [[ "$code" == "200" ]]; then + echo "healthy ${BASE}/actuator/health" + code="$(http_ok "${BASE}/swagger-ui/index.html")" + echo "swagger ${BASE}/swagger-ui/index.html HTTP ${code}" + if [[ "$code" != "200" ]]; then + echo "error: swagger not healthy" >&2 + return 1 + fi + echo "smoke ok" + print_endpoints + return 0 + fi + sleep 2 + elapsed=$((elapsed + 2)) + done + echo "error: not healthy. See ${LOG_FILE}" >&2 + tail -n 80 "$LOG_FILE" >&2 || true + return 1 +} + +cmd_all() { + echo "==> all: init + test + start + smoke" + cmd_init + cmd_test + cmd_start + cmd_smoke +} + +docker_host_args() { + case "$UNAME_S" in + Linux*) echo --add-host=host.docker.internal:host-gateway ;; + esac +} + +cmd_docker() { + cmd_init + need_cmd docker + docker rm -f kernel-auditmanager-service >/dev/null 2>&1 || true + echo "==> docker build ${IMAGE}" + docker build -t "${IMAGE}" "${MODULE_DIR}" + print_endpoints + # shellcheck disable=SC2046 + exec docker run --rm -p "${PORT}:8081" --name kernel-auditmanager-service \ + $(docker_host_args) \ + -e "active_profile_env=${PROFILE}" \ + -e "spring_config_url_env=${CONFIG_URI}" \ + -e "spring_config_label_env=${CONFIG_LABEL}" \ + -e "JDK_JAVA_OPTIONS=${JDK_JAVA_OPTIONS:-}" \ + "${IMAGE}" +} + +main() { + local cmd="${1:-}" + shift || true + case "$cmd" in + -h|--help|help) usage 0 ;; + init) cmd_init ;; + test) cmd_test ;; + start) cmd_start ;; + stop) cmd_stop ;; + smoke) cmd_smoke "${1:-60}" ;; + all) cmd_all ;; + docker) cmd_docker ;; + "") usage 1 ;; + *) echo "error: unknown command '$cmd'" >&2; usage 1 ;; + esac +} + +main "$@" diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java index e771319e..0df41132 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java @@ -1,22 +1,63 @@ package io.mosip.kernel.auditmanager; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; /** - * Audit manager application - * + * Audit manager application. + * + *

+ * Security is provided by {@code kernel-auth-adapter} (Bearer tokens) when + * present on the classpath / {@code loader.path}. Unused kernel-core + * generators/validators are excluded. + *

+ * * @author Dharmesh Khandelwal * @since 1.0.0 - * */ -@SpringBootApplication(scanBasePackages = { "io.mosip.kernel.auditmanager.*","${mosip.auth.adapter.impl.basepackage}" - ,"io.mosip.kernel.core.logger.config"}) +@SpringBootApplication +@EntityScan("io.mosip.kernel.auditmanager.entity") +@EnableJpaRepositories("io.mosip.kernel.auditmanager.repository") +@EnableAutoConfiguration(excludeName = { + "io.mosip.kernel.idgenerator.vid.impl.VidGeneratorImpl", + "io.mosip.kernel.idgenerator.vid.util.VidFilterUtils", + "io.mosip.kernel.idgenerator.tokenid.impl.TokenIdGeneratorImpl", + "io.mosip.kernel.idgenerator.machineid.impl.MachineIdGeneratorImpl", + "io.mosip.kernel.idgenerator.regcenterid.impl.RegistrationCenterIdGeneratorImpl", + "io.mosip.kernel.idgenerator.mispid.impl.MispIdGeneratorImpl", + "io.mosip.kernel.licensekeygenerator.misp.impl.MISPLicenseKeyGeneratorImpl", + "io.mosip.kernel.licensekeygenerator.misp.util.MISPLicenseKeyGeneratorUtil", + "io.mosip.kernel.idgenerator.rid.impl.RidGeneratorImpl", + "io.mosip.kernel.idvalidator.prid.impl.PridValidatorImpl", + "io.mosip.kernel.idvalidator.rid.impl.RidValidatorImpl", + "io.mosip.kernel.idvalidator.uin.impl.UinValidatorImpl", + "io.mosip.kernel.idvalidator.vid.impl.VidValidatorImpl", + "io.mosip.kernel.idvalidator.mispid.impl.MispIdValidatorImpl", + "io.mosip.kernel.templatemanager.velocity.builder.TemplateManagerBuilderImpl", + "io.mosip.kernel.pdfgenerator.impl.PDFGeneratorImpl", + "io.mosip.kernel.qrcode.generator.zxing.QrcodeGeneratorImpl", + "io.mosip.kernel.transliteration.icu4j.impl.TransliterationImpl", + "io.mosip.kernel.applicanttype.api.impl.ApplicantTypeImpl", + "io.mosip.kernel.idobjectvalidator.config.IdObjectValidatorConfig", + "io.mosip.kernel.websub.api.config.IntentVerificationConfig", + "io.mosip.kernel.websub.api.config.WebSubClientConfig", + "io.mosip.kernel.websub.api.config.publisher.WebSubPublisherClientConfig", + "io.mosip.kernel.websub.api.config.publisher.RestTemplateHelper" +}) +@ComponentScan(basePackages = { + "io.mosip.kernel.auditmanager", + "${mosip.auth.adapter.impl.basepackage}", + "io.mosip.kernel.core.logger.config" +}) public class AuditManagerBootApplication { /** - * Main method to run spring boot application - * + * Main method to run spring boot application. + * * @param args args */ public static void main(String[] args) { diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/AuditExecutorConfig.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/AuditExecutorConfig.java new file mode 100644 index 00000000..2eb7f343 --- /dev/null +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/AuditExecutorConfig.java @@ -0,0 +1,56 @@ +package io.mosip.kernel.auditmanager.config; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +/** + * Configurable {@link ThreadPoolTaskExecutor} for asynchronous audit tasks. + * + *

Properties: {@code audit.executor.core-pool-size}, {@code max-pool-size}, + * {@code queue-capacity}, {@code keep-alive-seconds}, {@code await-termination-seconds}, + * {@code thread-name-prefix}.

+ */ +@Configuration +@EnableAsync(proxyTargetClass = true) +public class AuditExecutorConfig { + + @Value("${audit.executor.core-pool-size:8}") + private int corePoolSize; + + @Value("${audit.executor.max-pool-size:12}") + private int maxPoolSize; + + @Value("${audit.executor.queue-capacity:500}") + private int queueCapacity; + + @Value("${audit.executor.keep-alive-seconds:60}") + private int keepAliveSeconds; + + @Value("${audit.executor.await-termination-seconds:30}") + private int awaitTerminationSeconds; + + @Value("${audit.executor.thread-name-prefix:Audit-Async-}") + private String threadNamePrefix; + + @Bean(name = "auditExecutor") + public Executor auditExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(corePoolSize); + executor.setMaxPoolSize(maxPoolSize); + executor.setQueueCapacity(queueCapacity); + executor.setThreadNamePrefix(threadNamePrefix); + executor.setAllowCoreThreadTimeOut(true); + executor.setKeepAliveSeconds(keepAliveSeconds); + executor.setAwaitTerminationSeconds(awaitTerminationSeconds); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } +} diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/OpenApiProperties.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/OpenApiProperties.java index b246533d..7b8fccde 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/OpenApiProperties.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/OpenApiProperties.java @@ -1,39 +1,48 @@ package io.mosip.kernel.auditmanager.config; -import lombok.Data; + +import java.util.List; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; -import java.util.List; +import lombok.Data; @Configuration @ConfigurationProperties(prefix = "openapi") @Data public class OpenApiProperties { - private InfoProperty info; - private Service service; + private InfoProperty info; + private Service service; + private Group group; } @Data class InfoProperty { - private String title; - private String description; - private String version; - private LicenseProperty license; + private String title; + private String description; + private String version; + private LicenseProperty license; } @Data class LicenseProperty { - private String name; - private String url; + private String name; + private String url; } @Data class Service { - private List servers; + private List servers; } @Data class Server { - private String description; - private String url; + private String description; + private String url; +} + +@Data +class Group { + private String name; + private List paths; } diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/SwaggerConfig.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/SwaggerConfig.java index 87203609..2019cce2 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/SwaggerConfig.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/config/SwaggerConfig.java @@ -1,6 +1,9 @@ package io.mosip.kernel.auditmanager.config; +import java.util.List; +import java.util.stream.Collectors; +import org.springdoc.core.models.GroupedOpenApi; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -9,25 +12,55 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; +import io.swagger.v3.oas.models.security.SecurityRequirement; +import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; +/** + * Springdoc OpenAPI / Swagger UI configuration. + * Authorize button uses header apiKey {@code Authorization} (same as + * kernel-auth-service / kernel-notification-service / bio-converter). + */ @Configuration public class SwaggerConfig { - + /** + * Scheme name shown by Swagger UI as Authorize. + */ + public static final String AUTHORIZATION_SCHEME = "Authorization"; + + @Autowired + private OpenApiProperties openApiProperties; + @Bean - public OpenAPI openApi(@Autowired OpenApiProperties openApiProperties) { - OpenAPI api = new OpenAPI().components(new Components()) + public OpenAPI openApi() { + List servers = openApiProperties.getService().getServers().stream() + .map(server -> new Server().description(server.getDescription()).url(server.getUrl())) + .collect(Collectors.toList()); + + return new OpenAPI() + .components(new Components().addSecuritySchemes(AUTHORIZATION_SCHEME, authorizationApiKey())) + .addSecurityItem(new SecurityRequirement().addList(AUTHORIZATION_SCHEME)) .info(new Info().title(openApiProperties.getInfo().getTitle()) .version(openApiProperties.getInfo().getVersion()) .description(openApiProperties.getInfo().getDescription()) .license(new License().name(openApiProperties.getInfo().getLicense().getName()) - .url(openApiProperties.getInfo().getLicense().getUrl()))); + .url(openApiProperties.getInfo().getLicense().getUrl()))) + .servers(servers); + } - openApiProperties.getService().getServers().forEach(server -> - api.addServersItem(new Server().description(server.getDescription()).url(server.getUrl())) - ); - return api; + /** + * Header apiKey named {@code Authorization} so Swagger UI shows Authorize + * (paste {@code Bearer } or the raw token as used by the gateway/adapter). + */ + private static SecurityScheme authorizationApiKey() { + return new SecurityScheme().type(SecurityScheme.Type.APIKEY).in(SecurityScheme.In.HEADER) + .name(AUTHORIZATION_SCHEME); } -} \ No newline at end of file + @Bean + public GroupedOpenApi groupedOpenApi() { + return GroupedOpenApi.builder().group(openApiProperties.getGroup().getName()) + .pathsToMatch(openApiProperties.getGroup().getPaths().toArray(String[]::new)).build(); + } +} diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/controller/AuditManagerController.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/controller/AuditManagerController.java index bf9f8d7c..51b2058e 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/controller/AuditManagerController.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/controller/AuditManagerController.java @@ -52,7 +52,7 @@ public class AuditManagerController { * @param requestDto {@link AuditRequestDto} having required fields for auditing * @return The {@link AuditResponseDto} having the status of audit */ - @Operation(summary = "Persist a audit", description = "persist a audit", tags = { "auditmanager" }) + @Operation(summary = "Persist a audit", description = "persist a audit") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Success or you may find errors in error array in response"), @ApiResponse(responseCode = "401", description = "Unauthorized" ,content = @Content(schema = @Schema(hidden = true))), diff --git a/kernel/kernel-auditmanager-service/src/main/resources/application-local.properties b/kernel/kernel-auditmanager-service/src/main/resources/application-local.properties index 91e6e65d..3a3ab009 100644 --- a/kernel/kernel-auditmanager-service/src/main/resources/application-local.properties +++ b/kernel/kernel-auditmanager-service/src/main/resources/application-local.properties @@ -1,23 +1,35 @@ -#logging.level.org.springframework.web.filter.CommonsRequestLoggingFilter=DEBUG - +spring.cloud.config.enabled=false +spring.cloud.config.fail-fast=false +spring.config.import=optional:configserver: +spring.sleuth.enabled=false +spring.http.converters.preferred-json-mapper=jackson2 +spring.mvc.pathmatch.matching-strategy=ant_path_matcher mosip.kernel.auditmanager-service-logs-location=logs/audit.log - spring.h2.console.enabled=true spring.h2.console.path=/admin/h2-console/ spring.datasource.driver-class-name=org.h2.Driver -audit_database_url=jdbc:h2:mem:mosip_audit; +audit_database_url=jdbc:h2:mem:mosip_audit;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS AUDIT +spring.datasource.url=${audit_database_url} audit_database_username=audituser audit_database_password=Mosip@dev123 +spring.datasource.username=${audit_database_username} +spring.datasource.password=${audit_database_password} -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true -spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.H2Dialect -spring.jpa.hibernate.ddl-auto= none +spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=create spring.datasource.testWhileIdle=true spring.datasource.test-on-borrow=true -auth.server.validate.url=http://localhost:8091/authmanager/authorize/validateToken +# Required by kernel-auth-adapter (TokenHelper / BeanConfig) when adapter is on the classpath +mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter +mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip',admin:'mosip',crereq:'mosip',creser:'mosip',datsha:'mosip'} +auth.server.validate.url=http://localhost:8091/v1/authmanager/authorize/validateToken +auth.server.admin.validate.url=http://localhost:8091/v1/authmanager/authorize/admin/validateToken +auth.server.admin.issuer.uri=http://localhost:8080/auth/realms/ +auth.server.admin.allowed.audience=mosip-regproc-client,mosip-partner-client,mosip-admin-client auth.role.prefix=ROLE_ auth.header.name=Authorization mosip.role.auditmanager.postaudits=INDIVIDUAL,ID_AUTHENTICATION,TEST,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,REGISTRATION_OFFICER,REGISTRATION_PROCESSOR,PRE_REGISTRATION,PRE_REGISTRATION_ADMIN,RESIDENT,ZONAL_ADMIN,GLOBAL_ADMIN diff --git a/kernel/kernel-auditmanager-service/src/main/resources/bootstrap.properties b/kernel/kernel-auditmanager-service/src/main/resources/bootstrap.properties index 24c97dc3..1dd0cd2a 100644 --- a/kernel/kernel-auditmanager-service/src/main/resources/bootstrap.properties +++ b/kernel/kernel-auditmanager-service/src/main/resources/bootstrap.properties @@ -30,8 +30,13 @@ openapi.info.description=Rest Endpoints for operations related to audit openapi.info.version=1.0 openapi.info.license.name=Mosip openapi.info.license.url=https://docs.mosip.io/platform/license -mosipbox.public.url=http://localhost:${server.port} -openapi.service.servers[0].url=${mosipbox.public.url}${server.servlet.path} +# Relative server URL so Try-it-out uses the browser host (gateway), not localhost. +openapi.service.servers[0].url=${server.servlet.path} openapi.service.servers[0].description=Audit Manager Service +openapi.group.name=${openapi.info.title} +openapi.group.paths[0]=/** springdoc.swagger-ui.disable-swagger-default-url=true +springdoc.swagger-ui.syntaxHighlight.activated=false +# Online validator cannot reach internal cluster APIs (shows INVALID badge). +springdoc.swagger-ui.validator-url=none spring.mvc.servlet.path=${server.servlet.path} diff --git a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/auditmanager/test/AuditManagerTestBootApplication.java b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/auditmanager/test/AuditManagerTestBootApplication.java index 91acb2e1..e02b1aee 100644 --- a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/auditmanager/test/AuditManagerTestBootApplication.java +++ b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/auditmanager/test/AuditManagerTestBootApplication.java @@ -1,23 +1,56 @@ package io.mosip.auditmanager.test; import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.persistence.autoconfigure.EntityScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.Import; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; + +import io.mosip.kernel.auditmanager.test.config.TestSecurityConfig; /** - * Audit manager application - * - * @author Dharmesh Khandelwal - * @since 1.0.0 - * + * Test bootstrap for Audit Manager — excludes unused kernel-core generators/validators. */ -@SpringBootApplication(scanBasePackages = { "io.mosip.kernel.auditmanager.*" }) +@SpringBootApplication +@Import(TestSecurityConfig.class) +@EntityScan("io.mosip.kernel.auditmanager.entity") +@EnableJpaRepositories("io.mosip.kernel.auditmanager.repository") +@EnableAutoConfiguration(excludeName = { + "io.mosip.kernel.idgenerator.vid.impl.VidGeneratorImpl", + "io.mosip.kernel.idgenerator.vid.util.VidFilterUtils", + "io.mosip.kernel.idgenerator.tokenid.impl.TokenIdGeneratorImpl", + "io.mosip.kernel.idgenerator.machineid.impl.MachineIdGeneratorImpl", + "io.mosip.kernel.idgenerator.regcenterid.impl.RegistrationCenterIdGeneratorImpl", + "io.mosip.kernel.idgenerator.mispid.impl.MispIdGeneratorImpl", + "io.mosip.kernel.licensekeygenerator.misp.impl.MISPLicenseKeyGeneratorImpl", + "io.mosip.kernel.licensekeygenerator.misp.util.MISPLicenseKeyGeneratorUtil", + "io.mosip.kernel.idgenerator.rid.impl.RidGeneratorImpl", + "io.mosip.kernel.idvalidator.prid.impl.PridValidatorImpl", + "io.mosip.kernel.idvalidator.rid.impl.RidValidatorImpl", + "io.mosip.kernel.idvalidator.uin.impl.UinValidatorImpl", + "io.mosip.kernel.idvalidator.vid.impl.VidValidatorImpl", + "io.mosip.kernel.idvalidator.mispid.impl.MispIdValidatorImpl", + "io.mosip.kernel.templatemanager.velocity.builder.TemplateManagerBuilderImpl", + "io.mosip.kernel.pdfgenerator.impl.PDFGeneratorImpl", + "io.mosip.kernel.qrcode.generator.zxing.QrcodeGeneratorImpl", + "io.mosip.kernel.transliteration.icu4j.impl.TransliterationImpl", + "io.mosip.kernel.applicanttype.api.impl.ApplicantTypeImpl", + "io.mosip.kernel.idobjectvalidator.config.IdObjectValidatorConfig", + "io.mosip.kernel.websub.api.config.IntentVerificationConfig", + "io.mosip.kernel.websub.api.config.WebSubClientConfig", + "io.mosip.kernel.websub.api.config.publisher.WebSubPublisherClientConfig", + "io.mosip.kernel.websub.api.config.publisher.RestTemplateHelper" +}) +@ComponentScan( + basePackages = { "io.mosip.kernel.auditmanager" }, + excludeFilters = @ComponentScan.Filter( + type = FilterType.REGEX, + pattern = "io\\.mosip\\.kernel\\.auth\\.defaultadapter\\.config\\.SecurityConfig")) public class AuditManagerTestBootApplication { - /** - * Main method to run spring boot application - * - * @param args args - */ public static void main(String[] args) { SpringApplication.run(AuditManagerTestBootApplication.class, args); } diff --git a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/config/TestSecurityConfig.java b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/config/TestSecurityConfig.java index 2b89dfd2..5203c4bd 100644 --- a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/config/TestSecurityConfig.java +++ b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/config/TestSecurityConfig.java @@ -8,22 +8,24 @@ import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.AuthenticationEntryPoint; -import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.firewall.DefaultHttpFirewall; import org.springframework.security.web.firewall.HttpFirewall; import jakarta.servlet.http.HttpServletResponse; +/** + * Test security: permitAll filter chain + in-memory users for {@code @WithUserDetails}. + * Production uses {@code kernel-auth-adapter} SecurityConfig. + */ @Configuration @EnableWebSecurity @EnableMethodSecurity @@ -35,8 +37,9 @@ public HttpFirewall defaultHttpFirewall() { } @Bean - protected SecurityFilterChain configure(final HttpSecurity httpSecurity) throws Exception { - httpSecurity.csrf(csrf -> csrf.disable()); + public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception { + httpSecurity.httpBasic(AbstractHttpConfigurer::disable); + httpSecurity.csrf(AbstractHttpConfigurer::disable); // NOSONAR — test API httpSecurity.authorizeHttpRequests(http -> http.anyRequest().permitAll()); return httpSecurity.build(); } @@ -49,16 +52,19 @@ public AuthenticationEntryPoint unauthorizedEntryPoint() { @Bean public UserDetailsService userDetailsService() { List users = new ArrayList<>(); - users.add(new User("reg-officer", "mosip", + users.add(new User("reg-officer", "{noop}mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_REGISTRATION_OFFICER")))); - users.add(new User("reg-supervisor", "mosip", + users.add(new User("reg-supervisor", "{noop}mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_REGISTRATION_SUPERVISOR")))); - users.add(new User("reg-admin", "mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_REGISTRATION_ADMIN")))); - users.add(new User("reg-processor", "mosip", + users.add(new User("reg-admin", "{noop}mosip", + Arrays.asList(new SimpleGrantedAuthority("ROLE_REGISTRATION_ADMIN")))); + users.add(new User("reg-processor", "{noop}mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_REGISTRATION_PROCESSOR")))); - users.add(new User("id-auth", "mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_ID_AUTHENTICATION")))); - users.add(new User("individual", "mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_INDIVIDUAL")))); - users.add(new User("test", "mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_TEST")))); + users.add(new User("id-auth", "{noop}mosip", + Arrays.asList(new SimpleGrantedAuthority("ROLE_ID_AUTHENTICATION")))); + users.add(new User("individual", "{noop}mosip", + Arrays.asList(new SimpleGrantedAuthority("ROLE_INDIVIDUAL")))); + users.add(new User("test", "{noop}mosip", Arrays.asList(new SimpleGrantedAuthority("ROLE_TEST")))); return new InMemoryUserDetailsManager(users); } -} \ No newline at end of file +} diff --git a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/controller/AuditControllerTest.java b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/controller/AuditControllerTest.java index 36e0a0be..b57d0a48 100644 --- a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/controller/AuditControllerTest.java +++ b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/controller/AuditControllerTest.java @@ -12,9 +12,9 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.junit4.SpringRunner; @@ -35,7 +35,7 @@ public class AuditControllerTest { - @MockBean + @MockitoBean private AuditManagerServiceImpl service; @Autowired @@ -44,7 +44,7 @@ public class AuditControllerTest { @Autowired private ObjectMapper objectMapper; - @MockBean + @MockitoBean private AuditRepository auditRepository; @WithUserDetails("reg-processor") diff --git a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/exception/AuditExceptionTest.java b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/exception/AuditExceptionTest.java index b33751fa..a0436f39 100644 --- a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/exception/AuditExceptionTest.java +++ b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/exception/AuditExceptionTest.java @@ -8,9 +8,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.junit4.SpringRunner; @@ -27,10 +27,10 @@ public class AuditExceptionTest { @Autowired private MockMvc mockMvc; - @MockBean + @MockitoBean private AuditManagerServiceImpl service; - @MockBean + @MockitoBean private AuditRepository auditRepository; @WithUserDetails("reg-processor") diff --git a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/service/AuditServiceTest.java b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/service/AuditServiceTest.java index c64fd361..2ab192f8 100644 --- a/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/service/AuditServiceTest.java +++ b/kernel/kernel-auditmanager-service/src/test/java/io/mosip/kernel/auditmanager/test/service/AuditServiceTest.java @@ -9,7 +9,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit4.SpringRunner; import io.mosip.auditmanager.test.AuditManagerTestBootApplication; @@ -25,7 +25,7 @@ public class AuditServiceTest { @Autowired private AuditManagerServiceImpl service; - @MockBean + @MockitoBean private AuditRepository auditRepository; @Test diff --git a/kernel/kernel-auditmanager-service/src/test/resources/application.properties b/kernel/kernel-auditmanager-service/src/test/resources/application.properties index 8bb409ca..6808e2c4 100644 --- a/kernel/kernel-auditmanager-service/src/test/resources/application.properties +++ b/kernel/kernel-auditmanager-service/src/test/resources/application.properties @@ -1,14 +1,16 @@ - +spring.main.allow-bean-definition-overriding=true +spring.sleuth.enabled=false +spring.cloud.config.enabled=false +spring.http.converters.preferred-json-mapper=jackson2 mosip.kernel.auditmanager-service-logs-location=src/test/resources - spring.datasource.driver-class-name=org.h2.Driver -spring.datasource.url=jdbc:h2\:mem\:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS AUDIT +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS AUDIT spring.datasource.username=sa spring.datasource.password=sa spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true -spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.ddl-auto=create spring.datasource.testWhileIdle=true spring.datasource.test-on-borrow=true @@ -20,3 +22,4 @@ spring.main.banner-mode=off mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter auth.server.validate.url=http://localhost:8091/v1/authmanager/authorize/admin/validateToken mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip',admin:'mosip',crereq:'mosip',creser:'mosip',datsha:'mosip'} +mosip.role.auditmanager.postaudits=INDIVIDUAL,ID_AUTHENTICATION,TEST,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,REGISTRATION_OFFICER,REGISTRATION_PROCESSOR,PRE_REGISTRATION,PRE_REGISTRATION_ADMIN,RESIDENT,ZONAL_ADMIN,GLOBAL_ADMIN diff --git a/kernel/kernel-auditmanager-service/src/test/resources/bootstrap.properties b/kernel/kernel-auditmanager-service/src/test/resources/bootstrap.properties index 161a5018..6917c9c2 100644 --- a/kernel/kernel-auditmanager-service/src/test/resources/bootstrap.properties +++ b/kernel/kernel-auditmanager-service/src/test/resources/bootstrap.properties @@ -17,10 +17,14 @@ openapi.info.description=Rest Endpoints for operations related to audit openapi.info.version=1.0 openapi.info.license.name=Mosip openapi.info.license.url=https://docs.mosip.io/platform/license -mosipbox.public.url=http://localhost:${server.port} -openapi.service.servers[0].url=${mosipbox.public.url}${server.servlet.path} +# Relative server URL so Try-it-out uses the browser host (gateway), not localhost. +openapi.service.servers[0].url=${server.servlet.path} openapi.service.servers[0].description=Audit Manager Service +openapi.group.name=${openapi.info.title} +openapi.group.paths[0]=/** springdoc.swagger-ui.disable-swagger-default-url=true +springdoc.swagger-ui.syntaxHighlight.activated=false +springdoc.swagger-ui.validator-url=none spring.mvc.servlet.path=${server.servlet.path} diff --git a/kernel/pom.xml b/kernel/pom.xml index ca065ceb..e4338b44 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -1,283 +1,460 @@ - + 4.0.0 - 1.4.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 4.1.1 + + + io.mosip.kernel audit-manager + 1.4.1-SNAPSHOT pom + audit-manager - Project of MOSIP audit manager + + MOSIP Audit Manager parent reactor: centralised, tamper-evident audit trail for the identity platform. + Modules: kernel-auditmanager-api (embeddable JPA/handler library) and kernel-auditmanager-service + (runnable Spring Boot service, POST /v1/auditmanager/audits → audit.app_audit_log). + JDK 21, Spring Boot 4.1.1, Spring Cloud 2025.1.3. + https://github.com/mosip/audit-manager - - UTF-8 - + + kernel-auditmanager-api + kernel-auditmanager-service + + + + + 21 21 21 - 3.8.0 - 2.22.0 - 3.0.2 - 3.1.0 - 0.8.5 - 3.7.0.1746 - 3.2.0 - 2.3 - 0.11.0 + UTF-8 + + + false + + + 2025.1.3 + 3.1.1 + 1.5 + + + 3.16.0 + 3.5.1 + 3.5.1 + 3.6.0 + 0.8.15 + 5.8.0.7211 + 3.12.0 + 3.2.0 + 1.7.0 + 3.4.0 + 3.2.8 + + 4.9.10 + 0.11.0 - **/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/verticle/**,**/spi/**,"**/proxy/**" + + + **/constant/**,**/config/**,**/httpfilter/**,**/cache/**,**/dto/**,**/entity/**,**/model/**,**/exception/**,**/repository/**,**/request/**,**/spi/**,**/proxy/**,**/*BootApplication.java + **/dto/**,**/entity/**,**/config/** + + 1.00 + + + + 42.7.13 + + 2.4.5 + + + 2.22.3 + 2.22 + 2.22.3 + 2.22.3 + + + + 1.4.1-SNAPSHOT + 1.4.1-SNAPSHOT + + ${project.version} - - kernel-auditmanager-api - kernel-auditmanager-service - - - - + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + com.fasterxml.jackson + jackson-bom + ${jackson2.bom.version} + pom + import + + + + + io.mosip.kernel + kernel-core + ${kernel.core.version} + + + + io.mosip.kernel + kernel-auth-adapter + ${kernel.auth.adapter.version} + + + + io.mosip.kernel + kernel-auditmanager-api + ${kernel.audit.api.version} + + + + + org.springdoc + springdoc-openapi-starter-webmvc-ui + ${springdoc.openapi.version} + + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson-annotations.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson-core.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + + + org.postgresql + postgresql + ${postgresql.version} + + + + org.modelmapper + modelmapper + ${modelmapper.version} + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.junit.vintage + junit-vintage-engine + test + + + + org.projectlombok + lombok + provided + + + + + ossrh - MavenCentralRepository - https://central.sonatype.com/repository/maven-snapshots/ - default - - true - - - - central - MavenCentral - default - https://repo1.maven.org/maven2 - - false - - - - - - - ossrh - https://central.sonatype.com/repository/maven-snapshots/ + https://central.sonatype.com/repository/maven-snapshots ossrh https://central.sonatype.com/api/v1/publisher - + + + - org.apache.maven.plugins - maven-surefire-plugin - ${maven.surefire.plugin.version} - - ${skipTests} - false - - ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED --illegal-access=permit - - + org.sonarsource.scanner.maven + sonar-maven-plugin + ${maven.sonar.plugin.version} - org.jacoco - jacoco-maven-plugin - ${maven.jacoco.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - ${maven.javadoc.version} - - none - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven.jar.plugin.version} - - - - true - true - - - ${project.name} - ${project.version} - - - - - - org.apache.maven.plugins - maven-war-plugin - ${maven.war.plugin.version} - - - - true - true - - - ${project.name} - ${project.version} - - - + org.springdoc + springdoc-openapi-maven-plugin + ${springdoc.openapi.maven.plugin.version} + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.maven.plugin.version} + true + + ossrh + false + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${java.version} + true + + --enable-preview + + + + org.projectlombok + lombok + ${lombok.version} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.plugin.version} + + ${skipTests} + false + + @{argLine} + --add-modules=ALL-SYSTEM + --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + --add-opens java.base/java.lang.reflect=ALL-UNNAMED + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.util.concurrent=ALL-UNNAMED + --add-opens java.base/java.io=ALL-UNNAMED + --add-opens java.base/java.time=ALL-UNNAMED + --enable-preview + + + + + org.jacoco + jacoco-maven-plugin + ${maven.jacoco.version} + + + **/constant/** + **/config/** + **/dto/** + **/entity/** + **/exception/** + **/repository/** + **/request/** + **/*BootApplication.class + + + + + + prepare-agent + + + + report + prepare-package + + report + + + + jacoco-check + verify + + check + + + + + BUNDLE + + + INSTRUCTION + COVEREDRATIO + ${jacoco.coverage.ratio} + + + LINE + COVEREDRATIO + ${jacoco.coverage.ratio} + + + + + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + true + true + + + ${project.name} + ${project.version} + + + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin.version} + + + attach-sources + + jar-no-fork + + + + org.apache.maven.plugins maven-javadoc-plugin ${maven.javadoc.version} + + + attach-javadocs + + jar + + + - true none + false + false org.apache.maven.plugins - maven-compiler-plugin - ${maven.compiler.version} + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + pl.project13.maven + git-commit-id-plugin + ${git.commit.id.plugin.version} + + + get-the-git-infos + + revision + + validate + + - ${maven.compiler.source} - ${maven.compiler.target} + true + ${project.build.outputDirectory}/git.properties + + ^git.build.(time|version)$ + ^git.commit.id.(abbrev|full)$ + + full + ${project.basedir}/../.git - - maven-deploy-plugin - 2.8.1 - - - default-deploy - deploy - - deploy - - - - - - org.sonatype.central - central-publishing-maven-plugin - ${central.publishing.maven.plugin.version} - true - - ossrh - false - - - - org.apache.maven.plugins - maven-source-plugin - true - 2.2.1 - - - attach-sources - - jar-no-fork - - - - + + org.apache.maven.plugins + maven-deploy-plugin + ${maven.deploy.plugin.version} + + + true + + + + - - org.apache.maven.plugins - maven-javadoc-plugin - 3.2.0 - - - attach-javadocs - - jar - - - - - none - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - pl.project13.maven - git-commit-id-plugin - 3.0.1 - - - get-the-git-infos - - revision - - validate - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - ${project.basedir}/.git - - - - - - scm:git:git://github.com/mosip/audit-manager.git - scm:git:ssh://github.com:mosip/audit-manager.git - https://github.com/mosip/audit-manager - HEAD - - - - MPL 2.0 - https://www.mozilla.org/en-US/MPL/2.0/ - - - - - mosip - mosip.emailnotifier@gmail.com - MOSIP - https://www.mosip.io - - sonar @@ -295,7 +472,6 @@ org.sonarsource.scanner.maven sonar-maven-plugin - ${maven.sonar.plugin.version} verify @@ -309,4 +485,42 @@ - + + + + ossrh + Central Snapshots + https://central.sonatype.com/repository/maven-snapshots/ + + false + + + true + + + + + + + MPL 2.0 + https://www.mozilla.org/en-US/MPL/2.0/ + repo + + + + + scm:git:git://github.com/mosip/audit-manager.git + scm:git:ssh://github.com:mosip/audit-manager.git + https://github.com/mosip/audit-manager + HEAD + + + + + MOSIP + mosip.emailnotifier@gmail.com + io.mosip + https://github.com/mosip/audit-manager + + + diff --git a/licenses/BSD-3-Clause-No-Nuclear-License.txt b/licenses/BSD-3-Clause-No-Nuclear-License.txt new file mode 100644 index 00000000..07786caf --- /dev/null +++ b/licenses/BSD-3-Clause-No-Nuclear-License.txt @@ -0,0 +1,15 @@ +BSD-3-Clause-No-Nuclear-License +----------------------------------- +Copyright © 2005 Sun Microsystems, Inc. All Rights Reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + + * Redistribution of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + + * Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + + * Neither the name of Sun Microsystems, Inc. or the names of contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +This software is provided "AS IS," without a warranty of any kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +You acknowledge that this software is not designed, licensed or intended for use in the design, construction, operation or maintenance of any nuclear facility. diff --git a/licenses/EDL-1.0.txt b/licenses/EDL-1.0.txt new file mode 100644 index 00000000..37d5c04a --- /dev/null +++ b/licenses/EDL-1.0.txt @@ -0,0 +1,30 @@ +Eclipse Distribution License - v 1.0 + +Copyright (c) 2007, Eclipse Foundation, Inc. and its licensors. + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Eclipse Foundation, Inc. nor the names of its + contributors may be used to endorse or promote products derived from this + software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/licenses/NOTICE b/licenses/NOTICE index c180178a..a25ddec7 100644 --- a/licenses/NOTICE +++ b/licenses/NOTICE @@ -1,124 +1,5 @@ -================================================================================ -COPYRIGHT NOTICES -================================================================================ - -This file contains the copyright notices and license information for all -third-party packages used in this project. Each package's copyright holder, -year range, and license terms are listed below. - -================================================================================ -1. COPYLEFT LICENSES (GNU LGPL-3.0) -================================================================================ - -Git Commit ID Maven Plugin (pl.project13.maven:git-commit-id-plugin) -Version: 3.0.1 -Copyright (C) 2013-present Konrad Malawski (ktoso) -License: GNU Lesser General Public License v3.0 (LGPL-3.0-only) -Full License: https://www.gnu.org/licenses/lgpl-3.0.html - -Sonar Maven Plugin (org.sonarsource.scanner.maven:sonar-maven-plugin) -Version: 3.7.0.1746 -Copyright (C) 2011-present SonarSource SA -License: GNU Lesser General Public License v3.0 (LGPL-3.0-only) -Full License: https://www.gnu.org/licenses/lgpl-3.0.html - -================================================================================ -2. ECLIPSE PUBLIC LICENSE (EPL) -================================================================================ - -JUnit 4 (junit:junit) -Copyright (c) 2002-2023 JUnit Contributors. All rights reserved. -License: Eclipse Public License 1.0 (EPL-1.0) -Full License: http://www.eclipse.org/legal/epl-v10.html - -JaCoCo Maven Plugin (org.jacoco:jacoco-maven-plugin) -Version: 0.8.5, 0.8.11 -Copyright (c) 2009, 2023 Mountainminds GmbH & Co. KG and Contributors -License: Eclipse Public License 2.0 (EPL-2.0) -Full License: https://www.eclipse.org/legal/epl-2.0/ - -Jakarta Servlet API (jakarta.servlet:jakarta.servlet-api) -Copyright (c) 2017-present Eclipse Foundation and Contributors -License: Eclipse Public License 2.0 (EPL-2.0) -Full License: https://www.eclipse.org/legal/epl-2.0/ - -================================================================================ -3. APACHE LICENSE 2.0 -================================================================================ - -Spring Boot & Spring Framework -Copyright (c) 2002-2024 VMware, Inc. (formerly Pivotal) -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -Apache Maven Plugins (multiple plugins) -Copyright 2001-2023 The Apache Software Foundation -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -Jackson (com.fasterxml.jackson.datatype:jackson-datatype-jsr310) -Copyright (c) 2007-2022 FasterXML. All rights reserved. -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -ModelMapper (org.modelmapper:modelmapper) -Copyright 2011 the original author or authors -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -SpringDoc OpenAPI -Copyright 2019-2023 the original author or authors -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -Central Publishing Maven Plugin -Copyright (c) 2022-present Sonatype, Inc. -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -Log4j API (org.apache.logging.log4j:log4j-api) -Copyright 2012-present The Apache Software Foundation -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -JSON Simple (com.googlecode.json-simple:json-simple) -Copyright 2006-2012 Yidong Fang -License: Apache License 2.0 -Full License: http://www.apache.org/licenses/LICENSE-2.0 - -================================================================================ -4. BSD LICENSE -================================================================================ - -PostgreSQL JDBC Driver (org.postgresql:postgresql) -Copyright (c) 1997-present, PostgreSQL Global Development Group -All rights reserved. -License: BSD 2-Clause License -Full License: https://jdbc.postgresql.org/about/license.html - -================================================================================ -5. MIT LICENSE -================================================================================ - -SLF4J API (org.slf4j:slf4j-api) -Copyright (c) 2004-2025 QOS.ch. All rights reserved. -License: MIT License -Full License: https://www.slf4j.org/license.html - -================================================================================ -6. MOZILLA/ECLIPSE DUAL LICENSE -================================================================================ - -H2 Database Engine (com.h2database:h2) -Copyright (c) 2004-present Thomas Mueller and Contributors -License: Mozilla Public License 2.0 (MPL-2.0) OR Eclipse Public License 1.0 (EPL-1.0) -Full License: https://h2database.com/html/license.html - -MOSIP Kernel (io.mosip.kernel:*) -Copyright (c) 2018-present MOSIP Contributors -License: Mozilla Public License 2.0 (MPL-2.0) -Full License: https://mozilla.org/MPL/2.0/ - -================================================================================ -END OF COPYRIGHT NOTICES -================================================================================ +See ../NOTICE for the full third-party attribution and license matrix. +Versions match kernel/pom.xml (Spring Boot 4.1.1, Spring Cloud 2025.1.3, +no kernel-bom; checked Maven Central 2026-09-25). +Full license texts are in this directory (Apache-2.0, MPL-2.0, MIT, EPL-1.0, +EPL-2.0, EDL-1.0, PostgreSQL, BSD-3-Clause-No-Nuclear). diff --git "a/licenses/PostgreSQL.txt\342\200\216" b/licenses/PostgreSQL.txt similarity index 100% rename from "licenses/PostgreSQL.txt\342\200\216" rename to licenses/PostgreSQL.txt From 8856e9b5b46ee7c9c64599ecd6b9e69a58bdb7f1 Mon Sep 17 00:00:00 2001 From: JanardhanBS-SyncByte Date: Fri, 25 Sep 2026 15:07:55 +0530 Subject: [PATCH 2/4] [issue-1633] project/version required Signed-off-by: JanardhanBS-SyncByte --- kernel/kernel-auditmanager-api/pom.xml | 1 + kernel/kernel-auditmanager-service/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/kernel/kernel-auditmanager-api/pom.xml b/kernel/kernel-auditmanager-api/pom.xml index 46d5871e..89edacec 100644 --- a/kernel/kernel-auditmanager-api/pom.xml +++ b/kernel/kernel-auditmanager-api/pom.xml @@ -11,6 +11,7 @@ kernel-auditmanager-api + 1.4.1-SNAPSHOT kernel-auditmanager-api Embeddable MOSIP audit library: JPA entity (audit.app_audit_log), AuditRepository, diff --git a/kernel/kernel-auditmanager-service/pom.xml b/kernel/kernel-auditmanager-service/pom.xml index 3e98dd67..1a5e3c7d 100644 --- a/kernel/kernel-auditmanager-service/pom.xml +++ b/kernel/kernel-auditmanager-service/pom.xml @@ -11,6 +11,7 @@ kernel-auditmanager-service + 1.4.1-SNAPSHOT kernel-auditmanager-service Runnable MOSIP Audit Manager Spring Boot service. Exposes POST /v1/auditmanager/audits From 46d1bffce518d2dbce8bbdb1735d74132dae77ec Mon Sep 17 00:00:00 2001 From: JanardhanBS-SyncByte Date: Fri, 25 Sep 2026 15:15:20 +0530 Subject: [PATCH 3/4] [issue-1633] Signed-off-by: JanardhanBS-SyncByte --- .github/workflows/push-trigger.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/push-trigger.yml b/.github/workflows/push-trigger.yml index 67a24356..38eb1b24 100644 --- a/.github/workflows/push-trigger.yml +++ b/.github/workflows/push-trigger.yml @@ -28,6 +28,8 @@ jobs: with: SERVICE_LOCATION: ./kernel/ BUILD_ARTIFACT: kernel-auditmanager-service + # Boot 4 ZIP layout JARs are not +x; kattu only zips -executable unless listed here. + MAVEN_NON_EXEC_ARTIFACTS: kernel-auditmanager-service secrets: OSSRH_USER: ${{ secrets.OSSRH_USER }} OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} From 2ee434f7d2f28a587ea4ca8fddc4a25ee512817c Mon Sep 17 00:00:00 2001 From: JanardhanBS-SyncByte Date: Fri, 25 Sep 2026 17:34:49 +0530 Subject: [PATCH 4/4] [issue-1633] comment changes Signed-off-by: JanardhanBS-SyncByte --- README.md | 2 +- kernel/AGENTS.md | 2 +- kernel/kernel-auditmanager-api/pom.xml | 2 +- kernel/kernel-auditmanager-service/Dockerfile | 2 +- kernel/kernel-auditmanager-service/pom.xml | 4 ++-- .../kernel/auditmanager/AuditManagerBootApplication.java | 2 +- kernel/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0ff089fe..545996a8 100644 --- a/README.md +++ b/README.md @@ -170,7 +170,7 @@ docker build -t kernel-auditmanager-service . Helm: [`helm/auditmanager/`](helm/auditmanager/). Install helper: [`deploy/install.sh`](deploy/). -Runtime env (container): `active_profile_env`, `spring_config_label_env`, `spring_config_url_env`, `loader_path_env` (optional extras). `kernel-auth-adapter` **1.4.1-SNAPSHOT** is bundled in the Boot fat JAR from Maven (no `configure_start.sh` / `iam_adapter_url_env` wget). +Runtime env (container): `active_profile_env`, `spring_config_label_env`, `spring_config_url_env`, `loader_path_env` (optional extras). `kernel-auth-adapter` is bundled in the Boot fat JAR from Maven (no `configure_start.sh` / `iam_adapter_url_env` wget). --- diff --git a/kernel/AGENTS.md b/kernel/AGENTS.md index f508a56d..f223e116 100644 --- a/kernel/AGENTS.md +++ b/kernel/AGENTS.md @@ -27,7 +27,7 @@ POST /audits → Controller → ServiceImpl → AuditHandlerImpl rules ├─ siblings omit (DM in parent) ├─ spring-boot-jackson2 · ban kernel-bom · ban kernel-logger-logback -├─ security: auth-adapter in fat JAR (Maven 1.4.1-SNAPSHOT) · TestSecurityConfig permitAll (tests) +├─ security: auth-adapter in fat JAR · TestSecurityConfig permitAll (tests) ├─ db: prod=PostgreSQL ddl-auto=none · local|test=H2 schema AUDIT └─ jacoco=100% excl constant/config/dto/entity/exception/repository/*BootApplication ``` diff --git a/kernel/kernel-auditmanager-api/pom.xml b/kernel/kernel-auditmanager-api/pom.xml index 89edacec..2673a7a0 100644 --- a/kernel/kernel-auditmanager-api/pom.xml +++ b/kernel/kernel-auditmanager-api/pom.xml @@ -18,7 +18,7 @@ AuditRequestDto / AuditRequestBuilder, AuditUtils validation, and AuditHandlerImpl (persists validated events). Consume from other MOSIP services for in-process auditing, or transitively via kernel-auditmanager-service. JDK 21, Spring Boot 4.1.1, no kernel-bom. - Depends on kernel-core 1.4.1-SNAPSHOT. + Depends on kernel-core. https://github.com/mosip/audit-manager diff --git a/kernel/kernel-auditmanager-service/Dockerfile b/kernel/kernel-auditmanager-service/Dockerfile index 83431f8f..2842ace1 100644 --- a/kernel/kernel-auditmanager-service/Dockerfile +++ b/kernel/kernel-auditmanager-service/Dockerfile @@ -29,7 +29,7 @@ ENV active_profile_env=${active_profile} \ WORKDIR ${work_dir} -# Create user (no wget — kernel-auth-adapter 1.4.1-SNAPSHOT comes from the Maven fat JAR) +# Create user (no wget — kernel-auth-adapter comes from the Maven fat JAR) RUN apk -q update \ && apk add -q --no-cache bash \ && addgroup -g ${container_user_gid} ${container_user_group} \ diff --git a/kernel/kernel-auditmanager-service/pom.xml b/kernel/kernel-auditmanager-service/pom.xml index 2f58f274..76a033ef 100644 --- a/kernel/kernel-auditmanager-service/pom.xml +++ b/kernel/kernel-auditmanager-service/pom.xml @@ -17,7 +17,7 @@ Runnable MOSIP Audit Manager Spring Boot service. Exposes POST /v1/auditmanager/audits (RequestWrapper<AuditRequestDto> → ResponseWrapper<AuditResponseDto>), validates via kernel-auditmanager-api, persists to audit.app_audit_log (PostgreSQL / H2 local). - Auth via kernel-auth-adapter 1.4.1-SNAPSHOT (bundled in Boot fat JAR). JDK 21, Boot 4.1.1, Cloud 2025.1.3, + Auth via kernel-auth-adapter (bundled in Boot fat JAR). JDK 21, Boot 4.1.1, Cloud 2025.1.3, springdoc 3.1.1, Jackson 2 via spring-boot-jackson2. https://github.com/mosip/audit-manager @@ -55,7 +55,7 @@ kernel-auditmanager-api diff --git a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java index 0b7d4c23..16745730 100644 --- a/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java +++ b/kernel/kernel-auditmanager-service/src/main/java/io/mosip/kernel/auditmanager/AuditManagerBootApplication.java @@ -12,7 +12,7 @@ * *

* Security is provided by {@code kernel-auth-adapter} (Bearer tokens) on the - * application classpath (Maven 1.4.1-SNAPSHOT in the Boot fat JAR). Unused + * application classpath (Maven dependency in the Boot fat JAR). Unused * kernel-core generators/validators are excluded. *

* diff --git a/kernel/pom.xml b/kernel/pom.xml index 6aea0961..469386b5 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -121,7 +121,7 @@ ${kernel.core.version}