mirror of https://github.com/CIRCL/lookyloo
new: reference to parent on tree (if exists)
parent
88ba575f35
commit
53bc8324cd
|
@ -1150,7 +1150,7 @@ misp = ["python-magic", "pydeep"]
|
||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.8"
|
python-versions = "^3.8"
|
||||||
content-hash = "f34e831afe0cbf89d79c5f69d1292b2ec36929d7b752f5887ecd48d1212fb7a5"
|
content-hash = "e8e3df6d57b274c350ed4df996c608cdf1ecb06ffd3f985c3ed0912a42da310b"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
aiohttp = [
|
aiohttp = [
|
||||||
|
|
|
@ -554,6 +554,7 @@ def tree(tree_uuid: str, node_uuid: Optional[str]=None):
|
||||||
blur_screenshot=blur_screenshot, urlnode_uuid=hostnode_to_highlight,
|
blur_screenshot=blur_screenshot, urlnode_uuid=hostnode_to_highlight,
|
||||||
auto_trigger_modules=auto_trigger_modules,
|
auto_trigger_modules=auto_trigger_modules,
|
||||||
confirm_message=confirm_message if confirm_message else 'Tick to confirm.',
|
confirm_message=confirm_message if confirm_message else 'Tick to confirm.',
|
||||||
|
parent_uuid=cache.parent,
|
||||||
has_redirects=True if cache.redirects else False)
|
has_redirects=True if cache.redirects else False)
|
||||||
|
|
||||||
except NoValidHarFile as e:
|
except NoValidHarFile as e:
|
||||||
|
|
|
@ -59,6 +59,98 @@ root.y0 = 0;
|
||||||
let tree = d3.tree();
|
let tree = d3.tree();
|
||||||
update(root);
|
update(root);
|
||||||
|
|
||||||
|
if (parent_uuid != null) {
|
||||||
|
node_container.append('rect')
|
||||||
|
.attr("rx", 6)
|
||||||
|
.attr("ry", 6)
|
||||||
|
.attr("transform", `translate(${root.y - 70}, ${root.x - 150})`)
|
||||||
|
.attr('width', 150)
|
||||||
|
.attr('height', 65)
|
||||||
|
.style("opacity", "0.5")
|
||||||
|
.attr("stroke", 'black')
|
||||||
|
.attr('stroke-opacity', "0.8")
|
||||||
|
.attr("stroke-width", "2")
|
||||||
|
.attr("stroke-linecap", "round")
|
||||||
|
.attr("fill", "white")
|
||||||
|
|
||||||
|
let text = node_container
|
||||||
|
.data([
|
||||||
|
{
|
||||||
|
"line1": 'This capture was triggered',
|
||||||
|
"line2": 'from a previous capture.',
|
||||||
|
"line3": 'See the parent',
|
||||||
|
"parent_uuid": parent_uuid
|
||||||
|
}
|
||||||
|
])
|
||||||
|
.append('text')
|
||||||
|
.attr("dy", "0em")
|
||||||
|
.style("font-size", "12px")
|
||||||
|
.attr("transform", `translate(${root.y - 67}, ${root.x - 135})`);
|
||||||
|
|
||||||
|
text
|
||||||
|
.append('tspan')
|
||||||
|
.text(d => d.line1);
|
||||||
|
|
||||||
|
text
|
||||||
|
.append('tspan')
|
||||||
|
.attr("x", 8)
|
||||||
|
.attr("dy", 18)
|
||||||
|
.text(d => d.line2);
|
||||||
|
|
||||||
|
text
|
||||||
|
.append('tspan')
|
||||||
|
.attr("x", 30)
|
||||||
|
.attr("dy", 20)
|
||||||
|
.text(d => d.line3)
|
||||||
|
.style('fill', '#0000EE')
|
||||||
|
.attr('cursor', 'pointer')
|
||||||
|
.on('click', (event, d) => { openTreeInNewTab(d.parent_uuid) } );
|
||||||
|
|
||||||
|
let line_arrow = node_container
|
||||||
|
.append('g')
|
||||||
|
.attr('cursor', 'pointer')
|
||||||
|
.attr("transform", `translate(${root.y}, ${root.x})`);
|
||||||
|
|
||||||
|
let line = d3.line()
|
||||||
|
// Other options: http://bl.ocks.org/d3indepth/raw/b6d4845973089bc1012dec1674d3aff8/
|
||||||
|
//.curve(d3.curveCardinal)
|
||||||
|
.curve(d3.curveBundle)
|
||||||
|
.x(point => point.lx)
|
||||||
|
.y(point => point.ly);
|
||||||
|
|
||||||
|
let line_tip = d3.symbol()
|
||||||
|
.type(d3.symbolTriangle)
|
||||||
|
.size(200);
|
||||||
|
|
||||||
|
line_arrow
|
||||||
|
.append("path")
|
||||||
|
.attr('stroke-opacity', "0.7")
|
||||||
|
.attr("stroke-width", "2")
|
||||||
|
.attr("stroke", "black")
|
||||||
|
.attr("fill", "none")
|
||||||
|
.data([{
|
||||||
|
source: {x: 0, y: -85},
|
||||||
|
target: {x: 50, y: -node_height/1.12}
|
||||||
|
}])
|
||||||
|
.attr("class", "line")
|
||||||
|
.attr("d", d => line(
|
||||||
|
[{lx: d.source.x, ly: d.source.y},
|
||||||
|
{lx: d.target.x, ly: d.source.y},
|
||||||
|
{lx: d.target.x, ly: d.target.y}
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
line_arrow
|
||||||
|
.append("path")
|
||||||
|
.attr("d", line_tip)
|
||||||
|
.attr("stroke", 'black')
|
||||||
|
.attr('stroke-opacity', "0.8")
|
||||||
|
.style('stroke-width', '1.5')
|
||||||
|
.attr("fill-opacity", '0')
|
||||||
|
.attr("transform", `translate(50, -${node_height/1.3}) rotate(60)`);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
function openTreeInNewTab(capture_uuid, hostnode_uuid=null) {
|
function openTreeInNewTab(capture_uuid, hostnode_uuid=null) {
|
||||||
let url = `/tree/${capture_uuid}`;
|
let url = `/tree/${capture_uuid}`;
|
||||||
if (hostnode_uuid != null) {
|
if (hostnode_uuid != null) {
|
||||||
|
|
|
@ -116,6 +116,7 @@
|
||||||
var screenshot_thumbnail = "{{ screenshot_thumbnail }}";
|
var screenshot_thumbnail = "{{ screenshot_thumbnail }}";
|
||||||
var enable_bookmark = {{ enable_bookmark|tojson }};
|
var enable_bookmark = {{ enable_bookmark|tojson }};
|
||||||
var treeData = {{ tree_json | safe }};
|
var treeData = {{ tree_json | safe }};
|
||||||
|
var parent_uuid = {{ parent_uuid|tojson }};
|
||||||
var capture_starttime = new Date(Date.parse("{{ start_time }}"));
|
var capture_starttime = new Date(Date.parse("{{ start_time }}"));
|
||||||
window.addEventListener('DOMContentLoaded', (event) => {
|
window.addEventListener('DOMContentLoaded', (event) => {
|
||||||
document.getElementById("start_time").innerHTML =
|
document.getElementById("start_time").innerHTML =
|
||||||
|
|
Loading…
Reference in New Issue