Skip to content

Commit 0a2a802

Browse files
Kbayeroelmilan06ylladaAlexSanchez-bitJocLRojas
authored
Release/v11.2.7 (#2040)
* feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation # Conflicts: # frontend/src/environments/environment.ts * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: Add new ControlConfig creation component for SQL‑based compliance evaluation * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: add compliance control and query configuration tables with related DTOs and mappers * feat: enhance compliance control configuration with section mapping and DTO updates * feat: Revert unnecessary changes * feat: enhance compliance control configuration with section mapping and DTO updates * feat: refactor compliance query form and related components for improved layout and usability * feat: implement compliance orchestrator backend client and evaluation logic * feat: implement compliance orchestrator backend client and evaluation logic * feat: implement compliance orchestrator backend client and evaluation logic * feat: provide endpoint for OpenSearch evaluations including latest evaluation calculation per control * feat: implement compliance orchestrator backend client and evaluation logic * feat: provide endpoint for OpenSearch evaluations including latest evaluation calculation per control * feat: refactor compliance evaluation classes and update related mappings * feat: implement compliance orchestrator backend client and evaluation logic * feat: refactor compliance evaluation classes and update related mappings * feat: implement timeline visualization for compliance evaluations with initial chart setup and styling * feat: implement timeline visualization for compliance evaluations with initial chart setup and styling * feat: implement timeline visualization for compliance evaluations * feat: implement timeline visualization for compliance evaluations * feat: implement timeline visualization for compliance evaluations * feat: implement timeline visualization for compliance evaluations * feat: implement timeline visualization for compliance evaluations * feat: enrich compliance evaluation details with rule, rule value, and hits * feat: enhance compliance control evaluation with pagination support * feat: extend control evaluation status with additional states and refine evaluation logic * feat: add evaluation rule and rule value to compliance evaluation DTO and service * feat: include evaluation rule and rule value in query evaluation model and logic * feat: enhance compliance control evaluation with search functionality * feat: update application version file path for consistency * fix: implement sorting logic for compliance evaluations * feat(agent): add native auditd collector for Linux - Implement native auditd collector using go-libaudit v2 with netlink multicast - Add enterprise-ready auditd configuration (50-utmstack.rules) - Respect existing customer audit rules (additive approach) - Add cleanup on agent uninstall (removes UTMStack rules only) - Support automatic auditd installation on Debian/Ubuntu/RHEL/Fedora - Handle migration path for existing auditd installations - Add distro detection for package manager selection - Remove legacy beats/filebeat commented code * feat(filters): add auditd support to linux filter v5.0.0 - Support native auditd collector JSON format (type: auditd) - Map auditd fields to Standard Event Schema: - syscall/category -> action - result -> actionResult - exe/comm -> origin.process - proctitle -> origin.command - subj_user -> origin.user - cwd -> origin.path - exit -> statusCode (cast to int) - Set default severity 'info' for auditd events - Preserve numeric IDs in log.* for correlation rules - Maintain backwards compatibility with journald format * refactor(filters): remove deprecated system_linux_module.yml * fix(filters): adjust auditd event severity handling in linux filter * chore(agent): update version to 11.1.5 * changeset[backend](linux): update linux filter * fix(agent): prevent auditd buffer overflow with backpressure mitigation * fix(agent): reduce auditd log noise with threshold and execve filter - Add 50 event threshold for EventsLost logging (ignore 1-2 event losses) - Filter execve rules to real users only (auid>=1000, auid!=-1) - Simplify EventsLost function * fix(agent): filter false events lost from go-libaudit sequence rollover * feat(agent): expand auditd rules with log tampering and identity files * feat[backend](agent): added shell parameter to agent connection * feat[frontend](agent-console): added shell switch for windows agents (powershell or cmd) * fix[backend](elastic-service): added space verification before removing elastic-index * fix[backend](index-removal): added index verification before removal * fix[backend](index-removal): fixed index state field obtention * fix[backend](index-removal): fixed compilation errors on index removal * changeset[backend](o365_visualization): updated o365 file upload visualization * changeset[backend](o365_visualization): updated o365 file sync downloaded visualization * changeset[backend](o365_visualization): updated o365 visualizations * update windows-events filter * feat[backend](dependencies): updated apache-tika to avoid vulnerable version * feat[backend](dependencies): updated flying-saucer-pdf dependency and removed unneeded itext dependency * fix(installer): enhance post-installation error handling and Docker shutdown for security risks * changeset[backend](windows_filter): updated windows filters * changeset[backend](windows_rules): updated windows rules * feat[frotend](dependencies): updated dependencies for security improves * changeset[backend](windows_rules): updated windows rules data types * fix(installer): security improvements and code cleanup Security fixes: - Use crypto/rand instead of math/rand for secret generation - SELinux set to permissive instead of disabled (RedHat) - PostgreSQL/OpenSearch ports never exposed (use docker exec) - Nginx uses ephemeral key instead of INTERNAL_KEY Code improvements: - Remove unused parameters (GetAdminEmail, ConfigureNginx) - Remove dead code (if true condition) - Fix typo "fisnished" -> "finished" - Simplify PostInstallation (no Docker restart needed) - Remove unused dependencies (lib/pq, grequests) * feat(security): add OpenSearch SSL and authentication support * feat[backend](updated filters and rules): added a initial process to update logtash filters an rules * feat: add endpoint to retrieve latest evaluation by control ID * feat: enhance compliance evaluation mappers to load full Standard object * feat(soc-ai): add multi-provider LLM support and HTTP API for manual analysis - Add support for multiple LLM providers (OpenAI, Anthropic) with URL-based detection - Implement generic authentication via customHeaders configuration - Add HTTP API server on port 8090 for manual alert submission: - POST /api/v1/analyze - Submit alert for async LLM analysis - GET /api/v1/metrics - API request metrics - GET /health - Health check (unauthenticated) - Add X-Internal-Key authentication middleware for protected endpoints - Add AutoAnalyze config flag to enable/disable automatic processing - Add AnthropicRequest/Response schema types for Claude API format - Add ANTHROPIC_API_VERSION constant for required header - Clean up unused constants (GPT_API_ENDPOINT, AllowedGPTModels) - Fix silent JSON parsing errors with proper logging * feat(backend): add filters and rules to backend docker image * fix(backend): update OpenSearch connection to use HTTPS with authentication * feat(panel): add manual alert analysis endpoint with SSL support * fix(backend): use analyzeAlert method in UtmAlertServiceImpl * feat[backend](updated filters and rules): added initial load service * feat[backend](updated filters and rules): added initial load service * feat[backend](updated filters and rules): forced systemOwnedMode on rules and filters insertion in initial update * feat[backend](updated filters and rules): added removed rules and filters routines * feat[backend](updated filters and rules): forced filters adn rules to follow id convention of system owned rules/filters * feat[backend](updated filters and rules): set null to invalid module name rules * changeset[backend](socai): updated socai integration guide configuration * fix[frontend](integration-guide): fixed cisco asa and firepower commands * fix[backend](cypherUtil): make key|iv derivation be local instead of static * fix: correct query parameter for search * fix: Corrected incorrect behavior in filtering * fix: update sorting direction for compliance evaluations * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * feat: add print view for compliance evaluations with detailed report * fix[backend](healthcheck): removed springboot healthcheck to allow custom opensearch client to be used * fix[backend](initial-setup): improved filter insertion on system load * fix[backend](initial-setup): improved filter deletion on initial setup * changeset[backend](data-types,modules): seeded data type - module relation * fix[backend](initial-setup): improved error handling on failed to insert filter * fix[backend](initial-setup): fixed filter index error * fix[backend](initial-setup):added RuleYml to parse rules yml * fix[backend](rules): fixed rules definitions * feat[backend](log_events): added logs on every system admin operation * fix[rules]: remove unused rules * fix[baclend]: solve sintax problems in rules * fix[backend]: solved problem with merge * fix[backend](serialization): add @JsonIgnore to UtmModule lazy collections to prevent HttpMessageNotWritableException * fix[agent-manager](security): prevent SQL injection in filters, add constant-time key comparison, fix cache race condition, and add command timeout * feat[backend,frontend](incident-response): add shell selection for Windows agents, fix flow agent loading, enforce alert name in triggers, and rename default to dedicated agent * fix[frontend](soar): remove legacy automation route and update audit link to use flow editor * refactor(plugins): replace config polling with channel-based configuration updates across cloud integration plugins (AWS, Azure, GCP, O365, Sophos) * feat[soc-ai]: improve soc-ai integration * fix[backend,frontend,plugins](integrations): mask sensitive config values, improve validation error messages per provider, and prevent double-encryption * fix[frontend](integrations): only clear saved tenant changes instead of all pending changes * fix(modules-config): prevent single plugin failure from blocking all sync * fix[backend,frontend]: add missing Constants import and remove duplicate variable declaration * feat: refactor OpenSearch integration with new connection model * feat: rename compliance configuration changelogs * fix: correct standardId binding in compliance control create component * fix[frontend](alert-selection): improved selection/remove alert condition on table * fix[modules-config](socai): fixed providers configuration * fix[frontend](socai_module_config): fixed saving state handling * feat[modules-config](socai): generalized socai connection check and validations * feat: trigger initial scheduler dispatch when backend configs are present * fix[frontend](alert-selection): improved selection/remove alert condition on table * fix[modules-config](socai): fixed providers configuration * fix[frontend](socai_module_config): fixed saving state handling * feat[modules-config](socai): generalized socai connection check and validations * fix[frontend](socai_alert_analyze): updated loading status inmediately after request is maded * refactor(modules-config): improve resilience and code organization Add resilient module synchronization: - Implement periodic retry mechanism (5-minute interval) - Add StartPeriodicRetry for automatic recovery * feat: rename compliance configuration changelogs * fix[modules-config](socai): trimmend config values to avoid false positive on config verification * fix[modules-config](socai): send model on test request to avoid wrong model false positive * fix[modules-config](socai): add little message on model test to manage wrong models and wronk api keys on the request * fix[modules-config](socai): manage gemini test response correctly * fix[frontend](tooltips): moved tooltip position to body so they can be showed above any other copmonent * fix[frontend](alert-popup): fixed alert popup position * fix[backend](socai_model): removed model invalidation on custom provider * fix[frontend](socai-analysis): fixed wait status on socai alert analysis * fix[frontend](linux): fixed linux agent name on integration guides * fix[frontend](socai): selected currently configured provider once its setted up * fix[backend](modules_config): removed json ignore and desencryption on event manager communication * fix[backend](modules_config): removed decryption on config validation * chore[](v11-pipeline): temporary remove v11 windows agent singing from actions * ci: unify agent signing into reusable workflow (Windows KMS + macOS) * fix(ci): remove invalid --version check on jsign download * fix(ci): drop osslsigncode verify step from Windows signing * feat[backend](modules-config): removed decryption type in all comunications with modules config service * fix[backend](modules_config): setted get operations as readonly transactions * feat(modules-config): add logging and decryption support * chore(modules-config): improve error context in decryption failures * fix[modules-config](socai): make model verification on openai come on the asbtract base validator * fix[frontend](alerts): added a sockai error on alert analization * fix[backend](modules_config): remove socai.model filtration on modules config sent * fix[backend](modules_config): remove socai from non removable config modules list * deleted: removed rootkit_files_detection rule from linux * deleted: removed suspicious_managedcode_host_process rule from windows * deleted: the suspect_managedcode_host_process and rootkit_files_detection rules were removed from windows and linux respectively --------- Co-authored-by: Elena Lopez Milan <elopez@utmstack.com> Co-authored-by: Yadian Llada Lopez <yadian.llada@gmail.com> Co-authored-by: AlexSanchez-bit <sanchez.saez.alex01@gmail.com> Co-authored-by: JocLRojas <joc.l.rojas02@gmail.com> Co-authored-by: Osmany Montero <osmontero@icloud.com> Co-authored-by: Alex Sánchez <alex.sanchez@utmstack.com>
1 parent a3c5564 commit 0a2a802

31 files changed

Lines changed: 643 additions & 324 deletions

File tree

Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
name: "Reusable: Sign Agent Binaries"
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
os:
7+
required: true
8+
type: string
9+
description: "Target OS to sign for: 'windows' or 'macos'"
10+
artifact_name:
11+
required: true
12+
type: string
13+
description: "Name of the artifact (uploaded by a previous job) that contains the unsigned binaries"
14+
binaries:
15+
required: true
16+
type: string
17+
description: |
18+
Newline-separated list of binary paths to sign, relative to the root of the downloaded artifact.
19+
Example:
20+
agent/utmstack_agent_service_windows_amd64.exe
21+
agent/updater/utmstack_updater_service_windows_amd64.exe
22+
signed_artifact_name:
23+
required: false
24+
type: string
25+
default: ""
26+
description: "Name for the output artifact (defaults to <artifact_name>-signed)"
27+
retention_days:
28+
required: false
29+
type: number
30+
default: 1
31+
32+
# ---- Windows / GCP KMS (used only when os=windows) ----
33+
gcp_project_id:
34+
required: false
35+
type: string
36+
default: ""
37+
kms_location:
38+
required: false
39+
type: string
40+
default: "global"
41+
kms_keyring:
42+
required: false
43+
type: string
44+
default: ""
45+
kms_key:
46+
required: false
47+
type: string
48+
default: ""
49+
cert_chain_path:
50+
required: false
51+
type: string
52+
default: ".github/certs/codesign-chain.pem"
53+
description: "Path (in the repo) to the PEM cert chain used by jsign"
54+
jsign_version:
55+
required: false
56+
type: string
57+
default: "7.0"
58+
sign_name:
59+
required: false
60+
type: string
61+
default: "UTMStack Agent"
62+
sign_url:
63+
required: false
64+
type: string
65+
default: "https://utmstack.com"
66+
tsa_url:
67+
required: false
68+
type: string
69+
default: "http://timestamp.sectigo.com"
70+
71+
secrets:
72+
# Windows
73+
GCP_WINDOWS_SIGNER_SA_KEY:
74+
required: false
75+
WINDOWS_SIGNER_CERT_CHAIN_PEM:
76+
required: false
77+
description: "Full PEM cert chain content. When set, overrides cert_chain_path."
78+
# macOS
79+
APPLE_CERTIFICATE_BASE64:
80+
required: false
81+
APPLE_CERTIFICATE_PASSWORD:
82+
required: false
83+
APPLE_SIGNING_IDENTITY:
84+
required: false
85+
APPLE_ID:
86+
required: false
87+
APPLE_APP_PASSWORD:
88+
required: false
89+
APPLE_TEAM_ID:
90+
required: false
91+
92+
jobs:
93+
sign:
94+
name: Sign ${{ inputs.os }} binaries
95+
runs-on: ${{ inputs.os == 'windows' && 'ubuntu-latest' || 'macos-latest' }}
96+
permissions:
97+
contents: read
98+
id-token: write
99+
100+
steps:
101+
- name: Checkout (for cert chain)
102+
if: inputs.os == 'windows'
103+
uses: actions/checkout@v4
104+
105+
- name: Download unsigned binaries
106+
uses: actions/download-artifact@v4
107+
with:
108+
name: ${{ inputs.artifact_name }}
109+
path: ./unsigned
110+
111+
# =========================================================
112+
# Windows path: jsign + GCP KMS
113+
# =========================================================
114+
- name: Authenticate to Google Cloud
115+
if: inputs.os == 'windows'
116+
uses: google-github-actions/auth@v2
117+
with:
118+
credentials_json: ${{ secrets.GCP_WINDOWS_SIGNER_SA_KEY }}
119+
120+
- name: Set up gcloud
121+
if: inputs.os == 'windows'
122+
uses: google-github-actions/setup-gcloud@v2
123+
124+
- name: Set up Java (for jsign)
125+
if: inputs.os == 'windows'
126+
uses: actions/setup-java@v4
127+
with:
128+
distribution: temurin
129+
java-version: '17'
130+
131+
- name: Download jsign
132+
if: inputs.os == 'windows'
133+
env:
134+
JSIGN_VERSION: ${{ inputs.jsign_version }}
135+
run: |
136+
curl -fsSL -o jsign.jar \
137+
"https://github.com/ebourg/jsign/releases/download/${JSIGN_VERSION}/jsign-${JSIGN_VERSION}.jar"
138+
139+
- name: Prepare cert chain
140+
if: inputs.os == 'windows'
141+
env:
142+
CHAIN_SECRET: ${{ secrets.WINDOWS_SIGNER_CERT_CHAIN_PEM }}
143+
CHAIN_REPO_PATH: ${{ inputs.cert_chain_path }}
144+
run: |
145+
set -euo pipefail
146+
OUT="${RUNNER_TEMP}/codesign-chain.pem"
147+
if [ -n "$CHAIN_SECRET" ]; then
148+
echo "→ Using cert chain from secret"
149+
printf '%s\n' "$CHAIN_SECRET" > "$OUT"
150+
elif [ -f "$CHAIN_REPO_PATH" ]; then
151+
echo "→ Using cert chain from repo: $CHAIN_REPO_PATH"
152+
cp "$CHAIN_REPO_PATH" "$OUT"
153+
else
154+
echo "::error::No cert chain available. Set WINDOWS_SIGNER_CERT_CHAIN_PEM secret or commit a chain at ${CHAIN_REPO_PATH}"
155+
exit 1
156+
fi
157+
echo "CERT_CHAIN_FILE=${OUT}" >> "$GITHUB_ENV"
158+
159+
- name: Sign Windows binaries
160+
if: inputs.os == 'windows'
161+
env:
162+
PROJECT_ID: ${{ inputs.gcp_project_id }}
163+
KEYRING_LOCATION: ${{ inputs.kms_location }}
164+
KEYRING_NAME: ${{ inputs.kms_keyring }}
165+
KEY_NAME: ${{ inputs.kms_key }}
166+
SIGN_NAME: ${{ inputs.sign_name }}
167+
SIGN_URL: ${{ inputs.sign_url }}
168+
TSA_URL: ${{ inputs.tsa_url }}
169+
BINARIES: ${{ inputs.binaries }}
170+
run: |
171+
set -euo pipefail
172+
173+
TOKEN=$(gcloud auth print-access-token)
174+
KEYSTORE="projects/${PROJECT_ID}/locations/${KEYRING_LOCATION}/keyRings/${KEYRING_NAME}"
175+
176+
while IFS= read -r raw; do
177+
bin=$(echo "$raw" | xargs)
178+
[ -z "$bin" ] && continue
179+
target="./unsigned/${bin}"
180+
echo "→ Signing ${target}"
181+
ls -la "$target"
182+
183+
java -jar jsign.jar \
184+
--storetype GOOGLECLOUD \
185+
--storepass "$TOKEN" \
186+
--keystore "$KEYSTORE" \
187+
--alias "$KEY_NAME" \
188+
--certfile "$CERT_CHAIN_FILE" \
189+
--tsaurl "$TSA_URL" \
190+
--tsmode RFC3161 \
191+
--name "$SIGN_NAME" \
192+
--url "$SIGN_URL" \
193+
"$target"
194+
195+
echo "✓ Signed ${target}"
196+
done <<< "$BINARIES"
197+
198+
# =========================================================
199+
# macOS path: codesign + notarytool
200+
# =========================================================
201+
- name: Install Apple certificate
202+
if: inputs.os == 'macos'
203+
env:
204+
CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE_BASE64 }}
205+
CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
206+
run: |
207+
set -euo pipefail
208+
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
209+
KEYCHAIN_PASSWORD=$(openssl rand -base64 32)
210+
211+
security create-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
212+
security set-keychain-settings -lut 21600 "$KEYCHAIN_PATH"
213+
security unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
214+
215+
echo "$CERTIFICATE_BASE64" | base64 --decode > "$RUNNER_TEMP/certificate.p12"
216+
security import "$RUNNER_TEMP/certificate.p12" -P "$CERTIFICATE_PASSWORD" \
217+
-A -t cert -f pkcs12 -k "$KEYCHAIN_PATH"
218+
security list-keychain -d user -s "$KEYCHAIN_PATH"
219+
220+
security set-key-partition-list -S apple-tool:,apple:,codesign: \
221+
-s -k "$KEYCHAIN_PASSWORD" "$KEYCHAIN_PATH"
222+
223+
- name: Sign macOS binaries
224+
if: inputs.os == 'macos'
225+
env:
226+
SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
227+
BINARIES: ${{ inputs.binaries }}
228+
run: |
229+
set -euo pipefail
230+
while IFS= read -r raw; do
231+
bin=$(echo "$raw" | xargs)
232+
[ -z "$bin" ] && continue
233+
target="./unsigned/${bin}"
234+
echo "→ Signing ${target}"
235+
codesign --force --options runtime \
236+
--sign "$SIGNING_IDENTITY" \
237+
--timestamp \
238+
"$target"
239+
done <<< "$BINARIES"
240+
241+
- name: Notarize macOS binaries
242+
if: inputs.os == 'macos'
243+
env:
244+
APPLE_ID: ${{ secrets.APPLE_ID }}
245+
APPLE_APP_PASSWORD: ${{ secrets.APPLE_APP_PASSWORD }}
246+
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
247+
BINARIES: ${{ inputs.binaries }}
248+
run: |
249+
set -euo pipefail
250+
while IFS= read -r raw; do
251+
bin=$(echo "$raw" | xargs)
252+
[ -z "$bin" ] && continue
253+
target="./unsigned/${bin}"
254+
zip_path="${target}.notarize.zip"
255+
echo "→ Notarizing ${target}"
256+
( cd "$(dirname "$target")" && zip "$(basename "$target").notarize.zip" "$(basename "$target")" )
257+
258+
xcrun notarytool submit "$zip_path" \
259+
--apple-id "$APPLE_ID" \
260+
--password "$APPLE_APP_PASSWORD" \
261+
--team-id "$APPLE_TEAM_ID" \
262+
--wait
263+
264+
rm -f "$zip_path"
265+
echo "✓ Notarized ${target}"
266+
done <<< "$BINARIES"
267+
268+
# =========================================================
269+
# Upload signed binaries
270+
# =========================================================
271+
- name: Compute signed artifact name
272+
id: artifact
273+
env:
274+
OVERRIDE: ${{ inputs.signed_artifact_name }}
275+
DEFAULT: ${{ inputs.artifact_name }}-signed
276+
run: |
277+
if [ -n "$OVERRIDE" ]; then
278+
echo "name=$OVERRIDE" >> "$GITHUB_OUTPUT"
279+
else
280+
echo "name=$DEFAULT" >> "$GITHUB_OUTPUT"
281+
fi
282+
283+
- name: Upload signed binaries
284+
uses: actions/upload-artifact@v4
285+
with:
286+
name: ${{ steps.artifact.outputs.name }}
287+
path: ./unsigned/
288+
retention-days: ${{ inputs.retention_days }}
289+
if-no-files-found: error

0 commit comments

Comments
 (0)