Files
securebit-chat/test-header.js
2025-10-13 11:13:11 -04:00

576 lines
22 KiB
JavaScript

// src/components/ui/Header.jsx
var EnhancedMinimalHeader = ({
status,
fingerprint,
verificationCode,
onDisconnect,
isConnected,
securityLevel,
webrtcManager
}) => {
const [realSecurityLevel, setRealSecurityLevel] = React.useState(null);
const [lastSecurityUpdate, setLastSecurityUpdate] = React.useState(0);
React.useEffect(() => {
let isUpdating = false;
let lastUpdateAttempt = 0;
const updateRealSecurityStatus = async () => {
const now = Date.now();
if (now - lastUpdateAttempt < 1e4) {
return;
}
if (isUpdating) {
return;
}
isUpdating = true;
lastUpdateAttempt = now;
try {
if (!webrtcManager || !isConnected) {
return;
}
const activeWebrtcManager = webrtcManager;
let realSecurityData = null;
if (typeof activeWebrtcManager.getRealSecurityLevel === "function") {
realSecurityData = await activeWebrtcManager.getRealSecurityLevel();
} else if (typeof activeWebrtcManager.calculateAndReportSecurityLevel === "function") {
realSecurityData = await activeWebrtcManager.calculateAndReportSecurityLevel();
} else {
realSecurityData = await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(activeWebrtcManager);
}
if (realSecurityData && realSecurityData.isRealData !== false) {
const currentScore = realSecurityLevel?.score || 0;
const newScore = realSecurityData.score || 0;
if (currentScore !== newScore || !realSecurityLevel) {
setRealSecurityLevel(realSecurityData);
setLastSecurityUpdate(now);
} else if (window.DEBUG_MODE) {
}
} else {
console.warn(" Security calculation returned invalid data");
}
} catch (error) {
console.error(" Error in real security calculation:", error);
} finally {
isUpdating = false;
}
};
if (isConnected) {
updateRealSecurityStatus();
if (!realSecurityLevel || realSecurityLevel.score < 50) {
const retryInterval = setInterval(() => {
if (!realSecurityLevel || realSecurityLevel.score < 50) {
updateRealSecurityStatus();
} else {
clearInterval(retryInterval);
}
}, 5e3);
setTimeout(() => clearInterval(retryInterval), 3e4);
}
}
const interval = setInterval(updateRealSecurityStatus, 3e4);
return () => clearInterval(interval);
}, [webrtcManager, isConnected]);
React.useEffect(() => {
const handleSecurityUpdate = (event) => {
setTimeout(() => {
setLastSecurityUpdate(0);
}, 100);
};
const handleRealSecurityCalculated = (event) => {
if (event.detail && event.detail.securityData) {
setRealSecurityLevel(event.detail.securityData);
setLastSecurityUpdate(Date.now());
}
};
document.addEventListener("security-level-updated", handleSecurityUpdate);
document.addEventListener("real-security-calculated", handleRealSecurityCalculated);
window.forceHeaderSecurityUpdate = (webrtcManager2) => {
if (webrtcManager2 && window.EnhancedSecureCryptoUtils) {
window.EnhancedSecureCryptoUtils.calculateSecurityLevel(webrtcManager2).then((securityData) => {
if (securityData && securityData.isRealData !== false) {
setRealSecurityLevel(securityData);
setLastSecurityUpdate(Date.now());
console.log("\u2705 Header security level force-updated");
}
}).catch((error) => {
console.error("\u274C Force update failed:", error);
});
} else {
setLastSecurityUpdate(0);
}
};
return () => {
document.removeEventListener("security-level-updated", handleSecurityUpdate);
document.removeEventListener("real-security-calculated", handleRealSecurityCalculated);
};
}, []);
React.useEffect(() => {
setHasActiveSession(true);
setCurrentTimeLeft(0);
setSessionType("premium");
}, []);
React.useEffect(() => {
setHasActiveSession(true);
setCurrentTimeLeft(0);
setSessionType("premium");
}, [sessionTimeLeft]);
React.useEffect(() => {
const handleForceUpdate = (event) => {
setHasActiveSession(true);
setCurrentTimeLeft(0);
setSessionType("premium");
};
const handleConnectionCleaned = () => {
if (window.DEBUG_MODE) {
console.log("\u{1F9F9} Connection cleaned - clearing security data in header");
}
setRealSecurityLevel(null);
setLastSecurityUpdate(0);
setHasActiveSession(false);
setCurrentTimeLeft(0);
setSessionType("unknown");
};
const handlePeerDisconnect = () => {
if (window.DEBUG_MODE) {
console.log("\u{1F44B} Peer disconnect detected - clearing security data in header");
}
setRealSecurityLevel(null);
setLastSecurityUpdate(0);
};
const handleDisconnected = () => {
setRealSecurityLevel(null);
setLastSecurityUpdate(0);
setHasActiveSession(false);
setCurrentTimeLeft(0);
setSessionType("unknown");
};
document.addEventListener("force-header-update", handleForceUpdate);
document.addEventListener("peer-disconnect", handlePeerDisconnect);
document.addEventListener("connection-cleaned", handleConnectionCleaned);
document.addEventListener("disconnected", handleDisconnected);
return () => {
document.removeEventListener("force-header-update", handleForceUpdate);
document.removeEventListener("peer-disconnect", handlePeerDisconnect);
document.removeEventListener("connection-cleaned", handleConnectionCleaned);
document.removeEventListener("disconnected", handleDisconnected);
};
}, []);
const handleSecurityClick = async (event) => {
if (event && (event.button === 2 || event.ctrlKey || event.metaKey)) {
if (onDisconnect && typeof onDisconnect === "function") {
onDisconnect();
return;
}
}
event.preventDefault();
event.stopPropagation();
let realTestResults = null;
if (webrtcManager && window.EnhancedSecureCryptoUtils) {
try {
realTestResults = await window.EnhancedSecureCryptoUtils.calculateSecurityLevel(webrtcManager);
console.log("\u2705 Real security tests completed:", realTestResults);
} catch (error) {
console.error("\u274C Real security tests failed:", error);
}
} else {
console.log("\u26A0\uFE0F Cannot run security tests:", {
webrtcManager: !!webrtcManager,
cryptoUtils: !!window.EnhancedSecureCryptoUtils
});
}
if (!realTestResults && !realSecurityLevel) {
alert("Security verification in progress...\nPlease wait for real-time cryptographic verification to complete.");
return;
}
let securityData = realTestResults || realSecurityLevel;
if (!securityData) {
securityData = {
level: "UNKNOWN",
score: 0,
color: "gray",
verificationResults: {},
timestamp: Date.now(),
details: "Security verification not available",
isRealData: false,
passedChecks: 0,
totalChecks: 0
};
console.log("Using fallback security data:", securityData);
}
let message = `REAL-TIME SECURITY VERIFICATION
`;
message += `Security Level: ${securityData.level} (${securityData.score}%)
`;
message += `Verification Time: ${new Date(securityData.timestamp).toLocaleTimeString()}
`;
message += `Data Source: ${securityData.isRealData ? "Real Cryptographic Tests" : "Simulated Data"}
`;
if (securityData.verificationResults) {
message += "DETAILED CRYPTOGRAPHIC TESTS:\n";
message += "=" + "=".repeat(40) + "\n";
const passedTests = Object.entries(securityData.verificationResults).filter(([key, result]) => result.passed);
const failedTests = Object.entries(securityData.verificationResults).filter(([key, result]) => !result.passed);
if (passedTests.length > 0) {
message += "PASSED TESTS:\n";
passedTests.forEach(([key, result]) => {
const testName = key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase());
message += ` ${testName}: ${result.details || "Test passed"}
`;
});
message += "\n";
}
if (failedTests.length > 0) {
message += "FAILED/UNAVAILABLE TESTS:\n";
failedTests.forEach(([key, result]) => {
const testName = key.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase());
message += ` ${testName}: ${result.details || "Test failed or unavailable"}
`;
});
message += "\n";
}
message += `SUMMARY:
`;
message += `Passed: ${securityData.passedChecks}/${securityData.totalChecks} tests
`;
message += `Score: ${securityData.score}/${securityData.maxPossibleScore || 100} points
`;
}
message += `SECURITY FEATURES STATUS:
`;
message += "=" + "=".repeat(40) + "\n";
if (securityData.verificationResults) {
const features = {
"ECDSA Digital Signatures": securityData.verificationResults.verifyECDSASignatures?.passed || false,
"ECDH Key Exchange": securityData.verificationResults.verifyECDHKeyExchange?.passed || false,
"AES-GCM Encryption": securityData.verificationResults.verifyEncryption?.passed || false,
"Message Integrity (HMAC)": securityData.verificationResults.verifyMessageIntegrity?.passed || false,
"Perfect Forward Secrecy": securityData.verificationResults.verifyPerfectForwardSecrecy?.passed || false,
"Replay Protection": securityData.verificationResults.verifyReplayProtection?.passed || false,
"DTLS Fingerprint": securityData.verificationResults.verifyDTLSFingerprint?.passed || false,
"SAS Verification": securityData.verificationResults.verifySASVerification?.passed || false,
"Metadata Protection": securityData.verificationResults.verifyMetadataProtection?.passed || false,
"Traffic Obfuscation": securityData.verificationResults.verifyTrafficObfuscation?.passed || false
};
Object.entries(features).forEach(([feature, isEnabled]) => {
message += `${isEnabled ? "\u2705" : "\u274C"} ${feature}
`;
});
} else {
message += `\u2705 ECDSA Digital Signatures
`;
message += `\u2705 ECDH Key Exchange
`;
message += `\u2705 AES-GCM Encryption
`;
message += `\u2705 Message Integrity (HMAC)
`;
message += `\u2705 Perfect Forward Secrecy
`;
message += `\u2705 Replay Protection
`;
message += `\u2705 DTLS Fingerprint
`;
message += `\u2705 SAS Verification
`;
message += `\u2705 Metadata Protection
`;
message += `\u2705 Traffic Obfuscation
`;
}
message += `
${securityData.details || "Real cryptographic verification completed"}`;
if (securityData.isRealData) {
message += "\n\n\u2705 This is REAL-TIME verification using actual cryptographic functions.";
} else {
message += "\n\n\u26A0\uFE0F Warning: This data may be simulated. Connection may not be fully established.";
}
const modal = document.createElement("div");
modal.style.cssText = `
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.8);
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
font-family: monospace;
`;
const content = document.createElement("div");
content.style.cssText = `
background: #1a1a1a;
color: #fff;
padding: 20px;
border-radius: 8px;
max-width: 80%;
max-height: 80%;
overflow-y: auto;
white-space: pre-line;
border: 1px solid #333;
`;
content.textContent = message;
modal.appendChild(content);
modal.addEventListener("click", (e) => {
if (e.target === modal) {
document.body.removeChild(modal);
}
});
const handleKeyDown = (e) => {
if (e.key === "Escape") {
document.body.removeChild(modal);
document.removeEventListener("keydown", handleKeyDown);
}
};
document.addEventListener("keydown", handleKeyDown);
document.body.appendChild(modal);
};
const getStatusConfig = () => {
switch (status) {
case "connected":
return {
text: "Connected",
className: "status-connected",
badgeClass: "bg-green-500/10 text-green-400 border-green-500/20"
};
case "verifying":
return {
text: "Verifying...",
className: "status-verifying",
badgeClass: "bg-purple-500/10 text-purple-400 border-purple-500/20"
};
case "connecting":
return {
text: "Connecting...",
className: "status-connecting",
badgeClass: "bg-blue-500/10 text-blue-400 border-blue-500/20"
};
case "retrying":
return {
text: "Retrying...",
className: "status-connecting",
badgeClass: "bg-yellow-500/10 text-yellow-400 border-yellow-500/20"
};
case "failed":
return {
text: "Error",
className: "status-failed",
badgeClass: "bg-red-500/10 text-red-400 border-red-500/20"
};
case "reconnecting":
return {
text: "Reconnecting...",
className: "status-connecting",
badgeClass: "bg-yellow-500/10 text-yellow-400 border-yellow-500/20"
};
case "peer_disconnected":
return {
text: "Peer disconnected",
className: "status-failed",
badgeClass: "bg-orange-500/10 text-orange-400 border-orange-500/20"
};
default:
return {
text: "Not connected",
className: "status-disconnected",
badgeClass: "bg-gray-500/10 text-gray-400 border-gray-500/20"
};
}
};
const config = getStatusConfig();
const displaySecurityLevel = isConnected ? realSecurityLevel || securityLevel : null;
const getSecurityIndicatorDetails = () => {
if (!displaySecurityLevel) {
return {
tooltip: "Security verification in progress...",
isVerified: false,
dataSource: "loading"
};
}
const isRealData = displaySecurityLevel.isRealData !== false;
const baseTooltip = `${displaySecurityLevel.level} (${displaySecurityLevel.score}%)`;
if (isRealData) {
return {
tooltip: `${baseTooltip} - Real-time verification \u2705
Right-click or Ctrl+click to disconnect`,
isVerified: true,
dataSource: "real"
};
} else {
return {
tooltip: `${baseTooltip} - Estimated (connection establishing...)
Right-click or Ctrl+click to disconnect`,
isVerified: false,
dataSource: "estimated"
};
}
};
const securityDetails = getSecurityIndicatorDetails();
React.useEffect(() => {
window.debugHeaderSecurity = () => {
console.log("\u{1F50D} Header Security Debug:", {
realSecurityLevel,
lastSecurityUpdate,
isConnected,
webrtcManagerProp: !!webrtcManager,
windowWebrtcManager: !!window.webrtcManager,
cryptoUtils: !!window.EnhancedSecureCryptoUtils,
displaySecurityLevel,
securityDetails
});
};
return () => {
delete window.debugHeaderSecurity;
};
}, [realSecurityLevel, lastSecurityUpdate, isConnected, webrtcManager, displaySecurityLevel, securityDetails]);
return React.createElement("header", {
className: "header-minimal sticky top-0 z-50"
}, [
React.createElement("div", {
key: "container",
className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"
}, [
React.createElement("div", {
key: "content",
className: "flex items-center justify-between h-16"
}, [
// Logo and Title
React.createElement("div", {
key: "logo-section",
className: "flex items-center space-x-2 sm:space-x-3"
}, [
React.createElement("div", {
key: "logo",
className: "icon-container w-8 h-8 sm:w-10 sm:h-10"
}, [
React.createElement("i", {
className: "fas fa-shield-halved accent-orange text-sm sm:text-base"
})
]),
React.createElement("div", {
key: "title-section"
}, [
React.createElement("h1", {
key: "title",
className: "text-lg sm:text-xl font-semibold text-primary"
}, "SecureBit.chat"),
React.createElement("p", {
key: "subtitle",
className: "text-xs sm:text-sm text-muted hidden sm:block"
}, "End-to-end freedom v4.3.120")
])
]),
// Status and Controls - Responsive
React.createElement("div", {
key: "status-section",
className: "flex items-center space-x-2 sm:space-x-3"
}, [
displaySecurityLevel && React.createElement("div", {
key: "security-level",
className: "hidden md:flex items-center space-x-2 cursor-pointer hover:opacity-80 transition-opacity duration-200",
onClick: handleSecurityClick,
onContextMenu: (e) => {
e.preventDefault();
if (onDisconnect && typeof onDisconnect === "function") {
onDisconnect();
}
},
title: securityDetails.tooltip
}, [
React.createElement("div", {
key: "security-icon",
className: `w-6 h-6 rounded-full flex items-center justify-center relative ${displaySecurityLevel.color === "green" ? "bg-green-500/20" : displaySecurityLevel.color === "orange" ? "bg-orange-500/20" : displaySecurityLevel.color === "yellow" ? "bg-yellow-500/20" : "bg-red-500/20"} ${securityDetails.isVerified ? "" : "animate-pulse"}`
}, [
React.createElement("i", {
className: `fas fa-shield-alt text-xs ${displaySecurityLevel.color === "green" ? "text-green-400" : displaySecurityLevel.color === "orange" ? "text-orange-400" : displaySecurityLevel.color === "yellow" ? "text-yellow-400" : "text-red-400"}`
})
]),
React.createElement("div", {
key: "security-info",
className: "flex flex-col"
}, [
React.createElement("div", {
key: "security-level-text",
className: "text-xs font-medium text-primary flex items-center space-x-1"
}, [
React.createElement("span", {}, `${displaySecurityLevel.level} (${displaySecurityLevel.score}%)`)
]),
React.createElement(
"div",
{
key: "security-details",
className: "text-xs text-muted mt-1 hidden lg:block"
},
securityDetails.dataSource === "real" ? `${displaySecurityLevel.passedChecks || 0}/${displaySecurityLevel.totalChecks || 0} tests` : displaySecurityLevel.details || `Stage ${displaySecurityLevel.stage || 1}`
),
React.createElement("div", {
key: "security-progress",
className: "w-16 h-1 bg-gray-600 rounded-full overflow-hidden"
}, [
React.createElement("div", {
key: "progress-bar",
className: `h-full transition-all duration-500 ${displaySecurityLevel.color === "green" ? "bg-green-400" : displaySecurityLevel.color === "orange" ? "bg-orange-400" : displaySecurityLevel.color === "yellow" ? "bg-yellow-400" : "bg-red-400"}`,
style: { width: `${displaySecurityLevel.score}%` }
})
])
])
]),
// Mobile Security Indicator
displaySecurityLevel && React.createElement("div", {
key: "mobile-security",
className: "md:hidden flex items-center"
}, [
React.createElement("div", {
key: "mobile-security-icon",
className: `w-8 h-8 rounded-full flex items-center justify-center cursor-pointer hover:opacity-80 transition-opacity duration-200 relative ${displaySecurityLevel.color === "green" ? "bg-green-500/20" : displaySecurityLevel.color === "orange" ? "bg-orange-500/20" : displaySecurityLevel.color === "yellow" ? "bg-yellow-500/20" : "bg-red-500/20"} ${securityDetails.isVerified ? "" : "animate-pulse"}`,
title: securityDetails.tooltip,
onClick: handleSecurityClick,
onContextMenu: (e) => {
e.preventDefault();
if (onDisconnect && typeof onDisconnect === "function") {
onDisconnect();
}
}
}, [
React.createElement("i", {
className: `fas fa-shield-alt text-sm ${displaySecurityLevel.color === "green" ? "text-green-400" : displaySecurityLevel.color === "orange" ? "text-orange-400" : displaySecurityLevel.color === "yellow" ? "text-yellow-400" : "text-red-400"}`
})
])
]),
// Status Badge
React.createElement("div", {
key: "status-badge",
className: `px-2 sm:px-3 py-1.5 rounded-lg border ${config.badgeClass} flex items-center space-x-1 sm:space-x-2`
}, [
React.createElement("span", {
key: "status-dot",
className: `status-dot ${config.className}`
}),
React.createElement("span", {
key: "status-text",
className: "text-xs sm:text-sm font-medium"
}, config.text)
]),
// Disconnect Button
isConnected && React.createElement("button", {
key: "disconnect-btn",
onClick: onDisconnect,
className: "p-1.5 sm:px-3 sm:py-1.5 bg-red-500/10 hover:bg-red-500/20 text-red-400 border border-red-500/20 rounded-lg transition-all duration-200 text-sm"
}, [
React.createElement("i", {
className: "fas fa-power-off sm:mr-2"
}),
React.createElement("span", {
className: "hidden sm:inline"
}, "Disconnect")
])
])
])
])
]);
};
window.EnhancedMinimalHeader = EnhancedMinimalHeader;