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.IzouSocketPermissionException;
007import ro.fortsoft.pf4j.PluginDescriptor;
008
009import java.io.FilePermission;
010import java.security.Permission;
011import java.util.function.Function;
012
013/**
014 * @author LeanderK
015 * @version 1.0
016 */
017public class RootPermission extends PermissionModule {
018    /**
019     * Creates a new PermissionModule
020     *
021     * @param main an instance of main
022     * @param securityManager an instance of security-manager
023     */
024    RootPermission(Main main, SecurityManager securityManager) {
025        super(main, securityManager);
026    }
027
028    /**
029     * returns true if able to check permissions
030     *
031     * @param permission the permission to check
032     * @return true if able to, false if not
033     */
034    @Override
035    public boolean canCheckPermission(Permission permission) {
036        return true;
037    }
038
039    /**
040     * Checks if the given addOn is allowed to access the requested service and registers them if not yet registered.
041     *
042     * @param permission the Permission to check
043     * @param addon      the identifiable to check
044     * @throws IzouPermissionException thrown if the addOn is not allowed to access its requested service
045     */
046    @Override
047    public void checkPermission(Permission permission, AddOnModel addon) throws IzouPermissionException {
048        if (isRegistered(addon))
049            return;
050
051        if (permission instanceof FilePermission && !permission.getActions().intern().toLowerCase().equals("read")) {
052            String canonicalName = permission.getName().intern().toLowerCase();
053            getSecurityManager().getPermissionManager().getFilePermissionModule().fileWriteCheck(canonicalName, addon);
054        }
055
056        Function<PluginDescriptor, Boolean> checkPermission = descriptor -> {
057            try {
058                return descriptor.getAddOnProperties().get("root").equals("true");
059            } catch (NullPointerException e) {
060                return false;
061            }
062        };
063
064        String exceptionMessage = "Root permission denied for: " + addon + "is not registered to "
065                + "use socket root connections.";
066        registerOrThrow(addon, () -> new IzouSocketPermissionException(exceptionMessage), checkPermission);
067    }
068}