Merge branch 'master' into JENKINS-75378-cli-listener

This commit is contained in:
Kris Stern 2025-03-17 23:21:07 +08:00 committed by GitHub
commit dcbbdf6e55
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
74 changed files with 514 additions and 481 deletions

View File

@ -16,7 +16,7 @@ jobs:
discourse-author-username: jenkins-release-bot
discourse-category: 23
- name: Post on mailing list
uses: dawidd6/action-send-mail@v3
uses: dawidd6/action-send-mail@v4
with:
server_address: smtp.gmail.com
server_port: 465

View File

@ -41,7 +41,7 @@ THE SOFTWARE.
<commons-fileupload2.version>2.0.0-M2</commons-fileupload2.version>
<groovy.version>2.4.21</groovy.version>
<jelly.version>1.1-jenkins-20250108</jelly.version>
<stapler.version>1955.vdb_2736b_480e3</stapler.version>
<stapler.version>1961.vd0a_a_60970a_a_2</stapler.version>
</properties>
<dependencyManagement>
@ -63,7 +63,7 @@ THE SOFTWARE.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>6.2.3</version>
<version>6.2.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>

View File

@ -1810,6 +1810,7 @@ public class Functions {
return s.toString();
}
@SuppressFBWarnings(value = "INFORMATION_EXPOSURE_THROUGH_AN_ERROR_MESSAGE", justification = "Jenkins handles this issue differently or doesn't care about it")
private static void doPrintStackTrace(@NonNull StringBuilder s, @NonNull Throwable t, @CheckForNull Throwable higher, @NonNull String prefix, @NonNull Set<Throwable> encountered) {
if (!encountered.add(t)) {
s.append("<cycle to ").append(t).append(">\n");
@ -1863,6 +1864,7 @@ public class Functions {
* @param pw the log
* @since 2.43
*/
@SuppressFBWarnings(value = "XSS_SERVLET", justification = "TODO needs triage")
public static void printStackTrace(@CheckForNull Throwable t, @NonNull PrintWriter pw) {
pw.println(printThrowable(t).trim());
}

View File

@ -1000,6 +1000,7 @@ public abstract class Launcher {
}
@Override
@SuppressFBWarnings(value = "COMMAND_INJECTION", justification = "TODO needs triage")
public Channel launchChannel(String[] cmd, OutputStream out, FilePath workDir, Map<String, String> envVars) throws IOException {
printCommandLine(cmd, workDir);
@ -1437,11 +1438,15 @@ public abstract class Launcher {
this.envOverrides = envOverrides;
}
@SuppressFBWarnings(value = "COMMAND_INJECTION", justification = "TODO needs triage")
private Process launchProcess() throws IOException {
return Runtime.getRuntime()
.exec(cmd, Util.mapToEnv(inherit(envOverrides)), workDir == null ? null : new File(workDir));
}
@Override
public OutputStream call() throws IOException {
Process p = Runtime.getRuntime().exec(cmd,
Util.mapToEnv(inherit(envOverrides)),
workDir == null ? null : new File(workDir));
Process p = launchProcess();
List<String> cmdLines = Arrays.asList(cmd);
new StreamCopyThread("stdin copier for remote agent on " + cmdLines,

View File

@ -363,6 +363,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* This is used to report a message that Jenkins needs to be restarted
* for new plugins to take effect.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public volatile boolean pluginUploaded = false;
/**

View File

@ -27,6 +27,7 @@ package hudson;
import com.thoughtworks.xstream.XStream;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.model.AbstractDescribableImpl;
import hudson.model.Descriptor;
import hudson.model.Saveable;
@ -113,6 +114,7 @@ public final class ProxyConfiguration extends AbstractDescribableImpl<ProxyConfi
* @see #getNoProxyHostPatterns()
*/
@Restricted(NoExternalUse.class)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String noProxyHost;
@Deprecated

View File

@ -206,6 +206,7 @@ public final class TcpSlaveAgentListener extends Thread {
/**
* Initiates the shuts down of the listener.
*/
@SuppressFBWarnings(value = "UNENCRYPTED_SOCKET", justification = "TODO needs triage")
public void shutdown() {
shuttingDown = true;
try {

View File

@ -124,6 +124,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
* (In contrast, calling {@code System.out.println(...)} would print out
* the message to the server log file, which is probably not what you want.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient PrintStream stdout, stderr;
/**
@ -139,6 +140,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
* <p>
* This input stream is buffered to hide the latency in the remoting.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient InputStream stdin;
/**
@ -150,6 +152,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable {
/**
* The locale of the client. Messages should be formatted with this resource.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient Locale locale;
/**

View File

@ -208,6 +208,7 @@ public class Connection {
return new Connection(i, o);
}
@SuppressFBWarnings(value = "STATIC_IV", justification = "TODO needs triage")
private IvParameterSpec createIv(SecretKey sessionKey) {
return new IvParameterSpec(sessionKey.getEncoded());
}

View File

@ -24,6 +24,7 @@
package hudson.cli;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.model.Item;
import hudson.model.TopLevelItem;
@ -47,6 +48,7 @@ public class CopyJobCommand extends CLICommand {
public TopLevelItem src;
@Argument(metaVar = "DST", usage = "Name of the new job to be created.", index = 1, required = true)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String dst;
@Override

View File

@ -24,6 +24,7 @@
package hudson.cli;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.model.Item;
import jenkins.model.Jenkins;
@ -43,6 +44,7 @@ public class CreateJobCommand extends CLICommand {
}
@Argument(metaVar = "NAME", usage = "Name of the job to create", required = true)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String name;
@Override

View File

@ -25,6 +25,7 @@ public class SetBuildDescriptionCommand extends CLICommand implements Serializab
public int number;
@Argument(metaVar = "DESCRIPTION", required = true, usage = "Description to be set. '=' to read from stdin.", index = 2)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String description;
@Override

View File

@ -1,5 +1,6 @@
package hudson.cli;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.model.Job;
import hudson.model.Run;
@ -23,6 +24,7 @@ public class SetBuildDisplayNameCommand extends CLICommand implements Serializab
public int number;
@Argument(metaVar = "DISPLAYNAME", required = true, usage = "DisplayName to be set. '-' to read from stdin.", index = 2)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String displayName;
@Override

View File

@ -193,6 +193,7 @@ public abstract class ConsoleNote<T> implements Serializable, Describable<Consol
* Technically, this method only works if the {@link Writer} to {@link OutputStream}
* encoding is ASCII compatible.
*/
@SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "TODO needs triage")
public void encodeTo(Writer out) throws IOException {
out.write(encodeToBytes().toString());
}
@ -223,6 +224,7 @@ public abstract class ConsoleNote<T> implements Serializable, Describable<Consol
/**
* Works like {@link #encodeTo(Writer)} but obtain the result as a string.
*/
@SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "TODO needs triage")
public String encode() throws IOException {
return encodeToBytes().toString();
}

View File

@ -27,6 +27,7 @@ package hudson.lifecycle;
import static hudson.util.jna.Kernel32.MOVEFILE_DELAY_UNTIL_REBOOT;
import static hudson.util.jna.Kernel32.MOVEFILE_REPLACE_EXISTING;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.FilePath;
import hudson.Launcher.LocalLauncher;
import hudson.Util;
@ -118,6 +119,7 @@ public class WindowsServiceLifecycle extends Lifecycle {
}
@Override
@SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "TODO needs triage")
public void restart() throws IOException, InterruptedException {
Jenkins jenkins = Jenkins.getInstanceOrNull();
try {

View File

@ -25,6 +25,7 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.search.Search;
import hudson.search.UserSearchProperty;
import jakarta.servlet.ServletException;
@ -90,6 +91,7 @@ public class AutoCompletionCandidates implements HttpResponse {
* The nearby contextual {@link ItemGroup} to resolve relative job names from.
* @since 1.489
*/
@SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY", justification = "TODO needs triage")
public static <T extends Item> AutoCompletionCandidates ofJobNames(final Class<T> type, final String value, @CheckForNull Item self, ItemGroup container) {
if (self == container)
container = self.getParent();

View File

@ -112,6 +112,7 @@ import jenkins.model.DisplayExecutor;
import jenkins.model.IComputer;
import jenkins.model.IDisplayExecutor;
import jenkins.model.Jenkins;
import jenkins.search.SearchGroup;
import jenkins.security.ExtendedReadRedaction;
import jenkins.security.ImpersonatingExecutorService;
import jenkins.security.MasterToSlaveCallable;
@ -1112,6 +1113,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
return getUrl();
}
@Override
public SearchGroup getSearchGroup() {
return SearchGroup.get(SearchGroup.ComputerSearchGroup.class);
}
/**
* {@link RetentionStrategy} associated with this computer.
*
@ -1676,6 +1682,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces
relocateOldLogs(Jenkins.get().getRootDir());
}
@SuppressFBWarnings(value = "REDOS", justification = "TODO needs triage")
/*package*/ static void relocateOldLogs(File dir) {
final Pattern logfile = Pattern.compile("slave-(.*)\\.log(\\.[0-9]+)?");
File[] logfiles = dir.listFiles((dir1, name) -> logfile.matcher(name).matches());

View File

@ -869,9 +869,11 @@ public abstract class Descriptor<T extends Describable<T>> implements Loadable,
public boolean configure(StaplerRequest2 req, JSONObject json) throws FormException {
if (Util.isOverridden(Descriptor.class, getClass(), "configure", StaplerRequest.class, JSONObject.class)) {
return configure(StaplerRequest.fromStaplerRequest2(req), json);
} else {
} else if (Util.isOverridden(Descriptor.class, getClass(), "configure", StaplerRequest.class)) {
// compatibility
return configure(StaplerRequest.fromStaplerRequest2(req));
} else {
return true;
}
}

View File

@ -96,6 +96,7 @@ public class FileParameterValue extends ParameterValue {
* @deprecated use {@link #FileParameterValue(String, FileItem)}
*/
@Deprecated
@SuppressFBWarnings(value = "FILE_UPLOAD_FILENAME", justification = "TODO needs triage")
public FileParameterValue(String name, org.apache.commons.fileupload.FileItem file) {
this(name, file.toFileUpload2FileItem(), FilenameUtils.getName(file.getName()));
}

View File

@ -39,6 +39,7 @@ import hudson.util.Secret;
import java.io.IOException;
import java.util.Collection;
import jenkins.model.Jenkins;
import jenkins.search.SearchGroup;
import jenkins.util.SystemProperties;
import jenkins.util.io.OnMaster;
import org.kohsuke.stapler.StaplerRequest2;
@ -249,6 +250,11 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont
*/
void delete() throws IOException, InterruptedException;
@Override
default SearchGroup getSearchGroup() {
return SearchGroup.get(SearchGroup.ItemSearchGroup.class);
}
PermissionGroup PERMISSIONS = new PermissionGroup(Item.class, Messages._Item_Permissions_Title());
Permission CREATE =
new Permission(

View File

@ -193,6 +193,7 @@ public abstract class Job<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
protected CopyOnWriteList<JobProperty<? super JobT>> properties = new CopyOnWriteList<>();
@Restricted(NoExternalUse.class)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient RunIdMigrator runIdMigrator;
protected Job(ItemGroup parent, String name) {

View File

@ -1203,12 +1203,14 @@ public abstract class Run<JobT extends Job<JobT, RunT>, RunT extends Run<JobT, R
}
/** {@link Run.ArtifactList} without the implicit link to {@link Run} */
@SuppressFBWarnings(value = "EQ_DOESNT_OVERRIDE_EQUALS", justification = "TODO needs triage")
private static final class SerializableArtifactList extends ArrayList<SerializableArtifact> {
private static final long serialVersionUID = 1L;
private LinkedHashMap<SerializableArtifact, String> tree = new LinkedHashMap<>();
private int idSeq = 0;
}
@SuppressFBWarnings(value = "EQ_DOESNT_OVERRIDE_EQUALS", justification = "TODO needs triage")
public final class ArtifactList extends ArrayList<Artifact> {
private static final long serialVersionUID = 1L;
/**

View File

@ -24,6 +24,7 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.EnvVars;
import hudson.Util;
import hudson.util.VariableResolver;
@ -40,6 +41,7 @@ import org.kohsuke.stapler.export.Exported;
public class StringParameterValue extends ParameterValue {
@Exported(visibility = 4)
@Restricted(NoExternalUse.class)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String value;
@DataBoundConstructor

View File

@ -208,7 +208,7 @@ public class UpdateSite {
* Opens a connection to the given URL
* @param src the url to connect to
* @return A {@code URLConnection} for the given src URL
* @since TODO
* @since 2.499
*/
public URLConnection connect(URL src) throws IOException {
return ProxyConfiguration.open(src);
@ -219,7 +219,7 @@ public class UpdateSite {
*
* @param src The location of the resource on the network
* @throws IOException if the validation fails
* @since TODO
* @since 2.499
*/
public void preValidate(URL src) throws IOException {
// no validation needed in the default setup

View File

@ -233,6 +233,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript
* with the asymmetric cipher. The rest of the stream will be encrypted by a symmetric cipher.
*/
public static final class CombinedCipherOutputStream extends FilterOutputStream {
@SuppressFBWarnings(value = "STATIC_IV", justification = "TODO needs triage")
public CombinedCipherOutputStream(OutputStream out, Cipher asym, String algorithm) throws IOException, GeneralSecurityException {
super(out);

View File

@ -72,6 +72,7 @@ import jenkins.model.Jenkins;
import jenkins.model.Loadable;
import jenkins.model.ModelObjectWithContextMenu;
import jenkins.scm.RunWithSCM;
import jenkins.search.SearchGroup;
import jenkins.security.ImpersonatingUserDetailsService2;
import jenkins.security.LastGrantedAuthoritiesProperty;
import jenkins.security.UserDetailsCache;
@ -171,6 +172,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{ACL.ANONYMOUS_USERNAME,
ACL.SYSTEM_USERNAME, UNKNOWN_USERNAME};
@SuppressFBWarnings(value = "SS_SHOULD_BE_STATIC", justification = "Reserved for future use")
private final int version = 10; // Not currently used, but it may be helpful in the future to store a version.
private String id;
private volatile String fullName;
@ -284,6 +286,11 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
return UserAvatarResolver.resolve(this, "48x48");
}
@Override
public SearchGroup getSearchGroup() {
return SearchGroup.get(SearchGroup.UserSearchGroup.class);
}
/**
* The URL of the user page.
*/

View File

@ -25,6 +25,7 @@
package hudson.model;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.ExtensionList;
import hudson.Util;
@ -57,6 +58,7 @@ public class UserIdMapper {
private static final Logger LOGGER = Logger.getLogger(UserIdMapper.class.getName());
private static final int PREFIX_MAX = 15;
private static final Pattern PREFIX_PATTERN = Pattern.compile("[^A-Za-z0-9]");
@SuppressFBWarnings(value = "SS_SHOULD_BE_STATIC", justification = "Reserved for future use")
private final int version = 1; // Not currently used, but it may be helpful in the future to store a version.
private transient File usersDirectory;

View File

@ -95,6 +95,7 @@ import jenkins.model.ModelObjectWithContextMenu;
import jenkins.model.item_category.Categories;
import jenkins.model.item_category.Category;
import jenkins.model.item_category.ItemCategory;
import jenkins.search.SearchGroup;
import jenkins.security.ExtendedReadRedaction;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.xml.XMLUtils;
@ -567,6 +568,11 @@ public abstract class View extends AbstractModelObject implements AccessControll
return "symbol-jobs";
}
@Override
public SearchGroup getSearchGroup() {
return SearchGroup.get(SearchGroup.ViewSearchGroup.class);
}
/**
* Returns the transient {@link Action}s associated with the top page.
*

View File

@ -25,6 +25,7 @@
package hudson.os;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Functions;
import java.io.File;
import java.io.IOException;
@ -95,6 +96,7 @@ public class WindowsUtil {
* @param argv arguments to be quoted or escaped for {@code cmd.exe /C ...}.
* @return properly quoted and escaped arguments to {@code cmd.exe /C ...}.
*/
@SuppressFBWarnings(value = "COMMAND_INJECTION", justification = "TODO needs triage")
public static @NonNull Process execCmd(String... argv) throws IOException {
String command = Arrays.stream(argv).map(WindowsUtil::quoteArgumentForCmd).collect(Collectors.joining(" "));
return Runtime.getRuntime().exec(new String[]{"cmd.exe", "/C", command});

View File

@ -29,6 +29,8 @@ import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.ExtensionComponent;
import hudson.ExtensionList;
import hudson.Util;
import hudson.util.EditDistance;
import io.jenkins.servlet.ServletExceptionWrapper;
@ -37,12 +39,16 @@ import java.io.IOException;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import jenkins.model.Jenkins;
import jenkins.search.SearchGroup;
import jenkins.security.stapler.StaplerNotDispatchable;
import jenkins.util.MemoryReductionUtil;
import jenkins.util.SystemProperties;
@ -171,11 +177,26 @@ public class Search implements StaplerProxy {
if (iconName.startsWith("symbol")) {
r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(),
Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build())));
Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()), "symbol", curItem.item.getSearchGroup().getDisplayName()));
} else {
r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image"));
r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup().getDisplayName()));
}
}
// Sort results by group
ExtensionList<SearchGroup> groupsExtensionList = ExtensionList.lookup(SearchGroup.class);
List<ExtensionComponent<SearchGroup>> components = groupsExtensionList.getComponents();
Map<String, Double> searchGroupOrdinal = components.stream()
.collect(Collectors.toMap(
(k) -> k.getInstance().getDisplayName(),
ExtensionComponent::ordinal
));
r.suggestions.sort(
Comparator.comparingDouble((Item item) -> searchGroupOrdinal.getOrDefault(item.getGroup(), Double.MAX_VALUE))
.reversed()
.thenComparing(item -> item.name)
);
rsp.serveExposedBean(req, r, new ExportConfig());
}
@ -250,6 +271,7 @@ public class Search implements StaplerProxy {
return builder.make();
}
@SuppressFBWarnings(value = "EQ_DOESNT_OVERRIDE_EQUALS", justification = "TODO needs triage")
private static class SearchResultImpl extends ArrayList<SuggestedItem> implements SearchResult {
private boolean hasMoreResults = false;
@ -270,7 +292,6 @@ public class Search implements StaplerProxy {
public static class Item {
@Exported
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler")
public String name;
private final String url;
@ -279,22 +300,19 @@ public class Search implements StaplerProxy {
private final String icon;
private final String group;
public Item(String name) {
this(name, null, null);
this(name, null, null, "symbol", null);
}
public Item(String name, String url, String icon) {
public Item(String name, String url, String icon, String type, String group) {
this.name = name;
this.url = url;
this.icon = icon;
this.type = "symbol";
}
public Item(String name, String url, String icon, String type) {
this.name = name;
this.url = url;
this.icon = icon;
this.type = type;
this.group = group;
}
@Exported
@ -311,6 +329,11 @@ public class Search implements StaplerProxy {
public String getType() {
return type;
}
@Exported
public String getGroup() {
return group;
}
}
private enum Mode {

View File

@ -25,6 +25,7 @@
package hudson.search;
import hudson.model.Build;
import jenkins.search.SearchGroup;
import org.jenkins.ui.icon.IconSpec;
/**
@ -63,6 +64,10 @@ public interface SearchItem {
return "symbol-search";
}
default SearchGroup getSearchGroup() {
return SearchGroup.get(SearchGroup.UnclassifiedSearchGroup.class);
}
/**
* Returns the {@link SearchIndex} to further search sub items inside this item.
*

View File

@ -1,5 +1,6 @@
package hudson.security;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import io.jenkins.servlet.http.HttpServletResponseWrapper;
import jakarta.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@ -75,6 +76,7 @@ public class AccessDeniedException3 extends AccessDeniedException {
* This method is similar to {@link #reportAsHeaders(HttpServletResponse)} for the intention
* but instead of using HTTP headers, this version is meant to go inside the payload.
*/
@SuppressFBWarnings(value = "XSS_SERVLET", justification = "TODO needs triage")
public void report(PrintWriter w) {
w.println("You are authenticated as: " + authentication.getName());
w.println("Groups that you are in:");

View File

@ -26,6 +26,7 @@ package hudson.security;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.model.Hudson;
import java.util.Collections;
import java.util.Comparator;
@ -105,6 +106,7 @@ public final class Permission {
*
* @since 1.325
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public boolean enabled;
/**

View File

@ -24,6 +24,7 @@
package hudson.slaves;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.FilePath;
import hudson.Launcher.LocalLauncher;
import hudson.Proc;
@ -219,6 +220,7 @@ public class Channels {
* @deprecated removed without replacement
*/
@Deprecated
@SuppressFBWarnings(value = "UNENCRYPTED_SERVER_SOCKET", justification = "TODO needs triage")
public static Channel newJVM(String displayName, TaskListener listener, JVMBuilder vmb, FilePath workDir, ClasspathBuilder classpath) throws IOException {
ServerSocket serverSocket = new ServerSocket();
serverSocket.bind(new InetSocketAddress("localhost", 0));

View File

@ -58,6 +58,7 @@ public class JNLPLauncher extends ComputerLauncher {
* Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC.
*/
@CheckForNull
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public String tunnel;
/**

View File

@ -31,6 +31,7 @@ import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.model.Node;
import hudson.util.RobustCollectionConverter;
import java.util.ArrayList;
@ -47,6 +48,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
*
* @author Kohsuke Kawaguchi
*/
@SuppressFBWarnings(value = "EQ_DOESNT_OVERRIDE_EQUALS", justification = "TODO needs triage")
public final class NodeList extends ArrayList<Node> {
private Map<String, Node> map = new HashMap<>();

View File

@ -955,6 +955,7 @@ public class SlaveComputer extends Computer {
}
@Override
@SuppressFBWarnings(value = "UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR", justification = "TODO needs triage")
protected void setNode(final Node node) {
super.setNode(node);
launcher = grabLauncher(node);

View File

@ -485,6 +485,7 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD
* the result, even if it doesn't exist
* @since 1.430
*/
@SuppressFBWarnings(value = "EC_UNRELATED_TYPES_USING_POINTER_EQUALITY", justification = "TODO needs triage")
public Map<AbstractProject, Integer> getDependencies(boolean includeMissing) {
Map<AbstractProject, Integer> r = new HashMap<>();

View File

@ -127,6 +127,7 @@ public class Maven extends Builder {
*
* @since 1.322
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public boolean usePrivateRepository;
/**

View File

@ -252,6 +252,7 @@ public abstract class Trigger<J extends Item> implements Describable<Trigger<?>>
private static Future previousSynchronousPolling;
@SuppressFBWarnings(value = "LI_LAZY_INIT_STATIC", justification = "TODO needs triage")
public static void checkTriggers(final Calendar cal) {
Jenkins inst = Jenkins.get();

View File

@ -27,6 +27,7 @@ package hudson.util;
import com.google.common.annotations.VisibleForTesting;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import jakarta.servlet.ServletOutputStream;
import java.awt.Color;
@ -72,6 +73,7 @@ public abstract class Graph {
private final long timestamp;
private final int defaultWidth;
private final int defaultHeight;
@SuppressFBWarnings(value = "SS_SHOULD_BE_STATIC", justification = "Reserved for future use")
private final int defaultScale = 1;
private volatile JFreeChart graph;

View File

@ -25,6 +25,7 @@
package hudson.util;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import jakarta.servlet.ServletException;
import java.io.File;
import java.io.IOException;
@ -44,6 +45,7 @@ import org.kohsuke.stapler.StaplerResponse2;
*
* @author Kohsuke Kawaguchi
*/
@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", justification = "Used for backward compatibility and extending utility classes")
public class HttpResponses extends org.kohsuke.stapler.HttpResponses {
public static HttpResponse staticResource(File f) throws IOException {
return staticResource(f.toURI().toURL());

View File

@ -25,6 +25,7 @@
package hudson.util;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import java.beans.PropertyDescriptor;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
@ -45,6 +46,7 @@ import org.kohsuke.stapler.ClassDescriptor;
* @author Kohsuke Kawaguchi
* @since 1.351
*/
@SuppressFBWarnings(value = "NM_SAME_SIMPLE_NAME_AS_SUPERCLASS", justification = "Used for backward compatibility and extending utility classes")
public class ReflectionUtils extends org.springframework.util.ReflectionUtils {
/**
* Finds a public method of the given name, regardless of its parameter definitions,

View File

@ -25,6 +25,7 @@
package hudson.util;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Util;
import java.io.BufferedReader;
import java.io.File;
@ -111,6 +112,7 @@ public class TextFile {
/**
* Reads the first N characters or until we hit EOF.
*/
@SuppressFBWarnings(value = "DM_DEFAULT_ENCODING", justification = "TODO needs triage")
public @NonNull String head(int numChars) throws IOException {
char[] buf = new char[numChars];
int read = 0;

View File

@ -26,6 +26,7 @@ package hudson.widgets;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import hudson.Functions;
import hudson.model.Job;
@ -71,6 +72,7 @@ public class HistoryWidget<O extends ModelObject, T> extends Widget {
/**
* The given data model of records. Newer ones first.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public Iterable<T> baseList;
/**

View File

@ -633,6 +633,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
*/
public final transient PluginManager pluginManager;
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient volatile TcpSlaveAgentListener tcpSlaveAgentListener;
private final transient Object tcpSlaveAgentListenerLock = new Object();
@ -870,6 +871,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
/**
* HTTP proxy configuration.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public transient volatile ProxyConfiguration proxy;
/**
@ -5619,10 +5621,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
/**
* Version number of this Jenkins.
*/
@SuppressFBWarnings(value = "MS_CANNOT_BE_FINAL", justification = "cannot be made immutable without breaking compatibility")
@SuppressFBWarnings(value = {"MS_CANNOT_BE_FINAL", "PA_PUBLIC_PRIMITIVE_ATTRIBUTE"}, justification = "Preserve API compatibility")
public static String VERSION = UNCOMPUTED_VERSION;
@Restricted(NoExternalUse.class)
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public static String CHANGELOG_URL;
/**
@ -5685,6 +5688,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
/**
* Hash of {@link #VERSION}.
*/
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public static String VERSION_HASH;
/**
@ -5694,7 +5698,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* We used to use {@link #VERSION_HASH}, but making this session local allows us to
* reuse the same {@link #RESOURCE_PATH} for static resources in plugins.
*/
@SuppressFBWarnings(value = "MS_CANNOT_BE_FINAL", justification = "cannot be made immutable without breaking compatibility")
@SuppressFBWarnings(value = {"MS_CANNOT_BE_FINAL", "PA_PUBLIC_PRIMITIVE_ATTRIBUTE"}, justification = "Preserve API compatibility")
public static String SESSION_HASH;
/**
@ -5704,7 +5708,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* <p>
* Value computed in {@link WebAppMain}.
*/
@SuppressFBWarnings(value = "MS_CANNOT_BE_FINAL", justification = "cannot be made immutable without breaking compatibility")
@SuppressFBWarnings(value = {"MS_CANNOT_BE_FINAL", "PA_PUBLIC_PRIMITIVE_ATTRIBUTE"}, justification = "Preserve API compatibility")
public static String RESOURCE_PATH = "";
/**
@ -5714,7 +5718,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* <p>
* Value computed in {@link WebAppMain}.
*/
@SuppressFBWarnings(value = "MS_CANNOT_BE_FINAL", justification = "cannot be made immutable without breaking compatibility")
@SuppressFBWarnings(value = {"MS_CANNOT_BE_FINAL", "PA_PUBLIC_PRIMITIVE_ATTRIBUTE"}, justification = "Preserve API compatibility")
public static String VIEW_RESOURCE_PATH = "/resources/TBD";
@SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "for script console")

View File

@ -0,0 +1,73 @@
package jenkins.search;
import static jenkins.search.Messages.SearchGroup_ComputerSearchGroup_DisplayName;
import static jenkins.search.Messages.SearchGroup_ItemSearchGroup_DisplayName;
import static jenkins.search.Messages.SearchGroup_UnclassifiedSearchGroup_DisplayName;
import static jenkins.search.Messages.SearchGroup_UserSearchGroup_DisplayName;
import static jenkins.search.Messages.SearchGroup_ViewSearchGroup_DisplayName;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.Extension;
import hudson.ExtensionList;
import hudson.ExtensionPoint;
import hudson.model.ModelObject;
public interface SearchGroup extends ExtensionPoint, ModelObject {
static ExtensionList<SearchGroup> all() {
return ExtensionList.lookup(SearchGroup.class);
}
static @NonNull <T extends SearchGroup> T get(Class<T> type) {
T category = all().get(type);
if (category == null) {
throw new AssertionError("Group not found. It seems the " + type + " is not annotated with @Extension and so not registered");
}
return category;
}
@Extension(ordinal = -1)
class UnclassifiedSearchGroup implements SearchGroup {
@Override
public String getDisplayName() {
return SearchGroup_UnclassifiedSearchGroup_DisplayName();
}
}
@Extension(ordinal = 999)
class ItemSearchGroup implements SearchGroup {
@Override
public String getDisplayName() {
return SearchGroup_ItemSearchGroup_DisplayName();
}
}
@Extension
class ComputerSearchGroup implements SearchGroup {
@Override
public String getDisplayName() {
return SearchGroup_ComputerSearchGroup_DisplayName();
}
}
@Extension
class ViewSearchGroup implements SearchGroup {
@Override
public String getDisplayName() {
return SearchGroup_ViewSearchGroup_DisplayName();
}
}
@Extension
class UserSearchGroup implements SearchGroup {
@Override
public String getDisplayName() {
return SearchGroup_UserSearchGroup_DisplayName();
}
}
}

View File

@ -1,5 +1,6 @@
package jenkins.security;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.util.Secret;
import java.io.IOException;
import java.security.GeneralSecurityException;
@ -71,6 +72,7 @@ public class CryptoConfidentialKey extends ConfidentialKey {
* @return the cipher
*/
@Restricted(NoExternalUse.class) // TODO pending API
@SuppressFBWarnings(value = "STATIC_IV", justification = "TODO needs triage")
public Cipher encrypt(byte[] iv) {
try {
Cipher cipher = Secret.getCipher(ALGORITHM);

View File

@ -311,6 +311,7 @@ public class StaplerDispatchValidator implements DispatchValidator {
}
}
@SuppressFBWarnings(value = "SIC_INNER_SHOULD_BE_STATIC", justification = "TODO needs triage")
private class Validator {
// lazy load parents to avoid trying to load potentially unavailable classes
private final Supplier<Collection<Validator>> parentsSupplier;

View File

@ -3,6 +3,7 @@ package jenkins.slaves.restarter;
import static java.util.logging.Level.FINE;
import static org.apache.commons.io.IOUtils.copy;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import hudson.Extension;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
@ -29,6 +30,7 @@ public class WinswSlaveRestarter extends SlaveRestarter {
}
}
@SuppressFBWarnings(value = "COMMAND_INJECTION", justification = "TODO needs triage")
private int exec(String cmd) throws InterruptedException, IOException {
ProcessBuilder pb = new ProcessBuilder(exe, cmd);
pb.redirectErrorStream(true);

View File

@ -61,15 +61,17 @@ public class HistoryPageFilter<T> {
public final List<HistoryPageEntry<QueueItem>> queueItems = new ArrayList<>();
public final List<HistoryPageEntry<HistoricalBuild>> runs = new ArrayList<>();
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler")
@SuppressFBWarnings(value = {"PA_PUBLIC_PRIMITIVE_ATTRIBUTE", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}, justification = "Preserve API compatibility; read by Stapler")
public boolean hasUpPage = false; // there are newer builds than on this page
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler")
@SuppressFBWarnings(value = {"PA_PUBLIC_PRIMITIVE_ATTRIBUTE", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}, justification = "Preserve API compatibility; read by Stapler")
public boolean hasDownPage = false; // there are older builds than on this page
@SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler")
@SuppressFBWarnings(value = {"PA_PUBLIC_PRIMITIVE_ATTRIBUTE", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}, justification = "Preserve API compatibility; read by Stapler")
public long nextBuildNumber;
public HistoryWidget widget;
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public long newestOnPage = Long.MIN_VALUE; // see updateNewestOldest()
@SuppressFBWarnings(value = "PA_PUBLIC_PRIMITIVE_ATTRIBUTE", justification = "Preserve API compatibility")
public long oldestOnPage = Long.MAX_VALUE; // see updateNewestOldest()
/**

View File

@ -40,14 +40,13 @@ THE SOFTWARE.
<j:set var="initialDescription" value="${request2.getParameter('description')}" defaultValue="${it.description}"/>
<l:ajax>
<form action="${submissionUrl}" method="post">
<table>
<f:entry help="${app.markupFormatter.helpUrl}">
<f:textarea name="description" value="${initialDescription}"
codemirror-mode="${app.markupFormatter.codeMirrorMode}" codemirror-config="${app.markupFormatter.codeMirrorConfig}" previewEndpoint="/markupFormatter/previewDescription"/>
</f:entry>
</table>
<div align="right">
<f:entry help="${app.markupFormatter.helpUrl}">
<f:textarea name="description" value="${initialDescription}"
codemirror-mode="${app.markupFormatter.codeMirrorMode}" codemirror-config="${app.markupFormatter.codeMirrorConfig}" previewEndpoint="/markupFormatter/previewDescription"/>
</f:entry>
<div class="jenkins-buttons-row jenkins-buttons-row--equal-width">
<f:submit value="${%Save}" />
<button type="button" class="jenkins-button description-cancel-button">${%Cancel}</button>
</div>
</form>
</l:ajax>

View File

@ -2,7 +2,7 @@ package jenkins.model.InterruptedBuildAction
def t = namespace(lib.JenkinsTagLib.class)
t.summary(icon:"orange-square.png") {
t.summary(icon:"symbol-close-circle") {
my.causes.each { c ->
p { include(c,"summary") }
}

View File

@ -0,0 +1,27 @@
# The MIT License
#
# Copyright (c) 2025 Jan Faracik
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
SearchGroup.UnclassifiedSearchGroup.DisplayName=Other
SearchGroup.ItemSearchGroup.DisplayName=Items
SearchGroup.ComputerSearchGroup.DisplayName=Nodes
SearchGroup.ViewSearchGroup.DisplayName=Views
SearchGroup.UserSearchGroup.DisplayName=Users

View File

@ -1,8 +1,8 @@
/* global replaceDescription */
(function () {
document.addEventListener("DOMContentLoaded", function () {
let descriptionLink = document.querySelector("#description-link");
let description = document.getElementById("description");
const descriptionLink = document.querySelector("#description-link");
const description = document.getElementById("description");
if (description != null) {
descriptionLink.classList.remove("jenkins-hidden");
descriptionLink.addEventListener("click", function (e) {
@ -14,4 +14,25 @@
});
}
});
Behaviour.specify(
".description-cancel-button",
"description-cancel-button",
0,
function (b) {
b.onclick = function () {
const descriptionLink = document.getElementById("description-link");
const descriptionContent = document.getElementById(
"description-content",
);
const descriptionEditForm = document.getElementById(
"description-edit-form",
);
descriptionEditForm.innerHTML = "";
descriptionEditForm.classList.add("jenkins-hidden");
descriptionContent.classList.remove("jenkins-hidden");
descriptionLink.classList.remove("jenkins-hidden");
};
},
);
})();

View File

@ -47,13 +47,13 @@ THE SOFTWARE.
<j:set var="actualDescription" value="${description}" defaultValue="${it.description}"/>
<j:set var="hideDescriptionButton" value="${hideButton}" defaultValue="false"/>
<div id="description" class="jenkins-!-margin-bottom-${hideButton?'3':'0'}">
<div>
<div id="description" class="jenkins-!-margin-bottom-${hideButton?'3':'1'}">
<div id="description-content">
<j:out value="${actualDescription!=null ? app.markupFormatter.translate(actualDescription) : ''}" />
</div>
<div id="description-edit-form" class="jenkins-hidden"/>
<j:if test="${!hideDescriptionButton}">
<div class="jenkins-buttons-row jenkins-buttons-row--invert">
<div class="jenkins-buttons-row jenkins-buttons-row--invert description-edit-button">
<t:editDescriptionButton permission="${permission}" description="${actualDescription}" submissionUrl="${submissionUrl}"/>
</div>
</j:if>

View File

@ -41,7 +41,7 @@
<skin>
<groupId>org.apache.maven.skins</groupId>
<artifactId>maven-fluido-skin</artifactId>
<version>2.0.1</version>
<version>2.1.0</version>
</skin>
<custom>
<matomo>

View File

@ -7,14 +7,8 @@
<Or>
<!-- We don't care about this behavior -->
<Bug pattern="CRLF_INJECTION_LOGS"/>
<!-- Pending https://github.com/spotbugs/spotbugs/issues/1515 -->
<Bug pattern="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED"/>
<!-- Silly check; it is perfectly reasonable to implement Comparable by writing a compareTo without an equals. -->
<Bug pattern="EQ_COMPARETO_USE_OBJECT_EQUALS"/>
<!-- Jenkins handles this issue differently or doesn't care about it -->
<Bug pattern="INFORMATION_EXPOSURE_THROUGH_AN_ERROR_MESSAGE"/>
<!-- Used for backward compatibility and extending utility classes -->
<Bug pattern="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS"/>
</Or>
</Match>
<Match>
@ -53,125 +47,6 @@
<Bug pattern="SF_SWITCH_NO_DEFAULT"/>
<Class name="hudson.scheduler.CrontabParser"/>
</Match>
<Match>
<!-- Preserve API compatibility -->
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.PluginManager"/>
<Field name="pluginUploaded"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.ProxyConfiguration"/>
<Field name="noProxyHost"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.cli.CLICommand"/>
<Or>
<Field name="locale"/>
<Field name="stderr"/>
<Field name="stdin"/>
<Field name="stdout"/>
</Or>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.cli.CopyJobCommand"/>
<Field name="dst"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.cli.CreateJobCommand"/>
<Field name="name"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.cli.SetBuildDescriptionCommand"/>
<Field name="description"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.cli.SetBuildDisplayNameCommand"/>
<Field name="displayName"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.model.Job"/>
<Field name="runIdMigrator"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.model.StringParameterValue"/>
<Field name="value"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.security.Permission"/>
<Field name="enabled"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.tasks.Maven"/>
<Field name="usePrivateRepository"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.util.Graph"/>
<Field name="defaultScale"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.widgets.HistoryWidget"/>
<Field name="baseList"/>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="jenkins.model.Jenkins"/>
<Or>
<Field name="tcpSlaveAgentListener"/>
<Field name="proxy"/>
<Field name="VERSION"/>
<Field name="CHANGELOG_URL"/>
<Field name="VERSION_HASH"/>
<Field name="SESSION_HASH"/>
<Field name="RESOURCE_PATH"/>
<Field name="VIEW_RESOURCE_PATH"/>
</Or>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="jenkins.widgets.HistoryPageFilter"/>
<Or>
<Field name="hasDownPage"/>
<Field name="hasUpPage"/>
<Field name="newestOnPage"/>
<Field name="nextBuildNumber"/>
<Field name="oldestOnPage"/>
</Or>
</Match>
<Match>
<Bug pattern="PA_PUBLIC_PRIMITIVE_ATTRIBUTE"/>
<Class name="hudson.slaves.JNLPLauncher"/>
<Field name="tunnel"/>
</Match>
<Match>
<!-- Reserved for future use -->
<Bug pattern="SS_SHOULD_BE_STATIC"/>
<Class name="hudson.model.User"/>
<Field name="version"/>
</Match>
<Match>
<!-- Reserved for future use -->
<Bug pattern="SS_SHOULD_BE_STATIC"/>
<Class name="hudson.model.UserIdMapper"/>
<Field name="version"/>
</Match>
<Match>
<!-- Reserved for future use -->
<Bug pattern="SS_SHOULD_BE_STATIC"/>
<Class name="hudson.util.Graph"/>
<Field name="defaultScale"/>
</Match>
<!--
Here lies technical debt. Exclusions in this section have not yet been triaged. When working on
on this section, pick an exclusion to triage, then:
@ -180,69 +55,9 @@
this section.
- If it is not a false positive, fix the bug, then remove the exclusion from this section.
-->
<Match>
<And>
<Bug pattern="DM_DEFAULT_ENCODING"/>
<Or>
<Class name="hudson.console.ConsoleNote"/>
<Class name="hudson.lifecycle.WindowsServiceLifecycle"/>
<Class name="hudson.util.TextFile"/>
</Or>
</And>
</Match>
<Match>
<Confidence value="2"/>
<Or>
<And>
<Bug pattern="COMMAND_INJECTION"/>
<Or>
<Class name="hudson.Launcher$LocalLauncher"/>
<Class name="hudson.Launcher$RemoteChannelLaunchCallable"/>
<Class name="hudson.os.WindowsUtil"/>
<Class name="jenkins.slaves.restarter.WinswSlaveRestarter"/>
</Or>
</And>
<And>
<Bug pattern="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY"/>
<Or>
<Class name="hudson.model.AutoCompletionCandidates"/>
<Class name="hudson.tasks.Fingerprinter$FingerprintAction"/>
</Or>
</And>
<And>
<Bug pattern="EQ_DOESNT_OVERRIDE_EQUALS"/>
<Or>
<Class name="hudson.model.Run$ArtifactList"/>
<Class name="hudson.model.Run$SerializableArtifactList"/>
<Class name="hudson.search.Search$SearchResultImpl"/>
<Class name="hudson.slaves.NodeList"/>
</Or>
</And>
<And>
<Bug pattern="FILE_UPLOAD_FILENAME"/>
<Or>
<Class name="hudson.model.FileParameterDefinition"/>
<Class name="hudson.model.FileParameterValue"/>
<Class name="hudson.PluginManager"/>
</Or>
</And>
<And>
<Bug pattern="HTTP_PARAMETER_POLLUTION"/>
<Class name="hudson.ProxyConfiguration$DescriptorImpl"/>
</And>
<And>
<Bug pattern="HTTP_RESPONSE_SPLITTING"/>
<Or>
<Class name="hudson.Functions"/>
<Class name="jenkins.install.InstallUtil"/>
<Class name="jenkins.model.Jenkins"/>
<Class name="jenkins.util.xml.XMLUtils"/>
</Or>
</And>
<And>
<Bug pattern="LI_LAZY_INIT_STATIC"/>
<Class name="hudson.triggers.Trigger"/>
</And>
<And>
<Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
<Or>
@ -273,7 +88,6 @@
<Class name="hudson.model.Run"/>
<Class name="hudson.model.RunParameterValue"/>
<Class name="hudson.model.Slave"/>
<Class name="hudson.model.TopLevelItemDescriptor"/>
<Class name="hudson.model.UpdateCenter$HudsonDowngradeJob"/>
<Class name="hudson.model.UpdateCenter$HudsonUpgradeJob"/>
<Class name="hudson.model.UpdateSite$Plugin"/>
@ -287,7 +101,6 @@
<Class name="hudson.tasks.BuildTrigger"/>
<Class name="hudson.tasks.Maven"/>
<Class name="hudson.tasks.Maven$MavenInstallation"/>
<Class name="hudson.TcpSlaveAgentListener$TcpSlaveAgentListenerRescheduler"/>
<Class name="hudson.tools.DownloadFromUrlInstaller$DescriptorImpl"/>
<Class name="hudson.tools.ToolInstallation"/>
<Class name="hudson.triggers.SCMTrigger$DescriptorImpl"/>
@ -299,7 +112,6 @@
<Class name="jenkins.fingerprints.FingerprintStorage"/>
<Class name="jenkins.install.SetupWizard"/>
<Class name="jenkins.model.Jenkins"/>
<Class name="jenkins.model.Nodes"/>
<Class name="jenkins.model.RunIdMigrator"/>
<Class name="jenkins.mvn.SettingsPathHelper"/>
<Class name="jenkins.security.CustomClassFilter$Contributed"/>
@ -336,7 +148,6 @@
<Class name="hudson.Launcher$RemoteLaunchCallable"/>
<Class name="hudson.lifecycle.Lifecycle"/>
<Class name="hudson.lifecycle.WindowsServiceLifecycle"/>
<Class name="hudson.LocalPluginManager"/>
<Class name="hudson.logging.LogRecorder"/>
<Class name="hudson.model.AsyncAperiodicWork"/>
<Class name="hudson.model.AsyncPeriodicWork"/>
@ -352,7 +163,6 @@
<Class name="hudson.model.Run"/>
<Class name="hudson.model.Run$Artifact"/>
<Class name="hudson.model.UpdateCenter"/>
<Class name="hudson.model.UpdateCenter$DownloadJob"/>
<Class name="hudson.model.UpdateCenter$HudsonDowngradeJob"/>
<Class name="hudson.model.UpdateCenter$InstallationJob"/>
<Class name="hudson.model.UpdateCenter$PluginDowngradeJob"/>
@ -385,19 +195,15 @@
<Class name="jenkins.model.Jenkins"/>
<Class name="jenkins.model.Nodes"/>
<Class name="jenkins.model.PeepholePermalink"/>
<Class name="jenkins.model.RunIdMigrator"/>
<Class name="jenkins.mvn.FilePathGlobalSettingsProvider"/>
<Class name="jenkins.mvn.FilePathSettingsProvider"/>
<Class name="jenkins.mvn.SettingsPathHelper"/>
<Class name="jenkins.plugins.DetachedPluginsUtil$DetachedPlugin"/>
<Class name="jenkins.security.ClassFilterImpl"/>
<Class name="jenkins.security.ConfidentialKey"/>
<Class name="jenkins.security.DefaultConfidentialStore"/>
<Class name="jenkins.security.s2m.ConfigDirectory"/>
<Class name="jenkins.security.stapler.StaplerDispatchValidator$ValidatorCache"/>
<Class name="jenkins.security.stapler.StaticRoutingDecisionProvider"/>
<Class name="jenkins.slaves.restarter.UnixSlaveRestarter"/>
<Class name="jenkins.SoloFilePathFilter"/>
<Class name="jenkins.util.groovy.GroovyHookScript"/>
<Class name="jenkins.util.io.FileBoolean"/>
<Class name="jenkins.util.JavaVMArguments"/>
@ -408,58 +214,7 @@
</And>
<And>
<Bug pattern="REDOS"/>
<Or>
<Class name="hudson.model.Computer"/>
<Class name="jenkins.org.apache.commons.validator.routines.UrlValidator"/>
</Or>
</And>
<And>
<Bug pattern="REQUESTDISPATCHER_FILE_DISCLOSURE"/>
<Or>
<Class name="hudson.cli.CLIAction"/>
<Class name="hudson.model.AbstractProject"/>
<Class name="hudson.model.Descriptor"/>
<Class name="hudson.model.DirectoryBrowserSupport"/>
<Class name="hudson.model.RSS"/>
<Class name="hudson.model.Run"/>
<Class name="hudson.scm.AbstractScmTagAction"/>
<Class name="hudson.search.Search"/>
<Class name="hudson.security.BasicAuthenticationFilter"/>
<Class name="hudson.security.FederatedLoginService$UnclaimedIdentityException"/>
<Class name="hudson.security.HudsonPrivateSecurityRealm"/>
<Class name="hudson.slaves.NodeDescriptor"/>
<Class name="hudson.slaves.SlaveComputer"/>
<Class name="hudson.util.DoubleLaunchChecker"/>
<Class name="hudson.util.ErrorObject"/>
<Class name="hudson.util.HudsonIsLoading"/>
<Class name="hudson.util.HudsonIsRestarting"/>
<Class name="hudson.widgets.HistoryWidget"/>
<Class name="jenkins.agents.CloudSet"/>
<Class name="jenkins.management.AdministrativeMonitorsApi"/>
<Class name="jenkins.model.Jenkins"/>
<Class name="jenkins.model.ParameterizedJobMixIn"/>
<Class name="jenkins.slaves.EncryptedSlaveAgentJnlpFile"/>
</Or>
</And>
<And>
<Bug pattern="SE_BAD_FIELD"/>
<Class name="hudson.scm.PollingResult"/>
</And>
<And>
<Bug pattern="STATIC_IV"/>
<Or>
<Class name="hudson.cli.Connection"/>
<Class name="hudson.model.UsageStatistics$CombinedCipherOutputStream"/>
<Class name="jenkins.security.CryptoConfidentialKey"/>
</Or>
</And>
<And>
<Bug pattern="UNENCRYPTED_SERVER_SOCKET"/>
<Class name="hudson.slaves.Channels"/>
</And>
<And>
<Bug pattern="UNENCRYPTED_SOCKET"/>
<Class name="hudson.TcpSlaveAgentListener"/>
<Class name="jenkins.org.apache.commons.validator.routines.UrlValidator"/>
</And>
<And>
<Bug pattern="URLCONNECTION_SSRF_FD"/>
@ -475,21 +230,6 @@
<Class name="jenkins.security.ResourceDomainConfiguration"/>
</Or>
</And>
<And>
<Bug pattern="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR"/>
<Class name="hudson.slaves.SlaveComputer"/>
</And>
<And>
<Bug pattern="XSS_SERVLET"/>
<Or>
<Class name="hudson.Functions"/>
<Class name="hudson.security.AccessDeniedException3"/>
</Or>
</And>
</Or>
</Match>
<Match>
<Bug pattern="SIC_INNER_SHOULD_BE_STATIC"/>
<Class name="jenkins.security.stapler.StaplerDispatchValidator$ValidatorCache$Validator"/>
</Match>
</FindBugsFilter>

View File

@ -24,15 +24,15 @@
},
"devDependencies": {
"@babel/cli": "7.26.4",
"@babel/core": "7.26.9",
"@babel/core": "7.26.10",
"@babel/preset-env": "7.26.9",
"@eslint/js": "9.21.0",
"@eslint/js": "9.22.0",
"babel-loader": "10.0.0",
"clean-webpack-plugin": "4.0.0",
"css-loader": "7.1.2",
"css-minimizer-webpack-plugin": "7.0.0",
"eslint": "9.21.0",
"eslint-config-prettier": "10.0.2",
"css-minimizer-webpack-plugin": "7.0.2",
"eslint": "9.22.0",
"eslint-config-prettier": "10.1.1",
"eslint-formatter-checkstyle": "8.40.0",
"globals": "16.0.0",
"handlebars-loader": "1.7.3",
@ -45,7 +45,7 @@
"sass": "1.85.1",
"sass-loader": "16.0.5",
"style-loader": "4.0.0",
"stylelint": "16.15.0",
"stylelint": "16.16.0",
"stylelint-checkstyle-reporter": "1.0.0",
"stylelint-config-standard-scss": "14.0.0",
"webpack": "5.98.0",

View File

@ -73,9 +73,9 @@ THE SOFTWARE.
</issueManagement>
<properties>
<revision>2.501</revision>
<revision>2.502</revision>
<changelist>-SNAPSHOT</changelist>
<project.build.outputTimestamp>2025-03-04T10:34:35Z</project.build.outputTimestamp>
<project.build.outputTimestamp>2025-03-11T13:49:05Z</project.build.outputTimestamp>
<!-- configuration for patch tracker plugin -->
<project.patchManagement.system>github</project.patchManagement.system>
@ -97,8 +97,8 @@ THE SOFTWARE.
<bridge-method-injector.version>1.30</bridge-method-injector.version>
<spotless.check.skip>false</spotless.check.skip>
<!-- Make sure to keep the jetty-ee9-maven-plugin version in war/pom.xml in sync with the Jetty release in Winstone: -->
<winstone.version>8.4</winstone.version>
<node.version>20.18.3</node.version>
<winstone.version>8.5</winstone.version>
<node.version>20.19.0</node.version>
</properties>
<!--

View File

@ -21,6 +21,7 @@ export const JenkinsSearchSource = {
type: e.type,
label: e.name,
url: correctAddress(e.url),
group: e.group,
}),
);
}),

View File

@ -5,6 +5,7 @@ import * as Symbols from "./symbols";
import makeKeyboardNavigable from "@/util/keyboard";
import { xmlEscape } from "@/util/security";
import { createElementFromHtml } from "@/util/dom";
import { groupResultsByCategory } from "@/components/command-palette/utils";
const datasources = [JenkinsSearchSource];
@ -68,6 +69,7 @@ function init() {
label: i18n.dataset.getHelp,
url: headerCommandPaletteButton.dataset.searchHelpUrl,
isExternal: true,
group: null,
}),
]);
} else {
@ -77,15 +79,26 @@ function init() {
}
results.then((results) => {
results = groupResultsByCategory(results);
// Clear current search results
searchResults.innerHTML = "";
if (query.length === 0 || Object.keys(results).length > 0) {
results.forEach(function (obj) {
const link = createElementFromHtml(obj.render());
link.addEventListener("mouseenter", (e) => itemMouseEnter(e));
searchResults.append(link);
});
for (const [group, items] of Object.entries(results)) {
if (group !== "null") {
const heading = document.createElement("p");
heading.className = "jenkins-command-palette__results__heading";
heading.innerText = group;
searchResults.append(heading);
}
items.forEach(function (obj) {
const link = createElementFromHtml(obj.render());
link.addEventListener("mouseenter", (e) => itemMouseEnter(e));
searchResults.append(link);
});
}
updateSelectedItem(0);
} else {

View File

@ -7,12 +7,14 @@ import { xmlEscape } from "@/util/security";
* @param {string} params.label
* @param {'symbol' | 'image'} params.type
* @param {string} params.url
* @param {string | null} params.group
* @param {boolean | undefined} params.isExternal
*/
export function LinkResult(params) {
return {
label: params.label,
url: params.url,
group: params.group,
render: () => {
return `<a class="jenkins-command-palette__results__item" href="${xmlEscape(
params.url,

View File

@ -0,0 +1,13 @@
/**
* Group results by 'group' field into a map
*/
export function groupResultsByCategory(array) {
return array.reduce((hash, obj) => {
if (obj.group === undefined) {
return hash;
}
return Object.assign(hash, {
[obj.group]: (hash[obj.group] || []).concat(obj),
});
}, {});
}

View File

@ -19,15 +19,24 @@ function generateDropdown(element, callback, immediate) {
tippy(
element,
Object.assign({}, Templates.dropdown(), {
hideOnClick: element.dataset["hideOnClick"] !== "false",
hideOnClick:
element.dataset["hideOnClick"] !== "false" ? "toggle" : false,
onCreate(instance) {
const onload = () => {
if (instance.loaded) {
return;
}
instance.popper.addEventListener("click", () => {
instance.hide();
document.addEventListener("click", (event) => {
const isClickInAnyDropdown =
!!event.target.closest("[data-tippy-root]");
const isClickOnReference = instance.reference.contains(
event.target,
);
if (!isClickInAnyDropdown && !isClickOnReference) {
instance.hide();
}
});
callback(instance);

View File

@ -197,17 +197,17 @@ $semantics: (
--link-font-weight: var(--font-bold-weight);
// Command Palette
--command-palette-results-backdrop-filter: contrast(0.7) brightness(1.5)
saturate(1.4) blur(20px);
--command-palette-results-backdrop-filter: saturate(1.5) blur(5px);
--command-palette-inset-shadow:
inset 0 0 2px 2px rgb(255 255 255 / 0.1),
var(--jenkins-border--subtle-shadow);
var(--jenkins-border--subtle-shadow),
0 5px 10px var(--jenkins-border-color--subtle);
::backdrop {
--command-palette-backdrop-background: radial-gradient(
farthest-corner at 50% 30vh,
rgb(0 0 0 / 0.3),
rgb(0 0 0 / 0.1)
--command-palette-backdrop-background: color-mix(
in sRGB,
var(--black) 17.5%,
transparent
);
}

View File

@ -1,6 +1,12 @@
@use "../abstracts/mixins";
@use "../base/breakpoints";
$command-palette-background: color-mix(
in sRGB,
var(--card-background) 92.5%,
transparent
);
.jenkins-command-palette__dialog {
background: none;
border: none;
@ -14,19 +20,19 @@
&::backdrop {
background: var(--command-palette-backdrop-background);
backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px);
animation: jenkins-dialog-backdrop-animate-in 0.1s linear;
backdrop-filter: blur(1px);
animation: jenkins-dialog-backdrop-animate-in 0.075s linear;
}
&[open] {
animation: command-palette-animate-in 0.1s cubic-bezier(0, 0.68, 0.5, 1.5);
animation: command-palette-animate-in 0.075s cubic-bezier(0, 0.68, 0.5, 1.5);
}
&[closing] {
animation: command-palette-animate-out 0.1s linear;
animation: command-palette-animate-out 0.05s linear;
&::backdrop {
animation: jenkins-dialog-backdrop-animate-out 0.1s linear;
animation: jenkins-dialog-backdrop-animate-out 0.05s linear;
}
}
}
@ -48,7 +54,7 @@
}
.jenkins-command-palette__wrapper {
--inset: 15vh;
--inset: 10vh;
width: 100%;
height: 100%;
@ -76,7 +82,7 @@
&__search {
--search-bar-height: 3rem !important;
background: transparent;
background: $command-palette-background;
box-shadow: var(--command-palette-inset-shadow);
margin-bottom: var(--section-padding);
border-radius: 1rem;
@ -109,12 +115,13 @@
display: flex;
flex-direction: column;
border-radius: 1rem;
background: $command-palette-background;
backdrop-filter: var(--command-palette-results-backdrop-filter);
box-shadow: var(--command-palette-inset-shadow);
// If set to 0, Safari won't always show the backdrop-filter
height: 1px;
transition: height var(--standard-transition);
transition: height 0.15s ease;
overflow: hidden;
will-change: height;
}
@ -125,14 +132,13 @@
padding: 0.5rem;
&__heading {
font-weight: var(--font-bold-weight);
font-size: var(--font-size-sm);
margin: 0;
padding: 0.75rem 0.75rem 0.625rem;
padding: 0.375rem 0.625rem;
color: var(--text-color-secondary);
&:not(:first-of-type) {
padding-top: 2rem;
padding-top: 1.375rem;
}
}
@ -153,10 +159,9 @@
display: flex;
align-items: center;
justify-content: flex-start;
padding: 0.75rem;
padding: 0.625rem;
border-radius: 0.5rem;
color: var(--text-color) !important;
transition: var(--standard-transition);
&--hover {
&::before {
@ -171,7 +176,7 @@
justify-content: center;
width: 1.375rem;
height: 1.375rem;
margin-right: 0.75rem;
margin-right: 0.625rem;
overflow: hidden;
pointer-events: none;
color: var(--text-color);
@ -210,8 +215,8 @@
&__info {
font-size: var(--font-size-sm);
margin: 0;
padding: 0 14px;
line-height: 46px;
padding: 0 0.625rem;
line-height: 42px;
color: var(--text-color);
span {

View File

@ -134,7 +134,7 @@ THE SOFTWARE.
<!-- Required by plugin-util-api -->
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-support</artifactId>
<version>961.v51869f7b_d409</version>
<version>963.va_600813d04a_a_</version>
</dependency>
</dependencies>
</dependencyManagement>
@ -178,7 +178,7 @@ THE SOFTWARE.
<dependency>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>jenkins-test-harness</artifactId>
<version>2411.v1e79b_0dc94b_7</version>
<version>2414.v185474555e66</version>
<scope>test</scope>
<exclusions>
<exclusion>
@ -206,7 +206,7 @@ THE SOFTWARE.
<dependency>
<groupId>org.jenkins-ci.modules</groupId>
<artifactId>instance-identity</artifactId>
<version>201.vd2a_b_5a_468a_a_6</version>
<version>203.v15e81a_1b_7a_38</version>
<scope>test</scope>
</dependency>
<dependency>
@ -358,7 +358,7 @@ THE SOFTWARE.
<artifactItem>
<groupId>io.jenkins.plugins</groupId>
<artifactId>prism-api</artifactId>
<version>1.29.0-19</version>
<version>1.30.0-1</version>
<type>hpi</type>
<outputDirectory>${project.build.outputDirectory}/plugins</outputDirectory>
<destFileName>prism-api.jpi</destFileName>

View File

@ -54,7 +54,7 @@ public class PluginTest {
r.createWebClient().assertFails("plugin/matrix-auth/images/%2e%2e%2fWEB-INF/licenses.xml", HttpServletResponse.SC_BAD_REQUEST);
r.createWebClient().assertFails("plugin/matrix-auth/images/%2e.%2fWEB-INF/licenses.xml", HttpServletResponse.SC_BAD_REQUEST);
r.createWebClient().assertFails("plugin/matrix-auth/images/..%2f..%2f..%2f" + r.jenkins.getRootDir().getName() + "%2fsecrets%2fmaster.key", HttpServletResponse.SC_BAD_REQUEST);
r.createWebClient().assertFails("plugin/matrix-auth/" + r.jenkins.getRootDir() + "/secrets/master.key", /* ./ prepended anyway */ Functions.isWindows() ? HttpServletResponse.SC_BAD_REQUEST : HttpServletResponse.SC_NOT_FOUND);
r.createWebClient().assertFails("plugin/matrix-auth/" + r.jenkins.getRootDir() + "/secrets/master.key", /* ./ prepended anyway */ HttpServletResponse.SC_NOT_FOUND);
// SECURITY-155:
r.createWebClient().assertFails("plugin/matrix-auth/WEB-INF/licenses.xml", HttpServletResponse.SC_BAD_REQUEST);
r.createWebClient().assertFails("plugin/matrix-auth/META-INF/MANIFEST.MF", HttpServletResponse.SC_BAD_REQUEST);

View File

@ -666,6 +666,7 @@ public class AbstractProjectTest {
o.put("url", JSONObject.fromObject(null));
o.put("icon", JSONObject.fromObject(null));
o.put("type", "symbol");
o.put("group", JSONObject.fromObject(null));
expected.add(o);
}
assertThat(suggestions.containsAll(expected), is(true));

View File

@ -151,13 +151,8 @@ public class DirectoryBrowserSupportTest {
try (JenkinsRule.WebClient wc = j.createWebClient()) {
// normal path provided by the UI succeeds
wc.goTo("job/" + p.getName() + "/ws/abc/def.bin", "application/octet-stream");
// suspicious path is rejected with 400
wc.setThrowExceptionOnFailingStatusCode(false);
HtmlPage page = wc.goTo("job/" + p.getName() + "/ws/abc%5Cdef.bin");
assertEquals(400, page.getWebResponse().getStatusCode());
assertEquals("Error 400 Suspicious Path Character", page.getTitleText());
Page page = wc.goTo("job/" + p.getName() + "/ws/abc%5Cdef.bin", "application/octet-stream");
assertEquals(200, page.getWebResponse().getStatusCode());
}
}
@ -1117,11 +1112,9 @@ public class DirectoryBrowserSupportTest {
Files.writeString(targetTmpPath, content, StandardCharsets.UTF_8);
try (JenkinsRule.WebClient wc = j.createWebClient()) {
// suspicious path is rejected with 400
wc.setThrowExceptionOnFailingStatusCode(false);
HtmlPage page = wc.goTo("userContent/" + targetTmpPath.toAbsolutePath() + "/*view*");
assertEquals(400, page.getWebResponse().getStatusCode());
assertEquals("Error 400 Suspicious Path Character", page.getTitleText());
assertEquals(404, page.getWebResponse().getStatusCode());
}
}

View File

@ -352,7 +352,7 @@ THE SOFTWARE.
<!-- dependency of checks-api and plugin-util-api -->
<groupId>org.jenkins-ci.plugins.workflow</groupId>
<artifactId>workflow-support</artifactId>
<version>961.v51869f7b_d409</version>
<version>963.va_600813d04a_a_</version>
<type>hpi</type>
</artifactItem>
@ -360,7 +360,7 @@ THE SOFTWARE.
<!-- dependency of junit and echarts-api -->
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>jackson2-api</artifactId>
<version>2.17.0-389.va_5c7e45cd806</version>
<version>2.18.3-402.v74c4eb_f122b_2</version>
<type>hpi</type>
</artifactItem>
<artifactItem>
@ -490,7 +490,7 @@ THE SOFTWARE.
<!-- detached after 2.356 -->
<groupId>org.jenkins-ci.modules</groupId>
<artifactId>instance-identity</artifactId>
<version>201.vd2a_b_5a_468a_a_6</version>
<version>203.v15e81a_1b_7a_38</version>
<type>hpi</type>
</artifactItem>
<artifactItem>
@ -647,7 +647,7 @@ THE SOFTWARE.
<plugin>
<groupId>org.eclipse.jetty.ee9</groupId>
<artifactId>jetty-ee9-maven-plugin</artifactId>
<version>12.0.16</version>
<version>12.0.17</version>
<configuration>
<!--
Reload webapp when you hit ENTER. (See JETTY-282 for more)

View File

@ -1874,12 +1874,10 @@ function xor(a, b) {
// used by editableDescription.jelly to replace the description field with a form
// eslint-disable-next-line no-unused-vars
function replaceDescription(initialDescription, submissionUrl) {
var d = document.getElementById("description");
let button = d.firstElementChild.nextElementSibling;
if (button !== null) {
d.firstElementChild.nextElementSibling.innerHTML =
"<div class='jenkins-spinner'></div>";
}
const descriptionContent = document.getElementById("description-content");
const descriptionEditForm = document.getElementById("description-edit-form");
descriptionEditForm.innerHTML = "<div class='jenkins-spinner'></div>";
descriptionContent.classList.add("jenkins-hidden");
let parameters = {};
if (initialDescription !== null && initialDescription !== "") {
parameters["description"] = initialDescription;
@ -1895,10 +1893,11 @@ function replaceDescription(initialDescription, submissionUrl) {
body: objectToUrlFormEncoded(parameters),
}).then((rsp) => {
rsp.text().then((responseText) => {
d.innerHTML = responseText;
descriptionEditForm.innerHTML = responseText;
descriptionEditForm.classList.remove("jenkins-hidden");
evalInnerHtmlScripts(responseText, function () {
Behaviour.applySubtree(d);
d.getElementsByTagName("TEXTAREA")[0].focus();
Behaviour.applySubtree(descriptionEditForm);
descriptionEditForm.getElementsByTagName("TEXTAREA")[0].focus();
});
layoutUpdateCallback.call();
return false;

226
yarn.lock
View File

@ -60,39 +60,39 @@ __metadata:
languageName: node
linkType: hard
"@babel/core@npm:7.26.9":
version: 7.26.9
resolution: "@babel/core@npm:7.26.9"
"@babel/core@npm:7.26.10":
version: 7.26.10
resolution: "@babel/core@npm:7.26.10"
dependencies:
"@ampproject/remapping": "npm:^2.2.0"
"@babel/code-frame": "npm:^7.26.2"
"@babel/generator": "npm:^7.26.9"
"@babel/generator": "npm:^7.26.10"
"@babel/helper-compilation-targets": "npm:^7.26.5"
"@babel/helper-module-transforms": "npm:^7.26.0"
"@babel/helpers": "npm:^7.26.9"
"@babel/parser": "npm:^7.26.9"
"@babel/helpers": "npm:^7.26.10"
"@babel/parser": "npm:^7.26.10"
"@babel/template": "npm:^7.26.9"
"@babel/traverse": "npm:^7.26.9"
"@babel/types": "npm:^7.26.9"
"@babel/traverse": "npm:^7.26.10"
"@babel/types": "npm:^7.26.10"
convert-source-map: "npm:^2.0.0"
debug: "npm:^4.1.0"
gensync: "npm:^1.0.0-beta.2"
json5: "npm:^2.2.3"
semver: "npm:^6.3.1"
checksum: 10c0/ed7212ff42a9453765787019b7d191b167afcacd4bd8fec10b055344ef53fa0cc648c9a80159ae4ecf870016a6318731e087042dcb68d1a2a9d34eb290dc014b
checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62
languageName: node
linkType: hard
"@babel/generator@npm:^7.26.9":
version: 7.26.9
resolution: "@babel/generator@npm:7.26.9"
"@babel/generator@npm:^7.26.10":
version: 7.26.10
resolution: "@babel/generator@npm:7.26.10"
dependencies:
"@babel/parser": "npm:^7.26.9"
"@babel/types": "npm:^7.26.9"
"@babel/parser": "npm:^7.26.10"
"@babel/types": "npm:^7.26.10"
"@jridgewell/gen-mapping": "npm:^0.3.5"
"@jridgewell/trace-mapping": "npm:^0.3.25"
jsesc: "npm:^3.0.2"
checksum: 10c0/6b78872128205224a9a9761b9ea7543a9a7902a04b82fc2f6801ead4de8f59056bab3fd17b1f834ca7b049555fc4c79234b9a6230dd9531a06525306050becad
checksum: 10c0/88b3b3ea80592fc89349c4e1a145e1386e4042866d2507298adf452bf972f68d13bf699a845e6ab8c028bd52c2247013eb1221b86e1db5c9779faacba9c4b10e
languageName: node
linkType: hard
@ -280,24 +280,24 @@ __metadata:
languageName: node
linkType: hard
"@babel/helpers@npm:^7.26.9":
version: 7.26.9
resolution: "@babel/helpers@npm:7.26.9"
"@babel/helpers@npm:^7.26.10":
version: 7.26.10
resolution: "@babel/helpers@npm:7.26.10"
dependencies:
"@babel/template": "npm:^7.26.9"
"@babel/types": "npm:^7.26.9"
checksum: 10c0/3d4dbc4a33fe4181ed810cac52318b578294745ceaec07e2f6ecccf6cda55d25e4bfcea8f085f333bf911c9e1fc13320248dd1d5315ab47ad82ce1077410df05
"@babel/types": "npm:^7.26.10"
checksum: 10c0/f99e1836bcffce96db43158518bb4a24cf266820021f6461092a776cba2dc01d9fc8b1b90979d7643c5c2ab7facc438149064463a52dd528b21c6ab32509784f
languageName: node
linkType: hard
"@babel/parser@npm:^7.26.9":
version: 7.26.9
resolution: "@babel/parser@npm:7.26.9"
"@babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.9":
version: 7.26.10
resolution: "@babel/parser@npm:7.26.10"
dependencies:
"@babel/types": "npm:^7.26.9"
"@babel/types": "npm:^7.26.10"
bin:
parser: ./bin/babel-parser.js
checksum: 10c0/4b9ef3c9a0d4c328e5e5544f50fe8932c36f8a2c851e7f14a85401487cd3da75cad72c2e1bcec1eac55599a6bbb2fdc091f274c4fcafa6bdd112d4915ff087fc
checksum: 10c0/c47f5c0f63cd12a663e9dc94a635f9efbb5059d98086a92286d7764357c66bceba18ccbe79333e01e9be3bfb8caba34b3aaebfd8e62c3d5921c8cf907267be75
languageName: node
linkType: hard
@ -1102,28 +1102,28 @@ __metadata:
languageName: node
linkType: hard
"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9":
version: 7.26.9
resolution: "@babel/traverse@npm:7.26.9"
"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8":
version: 7.26.10
resolution: "@babel/traverse@npm:7.26.10"
dependencies:
"@babel/code-frame": "npm:^7.26.2"
"@babel/generator": "npm:^7.26.9"
"@babel/parser": "npm:^7.26.9"
"@babel/generator": "npm:^7.26.10"
"@babel/parser": "npm:^7.26.10"
"@babel/template": "npm:^7.26.9"
"@babel/types": "npm:^7.26.9"
"@babel/types": "npm:^7.26.10"
debug: "npm:^4.3.1"
globals: "npm:^11.1.0"
checksum: 10c0/51dd57fa39ea34d04816806bfead04c74f37301269d24c192d1406dc6e244fea99713b3b9c5f3e926d9ef6aa9cd5c062ad4f2fc1caa9cf843d5e864484ac955e
checksum: 10c0/4e86bb4e3c30a6162bb91df86329df79d96566c3e2d9ccba04f108c30473a3a4fd360d9990531493d90f6a12004f10f616bf9b9229ca30c816b708615e9de2ac
languageName: node
linkType: hard
"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.4.4":
version: 7.26.9
resolution: "@babel/types@npm:7.26.9"
"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.9, @babel/types@npm:^7.4.4":
version: 7.26.10
resolution: "@babel/types@npm:7.26.10"
dependencies:
"@babel/helper-string-parser": "npm:^7.25.9"
"@babel/helper-validator-identifier": "npm:^7.25.9"
checksum: 10c0/999c56269ba00e5c57aa711fbe7ff071cd6990bafd1b978341ea7572cc78919986e2aa6ee51dacf4b6a7a6fa63ba4eb3f1a03cf55eee31b896a56d068b895964
checksum: 10c0/7a7f83f568bfc3dfabfaf9ae3a97ab5c061726c0afa7dcd94226d4f84a81559da368ed79671e3a8039d16f12476cf110381a377ebdea07587925f69628200dac
languageName: node
linkType: hard
@ -1660,6 +1660,13 @@ __metadata:
languageName: node
linkType: hard
"@eslint/config-helpers@npm:^0.1.0":
version: 0.1.0
resolution: "@eslint/config-helpers@npm:0.1.0"
checksum: 10c0/3562b5325f42740fc83b0b92b7d13a61b383f8db064915143eec36184f09a09fad73eca6c2955ab6c248b0d04fa03c140f9af2f2c4c06770781a6b79f300a01e
languageName: node
linkType: hard
"@eslint/core@npm:^0.12.0":
version: 0.12.0
resolution: "@eslint/core@npm:0.12.0"
@ -1686,10 +1693,10 @@ __metadata:
languageName: node
linkType: hard
"@eslint/js@npm:9.21.0":
version: 9.21.0
resolution: "@eslint/js@npm:9.21.0"
checksum: 10c0/86c24a2668808995037e3f40c758335df2ae277c553ac0cf84381a1a8698f3099d8a22dd9c388947e6b7f93fcc1142f62406072faaa2b83c43ca79993fc01bb3
"@eslint/js@npm:9.22.0":
version: 9.22.0
resolution: "@eslint/js@npm:9.22.0"
checksum: 10c0/5bcd009bb579dc6c6ed760703bdd741e08a48cd9decd677aa2cf67fe66236658cb09a00185a0369f3904e5cffba9e6e0f2ff4d9ba4fdf598fcd81d34c49213a5
languageName: node
linkType: hard
@ -1846,12 +1853,12 @@ __metadata:
languageName: node
linkType: hard
"@keyv/serialize@npm:^1.0.2":
version: 1.0.2
resolution: "@keyv/serialize@npm:1.0.2"
"@keyv/serialize@npm:^1.0.3":
version: 1.0.3
resolution: "@keyv/serialize@npm:1.0.3"
dependencies:
buffer: "npm:^6.0.3"
checksum: 10c0/31c5cb0938d22ce890314befc4d00c248c4c9be9664885978d6449b1787993dbc91999041076d53437888bb5f4280233276fbc4c72f97955d111d7a6ccd4cd67
checksum: 10c0/24a257870b0548cfe430680c2ae1641751e6a6ec90c573eaf51bfe956839b6cfa462b4d2827157363b6d620872d32d69fa2f37210a864ba488f8ec7158436398
languageName: node
linkType: hard
@ -2787,13 +2794,13 @@ __metadata:
languageName: node
linkType: hard
"cacheable@npm:^1.8.8":
version: 1.8.8
resolution: "cacheable@npm:1.8.8"
"cacheable@npm:^1.8.9":
version: 1.8.9
resolution: "cacheable@npm:1.8.9"
dependencies:
hookified: "npm:^1.7.0"
keyv: "npm:^5.2.3"
checksum: 10c0/24e0f93782015be75b1ec9fe3fb151b2921f61c282091b873f78a0efeb141e95a21d8aa5f4c6bd99a8acb0b485deb5801aa32b4ecf4b666efa7446739368588b
hookified: "npm:^1.7.1"
keyv: "npm:^5.3.1"
checksum: 10c0/355ed0b9a312542176bf98b8d0582f8882163b7831baea3fdc6ba78d7a698e15abc3818ec049b79ad969de0f50771148bb99a616c5632c809ef7fc40f266397d
languageName: node
linkType: hard
@ -3077,14 +3084,14 @@ __metadata:
languageName: node
linkType: hard
"css-minimizer-webpack-plugin@npm:7.0.0":
version: 7.0.0
resolution: "css-minimizer-webpack-plugin@npm:7.0.0"
"css-minimizer-webpack-plugin@npm:7.0.2":
version: 7.0.2
resolution: "css-minimizer-webpack-plugin@npm:7.0.2"
dependencies:
"@jridgewell/trace-mapping": "npm:^0.3.25"
cssnano: "npm:^7.0.1"
cssnano: "npm:^7.0.4"
jest-worker: "npm:^29.7.0"
postcss: "npm:^8.4.38"
postcss: "npm:^8.4.40"
schema-utils: "npm:^4.2.0"
serialize-javascript: "npm:^6.0.2"
peerDependencies:
@ -3102,7 +3109,7 @@ __metadata:
optional: true
lightningcss:
optional: true
checksum: 10c0/607258ea16b753b42cbcf88b0b20c99406d7f162ad3a4da50ec3e23d1fb652d1304815c0d0c577944256c76dff3df64e1708e5c5e255318694ba8aaba7820ca3
checksum: 10c0/da12f3214220cec8240af7206477f1d1a0036943b704ae36c75617bda8f1905b4d0f71869eda70dfbb184d3e200be541fc5b8b65781294bde71ede1660406a5b
languageName: node
linkType: hard
@ -3230,7 +3237,7 @@ __metadata:
languageName: node
linkType: hard
"cssnano@npm:^7.0.1":
"cssnano@npm:^7.0.4":
version: 7.0.6
resolution: "cssnano@npm:7.0.6"
dependencies:
@ -3455,14 +3462,14 @@ __metadata:
languageName: node
linkType: hard
"eslint-config-prettier@npm:10.0.2":
version: 10.0.2
resolution: "eslint-config-prettier@npm:10.0.2"
"eslint-config-prettier@npm:10.1.1":
version: 10.1.1
resolution: "eslint-config-prettier@npm:10.1.1"
peerDependencies:
eslint: ">=7.0.0"
bin:
eslint-config-prettier: build/bin/cli.js
checksum: 10c0/e0ef3c442661a26fc6e82acec5bb9a418c4a8f65ec8adf0983d3aaba7716d2ed448358b063cce6e3c272c847d14cb856ddf30031770c6571e2b2c3e2a439afd4
eslint-config-prettier: bin/cli.js
checksum: 10c0/3dbfdf6495dd62e2e1644ea9e8e978100dabcd8740fd264df1222d130001a1e8de05d6ed6c67d3a60727386a07507f067d1ca79af6d546910414beab19e7966e
languageName: node
linkType: hard
@ -3483,13 +3490,13 @@ __metadata:
languageName: node
linkType: hard
"eslint-scope@npm:^8.2.0":
version: 8.2.0
resolution: "eslint-scope@npm:8.2.0"
"eslint-scope@npm:^8.3.0":
version: 8.3.0
resolution: "eslint-scope@npm:8.3.0"
dependencies:
esrecurse: "npm:^4.3.0"
estraverse: "npm:^5.2.0"
checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6
checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b
languageName: node
linkType: hard
@ -3507,16 +3514,17 @@ __metadata:
languageName: node
linkType: hard
"eslint@npm:9.21.0":
version: 9.21.0
resolution: "eslint@npm:9.21.0"
"eslint@npm:9.22.0":
version: 9.22.0
resolution: "eslint@npm:9.22.0"
dependencies:
"@eslint-community/eslint-utils": "npm:^4.2.0"
"@eslint-community/regexpp": "npm:^4.12.1"
"@eslint/config-array": "npm:^0.19.2"
"@eslint/config-helpers": "npm:^0.1.0"
"@eslint/core": "npm:^0.12.0"
"@eslint/eslintrc": "npm:^3.3.0"
"@eslint/js": "npm:9.21.0"
"@eslint/js": "npm:9.22.0"
"@eslint/plugin-kit": "npm:^0.2.7"
"@humanfs/node": "npm:^0.16.6"
"@humanwhocodes/module-importer": "npm:^1.0.1"
@ -3528,7 +3536,7 @@ __metadata:
cross-spawn: "npm:^7.0.6"
debug: "npm:^4.3.2"
escape-string-regexp: "npm:^4.0.0"
eslint-scope: "npm:^8.2.0"
eslint-scope: "npm:^8.3.0"
eslint-visitor-keys: "npm:^4.2.0"
espree: "npm:^10.3.0"
esquery: "npm:^1.5.0"
@ -3552,7 +3560,7 @@ __metadata:
optional: true
bin:
eslint: bin/eslint.js
checksum: 10c0/558edb25b440cd51825d66fed3e84f1081bd6f4cb2cf994e60ece4c5978fa0583e88b75faf187c1fc21688c4ff7072f12bf5f6d1be1e09a4d6af78cff39dc520
checksum: 10c0/7b5ab6f2365971c16efe97349565f75d8343347562fb23f12734c6ab2cd5e35301373a0d51e194789ddcfdfca21db7b62ff481b03d524b8169896c305b65ff48
languageName: node
linkType: hard
@ -3694,12 +3702,12 @@ __metadata:
languageName: node
linkType: hard
"file-entry-cache@npm:^10.0.6":
version: 10.0.6
resolution: "file-entry-cache@npm:10.0.6"
"file-entry-cache@npm:^10.0.7":
version: 10.0.7
resolution: "file-entry-cache@npm:10.0.7"
dependencies:
flat-cache: "npm:^6.1.6"
checksum: 10c0/4e7226a5dbe7b5130c848c5fd3a352bb16e4ddb1de10cb4b3ea8375f6ab6085ed10da4db2db8119c61fc7e56fc59a40eeb837a4ae1a3a7c8357a17e69004f113
flat-cache: "npm:^6.1.7"
checksum: 10c0/b56ea1b6f3f0faf7954667c1991d8ff50901c53cd37c775b72d18d6fa5641bbf0e2cddb84b9d10f900a6ad3d1432f1525405a966b113d7512d9d8f820f1bb7a4
languageName: node
linkType: hard
@ -3751,14 +3759,14 @@ __metadata:
languageName: node
linkType: hard
"flat-cache@npm:^6.1.6":
version: 6.1.6
resolution: "flat-cache@npm:6.1.6"
"flat-cache@npm:^6.1.7":
version: 6.1.7
resolution: "flat-cache@npm:6.1.7"
dependencies:
cacheable: "npm:^1.8.8"
flatted: "npm:^3.3.2"
hookified: "npm:^1.7.0"
checksum: 10c0/2aeba555b61d32d7f0803e6b6b3ba959610cdc0e5b591ed0f80a3ad70c4e80e81afb6853c495cafdcbc3a02386d76a1522babcf04e50c4a1e81df2decfd02e9f
cacheable: "npm:^1.8.9"
flatted: "npm:^3.3.3"
hookified: "npm:^1.7.1"
checksum: 10c0/37bf101b35483e2df3f2fbee46e549d8e6ebd932fb4969a800dc595a13bd239b7dfe804a8f565518b39bec78d827344afa21d66849f1f12ca8f13901411f2b9d
languageName: node
linkType: hard
@ -3771,10 +3779,10 @@ __metadata:
languageName: node
linkType: hard
"flatted@npm:^3.2.9, flatted@npm:^3.3.2":
version: 3.3.2
resolution: "flatted@npm:3.3.2"
checksum: 10c0/24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334
"flatted@npm:^3.2.9, flatted@npm:^3.3.3":
version: 3.3.3
resolution: "flatted@npm:3.3.3"
checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538
languageName: node
linkType: hard
@ -4043,10 +4051,10 @@ __metadata:
languageName: node
linkType: hard
"hookified@npm:^1.7.0":
version: 1.7.1
resolution: "hookified@npm:1.7.1"
checksum: 10c0/779cb2f912d19f9cf00ec081d2fb07068553093e8cfaab7fb536b45a04b5743ac836e7fd4d09f1473f82c105338aa2539a104e5fb28e55f4ec1ce0be28ea9acc
"hookified@npm:^1.7.1":
version: 1.8.1
resolution: "hookified@npm:1.8.1"
checksum: 10c0/f3ed2ec2e522946cbf9c673f05ff5ead266bb6fd8ff2c2beb8bea0ea786658131fdb72f3aa2c2c154451f08316a3c266ecb74522647c35c25c3e9c16d9584d55
languageName: node
linkType: hard
@ -4342,15 +4350,15 @@ __metadata:
resolution: "jenkins-ui@workspace:."
dependencies:
"@babel/cli": "npm:7.26.4"
"@babel/core": "npm:7.26.9"
"@babel/core": "npm:7.26.10"
"@babel/preset-env": "npm:7.26.9"
"@eslint/js": "npm:9.21.0"
"@eslint/js": "npm:9.22.0"
babel-loader: "npm:10.0.0"
clean-webpack-plugin: "npm:4.0.0"
css-loader: "npm:7.1.2"
css-minimizer-webpack-plugin: "npm:7.0.0"
eslint: "npm:9.21.0"
eslint-config-prettier: "npm:10.0.2"
css-minimizer-webpack-plugin: "npm:7.0.2"
eslint: "npm:9.22.0"
eslint-config-prettier: "npm:10.1.1"
eslint-formatter-checkstyle: "npm:8.40.0"
globals: "npm:16.0.0"
handlebars: "npm:4.7.8"
@ -4368,7 +4376,7 @@ __metadata:
sass-loader: "npm:16.0.5"
sortablejs: "npm:1.15.6"
style-loader: "npm:4.0.0"
stylelint: "npm:16.15.0"
stylelint: "npm:16.16.0"
stylelint-checkstyle-reporter: "npm:1.0.0"
stylelint-config-standard-scss: "npm:14.0.0"
tippy.js: "npm:6.3.7"
@ -4551,12 +4559,12 @@ __metadata:
languageName: node
linkType: hard
"keyv@npm:^5.2.3":
version: 5.2.3
resolution: "keyv@npm:5.2.3"
"keyv@npm:^5.3.1":
version: 5.3.1
resolution: "keyv@npm:5.3.1"
dependencies:
"@keyv/serialize": "npm:^1.0.2"
checksum: 10c0/76b87dd2c21a4c1c5c05e9ff3b85670beab98f153429aaa9aee544b72b65411a7d80d96c29f3fef3e9dcebb672c8268e7209d6f80beb5da939b4e019722948b4
"@keyv/serialize": "npm:^1.0.3"
checksum: 10c0/d5ffe3d2d547a50a5e1189d5acbc0480821c22c025082851a8eeb26667d789f3f7b7ee7beb933660d98c239f7e7c403c652a511693670a78a73f06cd411e04fa
languageName: node
linkType: hard
@ -6046,7 +6054,7 @@ __metadata:
languageName: node
linkType: hard
"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.5.3":
"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.40, postcss@npm:^8.5.3":
version: 8.5.3
resolution: "postcss@npm:8.5.3"
dependencies:
@ -6698,9 +6706,9 @@ __metadata:
languageName: node
linkType: hard
"stylelint@npm:16.15.0":
version: 16.15.0
resolution: "stylelint@npm:16.15.0"
"stylelint@npm:16.16.0":
version: 16.16.0
resolution: "stylelint@npm:16.16.0"
dependencies:
"@csstools/css-parser-algorithms": "npm:^3.0.4"
"@csstools/css-tokenizer": "npm:^3.0.3"
@ -6715,7 +6723,7 @@ __metadata:
debug: "npm:^4.3.7"
fast-glob: "npm:^3.3.3"
fastest-levenshtein: "npm:^1.0.16"
file-entry-cache: "npm:^10.0.6"
file-entry-cache: "npm:^10.0.7"
global-modules: "npm:^2.0.0"
globby: "npm:^11.1.0"
globjoin: "npm:^0.1.4"
@ -6742,7 +6750,7 @@ __metadata:
write-file-atomic: "npm:^5.0.1"
bin:
stylelint: bin/stylelint.mjs
checksum: 10c0/32dee221fe8980e08adcdc7c48ddab51eac263784b0cc2f4eb9c029e3589ad6ce7dae710ec2aadb57bdbfecec579326c75918686f1563576715cbd3095c5dd12
checksum: 10c0/7884a347fbaf04215f205bb9630bce91c72a3d08ddd5aec1d1ad7ccfdff50854bb6ad995945d5d6a6a4052a1c5fadb3fd4929e8e7db4cde5a6ce0f7dbe537800
languageName: node
linkType: hard