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}