From a6517254fa123ac8d3be936e3e5ad80dcac93991 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Thu, 6 Dec 2007 05:53:00 +0000 Subject: [PATCH] hooking up realm&authorization configuration UI to the config submission logic. git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@6226 71c3de6d-444a-0410-be80-ed276b4c234a --- core/src/main/java/hudson/Functions.java | 7 +++- core/src/main/java/hudson/model/Hudson.java | 17 ++++++-- .../security/AuthorizationStrategy.java | 17 +++++++- .../java/hudson/security/SecurityRealm.java | 4 +- .../main/java/hudson/util/DescriptorList.java | 40 +++++++++++++++++++ .../hudson/model/Hudson/configure.jelly | 5 ++- 6 files changed, 82 insertions(+), 8 deletions(-) create mode 100644 core/src/main/java/hudson/util/DescriptorList.java diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index b6dc237b3d..5e118478c8 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -25,6 +25,7 @@ import hudson.tasks.BuildWrappers; import hudson.tasks.Builder; import hudson.tasks.Publisher; import hudson.security.SecurityRealm; +import hudson.security.AuthorizationStrategy; import org.apache.commons.jexl.parser.ASTSizeFunction; import org.apache.commons.jexl.util.Introspector; import org.kohsuke.stapler.Ancestor; @@ -444,10 +445,14 @@ public class Functions { return BuildWrappers.getFor(project); } - public static List> getSecurityRealms() { + public static List> getSecurityRealmDescriptors() { return SecurityRealm.LIST; } + public static List> getAuthorizationStrategyDescriptors() { + return AuthorizationStrategy.LIST; + } + public static List> getBuilderDescriptors(AbstractProject project) { return filterBuildStepDescriptors(BuildStep.BUILDERS,project); } diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index 4b9f877ecd..2b6fc302f3 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -10,6 +10,7 @@ import hudson.Launcher.LocalLauncher; import hudson.Plugin; import hudson.PluginManager; import hudson.PluginWrapper; +import hudson.StructuredForm; import hudson.TcpSlaveAgentListener; import hudson.Util; import static hudson.Util.fixEmpty; @@ -58,6 +59,7 @@ import hudson.util.HudsonIsLoading; import hudson.util.MultipartFormDataParser; import hudson.util.XStream2; import hudson.widgets.Widget; +import net.sf.json.JSONObject; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.ui.AbstractProcessingFilter; import org.apache.commons.fileupload.FileItem; @@ -1246,13 +1248,22 @@ public final class Hudson extends View implements ItemGroup, Node req.setCharacterEncoding("UTF-8"); + JSONObject json = StructuredForm.get(req); + // keep using 'useSecurity' field as the main configuration setting // until we get the new security implementation working // useSecurity = null; - if (req.getParameter("use_security") != null) { + if (json.has("use_security")) { useSecurity = true; - securityRealm = new LegacySecurityRealm(); - authorizationStrategy = new LegacyAuthorizationStrategy(); + if(newSecurity) { + JSONObject security = json.getJSONObject("use_security"); + securityRealm = SecurityRealm.LIST.newInstanceFromRadioList(security,"realm"); + authorizationStrategy = AuthorizationStrategy.LIST.newInstanceFromRadioList(security,"authorization"); + } else { + // compatibility mode + securityRealm = new LegacySecurityRealm(); + authorizationStrategy = new LegacyAuthorizationStrategy(); + } } else { useSecurity = null; securityRealm = SecurityRealm.NO_AUTHENTICATION; diff --git a/core/src/main/java/hudson/security/AuthorizationStrategy.java b/core/src/main/java/hudson/security/AuthorizationStrategy.java index d87ef9cdab..636ac7b222 100644 --- a/core/src/main/java/hudson/security/AuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/AuthorizationStrategy.java @@ -4,6 +4,7 @@ import hudson.ExtensionPoint; import hudson.model.Describable; import hudson.model.Descriptor; import hudson.model.Hudson; +import hudson.util.DescriptorList; import org.acegisecurity.Authentication; import java.io.Serializable; @@ -57,7 +58,7 @@ public abstract class AuthorizationStrategy implements Describable getDescriptor() { - return null; + return DESCRIPTOR; } @Override @@ -70,5 +71,19 @@ public abstract class AuthorizationStrategy implements Describable DESCRIPTOR = new Descriptor(Unsecured.class) { + public String getDisplayName() { + return "Anyone can do anything"; + } + }; + } + + /** + * All registered {@link SecurityRealm} implementations. + */ + public static final DescriptorList LIST = new DescriptorList( + Unsecured.DESCRIPTOR + ); } diff --git a/core/src/main/java/hudson/security/SecurityRealm.java b/core/src/main/java/hudson/security/SecurityRealm.java index 93029e407b..98f71b73ce 100644 --- a/core/src/main/java/hudson/security/SecurityRealm.java +++ b/core/src/main/java/hudson/security/SecurityRealm.java @@ -3,11 +3,11 @@ package hudson.security; import hudson.ExtensionPoint; import hudson.model.Describable; import hudson.model.Descriptor; +import hudson.util.DescriptorList; import org.acegisecurity.Authentication; import org.acegisecurity.AuthenticationManager; import org.springframework.context.ApplicationContext; -import java.util.List; import java.util.Map; /** @@ -86,7 +86,7 @@ public abstract class SecurityRealm implements Describable, Exten /** * All registered {@link SecurityRealm} implementations. */ - public static final List> LIST = Descriptor.toList( + public static final DescriptorList LIST = new DescriptorList( HudsonPrivateSecurityRealm.DescriptorImpl.INSTANCE, LDAPSecurityRealm.DESCRIPTOR ); diff --git a/core/src/main/java/hudson/util/DescriptorList.java b/core/src/main/java/hudson/util/DescriptorList.java new file mode 100644 index 0000000000..9f477c12ef --- /dev/null +++ b/core/src/main/java/hudson/util/DescriptorList.java @@ -0,0 +1,40 @@ +package hudson.util; + +import hudson.model.Describable; +import hudson.model.Descriptor; +import hudson.model.Descriptor.FormException; +import net.sf.json.JSONObject; +import org.kohsuke.stapler.Stapler; + +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * List of {@link Descriptor}s. + * + *

+ * This class is really just a list but also defines + * some Hudson specific methods that operate on + * {@link Descriptor} list. + * + * @author Kohsuke Kawaguchi + * @since 1.161 + */ +public final class DescriptorList> extends CopyOnWriteArrayList> { + public DescriptorList(Descriptor... descriptors) { + super(descriptors); + } + + /** + * Creates a new instance of a {@link Describable} + * from the structured form submission data posted + * by a radio button group. + */ + public T newInstanceFromRadioList(JSONObject config) throws FormException { + int idx = config.getInt("value"); + return get(idx).newInstance(Stapler.getCurrentRequest(),config); + } + + public T newInstanceFromRadioList(JSONObject parent, String name) throws FormException { + return newInstanceFromRadioList(parent.getJSONObject(name)); + } +} diff --git a/core/src/main/resources/hudson/model/Hudson/configure.jelly b/core/src/main/resources/hudson/model/Hudson/configure.jelly index 7b5b91a04b..3fd79fae09 100644 --- a/core/src/main/resources/hudson/model/Hudson/configure.jelly +++ b/core/src/main/resources/hudson/model/Hudson/configure.jelly @@ -27,7 +27,10 @@ + descriptors="${h.securityRealmDescriptors}"/> +
-- GitLab