public void initialize(PluginInterface _plugin_interface) { plugin_interface = _plugin_interface; log = plugin_interface.getLogger().getTimeStampedChannel("UPnP"); log.setDiagnostic(); log.setForce(true); UIManager ui_manager = plugin_interface.getUIManager(); final BasicPluginViewModel model = ui_manager.createBasicPluginViewModel("UPnP"); model.setConfigSectionID(UPNP_PLUGIN_CONFIGSECTION_ID); BasicPluginConfigModel upnp_config = ui_manager.createBasicPluginConfigModel( ConfigSection.SECTION_PLUGINS, UPNP_PLUGIN_CONFIGSECTION_ID); // NATPMP BasicPluginConfigModel natpmp_config = ui_manager.createBasicPluginConfigModel( UPNP_PLUGIN_CONFIGSECTION_ID, NATPMP_PLUGIN_CONFIGSECTION_ID); natpmp_config.addLabelParameter2("natpmp.info"); ActionParameter natpmp_wiki = natpmp_config.addActionParameter2("Utils.link.visit", "MainWindow.about.internet.wiki"); natpmp_wiki.setStyle(ActionParameter.STYLE_LINK); natpmp_wiki.addListener( new ParameterListener() { public void parameterChanged(Parameter param) { try { plugin_interface.getUIManager().openURL(new URL("http://wiki.vuze.com/w/NATPMP")); } catch (Throwable e) { e.printStackTrace(); } } }); natpmp_enable_param = natpmp_config.addBooleanParameter2("natpmp.enable", "natpmp.enable", false); nat_pmp_router = natpmp_config.addStringParameter2("natpmp.routeraddress", "natpmp.routeraddress", ""); natpmp_enable_param.addListener( new ParameterListener() { public void parameterChanged(Parameter param) { setNATPMPEnableState(); } }); natpmp_enable_param.addEnabledOnSelection(nat_pmp_router); // UPNP upnp_config.addLabelParameter2("upnp.info"); upnp_config.addHyperlinkParameter2("upnp.wiki_link", "http://wiki.vuze.com/w/UPnP"); upnp_enable_param = upnp_config.addBooleanParameter2("upnp.enable", "upnp.enable", true); grab_ports_param = upnp_config.addBooleanParameter2("upnp.grabports", "upnp.grabports", false); release_mappings_param = upnp_config.addBooleanParameter2("upnp.releasemappings", "upnp.releasemappings", true); ActionParameter refresh_param = upnp_config.addActionParameter2("upnp.refresh.label", "upnp.refresh.button"); refresh_param.addListener( new ParameterListener() { public void parameterChanged(Parameter param) { UPnPPlugin.this.refreshMappings(); } }); // Auto-refresh mappings every minute when enabled. final BooleanParameter auto_refresh_on_bad_nat_param = upnp_config.addBooleanParameter2( "upnp.refresh_on_bad_nat", "upnp.refresh_mappings_on_bad_nat", false); plugin_interface .getUtilities() .createTimer("upnp mapping auto-refresh", true) .addPeriodicEvent( 1 * 60 * 1000, new UTTimerEventPerformer() { private long last_bad_nat = 0; public void perform(UTTimerEvent event) { if (upnp == null) { return; } if (!auto_refresh_on_bad_nat_param.getValue()) { return; } if (!upnp_enable_param.getValue()) { return; } int status = plugin_interface.getConnectionManager().getNATStatus(); if (status == ConnectionManager.NAT_BAD) { // Only try to refresh the mappings if this is the first bad NAT // message we've been given in the last 15 minutes - we don't want // to endlessly retry performing the mappings long now = plugin_interface.getUtilities().getCurrentSystemTime(); if (last_bad_nat + (15 * 60 * 1000) < now) { last_bad_nat = now; log.log( LoggerChannel.LT_WARNING, "NAT status is firewalled - trying to refresh UPnP mappings"); refreshMappings(true); } } } }); upnp_config.addLabelParameter2("blank.resource"); alert_success_param = upnp_config.addBooleanParameter2("upnp.alertsuccess", "upnp.alertsuccess", false); alert_other_port_param = upnp_config.addBooleanParameter2( "upnp.alertothermappings", "upnp.alertothermappings", true); alert_device_probs_param = upnp_config.addBooleanParameter2( "upnp.alertdeviceproblems", "upnp.alertdeviceproblems", true); selected_interfaces_param = upnp_config.addStringParameter2("upnp.selectedinterfaces", "upnp.selectedinterfaces", ""); selected_addresses_param = upnp_config.addStringParameter2("upnp.selectedaddresses", "upnp.selectedaddresses", ""); ignore_bad_devices = upnp_config.addBooleanParameter2("upnp.ignorebaddevices", "upnp.ignorebaddevices", true); ignored_devices_list = upnp_config.addLabelParameter2("upnp.ignorebaddevices.info"); ActionParameter reset_param = upnp_config.addActionParameter2( "upnp.ignorebaddevices.reset", "upnp.ignorebaddevices.reset.action"); reset_param.addListener( new ParameterListener() { public void parameterChanged(Parameter param) { PluginConfig pc = plugin_interface.getPluginconfig(); for (int i = 0; i < STATS_KEYS.length; i++) { String key = "upnp.device.stats." + STATS_KEYS[i]; pc.setPluginMapParameter(key, new HashMap()); } pc.setPluginMapParameter("upnp.device.ignorelist", new HashMap()); updateIgnoreList(); } }); trace_to_log = upnp_config.addBooleanParameter2("upnp.trace_to_log", "upnp.trace_to_log", false); final boolean enabled = upnp_enable_param.getValue(); upnp_enable_param.addEnabledOnSelection(alert_success_param); upnp_enable_param.addEnabledOnSelection(grab_ports_param); upnp_enable_param.addEnabledOnSelection(refresh_param); upnp_enable_param.addEnabledOnSelection(alert_other_port_param); upnp_enable_param.addEnabledOnSelection(alert_device_probs_param); upnp_enable_param.addEnabledOnSelection(release_mappings_param); upnp_enable_param.addEnabledOnSelection(selected_interfaces_param); upnp_enable_param.addEnabledOnSelection(selected_addresses_param); upnp_enable_param.addEnabledOnSelection(ignore_bad_devices); upnp_enable_param.addEnabledOnSelection(ignored_devices_list); upnp_enable_param.addEnabledOnSelection(reset_param); upnp_enable_param.addEnabledOnSelection(trace_to_log); natpmp_enable_param.setEnabled(enabled); model.getStatus().setText(enabled ? "Running" : "Disabled"); upnp_enable_param.addListener( new ParameterListener() { public void parameterChanged(Parameter p) { boolean e = upnp_enable_param.getValue(); natpmp_enable_param.setEnabled(e); model.getStatus().setText(e ? "Running" : "Disabled"); if (e) { startUp(); } else { closeDown(true); } setNATPMPEnableState(); } }); model.getActivity().setVisible(false); model.getProgress().setVisible(false); log.addListener( new LoggerChannelListener() { public void messageLogged(int type, String message) { model.getLogArea().appendText(message + "\n"); } public void messageLogged(String str, Throwable error) { model.getLogArea().appendText(error.toString() + "\n"); } }); // startup() used to be called on initializationComplete() // Moved to delayed task because rootDeviceFound can take // a lot of CPU cycle. Let's hope nothing breaks DelayedTask dt = plugin_interface .getUtilities() .createDelayedTask( new Runnable() { public void run() { if (enabled) { updateIgnoreList(); startUp(); } } }); dt.queue(); plugin_interface.addListener( new PluginListener() { public void initializationComplete() {} public void closedownInitiated() { if (services.size() == 0) { plugin_interface.getPluginconfig().setPluginParameter("plugin.info", ""); } } public void closedownComplete() { closeDown(true); } }); }
protected void startUp() { if (upnp != null) { // already started up, must have been re-enabled refreshMappings(); return; } final LoggerChannel core_log = plugin_interface.getLogger().getChannel("UPnP Core"); try { upnp = UPnPFactory.getSingleton( new UPnPAdapter() { Set exception_traces = new HashSet(); public SimpleXMLParserDocument parseXML(String data) throws SimpleXMLParserDocumentException { return (plugin_interface .getUtilities() .getSimpleXMLParserDocumentFactory() .create(data)); } public ResourceDownloaderFactory getResourceDownloaderFactory() { return (plugin_interface.getUtilities().getResourceDownloaderFactory()); } public UTTimer createTimer(String name) { return (plugin_interface.getUtilities().createTimer(name, true)); } public void createThread(String name, Runnable runnable) { plugin_interface.getUtilities().createThread(name, runnable); } public Comparator getAlphanumericComparator() { return (plugin_interface .getUtilities() .getFormatters() .getAlphanumericComparator(true)); } public void trace(String str) { core_log.log(str); if (trace_to_log.getValue()) { upnp_log_listener.log(str); } } public void log(Throwable e) { String nested = Debug.getNestedExceptionMessage(e); if (!exception_traces.contains(nested)) { exception_traces.add(nested); if (exception_traces.size() > 128) { exception_traces.clear(); } core_log.log(e); } else { core_log.log(nested); } } public void log(String str) { log.log(str); } public String getTraceDir() { return (plugin_interface.getUtilities().getAzureusUserDir()); } }, getSelectedInterfaces()); upnp.addRootDeviceListener(this); upnp_log_listener = new UPnPLogListener() { public void log(String str) { log.log(str); } public void logAlert(String str, boolean error, int type) { boolean logged = false; if (alert_device_probs_param.getValue()) { if (type == UPnPLogListener.TYPE_ALWAYS) { log.logAlertRepeatable( error ? LoggerChannel.LT_ERROR : LoggerChannel.LT_WARNING, str); logged = true; } else { boolean do_it = false; if (type == UPnPLogListener.TYPE_ONCE_EVER) { byte[] fp = plugin_interface .getUtilities() .getSecurityManager() .calculateSHA1(str.getBytes()); String key = "upnp.alert.fp." + plugin_interface .getUtilities() .getFormatters() .encodeBytesToString(fp); PluginConfig pc = plugin_interface.getPluginconfig(); if (!pc.getPluginBooleanParameter(key, false)) { pc.setPluginParameter(key, true); do_it = true; } } else { do_it = true; } if (do_it) { log.logAlert(error ? LoggerChannel.LT_ERROR : LoggerChannel.LT_WARNING, str); logged = true; } } } if (!logged) { log.log(str); } } }; upnp.addLogListener(upnp_log_listener); mapping_manager.addListener( new UPnPMappingManagerListener() { public void mappingAdded(UPnPMapping mapping) { addMapping(mapping); } }); UPnPMapping[] upnp_mappings = mapping_manager.getMappings(); for (int i = 0; i < upnp_mappings.length; i++) { addMapping(upnp_mappings[i]); } setNATPMPEnableState(); } catch (Throwable e) { log.log(e); } }
protected RPReply processRequestSupport( RPRequest request, RPRequestAccessController access_controller) { try { RPObject object = request.getObject(); String method = request.getMethod(); if (object == null && method.equals("getSingleton")) { RPObject pi = request.createRemotePluginInterface(plugin_interface); RPReply reply = new RPReply(pi); return (reply); } else if (object == null && method.equals("getDownloads")) { RPPluginInterface pi = request.createRemotePluginInterface(plugin_interface); // short cut method for quick access to downloads // used by GTS RPObject dm = (RPObject) pi._process(new RPRequest(null, "getDownloadManager", null)).getResponse(); RPReply rep = dm._process(new RPRequest(null, "getDownloads", null)); rep.setProperty("azureus_name", pi.azureus_name); rep.setProperty("azureus_version", pi.azureus_version); return (rep); } else if (object == null) { throw new RPNoObjectIDException(); } else { // System.out.println( "Request: con = " + request.getConnectionId() + ", req = " + // request.getRequestId() + ", client = " + // request.getClientIP()); object = RPObject._lookupLocal(object._getOID()); // _setLocal synchronizes the RP objects with their underlying // plugin objects object._setLocal(); if (method.equals("_refresh")) { RPReply reply = new RPReply(object); return (reply); } else { String name = object._getName(); if (access_controller != null) { access_controller.checkAccess(name, request); } RPReply reply = object._process(request); if (name.equals("IPFilter") && method.equals("setInRangeAddressesAreAllowed[boolean]") && request.getClientIP() != null) { String client_ip = request.getClientIP(); // problem here, if someone changes the mode here they'll lose their // connection coz they'll be denied access :) boolean b = ((Boolean) request.getParams()[0]).booleanValue(); LoggerChannel[] channels = plugin_interface.getLogger().getChannels(); IPFilter filter = plugin_interface.getIPFilter(); if (b) { if (filter.isInRange(client_ip)) { // we gotta add the client's address range for (int i = 0; i < channels.length; i++) { channels[i].log( LoggerChannel.LT_INFORMATION, "Adding range for client '" + client_ip + "' as allow/deny flag changed to allow"); } filter.createAndAddRange( "auto-added for remote interface", client_ip, client_ip, false); filter.save(); plugin_interface.getPluginconfig().save(); } } else { IPRange[] ranges = filter.getRanges(); for (int i = 0; i < ranges.length; i++) { if (ranges[i].isInRange(client_ip)) { for (int j = 0; j < channels.length; j++) { channels[j].log( LoggerChannel.LT_INFORMATION, "deleting range '" + ranges[i].getStartIP() + "-" + ranges[i].getEndIP() + "' for client '" + client_ip + "' as allow/deny flag changed to deny"); } ranges[i].delete(); } } filter.save(); plugin_interface.getPluginconfig().save(); } } return (reply); } } } catch (RPException e) { return (new RPReply(e)); } catch (Exception e) { throw new RPInternalProcessException(e); } }