diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 7f132023b7f2506b2d2c5e0a9b8517f1ce8a5ea0..148526ca1d486ffc928f8c4a70985b1ea6495035 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -977,14 +977,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } public ACL getACL() { - final ACL base = Jenkins.getInstance().getAuthorizationStrategy().getACL(this); + ACL base = Jenkins.getInstance().getAuthorizationStrategy().getACL(this); // always allow a non-anonymous user full control of himself. - return new ACL() { - public boolean hasPermission(Authentication a, Permission permission) { - return (idStrategy().equals(a.getName(), id) && !(a instanceof AnonymousAuthenticationToken)) - || base.hasPermission(a, permission); - } - }; + return ACL.lambda((a, permission) -> (idStrategy().equals(a.getName(), id) && !(a instanceof AnonymousAuthenticationToken)) + || base.hasPermission(a, permission)); } /** diff --git a/core/src/main/java/hudson/security/ACL.java b/core/src/main/java/hudson/security/ACL.java index 41f8b5a9bc82430162647394e55b6d21b9ba2539..95b3f8fc46c72175dabadb39b52b652947a399c9 100644 --- a/core/src/main/java/hudson/security/ACL.java +++ b/core/src/main/java/hudson/security/ACL.java @@ -34,6 +34,7 @@ import hudson.model.Item; import hudson.remoting.Callable; import hudson.model.ItemGroup; import hudson.model.TopLevelItemDescriptor; +import java.util.function.BiFunction; import jenkins.security.NonSerializableSecurityContext; import jenkins.model.Jenkins; import jenkins.security.NotReallyRoleSensitiveCallable; @@ -95,6 +96,21 @@ public abstract class ACL { */ public abstract boolean hasPermission(@Nonnull Authentication a, @Nonnull Permission permission); + /** + * Creates a simple {@link ACL} implementation based on a “single-abstract-method” easily implemented via lambda syntax. + * @param impl the implementation of {@link ACL#hasPermission(Authentication, Permission)} + * @return an adapter to that lambda + * @since FIXME + */ + public static ACL lambda(final BiFunction impl) { + return new ACL() { + @Override + public boolean hasPermission(Authentication a, Permission permission) { + return impl.apply(a, permission); + } + }; + } + /** * Checks if the current security principal has the permission to create top level items within the specified * item group. diff --git a/core/src/main/java/hudson/security/AuthorizationStrategy.java b/core/src/main/java/hudson/security/AuthorizationStrategy.java index a875908f212d7ec472f589dad9a27f93090e9260..a273e984b201c96d3c33c86666bb04ac297354e1 100644 --- a/core/src/main/java/hudson/security/AuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/AuthorizationStrategy.java @@ -95,9 +95,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl { ACL base = item.getOwner().getACL(); boolean hasPermission = base.hasPermission(a, permission); @@ -106,8 +104,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl true); @Extension @Symbol("unsecured") public static final class DescriptorImpl extends Descriptor { diff --git a/core/src/test/java/hudson/model/TaskActionTest.java b/core/src/test/java/hudson/model/TaskActionTest.java index ec31498e0795b9f3f53d7b55e1436ba28892dd64..bfcf679cad252dc7064535afab115656c5dd7a94 100644 --- a/core/src/test/java/hudson/model/TaskActionTest.java +++ b/core/src/test/java/hudson/model/TaskActionTest.java @@ -45,11 +45,7 @@ public class TaskActionTest { } protected ACL getACL() { - return new ACL() { - public boolean hasPermission(Authentication a, Permission permission) { - return true; - } - }; + return ACL.lambda((a, p) -> true); } }