minimifies html, JS refactor for preview of certificates

pull/129/head
msramalho 2024-02-14 17:04:14 +00:00
rodzic 4111d19851
commit ca16395043
5 zmienionych plików z 170 dodań i 75 usunięć

Wyświetl plik

@ -37,6 +37,7 @@ numpy = "*"
warcio = "*" warcio = "*"
jsonlines = "*" jsonlines = "*"
pysubs2 = "*" pysubs2 = "*"
minify-html = "*"
[dev-packages] [dev-packages]
autopep8 = "*" autopep8 = "*"

52
Pipfile.lock wygenerowano
Wyświetl plik

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "1214bb42dd8bf964abf6ea24a960973433411a0ffa442b9a3fa7beb0e77faed2" "sha256": "e69d35bafb350b93cc5817b80b215c54e9df7454722684bd3c2dd8c5a750424c"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@ -266,7 +266,7 @@
"sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2", "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2",
"sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064" "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"
], ],
"markers": "implementation_name == 'cpython'", "markers": "platform_python_implementation >= 'CPython'",
"version": "==1.1.0" "version": "==1.1.0"
}, },
"bs4": { "bs4": {
@ -643,11 +643,11 @@
}, },
"google-api-core": { "google-api-core": {
"hashes": [ "hashes": [
"sha256:08ed79ed8e93e329de5e3e7452746b734e6bf8438d8d64dd3319d21d3164890c", "sha256:610c5b90092c360736baccf17bd3efbcb30dd380e7a6dc28a71059edb8bd0d8e",
"sha256:de7ef0450faec7c75e0aea313f29ac870fdc44cfaec9d6499a9a17305980ef66" "sha256:9df18a1f87ee0df0bc4eea2770ebc4228392d8cc4066655b320e2cfccb15db95"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==2.17.0" "version": "==2.17.1"
}, },
"google-api-python-client": { "google-api-python-client": {
"hashes": [ "hashes": [
@ -693,12 +693,12 @@
}, },
"gspread": { "gspread": {
"hashes": [ "hashes": [
"sha256:6c3af32b753fe75d9dd513ea9e088e9e043e09b9e3bf04d61d77213f37e67b79", "sha256:0238ba43f3bd45e7fa96fd206e9ceb73b03c2896eb143d7f4373c6d0cfe6fddf",
"sha256:8c8bf83be676a019d3a483455d8b17b442f2acfc620172f245422ca4fc960dd0" "sha256:0982beeb07fa3ec4482a3aaa96ca13a1e6b427a0aca4058beab4cdc33c0cbb64"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.8'",
"version": "==6.0.1" "version": "==6.0.2"
}, },
"h11": { "h11": {
"hashes": [ "hashes": [
@ -965,6 +965,38 @@
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==0.1.2" "version": "==0.1.2"
}, },
"minify-html": {
"hashes": [
"sha256:01ea40dc5ae073c47024f02758d5e18e55d853265eb9c099040a6c00ab0abb99",
"sha256:1056819ea46e9080db6fed678d03511c7e94c2a615e72df82190ea898dc82609",
"sha256:2a9aef71b24c3d38c6bece2db3bf707443894958b01f1c27d3a6459ba4200e59",
"sha256:3b38ea5b446cc69e691a0bf64d1160332ffc220bb5b411775983c87311cab2c7",
"sha256:40f38ddfefbb63beb28df20c2c81c12e6af6838387520506b4eceec807d794a3",
"sha256:597c86f9792437eee0698118fb38dff42b5b4be6d437b6d577453c2f91524ccc",
"sha256:5f707b233b9c163a546b15ce9af433ddd456bd113f0326e5ffb382b8ee5c1a2d",
"sha256:70251bd7174b62c91333110301b27000b547aa2cc06d4fe6ba6c3f11612eecc9",
"sha256:7a5eb7e830277762da69498ee0f15d4a9fa6e91887a93567d388e4f5aee01ec3",
"sha256:7af72438d3ae6ea8b0a94c038d35c9c22c5f8540967f5fa2487f77b2cdb12605",
"sha256:7b071ded7aacbb140a7e751d49e246052f204b896d69663a4a5c3a27203d27f6",
"sha256:7b2aadba6987e6c15a916a4627b94b1db3cbac65e6ae3613b61b3ab0d2bb4c96",
"sha256:7e6d4f97cebb725bc1075f225bdfcd824e0f5c20a37d9ea798d900f96e1b80c0",
"sha256:92375f0cb3b4074e45005e1b4708b5b4c0781b335659d52918671c083c19c71e",
"sha256:a23a8055e65fa01175ddd7d18d101c05e267410fa5956c65597dcc332c7f91dd",
"sha256:afd76ca2dc9afa53b66973a3a66eff9a64692811ead44102aa8044a37872e6e2",
"sha256:b6356541799951c5e8205aabf5970dda687f4ffa736479ce8df031919861e51d",
"sha256:bd682207673246c78fb895e7065425cc94cb712d94cff816dd9752ce014f23e8",
"sha256:cda674cc68ec3b9ebf61f2986f3ef62de60ce837a58860c6f16b011862b5d533",
"sha256:cf4c36b6f9af3b0901bd2a0a29db3b09c0cdf0c38d3dde28e6835bce0f605d37",
"sha256:d4c4ae3909e2896c865ebaa3a96939191f904dd337a87d7594130f3dfca55510",
"sha256:dc2df1e5203d89197f530d14c9a82067f3d04b9cb0118abc8f2ef8f88efce109",
"sha256:e47197849a1c09a95892d32df3c9e15f6d0902c9ae215e73249b9f5bca9aeb97",
"sha256:ea315ad6ac33d7463fac3f313bba8c8d9a55f4811971c203eed931203047e5c8",
"sha256:ef6dc1950e04b7566c1ece72712674416f86fef8966ca026f6c5580d840cd354",
"sha256:f37ce536305500914fd4ee2bbaa4dd05a039f39eeceae45560c39767d99aede0"
],
"index": "pypi",
"version": "==0.15.0"
},
"multidict": { "multidict": {
"hashes": [ "hashes": [
"sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556", "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556",
@ -1742,7 +1774,7 @@
"sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84",
"sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e" "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"
], ],
"markers": "python_version >= '3.7'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==2.0.7" "version": "==2.0.7"
}, },
"vk-api": { "vk-api": {
@ -1844,7 +1876,7 @@
"sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8", "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8",
"sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7" "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"
], ],
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.7'",
"version": "==12.0" "version": "==12.0"
}, },
"werkzeug": { "werkzeug": {

Wyświetl plik

@ -4,6 +4,7 @@ import mimetypes, os, pathlib
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
from urllib.parse import quote from urllib.parse import quote
from loguru import logger from loguru import logger
import minify_html
from ..version import __version__ from ..version import __version__
from ..core import Metadata, Media, ArchivingContext from ..core import Metadata, Media, ArchivingContext
@ -45,6 +46,8 @@ class HtmlFormatter(Formatter):
metadata=item.metadata, metadata=item.metadata,
version=__version__ version=__version__
) )
content = minify_html.minify(content, minify_js=False, minify_css=True)
html_path = os.path.join(ArchivingContext.get_tmp_dir(), f"formatted{random_str(24)}.html") html_path = os.path.join(ArchivingContext.get_tmp_dir(), f"formatted{random_str(24)}.html")
with open(html_path, mode="w", encoding="utf-8") as outf: with open(html_path, mode="w", encoding="utf-8") as outf:
outf.write(content) outf.write(content)

Wyświetl plik

@ -96,6 +96,11 @@
overflow: hidden; overflow: hidden;
background-color: #f1f1f1; background-color: #f1f1f1;
} }
.pem-certificate {
text-align: left;
font-size: small;
}
</style> </style>
</head> </head>
@ -184,7 +189,45 @@
<p style="text-align:center;">Made with <a <p style="text-align:center;">Made with <a
href="https://github.com/bellingcat/auto-archiver">bellingcat/auto-archiver</a> v{{ version }}</p> href="https://github.com/bellingcat/auto-archiver">bellingcat/auto-archiver</a> v{{ version }}</p>
</body> </body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/forge/0.10.0/forge.min.js" defer></script>
<script defer> <script defer>
// partial decode of SSL certificates
function decodeCertificate(sslCert) {
var cert = forge.pki.certificateFromPem(sslCert);
return `PREVIEW:<br/><ul>
<li><b>Subject:</b> <span class="copy">${cert.subject.attributes.map(attr => `${attr.shortName}: ${attr.value}`).join(", ")}</span></li>
<li><b>Issuer:</b> <span class="copy">${cert.issuer.attributes.map(attr => `${attr.shortName}: ${attr.value}`).join(", ")}</span></li>
<li><b>Valid From:</b> <span class="copy">${cert.validity.notBefore}</span></li>
<li><b>Valid To:</b> <span class="copy">${cert.validity.notAfter}</span></li>
<li><b>Serial Number:</b> <span class="copy">${cert.serialNumber}</span></li>
</ul>`;
}
async function run() {
await PreviewCertificates();
await enableCopyLogic();
await enableCollapsibleLogic();
await setupSafeView();
}
async function PreviewCertificates() {
await Promise.all(
Array.from(document.querySelectorAll(".pem-certificate")).map(async el => {
let certificate = await (await fetch(el.getAttribute("pem"))).text();
el.innerHTML = decodeCertificate(certificate);
let cyberChefUrl =
`https://gchq.github.io/CyberChef/#recipe=Parse_X.509_certificate('PEM')&input=${btoa(certificate)}`;
// create a new anchor with this url and append after the code
let a = document.createElement("a");
a.href = cyberChefUrl;
a.textContent = "Full certificate details";
el.parentElement.appendChild(a);
})
);
console.log("certificate preview done");
}
// notification logic // notification logic
const notification = document.getElementById("notification"); const notification = document.getElementById("notification");
@ -198,7 +241,9 @@
} }
// copy logic // copy logic
Array.from(document.querySelectorAll(".copy")).forEach(el => { async function enableCopyLogic() {
await Promise.all(
Array.from(document.querySelectorAll(".copy")).map(el => {
el.onclick = () => { el.onclick = () => {
document.execCommand("copy"); document.execCommand("copy");
} }
@ -215,12 +260,15 @@
} }
}) })
}) })
)
console.log("copy logic enabled");
}
// collapsibles // collapsibles
async function enableCollapsibleLogic() {
let coll = document.getElementsByClassName("collapsible"); let coll = document.getElementsByClassName("collapsible");
let i; for (let i = 0; i < coll.length; i++) {
await new Promise(resolve => {
for (i = 0; i < coll.length; i++) {
coll[i].addEventListener("click", function () { coll[i].addEventListener("click", function () {
this.classList.toggle("active"); this.classList.toggle("active");
// let content = this.nextElementSibling; // let content = this.nextElementSibling;
@ -231,8 +279,13 @@
content.style.display = "block"; content.style.display = "block";
} }
}); });
resolve();
})
}
console.log("collapsible logic enabled");
} }
async function setupSafeView() {
// logic for enabled/disabled greyscale // logic for enabled/disabled greyscale
// Get references to the checkboxes and images/videos // Get references to the checkboxes and images/videos
const safeImageViewCheckbox = document.getElementById('safe-media-view'); const safeImageViewCheckbox = document.getElementById('safe-media-view');
@ -272,9 +325,11 @@
} }
}); });
}); });
// Call the function on page load to apply the initial state
toggleGrayscale(); toggleGrayscale();
console.log("grayscale logic enabled");
}
run();
</script> </script>
</html> </html>

Wyświetl plik

@ -41,6 +41,10 @@ No URL available for {{ m.key }}.
</div> </div>
{% elif m.filename | get_extension == ".wacz" %} {% elif m.filename | get_extension == ".wacz" %}
<a href="https://replayweb.page/?source={{ url | quote }}#view=pages&url={{ main_url }}">replayweb</a> <a href="https://replayweb.page/?source={{ url | quote }}#view=pages&url={{ main_url }}">replayweb</a>
{% elif m.filename | get_extension == ".pem" %}
<code class="pem-certificate" pem="{{url}}"></code>
{% else %} {% else %}
No preview available for {{ m.key }}. No preview available for {{ m.key }}.
{% endif %} {% endif %}