package org.limewire.net; import java.io.File; import java.util.concurrent.atomic.AtomicBoolean; import org.limewire.i18n.I18nMarker; import org.limewire.inject.EagerSingleton; import org.limewire.lifecycle.Asynchronous; import org.limewire.lifecycle.Service; import org.limewire.util.OSUtils; import org.limewire.util.SystemUtils; import com.google.inject.Inject; @EagerSingleton public class FirewallServiceImpl implements FirewallService, Service { public static final File LIMEWIRE_EXE_FILE = new File("LimeWire.exe").getAbsoluteFile(); /** The name of this program, "LimeWire". */ private static String name = "LimeWire"; private AtomicBoolean needsCleanup = new AtomicBoolean(false); @Inject void register(org.limewire.lifecycle.ServiceRegistry registry) { registry.register(this); // TODO .in("Stage") ??? } @Override public String getServiceName() { return I18nMarker.marktr("Firewall Manager"); } @Override @Asynchronous (daemon = false) // TODO is daemon = false correct? public void stop() { if(needsCleanup.get()) { if (!OSUtils.isWindows()) return; // Get the path of this running instance, like "C:\Program Files\LimeWire\LimeWire.exe" String path = SystemUtils.getRunningPath(); // Only do something if the LimeWire Windows launcher ran, not Java in a development environment if (!path.equalsIgnoreCase(LIMEWIRE_EXE_FILE.getPath())) return; // Only remove our listing if it's there if (SystemUtils.isProgramListedOnFirewall(path)) { SystemUtils.removeProgramFromFirewall(path); } } } public boolean isProgrammaticallyConfigurable() { if(!OSUtils.isWindows() || !SystemUtils.isFirewallPresent() || !SystemUtils.isFirewallEnabled()) return false; String path = SystemUtils.getRunningPath(); return path.equalsIgnoreCase(LIMEWIRE_EXE_FILE.getPath()); } /** * Add ourselves to the firewall exceptions list. * This will let code in this process listen on a socket without the firewall showing the user a security warning. * Call this method on startup before the program listens on a socket. * Unlike UPnP, this returns quickly and works very reliably. * * Returns true if this is added (or already on) the firewall exception list. */ public boolean addToFirewall() { if (!OSUtils.isWindows()) return false; // Get the path of this running instance, like "C:\Program Files\LimeWire\LimeWire.exe" String path = SystemUtils.getRunningPath(); if (path == null) return false; // Only add us if the LimeWire Windows launcher ran, not Java in a development environment if (!path.equalsIgnoreCase(LIMEWIRE_EXE_FILE.getAbsolutePath())) return false; // Only add a listing for us if the Windows Firewall Exceptions list doesn't have one yet if (SystemUtils.isProgramListedOnFirewall(path)) return true; if(SystemUtils.addProgramToFirewall(path, name)) { needsCleanup.set(true); return true; } return false; } @Override public void initialize() { } @Override public void start() { } }