001package org.intellimate.izou.security;
002
003import org.intellimate.izou.addon.AddOnModel;
004import org.intellimate.izou.main.Main;
005import org.intellimate.izou.security.exceptions.IzouPermissionException;
006import org.intellimate.izou.security.exceptions.IzouSoundPermissionException;
007import ro.fortsoft.pf4j.PluginDescriptor;
008
009import javax.sound.sampled.AudioPermission;
010import java.security.Permission;
011import java.util.function.Function;
012
013/**
014 * The Audio PermissionModule checks whether one is allowed to play music. It dos not orchestrate the different lines
015 * etc. See SoundManager for these functions.
016 * @see org.intellimate.izou.system.sound.SoundManager
017 */
018public final class AudioPermissionModule extends PermissionModule {
019
020    /**
021     * Creates a new PermissionModule
022     *
023     * @param main an isntance of main
024     */
025    AudioPermissionModule(Main main, SecurityManager securityManager) {
026        super(main, securityManager);
027    }
028
029    /**
030     * returns true if able to check permissions
031     *
032     * @param permission the permission to check
033     * @return true if able to, false if not
034     */
035    @Override
036    public boolean canCheckPermission(Permission permission) {
037        return permission instanceof AudioPermission;
038    }
039
040    @Override
041    public void checkPermission(Permission permission, AddOnModel addOn) throws IzouSoundPermissionException {
042        String permissionMessage = "Audio Permission Denied: " + addOn + "is not registered to "
043                + "play audio or there is already audio being played.";
044
045        registerOrThrow(addOn, permissionMessage);
046    }
047
048    /**
049     * registers the AddOn or throws the Exception
050     * @param addOn the AddOn to register
051     * @param permissionMessage the message of the exception
052     * @throws IzouSoundPermissionException if not eligible for registering
053     */
054    private void registerOrThrow(AddOnModel addOn, String permissionMessage) throws IzouSoundPermissionException{
055        Function<PluginDescriptor, Boolean> checkPlayPermission = descriptor -> {
056            if (descriptor.getAddOnProperties() == null)
057                throw new IzouPermissionException("addon_config.properties not found for addon:" + addOn);
058            try {
059                return descriptor.getAddOnProperties().getProperty("audio_output") != null
060                        && descriptor.getAddOnProperties().getProperty("audio_output").trim().equals("true")
061                        && descriptor.getAddOnProperties().getProperty("audio_usage_descripton") != null
062                        && !descriptor.getAddOnProperties().getProperty("audio_usage_descripton").trim().equals("null")
063                        && !descriptor.getAddOnProperties().getProperty("audio_usage_descripton").trim().isEmpty();
064            } catch (NullPointerException e) {
065                return false;
066            }
067        };
068
069        registerOrThrow(addOn, () -> new IzouSoundPermissionException(permissionMessage), checkPlayPermission);
070    }
071}