Files
SecureBitChatBrowserExtension/extension-app.js

304 lines
9.5 KiB
JavaScript
Raw Normal View History

// 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();