提交 4ab6fe7c 编写于 作者: I imod

add new EP GlobalSecurityConfigurationPart to enable contributions to the...

add new EP GlobalSecurityConfigurationPart to enable contributions to the global security configuration page
上级 293d3e51
......@@ -57,6 +57,7 @@ import hudson.views.MyViewsTabBar;
import hudson.views.ViewsTabBar;
import hudson.widgets.RenderOnDemandClosure;
import jenkins.model.GlobalConfiguration;
import jenkins.model.GlobalSecurityConfigurationPart;
import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithContextMenu;
import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken;
......@@ -74,7 +75,6 @@ import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.jelly.InternationalizedStringExpression.RawHtmlArgument;
import javax.management.modelmbean.DescriptorSupport;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
......@@ -771,30 +771,6 @@ public class Functions {
* we needed this for {@link GlobalConfiguration}s are for backward compatibility.
*/
public static Collection<Descriptor> getSortedDescriptorsForGlobalConfig() {
class Tag implements Comparable<Tag> {
double ordinal;
String hierarchy;
Descriptor d;
Tag(double ordinal, Descriptor d) {
this.ordinal = ordinal;
this.d = d;
this.hierarchy = buildSuperclassHierarchy(d.clazz, new StringBuilder()).toString();
}
private StringBuilder buildSuperclassHierarchy(Class c, StringBuilder buf) {
Class sc = c.getSuperclass();
if (sc!=null) buildSuperclassHierarchy(sc,buf).append(':');
return buf.append(c.getName());
}
public int compareTo(Tag that) {
int r = Double.compare(this.ordinal, that.ordinal);
if (r!=0) return -r; // descending for ordinal
return this.hierarchy.compareTo(that.hierarchy);
}
}
ExtensionList<Descriptor> exts = Jenkins.getInstance().getExtensionList(Descriptor.class);
List<Tag> r = new ArrayList<Tag>(exts.size());
......@@ -812,7 +788,47 @@ public class Functions {
return DescriptorVisibilityFilter.apply(Jenkins.getInstance(),answer);
}
public static Collection<Descriptor> getSortedDescriptorsForGlobalSecurityConfig() {
ExtensionList<GlobalSecurityConfigurationPart> exts = Jenkins.getInstance().getExtensionList(GlobalSecurityConfigurationPart.class);
List<Tag> r = new ArrayList<Tag>(exts.size());
for (ExtensionComponent<GlobalSecurityConfigurationPart> c : exts.getComponents()) {
Descriptor d = c.getInstance();
if (d.getGlobalConfigPage()==null) continue;
r.add(new Tag(c.ordinal(), d));
}
Collections.sort(r);
List<Descriptor> answer = new ArrayList<Descriptor>(r.size());
for (Tag d : r) answer.add(d.d);
return DescriptorVisibilityFilter.apply(Jenkins.getInstance(),answer);
}
private static class Tag implements Comparable<Tag> {
double ordinal;
String hierarchy;
Descriptor d;
Tag(double ordinal, Descriptor d) {
this.ordinal = ordinal;
this.d = d;
this.hierarchy = buildSuperclassHierarchy(d.clazz, new StringBuilder()).toString();
}
private StringBuilder buildSuperclassHierarchy(Class c, StringBuilder buf) {
Class sc = c.getSuperclass();
if (sc!=null) buildSuperclassHierarchy(sc,buf).append(':');
return buf.append(c.getName());
}
public int compareTo(Tag that) {
int r = Double.compare(this.ordinal, that.ordinal);
if (r!=0) return -r; // descending for ordinal
return this.hierarchy.compareTo(that.hierarchy);
}
}
/**
* Computes the path to the icon of the given action
* from the context path.
......
......@@ -25,7 +25,9 @@ package hudson.security;
import hudson.BulkChange;
import hudson.Extension;
import hudson.Functions;
import hudson.markup.MarkupFormatter;
import hudson.model.Descriptor;
import hudson.model.Descriptor.FormException;
import hudson.model.ManagementLink;
import hudson.util.FormApply;
......@@ -95,9 +97,23 @@ public class GlobalSecurityConfiguration extends ManagementLink {
} else {
j.disableSecurity();
}
// return true for backward compatibility reasons
return true;
// persist all the additional security configs
boolean result = true;
for(Descriptor<?> d : Functions.getSortedDescriptorsForGlobalSecurityConfig()){
result &= configureDescriptor(req,json,d);
}
return result;
}
private boolean configureDescriptor(StaplerRequest req, JSONObject json, Descriptor<?> d) throws FormException {
// collapse the structure to remain backward compatible with the JSON structure before 1.
String name = d.getJsonSafeClassName();
JSONObject js = json.has(name) ? json.getJSONObject(name) : new JSONObject(); // if it doesn't have the property, the method returns invalid null object.
json.putAll(js);
return d.configure(req, js);
}
@Override
public String getDisplayName() {
......
package jenkins.model;
import hudson.ExtensionList;
import hudson.ExtensionPoint;
import hudson.model.Describable;
import hudson.model.Descriptor;
/**
* Convenient base class for extensions that contributes to the global security configuration page but nothing else.
*
* <h2>Views</h2>
* <p>
* Subtypes of this class should define <tt>config.groovy</tt> that gets pulled into the global security configuration page.
*
*
* @author Dominik Bartholdi
* @since 1.494
*/
public abstract class GlobalSecurityConfigurationPart extends Descriptor<GlobalSecurityConfigurationPart> implements ExtensionPoint, Describable<GlobalSecurityConfigurationPart> {
protected GlobalSecurityConfigurationPart() {
super(self());
}
public final Descriptor<GlobalSecurityConfigurationPart> getDescriptor() {
return this;
}
/**
* Unless this object has additional web presence, display name is not used at all.
* So default to "".
*/
public String getDisplayName() {
return "";
}
@Override
public String getGlobalConfigPage() {
return getConfigPage();
}
/**
* Returns all the registered {@link GlobalSecurityConfigurationPart} descriptors.
*/
public static ExtensionList<GlobalSecurityConfigurationPart> all() {
return Jenkins.getInstance().<GlobalSecurityConfigurationPart,GlobalSecurityConfigurationPart>getDescriptorList(GlobalSecurityConfigurationPart.class);
// pointless type parameters help work around bugs in javac in earlier versions http://codepad.org/m1bbFRrH
}
}
......@@ -28,6 +28,13 @@
<j:set var="instance" value="${it}" />
<j:set var="descriptor" value="${instance.descriptor}" />
<st:include page="config.groovy" />
<!-- global security configuration from everyone -->
<j:forEach var="descriptor" items="${h.getSortedDescriptorsForGlobalSecurityConfig()}">
<j:set var="instance" value="${descriptor}" /><!-- this makes the <f:textbox field=.../> work -->
<f:rowSet name="${descriptor.jsonSafeClassName}">
<st:include page="${descriptor.globalConfigPage}" from="${descriptor}" />
</f:rowSet>
</j:forEach>
<f:block>
<div id="bottom-sticker">
<div class="bottom-sticker-inner">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册