/* * public domain * with no warranty of any kind, either expressed or implied. */ package net.i2p.client.naming; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Locale; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; import net.i2p.data.Destination; /** * Simple extension to EepGetNamingService to append what we find to hosts.txt, * so we only have to do an EepGet query once. * * Note that there is little protection - there are a lot of validity checks in addressbook that are * not included here. * * MUST be used from MetaNamingService, after HostsTxtNamingService. * Cannot be used as the only NamingService! Be sure any naming service hosts * are in hosts.txt. If this isn't after HostsTxtNamingService, you will * clog up your hosts.txt with duplicate entries. * * Sample config to put in configadvanced.jsp (restart required): * * i2p.naming.impl=net.i2p.client.naming.MetaNamingService * i2p.nameservicelist=net.i2p.client.naming.HostsTxtNamingService,net.i2p.client.naming.EepGetAndAddNamingService * i2p.naming.eepget.list=http://stats.i2p/cgi-bin/hostquery.cgi?a=,http://i2host.i2p/cgi-bin/i2hostquery? * * @author zzz * @deprecated use HostsTxtNamingService.put() * @since 0.7.9 */ @Deprecated public class EepGetAndAddNamingService extends EepGetNamingService { /** default hosts.txt filename */ private final static String DEFAULT_HOSTS_FILE = "hosts.txt"; public EepGetAndAddNamingService(I2PAppContext context) { super(context); } @Override public Destination lookup(String hostname) { Destination rv = super.lookup(hostname); if (rv != null) { hostname = hostname.toLowerCase(Locale.US); // If it's long, assume it's a key. if (hostname.length() < 516 && hostname.endsWith(".i2p") && ! hostname.endsWith(".b32.i2p")) { File f = new File(_context.getRouterDir(), DEFAULT_HOSTS_FILE); if ( (f.exists()) && (f.canWrite()) ) { synchronized(this) { FileOutputStream fos = null; try { fos = new FileOutputStream(f, true); String line = hostname + '=' + rv.toBase64() + System.getProperty("line.separator"); fos.write(DataHelper.getASCII(line)); } catch (IOException ioe) { System.err.println("Error appending: " + ioe); } finally { if (fos != null) try { fos.close(); } catch (IOException cioe) {} } } } } } return rv; } }