package org.intellimate.izou.security; import org.intellimate.izou.util.IzouModule; import org.intellimate.izou.addon.AddOnModel; import org.intellimate.izou.main.Main; import org.intellimate.izou.security.exceptions.IzouPermissionException; import java.security.Permission; import java.util.ArrayList; import java.util.List; /** * The PermissionManager handles all permission conflicts within Izou. For example, if two addOns want to play music at * the same time, the PermissionManager will interfere and decide who gets the play the music. The PermissionManager * has nothing to do with general system security, it is only there to avoid "collisions" between addOns. If you are * looking for system security, look at the {@link SecurityManager}. */ public final class PermissionManager extends IzouModule { private final List<PermissionModule> standardCheck; private final FilePermissionModule filePermissionModule; private final RootPermission rootPermission; /** * Creates a new PermissionManager instance if and only if none has been created yet * * @throws IllegalAccessException thrown if this method is called more than once * @param main an instance of Main * @param securityManager an instance of SecurityManager */ PermissionManager(Main main, SecurityManager securityManager) throws IllegalAccessException { super(main); standardCheck = new ArrayList<>(); standardCheck.add(new AudioPermissionModule(main, securityManager)); standardCheck.add(new SocketPermissionModule(main, securityManager)); filePermissionModule = new FilePermissionModule(main, securityManager); standardCheck.add(new ReflectionPermissionModule(main, securityManager)); rootPermission = new RootPermission(main, securityManager); standardCheck.add(filePermissionModule); } public FilePermissionModule getFilePermissionModule() { return filePermissionModule; } /** * checks the permission * @param perm the permission * @param addOnModel the associated AddOnModel * @throws IzouPermissionException if the permission was not granted */ public void checkPermission(Permission perm, AddOnModel addOnModel) throws IzouPermissionException { try { rootPermission.checkPermission(perm, addOnModel); //its root return; } catch (IzouPermissionException ignored) { //its just not root } standardCheck.stream() .filter(permissionModule -> permissionModule.canCheckPermission(perm)) .forEach(permissionModule -> permissionModule.checkPermission(perm, addOnModel)); } }