From d22b6a9312dea1dc9c100127d530d4f0ce69937f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Vinot?= Date: Thu, 21 Sep 2017 23:26:38 +0100 Subject: [PATCH] Initial commit --- lookyloo/__init__.py | 13 +- lookyloo/static/cookie_in_url.png | Bin 0 -> 5201 bytes lookyloo/static/cookie_read.png | Bin 0 -> 6944 bytes lookyloo/static/cookie_received.png | Bin 0 -> 6397 bytes lookyloo/static/ete.css | 8 - lookyloo/static/ete.js | 19 -- lookyloo/static/javascript.png | Bin 0 -> 6598 bytes lookyloo/static/redirect.png | Bin 0 -> 6528 bytes lookyloo/static/tree.css | 15 ++ lookyloo/static/tree.js | 306 ++++++++++++++++++++++++++++ lookyloo/templates/main.html | 5 +- lookyloo/templates/tree.html | 30 +-- 12 files changed, 333 insertions(+), 63 deletions(-) create mode 100644 lookyloo/static/cookie_in_url.png create mode 100644 lookyloo/static/cookie_read.png create mode 100644 lookyloo/static/cookie_received.png delete mode 100644 lookyloo/static/ete.css delete mode 100644 lookyloo/static/ete.js create mode 100644 lookyloo/static/javascript.png create mode 100644 lookyloo/static/redirect.png create mode 100644 lookyloo/static/tree.css create mode 100644 lookyloo/static/tree.js diff --git a/lookyloo/__init__.py b/lookyloo/__init__.py index 5423f649..9930ba72 100644 --- a/lookyloo/__init__.py +++ b/lookyloo/__init__.py @@ -3,9 +3,8 @@ import json -from har2tree import CrawledTree, hostname_treestyle +from har2tree import CrawledTree from scrapysplashwrapper import crawl -from .ete3_webserver import NodeActions, WebTreeHandler from flask import Flask, render_template, request from flask_bootstrap import Bootstrap @@ -29,10 +28,7 @@ def load_tree(report_dir): ct = CrawledTree(har_files) ct.find_parents() ct.join_trees() - ct.root_hartree.make_hostname_tree() - actions = NodeActions() - style = hostname_treestyle() - return WebTreeHandler(ct.root_hartree.hostname_tree, actions, style) + return ct.jsonify() @app.route('/scrape', methods=['GET', 'POST']) @@ -70,9 +66,8 @@ def get_report_dirs(): @app.route('/tree/', methods=['GET']) def tree(tree_id): report_dir = get_report_dirs()[tree_id] - tree = load_tree(report_dir) - nodes, faces, base64 = tree.redraw() - return render_template('tree.html', nodes=nodes, faces=faces, base64_img=base64) + tree_json = load_tree(report_dir) + return render_template('tree.html', tree_json=tree_json) @app.route('/', methods=['GET']) diff --git a/lookyloo/static/cookie_in_url.png b/lookyloo/static/cookie_in_url.png new file mode 100644 index 0000000000000000000000000000000000000000..039597672db74a4ef726245397f74aa06d492be4 GIT binary patch literal 5201 zcmV-X6t3%uP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 Ef=o!Pr2qf` literal 0 HcmV?d00001 diff --git a/lookyloo/static/redirect.png b/lookyloo/static/redirect.png new file mode 100644 index 0000000000000000000000000000000000000000..6bbf0e4f411d52aa5b022b9404767d8cdff01721 GIT binary patch literal 6528 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 mIV~_YR53I 0; + }).append('image') + .attr("width", 16) + .attr("height", 16) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr("xlink:href", "/static/javascript.png").call(getBB); + + jsContent.filter(function(d,i){ + return d.data.js > 0; + }).append('text') + .attr("dy", 8) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr('width', function(d) { return d.data.js.toString().length + 'em'; }) + .text(function(d) { return d.data.js; }).call(getBB); + + + // Add Cookie read information + var cookieReadContent = icons + .append('svg'); + + cookieReadContent.filter(function(d,i){ + return d.data.request_cookie > 0; + }).append('image') + .attr("width", 16) + .attr("height", 16) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr("xlink:href", "/static/cookie_read.png").call(getBB); + + cookieReadContent.filter(function(d,i){ + return d.data.request_cookie > 0; + }).append('text') + .attr("dy", 8) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr('width', function(d) { return d.data.request_cookie.toString().length + 'em'; }) + .text(function(d) { return d.data.request_cookie; }).call(getBB); + + // Add Cookie set information + var cookieSetContent = icons + .append('svg'); + + cookieSetContent.filter(function(d,i){ + return d.data.response_cookie > 0; + }).append('image') + .attr("width", 16) + .attr("height", 16) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr("xlink:href", "/static/cookie_received.png").call(getBB); + + cookieSetContent.filter(function(d,i){ + return d.data.response_cookie > 0; + }).append('text') + .attr("dy", 8) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr('width', function(d) { return d.data.response_cookie.toString().length + 'em'; }) + .text(function(d) { return d.data.response_cookie; }).call(getBB); + + // Add redirect information + var redirectContent = icons + .append('svg'); + + redirectContent.filter(function(d,i){ + return d.data.redirect > 0; + }).append('image') + .attr("width", 16) + .attr("height", 16) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width +1 : 0 }) + .attr("xlink:href", "/static/redirect.png").call(getBB); + + redirectContent.filter(function(d,i){ + return d.data.redirect > 0; + }).append('text') + .attr("dy", 8) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 2 : 0 }) + .attr('width', function(d) { return d.data.redirect.toString().length + 'em'; }) + .text(function(d) { return d.data.redirect; }).call(getBB); + + // Add cookie in URL information + var cookieURLContent = icons + .append('svg'); + + cookieURLContent.filter(function(d,i){ + return d.data.redirect_to_nothing > 0; + }).append('image') + .attr("width", 16) + .attr("height", 16) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .attr("xlink:href", "/static/cookie_in_url.png").call(getBB); + + cookieURLContent.filter(function(d,i){ + return d.data.redirect_to_nothing > 0; + }).append('text') + .attr("dy", 8) + .attr('x', function(d) { return d.data.total_width ? d.data.total_width + 1 : 0 }) + .text(function(d) { return d.data.redirect_to_nohing; }).call(getBB); + + + // UPDATE + var nodeUpdate = nodeEnter.merge(node); + + // Transition to the proper position for the node + nodeUpdate.transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + d.y + "," + d.x + ")"; + }); + + // Update the node attributes and style + nodeUpdate.select('circle.node') + .attr('r', 10) + .style("fill", function(d) { + return d._children ? "lightsteelblue" : "#fff"; + }) + .attr('cursor', 'pointer'); + + + // Remove any exiting nodes + var nodeExit = node.exit().transition() + .duration(duration) + .attr("transform", function(d) { + return "translate(" + source.y + "," + source.x + ")"; + }) + .remove(); + + // On exit reduce the node circles size to 0 + nodeExit.select('circle') + .attr('r', 1e-6); + + // On exit reduce the opacity of text labels + nodeExit.select('text') + .style('fill-opacity', 1e-6); + + // ****************** links section *************************** + + // Update the links... + var link = svg.selectAll('path.link') + .data(links, function(d) { return d.id; }); + + // Enter any new links at the parent's previous position. + var linkEnter = link.enter().insert('path', "g") + .attr("class", "link") + .attr('d', function(d){ + var o = {x: source.x0, y: source.y0} + return diagonal(o, o) + }); + + // UPDATE + var linkUpdate = linkEnter.merge(link); + + // Transition back to the parent element position + linkUpdate.transition() + .duration(duration) + .attr('d', function(d){ return diagonal(d, d.parent) }); + + // Remove any exiting links + var linkExit = link.exit().transition() + .duration(duration) + .attr('d', function(d) { + var o = {x: source.x, y: source.y} + return diagonal(o, o) + }) + .remove(); + + // Store the old positions for transition. + nodes.forEach(function(d){ + d.x0 = d.x; + d.y0 = d.y; + }); + + // Creates a curved (diagonal) path from parent to the child nodes + function diagonal(s, d) { + + path = `M ${s.y} ${s.x} + C ${(s.y + d.y) / 2} ${s.x}, + ${(s.y + d.y) / 2} ${d.x}, + ${d.y} ${d.x}` + + return path + } + + // Toggle children on click. + function click(d) { + if (d.children) { + d._children = d.children; + d.children = null; + } else { + d.children = d._children; + d._children = null; + } + update(d); + } +} + diff --git a/lookyloo/templates/main.html b/lookyloo/templates/main.html index 0a2674d4..1cb48e50 100644 --- a/lookyloo/templates/main.html +++ b/lookyloo/templates/main.html @@ -2,10 +2,11 @@ {% block scripts %} {{ super() }} - + + {% endblock %} {% block head %} {{ super() }} - + {% endblock %} diff --git a/lookyloo/templates/tree.html b/lookyloo/templates/tree.html index 00a87de2..ea5d112a 100644 --- a/lookyloo/templates/tree.html +++ b/lookyloo/templates/tree.html @@ -2,30 +2,10 @@ {% block title %}Tree{% endblock %} + + {% block content %} - - - {% for x1, y1, x2, y2, nodeid, text, area in nodes %} - - {% endfor %} - {% for x1, y1, x2, y2, nodeid, text, area in faces %} - - {% endfor %} - - + {% endblock %}