diff --git a/lookyloo/lookyloo.py b/lookyloo/lookyloo.py index d82282b8..08348783 100644 --- a/lookyloo/lookyloo.py +++ b/lookyloo/lookyloo.py @@ -72,7 +72,7 @@ class CaptureSettings(CaptureSettingsCore, total=False): '''The capture settings that can be passed to Lookyloo''' listing: int | None not_queued: int | None - auto_report: bool | str | dict[str, str] | None + auto_report: bool | str | dict[str, str] | None # {'email': , 'comment': , 'recipient_mail':} dnt: str | None browser_name: str | None os: str | None diff --git a/website/web/__init__.py b/website/web/__init__.py index 910f912b..bd3357b6 100644 --- a/website/web/__init__.py +++ b/website/web/__init__.py @@ -1574,6 +1574,15 @@ def capture_web() -> str | Response | WerkzeugResponse: else: flash('Invalid proxy: Check that you entered a scheme, a hostname and a port.', 'error') + # auto report + if flask_login.current_user.is_authenticated: + if request.form.get('auto-report'): + capture_query['auto_report'] = { + 'email': request.form.get('email', ""), + 'comment': request.form.get('comment', ""), + 'recipient_mail': request.form.get('recipient-mail', "") + } + if request.form.get('url'): capture_query['url'] = request.form['url'] perma_uuid = lookyloo.enqueue_capture(capture_query, source='web', user=user, authenticated=flask_login.current_user.is_authenticated) diff --git a/website/web/sri.txt b/website/web/sri.txt index 8543e775..0ae00112 100644 --- a/website/web/sri.txt +++ b/website/web/sri.txt @@ -1,7 +1,7 @@ { "static": { "bomb.svg": "Tro3+kCLzfBNBve2gPnsmXsl+tHUQVrFz77zfrWwnAuTraehZaoAfVJgGOYdG8zceXdGLEKzXVi3GdtEXw0sYQ==", - "capture.js": "wdtRc1v2F4NwxeXo5UqHmiKB2vHNptTM0tLCxuIN5HdjgV2ITVNP5Zva0T5fQx00HGIefs5jBcUdjIl7LMb3vQ==", + "capture.js": "BjMPL5W9nMRQOX6ZtcGAMVQyJOkhllg8thUCcq1oD9mMB1fH4pk+lR0Alc3XuIvtYyKbLyYBVG7VcSpUSATYNg==", "check.svg": "CRqUAM/yXxgJwpfg3TeoKD+CIqQj62lxqS3zeCmdPaV3dKftk4jk5Mqc1TGxL7i61X1sgV0/f+KJLEOKTw01ww==", "cookie_in_url.png": "hs/oNPnrR2DkDX9Yp6Daug/QqpWJHemJE6lXpxNafjgOYooezp3DpbqKqADT7QcfcTxxUfe1iPDZJlHOrNMAcw==", "cookie_read.png": "mdXCeuNFPvshSwIXAJLoR1xFjXb+K2Mgu47Q1fnUAO8j1N2c/uJuE8sGuBHHbS8HOyr/CbOC6Uf3zsm9KvAs8Q==", diff --git a/website/web/static/capture.js b/website/web/static/capture.js index 218ab5f1..6aa90cc7 100644 --- a/website/web/static/capture.js +++ b/website/web/static/capture.js @@ -1,33 +1,194 @@ -$("#os").change(function(){ - var os_name = $(this).find(":selected").val().replace(/(:|\.|\[|\]|,|=)/g, "\\$1").replace(/ /g,"_"); - var first_browser_name = $("[id='" + os_name + "']").find('select option:first-child').val().replace(/(:|\.|\[|\]|,|=)/g, "\\$1").replace(/ /g,"_"); - // Hide and disable everything - $("#os > option").removeAttr('selected'); - $(".style-sub-1").hide(); - $(".style-sub-1 > div > select").attr('disabled', true); - $(".style-sub-1 > div > select").removeAttr('selected'); - $(".style-sub-2").hide(); - $(".style-sub-2 > div > select").attr('disabled', true); - $(".style-sub-2 > div > select").removeAttr('selected'); +// scripts for the submission type - $("[id='" + os_name + "']").show(); - $("[id='" + os_name + "'] > div > select").removeAttr('disabled'); - $("[id='" + os_name + "'] > div > select option:first").prop('selected',true); - $("[id='" + os_name + '_' + first_browser_name + "']").show(); - $("[id='" + os_name + '_' + first_browser_name + "'] > div > select").removeAttr('disabled'); - $("[id='" + os_name + '_' + first_browser_name + "'] > div > select option:first").prop('selected',true); +document.getElementById('nav-url-tab').addEventListener('click', function (e) { + // switch to tab for capture of URL(s) + + // default: single capture field + document.getElementById("singleCaptureField").required = true; + document.getElementById("singleCaptureField").classList.remove("d-none"); + // hide multiple captures field + document.getElementById('multipleCaptures').checked = false; + document.getElementById("multipleCapturesField").required = false; + document.getElementById("multipleCapturesField").classList.add("d-none"); + + document.getElementById("document").required = false; }); -$('select[name="browser"]').change(function(){ - var browser_name = $(this).find(":selected").val().replace(/(:|\.|\[|\]|,|=)/g, "\\$1").replace(/ /g,"_"); - var os_name = $(this).parent().parent().attr("id").replace(/(:|\.|\[|\]|,|=)/g, "\\$1").replace(/ /g,"_"); - - // Hide what makes sense - $(".style-sub-1 > div > select").removeAttr('selected'); - $(".style-sub-2").hide(); - $(".style-sub-2 > div > select").attr('disabled', true); - $(".style-sub-2 > div > select").removeAttr('selected'); - - $("[id='" + os_name + '_' + browser_name + "']").show(); - $("[id='" + os_name + '_' + browser_name + "'] > div > select").removeAttr('disabled'); +document.getElementById('nav-doc-tab').addEventListener('click', function (e) { + // switch to tab for capture of document + document.getElementById("document").required = true; + document.getElementById("multipleCapturesField").required = false; + document.getElementById("singleCaptureField").required = false; }); + +document.getElementById('multipleCaptures').addEventListener('click', function (e) { + // switch input-fields between multiple and single capture + if (document.getElementById('multipleCaptures').checked === true) { + // enable multiple captures + document.getElementById('singleCaptureField').value = ''; + document.getElementById("singleCaptureField").classList.add("d-none"); + document.getElementById("singleCaptureField").required = false; + document.getElementById("multipleCapturesField").classList.remove("d-none"); + document.getElementById("multipleCapturesField").required = true; + } else { + // disable multiple captures + document.getElementById('multipleCapturesField').value = ''; + document.getElementById("multipleCapturesField").classList.add("d-none"); + document.getElementById("multipleCapturesField").required = false; + document.getElementById("singleCaptureField").classList.remove("d-none"); + document.getElementById("singleCaptureField").required = true; + } +}); + + +// scripts for browser configuration of the capture + +document.getElementById("os").addEventListener("change", function () { + let osSelect = document.getElementById("os"); + let os_name = osSelect.options[osSelect.selectedIndex].value.replace(/(:|\.|\[|\]|,|=|\\)/g, "\\$1").replace(/ /g, "_"); + let first_browser_name = document.querySelector(`[id='${os_name}'] select option:first-child`).value.replace(/(:|\.|\[|\]|,|=|\\)/g, "\\$1").replace(/ /g, "_"); + + // Hide and disable everything + document.querySelectorAll("#os option").forEach(function (option) { + option.removeAttribute('selected'); + }); + document.querySelectorAll(".style-sub-1").forEach(function (element) { + element.style.display = 'none'; + }); + document.querySelectorAll(".style-sub-1 > label > span > select").forEach(function (select) { + select.disabled = true; + select.querySelectorAll('option').forEach(function (option) { + option.removeAttribute('selected'); + }); + }); + document.querySelectorAll(".style-sub-2").forEach(function (element) { + element.style.display = 'none'; + }); + document.querySelectorAll(".style-sub-2 > label > span > select").forEach(function (select) { + select.disabled = true; + select.querySelectorAll('option').forEach(function (option) { + option.removeAttribute('selected'); + }); + }); + + // Re-enable and show what makes sense + document.querySelector(`[id='${os_name}']`).style.display = 'block'; + document.querySelectorAll(`[id='${os_name}'] > label > span > select`).forEach(function (select) { + select.disabled = false; + select.querySelector('option:first-child').selected = true; + }); + document.querySelector(`[id='${os_name}_${first_browser_name}']`).style.display = 'block'; + document.querySelectorAll(`[id='${os_name}_${first_browser_name}'] > label > span > select`).forEach(function (select) { + select.disabled = false; + select.querySelector('option:first-child').selected = true; + }); +}); + +document.querySelectorAll('select[name="browser"]').forEach( function(element) +{ + element.addEventListener('change', function (e) { + let browser_name = element.options[element.selectedIndex].value.replace(/(:|\.|\[|\]|,|=|\\)/g, "\\$1").replace(/ /g, "_"); + let osSelect = document.getElementById("os"); + let os_name = osSelect.options[osSelect.selectedIndex].value.replace(/(:|\.|\[|\]|,|=|\\)/g, "\\$1").replace(/ /g, "_"); + + // Hide and disable every useragent + document.querySelectorAll(".style-sub-2").forEach(function (element) { + element.style.display = 'none'; + }); + document.querySelectorAll(".style-sub-2 > label > span > select").forEach(function (select) { + select.disabled = true; + select.querySelectorAll('option').forEach(function (option) { + option.removeAttribute('selected'); + }); + }); + + // Show only the correct user-agent + document.querySelector(`[id='${os_name}_${browser_name}']`).style.display = 'block'; + document.querySelectorAll(`[id='${os_name}_${browser_name}'] > label > span > select`).forEach(function (select) { + select.disabled = false; + select.querySelector('option:first-child').selected = true; + }); + }); +}); + +document.getElementById('personal_ua_select').addEventListener('click', function (e) { + //disable select fields when personal useragent (ua) selected etc... + document.getElementById('personal_ua').disabled = false; + document.getElementById('freetext_ua').disabled = true; + disablePredefinedUA(); +}); + + +document.getElementById('predefined_ua_select').addEventListener('click', function (e) { + document.getElementById('os-type').value = 'desktop'; + document.getElementById('os-type').dispatchEvent(new Event('change')); + document.getElementById('freetext_ua').disabled = true; + document.getElementById('personal_ua').disabled = true; + // Enable predefinded user-agent + let os_type = document.getElementById('os-type'); + os_type.value = 'desktop'; + os_type.dispatchEvent(new Event('change')) +}); + +document.getElementById('freetext_ua_select').addEventListener('click', function (e) { + // Enable freetext user-agent + document.getElementById('freetext_ua').disabled = false; + document.getElementById('personal_ua').disabled = true; + disablePredefinedUA() +}) + +const disablePredefinedUA = function () { + document.getElementById('os-type').disabled = true; + document.getElementById('device-name-mobile').disabled = true; + document.getElementById('os').disabled = true; + document.querySelectorAll('select[name="browser"]').forEach(function (element) { + element.disabled = true; + }); + document.querySelectorAll('select[name="user_agent"]').forEach(function (element) { + element.disabled = true; + }); + +}; + +document.getElementById('os-type').addEventListener('change', function () { + document.getElementById('os-type').disabled = false; + if (this.value === "mobile") { + document.getElementById("mobiles-list").style.display = 'block'; + document.getElementById('device-name-mobile').disabled = false; + + document.getElementById("desktops-list").style.display = 'none'; + document.getElementById('os').disabled = true; + document.querySelectorAll('select[name="browser"]').forEach(function (element) { + element.disabled = true; + }); + document.querySelectorAll('select[name="user_agent"]').forEach(function (element) { + element.disabled = true; + }); + } else { // os-type is desktop + document.getElementById("desktops-list").style.display = 'block'; + document.getElementById('os').disabled = false; + document.querySelectorAll('select[name="browser"]:not([hidden])').forEach(function (element) { + element.disabled = false; + }); + document.querySelectorAll('select[name="user_agent"]:not([hidden])').forEach(function (element) { + element.disabled = false; + }); + document.getElementById("mobiles-list").style.display = 'none'; + document.getElementById('device-name-mobile').disabled = true; + } +}); + +// admin-only report-form +let report_form = document.getElementById("auto-report"); +if (report_form) { // admin is logged in + report_form.addEventListener('change', function() { + let show_form = document.getElementById("auto-report").checked; + if(show_form) { + document.getElementById("collapseMailConfiguration").style.display = "block"; + } else { + document.getElementById("collapseMailConfiguration").style.display = "none"; + } + }); +} + + diff --git a/website/web/templates/capture.html b/website/web/templates/capture.html index a4e6db27..ecae2c44 100644 --- a/website/web/templates/capture.html +++ b/website/web/templates/capture.html @@ -22,7 +22,7 @@ {% block content %}