package org.lobobrowser.security;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import org.javatuples.Pair;
import org.lobobrowser.security.PermissionSystem.Permission;
import org.lobobrowser.ua.UserAgentContext.RequestKind;
public class InMemoryRequestRuleStore implements RequestRuleStore {
private final Map<String, Map<String, Permission[]>> store = new HashMap<>();
private static final Permission[] defaultPermissions = new Permission[RequestKind.numKinds() + 1];
static {
for (int i = 0; i < defaultPermissions.length; i++) {
defaultPermissions[i] = Permission.Undecided;
}
}
private static final Pair<Permission, Permission[]> defaultPermissionPair = Pair.with(Permission.Undecided, defaultPermissions);
static private InMemoryRequestRuleStore instance = new InMemoryRequestRuleStore();
public static InMemoryRequestRuleStore getInstance() {
instance.dump();
return instance;
}
public InMemoryRequestRuleStore() {
HelperPrivate.initStore(this);
}
public synchronized Pair<Permission, Permission[]> getPermissions(final String frameHostPattern, final String requestHost) {
final Map<String, Permission[]> reqHostMap = store.get(frameHostPattern);
if (reqHostMap != null) {
final Permission[] permissions = reqHostMap.get(requestHost);
if (permissions != null) {
return Pair.with(permissions[0], Arrays.copyOfRange(permissions, 1, permissions.length));
} else {
return defaultPermissionPair;
}
} else {
return defaultPermissionPair;
}
}
public synchronized void storePermissions(final String frameHostPattern, final String requestHost, final Optional<RequestKind> kindOpt,
final Permission permission) {
final int index = kindOpt.map(k -> k.ordinal() + 1).orElse(0);
final Map<String, Permission[]> reqHostMap = store.get(frameHostPattern);
if (reqHostMap != null) {
final Permission[] permissions = reqHostMap.get(requestHost);
if (permissions != null) {
permissions[index] = permission;
} else {
addPermission(requestHost, index, permission, reqHostMap);
}
} else {
final Map<String, Permission[]> newReqHostMap = new HashMap<>();
addPermission(requestHost, index, permission, newReqHostMap);
store.put(frameHostPattern, newReqHostMap);
}
}
private static void addPermission(final String requestHost, final int index, final Permission permission,
final Map<String, Permission[]> reqHostMap) {
final Permission[] newPermissions = Arrays.copyOf(defaultPermissions, defaultPermissions.length);
newPermissions[index] = permission;
reqHostMap.put(requestHost, newPermissions);
}
private void dump() {
System.out.println("Store: ");
store.forEach((key, value) -> {
System.out.println("{" + key + ": ");
value.forEach((key2, value2) -> {
System.out.println(" " + key2 + ": " + Arrays.toString(value2));
});
System.out.println("}");
});
}
}