package org.intellimate.izou.security;
import org.intellimate.izou.addon.AddOnModel;
import org.intellimate.izou.main.Main;
import org.intellimate.izou.security.exceptions.IzouPermissionException;
import org.intellimate.izou.security.exceptions.IzouSoundPermissionException;
import ro.fortsoft.pf4j.PluginDescriptor;
import javax.sound.sampled.AudioPermission;
import java.security.Permission;
import java.util.function.Function;
/**
* The Audio PermissionModule checks whether one is allowed to play music. It dos not orchestrate the different lines
* etc. See SoundManager for these functions.
* @see org.intellimate.izou.system.sound.SoundManager
*/
public final class AudioPermissionModule extends PermissionModule {
/**
* Creates a new PermissionModule
*
* @param main an isntance of main
*/
AudioPermissionModule(Main main, SecurityManager securityManager) {
super(main, securityManager);
}
/**
* returns true if able to check permissions
*
* @param permission the permission to check
* @return true if able to, false if not
*/
@Override
public boolean canCheckPermission(Permission permission) {
return permission instanceof AudioPermission;
}
@Override
public void checkPermission(Permission permission, AddOnModel addOn) throws IzouSoundPermissionException {
String permissionMessage = "Audio Permission Denied: " + addOn + "is not registered to "
+ "play audio or there is already audio being played.";
registerOrThrow(addOn, permissionMessage);
}
/**
* registers the AddOn or throws the Exception
* @param addOn the AddOn to register
* @param permissionMessage the message of the exception
* @throws IzouSoundPermissionException if not eligible for registering
*/
private void registerOrThrow(AddOnModel addOn, String permissionMessage) throws IzouSoundPermissionException{
Function<PluginDescriptor, Boolean> checkPlayPermission = descriptor -> {
if (descriptor.getAddOnProperties() == null)
throw new IzouPermissionException("addon_config.properties not found for addon:" + addOn);
try {
return descriptor.getAddOnProperties().getProperty("audio_output") != null
&& descriptor.getAddOnProperties().getProperty("audio_output").trim().equals("true")
&& descriptor.getAddOnProperties().getProperty("audio_usage_descripton") != null
&& !descriptor.getAddOnProperties().getProperty("audio_usage_descripton").trim().equals("null")
&& !descriptor.getAddOnProperties().getProperty("audio_usage_descripton").trim().isEmpty();
} catch (NullPointerException e) {
return false;
}
};
registerOrThrow(addOn, () -> new IzouSoundPermissionException(permissionMessage), checkPlayPermission);
}
}