001package org.intellimate.izou.security;
002
003import org.intellimate.izou.util.IzouModule;
004import org.intellimate.izou.addon.AddOnModel;
005import org.intellimate.izou.main.Main;
006import org.intellimate.izou.security.exceptions.IzouPermissionException;
007
008import java.security.Permission;
009import java.util.ArrayList;
010import java.util.List;
011
012/**
013 * The PermissionManager handles all permission conflicts within Izou. For example, if two addOns want to play music at
014 * the same time, the PermissionManager will interfere and decide who gets the play the music. The PermissionManager
015 * has nothing to do with general system security, it is only there to avoid "collisions" between addOns. If you are
016 * looking for system security, look at the {@link SecurityManager}.
017 */
018public final class PermissionManager extends IzouModule {
019    private final List<PermissionModule> standardCheck;
020    private final FilePermissionModule filePermissionModule;
021    private final RootPermission rootPermission;
022
023    /**
024     * Creates a new PermissionManager instance if and only if none has been created yet
025     *
026     * @throws IllegalAccessException thrown if this method is called more than once
027     * @param main an instance of Main
028     * @param securityManager an instance of SecurityManager
029     */
030    PermissionManager(Main main, SecurityManager securityManager) throws IllegalAccessException {
031        super(main);
032        standardCheck = new ArrayList<>();
033        standardCheck.add(new AudioPermissionModule(main, securityManager));
034        standardCheck.add(new SocketPermissionModule(main, securityManager));
035        filePermissionModule = new FilePermissionModule(main, securityManager);
036        standardCheck.add(new ReflectionPermissionModule(main, securityManager));
037        rootPermission = new RootPermission(main, securityManager);
038        standardCheck.add(filePermissionModule);
039    }
040
041    public FilePermissionModule getFilePermissionModule() {
042        return filePermissionModule;
043    }
044
045    /**
046     * checks the permission
047     * @param perm the permission
048     * @param addOnModel the associated AddOnModel
049     * @throws IzouPermissionException if the permission was not granted
050     */
051    public void checkPermission(Permission perm, AddOnModel addOnModel) throws IzouPermissionException {
052        try {
053            rootPermission.checkPermission(perm, addOnModel);
054            //its root
055            return;
056        } catch (IzouPermissionException ignored) {
057            //its just not root
058        }
059        standardCheck.stream()
060                .filter(permissionModule -> permissionModule.canCheckPermission(perm))
061                .forEach(permissionModule -> permissionModule.checkPermission(perm, addOnModel));
062    }
063}