/* * Created on Sep 02, 2005 * * This file is part of susidns project, see http://susi.i2p/ * * Copyright (C) 2005 <susi23@mail.i2p> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Revision: 1.3 $ */ package i2p.susi.dns; import java.io.ByteArrayInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.List; import net.i2p.data.DataHelper; import net.i2p.util.PortMapper; import net.i2p.util.SecureFileOutputStream; public class SubscriptionsBean extends BaseBean { private String fileName, content; private static final String SUBS_FILE = "subscriptions.txt"; // If you change this, change in Addressbook Daemon also private static final String DEFAULT_SUB = "http://i2p-projekt.i2p/hosts.txt"; public String getFileName() { loadConfig(); fileName = subsFile().toString(); return fileName; } /** * @since 0.9.13 */ private File subsFile() { return new File(addressbookDir(), SUBS_FILE); } private void reloadSubs() { synchronized(SubscriptionsBean.class) { locked_reloadSubs(); } } private void locked_reloadSubs() { File file = subsFile(); if(file.isFile()) { StringBuilder buf = new StringBuilder(); BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String line; while( ( line = br.readLine() ) != null ) { buf.append( line ); buf.append( "\n" ); } content = buf.toString(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (br != null) try { br.close(); } catch (IOException ioe) {} } } else { content = DEFAULT_SUB; } } private void save() { synchronized(SubscriptionsBean.class) { locked_save(); } } private void locked_save() { File file = subsFile(); try { // trim and sort List<String> urls = new ArrayList<String>(); InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8")); String line; while ((line = DataHelper.readLine(in)) != null) { line = line.trim(); if (line.length() > 0) urls.add(line); } Collections.sort(urls); PrintWriter out = new PrintWriter(new OutputStreamWriter(new SecureFileOutputStream(file), "UTF-8")); for (String url : urls) { out.println(url); } out.close(); if (out.checkError()) throw new IOException("Failed write to " + file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String getMessages() { String message = ""; if( action != null ) { if (_context.getBooleanProperty(PROP_PW_ENABLE) || (serial != null && serial.equals(lastSerial))) { if (action.equals(_t("Save"))) { save(); /******* String nonce = System.getProperty("addressbook.nonce"); if (nonce != null) { // Yes this is a hack. // No it doesn't work on a text-mode browser. // Fetching from the addressbook servlet // with the correct parameters will kick off a // config reload and fetch. *******/ if (content != null && content.length() > 2 && _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) > 0) { message = _t("Subscriptions saved, updating addressbook from subscription sources now."); // + "<img height=\"1\" width=\"1\" alt=\"\" " + // "src=\"/addressbook/?wakeup=1&nonce=" + nonce + "\">"; _context.namingService().requestUpdate(null); } else { message = _t("Subscriptions saved."); } } else if (action.equals(_t("Reload"))) { reloadSubs(); message = _t("Subscriptions reloaded."); } } else { message = _t("Invalid form submission, probably because you used the \"back\" or \"reload\" button on your browser. Please resubmit.") + ' ' + _t("If the problem persists, verify that you have cookies enabled in your browser."); } } if( message.length() > 0 ) message = "<p class=\"messages\">" + message + "</p>"; return message; } public void setContent(String content) { // will come from form with \r\n line endings this.content = DataHelper.stripHTML(content); } public String getContent() { if( content != null ) return content; reloadSubs(); return content; } }