added notes to settings.yaml
moved core app config (name, version) out of settings and into app/app_settings.py added ability to brand SneakyScope to any name added caching of cert information from crt.sh (cache enable and lenght is configurable in settings.yaml) streamlined header/footer loading to be more correct
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
<div class="max-w-7xl mx-auto px-4 py-3">
|
||||
<div class="flex items-center justify-between">
|
||||
<a href="{{ url_for('main.index') }}" class="text-xl font-bold text-white">
|
||||
SneakyScope
|
||||
{{ header }}
|
||||
</a>
|
||||
|
||||
{# Desktop nav #}
|
||||
@@ -76,7 +76,7 @@
|
||||
|
||||
{# Footer #}
|
||||
<footer class="bg-nav border-t border-gray-800 text-center p-4">
|
||||
<p class="text-sm text-gray-400">© {{ current_year }} SneakyScope {{ app_name }} {{ app_version }} - A selfhosted URL sandbox</p>
|
||||
<p class="text-sm text-gray-400">{{ footer | safe }}</p>
|
||||
</footer>
|
||||
|
||||
{# Flowbite JS (enables collapse) #}
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
<div class="min-h-screen flex items-center justify-center p-4 text-center">
|
||||
<div class="bg-card border border-gray-800 rounded-xl px-6 py-5 shadow">
|
||||
<div class="mx-auto mb-3 h-12 w-12 rounded-full border-4 border-white/30 border-t-white animate-spin"></div>
|
||||
<div class="text-base">Analyzing website…</div>
|
||||
<div class="text-base">Analyzing website…<br /> If you are pulling certificates, this may take a long time </div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -142,11 +142,7 @@ function hideSpinner() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize form submit handling:
|
||||
* - shows overlay spinner
|
||||
* - disables submit button
|
||||
* - shows small spinner inside button
|
||||
* - lets the browser continue with POST
|
||||
* Initialize form submit handling.
|
||||
*/
|
||||
(function initAnalyzeForm() {
|
||||
const form = document.getElementById('analyze-form');
|
||||
@@ -155,11 +151,16 @@ function hideSpinner() {
|
||||
const submitBtn = form.querySelector('button[type="submit"]');
|
||||
const btnSpinner = document.getElementById('btn-spinner');
|
||||
|
||||
// Hide spinner overlay if arriving from bfcache/back
|
||||
window.addEventListener('pageshow', () => {
|
||||
hideSpinner();
|
||||
if (submitBtn) submitBtn.disabled = false;
|
||||
if (btnSpinner) btnSpinner.classList.add('hidden');
|
||||
// Only hide the overlay when returning via BFCache (back/forward)
|
||||
window.addEventListener('pageshow', (e) => {
|
||||
const nav = performance.getEntriesByType('navigation')[0];
|
||||
const isBFCache = e.persisted || nav?.type === 'back_forward';
|
||||
|
||||
if (isBFCache) {
|
||||
hideSpinner();
|
||||
if (submitBtn) submitBtn.disabled = false;
|
||||
if (btnSpinner) btnSpinner.classList.add('hidden');
|
||||
}
|
||||
});
|
||||
|
||||
form.addEventListener('submit', (e) => {
|
||||
|
||||
@@ -33,7 +33,12 @@
|
||||
<h3 class="text-base font-semibold mt-4 mb-2">GeoIP</h3>
|
||||
{% for ip, info in enrichment.geoip.items() %}
|
||||
<details class="border border-gray-800 rounded-lg mb-2">
|
||||
<summary class="px-3 py-2 cursor-pointer hover:bg-gray-900/50">{{ ip }}</summary>
|
||||
<summary class="px-3 py-2 cursor-pointer hover:bg-gray-900/50">
|
||||
{{ ip }} -
|
||||
{% if info.country %} {{ info.country }} {% endif %} -
|
||||
{% if info.isp %} {{ info.isp }} {% endif %}
|
||||
|
||||
</summary>
|
||||
<div class="px-3 pb-3 overflow-x-auto">
|
||||
<table class="min-w-full text-sm">
|
||||
<tbody>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- /templates/partials/result_forms.html -->
|
||||
<section id="forms" class="card">
|
||||
<h2 class="text-lg font-semibold mb-3">Forms</h2>
|
||||
<h2 class="text-lg font-semibold mb-3">Suspicious Form Hits</h2>
|
||||
|
||||
{% if forms and forms|length > 0 %}
|
||||
<div class="overflow-x-auto">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<!-- /templates/partials/result_text.html -->
|
||||
<section id="sus_text" class="card">
|
||||
<h2 class="text-lg font-semibold mb-3">Text</h2>
|
||||
<h2 class="text-lg font-semibold mb-3">Suspicious Text</h2>
|
||||
|
||||
{% if suspicious_text and suspicious_text|length > 0 %}
|
||||
<div class="overflow-x-auto">
|
||||
|
||||
@@ -28,14 +28,23 @@
|
||||
<p><span class="text-gray-400">Submitted URL:</span> <span class="break-all">{{ submitted_url }}</span></p>
|
||||
<p>
|
||||
<span class="text-gray-400">Final URL:</span>
|
||||
<a href="{{ final_url }}" target="_blank" rel="noopener" class="break-all hover:text-blue-400">{{ final_url }}</a>
|
||||
<span class="break-all">{{ final_url }}</span>
|
||||
</p>
|
||||
<p>
|
||||
<span class="text-gray-400">Permalink:</span>
|
||||
<a href="{{ url_for('main.view_result', run_uuid=uuid, _external=True) }}" class="break-all hover:text-blue-400">
|
||||
{{ request.host_url }}results/{{ uuid }}
|
||||
Permalink for {{ uuid }}
|
||||
</a>
|
||||
</p>
|
||||
<p>
|
||||
<span class="text-gray-400">Full Results File:</span>
|
||||
<a href="{{ url_for('main.view_artifact', run_uuid=uuid, filename='results.json') }}"
|
||||
target="_blank" rel="noopener"
|
||||
class="break-all hover:text-blue-400">
|
||||
Results File
|
||||
</a>
|
||||
</p>
|
||||
|
||||
<p><a href="#url-overview" class="text-sm text-gray-400 hover:text-blue-400">Back to top</a></p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user