From ee76f917e8a92f8e49db6043ef16a45cfea362ad Mon Sep 17 00:00:00 2001 From: Riliane Date: Tue, 31 May 2022 12:12:05 +0300 Subject: [PATCH 001/178] JENKINS-68639 Check whether an icon path already contains the context path before appending the context path to it --- core/src/main/java/hudson/Functions.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index a67bf746c3b8..5033bb5b4bb9 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2377,7 +2377,9 @@ public static String tryGetIconPath(String iconGuess, JellyContext context) { if (!iconGuess.startsWith("/")) { iconGuess = "/" + iconGuess; } - iconSource = rootURL + (iconGuess.startsWith("/images/") || iconGuess.startsWith("/plugin/") ? getResourcePath() : "") + iconGuess; + iconSource = iconGuess.startsWith(rootURL) ? "" : rootURL; + iconSource += (iconGuess.startsWith("/images/") || iconGuess.startsWith("/plugin/") ? getResourcePath() : + "") + iconGuess; } if (iconMetadata != null && iconMetadata.getClassSpec() != null) { From 78dd3193a4f8703a3c0fb45603448c2ed1932e26 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Wed, 1 Jun 2022 15:22:22 +0200 Subject: [PATCH 002/178] Refactor parts of Functions#tryGetIconPath for testability Add testing for Functions#guessIcon cases. Refactor icons translation to a static block as it should happen only once. --- core/src/main/java/hudson/Functions.java | 32 +++++++-------- .../java/org/jenkins/ui/icon/IconSet.java | 41 ++++++++++++++----- core/src/test/java/hudson/FunctionsTest.java | 13 ++++++ 3 files changed, 58 insertions(+), 28 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 5033bb5b4bb9..a57bd943063b 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2363,32 +2363,30 @@ public static String tryGetIconPath(String iconGuess, JellyContext context) { currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse()); String rootURL = currentRequest.getContextPath(); Icon iconMetadata = tryGetIcon(iconGuess); - String iconSource = null; + String iconSource; if (iconMetadata != null) { - iconSource = iconMetadata.getQualifiedUrl(context); + iconSource = IconSet.tryTranslateTangoIconToSymbol(iconMetadata.getClassSpec(), () -> iconMetadata.getQualifiedUrl(context)); + } else { + iconSource = guessIcon(iconGuess, rootURL); } + return iconSource; + } - if (iconMetadata == null) { - //noinspection HttpUrlsUsage - if (iconGuess.startsWith("http://") || iconGuess.startsWith("https://")) { - return iconGuess; - } + static String guessIcon(String iconGuess, String rootURL) { + String iconSource; + //noinspection HttpUrlsUsage + if (iconGuess.startsWith("http://") || iconGuess.startsWith("https://")) { + iconSource = iconGuess; + } else { if (!iconGuess.startsWith("/")) { iconGuess = "/" + iconGuess; } - iconSource = iconGuess.startsWith(rootURL) ? "" : rootURL; - iconSource += (iconGuess.startsWith("/images/") || iconGuess.startsWith("/plugin/") ? getResourcePath() : - "") + iconGuess; - } - - if (iconMetadata != null && iconMetadata.getClassSpec() != null) { - String translatedIcon = IconSet.tryTranslateTangoIconToSymbol(iconMetadata.getClassSpec()); - if (translatedIcon != null) { - return translatedIcon; + if (iconGuess.startsWith(rootURL)) { + iconGuess = iconGuess.substring(rootURL.length()); } + iconSource = rootURL + (iconGuess.startsWith("/images/") || iconGuess.startsWith("/plugin/") ? getResourcePath() : "") + iconGuess; } - return iconSource; } diff --git a/core/src/main/java/org/jenkins/ui/icon/IconSet.java b/core/src/main/java/org/jenkins/ui/icon/IconSet.java index 13e6716d2a0d..7e2e0d9d0c68 100644 --- a/core/src/main/java/org/jenkins/ui/icon/IconSet.java +++ b/core/src/main/java/org/jenkins/ui/icon/IconSet.java @@ -24,6 +24,8 @@ package org.jenkins.ui.icon; +import edu.umd.cs.findbugs.annotations.CheckForNull; +import edu.umd.cs.findbugs.annotations.NonNull; import hudson.PluginWrapper; import hudson.Util; import java.io.IOException; @@ -34,6 +36,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; import jenkins.model.Jenkins; import org.apache.commons.io.IOUtils; import org.apache.commons.jelly.JellyContext; @@ -565,16 +568,9 @@ private static void initializeSVGs() { } } - /** - * This is a temporary function to replace Tango icons across Jenkins and plugins with - * appropriate Jenkins Symbols - * - * @param tangoIcon A tango icon in the format 'icon-* size-*', e.g. 'icon-gear icon-lg' - * @return a Jenkins Symbol (if one exists) otherwise null - */ - @Restricted(NoExternalUse.class) - public static String tryTranslateTangoIconToSymbol(String tangoIcon) { + private static final Map ICON_TO_SYMBOL_TRANSLATIONS; + static { Map translations = new HashMap<>(); translations.put("icon-application-certificate", "symbol-ribbon"); translations.put("icon-document", "symbol-document-text"); @@ -598,9 +594,32 @@ public static String tryTranslateTangoIconToSymbol(String tangoIcon) { translations.put("icon-text", "symbol-details"); translations.put("icon-up", "symbol-arrow-up"); translations.put("icon-user", "symbol-people"); + ICON_TO_SYMBOL_TRANSLATIONS = translations; + } - String cleanedTangoIcon = cleanName(tangoIcon); - return translations.getOrDefault(cleanedTangoIcon, null); + /** + * This is a temporary function to replace Tango icons across Jenkins and plugins with + * appropriate Jenkins Symbols + * + * @param tangoIcon A tango icon in the format 'icon-* size-*', e.g. 'icon-gear icon-lg' + * @return a Jenkins Symbol (if one exists) otherwise null + */ + @Restricted(NoExternalUse.class) + public static String tryTranslateTangoIconToSymbol(@CheckForNull String tangoIcon) { + return tryTranslateTangoIconToSymbol(tangoIcon, () -> null); + } + + /** + * This is a temporary function to replace Tango icons across Jenkins and plugins with + * appropriate Jenkins Symbols + * + * @param tangoIcon A tango icon in the format 'icon-* size-*', e.g. 'icon-gear icon-lg' + * @param defaultValueSupplier A supplier function that will be called if no icon translation is found + * @return a Jenkins Symbol (if one exists) otherwise the value returned by the supplier + */ + @Restricted(NoExternalUse.class) + public static String tryTranslateTangoIconToSymbol(@CheckForNull String tangoIcon, @NonNull Supplier defaultValueSupplier) { + return tangoIcon == null ? null : ICON_TO_SYMBOL_TRANSLATIONS.getOrDefault(cleanName(tangoIcon), defaultValueSupplier.get()); } private static String cleanName(String tangoIcon) { diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index fff8391321fd..30d6d31c97c8 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -676,4 +676,17 @@ public void tryGetIcon_shouldReturnMetadataForUrl() throws Exception { public void tryGetIcon_shouldReturnNullForUnknown() throws Exception { assertThat(Functions.tryGetIcon("icon-nosuchicon"), is(nullValue())); } + + @Test + public void guessIcon() throws Exception { + Jenkins.RESOURCE_PATH = "/static/12345678"; + assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("jenkins/images/48x48/green.gif", "/jenkins")); + assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("/jenkins/images/48x48/green.gif", "/jenkins")); + assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("images/48x48/green.gif", "/jenkins")); + assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("/images/48x48/green.gif", "/jenkins")); + assertEquals("/jenkins/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/plugin/myartifactId/images/48x48/green.gif", "/jenkins")); + assertEquals("/jenkins/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/jenkins/plugin/myartifactId/images/48x48/green.gif", "/jenkins")); + assertEquals("http://acme.com/icon.svg", Functions.guessIcon("http://acme.com/icon.svg", "/jenkins")); + assertEquals("https://acme.com/icon.svg", Functions.guessIcon("https://acme.com/icon.svg", "/jenkins")); + } } From 8477b3c3b1efc03c5ed4fad43a538da9cbae6888 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jun 2022 08:05:38 -0700 Subject: [PATCH 003/178] Bump junit from 1.63 to 1119.va_a_5e9068da_d7 (#6617) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 883edac759f0..13a768775bf2 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -151,7 +151,7 @@ THE SOFTWARE. org.jenkins-ci.plugins junit - 1.63 + 1119.va_a_5e9068da_d7 test From a6d86b9bb52a9c17ce8fec4f674df2024fe222c5 Mon Sep 17 00:00:00 2001 From: frankie139506 <97017043+frankie139506@users.noreply.github.com> Date: Fri, 3 Jun 2022 00:25:52 +0800 Subject: [PATCH 004/178] [JENKINS-67846] Icon alignment of build status is wrong (#6595) --- core/src/main/resources/lib/hudson/buildLink.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/lib/hudson/buildLink.jelly b/core/src/main/resources/lib/hudson/buildLink.jelly index 61bcf8ff481b..18ccfc1ec675 100644 --- a/core/src/main/resources/lib/hudson/buildLink.jelly +++ b/core/src/main/resources/lib/hudson/buildLink.jelly @@ -52,7 +52,7 @@ THE SOFTWARE. - ${jobName_}#${number} + ${jobName_}#${number} From ce5a3f81d1f1895893cc234e39438f3495b2433d Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 2 Jun 2022 23:47:51 +0200 Subject: [PATCH 005/178] Optional property can now have an inline help (#6615) --- core/src/main/resources/lib/form/optionalProperty.jelly | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/lib/form/optionalProperty.jelly b/core/src/main/resources/lib/form/optionalProperty.jelly index 1afe8e5f538b..5d646235fdef 100644 --- a/core/src/main/resources/lib/form/optionalProperty.jelly +++ b/core/src/main/resources/lib/form/optionalProperty.jelly @@ -33,12 +33,13 @@ THE SOFTWARE. and the presence of the value. + - + From a4f9f5b64b441172f6a1d871a7c615c03ac26235 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Jun 2022 10:59:56 -0700 Subject: [PATCH 006/178] Bump mockito-inline from 4.6.0 to 4.6.1 (#6619) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3d0aac43f8ba..a975a7e75c7c 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ THE SOFTWARE. 1.27 1.23 5.8.2 - 4.6.0 + 4.6.1 2.22.5 From c63a8cee6757136433c3d1320a05c8721c11bc6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 08:31:32 -0700 Subject: [PATCH 007/178] Bump `cloudbees-folder` from 6.722.v8165b_a_cf25e9 to 6.729.v2b_9d1a_74d673 (#6622) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 13a768775bf2..8c2ab093c5fe 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -145,7 +145,7 @@ THE SOFTWARE. org.jenkins-ci.plugins cloudbees-folder - 6.722.v8165b_a_cf25e9 + 6.729.v2b_9d1a_74d673 test From 5b4434c16f85b95e4d83caf7250b58a98d3e6913 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 08:31:51 -0700 Subject: [PATCH 008/178] Bump Spotless from 2.22.5 to 2.22.6 (#6623) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a975a7e75c7c..3e278982eea6 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ THE SOFTWARE. 1.23 5.8.2 4.6.1 - 2.22.5 + 2.22.6 2.22.2 From b650de6960c8ba99780fc6f653dcf4b9f7a877a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Jun 2022 08:32:12 -0700 Subject: [PATCH 009/178] Bump `jenkins-test-harness` from 1752.v86627a_c48d91 to 1753.v45c760e2400f (#6624) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 8c2ab093c5fe..3bb7f0e85dca 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -85,7 +85,7 @@ THE SOFTWARE. ${project.groupId} jenkins-test-harness - 1752.v86627a_c48d91 + 1753.v45c760e2400f test From 295485eeaeec856f295c38d999c6fb3c656f234c Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 7 Jun 2022 19:15:18 +0000 Subject: [PATCH 010/178] [maven-release-plugin] prepare release jenkins-2.351 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index a2929a173b77..749b3703c065 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 2bfaf2dd6a86..8d737930bfb6 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 cli diff --git a/core/pom.xml b/core/pom.xml index 27554bf94680..10abe04f57ae 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 9f27c8d11cf0..f2d3b1b9ad8e 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 jenkins-coverage diff --git a/pom.xml b/pom.xml index 3e278982eea6..b0233d780a53 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.351 https://github.com/jenkinsci/jenkins diff --git a/test/pom.xml b/test/pom.xml index 3bb7f0e85dca..649e0fb8c85c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index dfc597a0ae46..24201e2b8c9a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.351 jenkins-war From ceddca397270e7600a8f38c15bff1116865111cb Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 7 Jun 2022 19:15:40 +0000 Subject: [PATCH 011/178] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 749b3703c065..a2929a173b77 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.351 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 8d737930bfb6..2bfaf2dd6a86 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.351 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index 10abe04f57ae..27554bf94680 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.351 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index f2d3b1b9ad8e..9f27c8d11cf0 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.351 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index b0233d780a53..bce2ac2c0f0c 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.351 + ${revision}${changelist} pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.351 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -71,7 +71,7 @@ THE SOFTWARE. - 2.351 + 2.352 -SNAPSHOT clean install - -DskipTests -Danimal.sniffer.skip=false javadoc:javadoc deploy + -DskipTests -Danimal.sniffer.skip=false -Dspotbugs.skip -Dmaven.checkstyle.skip -Dspotless.check.skip generate-resources javadoc:javadoc deploy false true jenkins-@{project.version} From adb1028f7c63d295e83620a54344f9495b0053e4 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Wed, 8 Jun 2022 17:35:50 +0000 Subject: [PATCH 017/178] [maven-release-plugin] prepare release jenkins-2.354 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index a2929a173b77..90e52b379879 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 2bfaf2dd6a86..1e7bfdf8d9ad 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 cli diff --git a/core/pom.xml b/core/pom.xml index 27554bf94680..3a0c7d738135 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 9f27c8d11cf0..035abb0b0c87 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 jenkins-coverage diff --git a/pom.xml b/pom.xml index efd241cbbd6d..7d073653a025 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.354 https://github.com/jenkinsci/jenkins diff --git a/test/pom.xml b/test/pom.xml index 3bb7f0e85dca..5b0bfe3ce618 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index dfc597a0ae46..e00db507ec6c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.354 jenkins-war From 3d2692776360d36819fda9e8deb9723521698e76 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Wed, 8 Jun 2022 17:36:13 +0000 Subject: [PATCH 018/178] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 90e52b379879..a2929a173b77 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.354 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 1e7bfdf8d9ad..2bfaf2dd6a86 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.354 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index 3a0c7d738135..27554bf94680 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.354 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 035abb0b0c87..9f27c8d11cf0 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.354 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index 7d073653a025..d0efa5fad27d 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.354 + ${revision}${changelist} pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.354 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -71,7 +71,7 @@ THE SOFTWARE. - 2.354 + 2.355 -SNAPSHOT ? diff --git a/test/src/test/java/jenkins/security/Security2779Test.java b/test/src/test/java/jenkins/security/Security2779Test.java new file mode 100644 index 000000000000..a26d2c809cff --- /dev/null +++ b/test/src/test/java/jenkins/security/Security2779Test.java @@ -0,0 +1,84 @@ +package jenkins.security; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.gargoylesoftware.htmlunit.AlertHandler; +import com.gargoylesoftware.htmlunit.ScriptResult; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.model.UnprotectedRootAction; +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; + +@RunWith(Parameterized.class) +public class Security2779Test { + public static final String URL_NAME = "security2779"; + private final String selector; + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Parameterized.Parameters + public static Collection getSelectors() { + return Arrays.asList("#link-panel a", "#icon-panel svg"); + } + + public Security2779Test(String selector) { + this.selector = selector; + } + + @Test + public void noXssInHelp() throws Exception { + final AtomicInteger alerts = new AtomicInteger(); + final JenkinsRule.WebClient webClient = j.createWebClient(); + webClient.setAlertHandler((AlertHandler) (p, s) -> alerts.addAndGet(1)); + final HtmlPage page = webClient.goTo(URL_NAME); + final ScriptResult eventScript = page.executeJavaScript("document.querySelector('" + selector + "').dispatchEvent(new Event('mouseover'))"); + final Object eventResult = eventScript.getJavaScriptResult(); + assertThat(eventResult, instanceOf(boolean.class)); + Assert.assertTrue((boolean) eventResult); + webClient.waitForBackgroundJavaScript(2000); + Assert.assertEquals(0, alerts.get()); + + final ScriptResult innerHtmlScript = page.executeJavaScript("document.querySelector('#tt').innerHTML"); + Object jsResult = innerHtmlScript.getJavaScriptResult(); + assertThat(jsResult, instanceOf(String.class)); + String jsResultString = (String) jsResult; + + // assert leading space to identify unintentional double-escaping (&lt;) as test failure + assertThat("tooltip does not contain dangerous HTML", jsResultString, not(containsString(" "; + } + } +} diff --git a/test/src/test/resources/jenkins/security/Security2779Test/ViewHolder/index.jelly b/test/src/test/resources/jenkins/security/Security2779Test/ViewHolder/index.jelly new file mode 100644 index 000000000000..3cd5e2e3d4b5 --- /dev/null +++ b/test/src/test/resources/jenkins/security/Security2779Test/ViewHolder/index.jelly @@ -0,0 +1,13 @@ + + + + + +
+ +
+
+
+
From 37bd66a43ad561f670db7440f493d69518741d27 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 9 Jun 2022 03:46:22 +0000 Subject: [PATCH 022/178] [SECURITY-2777] --- core/src/main/java/hudson/Functions.java | 1 - .../jenkins/security/Security2777Test.java | 50 +++++++++++++++++++ .../ViewHolder/fragmentWithIcon.jelly | 6 +++ .../ViewHolder/fragmentWithoutIcon.jelly | 5 ++ .../Security2777Test/ViewHolder/index.jelly | 8 +++ 5 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 test/src/test/java/jenkins/security/Security2777Test.java create mode 100644 test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithIcon.jelly create mode 100644 test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithoutIcon.jelly create mode 100644 test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/index.jelly diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index a67bf746c3b8..7c54c1440524 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2360,7 +2360,6 @@ public static String tryGetIconPath(String iconGuess, JellyContext context) { } StaplerRequest currentRequest = Stapler.getCurrentRequest(); - currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse()); String rootURL = currentRequest.getContextPath(); Icon iconMetadata = tryGetIcon(iconGuess); String iconSource = null; diff --git a/test/src/test/java/jenkins/security/Security2777Test.java b/test/src/test/java/jenkins/security/Security2777Test.java new file mode 100644 index 000000000000..c02a9d456d1f --- /dev/null +++ b/test/src/test/java/jenkins/security/Security2777Test.java @@ -0,0 +1,50 @@ +package jenkins.security; + +import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; +import hudson.model.UnprotectedRootAction; +import java.io.IOException; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; + +public class Security2777Test { + public static final String ACTION_URL = "security2777"; + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void testView() throws IOException { + final JenkinsRule.WebClient wc = j.createWebClient(); + + // no exception on action index page + wc.getPage(wc.getContextPath() + ACTION_URL); + + final FailingHttpStatusCodeException ex2 = Assert.assertThrows("no icon, no response", FailingHttpStatusCodeException.class, () -> wc.getPage(wc.getContextPath() + ACTION_URL + "/fragmentWithoutIcon")); + Assert.assertEquals("it's 404", 404, ex2.getStatusCode()); + + final FailingHttpStatusCodeException ex3 = Assert.assertThrows("icon, still no response", FailingHttpStatusCodeException.class, () -> wc.getPage(wc.getContextPath() + ACTION_URL + "/fragmentWithIcon")); + Assert.assertEquals("it's 404", 404, ex3.getStatusCode()); + } + + @TestExtension + public static class ViewHolder implements UnprotectedRootAction { + + @Override + public String getIconFileName() { + return null; + } + + @Override + public String getDisplayName() { + return null; + } + + @Override + public String getUrlName() { + return ACTION_URL; + } + } +} diff --git a/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithIcon.jelly b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithIcon.jelly new file mode 100644 index 000000000000..73d9b92b8f8c --- /dev/null +++ b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithIcon.jelly @@ -0,0 +1,6 @@ + + + + +

Help!

+
diff --git a/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithoutIcon.jelly b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithoutIcon.jelly new file mode 100644 index 000000000000..29585bea6c23 --- /dev/null +++ b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/fragmentWithoutIcon.jelly @@ -0,0 +1,5 @@ + + +

Help!

+

I'm just HTML!

+
diff --git a/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/index.jelly b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/index.jelly new file mode 100644 index 000000000000..c8961bf0ccb3 --- /dev/null +++ b/test/src/test/resources/jenkins/security/Security2777Test/ViewHolder/index.jelly @@ -0,0 +1,8 @@ + + + + +

Hello

+
+
+
From 49c4cda2d41719d66a4eb4d6f9c31ba8298f2fbf Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 9 Jun 2022 03:46:29 +0000 Subject: [PATCH 023/178] [SECURITY-2776][SECURITY-2780] --- .../java/org/jenkins/ui/icon/IconSet.java | 13 ++-- .../views/BuildButtonColumn/column.jelly | 2 +- core/src/main/resources/lib/layout/icon.jelly | 7 +- .../jenkins/security/Security2776Test.java | 76 +++++++++++++++++++ .../jenkins/security/Security2780Test.java | 41 ++++++++++ .../Security2776Test/ViewHolder/index.jelly | 33 ++++++++ 6 files changed, 163 insertions(+), 9 deletions(-) create mode 100644 test/src/test/java/jenkins/security/Security2776Test.java create mode 100644 test/src/test/java/jenkins/security/Security2780Test.java create mode 100644 test/src/test/resources/jenkins/security/Security2776Test/ViewHolder/index.jelly diff --git a/core/src/main/java/org/jenkins/ui/icon/IconSet.java b/core/src/main/java/org/jenkins/ui/icon/IconSet.java index 6004ed4efadb..8803fb26ecec 100644 --- a/core/src/main/java/org/jenkins/ui/icon/IconSet.java +++ b/core/src/main/java/org/jenkins/ui/icon/IconSet.java @@ -24,6 +24,7 @@ package org.jenkins.ui.icon; +import hudson.Functions; import hudson.PluginWrapper; import hudson.Util; import java.io.IOException; @@ -93,12 +94,12 @@ public static String getSymbol(String name, String title, String tooltip, String symbol = symbol.replaceAll("(tooltip=\")[^&]*?(\")", ""); symbol = symbol.replaceAll("(id=\")[^&]*?(\")", ""); if (!tooltip.isEmpty()) { - symbol = symbol.replaceAll(" - + diff --git a/core/src/main/resources/lib/layout/icon.jelly b/core/src/main/resources/lib/layout/icon.jelly index fe742d7c26bd..a1e1083ba975 100644 --- a/core/src/main/resources/lib/layout/icon.jelly +++ b/core/src/main/resources/lib/layout/icon.jelly @@ -43,9 +43,12 @@ THE SOFTWARE.
onclick handler. Deprecated; assign an ID and look up the element that way to attach event handlers. - title, deprecated use tooltip instead + title, deprecated use tooltip instead, but beware of its support for HTML style - tooltip + + tooltip (supports HTML for PNG and symbol icons). + Make sure to call h.htmlAttributeEscape on all user-specified parts of the value to prevent cross-site scripting. + Icons based on classic (non-symbol) SVG do not support HTML tooltips due to how SECURITY-1955 was fixed in Jenkins 2.252 and 2.235.4, but since such icons can be upgraded to symbols, it is important to still escape user-specified parts of the text (resulting in double escaping while the icon is based on classic SVG). alt, adds invisible text suitable for screen-readers for symbols, sets the alt attribute for normal images diff --git a/test/src/test/java/jenkins/security/Security2776Test.java b/test/src/test/java/jenkins/security/Security2776Test.java new file mode 100644 index 000000000000..007950497c4d --- /dev/null +++ b/test/src/test/java/jenkins/security/Security2776Test.java @@ -0,0 +1,76 @@ +package jenkins.security; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.gargoylesoftware.htmlunit.ScriptResult; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.Util; +import hudson.model.InvisibleAction; +import hudson.model.UnprotectedRootAction; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestExtension; +import org.xml.sax.SAXException; + +public class Security2776Test { + public static final String URL_NAME = "security2776"; + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void escapedTooltipIsEscaped() throws Exception { + assertExpectedBehaviorForTooltip("#symbol-icons .unsafe svg", _getUnsafeTooltip(), true); + assertExpectedBehaviorForTooltip("#symbol-icons .safe svg", _getSafeTooltip(), false); + assertExpectedBehaviorForTooltip("#png-icons .unsafe img", _getUnsafeTooltip(), true); + assertExpectedBehaviorForTooltip("#png-icons .safe img", _getSafeTooltip(), false); + + // Outlier after the fix for SECURITY-1955 + assertExpectedBehaviorForTooltip("#svgIcons .unsafe svg", _getSafeTooltip(), false); + assertExpectedBehaviorForTooltip("#svgIcons .safe svg", Util.xmlEscape(_getSafeTooltip()), false); + } + + private void assertExpectedBehaviorForTooltip(String selector, String expectedTooltipContent, boolean alertExpected) throws IOException, SAXException { + final AtomicBoolean alerts = new AtomicBoolean(); + final JenkinsRule.WebClient wc = j.createWebClient(); + wc.setAlertHandler((p, s) -> alerts.set(true)); + final HtmlPage page = wc.goTo(URL_NAME); + page.executeJavaScript("document.querySelector('" + selector + "').dispatchEvent(new Event('mouseover'));"); + wc.waitForBackgroundJavaScript(2000L); + ScriptResult result = page.executeJavaScript("document.querySelector('#tt').innerHTML;"); + Object jsResult = result.getJavaScriptResult(); + assertThat(jsResult, instanceOf(String.class)); + String jsResultString = (String) jsResult; + assertThat(jsResultString, containsString(expectedTooltipContent)); + Assert.assertEquals(alertExpected ? "Alert expected" : "No alert expected", alertExpected, alerts.get()); + } + + private static String _getUnsafeTooltip() { + return ""; + } + + private static String _getSafeTooltip() { + return Util.xmlEscape(_getUnsafeTooltip()); + } + + @TestExtension + public static class ViewHolder extends InvisibleAction implements UnprotectedRootAction { + @Override + public String getUrlName() { + return URL_NAME; + } + + public String getUnsafeTooltip() { + return _getUnsafeTooltip(); + } + + public String getSafeTooltip() { + return _getSafeTooltip(); + } + } +} diff --git a/test/src/test/java/jenkins/security/Security2780Test.java b/test/src/test/java/jenkins/security/Security2780Test.java new file mode 100644 index 000000000000..6ff98d5ac85d --- /dev/null +++ b/test/src/test/java/jenkins/security/Security2780Test.java @@ -0,0 +1,41 @@ +package jenkins.security; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.gargoylesoftware.htmlunit.ScriptResult; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.model.FreeStyleProject; +import java.util.concurrent.atomic.AtomicBoolean; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +public class Security2780Test { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void buildButtonTooltipHasNoXss() throws Exception { + FreeStyleProject project = this.j.createFreeStyleProject(); + project.setDisplayName(""); + JenkinsRule.WebClient wc = this.j.createWebClient(); + + AtomicBoolean alertTriggered = new AtomicBoolean(false); + wc.setAlertHandler((p, s) -> alertTriggered.set(true)); + HtmlPage page = wc.goTo(""); + page.executeJavaScript("document.querySelector('a.jenkins-table__button').dispatchEvent(new Event('mouseover'));"); + wc.waitForBackgroundJavaScript(2000L); + ScriptResult result = page.executeJavaScript("document.querySelector('#tt').innerHTML;"); + Object jsResult = result.getJavaScriptResult(); + assertThat(jsResult, instanceOf(String.class)); + String jsResultString = (String) jsResult; + + assertThat("No unsafe HTML expected in the tooltip", jsResultString, not(containsString(" + + + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
From 848883db8d748316175930aa5fef3749ec5cdc46 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Thu, 9 Jun 2022 09:42:39 +0100 Subject: [PATCH 024/178] [JENKINS-68373] Update form validation appearance (#6460) --- .../java/hudson/util/FormFieldValidator.java | 4 +- .../java/hudson/util/FormFillFailure.java | 7 +- .../main/java/hudson/util/FormValidation.java | 6 +- core/src/main/resources/lib/form/entry.jelly | 12 +- .../main/resources/lib/form/select/select.js | 4 +- .../resources/lib/form/validateButton.jelly | 12 +- .../hudson/model/AbstractProjectTest.java | 7 +- test/src/test/java/lib/form/NumberTest.java | 2 +- war/src/main/less/base/style.less | 58 -------- war/src/main/less/form/validation.less | 84 ++++++++++++ war/src/main/less/modules/buttons-temp.less | 16 +++ war/src/main/less/styles.less | 1 + .../main/webapp/scripts/hudson-behavior.js | 126 ++++++++++-------- 13 files changed, 199 insertions(+), 140 deletions(-) create mode 100644 war/src/main/less/form/validation.less diff --git a/core/src/main/java/hudson/util/FormFieldValidator.java b/core/src/main/java/hudson/util/FormFieldValidator.java index 4453b60be333..f4ec7899a5b4 100644 --- a/core/src/main/java/hudson/util/FormFieldValidator.java +++ b/core/src/main/java/hudson/util/FormFieldValidator.java @@ -230,14 +230,12 @@ private void _errorWithMarkup(String message, String cssClass) throws IOExceptio ok(); } else { response.setContentType("text/html;charset=UTF-8"); - // 1x16 spacer needed for IE since it doesn't support min-height if (APPLY_CONTENT_SECURITY_POLICY_HEADERS) { for (String header : new String[]{"Content-Security-Policy", "X-WebKit-CSP", "X-Content-Security-Policy"}) { response.setHeader(header, "sandbox; default-src 'none';"); } } - response.getWriter().print("
" + Messages.FormValidation_Error_Details() + "
"
                 + Util.escape(Functions.printThrowable(e)) +
@@ -137,9 +136,7 @@ public String renderHtml() {
                 if (req == null) { // being called from some other context
                     return message;
                 }
-                // 1x16 spacer needed for IE since it doesn't support min-height
-                return "
" + + return "
" + message + "
"; } diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index 44f81fb1d44d..931e47ccf0ed 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -198,7 +198,7 @@ private static FormValidation _error(Kind kind, Throwable e, String message) { if (e == null) return _errorWithMarkup(Util.escape(message), kind); return _errorWithMarkup(Util.escape(message) + - " " + "
" + Messages.FormValidation_Error_Details() + "
"
             + Util.escape(Functions.printThrowable(e)) +
@@ -272,9 +272,7 @@ public String renderHtml() {
                 if (req == null) { // being called from some other context
                     return message;
                 }
-                // 1x16 spacer needed for IE since it doesn't support min-height
-                return "
" + + return "
" + message + "
"; } diff --git a/core/src/main/resources/lib/form/entry.jelly b/core/src/main/resources/lib/form/entry.jelly index 6799771ed99b..f8e631265294 100644 --- a/core/src/main/resources/lib/form/entry.jelly +++ b/core/src/main/resources/lib/form/entry.jelly @@ -84,13 +84,12 @@ THE SOFTWARE. -
- -
+
+ +
@@ -109,8 +108,9 @@ THE SOFTWARE.
- -
+
+ +
diff --git a/core/src/main/resources/lib/form/select/select.js b/core/src/main/resources/lib/form/select/select.js index 09a4bc385ac7..5e6eeb123f15 100644 --- a/core/src/main/resources/lib/form/select/select.js +++ b/core/src/main/resources/lib/form/select/select.js @@ -11,12 +11,12 @@ function updateListBox(listBox,url,config) { // form entry using tables-to-divs markup. function getStatusElement() { function getStatusForTabularForms() { - return findFollowingTR(listBox, "validation-error-area").firstElementChild.nextSibling; + return listBox.parentNode.querySelector(".validation-error-area"); } function getStatusForDivBasedForms() { var settingMain = listBox.closest('.setting-main') if (!settingMain) { - console.warn("Couldn't find the expected parent element (.setting-main) for element", listBox) + console.warn("Couldn't find the expected validation element (.validation-error-area) for element", listBox.parentNode) return; } diff --git a/core/src/main/resources/lib/form/validateButton.jelly b/core/src/main/resources/lib/form/validateButton.jelly index ba8f19252703..ff98731b5d48 100644 --- a/core/src/main/resources/lib/form/validateButton.jelly +++ b/core/src/main/resources/lib/form/validateButton.jelly @@ -51,16 +51,18 @@ THE SOFTWARE. -
+
+
+ +
+
+ +
-
- -
-
diff --git a/test/src/test/java/hudson/model/AbstractProjectTest.java b/test/src/test/java/hudson/model/AbstractProjectTest.java index 2280aba81d19..e3d0f3e23df2 100644 --- a/test/src/test/java/hudson/model/AbstractProjectTest.java +++ b/test/src/test/java/hudson/model/AbstractProjectTest.java @@ -613,17 +613,16 @@ public void dangerousLabelsAreEscaped() throws Exception { *
*/ DomNodeList domNodes = htmlPage.getDocumentElement().querySelectorAll("*"); - assertThat(domNodes, hasSize(5)); + assertThat(domNodes, hasSize(4)); assertEquals("head", domNodes.get(0).getNodeName()); assertEquals("body", domNodes.get(1).getNodeName()); assertEquals("div", domNodes.get(2).getNodeName()); - assertEquals("img", domNodes.get(3).getNodeName()); - assertEquals("a", domNodes.get(4).getNodeName()); + assertEquals("a", domNodes.get(3).getNodeName()); // only: "> // the first double quote was escaped during creation (with the backslash) String unquotedLabel = Label.parseExpression(label).getName(); - HtmlAnchor anchor = (HtmlAnchor) domNodes.get(4); + HtmlAnchor anchor = (HtmlAnchor) domNodes.get(3); assertThat(anchor.getHrefAttribute(), containsString(Util.rawEncode(unquotedLabel))); assertThat(responseContent, containsString("ok")); diff --git a/test/src/test/java/lib/form/NumberTest.java b/test/src/test/java/lib/form/NumberTest.java index 0bef86dbc26f..d12840495522 100644 --- a/test/src/test/java/lib/form/NumberTest.java +++ b/test/src/test/java/lib/form/NumberTest.java @@ -177,7 +177,7 @@ private String typeValueAndGetErrorMessage(HtmlInput input, String value) throws input.reset(); // Remove the value that already in the input.type(value); // Type value to input.fireEvent(Event.TYPE_CHANGE); // The error message is triggered by change event - return input.getParentNode().getNextSibling().getChildNodes().get(1).getChildNodes().get(0).getTextContent(); + return input.getParentNode().getNextSibling().getTextContent(); } diff --git a/war/src/main/less/base/style.less b/war/src/main/less/base/style.less index d587a3ee448b..042597244d19 100644 --- a/war/src/main/less/base/style.less +++ b/war/src/main/less/base/style.less @@ -542,64 +542,6 @@ div.behavior-loading { padding: 0; } - -/* ======================== error/warning message (mainly in the form.) Use them on block elements ======================== */ -.error { - color: #c00; - font-weight: bold; - padding-left: 20px; - min-height: 16px; - line-height: 16px; - background-image: url("../../images/svgs/error.svg"); - background-position: left top; - background-repeat: no-repeat; - background-size: 16px 16px; -} - -.error-inline { - color: #c00; - font-weight: bold; -} - -.warning { - color: #c4a000; - font-weight: bold; - padding-left: 20px; - min-height: 16px; - line-height: 16px; - background-image: url("../../images/svgs/warning.svg"); - background-position: left top; - background-repeat: no-repeat; - background-size: 16px 16px; -} - -.warning-inline { - color: #c4a000; - font-weight: bold; -} - -.info { - position: relative; - color: var(--text-color); - font-weight: bold; - min-height: 16px; - padding-left: 30px; - - &::before { - content: ""; - position: absolute; - top: 0; - left: 0; - bottom: 0; - width: 20px; - background: currentColor; - mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'%3E%3Ctitle%3EArrow Forward%3C/title%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='32' d='M268 112l144 144-144 144M392 256H100'/%3E%3C/svg%3E"); - mask-position: center; - mask-size: contain; - mask-repeat: no-repeat; - } -} - .icon16x16 { width: 16px; height: 16px; diff --git a/war/src/main/less/form/validation.less b/war/src/main/less/form/validation.less new file mode 100644 index 000000000000..3d2a18c04d82 --- /dev/null +++ b/war/src/main/less/form/validation.less @@ -0,0 +1,84 @@ +.validation-error-area { + transition: var(--standard-transition); + opacity: 0; + height: 0; + overflow: hidden; +} + +.validation-error-area--visible { + margin-top: 0.75rem; + opacity: 1; + + & > * { + animation: animate-validation-error-area var(--standard-transition); + } +} + +@keyframes animate-validation-error-area { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.error, +.warning, +.info { + position: relative; + padding-left: calc(22px + 0.4rem); + font-weight: 500; + + &::before { + content: ""; + position: absolute; + top: 0; + left: 0; + bottom: 0; + width: 22px; + height: 22px; + background-color: currentColor; + mask-position: top center; + mask-repeat: no-repeat; + mask-size: contain; + } +} + +.ok { + color: var(--text-color-secondary); +} + +.error { + color: var(--red); + + &::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3E%3Ctitle%3Eionicons-v5-a%3C/title%3E%3Cpath d='M256,48C141.31,48,48,141.31,48,256s93.31,208,208,208,208-93.31,208-208S370.69,48,256,48Zm0,319.91a20,20,0,1,1,20-20A20,20,0,0,1,256,367.91Zm21.72-201.15-5.74,122a16,16,0,0,1-32,0l-5.74-121.94v-.05a21.74,21.74,0,1,1,43.44,0Z'/%3E%3C/svg%3E"); + } +} + +.error-inline { + color: var(--red); + font-weight: 500; +} + +.warning { + color: var(--orange); + + &::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='512' height='512' viewBox='0 0 512 512'%3E%3Ctitle%3Eionicons-v5-r%3C/title%3E%3Cpath d='M449.07,399.08,278.64,82.58c-12.08-22.44-44.26-22.44-56.35,0L51.87,399.08A32,32,0,0,0,80,446.25H420.89A32,32,0,0,0,449.07,399.08Zm-198.6-1.83a20,20,0,1,1,20-20A20,20,0,0,1,250.47,397.25ZM272.19,196.1l-5.74,122a16,16,0,0,1-32,0l-5.74-121.95v0a21.73,21.73,0,0,1,21.5-22.69h.21a21.74,21.74,0,0,1,21.73,22.7Z'/%3E%3C/svg%3E"); + } +} + +.warning-inline { + color: var(--orange); + font-weight: 500; +} + +.info { + color: var(--text-color); + + &::before { + mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='ionicon' viewBox='0 0 512 512'%3E%3Ctitle%3EArrow Forward%3C/title%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='32' d='M268 112l144 144-144 144M392 256H100'/%3E%3C/svg%3E"); + } +} diff --git a/war/src/main/less/modules/buttons-temp.less b/war/src/main/less/modules/buttons-temp.less index dc032fd11ca3..610a30464b99 100644 --- a/war/src/main/less/modules/buttons-temp.less +++ b/war/src/main/less/modules/buttons-temp.less @@ -131,3 +131,19 @@ each(@variants, { } } }); + +.jenkins-validate-button__container { + &__status { + .validation-error-area { + min-height: 36px !important; + } + } + + .validation-error-area--visible { + margin-top: 0; + } + + & > span { + float: right; + } +} diff --git a/war/src/main/less/styles.less b/war/src/main/less/styles.less index 07e8270b7d49..016485215580 100644 --- a/war/src/main/less/styles.less +++ b/war/src/main/less/styles.less @@ -32,6 +32,7 @@ html { @import './form/search'; @import './form/select'; @import './form/toggle-switch'; +@import './form/validation'; @import './modules/app-bar'; @import './modules/badges'; diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 1e94eb6f928e..c3aebaaa8b2e 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -232,7 +232,7 @@ var FormChecker = { this.sendRequest(next.url, { method : next.method, onComplete : function(x) { - applyErrorMessage(next.target, x); + updateValidationArea(next.target, x.responseText); FormChecker.inProgress--; FormChecker.schedule(); layoutUpdateCallback.call(); @@ -500,16 +500,53 @@ var tooltip; // Behavior rules //======================================================== // using tag names in CSS selector makes the processing faster + + +/** + * Updates the validation area for a form element + * @param {HTMLElement} validationArea The validation area for a given form element + * @param {string} content The content to update the validation area with + */ +function updateValidationArea(validationArea, content) { + validationArea.classList.add("validation-error-area--visible"); + + if (content === "
") { + validationArea.classList.remove("validation-error-area--visible"); + validationArea.style.height = "0px"; + validationArea.innerHTML = content; + } else { + // Only change content if different, causes an unnecessary animation otherwise + if (validationArea.innerHTML !== content) { + validationArea.innerHTML = content; + validationArea.style.height = validationArea.children[0].offsetHeight + "px"; + + // Only include the notice in the validation-error-area, move all other elements out + if (validationArea.children.length > 1) { + Array.from(validationArea.children).slice(1).forEach((element) => { + validationArea.after(element); + }) + } + + Behaviour.applySubtree(validationArea); + // For errors with additional details, apply the subtree to the expandable details pane + if (validationArea.nextElementSibling) { + Behaviour.applySubtree(validationArea.nextElementSibling); + } + } + } +} + function registerValidator(e) { // Retrieve the validation error area - var tr = findFollowingTR(e, "validation-error-area"); + var tr = e.closest(".jenkins-form-item").querySelector(".validation-error-area"); if (!tr) { - console.warn("Couldn't find the expected parent element (.setting-main) for element", e) + console.warn("Couldn't find the expected validation element (.validation-error-area) for element", + e.closest(".jenkins-form-item")) return; } // find the validation-error-area - e.targetElement = tr.firstElementChild.nextSibling; + e.targetElement = tr; e.targetUrl = function() { var url = this.getAttribute("checkUrl"); @@ -545,19 +582,13 @@ function registerValidator(e) { } var checker = function() { - var target = this.targetElement; + const validationArea = this.targetElement; FormChecker.sendRequest(this.targetUrl(), { method : method, - onComplete : function(x) { - if (x.status == 200) { - // All FormValidation responses are 200 - target.innerHTML = x.responseText; - } else { - // Content is taken from FormValidation#_errorWithMarkup - // TODO Add i18n support - target.innerHTML = "
An internal error occurred during form field validation (HTTP " + x.status + "). Please reload the page and if the problem persists, ask the administrator for help.
"; - } - Behaviour.applySubtree(target); + onComplete: function({status, responseText}) { + // TODO Add i18n support + const errorMessage = `
An internal error occurred during form field validation (HTTP ${status}). Please reload the page and if the problem persists, ask the administrator for help.
`; + updateValidationArea(validationArea, status === 200 ? responseText : errorMessage); } }); } @@ -584,22 +615,25 @@ function registerValidator(e) { } function registerRegexpValidator(e,regexp,message) { - var tr = findFollowingTR(e, "validation-error-area"); + var tr = e.closest(".jenkins-form-item").querySelector( ".validation-error-area"); if (!tr) { - console.warn("Couldn't find the expected parent element (.setting-main) for element", e) + console.warn("Couldn't find the expected parent element (.setting-main) for element", + e.closest(".jenkins-form-item")) return; } // find the validation-error-area - e.targetElement = tr.firstElementChild.nextSibling; + e.targetElement = tr; var checkMessage = e.getAttribute('checkMessage'); if (checkMessage) message = checkMessage; var oldOnchange = e.onchange; e.onchange = function() { var set = oldOnchange != null ? oldOnchange.call(this) : false; if (this.value.match(regexp)) { - if (!set) this.targetElement.innerHTML = "
"; + if (!set) { + updateValidationArea(this.targetElement, `
`) + } } else { - this.targetElement.innerHTML = "
" + message + "
"; + updateValidationArea(this.targetElement, `
${message}
`); set = true; } return set; @@ -613,13 +647,14 @@ function registerRegexpValidator(e,regexp,message) { * @param e Input element */ function registerMinMaxValidator(e) { - var tr = findFollowingTR(e, "validation-error-area"); + var tr = e.closest(".jenkins-form-item").querySelector( ".validation-error-area"); if (!tr) { - console.warn("Couldn't find the expected parent element (.setting-main) for element", e) + console.warn("Couldn't find the expected parent element (.setting-main) for element", + e.closest(".jenkins-form-item")) return; } // find the validation-error-area - e.targetElement = tr.firstElementChild.nextSibling; + e.targetElement = tr; var checkMessage = e.getAttribute('checkMessage'); if (checkMessage) message = checkMessage; var oldOnchange = e.onchange; @@ -638,29 +673,35 @@ function registerMinMaxValidator(e) { if (min <= max) { // Add the validator if min <= max if (parseInt(min) > parseInt(this.value) || parseInt(this.value) > parseInt(max)) { // The value is out of range - this.targetElement.innerHTML = "
This value should be between " + min + " and " + max + "
"; + updateValidationArea(this.targetElement, `
This value should be between ${min} and ${max}
`); set = true; } else { - if (!set) this.targetElement.innerHTML = "
"; // The value is valid + if (!set) { + updateValidationArea(this.targetElement, `
`) + } } } } else if ((min !== null && isInteger(min)) && (max === null || !isInteger(max))) { // There is only 'min' available if (parseInt(min) > parseInt(this.value)) { - this.targetElement.innerHTML = "
This value should be larger than " + min + "
"; + updateValidationArea(this.targetElement, `
This value should be larger than ${min}
`); set = true; } else { - if (!set) this.targetElement.innerHTML = "
"; + if (!set) { + updateValidationArea(this.targetElement, `
`) + } } } else if ((min === null || !isInteger(min)) && (max !== null && isInteger(max))) { // There is only 'max' available if (parseInt(max) < parseInt(this.value)) { - this.targetElement.innerHTML = "
This value should be less than " + max + "
"; + updateValidationArea(this.targetElement, `
This value should be less than ${max}
`); set = true; } else { - if (!set) this.targetElement.innerHTML = "
"; + if (!set) { + updateValidationArea(this.targetElement, `
`) + } } } } @@ -2324,15 +2365,16 @@ function validateButton(checkUrl,paramList,button) { } }); - var spinner = $(button).up("DIV").next(); - var target = spinner.next(); + var spinner = button.up("DIV").children[0]; + var target = spinner.next().next(); spinner.style.display="block"; new Ajax.Request(checkUrl, { parameters: parameters, onComplete: function(rsp) { spinner.style.display="none"; - applyErrorMessage(target, rsp); + target.innerHTML = `
`; + updateValidationArea(target.children[0], rsp.responseText); layoutUpdateCallback.call(); var s = rsp.getResponseHeader("script"); try { @@ -2344,26 +2386,6 @@ function validateButton(checkUrl,paramList,button) { }); } -function applyErrorMessage(elt, rsp) { - if (rsp.status == 200) { - elt.innerHTML = rsp.responseText; - } else { - var id = 'valerr' + (iota++); - elt.innerHTML = 'ERROR'; - var error = document.getElementById('error-description'); // cf. oops.jelly - if (error) { - var div = document.getElementById(id); - while (div.firstElementChild) { - div.removeChild(div.firstElementChild); - } - div.appendChild(error); - } - } - Behaviour.applySubtree(elt); -} - // create a combobox. // @param idOrField // ID of the element that becomes a combobox, or the field itself. From 3191a1baaaf07d6c98cdb601217e83ce3087da24 Mon Sep 17 00:00:00 2001 From: Vincent Latombe Date: Thu, 9 Jun 2022 18:12:14 +0200 Subject: [PATCH 025/178] Add support for more edge cases --- core/src/main/java/hudson/Functions.java | 4 +++- core/src/test/java/hudson/FunctionsTest.java | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index a57bd943063b..c92e5fe516ec 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -2383,7 +2383,9 @@ static String guessIcon(String iconGuess, String rootURL) { iconGuess = "/" + iconGuess; } if (iconGuess.startsWith(rootURL)) { - iconGuess = iconGuess.substring(rootURL.length()); + if ((!rootURL.equals("/images") && !rootURL.equals("/plugin")) || iconGuess.startsWith(rootURL + rootURL)) { + iconGuess = iconGuess.substring(rootURL.length()); + } } iconSource = rootURL + (iconGuess.startsWith("/images/") || iconGuess.startsWith("/plugin/") ? getResourcePath() : "") + iconGuess; } diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 30d6d31c97c8..f9b42f97efca 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -682,10 +682,15 @@ public void guessIcon() throws Exception { Jenkins.RESOURCE_PATH = "/static/12345678"; assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("jenkins/images/48x48/green.gif", "/jenkins")); assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("/jenkins/images/48x48/green.gif", "/jenkins")); + assertEquals("/static/12345678/images/48x48/green.gif", Functions.guessIcon("images/48x48/green.gif", "")); assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("images/48x48/green.gif", "/jenkins")); assertEquals("/jenkins/static/12345678/images/48x48/green.gif", Functions.guessIcon("/images/48x48/green.gif", "/jenkins")); + assertEquals("/images/static/12345678/images/48x48/green.gif", Functions.guessIcon("/images/48x48/green.gif", "/images")); + assertEquals("/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/plugin/myartifactId/images/48x48/green.gif", "")); assertEquals("/jenkins/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/plugin/myartifactId/images/48x48/green.gif", "/jenkins")); assertEquals("/jenkins/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/jenkins/plugin/myartifactId/images/48x48/green.gif", "/jenkins")); + assertEquals("/plugin/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/plugin/myartifactId/images/48x48/green.gif", "/plugin")); + assertEquals("/plugin/static/12345678/plugin/myartifactId/images/48x48/green.gif", Functions.guessIcon("/plugin/plugin/myartifactId/images/48x48/green.gif", "/plugin")); assertEquals("http://acme.com/icon.svg", Functions.guessIcon("http://acme.com/icon.svg", "/jenkins")); assertEquals("https://acme.com/icon.svg", Functions.guessIcon("https://acme.com/icon.svg", "/jenkins")); } From e036d3af2e21410a0996927601809a254d0505f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Jun 2022 07:58:06 -0700 Subject: [PATCH 026/178] Bump parent POM from 1.74 to 1.76 (#6642) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- core/src/main/java/hudson/PluginManager.java | 1 + .../hudson/cli/declarative/CLIRegisterer.java | 7 + .../main/java/hudson/model/AbstractItem.java | 1 + core/src/main/java/hudson/model/Executor.java | 7 + .../java/hudson/model/ItemGroupMixIn.java | 2 + core/src/main/java/hudson/model/Queue.java | 1 + .../java/hudson/model/ResourceController.java | 6 + .../main/java/hudson/model/UpdateSite.java | 1 + .../java/hudson/triggers/SafeTimerTask.java | 2 + .../java/hudson/util/InterceptingProxy.java | 2 + .../util/RobustReflectionConverter.java | 2 + core/src/main/java/jenkins/model/Jenkins.java | 1 + core/src/main/java/jenkins/model/Nodes.java | 2 + .../jenkins/model/TransientActionFactory.java | 2 + .../ImpersonatingExecutorService.java | 2 + ...ImpersonatingScheduledExecutorService.java | 2 + .../SecurityContextExecutorService.java | 2 + .../jenkins/util/AtmostOneTaskExecutor.java | 1 + .../util/ContextResettingExecutorService.java | 2 + .../jenkins/util/ProgressiveRendering.java | 2 + ...ractUserDetailsAuthenticationProvider.java | 2 + pom.xml | 2 +- src/spotbugs/spotbugs-excludes.xml | 188 ++++++++++++++++++ 23 files changed, 239 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index c3cd3a750e6d..2fce8ae5a52a 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -187,6 +187,7 @@ * @author Kohsuke Kawaguchi */ @ExportedBean +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public abstract class PluginManager extends AbstractModelObject implements OnMaster, StaplerOverridable, StaplerProxy { /** Custom plugin manager system property or context param. */ public static final String CUSTOM_PLUGIN_MANAGER = PluginManager.class.getName() + ".className"; diff --git a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java index 8b2f2348c577..5fdf42672fbf 100644 --- a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java +++ b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java @@ -27,6 +27,7 @@ import static java.util.logging.Level.SEVERE; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.AbortException; import hudson.Extension; import hudson.ExtensionComponent; @@ -71,6 +72,12 @@ * @author Kohsuke Kawaguchi */ @Extension +@SuppressFBWarnings( + value = { + "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", + "THROWS_METHOD_THROWS_RUNTIMEEXCEPTION" + }, + justification = "TODO needs triage") public class CLIRegisterer extends ExtensionFinder { @Override public ExtensionComponentSet refresh() throws ExtensionRefreshException { diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index bc96c1b08dcf..2fbc1521de3f 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -110,6 +110,7 @@ // Item doesn't necessarily have to be Actionable, but // Java doesn't let multiple inheritance. @ExportedBean +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_THROWABLE", justification = "TODO needs triage") public abstract class AbstractItem extends Actionable implements Item, HttpDeletable, AccessControlled, DescriptorByNameOwner, StaplerProxy { private static final Logger LOGGER = Logger.getLogger(AbstractItem.class.getName()); diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index e7b14b72aebf..7ffc181dd791 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -32,6 +32,7 @@ import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.FilePath; import hudson.Functions; import hudson.Util; @@ -89,6 +90,12 @@ * @author Kohsuke Kawaguchi */ @ExportedBean +@SuppressFBWarnings( + value = { + "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", + "THROWS_METHOD_THROWS_CLAUSE_THROWABLE" + }, + justification = "TODO needs triage") public class Executor extends Thread implements ModelObject { protected final @NonNull Computer owner; private final Queue queue; diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index 748a13cc6ec4..e9a526ebbe6c 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -24,6 +24,7 @@ package hudson.model; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Util; import hudson.XmlFile; import hudson.model.listeners.ItemListener; @@ -61,6 +62,7 @@ * @author Kohsuke Kawaguchi * @see ViewGroupMixIn */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_THROWABLE", justification = "TODO needs triage") public abstract class ItemGroupMixIn { /** * {@link ItemGroup} for which we are working. diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 50ad97232bd5..982c74c22380 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -171,6 +171,7 @@ * @see QueueTaskDispatcher */ @ExportedBean +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class Queue extends ResourceController implements Saveable { /** diff --git a/core/src/main/java/hudson/model/ResourceController.java b/core/src/main/java/hudson/model/ResourceController.java index a3702ab79e61..1516272f1dcc 100644 --- a/core/src/main/java/hudson/model/ResourceController.java +++ b/core/src/main/java/hudson/model/ResourceController.java @@ -39,6 +39,12 @@ * Controls mutual exclusion of {@link ResourceList}. * @author Kohsuke Kawaguchi */ +@SuppressFBWarnings( + value = { + "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", + "THROWS_METHOD_THROWS_CLAUSE_THROWABLE" + }, + justification = "TODO needs triage") public class ResourceController { /** * {@link ResourceList}s that are used by activities that are in progress. diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 389e3cb3890f..76c14164981c 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -104,6 +104,7 @@ * @since 1.333 */ @ExportedBean +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class UpdateSite { /** * What's the time stamp of data file? diff --git a/core/src/main/java/hudson/triggers/SafeTimerTask.java b/core/src/main/java/hudson/triggers/SafeTimerTask.java index db07c96867df..5a261d0e9a2e 100644 --- a/core/src/main/java/hudson/triggers/SafeTimerTask.java +++ b/core/src/main/java/hudson/triggers/SafeTimerTask.java @@ -24,6 +24,7 @@ package hudson.triggers; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.AperiodicWork; import hudson.model.AsyncAperiodicWork; import hudson.model.AsyncPeriodicWork; @@ -47,6 +48,7 @@ * @author Kohsuke Kawaguchi * @since 1.124 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public abstract class SafeTimerTask extends TimerTask { /** diff --git a/core/src/main/java/hudson/util/InterceptingProxy.java b/core/src/main/java/hudson/util/InterceptingProxy.java index 3ab7ebb0b318..af368ac5bf5e 100644 --- a/core/src/main/java/hudson/util/InterceptingProxy.java +++ b/core/src/main/java/hudson/util/InterceptingProxy.java @@ -1,5 +1,6 @@ package hudson.util; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -10,6 +11,7 @@ * * @author Kohsuke Kawaguchi */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_THROWABLE", justification = "TODO needs triage") public abstract class InterceptingProxy { /** * Intercepts every method call. diff --git a/core/src/main/java/hudson/util/RobustReflectionConverter.java b/core/src/main/java/hudson/util/RobustReflectionConverter.java index d1bc500003e1..d7ce1ab5594f 100644 --- a/core/src/main/java/hudson/util/RobustReflectionConverter.java +++ b/core/src/main/java/hudson/util/RobustReflectionConverter.java @@ -44,6 +44,7 @@ import com.thoughtworks.xstream.mapper.Mapper; import com.thoughtworks.xstream.security.InputManipulationException; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.diagnosis.OldDataMonitor; import hudson.model.Saveable; import hudson.security.ACL; @@ -77,6 +78,7 @@ * * */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", justification = "TODO needs triage") @SuppressWarnings({"rawtypes", "unchecked"}) public class RobustReflectionConverter implements Converter { diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 3aa50e0882a9..511ee7a610eb 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -337,6 +337,7 @@ * @author Kohsuke Kawaguchi */ @ExportedBean +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLevelItemGroup, StaplerProxy, StaplerFallback, ModifiableViewGroup, AccessControlled, DescriptorByNameOwner, ModelObjectWithContextMenu, ModelObjectWithChildren, OnMaster { diff --git a/core/src/main/java/jenkins/model/Nodes.java b/core/src/main/java/jenkins/model/Nodes.java index c8ff0e283e9a..f39377e1bcf0 100644 --- a/core/src/main/java/jenkins/model/Nodes.java +++ b/core/src/main/java/jenkins/model/Nodes.java @@ -26,6 +26,7 @@ import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.BulkChange; import hudson.Util; import hudson.XmlFile; @@ -61,6 +62,7 @@ * @since 1.607 */ @Restricted(NoExternalUse.class) // for now, we may make it public later +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class Nodes implements Saveable { /** diff --git a/core/src/main/java/jenkins/model/TransientActionFactory.java b/core/src/main/java/jenkins/model/TransientActionFactory.java index abcd32d71693..21ecc499b9c4 100644 --- a/core/src/main/java/jenkins/model/TransientActionFactory.java +++ b/core/src/main/java/jenkins/model/TransientActionFactory.java @@ -28,6 +28,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.ExtensionList; import hudson.ExtensionListListener; import hudson.ExtensionPoint; @@ -48,6 +49,7 @@ * @see Actionable#getAllActions * @since 1.548 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public abstract class TransientActionFactory implements ExtensionPoint { /** diff --git a/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java b/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java index daf2cc6b0f43..d535f05f756d 100644 --- a/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java +++ b/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java @@ -24,6 +24,7 @@ package jenkins.security; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.security.ACL; import hudson.security.ACLContext; import java.util.concurrent.Callable; @@ -36,6 +37,7 @@ * @see SecurityContextExecutorService * @since 2.51 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public final class ImpersonatingExecutorService extends InterceptingExecutorService { private final Authentication authentication; diff --git a/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java b/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java index 788806869520..adf482d1cff5 100644 --- a/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java +++ b/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java @@ -24,6 +24,7 @@ package jenkins.security; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.security.ACL; import hudson.security.ACLContext; import java.util.concurrent.Callable; @@ -35,6 +36,7 @@ * Variant of {@link ImpersonatingExecutorService} for scheduled services. * @since 2.51 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public final class ImpersonatingScheduledExecutorService extends InterceptingScheduledExecutorService { private final Authentication authentication; diff --git a/core/src/main/java/jenkins/security/SecurityContextExecutorService.java b/core/src/main/java/jenkins/security/SecurityContextExecutorService.java index e2dfe2b9452e..f464ef8e6863 100644 --- a/core/src/main/java/jenkins/security/SecurityContextExecutorService.java +++ b/core/src/main/java/jenkins/security/SecurityContextExecutorService.java @@ -27,6 +27,7 @@ import static org.springframework.security.core.context.SecurityContextHolder.getContext; import static org.springframework.security.core.context.SecurityContextHolder.setContext; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import jenkins.util.InterceptingExecutorService; @@ -43,6 +44,7 @@ * @author Kohsuke Kawaguchi * @since 1.561 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class SecurityContextExecutorService extends InterceptingExecutorService { public SecurityContextExecutorService(ExecutorService service) { diff --git a/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java b/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java index 6347842856f1..3e7dd9f0f3ef 100644 --- a/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java +++ b/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java @@ -44,6 +44,7 @@ * @author Kohsuke Kawaguchi * @see AtmostOneThreadExecutor */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class AtmostOneTaskExecutor { private static final Logger LOGGER = Logger.getLogger(AtmostOneTaskExecutor.class.getName()); diff --git a/core/src/main/java/jenkins/util/ContextResettingExecutorService.java b/core/src/main/java/jenkins/util/ContextResettingExecutorService.java index 8492719491ea..bbfa5e772da9 100644 --- a/core/src/main/java/jenkins/util/ContextResettingExecutorService.java +++ b/core/src/main/java/jenkins/util/ContextResettingExecutorService.java @@ -1,5 +1,6 @@ package jenkins.util; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; @@ -11,6 +12,7 @@ * * @author Kohsuke Kawaguchi */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_BASIC_EXCEPTION", justification = "TODO needs triage") public class ContextResettingExecutorService extends InterceptingExecutorService { public ContextResettingExecutorService(ExecutorService base) { super(base); diff --git a/core/src/main/java/jenkins/util/ProgressiveRendering.java b/core/src/main/java/jenkins/util/ProgressiveRendering.java index 42ef0b76861a..b71482da2d24 100644 --- a/core/src/main/java/jenkins/util/ProgressiveRendering.java +++ b/core/src/main/java/jenkins/util/ProgressiveRendering.java @@ -25,6 +25,7 @@ package jenkins.util; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.AbstractItem; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; @@ -73,6 +74,7 @@ * {@code ui-samples-plugin} demonstrates all this. * @since 1.484 */ +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_CLAUSE_THROWABLE", justification = "TODO needs triage") public abstract class ProgressiveRendering { private static final Logger LOG = Logger.getLogger(ProgressiveRendering.class.getName()); diff --git a/core/src/main/java/org/acegisecurity/providers/dao/AbstractUserDetailsAuthenticationProvider.java b/core/src/main/java/org/acegisecurity/providers/dao/AbstractUserDetailsAuthenticationProvider.java index 1eaf27beac4d..7b8d5f5afb2f 100644 --- a/core/src/main/java/org/acegisecurity/providers/dao/AbstractUserDetailsAuthenticationProvider.java +++ b/core/src/main/java/org/acegisecurity/providers/dao/AbstractUserDetailsAuthenticationProvider.java @@ -24,6 +24,7 @@ package org.acegisecurity.providers.dao; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.acegisecurity.AcegiSecurityException; import org.acegisecurity.Authentication; import org.acegisecurity.AuthenticationException; @@ -35,6 +36,7 @@ * @deprecated use {@link org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider} */ @Deprecated +@SuppressFBWarnings(value = "THROWS_METHOD_THROWS_RUNTIMEEXCEPTION", justification = "TODO needs triage") public abstract class AbstractUserDetailsAuthenticationProvider implements AuthenticationProvider { private final org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider delegate = diff --git a/pom.xml b/pom.xml index d0efa5fad27d..90f7f0cbfd18 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci jenkins - 1.74 + 1.76 diff --git a/src/spotbugs/spotbugs-excludes.xml b/src/spotbugs/spotbugs-excludes.xml index d848c9bc6a45..1e6be9807dbd 100644 --- a/src/spotbugs/spotbugs-excludes.xml +++ b/src/spotbugs/spotbugs-excludes.xml @@ -573,6 +573,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 112bb349f7dbb0dcb5dec41fcf578c15195e5b08 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Fri, 10 Jun 2022 10:30:20 -0700 Subject: [PATCH 027/178] Preserve dumpstream on Maven failure (#6641) --- Jenkinsfile | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8016e9d91363..05f5fbf2398c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -61,9 +61,13 @@ for (i = 0; i < buildTypes.size(); i++) { 'clean', 'install', ] - infra.runMaven(mavenOptions, jdk) - if (isUnix()) { - sh 'git add . && git diff --exit-code HEAD' + try { + infra.runMaven(mavenOptions, jdk) + if (isUnix()) { + sh 'git add . && git diff --exit-code HEAD' + } + } finally { + archiveArtifacts allowEmptyArchive: true, artifacts: '**/target/surefire-reports/*.dumpstream' } } } @@ -71,7 +75,6 @@ for (i = 0; i < buildTypes.size(); i++) { // Once we've built, archive the artifacts and the test results. stage("${buildType} Publishing") { - archiveArtifacts allowEmptyArchive: true, artifacts: '**/target/surefire-reports/*.dumpstream' if (!fileExists('core/target/surefire-reports/TEST-jenkins.Junit4TestsRanTest.xml')) { error 'JUnit 4 tests are no longer being run for the core package' } From bea72075778d5315efa08308cea8dae5e47d81c5 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 10 Jun 2022 17:10:50 -0400 Subject: [PATCH 028/178] Simplify contributing instructions to recommend `-Pquick-build` --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8eb9822ccd8e..ef8cf80541d1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,7 +31,7 @@ You can read a description of the [building and debugging process here]. If you want simply to build the `jenkins.war` file as fast as possible without tests, run: ```sh -mvn -am -pl war,bom -DskipTests -Dspotbugs.skip -Dspotless.check.skip clean install +mvn -am -pl war,bom -Pquick-build clean install ``` The WAR file will be created in `war/target/jenkins.war`. @@ -220,4 +220,4 @@ just submit a pull request. [Jenkins Pipeline]: https://www.jenkins.io/doc/book/pipeline/ [Jenkinsfile]: ./Jenkinsfile [download Maven here]: https://maven.apache.org/download.cgi -[GitHub pull request]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests \ No newline at end of file +[GitHub pull request]: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests From ae16c3074953ebffe814e55128987e2c4d372857 Mon Sep 17 00:00:00 2001 From: Tim Jacomb <21194782+timja@users.noreply.github.com> Date: Sat, 11 Jun 2022 08:42:02 -0500 Subject: [PATCH 029/178] Add gitpod integration (#6590) Co-authored-by: Victor Nogueira Co-authored-by: Alexander Brandes Co-authored-by: Jesse Glick --- .gitpod.yml | 27 +++++++++++++++++++++++++++ .gitpod/Dockerfile | 4 ++++ CONTRIBUTING.md | 10 ++++++++++ 3 files changed, 41 insertions(+) create mode 100644 .gitpod.yml create mode 100644 .gitpod/Dockerfile diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 000000000000..d3bedadf1f9b --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,27 @@ +tasks: + - init: | + mvn -am -pl war,bom -P quick-build clean install + command: | + mvn -pl war jetty:run -Dhost=0.0.0.0 + name: Run + - command: gp await-port 8080 && gp url 8080 && gp preview $(gp url 8080)/jenkins/ + name: Preview + +github: + prebuilds: + pullRequestsFromForks: true + addBadge: true + +jetbrains: + intellij: + plugins: + - Stapler plugin for IntelliJ IDEA + prebuilds: + version: stable + +vscode: + extensions: + - vscjava.vscode-java-pack + +image: + file: .gitpod/Dockerfile diff --git a/.gitpod/Dockerfile b/.gitpod/Dockerfile new file mode 100644 index 000000000000..e3c88317008f --- /dev/null +++ b/.gitpod/Dockerfile @@ -0,0 +1,4 @@ +FROM gitpod/workspace-full + +RUN brew install gh && \ + bash -c ". /home/gitpod/.sdkman/bin/sdkman-init.sh && sdk install maven 3.8.4 && sdk default maven 3.8.4" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ef8cf80541d1..fb32776fb370 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -62,6 +62,16 @@ On another terminal, move to the war folder and start a [webpack](https://webpac cd war; yarn start ``` +### Gitpod + +You can open this project as a [Gitpod workspace](https://www.gitpod.io/) which comes pre-configured with all the tools you will need. +You can use IntelliJ IDEA (preferred) or VS Code (alternate) in the browser. + +[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/jenkinsci/jenkins) + +If you prefer using IntelliJ IDEA, you can setup Gitpod integration with JetBrains Gateway using the instructions on [gitpod.io](https://www.gitpod.io/docs/ides-and-editors/intellij), +which will open the workspace in IntelliJ IDEA using JetBrains Gateway. + ## Testing changes Jenkins core includes unit and functional tests as a part of the repository. From d86beed83b120c403ae2e501536f9d4ac2858f74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Jun 2022 11:48:48 -0700 Subject: [PATCH 030/178] Bump Spotless Maven Plugin from 2.22.6 to 2.22.7 (#6647) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 90f7f0cbfd18..776a1dda77c8 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ THE SOFTWARE. 1.23 5.8.2 4.6.1 - 2.22.6 + 2.22.7 2.22.2 From c3193d91deb1a89f6f6bfe0b968a3b55fb28f713 Mon Sep 17 00:00:00 2001 From: Alexander Brandes Date: Sun, 12 Jun 2022 17:20:53 +0200 Subject: [PATCH 031/178] chore: Compress and adjust IDEA svg (#6653) --- .idea/icon.svg | 82 +------------------------------------------------- 1 file changed, 1 insertion(+), 81 deletions(-) diff --git a/.idea/icon.svg b/.idea/icon.svg index 8dd8fec29266..44161638ba48 100644 --- a/.idea/icon.svg +++ b/.idea/icon.svg @@ -1,81 +1 @@ - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + From 393ec80794450b46d80106a7d934cf3e1b98c635 Mon Sep 17 00:00:00 2001 From: Langer0416 <71805759+Langer0416@users.noreply.github.com> Date: Sun, 12 Jun 2022 13:46:53 -0700 Subject: [PATCH 032/178] [JENKINS-68735] Missing sidepanel for user configuration if password is empty (#6650) --- .../hudson/model/AbstractModelObject/error.jelly | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly b/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly index d5522dca3251..40e3eb4a03c1 100644 --- a/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly +++ b/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly @@ -24,11 +24,15 @@ THE SOFTWARE. - + - + + + + +

${%Error}

@@ -39,7 +43,7 @@ THE SOFTWARE.

${message}

- +
From 56a03a5b1382a268cd8ca1229a2394791f50b82f Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Sun, 12 Jun 2022 16:55:47 -0700 Subject: [PATCH 033/178] Upgrade Surefire from 2.22.2 to 3.0.0-M7 (#6652) --- .mvn/jvm.config | 2 +- pom.xml | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.mvn/jvm.config b/.mvn/jvm.config index e93a5b43ee1c..f0106d148540 100644 --- a/.mvn/jvm.config +++ b/.mvn/jvm.config @@ -1 +1 @@ --Xmx800m +-Xmx1100m diff --git a/pom.xml b/pom.xml index 776a1dda77c8..04a02264892e 100644 --- a/pom.xml +++ b/pom.xml @@ -103,10 +103,6 @@ THE SOFTWARE. 5.8.2 4.6.1 2.22.7 - - - 2.22.2 - 2.22.2 From 65fcda13509d0185cfab1016efd83c5fe8e91cb7 Mon Sep 17 00:00:00 2001 From: Daniel Beck <1831569+daniel-beck@users.noreply.github.com> Date: Mon, 13 Jun 2022 21:30:10 +0200 Subject: [PATCH 034/178] Revert "[JENKINS-68735] Missing sidepanel for user configuration if password is empty (#6650)" (#6654) This reverts commit 393ec80794450b46d80106a7d934cf3e1b98c635. --- .../hudson/model/AbstractModelObject/error.jelly | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly b/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly index 40e3eb4a03c1..d5522dca3251 100644 --- a/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly +++ b/core/src/main/resources/hudson/model/AbstractModelObject/error.jelly @@ -24,15 +24,11 @@ THE SOFTWARE. - + - - - - - +

${%Error}

@@ -43,7 +39,7 @@ THE SOFTWARE.

${message}

- +
From d43d0b51dd18bca980f7d384ec4a353a2a66b818 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 14 Jun 2022 12:52:57 +0000 Subject: [PATCH 035/178] [maven-release-plugin] prepare release jenkins-2.355 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index a2929a173b77..7d2fbaacc3a1 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 2bfaf2dd6a86..3ede421b866e 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 cli diff --git a/core/pom.xml b/core/pom.xml index 27554bf94680..bab7826bdb88 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 9f27c8d11cf0..d5ac8a2b6fd0 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 jenkins-coverage diff --git a/pom.xml b/pom.xml index 04a02264892e..a31de388f4e6 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.355 https://github.com/jenkinsci/jenkins diff --git a/test/pom.xml b/test/pom.xml index 3bb7f0e85dca..66cc33bc4227 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index dfc597a0ae46..6cde5ecb6037 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.355 jenkins-war From 1c271f5e167656d3abbe0fb20837f60459187043 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 14 Jun 2022 12:59:31 +0000 Subject: [PATCH 036/178] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 7d2fbaacc3a1..a2929a173b77 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.355 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 3ede421b866e..2bfaf2dd6a86 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.355 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index bab7826bdb88..27554bf94680 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.355 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index d5ac8a2b6fd0..9f27c8d11cf0 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.355 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index a31de388f4e6..31b24c5f66c1 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.355 + ${revision}${changelist} pom Jenkins main module @@ -61,7 +61,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.355 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -71,7 +71,7 @@ THE SOFTWARE. - 2.355 + 2.356 -SNAPSHOT - 3025.vf64a_a_3da_6b_55 + 3028.va_a_436db_35078 3.14 From 2ac73871d2791499d517c54ba7b3289209eade65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jun 2022 12:48:27 -0700 Subject: [PATCH 044/178] Bump `jenkins-test-harness` from 1753.v45c760e2400f to 1784.v83a_b_3ce99392 (#6668) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 3bb7f0e85dca..c12f0e7211ad 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -85,7 +85,7 @@ THE SOFTWARE. ${project.groupId} jenkins-test-harness - 1753.v45c760e2400f + 1784.v83a_b_3ce99392 test From d32b9681002281ea0938d27bc7802fa5112eee32 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 22 Jun 2022 12:49:05 -0700 Subject: [PATCH 045/178] Bump minimum supported Remoting version from 3.14 to 4.2.1 (#6671) --- pom.xml | 2 +- test/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9beeecda3ebc..9151a996c409 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ THE SOFTWARE. 3028.va_a_436db_35078 - 3.14 + 4.2.1 Max Medium diff --git a/test/pom.xml b/test/pom.xml index c12f0e7211ad..39e114838800 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -233,7 +233,7 @@ THE SOFTWARE. org.jenkins-ci.main remoting - 3.13 + 4.2 jar ${project.build.outputDirectory}/old-remoting remoting-unsupported.jar From 275fad3987a477c25c4f7f2123eb432c04a9d8ac Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 22 Jun 2022 12:50:08 -0700 Subject: [PATCH 046/178] [JENKINS-68785] No log messages for inbound agents after the first message (#6672) --- .../main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java index f130fdf27a73..54501a46345a 100644 --- a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java +++ b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java @@ -150,14 +150,14 @@ public void afterProperties(@NonNull JnlpConnectionState event) { } @Override + @SuppressFBWarnings(value = "OS_OPEN_STREAM", justification = "Closed by hudson.slaves.SlaveComputer#kill") public void beforeChannel(@NonNull JnlpConnectionState event) { DefaultJnlpSlaveReceiver.State state = event.getStash(DefaultJnlpSlaveReceiver.State.class); final SlaveComputer computer = state.getNode(); final OutputStream log = computer.openLogFile(); state.setLog(log); - try (PrintWriter logw = new PrintWriter(new OutputStreamWriter(log, /* TODO switch agent logs to UTF-8 */ Charset.defaultCharset()), true)) { - logw.println("Inbound agent connected from " + event.getRemoteEndpointDescription()); - } + PrintWriter logw = new PrintWriter(new OutputStreamWriter(log, /* TODO switch agent logs to UTF-8 */ Charset.defaultCharset()), true); // Closed by hudson.slaves.SlaveComputer#kill + logw.println("Inbound agent connected from " + event.getRemoteEndpointDescription()); for (ChannelConfigurator cc : ChannelConfigurator.all()) { cc.onChannelBuilding(event.getChannelBuilder(), computer); } From 7dd5f999254c0e0461a8a664b0aca4681a49e110 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 22 Jun 2022 20:50:59 +0100 Subject: [PATCH 047/178] Remove `textarea-handle` and `richtextarea.jelly` (#6621) --- .../resources/lib/form/richtextarea.jelly | 41 ------------ .../main/resources/lib/form/textarea.jelly | 2 - .../main/resources/lib/layout/layout.jelly | 2 - war/src/main/less/base/style.less | 19 ------ .../main/webapp/images/textarea-handle.gif | Bin 52 -> 0 bytes .../main/webapp/scripts/hudson-behavior.js | 59 ------------------ 6 files changed, 123 deletions(-) delete mode 100644 core/src/main/resources/lib/form/richtextarea.jelly delete mode 100644 war/src/main/webapp/images/textarea-handle.gif diff --git a/core/src/main/resources/lib/form/richtextarea.jelly b/core/src/main/resources/lib/form/richtextarea.jelly deleted file mode 100644 index 00ee41bce4ac..000000000000 --- a/core/src/main/resources/lib/form/richtextarea.jelly +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - Rich HTML editor from http://developer.yahoo.com/yui/editor/ - All the attributes are those of the <textarea> tag. - - - - - - - - \ No newline at end of file diff --git a/core/src/main/resources/lib/form/textarea.jelly b/core/src/main/resources/lib/form/textarea.jelly index d6fa4e02aa83..f0b234ebcb7c 100644 --- a/core/src/main/resources/lib/form/textarea.jelly +++ b/core/src/main/resources/lib/form/textarea.jelly @@ -102,8 +102,6 @@ THE SOFTWARE. ${customizedFields.add(name)} - -
diff --git a/core/src/main/resources/lib/layout/layout.jelly b/core/src/main/resources/lib/layout/layout.jelly index fb140545b368..b526bb2b57c0 100644 --- a/core/src/main/resources/lib/layout/layout.jelly +++ b/core/src/main/resources/lib/layout/layout.jelly @@ -141,7 +141,6 @@ THE SOFTWARE. -