Merge branch 'removeReadOnlyFromForms' of github.com:PedroPF1233/Stirling-PDF into removeReadOnlyFromForms

This commit is contained in:
MariaLaranjeira 2025-04-28 23:53:24 +01:00
commit eac977676a
14 changed files with 109 additions and 54 deletions

View File

@ -70,7 +70,7 @@ jobs:
- uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1
with: with:
gradle-version: 8.12 gradle-version: 8.14
- name: Generate jar (With Security=${{ matrix.enable_security }}) - name: Generate jar (With Security=${{ matrix.enable_security }})
run: ./gradlew clean createExe run: ./gradlew clean createExe
@ -158,7 +158,7 @@ jobs:
- uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1
with: with:
gradle-version: 8.12 gradle-version: 8.14
# Install Windows dependencies # Install Windows dependencies
- name: Install WiX Toolset - name: Install WiX Toolset

View File

@ -32,7 +32,7 @@ jobs:
- uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1
with: with:
gradle-version: 8.12 gradle-version: 8.14
- name: Run Gradle Command - name: Run Gradle Command
run: ./gradlew clean build run: ./gradlew clean build

View File

@ -37,7 +37,7 @@ jobs:
- uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1
with: with:
gradle-version: 8.12 gradle-version: 8.14
- name: Generate jar (With Security=${{ matrix.enable_security }}) - name: Generate jar (With Security=${{ matrix.enable_security }})
run: ./gradlew clean createExe run: ./gradlew clean createExe

View File

@ -128,14 +128,14 @@ Stirling-PDF currently supports 39 languages!
| 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) | ![92%](https://geps.dev/progress/92) |
| German (Deutsch) (de_DE) | ![94%](https://geps.dev/progress/94) | | German (Deutsch) (de_DE) | ![100%](https://geps.dev/progress/100) |
| Greek (Ελληνικά) (el_GR) | ![91%](https://geps.dev/progress/91) | | Greek (Ελληνικά) (el_GR) | ![91%](https://geps.dev/progress/91) |
| Hindi (हिंदी) (hi_IN) | ![92%](https://geps.dev/progress/92) | | Hindi (हिंदी) (hi_IN) | ![92%](https://geps.dev/progress/92) |
| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | | Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) |
| Indonesian (Bahasa Indonesia) (id_ID) | ![81%](https://geps.dev/progress/81) | | Indonesian (Bahasa Indonesia) (id_ID) | ![81%](https://geps.dev/progress/81) |
| Irish (Gaeilge) (ga_IE) | ![92%](https://geps.dev/progress/92) | | Irish (Gaeilge) (ga_IE) | ![92%](https://geps.dev/progress/92) |
| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) |
| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | | Japanese (日本語) (ja_JP) | ![94%](https://geps.dev/progress/94) |
| Korean (한국어) (ko_KR) | ![92%](https://geps.dev/progress/92) | | Korean (한국어) (ko_KR) | ![92%](https://geps.dev/progress/92) |
| Norwegian (Norsk) (no_NB) | ![86%](https://geps.dev/progress/86) | | Norwegian (Norsk) (no_NB) | ![86%](https://geps.dev/progress/86) |
| Persian (فارسی) (fa_IR) | ![88%](https://geps.dev/progress/88) | | Persian (فارسی) (fa_IR) | ![88%](https://geps.dev/progress/88) |

View File

@ -404,7 +404,7 @@ sonar {
// rules=['unused-dependency'] // rules=['unused-dependency']
// } // }
tasks.wrapper { tasks.wrapper {
gradleVersion = "8.12" gradleVersion = "8.14"
distributionType = Wrapper.DistributionType.ALL distributionType = Wrapper.DistributionType.ALL
} }
//tasks.withType(JavaCompile) { //tasks.withType(JavaCompile) {

Binary file not shown.

View File

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME

6
gradlew vendored
View File

@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@ -205,7 +205,7 @@ fi
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command: # Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped. # and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line. # treated as '${Hostname}' itself on the command line.
@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.

4
gradlew.bat vendored
View File

@ -70,11 +70,11 @@ goto fail
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar set CLASSPATH=
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

View File

@ -1 +1,5 @@
plugins {
// Apply the foojay-resolver plugin to allow automatic download of JDKs
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.10.0'
}
rootProject.name = 'Stirling-PDF' rootProject.name = 'Stirling-PDF'

View File

@ -121,7 +121,7 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter {
if (probe.isConsumed()) { if (probe.isConsumed()) {
response.setHeader( response.setHeader(
"X-Rate-Limit-Remaining", "X-Rate-Limit-Remaining",
Newlines.stripAll(Long.toString(probe.getRemainingTokens()))); stripNewlines(Newlines.stripAll(Long.toString(probe.getRemainingTokens()))));
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} else { } else {
long waitForRefill = probe.getNanosToWaitForRefill() / 1_000_000_000; long waitForRefill = probe.getNanosToWaitForRefill() / 1_000_000_000;
@ -141,4 +141,8 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter {
.build(); .build();
return Bucket.builder().addLimit(limit).build(); return Bucket.builder().addLimit(limit).build();
} }
private static String stripNewlines(final String s) {
return s.replaceAll("[\n\r]", "");
}
} }

View File

@ -34,7 +34,8 @@ class PdfContainer {
this.splitPDF = this.splitPDF.bind(this); this.splitPDF = this.splitPDF.bind(this);
this.splitAll = this.splitAll.bind(this); this.splitAll = this.splitAll.bind(this);
this.deleteSelected = this.deleteSelected.bind(this); this.deleteSelected = this.deleteSelected.bind(this);
this.toggleSelectAll = this.toggleSelectAll.bind(this); this.selectAll = this.selectAll.bind(this);
this.deselectAll = this.deselectAll.bind(this);
this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this); this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this);
this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this); this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this);
this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this); this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this);
@ -63,7 +64,8 @@ class PdfContainer {
window.rotateAll = this.rotateAll; window.rotateAll = this.rotateAll;
window.splitAll = this.splitAll; window.splitAll = this.splitAll;
window.deleteSelected = this.deleteSelected; window.deleteSelected = this.deleteSelected;
window.toggleSelectAll = this.toggleSelectAll; window.selectAll = this.selectAll;
window.deselectAll = this.deselectAll;
window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay;
window.toggleSelectPageVisibility = this.toggleSelectPageVisibility; window.toggleSelectPageVisibility = this.toggleSelectPageVisibility;
window.updatePagesFromCSV = this.updatePagesFromCSV; window.updatePagesFromCSV = this.updatePagesFromCSV;
@ -72,7 +74,6 @@ class PdfContainer {
window.addFilesBlankAll = this.addFilesBlankAll; window.addFilesBlankAll = this.addFilesBlankAll;
window.removeAllElements = this.removeAllElements; window.removeAllElements = this.removeAllElements;
window.resetPages = this.resetPages; window.resetPages = this.resetPages;
window.selectAll = false;
let undoBtn = document.getElementById('undo-btn'); let undoBtn = document.getElementById('undo-btn');
let redoBtn = document.getElementById('redo-btn'); let redoBtn = document.getElementById('redo-btn');
@ -433,33 +434,43 @@ class PdfContainer {
this.undoManager.pushUndoClearRedo(removeSelectedCommand); this.undoManager.pushUndoClearRedo(removeSelectedCommand);
} }
toggleSelectAll() { selectAll() {
const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); const checkboxes = document.querySelectorAll('.pdf-actions_checkbox');
window.selectAll = !window.selectAll;
const selectIcon = document.getElementById('select-All-Container'); const selectIcon = document.getElementById('select-All-Container');
const deselectIcon = document.getElementById('deselect-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container');
if (!window.selectAll) { this.showButton(selectIcon, false);
this.showButton(selectIcon, true); this.showButton(deselectIcon, true);
this.showButton(deselectIcon, false);
} else {
this.showButton(selectIcon, false);
this.showButton(deselectIcon, true);
}
checkboxes.forEach((checkbox) => { checkboxes.forEach((checkbox) => {
checkbox.checked = window.selectAll; checkbox.checked = true;
const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1;
if (checkbox.checked) { if (!window.selectedPages.includes(pageNumber)) {
if (!window.selectedPages.includes(pageNumber)) { window.selectedPages.push(pageNumber);
window.selectedPages.push(pageNumber); }
} });
} else {
const index = window.selectedPages.indexOf(pageNumber); this.updateSelectedPagesDisplay();
if (index !== -1) { }
window.selectedPages.splice(index, 1);
} deselectAll() {
const checkboxes = document.querySelectorAll('.pdf-actions_checkbox');
const selectIcon = document.getElementById('select-All-Container');
const deselectIcon = document.getElementById('deselect-All-Container');
this.showButton(selectIcon, true);
this.showButton(deselectIcon, false);
checkboxes.forEach((checkbox) => {
checkbox.checked = false;
const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1;
const index = window.selectedPages.indexOf(pageNumber);
if (index !== -1) {
window.selectedPages.splice(index, 1);
} }
}); });
@ -569,6 +580,34 @@ class PdfContainer {
// Update the input field with the formatted page list // Update the input field with the formatted page list
selectedPagesInput.value = this.formatSelectedPages(window.selectedPages); selectedPagesInput.value = this.formatSelectedPages(window.selectedPages);
const selectIcon = document.getElementById('select-All-Container');
const deselectIcon = document.getElementById('deselect-All-Container');
if (window.selectPage) { // Check if selectPage mode is active
console.log("Page Select on. Showing buttons");
//Check if no pages are selected
if (window.selectedPages.length === 0) {
this.showButton(selectIcon, true);
this.showButton(deselectIcon, false);
} else {
this.showButton(deselectIcon, true);
}
//Check if all pages are selected
const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox');
const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked);
if (allSelected) {
this.showButton(selectIcon, false);
this.showButton(deselectIcon, true);
} else {
this.showButton(selectIcon, true);
}
} else {
console.log("Page Select off. Hidding buttons");
this.showButton(selectIcon, false);
this.showButton(deselectIcon, false);
}
} }
parsePageRanges(ranges) { parsePageRanges(ranges) {
@ -793,13 +832,9 @@ class PdfContainer {
}); });
const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); const checkboxes = document.querySelectorAll('.pdf-actions_checkbox');
window.selectAll = false;
const selectIcon = document.getElementById('select-All-Container'); const selectIcon = document.getElementById('select-All-Container');
const deselectIcon = document.getElementById('deselect-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container');
selectIcon.style.display = 'inline';
deselectIcon.style.display = 'none';
checkboxes.forEach((checkbox) => { checkboxes.forEach((checkbox) => {
const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1;
@ -852,18 +887,30 @@ class PdfContainer {
deleteButton.classList.toggle('hidden', !window.selectPage); deleteButton.classList.toggle('hidden', !window.selectPage);
const selectedPages = document.getElementById('selected-pages-display'); const selectedPages = document.getElementById('selected-pages-display');
selectedPages.classList.toggle('hidden', !window.selectPage); selectedPages.classList.toggle('hidden', !window.selectPage);
if(!window.selectPage) if(!window.selectPage)
{ {
this.showButton(document.getElementById('deselect-All-Container'), false); this.showButton(document.getElementById('deselect-All-Container'), false);
this.showButton(document.getElementById('select-All-Container'), false); this.showButton(document.getElementById('select-All-Container'), false);
}
else if(window.selectAll){ // Uncheck all checkboxes and clear selected pages
this.showButton(document.getElementById('deselect-All-Container'), true); const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox');
this.showButton(document.getElementById('select-All-Container'), false); allCheckboxes.forEach((checkbox) => {
checkbox.checked = false;
});
window.selectedPages = [];
this.updateSelectedPagesDisplay();
} }
else{ else{
this.showButton(document.getElementById('deselect-All-Container'), false); const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox');
this.showButton(document.getElementById('select-All-Container'), true); const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked);
if (!allSelected) {
this.showButton(document.getElementById('select-All-Container'), true);
}
if (window.selectedPages.length > 0) {
this.showButton(document.getElementById('deselect-All-Container'), true);
}
} }
const exportSelected = document.getElementById('export-selected-button'); const exportSelected = document.getElementById('export-selected-button');

View File

@ -94,11 +94,11 @@
</span> </span>
</button> </button>
<button id="deselect-All-Container" th:title="#{multiTool.deselectAll}" <button id="deselect-All-Container" th:title="#{multiTool.deselectAll}"
class="btn btn-secondary enable-on-file hidden" onclick="toggleSelectAll()" disabled> class="btn btn-secondary enable-on-file hidden" onclick="deselectAll()" disabled>
<span class="material-symbols-rounded" id="deselect-icon">deselect</span> <span class="material-symbols-rounded" id="deselect-icon">deselect</span>
</button> </button>
<button id="select-All-Container" th:title="#{multiTool.selectAll}" <button id="select-All-Container" th:title="#{multiTool.selectAll}"
class="btn btn-secondary enable-on-file hidden" onclick="toggleSelectAll()" disabled> class="btn btn-secondary enable-on-file hidden" onclick="selectAll()" disabled>
<span class="material-symbols-rounded" id="select-icon">select_all</span> <span class="material-symbols-rounded" id="select-icon">select_all</span>
</button> </button>
<button id="delete-button" th:title="#{multiTool.deleteSelected}" <button id="delete-button" th:title="#{multiTool.deleteSelected}"

View File

@ -26,7 +26,7 @@ check_webpage() {
fi fi
# Check if response contains HTML # Check if response contains HTML
if ! printf '%s' "$BODY" | grep -q "<!DOCTYPE html>\|<html"; then if ! grep -q "<!DOCTYPE html>\|<html" <<< "$BODY"; then
echo "FAILED - Response is not HTML - $full_url" >> "$result_file" echo "FAILED - Response is not HTML - $full_url" >> "$result_file"
return 1 return 1
fi fi