diff options
Diffstat (limited to 'veilith-main.go')
| -rw-r--r-- | veilith-main.go | 328 |
1 files changed, 0 insertions, 328 deletions
diff --git a/veilith-main.go b/veilith-main.go deleted file mode 100644 index 72e5c25..0000000 --- a/veilith-main.go +++ /dev/null @@ -1,328 +0,0 @@ -// cmd/veilith-portable/main.go -package main - -import ( - "fmt" - "log" - "os" - "path/filepath" - "runtime" - - "fyne.io/fyne/v2/app" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/widget" - - "veilith/addressbook" - "veilith/identity" - "veilith/session" - "veilith/transport" - "veilith/transport/mesh" - "veilith/transport/tor" -) - -// PortableApp represents the portable Veilith application -type PortableApp struct { - config *PortableConfig - identity *identity.Identity - addressBook *addressbook.AddressBook - sessionMgr *session.SessionManager - transportMgr *transport.TransportManager -} - -// PortableConfig holds portable mode configuration -type PortableConfig struct { - IsPortable bool - BaseDir string - DataDir string - TorDir string - TempDir string - IdentityPath string - ContactsPath string - ConfigPath string - IsUSB bool - IsNetworkShare bool - Platform string -} - -func main() { - fmt.Println("╔════════════════════════════════════════╗") - fmt.Println("║ VEILITH PORTABLE v0.9 ║") - fmt.Println("║ Privacy-First P2P Messenger ║") - fmt.Println("╚════════════════════════════════════════╝") - fmt.Println() - - // Detect and setup portable mode - config, err := detectPortableMode() - if err != nil { - log.Fatalf("Failed to initialize portable mode: %v", err) - } - - // Display portable status - displayPortableStatus(config) - - // Initialize portable app - portableApp := &PortableApp{ - config: config, - } - - // Setup data directories - if err := portableApp.setupDirectories(); err != nil { - log.Fatalf("Failed to setup directories: %v", err) - } - - // Start GUI - portableApp.startGUI() -} - -// detectPortableMode detects portable environment -func detectPortableMode() (*PortableConfig, error) { - // Get executable location - exe, err := os.Executable() - if err != nil { - return nil, fmt.Errorf("failed to get executable path: %w", err) - } - - baseDir := filepath.Dir(exe) - - config := &PortableConfig{ - IsPortable: true, - BaseDir: baseDir, - DataDir: filepath.Join(baseDir, "data"), - TorDir: filepath.Join(baseDir, "tor"), - TempDir: filepath.Join(baseDir, "temp"), - Platform: runtime.GOOS, - } - - // Set file paths - config.IdentityPath = filepath.Join(config.DataDir, "identity.enc") - config.ContactsPath = filepath.Join(config.DataDir, "contacts.enc") - config.ConfigPath = filepath.Join(config.DataDir, "config.json") - - // Detect if running from USB - config.IsUSB = isRemovableDrive(baseDir) - config.IsNetworkShare = isNetworkPath(baseDir) - - return config, nil -} - -// isRemovableDrive checks if path is on removable media -func isRemovableDrive(path string) bool { - switch runtime.GOOS { - case "windows": - return isWindowsRemovable(path) - case "linux": - return isLinuxRemovable(path) - default: - return false - } -} - -// isWindowsRemovable checks for Windows removable drives -func isWindowsRemovable(path string) bool { - // Simplified check - in production use Windows API - drive := filepath.VolumeName(path) - // Check if drive letter is in typical USB range (E: to Z:) - if len(drive) > 0 { - letter := drive[0] - return letter >= 'E' && letter <= 'Z' - } - return false -} - -// isLinuxRemovable checks for Linux removable media -func isLinuxRemovable(path string) bool { - // Check if path contains /media or /mnt (typical USB mount points) - return filepath.HasPrefix(path, "/media") || - filepath.HasPrefix(path, "/mnt") -} - -// isNetworkPath checks if running from network share -func isNetworkPath(path string) bool { - switch runtime.GOOS { - case "windows": - return filepath.HasPrefix(path, "\\\\") - case "linux": - // Check for NFS/SMB mounts (simplified) - return false - } - return false -} - -// displayPortableStatus shows portable mode information -func displayPortableStatus(config *PortableConfig) { - fmt.Println("📁 Portable Mode Configuration") - fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") - fmt.Printf(" Platform: %s\n", config.Platform) - fmt.Printf(" Base Dir: %s\n", config.BaseDir) - fmt.Printf(" Data Dir: %s\n", config.DataDir) - fmt.Printf(" Running from: ") - - if config.IsUSB { - fmt.Println("USB Drive ✓") - } else if config.IsNetworkShare { - fmt.Println("Network Share ✓") - } else { - fmt.Println("Local Drive") - } - fmt.Println() -} - -// setupDirectories creates required directories -func (pa *PortableApp) setupDirectories() error { - dirs := []string{ - pa.config.DataDir, - pa.config.TorDir, - pa.config.TempDir, - } - - for _, dir := range dirs { - if err := os.MkdirAll(dir, 0700); err != nil { - return fmt.Errorf("failed to create directory %s: %w", dir, err) - } - } - - fmt.Println("✓ Directories initialized") - return nil -} - -// startGUI launches the portable GUI application -func (pa *PortableApp) startGUI() { - myApp := app.New() - myWindow := myApp.NewWindow("Veilith Portable v0.9") - - // Welcome screen - welcomeLabel := widget.NewLabel("Welcome to Veilith Portable") - welcomeLabel.Alignment = fyne.TextAlignCenter - - infoLabel := widget.NewLabel(fmt.Sprintf( - "Running from: %s\nData directory: %s", - pa.config.BaseDir, - pa.config.DataDir, - )) - infoLabel.Wrapping = fyne.TextWrapWord - - // Identity section - var passphraseEntry *widget.Entry - var statusLabel *widget.Label - - statusLabel = widget.NewLabel("No identity loaded") - - passphraseEntry = widget.NewPasswordEntry() - passphraseEntry.SetPlaceHolder("Enter passphrase...") - - // Load/Create identity button - loadBtn := widget.NewButton("Load Identity", func() { - passphrase := passphraseEntry.Text - if passphrase == "" { - statusLabel.SetText("⚠ Please enter a passphrase") - return - } - - // Try to load existing identity - if _, err := os.Stat(pa.config.IdentityPath); err == nil { - id, err := identity.LoadIdentity(pa.config.IdentityPath, []byte(passphrase)) - if err != nil { - statusLabel.SetText("⚠ Failed to load identity (wrong passphrase?)") - return - } - pa.identity = id - statusLabel.SetText("✓ Identity loaded: " + id.GetPublicKeyHex()[:16] + "...") - } else { - // Create new identity - id, err := identity.NewIdentity() - if err != nil { - statusLabel.SetText("⚠ Failed to create identity") - return - } - - if err := id.Save(pa.config.IdentityPath, []byte(passphrase)); err != nil { - statusLabel.SetText("⚠ Failed to save identity") - return - } - - pa.identity = id - statusLabel.SetText("✓ New identity created: " + id.GetPublicKeyHex()[:16] + "...") - } - - // Initialize other components - pa.initializeComponents() - }) - - // Quit button - quitBtn := widget.NewButton("Quit", func() { - pa.cleanup() - myApp.Quit() - }) - - // Layout - content := container.NewVBox( - welcomeLabel, - widget.NewSeparator(), - infoLabel, - widget.NewSeparator(), - widget.NewLabel("Identity Management:"), - passphraseEntry, - loadBtn, - statusLabel, - widget.NewSeparator(), - quitBtn, - ) - - myWindow.SetContent(content) - myWindow.Resize(fyne.NewSize(600, 400)) - myWindow.CenterOnScreen() - myWindow.ShowAndRun() -} - -// initializeComponents initializes core components after identity is loaded -func (pa *PortableApp) initializeComponents() error { - // Initialize session manager - pa.sessionMgr = session.NewSessionManager() - - // Initialize transport manager - pa.transportMgr = transport.NewTransportManager() - - // Try to load address book - if _, err := os.Stat(pa.config.ContactsPath); err == nil { - // Load existing contacts - fmt.Println("✓ Address book loaded") - } else { - // Create new address book - pa.addressBook = addressbook.NewAddressBook() - fmt.Println("✓ New address book created") - } - - fmt.Println("✓ Components initialized") - return nil -} - -// cleanup performs cleanup on application exit -func (pa *PortableApp) cleanup() { - fmt.Println("\n🧹 Cleaning up...") - - // Secure wipe sessions - if pa.sessionMgr != nil { - pa.sessionMgr.SecureWipeAll() - fmt.Println(" ✓ Sessions wiped") - } - - // Close transports - if pa.transportMgr != nil { - pa.transportMgr.Close() - fmt.Println(" ✓ Transports closed") - } - - // Wipe identity from memory - if pa.identity != nil { - pa.identity.SecureWipe() - fmt.Println(" ✓ Identity wiped from memory") - } - - // Clean temp directory - if pa.config.TempDir != "" { - os.RemoveAll(pa.config.TempDir) - fmt.Println(" ✓ Temp files removed") - } - - fmt.Println("✓ Cleanup complete") -} |
