[rfc][icedtea-web] Temporary Permissions generated via reflection (re-proposal)

Deepak Bhole dbhole at redhat.com
Fri Jun 13 20:26:57 UTC 2014


* Andrew Azores <aazores at redhat.com> [2014-06-13 11:19]:
> On 06/13/2014 11:09 AM, Andrew Azores wrote:
> >Hi,
> >
> >When Temporary Permissions on the security dialogs were first introduced,
> >I proposed to have them generated from the PolicyEditorPermissions
> >dynamically using reflection, so that "grantable" permissions were only
> >defined in one place and so maintenance would be easy, and the
> >TemporaryPermissions class could be kept small. This was rejected due to
> >the required use of reflection, but I am re-proposing this patch because I
> >do believe it is a much cleaner solution, especially now that the number
> >of grantable permissions has grown and the temporary permissions menu has
> >become a multi-select UI rather than preset groups.
> >
> >ChangeLog:
> >    TemporaryPermissions generated via reflection rather than hard coded
> >    * netx/net/sourceforge/jnlp/resources/Messages.properties
> >    (STempPermNoFile, STempPermNoNetwork, STempPermNoExec,
> >    STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec,
> >    STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly,
> >    STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess,
> >    STempReadLocalFilesAndProperties, STempReflectionOnly): removed
> >    (STempNetwork, STempReadFilesAndProperties,
> >STempWriteFilesAndProperties,
> >    STempReflectionAndExternal, STempAllMedia): new messages
> >    * netx/net/sourceforge/jnlp/resources/Messages_cs.properties
> >    (STempPermNoFile, STempPermNoNetwork, STempPermNoExec,
> >    STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec,
> >    STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly,
> >    STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess,
> >    STempReadLocalFilesAndProperties, STempReflectionOnly): removed
> >    *
> >netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java:
> >    rewrite to use reflection to generate permissions from
> >    PolicyEditorPermissions rather than exposing statically defined values
> >    *
> >netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java:
> >    refactor to use new TemporaryPermissions change
> >    * tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java:
> >    new tests for TemporaryPermissions
> >
> >
> >Thanks,
> >
> 
> Lightning-quick update thanks to Jie Kang's keen eye: now using multi-catch
> in TemporaryPermissions.getPermission. Semantically the same and no other
> changes.
> 

Hi Andrew,

I agree, reflection is preferable over an ever growing list of static
permission objects.

Right now the code seems to be boxed such that the reflected object
creation is always done dynamically (via the new getPermission method).
Is there is a chance that this could later be utilized with user input?

In its current static state it is fine, but my concern is that there is
no arg sanitization when we try to create permission objects with the
given string args in getPermission. In addition to potential bugs, there
could also be security implications caused by incorrect permission
creation/granting.

Rest looks fine to me.

Cheers,
Deepak

> Thanks,
> 
> -- 
> Andrew A
> 

> diff --git a/ChangeLog b/ChangeLog
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,28 @@
> +2014-06-13  Andrew Azores  <aazores at redhat.com>
> +
> +	TemporaryPermissions generated via reflection rather than hard coded
> +	* netx/net/sourceforge/jnlp/resources/Messages.properties
> +	(STempPermNoFile, STempPermNoNetwork, STempPermNoExec,
> +	STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec,
> +	STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly,
> +	STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess,
> +	STempReadLocalFilesAndProperties, STempReflectionOnly): removed
> +	(STempNetwork, STempReadFilesAndProperties, STempWriteFilesAndProperties,
> +	STempReflectionAndExternal, STempAllMedia): new messages
> +	* netx/net/sourceforge/jnlp/resources/Messages_cs.properties
> +	(STempPermNoFile, STempPermNoNetwork, STempPermNoExec,
> +	STempNoFileOrNetwork, STempNoExecOrNetwork, STempNoFileOrExec,
> +	STempNoFileOrNetworkOrExec, STempAllMedia, STempSoundOnly,
> +	STempClipboardOnly, STempPrintOnly, STempAllFileAndPropertyAccess,
> +	STempReadLocalFilesAndProperties, STempReflectionOnly): removed
> +	* netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java:
> +	rewrite to use reflection to generate permissions from
> +	PolicyEditorPermissions rather than exposing statically defined values
> +	* netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java:
> +	refactor to use new TemporaryPermissions change
> +	* tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java:
> +	new tests for TemporaryPermissions
> +
>  2014-06-12  Andrew Azores  <aazores at redhat.com>
>  
>  	* netx/net/sourceforge/jnlp/security/policyeditor/PolicyEditor.java
> diff --git a/netx/net/sourceforge/jnlp/resources/Messages.properties b/netx/net/sourceforge/jnlp/resources/Messages.properties
> --- a/netx/net/sourceforge/jnlp/resources/Messages.properties
> +++ b/netx/net/sourceforge/jnlp/resources/Messages.properties
> @@ -305,20 +305,11 @@ STrustedOnlyAttributeFailure=This applic
>  STOAsignedMsgFully = The applet is fully signed
>  STOAsignedMsgAndSandbox = The applet is fully signed and sandboxed
>  STOAsignedMsgPartiall = The applet is not fully signed
> -STempPermNoFile=No file access
> -STempPermNoNetwork=No network access
> -STempPermNoExec=No command execution
> -STempNoFileOrNetwork=No file or network access
> -STempNoExecOrNetwork=No command execution or network access
> -STempNoFileOrExec=No file access or command execution
> -STempNoFileOrNetworkOrExec=No file access, network access, or command execution
> -STempAllMedia=All media
> -STempSoundOnly=Play audio
> -STempClipboardOnly=Access clipboard
> -STempPrintOnly=Print documents
> -STempAllFileAndPropertyAccess=All file and properties access
> -STempReadLocalFilesAndProperties=Read-only local files and properties
> -STempReflectionOnly=Java Reflection only
> +STempNetwork=Allow incoming and outgoing network connections
> +STempReadFilesAndProperties=Read-only access to all files and properties
> +STempWriteFilesAndProperties=Write-only access to all files and properties
> +STempReflectionAndExternal=Java Reflection and external code access
> +STempAllMedia=All media (printing, audio, clipboard access)
>  
>  # Security - used for the More Information dialog
>  SBadKeyUsage=Resources contain entries whose signer certificate's KeyUsage extension doesn't allow code signing.
> diff --git a/netx/net/sourceforge/jnlp/resources/Messages_cs.properties b/netx/net/sourceforge/jnlp/resources/Messages_cs.properties
> --- a/netx/net/sourceforge/jnlp/resources/Messages_cs.properties
> +++ b/netx/net/sourceforge/jnlp/resources/Messages_cs.properties
> @@ -301,20 +301,6 @@ STrustedOnlyAttributeFailure=Element \u2
>  STOAsignedMsgFully= Aplet je kompletn\u011b podeps\u00e1n.
>  STOAsignedMsgAndSandbox= Aplet je kompletn\u011b podeps\u00e1n a b\u011b\u017e\u00ed v izolovan\u00e9m prostoru (sandbox).
>  STOAsignedMsgPartiall= Aplet nen\u00ed kompletn\u011b podeps\u00e1n.
> -STempPermNoFile=Bez p\u0159\u00edstupu k soubor\u016fm
> -STempPermNoNetwork=Bez p\u0159\u00edstupu k s\u00edti
> -STempPermNoExec=Bez mo\u017enosti spou\u0161t\u011bt p\u0159\u00edkazy
> -STempNoFileOrNetwork=Bez p\u0159\u00edstupu k soubor\u016fm a s\u00edti
> -STempNoExecOrNetwork=Bez mo\u017enosti spou\u0161t\u011bt p\u0159\u00edkazy a bez p\u0159\u00edstupu k s\u00edti
> -STempNoFileOrExec=Bez p\u0159\u00edstupu k soubor\u016fm a bez mo\u017enosti spou\u0161t\u011bt p\u0159\u00edkazy
> -STempNoFileOrNetworkOrExec=Bez p\u0159\u00edstupu k soubor\u016fm a s\u00edti a bez mo\u017enosti spou\u0161t\u011bt p\u0159\u00edkazy
> -STempAllMedia=V\u0161echna m\u00e9dia
> -STempSoundOnly=P\u0159ehr\u00e1v\u00e1n\u00ed audia
> -STempClipboardOnly=P\u0159\u00edstup do schr\u00e1nky
> -STempPrintOnly=Tisknut\u00ed dokument\u016f
> -STempAllFileAndPropertyAccess=P\u0159\u00edstup ke v\u0161em soubor\u016fm a vlastnostem.
> -STempReadLocalFilesAndProperties=P\u0159\u00edstup k lok\u00e1ln\u00edm soubor\u016fm a vlastnostem v re\u017eimu pro \u010dten\u00ed
> -STempReflectionOnly=Pouze rozhran\u00ed Java Reflection
>  
>  # Security - used for the More Information dialog
>  SBadKeyUsage=Zdroj obsahuje polo\u017eky, u nich\u017e roz\u0161\u00ed\u0159en\u00ed pou\u017eit\u00ed kl\u00ed\u010de KeyUsage certifik\u00e1tu podepisovatele nedovoluje podeps\u00e1n\u00ed k\u00f3du.
> diff --git a/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java b/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java
> --- a/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java
> +++ b/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissions.java
> @@ -36,173 +36,83 @@ exception statement from your version.
>  
>  package net.sourceforge.jnlp.security.dialogs;
>  
> -import java.awt.AWTPermission;
> -import java.io.FilePermission;
> -import java.lang.reflect.ReflectPermission;
> -import java.net.SocketPermission;
> +import java.lang.reflect.Constructor;
> +import java.lang.reflect.InvocationTargetException;
>  import java.security.Permission;
>  import java.util.Arrays;
>  import java.util.Collection;
>  import java.util.Collections;
>  import java.util.HashSet;
> -import java.util.PropertyPermission;
> +import java.util.regex.Matcher;
> +import java.util.regex.Pattern;
>  
> -import javax.sound.sampled.AudioPermission;
> -
> -import static net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions.*;
> +import net.sourceforge.jnlp.security.policyeditor.PermissionActions;
> +import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions;
> +import net.sourceforge.jnlp.util.logging.OutputController;
>  
>  public class TemporaryPermissions {
>  
> -    // We can't use the PolicyEditorPermissions versions of these, because they rely on System Property expansion, which is perfomed
> -    // by the policy parser, but not by the Permissions constructors.
> -    private static final String USER_HOME = System.getProperty("user.home");
> -    private static final String TMPDIR = System.getProperty("java.io.tmpdir");
> +    // Look for expandable properties in targets, eg ${user.home} or ${java.io.tmpdir}
> +    private static final Pattern expandablePattern = Pattern.compile("\\$\\{([a-zA-Z0-9\\.}]+)*\\}");
>  
> -    public static final FilePermission READ_LOCAL_FILES_PERMISSION = new FilePermission(USER_HOME, READ_LOCAL_FILES.getActions().rawString());
> -    public static final FilePermission WRITE_LOCAL_FILES_PERMISSION = new FilePermission(USER_HOME, WRITE_LOCAL_FILES.getActions().rawString());
> -    public static final FilePermission DELETE_LOCAL_FILES_PERMISSION = new FilePermission(USER_HOME, DELETE_LOCAL_FILES.getActions().rawString());
> -    public static final FilePermission READ_TMP_FILES_PERMISSION = new FilePermission(TMPDIR, READ_TMP_FILES.getActions().rawString());
> -    public static final FilePermission WRITE_TMP_FILES_PERMISSION = new FilePermission(TMPDIR, WRITE_TMP_FILES.getActions().rawString());
> -    public static final FilePermission DELETE_TMP_FILES_PERMISSION = new FilePermission(TMPDIR, DELETE_TMP_FILES.getActions().rawString());
> -    public static final FilePermission READ_SYSTEM_FILES_PERMISSION = new FilePermission(READ_SYSTEM_FILES.getTarget().target, READ_SYSTEM_FILES.getActions()
> -            .rawString());
> -    public static final FilePermission WRITE_SYSTEM_FILES_PERMISSION = new FilePermission(WRITE_SYSTEM_FILES.getTarget().target, WRITE_SYSTEM_FILES
> -            .getActions().rawString());
> -
> -    public static final PropertyPermission READ_PROPERTIES_PERMISSION = new PropertyPermission(READ_PROPERTIES.getTarget().target, READ_PROPERTIES.getActions()
> -            .rawString());
> -    public static final PropertyPermission WRITE_PROPERTIES_PERMISSION = new PropertyPermission(WRITE_PROPERTIES.getTarget().target, WRITE_PROPERTIES
> -            .getActions().rawString());
> -
> -    public static final FilePermission EXEC_PERMISSION = new FilePermission(EXEC_COMMANDS.getTarget().target, EXEC_COMMANDS.getActions().rawString());
> -    public static final RuntimePermission GETENV_PERMISSION = new RuntimePermission(GET_ENV.getTarget().target);
> -
> -    public static final SocketPermission NETWORK_PERMISSION = new SocketPermission(NETWORK.getTarget().target, NETWORK.getActions().rawString());
> -
> -    public static final ReflectPermission REFLECTION_PERMISSION = new ReflectPermission(JAVA_REFLECTION.getTarget().target);
> -    public static final RuntimePermission CLASSLOADER_PERMISSION = new RuntimePermission(GET_CLASSLOADER.getTarget().target);
> -    public static final RuntimePermission ACCESS_CLASS_IN_PACKAGE_PERMISSION = new RuntimePermission(ACCESS_CLASS_IN_PACKAGE.getTarget().target);
> -    public static final RuntimePermission ACCESS_DECLARED_MEMBERS_PERMISSION = new RuntimePermission(ACCESS_DECLARED_MEMBERS.getTarget().target);
> -    public static final RuntimePermission ACCESS_THREADS_PERMISSION = new RuntimePermission(ACCESS_THREADS.getTarget().target);
> -    public static final RuntimePermission ACCESS_THREADGROUPS_PERMISSION = new RuntimePermission(ACCESS_THREAD_GROUPS.getTarget().target);
> -
> -    public static final AWTPermission AWT_PERMISSION = new AWTPermission(ALL_AWT.getTarget().target);
> -    public static final AudioPermission PLAY_AUDIO_PERMISSION = new AudioPermission(PLAY_AUDIO.getTarget().target);
> -    public static final AudioPermission RECORD_AUDIO_PERMISSION = new AudioPermission(RECORD_AUDIO.getTarget().target);
> -    public static final AWTPermission CLIPBOARD_PERMISSION = new AWTPermission(CLIPBOARD.getTarget().target);
> -    public static final RuntimePermission PRINT_PERMISSION = new RuntimePermission(PRINT.getTarget().target);
> -
> -    public static final Collection<Permission> ALL_PERMISSIONS, FILE_PERMISSIONS, PROPERTY_PERMISSIONS, NETWORK_PERMISSIONS, EXEC_PERMISSIONS,
> -            REFLECTION_PERMISSIONS, MEDIA_PERMISSIONS;
> -    static {
> -        final Collection<Permission> all = new HashSet<>(), file = new HashSet<>(), property = new HashSet<>(),
> -              network = new HashSet<>(), exec = new HashSet<>(), reflection = new HashSet<>(), media = new HashSet<>();
> -
> -        file.add(READ_LOCAL_FILES_PERMISSION);
> -        file.add(WRITE_LOCAL_FILES_PERMISSION);
> -        file.add(DELETE_LOCAL_FILES_PERMISSION);
> -        file.add(READ_TMP_FILES_PERMISSION);
> -        file.add(WRITE_TMP_FILES_PERMISSION);
> -        file.add(DELETE_TMP_FILES_PERMISSION);
> -        file.add(READ_SYSTEM_FILES_PERMISSION);
> -        file.add(WRITE_SYSTEM_FILES_PERMISSION);
> -        FILE_PERMISSIONS = Collections.unmodifiableCollection(file);
> -
> -        property.add(READ_PROPERTIES_PERMISSION);
> -        property.add(WRITE_PROPERTIES_PERMISSION);
> -        PROPERTY_PERMISSIONS = Collections.unmodifiableCollection(property);
> -
> -        exec.add(EXEC_PERMISSION);
> -        exec.add(GETENV_PERMISSION);
> -        EXEC_PERMISSIONS = Collections.unmodifiableCollection(exec);
> -
> -        network.add(NETWORK_PERMISSION);
> -        NETWORK_PERMISSIONS = Collections.unmodifiableCollection(network);
> -
> -        reflection.add(REFLECTION_PERMISSION);
> -        reflection.add(CLASSLOADER_PERMISSION);
> -        reflection.add(ACCESS_CLASS_IN_PACKAGE_PERMISSION);
> -        reflection.add(ACCESS_DECLARED_MEMBERS_PERMISSION);
> -        reflection.add(ACCESS_THREADS_PERMISSION);
> -        reflection.add(ACCESS_THREADGROUPS_PERMISSION);
> -        REFLECTION_PERMISSIONS = Collections.unmodifiableCollection(reflection);
> -
> -        media.add(AWT_PERMISSION);
> -        media.add(PLAY_AUDIO_PERMISSION);
> -        media.add(RECORD_AUDIO_PERMISSION);
> -        media.add(CLIPBOARD_PERMISSION);
> -        media.add(PRINT_PERMISSION);
> -        MEDIA_PERMISSIONS = Collections.unmodifiableCollection(media);
> -
> -        all.addAll(file);
> -        all.addAll(property);
> -        all.addAll(exec);
> -        all.addAll(network);
> -        all.addAll(reflection);
> -        all.addAll(media);
> -        ALL_PERMISSIONS = Collections.unmodifiableCollection(all);
> +    public static Collection<Permission> getPermissions(final PolicyEditorPermissions... editorPermissions) {
> +        return getPermissions(Arrays.asList(editorPermissions));
>      }
>  
> -    private static final Collection<Permission> allMinus(final Collection<Permission> permissions) {
> -        return subtract(ALL_PERMISSIONS, permissions);
> +    public static Collection<Permission> getPermissions(final Collection<PolicyEditorPermissions> editorPermissions) {
> +        final Collection<Permission> col = new HashSet<Permission>();
> +        for (final PolicyEditorPermissions editorPerm : editorPermissions) {
> +            col.add(getPermission(editorPerm));
> +        }
> +        return Collections.unmodifiableCollection(col);
>      }
>  
> -    private static Collection<Permission> sum(final Permission... permissions) {
> -        final Collection<Permission> result = new HashSet<>(Arrays.asList(permissions));
> -        return Collections.unmodifiableCollection(result);
> +    public static Collection<Permission> getPermissions(final PolicyEditorPermissions.Group permissionsGroup) {
> +        return getPermissions(permissionsGroup.getPermissions());
>      }
>  
> -    private static Collection<Permission> sum(final Collection<Permission> a, final Collection<Permission> b) {
> -        final Collection<Permission> result = new HashSet<>();
> -        result.addAll(a);
> -        result.addAll(b);
> -        return Collections.unmodifiableCollection(result);
> +    public static Permission getPermission(final PolicyEditorPermissions editorPermission) {
> +        try {
> +            final Class<?> clazz = Class.forName(editorPermission.getType().type);
> +            final Constructor<?> ctor;
> +            final Permission perm;
> +            String target = editorPermission.getTarget().target;
> +
> +            Matcher m = expandablePattern.matcher(target);
> +            while (m.find()) {
> +                // Expand any matches by reading from System properties, eg ${java.io.tmpdir} is /tmp on most systems
> +                target = m.replaceFirst(System.getProperty(m.group(1)));
> +                m = expandablePattern.matcher(target);
> +            }
> +
> +            if (editorPermission.getActions().equals(PermissionActions.NONE)) {
> +                ctor = clazz.getDeclaredConstructor(new Class[] { String.class });
> +                ctor.setAccessible(true);
> +                perm = (Permission) ctor.newInstance(target);
> +            } else {
> +                ctor = clazz.getDeclaredConstructor(new Class[] { String.class, String.class });
> +                ctor.setAccessible(true);
> +                perm = (Permission) ctor.newInstance(target, collectionToString(editorPermission.getActions().getActions()));
> +            }
> +            return perm;
> +        } catch (final ClassNotFoundException | SecurityException | NoSuchMethodException
> +                | IllegalArgumentException | InstantiationException | IllegalAccessException | InvocationTargetException e) {
> +            OutputController.getLogger().log(e);
> +            return null;
> +        }
>      }
>  
> -    private static final Collection<Permission> subtract(final Collection<Permission> from, final Collection<Permission> remove) {
> -        final Collection<Permission> result = new HashSet<>(from);
> -        result.removeAll(remove);
> -        return Collections.unmodifiableCollection(result);
> +    private static String collectionToString(final Collection<String> col) {
> +        final StringBuilder sb = new StringBuilder();
> +        int count = 0;
> +        for (final String str : col) {
> +            sb.append(str);
> +            if (count < col.size() - 1) {
> +                sb.append(",");
> +            }
> +            ++count;
> +        }
> +        return sb.toString();
>      }
>  
> -    public static Collection<Permission> noFileAccess() {
> -        return allMinus(FILE_PERMISSIONS);
> -    }
> -
> -    public static Collection<Permission> noNetworkAccess() {
> -        return allMinus(Arrays.asList(new Permission[] { NETWORK_PERMISSION }));
> -    }
> -
> -    public static Collection<Permission> noFileOrNetworkAccess() {
> -        return subtract(allMinus(FILE_PERMISSIONS), NETWORK_PERMISSIONS);
> -    }
> -
> -    public static Collection<Permission> allFileAccessAndProperties() {
> -        return sum(FILE_PERMISSIONS, PROPERTY_PERMISSIONS);
> -    }
> -
> -    public static Collection<Permission> readLocalFilesAndProperties() {
> -        return sum(READ_LOCAL_FILES_PERMISSION, READ_PROPERTIES_PERMISSION);
> -    }
> -
> -    public static Collection<Permission> reflectionOnly() {
> -        return REFLECTION_PERMISSIONS;
> -    }
> -
> -    public static Collection<Permission> allMedia() {
> -        return MEDIA_PERMISSIONS;
> -    }
> -
> -    public static Collection<Permission> audioOnly() {
> -        return sum(PLAY_AUDIO_PERMISSION, RECORD_AUDIO_PERMISSION);
> -    }
> -
> -    public static Collection<Permission> clipboardOnly() {
> -        return sum(CLIPBOARD_PERMISSION);
> -    }
> -
> -    public static Collection<Permission> printOnly() {
> -        return sum(PRINT_PERMISSION);
> -    }
> -
> -}
> +}
> \ No newline at end of file
> diff --git a/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java b/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java
> --- a/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java
> +++ b/netx/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsButton.java
> @@ -63,6 +63,7 @@ import net.sourceforge.jnlp.runtime.JNLP
>  import net.sourceforge.jnlp.runtime.JNLPRuntime;
>  import net.sourceforge.jnlp.security.policyeditor.PolicyEditor;
>  import net.sourceforge.jnlp.security.policyeditor.PolicyEditor.PolicyEditorWindow;
> +import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions;
>  
>  public class TemporaryPermissionsButton extends JButton {
>  
> @@ -101,51 +102,26 @@ public class TemporaryPermissionsButton 
>  
>          policyMenu.addSeparator();
>  
> +        final JCheckBoxMenuItem networkAccess = new JCheckBoxMenuItem(R("STempNetwork"));
> +        networkAccess.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.NETWORK)));
> +        policyMenu.add(networkAccess);
>  
> -        final JCheckBoxMenuItem noFileAccess = new JCheckBoxMenuItem(R("STempPermNoFile"));
> -        noFileAccess.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.noFileAccess()));
> -        policyMenu.add(noFileAccess);
> -
> -        final JCheckBoxMenuItem noNetworkAccess = new JCheckBoxMenuItem(R("STempPermNoNetwork"));
> -        noNetworkAccess.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.noNetworkAccess()));
> -        policyMenu.add(noNetworkAccess);
> -
> -        final JCheckBoxMenuItem noFileOrNetwork = new JCheckBoxMenuItem(R("STempNoFileOrNetwork"));
> -        noFileOrNetwork.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.noFileOrNetworkAccess()));
> -        policyMenu.add(noFileOrNetwork);
> -
> -        policyMenu.addSeparator();
> -
> -        final JCheckBoxMenuItem allFileAccessOnly = new JCheckBoxMenuItem(R("STempAllFileAndPropertyAccess"));
> -        allFileAccessOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.allFileAccessAndProperties()));
> -        policyMenu.add(allFileAccessOnly);
> -
> -        final JCheckBoxMenuItem readLocalFilesAndProperties = new JCheckBoxMenuItem(R("STempReadLocalFilesAndProperties"));
> -        readLocalFilesAndProperties.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.readLocalFilesAndProperties()));
> +        final JCheckBoxMenuItem readLocalFilesAndProperties = new JCheckBoxMenuItem(R("STempReadFilesAndProperties"));
> +        readLocalFilesAndProperties.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.ReadFileSystem)));
>          policyMenu.add(readLocalFilesAndProperties);
>  
> -        final JCheckBoxMenuItem reflectionOnly = new JCheckBoxMenuItem(R("STempReflectionOnly"));
> -        reflectionOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.reflectionOnly()));
> +        final JCheckBoxMenuItem writeLocalFilesAndProperties = new JCheckBoxMenuItem(R("STempWriteFilesAndProperties"));
> +        writeLocalFilesAndProperties.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.WriteFileSystem)));
> +        policyMenu.add(writeLocalFilesAndProperties);
> +
> +        final JCheckBoxMenuItem reflectionOnly = new JCheckBoxMenuItem(R("STempReflectionAndExternal"));
> +        reflectionOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.AccessUnownedCode)));
>          policyMenu.add(reflectionOnly);
>  
> -        policyMenu.addSeparator();
> -
>          final JCheckBoxMenuItem allMedia = new JCheckBoxMenuItem(R("STempAllMedia"));
> -        allMedia.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.allMedia()));
> +        allMedia.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.MediaAccess)));
>          policyMenu.add(allMedia);
>  
> -        final JCheckBoxMenuItem soundOnly = new JCheckBoxMenuItem(R("STempSoundOnly"));
> -        soundOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.audioOnly()));
> -        policyMenu.add(soundOnly);
> -
> -        final JCheckBoxMenuItem clipboardOnly = new JCheckBoxMenuItem(R("STempClipboardOnly"));
> -        clipboardOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.clipboardOnly()));
> -        policyMenu.add(clipboardOnly);
> -
> -        final JCheckBoxMenuItem printOnly = new JCheckBoxMenuItem(R("STempPrintOnly"));
> -        printOnly.addActionListener(new TemporaryPermissionsListener(TemporaryPermissions.printOnly()));
> -        policyMenu.add(printOnly);
> -
>          return policyMenu;
>      }
>  

> diff --git a/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java b/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java
> new file mode 100644
> --- /dev/null
> +++ b/tests/netx/unit/net/sourceforge/jnlp/security/dialogs/TemporaryPermissionsTest.java
> @@ -0,0 +1,104 @@
> +/*Copyright (C) 2014 Red Hat, Inc.
> +
> +This file is part of IcedTea.
> +
> +IcedTea is free software; you can redistribute it and/or
> +modify it under the terms of the GNU General Public License as published by
> +the Free Software Foundation, version 2.
> +
> +IcedTea is distributed in the hope that it will be useful,
> +but WITHOUT ANY WARRANTY; without even the implied warranty of
> +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +General Public License for more details.
> +
> +You should have received a copy of the GNU General Public License
> +along with IcedTea; see the file COPYING.  If not, write to
> +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> +02110-1301 USA.
> +
> +Linking this library statically or dynamically with other modules is
> +making a combined work based on this library.  Thus, the terms and
> +conditions of the GNU General Public License cover the whole
> +combination.
> +
> +As a special exception, the copyright holders of this library give you
> +permission to link this library with independent modules to produce an
> +executable, regardless of the license terms of these independent
> +modules, and to copy and distribute the resulting executable under
> +terms of your choice, provided that you also meet, for each linked
> +independent module, the terms and conditions of the license of that
> +module.  An independent module is a module which is not derived from
> +or based on this library.  If you modify this library, you may extend
> +this exception to your version of the library, but you are not
> +obligated to do so.  If you do not wish to do so, delete this
> +exception statement from your version.
> + */
> +
> +package net.sourceforge.jnlp.security.dialogs;
> +
> +import static org.junit.Assert.assertEquals;
> +
> +import java.awt.AWTPermission;
> +import java.io.FilePermission;
> +import java.security.Permission;
> +import java.util.Arrays;
> +import java.util.Collection;
> +import java.util.HashSet;
> +import java.util.Set;
> +
> +import javax.sound.sampled.AudioPermission;
> +
> +import net.sourceforge.jnlp.security.policyeditor.PolicyEditorPermissions;
> +
> +import org.junit.Test;
> +
> +public class TemporaryPermissionsTest {
> +
> +    @Test
> +    public void testGetPermission() throws Exception {
> +        final Permission expected = new FilePermission(System.getProperty("java.io.tmpdir"), "read");
> +        final Permission generated = TemporaryPermissions.getPermission(PolicyEditorPermissions.READ_TMP_FILES);
> +        assertEquals(expected, generated);
> +    }
> +
> +    @Test
> +    public void testGetPermissionsVarargs() throws Exception {
> +        final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read");
> +        final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write");
> +        final Set<Permission> expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission));
> +        final Set<Permission> generated = new HashSet<>(TemporaryPermissions.getPermissions(PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES));
> +        assertEquals(expected, generated);
> +    }
> +
> +    @Test
> +    public void testGetPermissionsVarargsArray() throws Exception {
> +        final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read");
> +        final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write");
> +        final Set<Permission> expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission));
> +        final PolicyEditorPermissions[] arr = new PolicyEditorPermissions[] { PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES };
> +        final Set<Permission> generated = new HashSet<>(TemporaryPermissions.getPermissions(arr));
> +        assertEquals(expected, generated);
> +    }
> +
> +    @Test
> +    public void testGetPermissionsCollection() throws Exception {
> +        final Permission readTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "read");
> +        final Permission writeTmpPermission = new FilePermission(System.getProperty("java.io.tmpdir"), "write");
> +        final Set<Permission> expected = new HashSet<>(Arrays.asList(readTmpPermission, writeTmpPermission));
> +        final Collection<PolicyEditorPermissions> coll = Arrays.asList(PolicyEditorPermissions.READ_TMP_FILES, PolicyEditorPermissions.WRITE_TMP_FILES);
> +        final Set<Permission> generated = new HashSet<>(TemporaryPermissions.getPermissions(coll));
> +        assertEquals(expected, generated);
> +    }
> +
> +    @Test
> +    public void testGetPermissionsGroup() throws Exception {
> +        final Permission playAudio = new AudioPermission("play");
> +        final Permission recordAudio = new AudioPermission("record");
> +        final Permission print = new RuntimePermission("queuePrintJob");
> +        final Permission clipboard = new AWTPermission("accessClipboard");
> +        final Set<Permission> expected = new HashSet<>(Arrays.asList(playAudio, recordAudio, print, clipboard));
> +        final Set<Permission> generated = new HashSet<>(TemporaryPermissions.getPermissions(PolicyEditorPermissions.Group.MediaAccess));
> +        assertEquals(expected, generated);
> +    }
> +
> +}
> \ No newline at end of file



More information about the distro-pkg-dev mailing list