feat(fls): write the installed applications of a .fls, loaded by Java as the original

topologyWriter.ts puts each installed application of a PC or notebook under
its key and gives it the system software, as installApp does, with its
settings: a server's switch and port, a client's target, DNS recursion,
virtual hosts, the peer count, the personal firewall. The applications
follow the files, as in Java's own files: the web server, the peer-to-peer
application and the e-mail server make their directories only where the
files lack them, and the DNS server reads /dns/hosts when it is installed.
E-mail accounts, messages and address books are the next step.

The Java oracle now reports a personal firewall's rules in full, not their
number (the corpus has none; its result is byte-equal).

Checked by Java against Java: every corpus file, read and written again,
loads with the same applications as the original. The synthetic topology
adds every FILIUS application with settings away from its defaults, a
personal firewall with a rule, an own index.html (Java makes no second) and
a missing /peer2peer directory, which Java makes at the end. 12 mutation
probes, among them files and applications in reverse order, each loaded by
Java, were all caught.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-30 08:36:00 +00:00
co-authored by Claude Opus 5.5
parent 84ea76e880
commit ccec734143
7 changed files with 1861 additions and 142 deletions
+12 -7
View File
@@ -309,17 +309,22 @@ public class FlsOracle {
settings.put("dropICMP", firewall.getDropICMP());
settings.put("filterSYNSegmentsOnly", firewall.getFilterSYNSegmentsOnly());
settings.put("filterUdp", firewall.getFilterUdp());
List<Object> rules = new ArrayList<>();
for (FirewallRule rule : firewall.getRuleset()) {
rules.add(Arrays.asList(rule.srcIP, rule.srcMask, rule.destIP, rule.destMask, rule.port,
(int) rule.protocol, (int) rule.action));
}
settings.put("rules", rules);
settings.put("rules", firewallRules(firewall));
json.put("firewall", settings);
}
return json;
}
/** A firewall's rules, each as source, masks, destination, port, protocol and action. */
static List<Object> firewallRules(Firewall firewall) {
List<Object> rules = new ArrayList<>();
for (FirewallRule rule : firewall.getRuleset()) {
rules.add(Arrays.asList(rule.srcIP, rule.srcMask, rule.destIP, rule.destMask, rule.port,
(int) rule.protocol, (int) rule.action));
}
return rules;
}
/**
* The installed applications of a PC or notebook, by key: the class, and
* the settings the topology layer reads. E-mail: the server's accounts as
@@ -388,7 +393,7 @@ public class FlsOracle {
json.put("dropICMP", firewall.getDropICMP());
json.put("filterSYNSegmentsOnly", firewall.getFilterSYNSegmentsOnly());
json.put("filterUdp", firewall.getFilterUdp());
json.put("rules", firewall.getRuleset().size());
json.put("rules", firewallRules(firewall));
}
result.add(json);
}