From c6c49260ef5b014345f805c06ff5f0f531da7456 Mon Sep 17 00:00:00 2001 From: Matthew Raymer Date: Thu, 24 Apr 2025 09:55:01 +0000 Subject: [PATCH] fix: add HTTPS requirement check for camera access - Check for secure context before attempting camera access - Show clear user feedback when HTTPS is required - Prevent confusing permission errors on insecure connections --- src/services/QRScanner/WebDialogQRScanner.ts | 6 ++++++ src/views/ContactQRScanShowView.vue | 13 +++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/services/QRScanner/WebDialogQRScanner.ts b/src/services/QRScanner/WebDialogQRScanner.ts index 996c0867..4af57c7e 100644 --- a/src/services/QRScanner/WebDialogQRScanner.ts +++ b/src/services/QRScanner/WebDialogQRScanner.ts @@ -41,6 +41,12 @@ export class WebDialogQRScanner implements QRScannerService { } async isSupported(): Promise { + // Check for secure context first + if (!window.isSecureContext) { + logger.warn("Camera access requires HTTPS (secure context)"); + return false; + } + // Then check for camera API support return !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia); } diff --git a/src/views/ContactQRScanShowView.vue b/src/views/ContactQRScanShowView.vue index 57a0f065..d8b06d50 100644 --- a/src/views/ContactQRScanShowView.vue +++ b/src/views/ContactQRScanShowView.vue @@ -214,6 +214,19 @@ export default class ContactQRScanShow extends Vue { const scanner = QRScannerFactory.getInstance(); + // Check if scanning is supported first + if (!(await scanner.isSupported())) { + this.error = "Camera access requires HTTPS. Please use a secure connection."; + this.isScanning = false; + this.$notify({ + group: "alert", + type: "warning", + title: "HTTPS Required", + text: "Camera access requires a secure (HTTPS) connection" + }, 5000); + return; + } + // Check permissions first if (!(await scanner.checkPermissions())) { const granted = await scanner.requestPermissions();