diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java
index b8e78113e6..948680a04e 100644
--- a/core/src/main/java/hudson/Functions.java
+++ b/core/src/main/java/hudson/Functions.java
@@ -1,28 +1,43 @@
package hudson;
import hudson.maven.ExecutedMojo;
-import hudson.model.*;
+import hudson.model.AbstractProject;
+import hudson.model.Action;
+import hudson.model.Descriptor;
+import hudson.model.Hudson;
+import hudson.model.Item;
+import hudson.model.ItemGroup;
+import hudson.model.Items;
+import hudson.model.Job;
+import hudson.model.JobPropertyDescriptor;
+import hudson.model.ModelObject;
+import hudson.model.Node;
+import hudson.model.Project;
+import hudson.model.Run;
+import hudson.model.TopLevelItem;
+import hudson.model.View;
import hudson.search.SearchableModelObject;
+import hudson.security.AccessControlled;
+import hudson.security.AuthorizationStrategy;
+import hudson.security.Permission;
+import hudson.security.SecurityRealm;
+import hudson.slaves.ComputerLauncher;
+import hudson.slaves.RetentionStrategy;
import hudson.tasks.BuildStep;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildWrapper;
import hudson.tasks.BuildWrappers;
import hudson.tasks.Builder;
import hudson.tasks.Publisher;
-import hudson.security.SecurityRealm;
-import hudson.security.AuthorizationStrategy;
-import hudson.security.Permission;
import hudson.util.Area;
-import hudson.slaves.ComputerLauncher;
-import hudson.slaves.RetentionStrategy;
+import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken;
+import org.apache.commons.jelly.JellyContext;
import org.apache.commons.jexl.parser.ASTSizeFunction;
import org.apache.commons.jexl.util.Introspector;
-import org.apache.commons.jelly.JellyContext;
import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.Stapler;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
-import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
@@ -425,7 +440,15 @@ public class Functions {
}
public static void checkPermission(Permission permission) throws IOException, ServletException {
- Hudson.getInstance().getACL().checkPermission(permission);
+ if (permission != null) {
+ Hudson.getInstance().getACL().checkPermission(permission);
+ }
+ }
+
+ public static void checkPermission(AccessControlled object, Permission permission) throws IOException, ServletException {
+ if (permission != null) {
+ object.checkPermission(permission);
+ }
}
/**
@@ -438,6 +461,10 @@ public class Functions {
return permission==null || Hudson.getInstance().getACL().hasPermission(permission);
}
+ public static boolean hasPermission(AccessControlled object, Permission permission) throws IOException, ServletException {
+ return permission==null || object.hasPermission(permission);
+ }
+
public static void adminCheck(StaplerRequest req, StaplerResponse rsp, Object required, Permission permission) throws IOException, ServletException {
// this is legacy --- all views should be eventually converted to
// the permission based model.
diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java
index 8a9af12144..930e9e7b15 100644
--- a/core/src/main/java/hudson/model/AbstractItem.java
+++ b/core/src/main/java/hudson/model/AbstractItem.java
@@ -3,6 +3,7 @@ package hudson.model;
import hudson.XmlFile;
import hudson.Util;
import hudson.Functions;
+import hudson.security.AccessControlled;
import hudson.security.Permission;
import hudson.security.ACL;
import org.kohsuke.stapler.export.Exported;
@@ -27,7 +28,7 @@ import javax.servlet.ServletException;
// Item doesn't necessarily have to be Actionable, but
// Java doesn't let multiple inheritance.
@ExportedBean
-public abstract class AbstractItem extends Actionable implements Item, HttpDeletable {
+public abstract class AbstractItem extends Actionable implements Item, HttpDeletable, AccessControlled {
/**
* Project name.
*/
@@ -164,8 +165,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet
* Returns the {@link ACL} for this object.
*/
public ACL getACL() {
- // TODO: this object should have its own ACL
- return Hudson.getInstance().getACL();
+ return Hudson.getInstance().getAuthorizationStrategy().getACL(this);
}
/**
diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java
index 1b2940fdaf..2c95f7b106 100644
--- a/core/src/main/java/hudson/model/AbstractProject.java
+++ b/core/src/main/java/hudson/model/AbstractProject.java
@@ -616,7 +616,7 @@ public abstract class AbstractProject
,R extends A
}
Launcher launcher = workspace != null ? workspace.createLauncher(listener) : null;
- LOGGER.info("Polling SCM changes of "+ getName());
+ LOGGER.fine("Polling SCM changes of "+ getName());
return scm.pollChanges(this, launcher, workspace, listener );
} catch (AbortException e) {
listener.fatalError(Messages.AbstractProject_Aborted());
diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java
index 7d0621bf9b..a187028f73 100644
--- a/core/src/main/java/hudson/model/Computer.java
+++ b/core/src/main/java/hudson/model/Computer.java
@@ -7,25 +7,32 @@ import hudson.slaves.RetentionStrategy;
import hudson.node_monitors.NodeMonitor;
import hudson.remoting.Channel;
import hudson.remoting.VirtualChannel;
+import hudson.security.ACL;
+import hudson.security.AccessControlled;
+import hudson.security.Permission;
+import hudson.security.PermissionGroup;
import hudson.tasks.BuildWrapper;
import hudson.tasks.Publisher;
import hudson.util.DaemonThreadFactory;
import hudson.util.RemotingDiagnostics;
import hudson.util.RunList;
-import org.kohsuke.stapler.StaplerRequest;
-import org.kohsuke.stapler.StaplerResponse;
-import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.LogRecord;
+
+import javax.servlet.ServletException;
+
+import org.jvnet.localizer.Localizable;
+import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
@@ -53,8 +60,9 @@ import org.kohsuke.stapler.export.ExportedBean;
* @author Kohsuke Kawaguchi
*/
@ExportedBean
-public abstract class Computer extends AbstractModelObject {
- private final CopyOnWriteArrayList executors = new CopyOnWriteArrayList();
+public abstract class Computer extends AbstractModelObject implements AccessControlled {
+
+ private final CopyOnWriteArrayList executors = new CopyOnWriteArrayList();
private int numExecutors;
@@ -74,6 +82,18 @@ public abstract class Computer extends AbstractModelObject {
setNode(node);
}
+ public ACL getACL() {
+ return Hudson.getInstance().getAuthorizationStrategy().getACL(this);
+ }
+
+ public void checkPermission(Permission permission) {
+ getACL().checkPermission(permission);
+ }
+
+ public boolean hasPermission(Permission permission) {
+ return getACL().hasPermission(permission);
+ }
+
/**
* Gets the channel that can be used to run a program on this computer.
*
@@ -385,7 +405,7 @@ public abstract class Computer extends AbstractModelObject {
}
public void doToggleOffline( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
- Hudson.getInstance().checkPermission(Hudson.ADMINISTER);
+ checkPermission(Hudson.ADMINISTER);
setTemporarilyOffline(!temporarilyOffline);
rsp.forwardToPreviousPage(req);
@@ -400,7 +420,7 @@ public abstract class Computer extends AbstractModelObject {
*/
public void doDumpExportTable( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
// this is a debug probe and may expose sensitive information
- Hudson.getInstance().checkPermission(Hudson.ADMINISTER);
+ checkPermission(Hudson.ADMINISTER);
rsp.setContentType("text/plain");
rsp.setCharacterEncoding("UTF-8");
@@ -412,7 +432,7 @@ public abstract class Computer extends AbstractModelObject {
public void doScript( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
// ability to run arbitrary script is dangerous,
// so tie it to the admin access
- Hudson.getInstance().checkPermission(Hudson.ADMINISTER);
+ checkPermission(Hudson.ADMINISTER);
String text = req.getParameter("script");
if(text!=null) {
diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java
index fd5d4d07d8..b9d6bd0a13 100644
--- a/core/src/main/java/hudson/model/Hudson.java
+++ b/core/src/main/java/hudson/model/Hudson.java
@@ -245,6 +245,8 @@ public final class Hudson extends View implements ItemGroup, Node,
*/
private List views; // can't initialize it eagerly for backward compatibility
+ private transient MyView myView = new MyView(this);
+
private transient final FingerprintMap fingerprintMap = new FingerprintMap();
/**
@@ -702,9 +704,11 @@ public final class Hudson extends View implements ItemGroup, Node,
return v;
}
}
- if(this.getViewName().equals(name))
+ if (this.getViewName().equals(name)) {
return this;
- else
+ } else if (myView.getViewName().equals(name)) {
+ return myView;
+ } else
return null;
}
@@ -715,12 +719,13 @@ public final class Hudson extends View implements ItemGroup, Node,
public synchronized View[] getViews() {
if(views==null)
views = new ArrayList();
- View[] r = new View[views.size()+1];
+ View[] r = new View[views.size()+2];
views.toArray(r);
- // sort Views and put "all" at the very beginning
- r[r.length-1] = r[0];
- Arrays.sort(r,1,r.length, View.SORTER);
- r[0] = this;
+ r[r.length-2] = r[0];
+ r[r.length-1] = r[1];
+ Arrays.sort(r,2,r.length, View.SORTER);
+ r[0] = myView;
+ r[1] = this;
return r;
}
diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java
index 28eb40b7a2..d0a323bc6e 100644
--- a/core/src/main/java/hudson/model/Label.java
+++ b/core/src/main/java/hudson/model/Label.java
@@ -61,7 +61,7 @@ public class Label implements Comparable