diff --git a/changelog.html b/changelog.html
index 802d6d1345..61efd81fec 100644
--- a/changelog.html
+++ b/changelog.html
@@ -67,7 +67,10 @@ Upcoming changes
(issue 36996)
If an older version of a detached plugin is already installed it does not get upgraded
- (issue 37041)
+ (issue 37041)
+
+ Allow admins to control the enabled agent protocols on their instance from the global security settings screen.
+ (issue 37032)
diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java
index de0cb06b2a..92416858e7 100644
--- a/core/src/main/java/hudson/PluginManager.java
+++ b/core/src/main/java/hudson/PluginManager.java
@@ -1298,7 +1298,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas
* the plugin will only take effect after the reboot.
* See {@link UpdateCenter#isRestartRequiredForCompletion()}
* @return The install job list.
- * @since FIXME
+ * @since 2.0
*/
@Restricted(NoExternalUse.class)
public List> install(@Nonnull Collection plugins, boolean dynamicLoad) {
diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java
index 238dd51296..c01f711406 100644
--- a/core/src/main/java/hudson/TcpSlaveAgentListener.java
+++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java
@@ -126,7 +126,7 @@ public final class TcpSlaveAgentListener extends Thread {
* clients can avoid creating additional work for the server attempting to connect with unsupported protocols.
*
* @return a comma separated list of the enabled {@link AgentProtocol#getName()} implementations
- * @since FIXME
+ * @since 2.16
*/
public String getAgentProtocolNames() {
return StringUtils.join(Jenkins.getInstance().getAgentProtocols(), ", ");
@@ -262,11 +262,7 @@ public final class TcpSlaveAgentListener extends Thread {
}
/**
- * Allow essential {@link AgentProtocol} implementations (basically {@link PingAgentProtocol})
- * to be always enabled.
- *
- * @return {@code true} if the protocol can never be disabled.
- * @since FIXME
+ * {@inheritDoc}
*/
@Override
public boolean isRequired() {
diff --git a/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java b/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java
index 838e3a0caf..f092a8bb10 100644
--- a/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java
+++ b/core/src/main/java/hudson/model/DescriptorVisibilityFilter.java
@@ -35,7 +35,7 @@ public abstract class DescriptorVisibilityFilter implements ExtensionPoint {
* @return true to allow the descriptor to be visible. false to hide it.
* If any of the installed {@link DescriptorVisibilityFilter} returns false,
* the descriptor is not shown.
- * @since FIXME
+ * @since 2.12
*/
public boolean filterType(@Nonnull Class> contextClass, @Nonnull Descriptor descriptor) {
return true;
diff --git a/core/src/main/java/hudson/model/Fingerprint.java b/core/src/main/java/hudson/model/Fingerprint.java
index c2ab05a678..2e33bdf2d0 100644
--- a/core/src/main/java/hudson/model/Fingerprint.java
+++ b/core/src/main/java/hudson/model/Fingerprint.java
@@ -1468,7 +1468,7 @@ public class Fingerprint implements ModelObject, Saveable {
* Provides the XStream instance this class is using for serialization.
*
* @return the XStream instance
- * @since FIXME
+ * @since 1.655
*/
@Nonnull
public static XStream2 getXStream() {
diff --git a/core/src/main/java/jenkins/AgentProtocol.java b/core/src/main/java/jenkins/AgentProtocol.java
index a9eca520d7..93140b71c1 100644
--- a/core/src/main/java/jenkins/AgentProtocol.java
+++ b/core/src/main/java/jenkins/AgentProtocol.java
@@ -37,7 +37,7 @@ public abstract class AgentProtocol implements ExtensionPoint {
* adding new protocols and retiring old ones.
*
* @return {@code true} if the protocol requires explicit opt-in.
- * @since FIXME
+ * @since 2.16
* @see Jenkins#setAgentProtocols(Set)
*/
public boolean isOptIn() {
@@ -48,7 +48,7 @@ public abstract class AgentProtocol implements ExtensionPoint {
* to be always enabled.
*
* @return {@code true} if the protocol can never be disabled.
- * @since FIXME
+ * @since 2.16
*/
public boolean isRequired() {
return false;
@@ -68,7 +68,7 @@ public abstract class AgentProtocol implements ExtensionPoint {
* Returns the human readable protocol display name.
*
* @return the human readable protocol display name.
- * @since FIXME
+ * @since 2.16
*/
public String getDisplayName() {
return getName();
diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java
index 22492d89eb..83e3184894 100644
--- a/core/src/main/java/jenkins/model/Jenkins.java
+++ b/core/src/main/java/jenkins/model/Jenkins.java
@@ -602,7 +602,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols
* are enabled by default). Will be {@code null} instead of empty to simplify XML format.
*
- * @since FIXME
+ * @since 2.16
*/
@CheckForNull
private List disabledAgentProtocols;
@@ -611,15 +611,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled.
* Will be {@code null} instead of empty to simplify XML format.
*
- * @since FIXME
+ * @since 2.16
*/
@CheckForNull
private List enabledAgentProtocols;
/**
- * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols}.
+ * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and
+ * {@link #enabledAgentProtocols}.
*
- * @since FIXME
+ * @since 2.16
+ * @see #setAgentProtocols(Set)
+ * @see #getAgentProtocols()
*/
private transient Set agentProtocols;
@@ -1089,7 +1092,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* Returns the enabled agent protocols.
*
* @return the enabled agent protocols.
- * @since FIXME
+ * @since 2.16
*/
public Set getAgentProtocols() {
if (agentProtocols == null) {
@@ -1120,7 +1123,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve
* Sets the enabled agent protocols.
*
* @param protocols the enabled agent protocols.
- * @since FIXME
+ * @since 2.16
*/
public void setAgentProtocols(Set protocols) {
Set disabled = new TreeSet<>();
diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java
index 5086d9191a..e1618aa719 100644
--- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java
+++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java
@@ -39,10 +39,7 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol {
NioChannelSelector hub;
/**
- * Allow experimental {@link AgentProtocol} implementations to declare being opt-in.
- *
- * @return {@code true} if the protocol requires explicit opt-in.
- * @since FIXME
+ * {@inheritDoc}
*/
@Override
public boolean isOptIn() {
diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java
index afdda622b4..b90f23781c 100644
--- a/core/src/main/java/jenkins/util/SystemProperties.java
+++ b/core/src/main/java/jenkins/util/SystemProperties.java
@@ -212,7 +212,7 @@ public class SystemProperties implements ServletContextListener {
*
* @param name the system property name.
* @return {@link Boolean#TRUE}, {@link Boolean#FALSE} or {@code null}
- * @since FIXME
+ * @since 2.16
*/
@CheckForNull
public static Boolean optBoolean(String name) {