304 lines
9.5 KiB
JavaScript
304 lines
9.5 KiB
JavaScript
// Adapted SecureBit Chat App for Browser Extension
|
|
// This is a simplified version of the main app adapted for extension use
|
|
|
|
class SecureBitExtensionApp {
|
|
constructor() {
|
|
this.isExtension = true;
|
|
this.cryptoUtils = null;
|
|
this.webrtcManager = null;
|
|
this.currentChannel = null;
|
|
this.isConnected = false;
|
|
this.initializeApp();
|
|
}
|
|
|
|
async initializeApp() {
|
|
try {
|
|
// Initialize crypto utilities
|
|
await this.initializeCrypto();
|
|
|
|
// Initialize WebRTC manager
|
|
await this.initializeWebRTC();
|
|
|
|
// Set up extension-specific event listeners
|
|
this.setupExtensionListeners();
|
|
|
|
console.log('SecureBit Extension App initialized');
|
|
|
|
} catch (error) {
|
|
console.error('Failed to initialize SecureBit Extension App:', error);
|
|
}
|
|
}
|
|
|
|
async initializeCrypto() {
|
|
// Load and initialize crypto utilities
|
|
try {
|
|
// Import the crypto utilities (you'll need to adapt the import for extension)
|
|
if (typeof EnhancedSecureCryptoUtils !== 'undefined') {
|
|
this.cryptoUtils = EnhancedSecureCryptoUtils;
|
|
} else {
|
|
// Fallback crypto implementation for extension
|
|
this.cryptoUtils = new ExtensionCryptoUtils();
|
|
}
|
|
} catch (error) {
|
|
console.error('Crypto initialization error:', error);
|
|
this.cryptoUtils = new ExtensionCryptoUtils();
|
|
}
|
|
}
|
|
|
|
async initializeWebRTC() {
|
|
// Initialize WebRTC manager for extension
|
|
try {
|
|
if (typeof EnhancedSecureWebRTCManager !== 'undefined') {
|
|
this.webrtcManager = new EnhancedSecureWebRTCManager();
|
|
} else {
|
|
this.webrtcManager = new ExtensionWebRTCManager();
|
|
}
|
|
} catch (error) {
|
|
console.error('WebRTC initialization error:', error);
|
|
this.webrtcManager = new ExtensionWebRTCManager();
|
|
}
|
|
}
|
|
|
|
setupExtensionListeners() {
|
|
// Listen for messages from popup and content scripts
|
|
if (typeof chrome !== 'undefined' && chrome.runtime) {
|
|
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
|
|
this.handleExtensionMessage(request, sender, sendResponse);
|
|
return true;
|
|
});
|
|
}
|
|
}
|
|
|
|
async handleExtensionMessage(request, sender, sendResponse) {
|
|
try {
|
|
switch (request.action) {
|
|
case 'createChannel':
|
|
const channelId = await this.createChannel();
|
|
sendResponse({ success: true, data: { channelId } });
|
|
break;
|
|
|
|
case 'joinChannel':
|
|
const result = await this.joinChannel(request.data.channelId);
|
|
sendResponse({ success: true, data: result });
|
|
break;
|
|
|
|
case 'sendMessage':
|
|
await this.sendMessage(request.data.message);
|
|
sendResponse({ success: true });
|
|
break;
|
|
|
|
case 'getConnectionStatus':
|
|
sendResponse({ success: true, data: { connected: this.isConnected } });
|
|
break;
|
|
|
|
case 'disconnect':
|
|
await this.disconnect();
|
|
sendResponse({ success: true });
|
|
break;
|
|
|
|
default:
|
|
sendResponse({ success: false, error: 'Unknown action' });
|
|
}
|
|
} catch (error) {
|
|
console.error('Extension message handling error:', error);
|
|
sendResponse({ success: false, error: error.message });
|
|
}
|
|
}
|
|
|
|
async createChannel() {
|
|
try {
|
|
// Generate a new channel ID
|
|
const channelId = this.generateChannelId();
|
|
|
|
// Initialize WebRTC connection
|
|
await this.webrtcManager.createOffer();
|
|
|
|
this.currentChannel = channelId;
|
|
this.isConnected = true;
|
|
|
|
// Notify all connected components
|
|
this.notifyComponents('channelCreated', { channelId });
|
|
|
|
return channelId;
|
|
|
|
} catch (error) {
|
|
console.error('Create channel error:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async joinChannel(channelId) {
|
|
try {
|
|
// Join existing channel
|
|
await this.webrtcManager.joinChannel(channelId);
|
|
|
|
this.currentChannel = channelId;
|
|
this.isConnected = true;
|
|
|
|
// Notify all connected components
|
|
this.notifyComponents('channelJoined', { channelId });
|
|
|
|
return { success: true, channelId };
|
|
|
|
} catch (error) {
|
|
console.error('Join channel error:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async sendMessage(message) {
|
|
try {
|
|
if (!this.isConnected) {
|
|
throw new Error('Not connected to any channel');
|
|
}
|
|
|
|
// Encrypt the message
|
|
const encryptedMessage = await this.cryptoUtils.encryptMessage(message);
|
|
|
|
// Send via WebRTC
|
|
await this.webrtcManager.sendMessage(encryptedMessage);
|
|
|
|
// Notify components
|
|
this.notifyComponents('messageSent', { message, encrypted: true });
|
|
|
|
} catch (error) {
|
|
console.error('Send message error:', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async disconnect() {
|
|
try {
|
|
if (this.webrtcManager) {
|
|
await this.webrtcManager.disconnect();
|
|
}
|
|
|
|
this.isConnected = false;
|
|
this.currentChannel = null;
|
|
|
|
// Notify components
|
|
this.notifyComponents('disconnected', {});
|
|
|
|
} catch (error) {
|
|
console.error('Disconnect error:', error);
|
|
}
|
|
}
|
|
|
|
notifyComponents(event, data) {
|
|
// Send notifications to popup and content scripts
|
|
if (typeof chrome !== 'undefined' && chrome.runtime) {
|
|
chrome.runtime.sendMessage({
|
|
action: 'notifyComponents',
|
|
event: event,
|
|
data: data
|
|
});
|
|
}
|
|
}
|
|
|
|
generateChannelId() {
|
|
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
|
|
}
|
|
}
|
|
|
|
// Extension-specific crypto utilities
|
|
class ExtensionCryptoUtils {
|
|
async encryptMessage(message) {
|
|
// Simplified encryption for extension
|
|
// In a real implementation, you'd use the full crypto suite
|
|
const encoder = new TextEncoder();
|
|
const data = encoder.encode(message);
|
|
const key = await crypto.subtle.generateKey(
|
|
{ name: 'AES-GCM', length: 256 },
|
|
true,
|
|
['encrypt', 'decrypt']
|
|
);
|
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
const encrypted = await crypto.subtle.encrypt(
|
|
{ name: 'AES-GCM', iv: iv },
|
|
key,
|
|
data
|
|
);
|
|
return {
|
|
encrypted: Array.from(new Uint8Array(encrypted)),
|
|
iv: Array.from(iv),
|
|
keyId: 'temp'
|
|
};
|
|
}
|
|
|
|
async decryptMessage(encryptedData) {
|
|
// Simplified decryption for extension
|
|
const key = await crypto.subtle.generateKey(
|
|
{ name: 'AES-GCM', length: 256 },
|
|
true,
|
|
['encrypt', 'decrypt']
|
|
);
|
|
const decrypted = await crypto.subtle.decrypt(
|
|
{ name: 'AES-GCM', iv: new Uint8Array(encryptedData.iv) },
|
|
key,
|
|
new Uint8Array(encryptedData.encrypted)
|
|
);
|
|
const decoder = new TextDecoder();
|
|
return decoder.decode(decrypted);
|
|
}
|
|
}
|
|
|
|
// Extension-specific WebRTC manager
|
|
class ExtensionWebRTCManager {
|
|
constructor() {
|
|
this.peerConnection = null;
|
|
this.dataChannel = null;
|
|
}
|
|
|
|
async createOffer() {
|
|
// Simplified WebRTC implementation for extension
|
|
this.peerConnection = new RTCPeerConnection({
|
|
iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]
|
|
});
|
|
|
|
this.dataChannel = this.peerConnection.createDataChannel('securebit');
|
|
this.dataChannel.onopen = () => {
|
|
console.log('Data channel opened');
|
|
};
|
|
this.dataChannel.onmessage = (event) => {
|
|
this.handleMessage(event.data);
|
|
};
|
|
}
|
|
|
|
async joinChannel(channelId) {
|
|
// Simplified channel joining for extension
|
|
console.log('Joining channel:', channelId);
|
|
}
|
|
|
|
async sendMessage(message) {
|
|
if (this.dataChannel && this.dataChannel.readyState === 'open') {
|
|
this.dataChannel.send(JSON.stringify(message));
|
|
} else {
|
|
throw new Error('Data channel not ready');
|
|
}
|
|
}
|
|
|
|
handleMessage(data) {
|
|
try {
|
|
const message = JSON.parse(data);
|
|
// Notify the app about received message
|
|
if (typeof window !== 'undefined' && window.secureBitApp) {
|
|
window.secureBitApp.handleReceivedMessage(message);
|
|
}
|
|
} catch (error) {
|
|
console.error('Message handling error:', error);
|
|
}
|
|
}
|
|
|
|
async disconnect() {
|
|
if (this.dataChannel) {
|
|
this.dataChannel.close();
|
|
}
|
|
if (this.peerConnection) {
|
|
this.peerConnection.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
// Initialize the extension app
|
|
window.secureBitApp = new SecureBitExtensionApp();
|