Compare commits

..

18 Commits

Author SHA1 Message Date
stirlingbot[bot]
7eb7774979 🌐 Sync Translations + Update README Progress Table + Update Verification Metadata (#2786)
### Description of Changes

This Pull Request was automatically generated to synchronize updates to
translation files, verification metadata, and documentation. Below are
the details of the changes made:

#### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes
in the reference file `messages_en_GB.properties`.
- Ensured consistency and synchronization across all supported language
files.
- Highlighted any missing or incomplete translations.

#### **2. Update README.md**
- Generated the translation progress table in `README.md`.
- Added a summary of the current translation status for all supported
languages.
- Included up-to-date statistics on translation coverage.

#### **3. Verification Metadata Updates**
- Generated or refreshed the `verification-keyring.keys` and
`verification-metadata.xml` files.
- Included the latest dependency signatures and checksums to enhance the
build's integrity.

#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.
- Strengthens dependency verification for a more secure build process.

---

Auto-generated by [create-pull-request][1].

[1]: https://github.com/peter-evans/create-pull-request

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-01-26 13:23:13 +00:00
stirlingbot[bot]
10158fa408 Update 3rd Party Licenses (#2788)
Auto-generated by StirlingBot

Signed-off-by: stirlingbot[bot] <1113334+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-01-26 13:18:17 +00:00
Anthony Stirling
dab6613f1b Test cleanup, JVM GC and api (#2787)
# Description of Changes

Please provide a summary of the changes, including:

- What was changed
- Why the change was made
- Any challenges encountered

Closes #(issue_number)

---

## Checklist

### General

- [ ] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [ ] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [ ] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.

---------

Co-authored-by: a <a>
2025-01-26 13:10:16 +00:00
Ludy
1d016df92e Fix: test failure on pull request from dependabot (#2783)
# Description of Changes

This PR is the first step for improving `Generate verification metadata`

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [ ] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-01-25 14:06:45 +00:00
stirlingbot[bot]
0631e3071c 📝 Sync translation files + Update README.md (Translation Progress Table) (#2774)
#### Description

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. The changes include:

1. **Synchronization of Translation Files:**
- Updated content based on the latest changes in
`messages_en_GB.properties`.
- Ensured consistency between all language files and the reference file.

2. **Update README.md:**
  - Generated the translation progress table.
- Displayed the current status of translations for all supported
languages.

---
Auto-generated by [create-pull-request][1]

[1]: https://github.com/peter-evans/create-pull-request

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-01-23 08:21:25 +00:00
Thomas BERNARD
ba1b4b502c Fix fr messages (#2773)
# Description of Changes

add some missing French translations

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [x] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [ ] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [ ] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-01-22 23:43:03 +00:00
Ludy
7865bf720f Security: file name restriction (#2768)
# Description of Changes

This PR updates the `check_properties.yml` workflow to refine the
file-matching regex for properties files.

### **What was changed:**
- Modified the regex used in two locations:
  1. In the GitHub CLI (`gh`) command to filter changed files:
     ```diff
     - '^src/main/resources/messages_[a-zA-Z_]+\.properties$'
+
'^src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$'
     ```
  2. In the code to match relevant property files:
     ```diff
     - /^src\/main\/resources\/messages_[a-zA-Z_]+\.properties$/
+
/^src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/
     ```

### **Why the change was made:**
- The previous regex matched any property files with loosely defined
patterns, including invalid or unintended formats.
- The updated regex ensures stricter matching of valid locale patterns:
  - Locale codes in the format `xx_XX` where:
    - `xx` represents a 2-character language code.
    - `XX` represents a 2-7 character region code.

### **Challenges encountered:**
- Ensuring compatibility across both the GitHub CLI command.
- Avoiding edge cases where valid property files might be excluded
unintentionally.

Closes # (issue_number)

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [x] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-01-22 10:41:34 +00:00
stirlingbot[bot]
06abc82fbc 📝 Sync translation files + Update README.md (Translation Progress Table) (#2770)
#### Description

This Pull Request was automatically generated to synchronize updates to
translation files and documentation. The changes include:

1. **Synchronization of Translation Files:**
- Updated content based on the latest changes in
`messages_en_GB.properties`.
- Ensured consistency between all language files and the reference file.

2. **Update README.md:**
  - Generated the translation progress table.
- Displayed the current status of translations for all supported
languages.

---
Auto-generated by [create-pull-request][1]

[1]: https://github.com/peter-evans/create-pull-request

Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-01-22 10:41:06 +00:00
pixeebot[bot]
3afacf2405 Switch order of literals to prevent NullPointerException (#2769)
This change defensively switches the order of literals in comparison
expressions to ensure that no null pointer exceptions are unexpectedly
thrown. Runtime exceptions especially can cause exceptional and
unexpected code paths to be taken, and this can result in unexpected
behavior.

Both simple vulnerabilities (like information disclosure) and complex
vulnerabilities (like business logic flaws) can take advantage of these
unexpected code paths.

Our changes look something like this:

```diff
  String fieldName = header.getFieldName();
  String fieldValue = header.getFieldValue();
- if(fieldName.equals("requestId")) {
+ if("requestId".equals(fieldName)) {
    logRequest(fieldValue);
  }
```

<details>
  <summary>More reading</summary>

*
[https://cwe.mitre.org/data/definitions/476.html](https://cwe.mitre.org/data/definitions/476.html)
*
[https://en.wikibooks.org/wiki/Java_Programming/Preventing_NullPointerException](https://en.wikibooks.org/wiki/Java_Programming/Preventing_NullPointerException)
*
[https://rules.sonarsource.com/java/RSPEC-1132/](https://rules.sonarsource.com/java/RSPEC-1132/)
</details>

🧚🤖  Powered by Pixeebot  

[Feedback](https://ask.pixee.ai/feedback) |
[Community](https://pixee-community.slack.com/signup#/domain-signup) |
[Docs](https://docs.pixee.ai/) | Codemod ID:
pixee:java/switch-literal-first
![](https://d1zaessa2hpsmj.cloudfront.net/pixel/v1/track?writeKey=2PI43jNm7atYvAuK7rJUz3Kcd6A&event=DRIP_PR%7CStirling-Tools%2FStirling-PDF%7Cc45a84d1797c774f11f1a6a0ccbbd8ee5a208be3)


<!--{"type":"DRIP","codemod":"pixee:java/switch-literal-first"}-->

Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
2025-01-22 10:39:47 +00:00
Peter Dave Hello
ba259a2d8d Update and improve Czech(Česky)(cs_CZ) locale using Claude 3.5 Sonnet (#2748)
Leverage Claude 3.5 Sonnet from Anthropic, a cutting-edge LLM model, to
improve translation outcomes. In #2164, the previous use of Qwen2.5 7b a
smaller and less advanced AI model) was an earlier attempt that may have
resulted in suboptimal quality and user experience. While relying solely
on LLMs for translation is generally not ideal, adopting a more advanced
model like Claude 3.5 allows us to address these earlier limitations and
ensures significantly better results, even for a language I do not
understand.

Furthermore, I also use the powerful frontier OpenAI GPT-4o and Google
Gemini-1.5-Pro for proofreading, and thoroughly examined and verified
line breaks to ensure accuracy and facilitate easier contributions and
improvements by others.
2025-01-22 10:36:09 +00:00
stirlingbot[bot]
45895cd6bf Update 3rd Party Licenses (#2765)
Auto-generated by StirlingBot

Signed-off-by: stirlingbot[bot] <1113334+stirlingbot[bot]@users.noreply.github.com>
Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com>
2025-01-21 14:39:05 +00:00
dependabot[bot]
66d0ad5071 Bump docker/build-push-action from 6.11.0 to 6.12.0 (#2762)
Bumps
[docker/build-push-action](https://github.com/docker/build-push-action)
from 6.11.0 to 6.12.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/docker/build-push-action/releases">docker/build-push-action's
releases</a>.</em></p>
<blockquote>
<h2>v6.12.0</h2>
<ul>
<li>Bump <code>@​docker/actions-toolkit</code> from 0.49.0 to 0.51.0 in
<a
href="https://redirect.github.com/docker/build-push-action/pull/1300">docker/build-push-action#1300</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/docker/build-push-action/compare/v6.11.0...v6.12.0">https://github.com/docker/build-push-action/compare/v6.11.0...v6.12.0</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="67a2d409c0"><code>67a2d40</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/build-push-action/issues/1300">#1300</a>
from docker/dependabot/npm_and_yarn/docker/actions-t...</li>
<li><a
href="0b1b1c9c43"><code>0b1b1c9</code></a>
chore: update generated content</li>
<li><a
href="b6a7c2c4ee"><code>b6a7c2c</code></a>
chore(deps): Bump <code>@​docker/actions-toolkit</code> from 0.49.0 to
0.51.0</li>
<li><a
href="31ca4e5d51"><code>31ca4e5</code></a>
Merge pull request <a
href="https://redirect.github.com/docker/build-push-action/issues/1296">#1296</a>
from crazy-max/bake-v6</li>
<li><a
href="e613db9d5a"><code>e613db9</code></a>
update bake-action to v6</li>
<li>See full diff in <a
href="b32b51a8ed...67a2d409c0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/build-push-action&package-manager=github_actions&previous-version=6.11.0&new-version=6.12.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-21 11:11:18 +00:00
dependabot[bot]
c5ae576541 Bump step-security/harden-runner from 2.10.3 to 2.10.4 (#2761)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps
[step-security/harden-runner](https://github.com/step-security/harden-runner)
from 2.10.3 to 2.10.4.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/step-security/harden-runner/releases">step-security/harden-runner's
releases</a>.</em></p>
<blockquote>
<h2>v2.10.4</h2>
<h2>What's Changed</h2>
<p>Fixed a potential Harden-Runner post step failure that could occur
when printing agent service logs. The fix gracefully handles failures
without failing the post step.</p>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/step-security/harden-runner/compare/v2...v2.10.4">https://github.com/step-security/harden-runner/compare/v2...v2.10.4</a></p>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="cb605e52c2"><code>cb605e5</code></a>
Merge pull request <a
href="https://redirect.github.com/step-security/harden-runner/issues/496">#496</a>
from step-security/fix-enobufs</li>
<li><a
href="61144dda3b"><code>61144dd</code></a>
Update log statement</li>
<li><a
href="b8be370ff4"><code>b8be370</code></a>
Add try catch block</li>
<li><a
href="6f6fa07e47"><code>6f6fa07</code></a>
Fix ENOBUFS issue</li>
<li><a
href="18f6947f13"><code>18f6947</code></a>
Merge pull request <a
href="https://redirect.github.com/step-security/harden-runner/issues/495">#495</a>
from AkhigbeEromo/Update-README</li>
<li><a
href="81f844e743"><code>81f844e</code></a>
Edit docs</li>
<li><a
href="4c766de2db"><code>4c766de</code></a>
Merge branch 'Update-README' of <a
href="https://github.com/AkhigbeEromo/harden-runner">https://github.com/AkhigbeEromo/harden-runner</a>...</li>
<li><a
href="c9c5f3273c"><code>c9c5f32</code></a>
Handle Ashish reviews</li>
<li><a
href="2877824267"><code>2877824</code></a>
Merge branch 'main' into Update-README</li>
<li><a
href="be87de076d"><code>be87de0</code></a>
Clean up</li>
<li>Additional commits viewable in <a
href="c95a14d0e5...cb605e52c2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=step-security/harden-runner&package-manager=github_actions&previous-version=2.10.3&new-version=2.10.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-21 11:11:01 +00:00
dependabot[bot]
2bcdd8cce6 Bump org.springframework:spring-jdbc from 6.2.1 to 6.2.2 (#2760)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps
[org.springframework:spring-jdbc](https://github.com/spring-projects/spring-framework)
from 6.2.1 to 6.2.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/spring-projects/spring-framework/releases">org.springframework:spring-jdbc's
releases</a>.</em></p>
<blockquote>
<h2>v6.2.2</h2>
<h2> New Features</h2>
<ul>
<li>Track only qualifier annotations in <code>BeanOverrideHandler</code>
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34260">#34260</a></li>
<li>Remove <code>@FunctionalInterface</code> declaration from
<code>BeanOverrideProcessor</code> <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34259">#34259</a></li>
<li>Refine default filtered headers for web data binding <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34182">#34182</a></li>
<li>Improve query params in uri KeyValue with HTTP interface client <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34176">#34176</a></li>
<li>Refine location checks for PathResource <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34167">#34167</a></li>
<li>Avoid virtual thread pinning in procedure calling <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34133">#34133</a></li>
<li>Type-level constraint violation should result in ParameterErrors <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34105">#34105</a></li>
<li>Avoid logger serialization behind shared EntityManager proxy <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34084">#34084</a></li>
<li>Improve PathMatcher to PathPatternParser migration in mvc XML
configuration <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34064">#34064</a></li>
<li>Support <code>@MockitoBean</code> at the type level on test classes
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/33925">#33925</a></li>
</ul>
<h2>🐞 Bug Fixes</h2>
<ul>
<li>HttpHeadersAssert#doesNotContainsHeaders has a typo <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34263">#34263</a></li>
<li>Deadlock with background EntityManager bootstrap due to locking in
getSingletonFactoryBeanForTypeCheck <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34247">#34247</a></li>
<li>ApplicationListener no longer invoked for double generic
ApplicationEvent with 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34234">#34234</a></li>
<li>Nested transaction savepoints are broken in SQL Server <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34233">#34233</a></li>
<li>Error handling override in DefaultResponseErrorHandler ignored after
upgrade to 6.2.0 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34231">#34231</a></li>
<li>FileNotFoundException is thrown when using
ConfigurationPropertiesScan with Spring Context 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34216">#34216</a></li>
<li>BindException declared but not handled by ExceptionHandler <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34214">#34214</a></li>
<li><code>@TestBean</code> factory method resolution is incorrect within
class hierarchy <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34204">#34204</a></li>
<li>Bean Override in superclass takes precedence over Bean Override in
subclass <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34194">#34194</a></li>
<li>Ensure <code>AsyncListener#onError</code> does not return until
dispatch completes <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34192">#34192</a></li>
<li>BeanNotOfRequiredTypeException during transaction qualifier
resolution in 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34187">#34187</a></li>
<li>BeanCurrentlyInCreationException is thrown when multiple threads
simultaneously try to create bean <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34186">#34186</a></li>
<li><code>DataBinder</code> throws
<code>IndexOutOfBoundsException</code> when indexed parameter uses
nonconsecutive indices <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34145">#34145</a></li>
<li>NullPointerException is thrown if WebClient is used with Apache
Httpclient and cookies are disabled <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34132">#34132</a></li>
<li>Wrong parentId tracking in FlightRecorderApplicationStartup <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34128">#34128</a></li>
<li>PathMatchingResourcePatternResolver is not able to resolve file in
SpringBoot Packaged JAR <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34126">#34126</a></li>
<li>Placeholder resolution no longer considers exact match before
resolving the placeholder key <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34124">#34124</a></li>
<li><code>DataBinder</code> throws
<code>StringIndexOutOfBoundsException</code> for indexed property
without nested property path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34121">#34121</a></li>
<li>Dependency injection matches wildcards too leniently with 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34119">#34119</a></li>
<li>PathMatchingResourcePatternResolver throws FileNotFoundException
caused by wrong cache path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34111">#34111</a></li>
<li>SpEL fails to invoke <code>MethodHandle</code> function reference
accepting only varargs <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34109">#34109</a></li>
<li>Generic with a base type is no longer resolved to its base if the
generic is unresolved <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34086">#34086</a></li>
<li><code>DataBinder</code> throws
<code>StringIndexOutOfBoundsException</code> for map property without
nested property path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34043">#34043</a></li>
<li>Fix implicit variable resolution in JSP <code>EvalTag</code> <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/33945">#33945</a></li>
</ul>
<h2>📔 Documentation</h2>
<ul>
<li>Fix inaccuracy in RequestHeaderArgumentResolver Javadoc <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34230">#34230</a></li>
<li>Document that http.client.requests measure the entire HTTP exchange
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34201">#34201</a></li>
<li>Misuse of em dash in &quot;Basic Concept&quot; section <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34165">#34165</a></li>
<li>Fix typo in link <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34149">#34149</a></li>
<li>Broken syntax in xml sample of &quot;Reference to Other Beans&quot;
section <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34148">#34148</a></li>
<li>Fix minor typo in reference documentation for Kotlin annotations <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34134">#34134</a></li>
<li>Clarify documentation for the default uri client request observation
metric <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34116">#34116</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d5da602bc2"><code>d5da602</code></a>
Release v6.2.2</li>
<li><a
href="384d2749c6"><code>384d274</code></a>
Polishing in HttpServiceMethod</li>
<li><a
href="5150a9a6ad"><code>5150a9a</code></a>
Polishing contribution</li>
<li><a
href="a8c5885aff"><code>a8c5885</code></a>
Fix wrong document about RequestHeaderArgumentResolver</li>
<li><a
href="7d844274dc"><code>7d84427</code></a>
Upgrade to Jetty 12.0.16, Netty 4.1.117, Protobuf 4.29.3, Checkstyle
10.21.1</li>
<li><a
href="70ceb3abdf"><code>70ceb3a</code></a>
Refer to local Consumer type instead of Kotlin test type</li>
<li><a
href="9181cce65f"><code>9181cce</code></a>
Support @⁠MockitoBean at the type level on test classes</li>
<li><a
href="8b6523a35b"><code>8b6523a</code></a>
Cross reference @⁠NestedTestConfiguration for Bean Overrides</li>
<li><a
href="e7f349328d"><code>e7f3493</code></a>
Merge pull request <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34086">#34086</a>
from rPraml</li>
<li><a
href="fe5f5d53b2"><code>fe5f5d5</code></a>
Polish &quot;Resolve base type in parameterized type if
necessary&quot;</li>
<li>Additional commits viewable in <a
href="https://github.com/spring-projects/spring-framework/compare/v6.2.1...v6.2.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.springframework:spring-jdbc&package-manager=gradle&previous-version=6.2.1&new-version=6.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-21 11:10:42 +00:00
dependabot[bot]
c96765f962 Bump bouncycastleVersion from 1.79 to 1.80 (#2759)
[//]: # (dependabot-start)
⚠️  **Dependabot is rebasing this PR** ⚠️ 

Rebasing might not happen immediately, so don't worry if this takes some
time.

Note: if you make any changes to this PR yourself, they will take
precedence over the rebase.

---

[//]: # (dependabot-end)

Bumps `bouncycastleVersion` from 1.79 to 1.80.
Updates `org.bouncycastle:bcprov-jdk18on` from 1.79 to 1.80
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html">org.bouncycastle:bcprov-jdk18on's
changelog</a>.</em></p>
<blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.1.1 Version<!--
raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.80<!-- raw HTML omitted -->
Date:      2025, 14th January.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/bcgit/bc-java/commits">compare view</a></li>
</ul>
</details>
<br />

Updates `org.bouncycastle:bcpkix-jdk18on` from 1.79 to 1.80
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html">org.bouncycastle:bcpkix-jdk18on's
changelog</a>.</em></p>
<blockquote>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><!-- raw HTML omitted --><!-- raw HTML omitted -->2.1.1 Version<!--
raw HTML omitted --><!-- raw HTML omitted -->
Release: 1.80<!-- raw HTML omitted -->
Date:      2025, 14th January.</p>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li>See full diff in <a
href="https://github.com/bcgit/bc-java/commits">compare view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-21 11:10:27 +00:00
dependabot[bot]
3830c7d1f3 Bump org.springframework:spring-webmvc from 6.2.1 to 6.2.2 (#2758)
Bumps
[org.springframework:spring-webmvc](https://github.com/spring-projects/spring-framework)
from 6.2.1 to 6.2.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/spring-projects/spring-framework/releases">org.springframework:spring-webmvc's
releases</a>.</em></p>
<blockquote>
<h2>v6.2.2</h2>
<h2> New Features</h2>
<ul>
<li>Track only qualifier annotations in <code>BeanOverrideHandler</code>
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34260">#34260</a></li>
<li>Remove <code>@FunctionalInterface</code> declaration from
<code>BeanOverrideProcessor</code> <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34259">#34259</a></li>
<li>Refine default filtered headers for web data binding <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34182">#34182</a></li>
<li>Improve query params in uri KeyValue with HTTP interface client <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34176">#34176</a></li>
<li>Refine location checks for PathResource <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34167">#34167</a></li>
<li>Avoid virtual thread pinning in procedure calling <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34133">#34133</a></li>
<li>Type-level constraint violation should result in ParameterErrors <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34105">#34105</a></li>
<li>Avoid logger serialization behind shared EntityManager proxy <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34084">#34084</a></li>
<li>Improve PathMatcher to PathPatternParser migration in mvc XML
configuration <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34064">#34064</a></li>
<li>Support <code>@MockitoBean</code> at the type level on test classes
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/33925">#33925</a></li>
</ul>
<h2>🐞 Bug Fixes</h2>
<ul>
<li>HttpHeadersAssert#doesNotContainsHeaders has a typo <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34263">#34263</a></li>
<li>Deadlock with background EntityManager bootstrap due to locking in
getSingletonFactoryBeanForTypeCheck <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34247">#34247</a></li>
<li>ApplicationListener no longer invoked for double generic
ApplicationEvent with 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34234">#34234</a></li>
<li>Nested transaction savepoints are broken in SQL Server <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34233">#34233</a></li>
<li>Error handling override in DefaultResponseErrorHandler ignored after
upgrade to 6.2.0 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34231">#34231</a></li>
<li>FileNotFoundException is thrown when using
ConfigurationPropertiesScan with Spring Context 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34216">#34216</a></li>
<li>BindException declared but not handled by ExceptionHandler <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34214">#34214</a></li>
<li><code>@TestBean</code> factory method resolution is incorrect within
class hierarchy <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34204">#34204</a></li>
<li>Bean Override in superclass takes precedence over Bean Override in
subclass <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34194">#34194</a></li>
<li>Ensure <code>AsyncListener#onError</code> does not return until
dispatch completes <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34192">#34192</a></li>
<li>BeanNotOfRequiredTypeException during transaction qualifier
resolution in 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34187">#34187</a></li>
<li>BeanCurrentlyInCreationException is thrown when multiple threads
simultaneously try to create bean <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34186">#34186</a></li>
<li><code>DataBinder</code> throws
<code>IndexOutOfBoundsException</code> when indexed parameter uses
nonconsecutive indices <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34145">#34145</a></li>
<li>NullPointerException is thrown if WebClient is used with Apache
Httpclient and cookies are disabled <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34132">#34132</a></li>
<li>Wrong parentId tracking in FlightRecorderApplicationStartup <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34128">#34128</a></li>
<li>PathMatchingResourcePatternResolver is not able to resolve file in
SpringBoot Packaged JAR <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34126">#34126</a></li>
<li>Placeholder resolution no longer considers exact match before
resolving the placeholder key <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34124">#34124</a></li>
<li><code>DataBinder</code> throws
<code>StringIndexOutOfBoundsException</code> for indexed property
without nested property path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34121">#34121</a></li>
<li>Dependency injection matches wildcards too leniently with 6.2.1 <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34119">#34119</a></li>
<li>PathMatchingResourcePatternResolver throws FileNotFoundException
caused by wrong cache path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34111">#34111</a></li>
<li>SpEL fails to invoke <code>MethodHandle</code> function reference
accepting only varargs <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34109">#34109</a></li>
<li>Generic with a base type is no longer resolved to its base if the
generic is unresolved <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34086">#34086</a></li>
<li><code>DataBinder</code> throws
<code>StringIndexOutOfBoundsException</code> for map property without
nested property path <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34043">#34043</a></li>
<li>Fix implicit variable resolution in JSP <code>EvalTag</code> <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/33945">#33945</a></li>
</ul>
<h2>📔 Documentation</h2>
<ul>
<li>Fix inaccuracy in RequestHeaderArgumentResolver Javadoc <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34230">#34230</a></li>
<li>Document that http.client.requests measure the entire HTTP exchange
<a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34201">#34201</a></li>
<li>Misuse of em dash in &quot;Basic Concept&quot; section <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34165">#34165</a></li>
<li>Fix typo in link <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34149">#34149</a></li>
<li>Broken syntax in xml sample of &quot;Reference to Other Beans&quot;
section <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34148">#34148</a></li>
<li>Fix minor typo in reference documentation for Kotlin annotations <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34134">#34134</a></li>
<li>Clarify documentation for the default uri client request observation
metric <a
href="https://redirect.github.com/spring-projects/spring-framework/pull/34116">#34116</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d5da602bc2"><code>d5da602</code></a>
Release v6.2.2</li>
<li><a
href="384d2749c6"><code>384d274</code></a>
Polishing in HttpServiceMethod</li>
<li><a
href="5150a9a6ad"><code>5150a9a</code></a>
Polishing contribution</li>
<li><a
href="a8c5885aff"><code>a8c5885</code></a>
Fix wrong document about RequestHeaderArgumentResolver</li>
<li><a
href="7d844274dc"><code>7d84427</code></a>
Upgrade to Jetty 12.0.16, Netty 4.1.117, Protobuf 4.29.3, Checkstyle
10.21.1</li>
<li><a
href="70ceb3abdf"><code>70ceb3a</code></a>
Refer to local Consumer type instead of Kotlin test type</li>
<li><a
href="9181cce65f"><code>9181cce</code></a>
Support @⁠MockitoBean at the type level on test classes</li>
<li><a
href="8b6523a35b"><code>8b6523a</code></a>
Cross reference @⁠NestedTestConfiguration for Bean Overrides</li>
<li><a
href="e7f349328d"><code>e7f3493</code></a>
Merge pull request <a
href="https://redirect.github.com/spring-projects/spring-framework/issues/34086">#34086</a>
from rPraml</li>
<li><a
href="fe5f5d53b2"><code>fe5f5d5</code></a>
Polish &quot;Resolve base type in parameterized type if
necessary&quot;</li>
<li>Additional commits viewable in <a
href="https://github.com/spring-projects/spring-framework/compare/v6.2.1...v6.2.2">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.springframework:spring-webmvc&package-manager=gradle&previous-version=6.2.1&new-version=6.2.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-21 11:10:13 +00:00
Ludy
05add001fb clean up and more (#2756)
# Description of Changes

This PR introduces multiple updates across various files and workflows:

### **What was changed:**
1. **Deleted Scripts:**
- `check_duplicates.py`: Removed script that checked for duplicate keys
in properties files.
- `check_tabulator.py`: Removed script that ensured no tabulators
existed in HTML, CSS, or JS files.

2. **Updated GitHub Actions Workflow (`pre_commit.yml`):**
- Added a weekly schedule trigger (`cron`) for the pre-commit workflow.
- Updated the `create-pull-request` action to exclude certain files
(`.github/workflows/.*`) from formatting.
- Improved detection and handling of staged changes during commit
creation.

3. **`.pre-commit-config.yaml`:**
- Adjusted regex for file matching in `ruff` and `codespell` hooks to
ensure better file filtering.
   - Removed local hooks that relied on deleted scripts.

4. **Scripts (`counter_translation.py`):**
- Updated file writing methods to enforce consistent newline characters
(`newline="\n"`).

### **Why the change was made:**
- To simplify the repository by removing unnecessary or outdated scripts
(`check_duplicates.py` and `check_tabulator.py`).
- To enhance the workflow automation by introducing a scheduled run for
pre-commit checks.
- To improve code formatting and file consistency by addressing newline
character issues and refining file exclusions in `pre-commit`.

### **Challenges encountered:**
- Ensuring that all references to deleted scripts were properly removed
from configuration files.
- Verifying that workflow and pre-commit changes do not introduce
regressions in existing automation.

Closes # (issue_number)

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [x] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-01-21 11:09:01 +00:00
Ludy
abc3ff3529 changes the bot from github-action to stirlingbot (#2755)
# Description of Changes

This PR introduces updates to the GitHub Actions workflow for
`pre_commit.yml`. The main changes are:

- **What was changed:**
- Removed the conditional check to exclude `dependabot[bot]` from
triggering the workflow.
- Added a step to generate a GitHub App token using
`actions/create-github-app-token`.
  - Added a step to retrieve the user ID for the GitHub App bot.
- Updated the git configuration to use the GitHub App credentials for
commits.
- Improved commit logic to check for changes before attempting a pull
request.
- Updated the pull request creation step to use the dynamically
generated GitHub App credentials.
  
- **Why the change was made:**
- To enhance security and ensure that commits and pull requests are made
using GitHub App credentials instead of the default
`github-actions[bot]`.
  - To provide better traceability and reduce reliance on static tokens.
  
- **Challenges encountered:**
- Adjusting the logic to dynamically generate tokens and handle changes
without disrupting existing workflows.
- Ensuring compatibility with the `peter-evans/create-pull-request`
action.

Closes # (issue_number)

---

## Checklist

### General

- [x] I have read the [Contribution
Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md)
- [x] I have read the [Stirling-PDF Developer
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md)
(if applicable)
- [x] I have read the [How to add new languages to
Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md)
(if applicable)
- [x] I have performed a self-review of my own code
- [x] My changes generate no new warnings

### Documentation

- [ ] I have updated relevant docs on [Stirling-PDF's doc
repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/)
(if functionality has heavily changed)
- [ ] I have read the section [Add New Translation
Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags)
(for new translation tags only)

### UI Changes (if applicable)

- [ ] Screenshots or videos demonstrating the UI changes are attached
(e.g., as comments or direct attachments in the PR)

### Testing (if applicable)

- [x] I have tested my changes locally. Refer to the [Testing
Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing)
for more details.
2025-01-20 19:59:17 +00:00
64 changed files with 5335 additions and 962 deletions

View File

@@ -1,51 +0,0 @@
import sys
def find_duplicate_keys(file_path):
"""
Finds duplicate keys in a properties file and returns their occurrences.
This function reads a properties file, identifies any keys that occur more than
once, and returns a dictionary with these keys and the line numbers of their occurrences.
Parameters:
file_path (str): The path to the properties file to be checked.
Returns:
dict: A dictionary where each key is a duplicated key in the file, and the value is a list
of line numbers where the key occurs.
"""
with open(file_path, "r", encoding="utf-8") as file:
lines = file.readlines()
keys = {}
duplicates = {}
for line_number, line in enumerate(lines, start=1):
line = line.strip()
if line and not line.startswith("#") and "=" in line:
key = line.split("=", 1)[0].strip()
if key in keys:
# If the key already exists, add the current line number
duplicates.setdefault(key, []).append(line_number)
# Also add the first instance of the key if not already done
if keys[key] not in duplicates[key]:
duplicates[key].insert(0, keys[key])
else:
# Store the line number of the first instance of the key
keys[key] = line_number
return duplicates
if __name__ == "__main__":
failed = False
for ar in sys.argv[1:]:
duplicates = find_duplicate_keys(ar)
if duplicates:
for key, lines in duplicates.items():
lines_str = ", ".join(map(str, lines))
print(f"{key} duplicated in {ar} on lines {lines_str}")
failed = True
if failed:
sys.exit(1)

View File

@@ -1,85 +0,0 @@
"""check_tabulator.py"""
import argparse
import sys
def check_tabs(file_path):
"""
Checks for tabs in the specified file.
Args:
file_path (str): The path to the file to be checked.
Returns:
bool: True if tabs are found, False otherwise.
"""
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
if "\t" in content:
print(f"Tab found in {file_path}")
return True
return False
def replace_tabs_with_spaces(file_path, replace_with=" "):
"""
Replaces tabs with a specified number of spaces in the file.
Args:
file_path (str): The path to the file where tabs will be replaced.
replace_with (str): The character(s) to replace tabs with. Defaults to two spaces.
"""
with open(file_path, "r", encoding="utf-8") as file:
content = file.read()
updated_content = content.replace("\t", replace_with)
with open(file_path, "w", encoding="utf-8") as file:
file.write(updated_content)
def main():
"""
Main function to replace tabs with spaces in the provided files.
The replacement character and files to check are taken from command line arguments.
"""
# Create ArgumentParser instance
parser = argparse.ArgumentParser(
description="Replace tabs in files with specified characters."
)
# Define optional argument `--replace_with`
parser.add_argument(
"--replace_with",
default=" ",
help="Character(s) to replace tabs with. Default is two spaces.",
)
# Define argument for file paths
parser.add_argument("files", metavar="FILE", nargs="+", help="Files to process.")
# Parse arguments
args = parser.parse_args()
# Extract replacement characters and files from the parsed arguments
replace_with = args.replace_with
files_checked = args.files
error = False
for file_path in files_checked:
if check_tabs(file_path):
replace_tabs_with_spaces(file_path, replace_with)
error = True
if error:
print("Error: Originally found tabs in HTML files, now replaced.")
sys.exit(1)
sys.exit(0)
if __name__ == "__main__":
main()

View File

@@ -36,7 +36,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -81,7 +81,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -119,7 +119,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_API }} password: ${{ secrets.DOCKER_HUB_API }}
- name: Build and push PR-specific image - name: Build and push PR-specific image
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile

View File

@@ -21,7 +21,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -13,7 +13,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -37,6 +37,12 @@ jobs:
java-version: ${{ matrix.jdk-version }} java-version: ${{ matrix.jdk-version }}
distribution: "temurin" distribution: "temurin"
- name: PR | Generate verification metadata with signatures and checksums for dependabot[bot]
if: github.event.pull_request.user.login == 'dependabot[bot]'
run: |
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256 --refresh-dependencies help
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp --refresh-keys --export-keys --refresh-dependencies help
- name: Build with Gradle and no spring security - name: Build with Gradle and no spring security
run: ./gradlew clean build run: ./gradlew clean build
env: env:
@@ -77,7 +83,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -95,7 +101,7 @@ jobs:
- name: Install Docker Compose - name: Install Docker Compose
run: | run: |
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.32.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo curl -SL "https://github.com/docker/compose/releases/download/v2.32.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
- name: Set up Python - name: Set up Python
@@ -106,10 +112,10 @@ jobs:
- name: Pip requirements - name: Pip requirements
run: | run: |
pip install --require-hashes -r ./cucumber/requirements.txt pip install --require-hashes -r ./testing/cucumber/requirements.txt
- name: Run Docker Compose Tests - name: Run Docker Compose Tests
run: | run: |
chmod +x ./cucumber/test_webpages.sh chmod +x ./testing/test_webpages.sh
chmod +x ./test.sh chmod +x ./testing/test.sh
./test.sh ./testing/test.sh "${{ github.event.pull_request.user.login == 'dependabot[bot]' }}"

View File

@@ -18,7 +18,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -58,7 +58,7 @@ jobs:
run: | run: |
echo "Fetching PR changed files..." echo "Fetching PR changed files..."
echo "Getting list of changed files from PR..." echo "Getting list of changed files from PR..."
gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]+\.properties$' > changed_files.txt # Filter only matching property files gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt # Filter only matching property files
- name: Determine reference file test - name: Determine reference file test
id: determine-file id: determine-file
@@ -99,7 +99,7 @@ jobs:
// Filter for relevant files based on the PR changes // Filter for relevant files based on the PR changes
const changedFiles = files const changedFiles = files
.map(file => file.filename) .map(file => file.filename)
.filter(file => /^src\/main\/resources\/messages_[a-zA-Z_]+\.properties$/.test(file)); .filter(file => /^src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file));
console.log("Changed files:", changedFiles); console.log("Changed files:", changedFiles);

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -18,7 +18,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -15,7 +15,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }} versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -51,7 +51,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -101,7 +101,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -139,7 +139,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -210,7 +210,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -271,7 +271,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -2,23 +2,41 @@ name: Pre-commit
on: on:
workflow_dispatch: workflow_dispatch:
schedule:
- cron: "0 0 * * 1"
permissions: permissions:
contents: read contents: read
jobs: jobs:
pre-commit: pre-commit:
if: ${{ github.event.pull_request.user.login != 'dependabot[bot]' }}
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
contents: write contents: write
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token
id: generate-token
uses: actions/create-github-app-token@c1a285145b9d317df6ced56c09f525b5c2b6f755 # v1.11.1
with:
app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
- name: Get GitHub App User ID
id: get-user-id
run: echo "user-id=$(gh api "/users/${{ steps.generate-token.outputs.app-slug }}[bot]" --jq .id)" >> $GITHUB_OUTPUT
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
- id: committer
run: |
echo "string=${{ steps.generate-token.outputs.app-slug }}[bot] <${{ steps.get-user-id.outputs.user-id }}+${{ steps.generate-token.outputs.app-slug }}[bot]@users.noreply.github.com>" >> "$GITHUB_OUTPUT"
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with: with:
@@ -35,25 +53,25 @@ jobs:
continue-on-error: true continue-on-error: true
- name: Set up git config - name: Set up git config
run: | run: |
git config --global user.name "github-actions[bot]" git config --global user.name ${{ steps.generate-token.outputs.app-slug }}[bot]
git config --global user.email "github-actions[bot]@users.noreply.github.com" git config --global user.email "${{ steps.get-user-id.outputs.user-id }}+${{ steps.generate-token.outputs.app-slug }}[bot]@users.noreply.github.com"
- name: git add - name: git add
run: | run: |
git add . git add .
git diff --staged --quiet || git commit -m ":file_folder: pre-commit git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV
> Made via .github/workflows/pre_commit.yml" || echo "pre-commit: no changes"
- name: Create Pull Request - name: Create Pull Request
if: env.CHANGES_DETECTED == 'true'
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ steps.generate-token.outputs.token }}
commit-message: "ci: 🤖 format everything with pre-commit" commit-message: ":file_folder: pre-commit"
committer: GitHub Action <action@github.com> committer: ${{ steps.committer.outputs.string }}
author: GitHub Action <action@github.com> author: ${{ steps.committer.outputs.string }}
signoff: true signoff: true
branch: pre-commit branch: pre-commit
title: "🤖 format everything with pre-commit by <github-actions[bot]>" title: "🤖 format everything with pre-commit by <${{ steps.generate-token.outputs.app-slug }}>"
body: | body: |
Auto-generated by [create-pull-request][1] Auto-generated by [create-pull-request][1] with **${{ steps.generate-token.outputs.app-slug }}**
[1]: https://github.com/peter-evans/create-pull-request [1]: https://github.com/peter-evans/create-pull-request
draft: false draft: false

View File

@@ -18,7 +18,7 @@ jobs:
id-token: write id-token: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -89,7 +89,7 @@ jobs:
- name: Build and push main Dockerfile - name: Build and push main Dockerfile
id: build-push-regular id: build-push-regular
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0
with: with:
builder: ${{ steps.buildx.outputs.name }} builder: ${{ steps.buildx.outputs.name }}
context: . context: .
@@ -134,7 +134,7 @@ jobs:
- name: Build and push Dockerfile-ultra-lite - name: Build and push Dockerfile-ultra-lite
id: build-push-lite id: build-push-lite
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0
if: github.ref != 'refs/heads/main' if: github.ref != 'refs/heads/main'
with: with:
context: . context: .
@@ -165,7 +165,7 @@ jobs:
- name: Build and push main Dockerfile fat - name: Build and push main Dockerfile fat
id: build-push-fat id: build-push-fat
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0
if: github.ref != 'refs/heads/main' if: github.ref != 'refs/heads/main'
with: with:
builder: ${{ steps.buildx.outputs.name }} builder: ${{ steps.buildx.outputs.name }}

View File

@@ -23,7 +23,7 @@ jobs:
version: ${{ steps.versionNumber.outputs.versionNumber }} version: ${{ steps.versionNumber.outputs.versionNumber }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -83,7 +83,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -161,7 +161,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -34,7 +34,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -1,12 +1,17 @@
name: Sync Files name: Sync Files
on: on:
workflow_dispatch:
push: push:
branches: branches:
- main - main
paths: paths:
- "build.gradle" - "build.gradle"
- "README.md"
- "gradle/verification-keyring.keys"
- "gradle/verification-metadata.xml"
- "src/main/resources/messages_*.properties" - "src/main/resources/messages_*.properties"
- "src/main/resources/static/3rdPartyLicenses.json"
- "scripts/ignore_translation.toml" - "scripts/ignore_translation.toml"
permissions: permissions:
@@ -21,7 +26,7 @@ jobs:
committer: ${{ steps.committer.outputs.committer }} committer: ${{ steps.committer.outputs.committer }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -54,7 +59,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -84,21 +89,37 @@ jobs:
- name: Run git add - name: Run git add
run: | run: |
git add . git add src/main/resources/messages_*.properties
git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "no changes" git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "no changes"
- name: Install dependencies - name: Install dependencies
run: pip install --require-hashes -r ./.github/scripts/requirements_sync_readme.txt run: pip install --require-hashes -r ./.github/scripts/requirements_sync_readme.txt
- name: Sync README - name: Sync README.md
run: | run: |
python scripts/counter_translation.py python scripts/counter_translation.py
- name: Run git add - name: Run git add
run: | run: |
git add . git add README.md
git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes" git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes"
- name: Generate verification metadata with signatures and checksums
run: |
set -e
if [ -f ./gradle/verification-metadata.xml ]; then
rm ./gradle/verification-metadata.xml
fi
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256 help
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp --refresh-keys --export-keys --refresh-dependencies help
./gradlew clean build
- name: Run git add
run: |
git add gradle/verification-keyring.keys
git add gradle/verification-metadata.xml
git diff --staged --quiet || git commit -m ":memo: Generate verification metadata with signatures and checksums" || echo "no changes"
- name: Create Pull Request - name: Create Pull Request
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
with: with:
@@ -108,28 +129,42 @@ jobs:
author: ${{ needs.read_bot_entries.outputs.committer }} author: ${{ needs.read_bot_entries.outputs.committer }}
signoff: true signoff: true
branch: sync_readme branch: sync_readme
title: ":memo: Sync translation files + Update README.md (Translation Progress Table)" title: ":globe_with_meridians: Sync Translations + Update README Progress Table + Update Verification Metadata"
body: | body: |
#### Description ### Description of Changes
This Pull Request was automatically generated to synchronize updates to translation files and documentation. The changes include: This Pull Request was automatically generated to synchronize updates to translation files, verification metadata, and documentation. Below are the details of the changes made:
1. **Synchronization of Translation Files:** #### **1. Synchronization of Translation Files**
- Updated content based on the latest changes in `messages_en_GB.properties`. - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`.
- Ensured consistency between all language files and the reference file. - Ensured consistency and synchronization across all supported language files.
- Highlighted any missing or incomplete translations.
2. **Update README.md:** #### **2. Update README.md**
- Generated the translation progress table. - Generated the translation progress table in `README.md`.
- Displayed the current status of translations for all supported languages. - Added a summary of the current translation status for all supported languages.
- Included up-to-date statistics on translation coverage.
#### **3. Verification Metadata Updates**
- Generated or refreshed the `verification-keyring.keys` and `verification-metadata.xml` files.
- Included the latest dependency signatures and checksums to enhance the build's integrity.
#### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress.
- Strengthens dependency verification for a more secure build process.
--- ---
Auto-generated by [create-pull-request][1]
Auto-generated by [create-pull-request][1].
[1]: https://github.com/peter-evans/create-pull-request [1]: https://github.com/peter-evans/create-pull-request
draft: false draft: false
delete-branch: true delete-branch: true
labels: Documentation,Translation,github-actions labels: github-actions
sign-commits: true sign-commits: true
add-paths: | add-paths: |
README.md README.md
src/main/resources/messages_*.properties src/main/resources/messages_*.properties
gradle/verification-keyring.keys
gradle/verification-metadata.xml

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -46,7 +46,7 @@ jobs:
password: ${{ secrets.DOCKER_HUB_API }} password: ${{ secrets.DOCKER_HUB_API }}
- name: Build and push test image - name: Build and push test image
uses: docker/build-push-action@b32b51a8eda65d6793cd0494a773d4f6bcef32dc # v6.11.0 uses: docker/build-push-action@67a2d409c0a876cbe6b11854e3e25193efe4e62d # v6.12.0
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile
@@ -105,7 +105,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -122,7 +122,7 @@ jobs:
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=$(pwd)/node_modules/dashcam-chrome/build", "http://${{ secrets.VPS_HOST }}:1337" Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--load-extension=$(pwd)/node_modules/dashcam-chrome/build", "http://${{ secrets.VPS_HOST }}:1337"
Start-Sleep -Seconds 20 Start-Sleep -Seconds 20
prompt: | prompt: |
1. /run testdriver/test.yml 1. /run testing/testdriver/test.yml
env: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FORCE_COLOR: "3" FORCE_COLOR: "3"
@@ -134,7 +134,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@c95a14d0e5bab51a9f56296a4eb0e416910cd350 # v2.10.3 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

1
.gitignore vendored
View File

@@ -25,6 +25,7 @@ clientWebUI/
!cucumber/ !cucumber/
!cucumber/exampleFiles/ !cucumber/exampleFiles/
!cucumber/exampleFiles/example_html.zip !cucumber/exampleFiles/example_html.zip
exampleYmlFiles/stirling/
# Gradle # Gradle
.gradle .gradle

View File

@@ -6,10 +6,10 @@ repos:
args: args:
- --fix - --fix
- --line-length=127 - --line-length=127
files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$ files: ^((\.github/scripts|scripts)/.+)?[^/]+\.py$
exclude: (split_photos.py) exclude: (split_photos.py)
- id: ruff-format - id: ruff-format
files: ^((.github/scripts|scripts)/.+)?[^/]+\.py$ files: ^((\.github/scripts|scripts)/.+)?[^/]+\.py$
exclude: (split_photos.py) exclude: (split_photos.py)
- repo: https://github.com/codespell-project/codespell - repo: https://github.com/codespell-project/codespell
rev: v2.3.0 rev: v2.3.0
@@ -19,39 +19,18 @@ repos:
- --ignore-words-list= - --ignore-words-list=
- --skip="./.*,*.csv,*.json,*.ambr" - --skip="./.*,*.csv,*.json,*.ambr"
- --quiet-level=2 - --quiet-level=2
files: \.(properties|html|css|js|py|md)$ files: \.(html|css|js|py|md)$
exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js) exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js)
- repo: https://github.com/gitleaks/gitleaks - repo: https://github.com/gitleaks/gitleaks
rev: v8.22.0 rev: v8.22.0
hooks: hooks:
- id: gitleaks - id: gitleaks
- repo: https://github.com/jumanjihouse/pre-commit-hooks
rev: 3.0.0
hooks:
- id: shellcheck
files: ^.*(\.bash|\.sh|\.ksh|\.zsh)$
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0 rev: v5.0.0
hooks: hooks:
- id: end-of-file-fixer - id: end-of-file-fixer
files: ^.*(\.js|\.java|\.py|\.yml)$ files: ^.*(\.js|\.java|\.py|\.yml)$
exclude: ^(.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js$) exclude: ^(.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js|\.github/workflows/.*$)
- id: trailing-whitespace - id: trailing-whitespace
files: ^.*(\.js|\.java|\.py|\.yml)$ files: ^.*(\.js|\.java|\.py|\.yml)$
exclude: ^(.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js$) exclude: ^(.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js|\.github/workflows/.*$)
- repo: local
hooks:
- id: check-duplicate-properties-keys
name: Check Duplicate Properties Keys
entry: python .github/scripts/check_duplicates.py
language: python
files: ^(src)/.+\.properties$
- id: check-html-tabs
name: Check HTML for tabs
description: Ensures HTML/CSS/JS files do not contain tab characters
# args: ["--replace_with= "]
entry: python .github/scripts/check_tabulator.py
language: python
exclude: ^(.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js$)
files: ^.*(\.html|\.css|\.js)$

View File

@@ -25,7 +25,13 @@ LABEL org.opencontainers.image.keywords="PDF, manipulation, merge, split, conver
# Set Environment Variables # Set Environment Variables
ENV DOCKER_ENABLE_SECURITY=false \ ENV DOCKER_ENABLE_SECURITY=false \
VERSION_TAG=$VERSION_TAG \ VERSION_TAG=$VERSION_TAG \
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -XX:MaxRAMPercentage=75" \ JAVA_TOOL_OPTIONS="-XX:+UnlockExperimentalVMOptions \
-XX:MaxRAMPercentage=75 \
-XX:InitiatingHeapOccupancyPercent=20 \
-XX:+G1PeriodicGCInvokesConcurrent \
-XX:G1PeriodicGCInterval=10000 \
-XX:+UseStringDeduplication \
-XX:G1PeriodicGCSystemLoadThreshold=70" \
HOME=/home/stirlingpdfuser \ HOME=/home/stirlingpdfuser \
PUID=1000 \ PUID=1000 \
PGID=1000 \ PGID=1000 \

View File

@@ -25,7 +25,13 @@ ARG VERSION_TAG
# Set Environment Variables # Set Environment Variables
ENV DOCKER_ENABLE_SECURITY=false \ ENV DOCKER_ENABLE_SECURITY=false \
VERSION_TAG=$VERSION_TAG \ VERSION_TAG=$VERSION_TAG \
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -XX:MaxRAMPercentage=75" \ JAVA_TOOL_OPTIONS="-XX:+UnlockExperimentalVMOptions \
-XX:MaxRAMPercentage=75 \
-XX:InitiatingHeapOccupancyPercent=20 \
-XX:+G1PeriodicGCInvokesConcurrent \
-XX:G1PeriodicGCInterval=10000 \
-XX:+UseStringDeduplication \
-XX:G1PeriodicGCSystemLoadThreshold=70" \
HOME=/home/stirlingpdfuser \ HOME=/home/stirlingpdfuser \
PUID=1000 \ PUID=1000 \
PGID=1000 \ PGID=1000 \

View File

@@ -7,7 +7,13 @@ ARG VERSION_TAG
ENV DOCKER_ENABLE_SECURITY=false \ ENV DOCKER_ENABLE_SECURITY=false \
HOME=/home/stirlingpdfuser \ HOME=/home/stirlingpdfuser \
VERSION_TAG=$VERSION_TAG \ VERSION_TAG=$VERSION_TAG \
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -XX:MaxRAMPercentage=75" \ JAVA_TOOL_OPTIONS="-XX:+UnlockExperimentalVMOptions \
-XX:MaxRAMPercentage=75 \
-XX:InitiatingHeapOccupancyPercent=20 \
-XX:+G1PeriodicGCInvokesConcurrent \
-XX:G1PeriodicGCInterval=10000 \
-XX:+UseStringDeduplication \
-XX:G1PeriodicGCSystemLoadThreshold=70" \
PUID=1000 \ PUID=1000 \
PGID=1000 \ PGID=1000 \
UMASK=022 UMASK=022

View File

@@ -123,12 +123,12 @@ Stirling-PDF currently supports 39 languages!
| Bulgarian (Български) (bg_BG) | ![86%](https://geps.dev/progress/86) | | Bulgarian (Български) (bg_BG) | ![86%](https://geps.dev/progress/86) |
| Catalan (Català) (ca_CA) | ![81%](https://geps.dev/progress/81) | | Catalan (Català) (ca_CA) | ![81%](https://geps.dev/progress/81) |
| Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) | | Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) |
| Czech (Česky) (cs_CZ) | ![87%](https://geps.dev/progress/87) | | Czech (Česky) (cs_CZ) | ![99%](https://geps.dev/progress/99) |
| Danish (Dansk) (da_DK) | ![86%](https://geps.dev/progress/86) | | Danish (Dansk) (da_DK) | ![86%](https://geps.dev/progress/86) |
| Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) | | Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) |
| English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
| English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
| French (Français) (fr_FR) | ![92%](https://geps.dev/progress/92) | | French (Français) (fr_FR) | ![96%](https://geps.dev/progress/96) |
| German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) | | German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) |
| Greek (Ελληνικά) (el_GR) | ![98%](https://geps.dev/progress/98) | | Greek (Ελληνικά) (el_GR) | ![98%](https://geps.dev/progress/98) |
| Hindi (हिंदी) (hi_IN) | ![99%](https://geps.dev/progress/99) | | Hindi (हिंदी) (hi_IN) | ![99%](https://geps.dev/progress/99) |

View File

@@ -19,13 +19,13 @@ ext {
logbackVersion = "1.5.7" logbackVersion = "1.5.7"
imageioVersion = "3.12.0" imageioVersion = "3.12.0"
lombokVersion = "1.18.36" lombokVersion = "1.18.36"
bouncycastleVersion = "1.79" bouncycastleVersion = "1.80"
springSecuritySamlVersion = "6.4.2" springSecuritySamlVersion = "6.4.2"
openSamlVersion = "4.3.2" openSamlVersion = "4.3.2"
} }
group = "stirling.software" group = "stirling.software"
version = "0.38.0" version = "0.39.0"
java { java {
@@ -291,7 +291,7 @@ dependencies {
} }
//security updates //security updates
implementation "org.springframework:spring-webmvc:6.2.1" implementation "org.springframework:spring-webmvc:6.2.2"
implementation("io.github.pixee:java-security-toolkit:1.2.1") implementation("io.github.pixee:java-security-toolkit:1.2.1")
@@ -314,7 +314,7 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
implementation "org.springframework.session:spring-session-core:$springBootVersion" implementation "org.springframework.session:spring-session-core:$springBootVersion"
implementation "org.springframework:spring-jdbc:6.2.1" implementation "org.springframework:spring-jdbc:6.2.2"
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
// Don't upgrade h2database // Don't upgrade h2database
@@ -370,6 +370,8 @@ dependencies {
implementation ("org.apache.pdfbox:pdfbox:$pdfboxVersion") { implementation ("org.apache.pdfbox:pdfbox:$pdfboxVersion") {
exclude group: "commons-logging", module: "commons-logging" exclude group: "commons-logging", module: "commons-logging"
} }
implementation "org.apache.pdfbox:preflight:$pdfboxVersion"
implementation ("org.apache.pdfbox:xmpbox:$pdfboxVersion") { implementation ("org.apache.pdfbox:xmpbox:$pdfboxVersion") {
exclude group: "commons-logging", module: "commons-logging" exclude group: "commons-logging", module: "commons-logging"

View File

@@ -1,6 +1,6 @@
services: services:
stirling-pdf: stirling-pdf:
container_name: Stirling-PDF-Security-Fat container_name: Stirling-PDF-Security-Fat-with-login
image: stirlingtools/stirling-pdf:latest-fat image: stirlingtools/stirling-pdf:latest-fat
deploy: deploy:
resources: resources:

View File

@@ -5198,6 +5198,21 @@ BQJJZbt1AhsMBQkCAikAACEJEEEQY6Og/9EZFiEE3d7odhLp+5X1yNkeQRBjo6D/
=KAHr =KAHr
-----END PGP PUBLIC KEY BLOCK----- -----END PGP PUBLIC KEY BLOCK-----
pub 436902AF59EDF60E
uid Sebastian Sampaoli <ssampaoli@equo.dev>
sub D94994D14B55169B
-----BEGIN PGP PUBLIC KEY BLOCK-----
mDMEY4fp+xYJKwYBBAHaRw8BAQdArb04PVwQKvEhtUEmEu7/aASZivOWgEkZBqX0
Tovwvq+0J1NlYmFzdGlhbiBTYW1wYW9saSA8c3NhbXBhb2xpQGVxdW8uZGV2Prg4
BGOH6fsSCisGAQQBl1UBBQEBB0CSPWzZfBjKWyPW+D6RDRLFz5xlO9/30yGD/VhA
EPXybAMBCAeIfQQYFgoAJhYhBB0sfvitoPeUtYx8Y0NpAq9Z7fYOBQJjh+n7AhsM
BQkDwmcAAAoJEENpAq9Z7fYOTMMBAKfZb2ahnfGNBt8Hrbu1j99580a2IaFQddAk
xXZy2unHAPYyfxDLPkbTR7Mm4k8Cva8PCcXotDow4bDLm9rhwVkJ
=Hgs4
-----END PGP PUBLIC KEY BLOCK-----
pub 4989E0E939C2999B pub 4989E0E939C2999B
uid Scott Conway <scott@conwayfamily.name> uid Scott Conway <scott@conwayfamily.name>

File diff suppressed because it is too large Load Diff

View File

@@ -75,7 +75,7 @@ def write_readme(progress_list: list[tuple[str, int]]) -> None:
f"![{value}%](https://geps.dev/progress/{value})", f"![{value}%](https://geps.dev/progress/{value})",
) )
with open("README.md", "w", encoding="utf-8") as file: with open("README.md", "w", encoding="utf-8", newline="\n") as file:
file.writelines(content) file.writelines(content)
@@ -196,7 +196,7 @@ def compare_files(
) )
) )
ignore_translation = convert_to_multiline(sort_ignore_translation) ignore_translation = convert_to_multiline(sort_ignore_translation)
with open(ignore_translation_file, "w", encoding="utf-8") as file: with open(ignore_translation_file, "w", encoding="utf-8", newline="\n") as file:
file.write(tomlkit.dumps(ignore_translation)) file.write(tomlkit.dumps(ignore_translation))
unique_data = list(set(result_list)) unique_data = list(set(result_list))

View File

@@ -24,7 +24,6 @@ ignore = [
[cs_CZ] [cs_CZ]
ignore = [ ignore = [
'language.direction', 'language.direction',
'pipeline.header',
'text', 'text',
] ]

View File

@@ -0,0 +1,180 @@
package stirling.software.SPDF.controller.api;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.pdmodel.encryption.PDEncryption;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.api.PDFFile;
import java.io.IOException;
import java.util.*;
@RestController
@RequestMapping("/api/v1/analysis")
@Tag(name = "Analysis", description = "Analysis APIs")
public class AnalysisController {
@PostMapping(value = "/page-count", consumes = "multipart/form-data")
@Operation(summary = "Get PDF page count",
description = "Returns total number of pages in PDF. Input:PDF Output:JSON Type:SISO")
public Map<String, Integer> getPageCount(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
return Map.of("pageCount", document.getNumberOfPages());
}
}
@PostMapping(value ="/basic-info", consumes = "multipart/form-data")
@Operation(summary = "Get basic PDF information",
description = "Returns page count, version, file size. Input:PDF Output:JSON Type:SISO")
public Map<String, Object> getBasicInfo(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
Map<String, Object> info = new HashMap<>();
info.put("pageCount", document.getNumberOfPages());
info.put("pdfVersion", document.getVersion());
info.put("fileSize", file.getFileInput().getSize());
return info;
}
}
@PostMapping(value ="/document-properties", consumes = "multipart/form-data")
@Operation(summary = "Get PDF document properties",
description = "Returns title, author, subject, etc. Input:PDF Output:JSON Type:SISO")
public Map<String, String> getDocumentProperties(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
PDDocumentInformation info = document.getDocumentInformation();
Map<String, String> properties = new HashMap<>();
properties.put("title", info.getTitle());
properties.put("author", info.getAuthor());
properties.put("subject", info.getSubject());
properties.put("keywords", info.getKeywords());
properties.put("creator", info.getCreator());
properties.put("producer", info.getProducer());
properties.put("creationDate", info.getCreationDate().toString());
properties.put("modificationDate", info.getModificationDate().toString());
return properties;
}
}
@PostMapping(value ="/page-dimensions", consumes = "multipart/form-data")
@Operation(summary = "Get page dimensions for all pages",
description = "Returns width and height of each page. Input:PDF Output:JSON Type:SISO")
public List<Map<String, Float>> getPageDimensions(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
List<Map<String, Float>> dimensions = new ArrayList<>();
PDPageTree pages = document.getPages();
for (PDPage page : pages) {
Map<String, Float> pageDim = new HashMap<>();
pageDim.put("width", page.getBBox().getWidth());
pageDim.put("height", page.getBBox().getHeight());
dimensions.add(pageDim);
}
return dimensions;
}
}
@PostMapping(value ="/form-fields", consumes = "multipart/form-data")
@Operation(summary = "Get form field information",
description = "Returns count and details of form fields. Input:PDF Output:JSON Type:SISO")
public Map<String, Object> getFormFields(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
Map<String, Object> formInfo = new HashMap<>();
PDAcroForm form = document.getDocumentCatalog().getAcroForm();
if (form != null) {
formInfo.put("fieldCount", form.getFields().size());
formInfo.put("hasXFA", form.hasXFA());
formInfo.put("isSignaturesExist", form.isSignaturesExist());
} else {
formInfo.put("fieldCount", 0);
formInfo.put("hasXFA", false);
formInfo.put("isSignaturesExist", false);
}
return formInfo;
}
}
@PostMapping(value ="/annotation-info", consumes = "multipart/form-data")
@Operation(summary = "Get annotation information",
description = "Returns count and types of annotations. Input:PDF Output:JSON Type:SISO")
public Map<String, Object> getAnnotationInfo(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
Map<String, Object> annotInfo = new HashMap<>();
int totalAnnotations = 0;
Map<String, Integer> annotationTypes = new HashMap<>();
for (PDPage page : document.getPages()) {
for (PDAnnotation annot : page.getAnnotations()) {
totalAnnotations++;
String subType = annot.getSubtype();
annotationTypes.merge(subType, 1, Integer::sum);
}
}
annotInfo.put("totalCount", totalAnnotations);
annotInfo.put("typeBreakdown", annotationTypes);
return annotInfo;
}
}
@PostMapping(value ="/font-info", consumes = "multipart/form-data")
@Operation(summary = "Get font information",
description = "Returns list of fonts used in the document. Input:PDF Output:JSON Type:SISO")
public Map<String, Object> getFontInfo(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
Map<String, Object> fontInfo = new HashMap<>();
Set<String> fontNames = new HashSet<>();
for (PDPage page : document.getPages()) {
for (COSName font : page.getResources().getFontNames()) {
fontNames.add(font.getName());
}
}
fontInfo.put("fontCount", fontNames.size());
fontInfo.put("fonts", fontNames);
return fontInfo;
}
}
@PostMapping(value ="/security-info", consumes = "multipart/form-data")
@Operation(summary = "Get security information",
description = "Returns encryption and permission details. Input:PDF Output:JSON Type:SISO")
public Map<String, Object> getSecurityInfo(@ModelAttribute PDFFile file) throws IOException {
try (PDDocument document = Loader.loadPDF(file.getFileInput().getBytes())) {
Map<String, Object> securityInfo = new HashMap<>();
PDEncryption encryption = document.getEncryption();
if (encryption != null) {
securityInfo.put("isEncrypted", true);
securityInfo.put("keyLength", encryption.getLength());
// Get permissions
Map<String, Boolean> permissions = new HashMap<>();
permissions.put("canPrint", document.getCurrentAccessPermission().canPrint());
permissions.put("canModify", document.getCurrentAccessPermission().canModify());
permissions.put("canExtractContent", document.getCurrentAccessPermission().canExtractContent());
permissions.put("canModifyAnnotations", document.getCurrentAccessPermission().canModifyAnnotations());
securityInfo.put("permissions", permissions);
} else {
securityInfo.put("isEncrypted", false);
}
return securityInfo;
}
}
}

View File

@@ -39,7 +39,7 @@ public class MetricsAggregatorService {
if (method == null || uri == null) { if (method == null || uri == null) {
return; return;
} }
if (!method.equals("GET") && !method.equals("POST")) { if (!"GET".equals(method) && !"POST".equals(method)) {
return; return;
} }
// Skip URIs that are 2 characters or shorter // Skip URIs that are 2 characters or shorter

File diff suppressed because it is too large Load Diff

View File

@@ -82,7 +82,7 @@ pages=Pages
loading=Chargement... loading=Chargement...
addToDoc=Ajouter au Document addToDoc=Ajouter au Document
reset=Réinitialiser reset=Réinitialiser
apply=Apply apply=Appliquer
legal.privacy=Politique de Confidentialité legal.privacy=Politique de Confidentialité
legal.terms=Conditions Générales legal.terms=Conditions Générales
@@ -239,20 +239,20 @@ database.creationDate=Date de Création
database.fileSize=Taille du Fichier database.fileSize=Taille du Fichier
database.deleteBackupFile=Supprimer le fichier de sauvegarde database.deleteBackupFile=Supprimer le fichier de sauvegarde
database.importBackupFile=Importer le fichier de sauvegarde database.importBackupFile=Importer le fichier de sauvegarde
database.createBackupFile=Create Backup File database.createBackupFile=Créer un fichier de sauvegarde
database.downloadBackupFile=Télécharger le fichier de sauvegarde database.downloadBackupFile=Télécharger le fichier de sauvegarde
database.info_1=Lors de l'importation des données, il est crucial de garantir la structure correcte. Si vous n'êtes pas sûr de ce que vous faites, sollicitez un avis et un soutien d'un professionnel. Une erreur dans la structure peut entraîner des dysfonctionnements de l'application, allant jusqu'à l'incapacité totale d'exécuter l'application. database.info_1=Lors de l'importation des données, il est crucial de garantir la structure correcte. Si vous n'êtes pas sûr de ce que vous faites, sollicitez un avis et un soutien d'un professionnel. Une erreur dans la structure peut entraîner des dysfonctionnements de l'application, allant jusqu'à l'incapacité totale d'exécuter l'application.
database.info_2=Le nom du fichier ne fait pas de différence lors de l'upload. Il sera renommé ultérieurement selon le format backup_user_yyyyMMddHHmm.sql, assurant ainsi une convention de nommage cohérente. database.info_2=Le nom du fichier ne fait pas de différence lors de l'upload. Il sera renommé ultérieurement selon le format backup_user_yyyyMMddHHmm.sql, assurant ainsi une convention de nommage cohérente.
database.submit=Importer la sauvegarde database.submit=Importer la sauvegarde
database.importIntoDatabaseSuccessed=Importation dans la base de données réussie database.importIntoDatabaseSuccessed=Importation dans la base de données réussie
database.backupCreated=Database backup successful database.backupCreated=Sauvegarde de la base de donnée réussie
database.fileNotFound=File not Found database.fileNotFound=Fichier introuvable
database.fileNullOrEmpty=Fichier ne peut pas être null ou vide database.fileNullOrEmpty=Fichier ne peut pas être null ou vide
database.failedImportFile=Failed Import File database.failedImportFile=Échec de l'imporation du fichier
database.notSupported=This function is not available for your database connection. database.notSupported=Cette fonctionnalité n'est pas supportée avec votre base de donnée
session.expired=Votre session a expiré. Veuillez recharger la page et réessayer. session.expired=Votre session a expiré. Veuillez recharger la page et réessayer.
session.refreshPage=Refresh Page session.refreshPage=Rafraichir la page
############# #############
# HOME-PAGE # # HOME-PAGE #
@@ -479,8 +479,8 @@ home.autoRedact.title=Caviarder automatiquement
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF. home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF.
autoRedact.tags=caviarder,redact,auto autoRedact.tags=caviarder,redact,auto
home.redact.title=Manual Redaction home.redact.title=Rédaction manuelle
home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s) home.redact.desc=Rédiger un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées.
redact.tags=Redact,Hide,black out,black,marker,hidden,manual redact.tags=Redact,Hide,black out,black,marker,hidden,manual
home.tableExtraxt.title=PDF en CSV home.tableExtraxt.title=PDF en CSV
@@ -589,30 +589,30 @@ autoRedact.convertPDFToImageLabel=Convertir un PDF en PDF-Image (utilisé pour s
autoRedact.submitButton=Caviarder autoRedact.submitButton=Caviarder
#redact #redact
redact.title=Manual Redaction redact.title=Rédaction manuelle
redact.header=Manual Redaction redact.header=Rédaction manuelle
redact.submit=Redact redact.submit=Rédiger
redact.textBasedRedaction=Text based Redaction redact.textBasedRedaction=Rédaction en fonction de texte
redact.pageBasedRedaction=Page-based Redaction redact.pageBasedRedaction=Rédaction en fonction de pages
redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) redact.convertPDFToImageLabel=Convertir en PDF-Image (pour supprimer le texte derrière le rectangle)
redact.pageRedactionNumbers.title=Pages redact.pageRedactionNumbers.title=Pages
redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) redact.pageRedactionNumbers.placeholder=(ex: 1,2,8 ou 4,7,12-16 ou 2n-1)
redact.redactionColor.title=Redaction Color redact.redactionColor.title=Couleur
redact.export=Export redact.export=Exporter
redact.upload=Upload redact.upload=Téléverser
redact.boxRedaction=Box draw redaction redact.boxRedaction=Dessiner le rectangle à rédiger
redact.zoom=Zoom redact.zoom=Zoom
redact.zoomIn=Zoom in redact.zoomIn=Zoom avant
redact.zoomOut=Zoom out redact.zoomOut=Zoom arrière
redact.nextPage=Next Page redact.nextPage=Page suivante
redact.previousPage=Previous Page redact.previousPage=Page précédente
redact.toggleSidebar=Toggle Sidebar redact.toggleSidebar=Toggle Sidebar
redact.showThumbnails=Show Thumbnails redact.showThumbnails=Afficher les miniatures
redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items) redact.showDocumentOutline=Montrer les contours du document (double-click pour agrandir/réduire tous les éléments)
redact.showAttatchments=Show Attachments redact.showAttatchments=Montrer les éléments attachés
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Montrer les calques (double-click pour réinitialiser tous les calques à l'état par défaut)
redact.colourPicker=Colour Picker redact.colourPicker=Sélection de couleur
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Trouver l'élément de contour courrant
#showJS #showJS
showJS.title=Afficher le JavaScript showJS.title=Afficher le JavaScript
@@ -864,13 +864,13 @@ sign.save=Enregistrer le sceau
sign.personalSigs=Sceaux personnels sign.personalSigs=Sceaux personnels
sign.sharedSigs=Sceaux partagés sign.sharedSigs=Sceaux partagés
sign.noSavedSigs=Aucun sceau enregistré trouvé sign.noSavedSigs=Aucun sceau enregistré trouvé
sign.addToAll=Add to all pages sign.addToAll=Ajouter à toutes les pages
sign.delete=Delete sign.delete=Supprimer
sign.first=First page sign.first=Première page
sign.last=Last page sign.last=Dernière page
sign.next=Next page sign.next=Page suivante
sign.previous=Previous page sign.previous=Page précédente
sign.maintainRatio=Toggle maintain aspect ratio sign.maintainRatio=Conserver les proportions
#repair #repair
@@ -1011,14 +1011,14 @@ multiTool.undo=Undo
multiTool.redo=Redo multiTool.redo=Redo
#decrypt #decrypt
decrypt.passwordPrompt=This file is password-protected. Please enter the password: decrypt.passwordPrompt=Ce fichier est protégé par un mot de passe. Veuillez saisir le mot de passe :
decrypt.cancelled=Operation cancelled for PDF: {0} decrypt.cancelled=Operation annulée pour le PDF: {0}
decrypt.noPassword=No password provided for encrypted PDF: {0} decrypt.noPassword=Pas de mot de passe fourni pour le PDF chiffré : {0}
decrypt.invalidPassword=Please try again with the correct password. decrypt.invalidPassword=Veuillez réessayer avec le bon mot de passe
decrypt.invalidPasswordHeader=Incorrect password or unsupported encryption for PDF: {0} decrypt.invalidPasswordHeader=Mauvais mot de passe ou chiffrement non supporté pour le PDF : {0}
decrypt.unexpectedError=There was an error processing the file. Please try again. decrypt.unexpectedError=Une erreur est survenue lors de traitement du fichier. Veuillez essayer de nouveau.
decrypt.serverError=Server error while decrypting: {0} decrypt.serverError=Erreur du serveur lors du déchiffrement : {0}
decrypt.success=File decrypted successfully. decrypt.success=Fichier déchiffré avec succès.
#multiTool-advert #multiTool-advert
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles ! multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !

View File

@@ -873,6 +873,13 @@
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{
"moduleName": "org.apache.pdfbox:preflight",
"moduleUrl": "https://pdfbox.apache.org",
"moduleVersion": "3.0.3",
"moduleLicense": "Apache-2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
},
{ {
"moduleName": "org.apache.pdfbox:xmpbox", "moduleName": "org.apache.pdfbox:xmpbox",
"moduleUrl": "https://pdfbox.apache.org", "moduleUrl": "https://pdfbox.apache.org",
@@ -944,15 +951,15 @@
}, },
{ {
"moduleName": "org.bouncycastle:bcpkix-jdk18on", "moduleName": "org.bouncycastle:bcpkix-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/java.html", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
"moduleVersion": "1.79", "moduleVersion": "1.80",
"moduleLicense": "Bouncy Castle Licence", "moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
}, },
{ {
"moduleName": "org.bouncycastle:bcprov-jdk18on", "moduleName": "org.bouncycastle:bcprov-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/java.html", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
"moduleVersion": "1.79", "moduleVersion": "1.80",
"moduleLicense": "Bouncy Castle Licence", "moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
}, },
@@ -965,8 +972,8 @@
}, },
{ {
"moduleName": "org.bouncycastle:bcutil-jdk18on", "moduleName": "org.bouncycastle:bcutil-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/java.html", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
"moduleVersion": "1.79", "moduleVersion": "1.80",
"moduleLicense": "Bouncy Castle Licence", "moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html"
}, },
@@ -1658,7 +1665,7 @@
{ {
"moduleName": "org.springframework:spring-jdbc", "moduleName": "org.springframework:spring-jdbc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.1", "moduleVersion": "6.2.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1686,7 +1693,7 @@
{ {
"moduleName": "org.springframework:spring-webmvc", "moduleName": "org.springframework:spring-webmvc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.1", "moduleVersion": "6.2.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },

View File

@@ -5,6 +5,7 @@
</head> </head>
<body> <body>
<th:block th:insert="~{fragments/common :: game}"></th:block>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>

View File

@@ -1,5 +1,24 @@
#!/bin/bash #!/bin/bash
# Default value for the Boolean parameter
VERIFICATION=${1:-false} # Default is "false" if no parameter is passed
# Find project root by locating build.gradle
find_root() {
local dir="$PWD"
while [[ "$dir" != "/" ]]; do
if [[ -f "$dir/build.gradle" ]]; then
echo "$dir"
return 0
fi
dir="$(dirname "$dir")"
done
echo "Error: build.gradle not found" >&2
exit 1
}
PROJECT_ROOT=$(find_root)
# Function to check the health of the service with a timeout of 80 seconds # Function to check the health of the service with a timeout of 80 seconds
check_health() { check_health() {
local service_name=$1 local service_name=$1
@@ -64,6 +83,14 @@ run_tests() {
main() { main() {
SECONDS=0 SECONDS=0
cd "$PROJECT_ROOT"
# Run the gradlew build command and check if it fails
if [[ "$VERIFICATION" == "true" ]]; then
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256 --refresh-dependencies help
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp --refresh-keys --export-keys --refresh-dependencies help
fi
export DOCKER_ENABLE_SECURITY=false export DOCKER_ENABLE_SECURITY=false
# Run the gradlew build command and check if it fails # Run the gradlew build command and check if it fails
if ! ./gradlew clean build; then if ! ./gradlew clean build; then
@@ -80,13 +107,14 @@ main() {
run_tests "Stirling-PDF-Ultra-Lite" "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" run_tests "Stirling-PDF-Ultra-Lite" "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml"
echo "Testing webpage accessibility..." echo "Testing webpage accessibility..."
if ./cucumber/test_webpages.sh; then cd "testing"
passed_tests+=("Webpage-Accessibility") if ./test_webpages.sh -f webpage_urls.txt -b http://localhost:8080; then
passed_tests+=("Webpage-Accessibility-lite")
else else
failed_tests+=("Webpage-Accessibility") failed_tests+=("Webpage-Accessibility-lite")
echo "Webpage accessibility tests failed" echo "Webpage accessibility lite tests failed"
fi fi
cd "$PROJECT_ROOT"
docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" down docker-compose -f "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" down
@@ -113,20 +141,38 @@ main() {
# run_tests "Stirling-PDF-Security" "./exampleYmlFiles/docker-compose-latest-security.yml" # run_tests "Stirling-PDF-Security" "./exampleYmlFiles/docker-compose-latest-security.yml"
# docker-compose -f "./exampleYmlFiles/docker-compose-latest-security.yml" down # docker-compose -f "./exampleYmlFiles/docker-compose-latest-security.yml" down
run_tests "Stirling-PDF-Security-Fat" "./exampleYmlFiles/test_cicd.yml"
run_tests "Stirling-PDF-Security-Fat" "./exampleYmlFiles/docker-compose-latest-fat-security.yml"
echo "Testing webpage accessibility..."
cd "testing"
if ./test_webpages.sh -f webpage_urls_full.txt -b http://localhost:8080; then
passed_tests+=("Webpage-Accessibility-full")
else
failed_tests+=("Webpage-Accessibility-full")
echo "Webpage accessibility full tests failed"
fi
cd "$PROJECT_ROOT"
docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-security.yml" down
run_tests "Stirling-PDF-Security-Fat-with-login" "./exampleYmlFiles/test_cicd.yml"
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
cd cucumber cd "testing/cucumber"
if python -m behave; then if python -m behave; then
passed_tests+=("Stirling-PDF-Regression") passed_tests+=("Stirling-PDF-Regression")
else else
failed_tests+=("Stirling-PDF-Regression") failed_tests+=("Stirling-PDF-Regression")
echo "Printing docker logs of failed regression" echo "Printing docker logs of failed regression"
docker logs "Stirling-PDF-Security-Fat" docker logs "Stirling-PDF-Security-Fat-with-login"
echo "Printed docker logs of failed regression" echo "Printed docker logs of failed regression"
fi fi
cd .. cd "$PROJECT_ROOT"
fi fi
docker-compose -f "./exampleYmlFiles/docker-compose-latest-fat-security.yml" down
docker-compose -f "./exampleYmlFiles/test_cicd.yml" down
# Report results # Report results
echo "All tests completed in $SECONDS seconds." echo "All tests completed in $SECONDS seconds."

View File

@@ -2,17 +2,16 @@
# Function to check a single webpage # Function to check a single webpage
check_webpage() { check_webpage() {
local url=$1 local url=$(echo "$1" | tr -d '\r') # Remove carriage returns
local base_url=${2:-"http://localhost:8080"} local base_url=$(echo "$2" | tr -d '\r')
local full_url="${base_url}${url}" local full_url="${base_url}${url}"
local timeout=10 local timeout=10
echo -n "Testing $full_url ... " echo -n "Testing $full_url ... "
# Use curl to fetch the page with timeout # Use curl to fetch the page with timeout
response=$(curl -s -w "\n%{http_code}" --max-time $timeout "$full_url") response=$(curl -s -w "\n%{http_code}" --max-time $timeout "$full_url")
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "FAILED - Connection error or timeout" echo "FAILED - Connection error or timeout $full_url "
return 1 return 1
fi fi
@@ -27,7 +26,7 @@ check_webpage() {
fi fi
# Check if response contains HTML # Check if response contains HTML
if ! echo "$BODY" | grep -q "<!DOCTYPE html>\|<html"; then if ! printf '%s' "$BODY" | grep -q "<!DOCTYPE html>\|<html"; then
echo "FAILED - Response is not HTML" echo "FAILED - Response is not HTML"
return 1 return 1
fi fi
@@ -46,11 +45,12 @@ test_all_urls() {
echo "Starting webpage tests..." echo "Starting webpage tests..."
echo "Base URL: $base_url" echo "Base URL: $base_url"
echo "Number of lines: $(wc -l < "$url_file")"
echo "----------------------------------------" echo "----------------------------------------"
while IFS= read -r url || [ -n "$url" ]; do while IFS= read -r url || [ -n "$url" ]; do
# Skip empty lines # Skip empty lines and comments
[ -z "$url" ] && continue [[ -z "$url" || "$url" =~ ^#.*$ ]] && continue
((total_count++)) ((total_count++))
if ! check_webpage "$url" "$base_url"; then if ! check_webpage "$url" "$base_url"; then
@@ -60,7 +60,7 @@ test_all_urls() {
local end_time=$(date +%s) local end_time=$(date +%s)
local duration=$((end_time - start_time)) local duration=$((end_time - start_time))
echo "----------------------------------------" echo "----------------------------------------"
echo "Test Summary:" echo "Test Summary:"
echo "Total tests: $total_count" echo "Total tests: $total_count"
@@ -71,18 +71,44 @@ test_all_urls() {
return $failed_count return $failed_count
} }
# Print usage information
usage() {
echo "Usage: $0 [-f url_file] [-b base_url]"
echo "Options:"
echo " -f url_file Path to file containing URLs to test (required)"
echo " -b base_url Base URL to prepend to test URLs (default: http://localhost:8080)"
exit 1
}
# Main execution # Main execution
main() { main() {
local script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" local url_file=""
local url_file="${script_dir}/webpage_urls.txt" local base_url="http://localhost:8080"
# Parse command line options
while getopts ":f:b:h" opt; do
case $opt in
f) url_file="$OPTARG" ;;
b) base_url="$OPTARG" ;;
h) usage ;;
\?) echo "Invalid option -$OPTARG" >&2; usage ;;
esac
done
# Check if URL file is provided
if [ -z "$url_file" ]; then
echo "Error: URL file is required"
usage
fi
# Check if URL file exists
if [ ! -f "$url_file" ]; then if [ ! -f "$url_file" ]; then
echo "Error: URL list file not found: $url_file" echo "Error: URL list file not found: $url_file"
exit 1 exit 1
fi fi
# Run tests using the URL list # Run tests using the URL list
if test_all_urls "$url_file"; then if test_all_urls "$url_file" "$base_url"; then
echo "All webpage tests passed!" echo "All webpage tests passed!"
exit 0 exit 0
else else

View File

@@ -0,0 +1,66 @@
/
/add-image
/add-page-numbers
/add-password
/add-watermark
/adjust-contrast
/auto-redact
/auto-rename
/auto-split-pdf
/cert-sign
/change-metadata
/change-permissions
/compare
/compress-pdf
/crop
/extract-image-scans
/extract-images
/extract-page
/file-to-pdf
/flatten
/get-info-on-pdf
/html-to-pdf
/img-to-pdf
/licenses
/markdown-to-pdf
/merge-pdfs
/multi-page-layout
/multi-tool
/ocr-pdf
/overlay-pdf
/pdf-organizer
/pdf-to-csv
/pdf-to-html
/pdf-to-img
/pdf-to-markdown
/pdf-to-presentation
/pdf-to-single-page
/pdf-to-text
/pdf-to-word
/pdf-to-xml
/pipeline
/redact
/releases
/remove-annotations
/remove-blanks
/remove-cert-sign
/remove-image-pdf
/remove-pages
/remove-password
/repair
/replace-and-invert-color-pdf
/rotate-pdf
/sanitize-pdf
/scale-pages
/show-javascript
/sign
/split-by-size-or-count
/split-pdf-by-chapters
/split-pdf-by-sections
/split-pdfs
/stamp
/url-to-pdf
/validate-signature
/view-pdf
/swagger-ui/index.html