mirror of https://github.com/CIRCL/lookyloo
fix: Add mimetype for favicon in tree
parent
391166aec7
commit
c6f1057708
|
@ -23,6 +23,8 @@ from urllib.parse import urlparse
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
|
import magic
|
||||||
|
|
||||||
from defang import defang # type: ignore[import-untyped]
|
from defang import defang # type: ignore[import-untyped]
|
||||||
from har2tree import CrawledTree, HostNode, URLNode
|
from har2tree import CrawledTree, HostNode, URLNode
|
||||||
from lacuscore import (LacusCore,
|
from lacuscore import (LacusCore,
|
||||||
|
@ -850,18 +852,21 @@ class Lookyloo():
|
||||||
return to_return
|
return to_return
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: Literal[False], for_datauri: Literal[True]) -> str:
|
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: Literal[False], for_datauri: Literal[True]) -> tuple[str, str]:
|
||||||
...
|
...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: Literal[True], for_datauri: Literal[False]) -> BytesIO:
|
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: Literal[True], for_datauri: Literal[False]) -> BytesIO:
|
||||||
...
|
...
|
||||||
|
|
||||||
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: bool=False, for_datauri: bool=False) -> BytesIO | str:
|
def get_potential_favicons(self, capture_uuid: str, /, all_favicons: bool=False, for_datauri: bool=False) -> BytesIO | tuple[str, str]:
|
||||||
'''Get rendered HTML'''
|
'''Get rendered HTML'''
|
||||||
fav = self._get_raw(capture_uuid, 'potential_favicons.ico', all_favicons)
|
fav = self._get_raw(capture_uuid, 'potential_favicons.ico', all_favicons)
|
||||||
if not all_favicons and for_datauri:
|
if not all_favicons and for_datauri:
|
||||||
return base64.b64encode(fav.getvalue()).decode()
|
favicon = fav.getvalue()
|
||||||
|
f = magic.Magic(mime=True)
|
||||||
|
mimetype = f.from_buffer(favicon)
|
||||||
|
return mimetype, base64.b64encode(favicon).decode()
|
||||||
return fav
|
return fav
|
||||||
|
|
||||||
def get_html(self, capture_uuid: str, /, all_html: bool=False) -> BytesIO:
|
def get_html(self, capture_uuid: str, /, all_html: bool=False) -> BytesIO:
|
||||||
|
|
|
@ -769,7 +769,7 @@ def tree(tree_uuid: str, node_uuid: str | None=None) -> Response | str | Werkzeu
|
||||||
meta = lookyloo.get_meta(tree_uuid)
|
meta = lookyloo.get_meta(tree_uuid)
|
||||||
capture_settings = lookyloo.get_capture_settings(tree_uuid)
|
capture_settings = lookyloo.get_capture_settings(tree_uuid)
|
||||||
# Get a potential favicon, if it exists
|
# Get a potential favicon, if it exists
|
||||||
b64_potential_favicon = lookyloo.get_potential_favicons(tree_uuid, all_favicons=False, for_datauri=True)
|
mime_favicon, b64_potential_favicon = lookyloo.get_potential_favicons(tree_uuid, all_favicons=False, for_datauri=True)
|
||||||
hostnode_to_highlight = None
|
hostnode_to_highlight = None
|
||||||
if node_uuid:
|
if node_uuid:
|
||||||
try:
|
try:
|
||||||
|
@ -800,6 +800,7 @@ def tree(tree_uuid: str, node_uuid: str | None=None) -> Response | str | Werkzeu
|
||||||
tree_uuid=tree_uuid, public_domain=lookyloo.public_domain,
|
tree_uuid=tree_uuid, public_domain=lookyloo.public_domain,
|
||||||
screenshot_thumbnail=b64_thumbnail, page_title=cache.title if hasattr(cache, 'title') else '',
|
screenshot_thumbnail=b64_thumbnail, page_title=cache.title if hasattr(cache, 'title') else '',
|
||||||
favicon=b64_potential_favicon,
|
favicon=b64_potential_favicon,
|
||||||
|
mime_favicon=mime_favicon,
|
||||||
screenshot_size=screenshot_size,
|
screenshot_size=screenshot_size,
|
||||||
meta=meta, enable_mail_notification=enable_mail_notification,
|
meta=meta, enable_mail_notification=enable_mail_notification,
|
||||||
enable_monitoring=lookyloo.monitoring_enabled,
|
enable_monitoring=lookyloo.monitoring_enabled,
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
"stats.css": "/kY943FwWBTne4IIyf7iBROSfbGd82TeBicEXqKkRwawMVRIvM/Pk5MRa7okUyGIxaDjFQGmV/U1vy+PhN6Jbw==",
|
"stats.css": "/kY943FwWBTne4IIyf7iBROSfbGd82TeBicEXqKkRwawMVRIvM/Pk5MRa7okUyGIxaDjFQGmV/U1vy+PhN6Jbw==",
|
||||||
"stats_graph.js": "S/sMNQK1UMMLD0xQeEa7sq3ce8o6oPxwxGlyKVtaHOODjair86dbBDm7cu6pa/elMRDJT1j09jEFjWp+5GbhTw==",
|
"stats_graph.js": "S/sMNQK1UMMLD0xQeEa7sq3ce8o6oPxwxGlyKVtaHOODjair86dbBDm7cu6pa/elMRDJT1j09jEFjWp+5GbhTw==",
|
||||||
"tree.css": "R/pWQnE8kMacDrzGy/NpA1tJoHAZpOjFiX6dqtBe+PqAnhYMn1CIQzODh8Ifvh6hBTPLRWX3bsabfEvfaI7Z6A==",
|
"tree.css": "R/pWQnE8kMacDrzGy/NpA1tJoHAZpOjFiX6dqtBe+PqAnhYMn1CIQzODh8Ifvh6hBTPLRWX3bsabfEvfaI7Z6A==",
|
||||||
"tree.js": "yutMvl9vXhN0htkl40tRHF3r5LCDsH+MJplB6ihMENIsMryEyVoTr4Zq1UadgMG5tP+W2/jqm2zfXh414Kk8AA==",
|
"tree.js": "B14s0PA3EsL4eZw5e+bpQabUVy75t8z8o1PLHurwBD27w2A1Cn/98dA3r4g511Bmwkh09J142LH4y0bVsQeqmQ==",
|
||||||
"up.jpg": "d1ljZJ9f5JekyM6RLFFH2Ua44j6neiQBdUIXOenRTjGppQr3JaeglpQIH6BjPCJL177+TH52U3UIRNS5YAyKIg==",
|
"up.jpg": "d1ljZJ9f5JekyM6RLFFH2Ua44j6neiQBdUIXOenRTjGppQr3JaeglpQIH6BjPCJL177+TH52U3UIRNS5YAyKIg==",
|
||||||
"up_right.jpg": "OMmz+n+MxR34P8/fn5t4DkqKqdJRzQbXQ7fAi2lhkZIJGhVs2vIyY1f2hpYoBxDAX1OcYsSE2lqIR2vXNDGZsA==",
|
"up_right.jpg": "OMmz+n+MxR34P8/fn5t4DkqKqdJRzQbXQ7fAi2lhkZIJGhVs2vIyY1f2hpYoBxDAX1OcYsSE2lqIR2vXNDGZsA==",
|
||||||
"video.png": "gJtmkfr8I1Kw43pYEKjg6CAjgmhl1vIBKBQ3ZkxCu3wvxQm+6kf93iLrrFiY2WuiXzxEn2Leu52GJzmVN5id0g==",
|
"video.png": "gJtmkfr8I1Kw43pYEKjg6CAjgmhl1vIBKBQ3ZkxCu3wvxQm+6kf93iLrrFiY2WuiXzxEn2Leu52GJzmVN5id0g==",
|
||||||
|
|
|
@ -595,7 +595,7 @@ function update(root, computed_node_width=0) {
|
||||||
.attr('id', 'favicon')
|
.attr('id', 'favicon')
|
||||||
.attr("width", 32)
|
.attr("width", 32)
|
||||||
.attr("height", 32)
|
.attr("height", 32)
|
||||||
.attr("xlink:href", `data:image/png;base64,${favicon}`)
|
.attr("xlink:href", `data:${mime_favicon};base64,${favicon}`)
|
||||||
.attr('cursor', 'pointer')
|
.attr('cursor', 'pointer')
|
||||||
.on('mouseover', (event, d) => {
|
.on('mouseover', (event, d) => {
|
||||||
d3.select('#tooltip')
|
d3.select('#tooltip')
|
||||||
|
|
|
@ -190,6 +190,7 @@
|
||||||
var treeUUID = "{{ tree_uuid }}";
|
var treeUUID = "{{ tree_uuid }}";
|
||||||
var screenshot_thumbnail = "{{ screenshot_thumbnail }}";
|
var screenshot_thumbnail = "{{ screenshot_thumbnail }}";
|
||||||
var favicon = "{{ favicon }}";
|
var favicon = "{{ favicon }}";
|
||||||
|
var mime_favicon = "{{ mime_favicon }}";
|
||||||
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 parent_uuid = {{ parent_uuid|tojson }};
|
||||||
|
|
Loading…
Reference in New Issue