Changeset 87439e1


Ignore:
Timestamp:
Sep 14, 2011 1:06:03 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
46481fb
Parents:
bd06a447
Message:
  • i2psnark:
    • Add refresh time option
    • Add public file permissions option (ticket #501)
    • Fix configuration of tunnel parameters (ticket #524)
    • Allow changing I2CP parameters while tunnel is open
    • Remove duplicated options in I2CP options string
    • Don't open tunnel when saving config
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java

    rbd06a447 r87439e1  
    4545 */
    4646public class I2PSnarkUtil {
    47     private I2PAppContext _context;
    48     private Log _log;
     47    private final I2PAppContext _context;
     48    private final Log _log;
    4949   
    5050    private boolean _shouldProxy;
     
    5353    private String _i2cpHost;
    5454    private int _i2cpPort;
    55     private Map<String, String> _opts;
     55    private final Map<String, String> _opts;
    5656    private I2PSocketManager _manager;
    5757    private boolean _configured;
     
    6060    private int _maxUpBW;
    6161    private int _maxConnections;
    62     private File _tmpDir;
     62    private final File _tmpDir;
    6363    private int _startupDelay;
    6464    private boolean _shouldUseOT;
     65    private boolean _areFilesPublic;
     66    private String _openTrackerString;
    6567    private DHT _dht;
    6668
    6769    public static final int DEFAULT_STARTUP_DELAY = 3;
    68     public static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
    6970    public static final boolean DEFAULT_USE_OPENTRACKERS = true;
    70     public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers";
    7171    public static final String DEFAULT_OPENTRACKERS = "http://tracker.welterde.i2p/a";
    7272    public static final int DEFAULT_MAX_UP_BW = 8;  //KBps
    7373    public static final int MAX_CONNECTIONS = 16; // per torrent
    74     private static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
     74    public static final String PROP_MAX_BW = "i2cp.outboundBytesPerSecond";
    7575    //private static final boolean ENABLE_DHT = true;
    7676
     
    126126        if (opts != null)
    127127            _opts.putAll(opts);
     128        // this updates the session options and tells the router
     129        setMaxUpBW(_maxUpBW);
    128130        _configured = true;
    129131    }
     
    135137   
    136138    /**
     139     *  This updates the session options and tells the router
    137140     *  @param limit KBps
    138141     */
     
    176179    public int getStartupDelay() { return _startupDelay; } 
    177180 
     181    /** @since 0.8.9 */
     182    public boolean getFilesPublic() { return _areFilesPublic; }
     183 
     184    /** @since 0.8.9 */
     185    public void setFilesPublic(boolean yes) { _areFilesPublic = yes; }
     186
    178187    /**
    179188     * Connect to the router, if we aren't already
     
    434443    /** @param ot non-null */
    435444    public void setOpenTrackerString(String ot) {
    436         _opts.put(PROP_OPENTRACKERS, ot);
     445        _openTrackerString = ot;
    437446    }
    438447
    439448    public String getOpenTrackerString() {
    440         String rv = (String) _opts.get(PROP_OPENTRACKERS);
    441         if (rv == null)
     449        if (_openTrackerString == null)
    442450            return DEFAULT_OPENTRACKERS;
    443         return rv;
     451        return _openTrackerString;
    444452    }
    445453
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    rbd06a447 r87439e1  
    44import java.io.FileFilter;
    55import java.io.FileInputStream;
     6import java.io.FileOutputStream;
    67import java.io.FilenameFilter;
    78import java.io.IOException;
     
    7273
    7374    private static final String CONFIG_FILE = "i2psnark.config";
     75    public static final String PROP_FILES_PUBLIC = "i2psnark.filesPublic";
    7476    public static final String PROP_AUTO_START = "i2snark.autoStart";   // oops
    7577    public static final String DEFAULT_AUTO_START = "false";
    76     public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
    77     public static final String DEFAULT_LINK_PREFIX = "file:///";
     78    //public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
     79    //public static final String DEFAULT_LINK_PREFIX = "file:///";
    7880    public static final String PROP_STARTUP_DELAY = "i2psnark.startupDelay";
     81    public static final String PROP_REFRESH_DELAY = "i2psnark.refreshSeconds";
    7982    public static final String PROP_THEME = "i2psnark.theme";
    8083    public static final String DEFAULT_THEME = "ubergine";
     84    private static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
     85    public static final String PROP_OPENTRACKERS = "i2psnark.opentrackers";
    8186
    8287    public static final int MIN_UP_BW = 2;
    8388    public static final int DEFAULT_MAX_UP_BW = 10;
    8489    public static final int DEFAULT_STARTUP_DELAY = 3;
     90    public static final int DEFAULT_REFRESH_DELAY_SECS = 60;
     91
    8592    private SnarkManager() {
    8693        _snarks = new ConcurrentHashMap();
     
    137144    }
    138145   
     146    /**
     147     *  @return default false
     148     *  @since 0.8.9
     149     */
     150    public boolean areFilesPublic() {
     151        return Boolean.valueOf(_config.getProperty(PROP_FILES_PUBLIC)).booleanValue();
     152    }
     153
    139154    public boolean shouldAutoStart() {
    140         return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START+"")).booleanValue();
    141     }
     155        return Boolean.valueOf(_config.getProperty(PROP_AUTO_START, DEFAULT_AUTO_START)).booleanValue();
     156    }
     157
     158/****
    142159    public String linkPrefix() {
    143160        return _config.getProperty(PROP_LINK_PREFIX, DEFAULT_LINK_PREFIX + getDataDir().getAbsolutePath() + File.separatorChar);
    144161    }
     162****/
     163
     164    /**
     165     *  @return -1 for never
     166     *  @since 0.8.9
     167     */
     168    public int getRefreshDelaySeconds() {
     169        try {
     170            return Integer.parseInt(_config.getProperty(PROP_REFRESH_DELAY));
     171        } catch (NumberFormatException nfe) {
     172            return DEFAULT_REFRESH_DELAY_SECS;
     173        }
     174    }
     175
    145176    private int getStartupDelayMinutes() {
    146         return Integer.valueOf(_config.getProperty(PROP_STARTUP_DELAY)).intValue();
    147     }
     177        try {
     178            return Integer.parseInt(_config.getProperty(PROP_STARTUP_DELAY));
     179        } catch (NumberFormatException nfe) {
     180            return DEFAULT_STARTUP_DELAY;
     181        }
     182    }
     183
    148184    public File getDataDir() {
    149185        String dir = _config.getProperty(PROP_DIR, "i2psnark");
    150         File f = new SecureDirectory(dir);
    151         if (!f.isAbsolute())
    152             f = new SecureDirectory(_context.getAppDir(), dir);
     186        File f;
     187        if (areFilesPublic())
     188            f = new File(dir);
     189        else
     190            f = new SecureDirectory(dir);
     191        if (!f.isAbsolute()) {
     192            if (areFilesPublic())
     193                f = new File(_context.getAppDir(), dir);
     194            else
     195                f = new SecureDirectory(_context.getAppDir(), dir);
     196        }
    153197        return f;
    154198    }
     
    188232        if (!_config.containsKey(PROP_AUTO_START))
    189233            _config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START);
     234        if (!_config.containsKey(PROP_REFRESH_DELAY))
     235            _config.setProperty(PROP_REFRESH_DELAY, Integer.toString(DEFAULT_REFRESH_DELAY_SECS));
    190236        if (!_config.containsKey(PROP_STARTUP_DELAY))
    191             _config.setProperty(PROP_STARTUP_DELAY, "" + DEFAULT_STARTUP_DELAY);
     237            _config.setProperty(PROP_STARTUP_DELAY, Integer.toString(DEFAULT_STARTUP_DELAY));
    192238        if (!_config.containsKey(PROP_THEME))
    193239            _config.setProperty(PROP_THEME, DEFAULT_THEME);
     
    259305        _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
    260306        _util.setStartupDelay(getInt(PROP_STARTUP_DELAY, DEFAULT_STARTUP_DELAY));
    261         String ot = _config.getProperty(I2PSnarkUtil.PROP_OPENTRACKERS);
     307        _util.setFilesPublic(areFilesPublic());
     308        String ot = _config.getProperty(PROP_OPENTRACKERS);
    262309        if (ot != null)
    263310            _util.setOpenTrackerString(ot);
    264         String useOT = _config.getProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS);
     311        String useOT = _config.getProperty(PROP_USE_OPENTRACKERS);
    265312        boolean bOT = useOT == null || Boolean.valueOf(useOT).booleanValue();
    266313        _util.setUseOpenTrackers(bOT);
     
    279326    }
    280327   
    281     public void updateConfig(String dataDir, boolean autoStart, String startDelay, String seedPct, String eepHost,
     328    public void updateConfig(String dataDir, boolean filesPublic, boolean autoStart, String refreshDelay,
     329                             String startDelay, String seedPct, String eepHost,
    282330                             String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
    283331                             String upLimit, String upBW, boolean useOpenTrackers, String openTrackers, String theme) {
     
    334382                            _config.setProperty(PROP_STARTUP_DELAY, "" + minutes);
    335383                            addMessage(_("Startup delay changed to {0}", DataHelper.formatDuration2(minutes * 60 * 1000)));
    336                         }
    337 
     384                }
    338385        }
    339         // FIXME do this even if == null
    340         if (i2cpHost != null) {
     386
     387        if (refreshDelay != null) {
     388            try {
     389                int secs = Integer.parseInt(refreshDelay);
     390                if (secs != getRefreshDelaySeconds()) {
     391                    changed = true;
     392                    _config.setProperty(PROP_REFRESH_DELAY, refreshDelay);
     393                    if (secs >= 0)
     394                        addMessage(_("Refresh time changed to {0}", DataHelper.formatDuration2(secs * 1000)));
     395                    else
     396                        addMessage(_("Refresh disabled"));
     397                }
     398            } catch (NumberFormatException nfe) {}
     399        }
     400
     401        // Start of I2CP stuff.
     402        // i2cpHost will generally be null since it is hidden from the form if in router context.
     403
    341404            int oldI2CPPort = _util.getI2CPPort();
    342405            String oldI2CPHost = _util.getI2CPHost();
     
    345408                try { port = Integer.parseInt(i2cpPort); } catch (NumberFormatException nfe) {}
    346409            }
    347             String host = oldI2CPHost;
    348             Map opts = new HashMap();
     410
     411            Map<String, String> opts = new HashMap();
    349412            if (i2cpOpts == null) i2cpOpts = "";
    350413            StringTokenizer tok = new StringTokenizer(i2cpOpts, " \t\n");
     
    355418                    opts.put(pair.substring(0, split), pair.substring(split+1));
    356419            }
    357             Map oldOpts = new HashMap();
     420            Map<String, String> oldOpts = new HashMap();
    358421            String oldI2CPOpts = _config.getProperty(PROP_I2CP_OPTS);
    359422            if (oldI2CPOpts == null) oldI2CPOpts = "";
     
    366429            }
    367430           
    368             if ( (i2cpHost.trim().length() > 0) && (port > 0) &&
    369                  ((!host.equals(i2cpHost) ||
    370                   (port != _util.getI2CPPort()) ||
    371                   (!oldOpts.equals(opts)))) ) {
     431            boolean reconnect = i2cpHost != null && i2cpHost.trim().length() > 0 && port > 0 &&
     432                                (port != _util.getI2CPPort() || !oldI2CPHost.equals(i2cpHost));
     433            if (reconnect || !oldOpts.equals(opts)) {
    372434                boolean snarksActive = false;
    373                 Set names = listTorrentFiles();
    374                 for (Iterator iter = names.iterator(); iter.hasNext(); ) {
    375                     Snark snark = getTorrent((String)iter.next());
    376                     if ( (snark != null) && (!snark.isStopped()) ) {
    377                         snarksActive = true;
    378                         break;
     435                if (reconnect) {
     436                    for (Snark snark : _snarks.values()) {
     437                        if (!snark.isStopped()) {
     438                            snarksActive = true;
     439                            break;
     440                        }
    379441                    }
    380442                }
     443                if (_log.shouldLog(Log.DEBUG))
     444                    _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
     445                               + "] oldOpts [" + oldOpts + "]");
    381446                if (snarksActive) {
    382447                    Properties p = new Properties();
     
    385450                    _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
    386451                    addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents"));
    387                     if (_log.shouldLog(Log.DEBUG))
    388                         _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts
    389                                    + "] oldOpts [" + oldOpts + "]");
     452                } else if (!reconnect) {
     453                    // The usual case, the other two are if not in router context
     454                    _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim());
     455                    addMessage(_("I2CP options changed to {0}", i2cpOpts));
     456                    _util.setI2CPConfig(oldI2CPHost, oldI2CPPort, opts);
    390457                } else {
    391458                    if (_util.connected()) {
     
    393460                        addMessage(_("Disconnecting old I2CP destination"));
    394461                    }
    395                     Properties p = new Properties();
    396                     p.putAll(opts);
    397                     addMessage(_("I2CP settings changed to {0}", i2cpHost + ":" + port + " (" + i2cpOpts.trim() + ")"));
    398                     _util.setI2CPConfig(i2cpHost, port, p);
     462                    addMessage(_("I2CP settings changed to {0}", i2cpHost + ':' + port + ' ' + i2cpOpts));
     463                    _util.setI2CPConfig(i2cpHost, port, opts);
    399464                    _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
    400465                    boolean ok = _util.connect();
     
    410475                        _config.setProperty(PROP_I2CP_PORT, "" + port);
    411476                        _config.setProperty(PROP_I2CP_OPTS, i2cpOpts.trim());
    412                         changed = true;
    413477                        // no PeerAcceptors/I2PServerSockets to deal with, since all snarks are inactive
    414                         for (Iterator iter = names.iterator(); iter.hasNext(); ) {
    415                             String name = (String)iter.next();
    416                             Snark snark = getTorrent(name);
    417                             if (snark != null && snark.restartAcceptor()) {
     478                        for (Snark snark : _snarks.values()) {
     479                            if (snark.restartAcceptor()) {
    418480                                addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName()));
    419481                            }
     
    422484                }
    423485                changed = true;
    424             }
    425         }
     486            }  // reconnect || changed options
     487
     488        if (areFilesPublic() != filesPublic) {
     489            _config.setProperty(PROP_FILES_PUBLIC, Boolean.toString(filesPublic));
     490            _util.setFilesPublic(filesPublic);
     491            if (filesPublic)
     492                addMessage(_("New files will be publicly readable"));
     493            else
     494                addMessage(_("New files will not be publicly readable"));
     495            changed = true;
     496        }
     497
    426498        if (shouldAutoStart() != autoStart) {
    427             _config.setProperty(PROP_AUTO_START, autoStart + "");
     499            _config.setProperty(PROP_AUTO_START, Boolean.toString(autoStart));
    428500            if (autoStart)
    429501                addMessage(_("Enabled autostart"));
     
    433505        }
    434506        if (_util.shouldUseOpenTrackers() != useOpenTrackers) {
    435             _config.setProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS, useOpenTrackers + "");
     507            _config.setProperty(PROP_USE_OPENTRACKERS, useOpenTrackers + "");
    436508            if (useOpenTrackers)
    437509                addMessage(_("Enabled open trackers - torrent restart required to take effect."));
     
    443515        if (openTrackers != null) {
    444516            if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) {
    445                 _config.setProperty(I2PSnarkUtil.PROP_OPENTRACKERS, openTrackers.trim());
     517                _config.setProperty(PROP_OPENTRACKERS, openTrackers.trim());
    446518                _util.setOpenTrackerString(openTrackers);
    447519                addMessage(_("Open Tracker list changed - torrent restart required to take effect."));
     
    490562     * @return Snark or null
    491563     */
    492     public Snark getTorrent(String filename) { synchronized (_snarks) { return (Snark)_snarks.get(filename); } }
     564    public Snark getTorrent(String filename) { synchronized (_snarks) { return _snarks.get(filename); } }
    493565
    494566    /**
     
    724796            saveTorrentStatus(metainfo, bitfield, null); // no file priorities
    725797            try {
    726                 locked_writeMetaInfo(metainfo, filename);
     798                locked_writeMetaInfo(metainfo, filename, areFilesPublic());
    727799                // hold the lock for a long time
    728800                addTorrent(filename, dontAutoStart);
     
    755827                return;
    756828            }
    757             SecureFileOutputStream.setPerms(new File(filename));
     829            if (!areFilesPublic())
     830                SecureFileOutputStream.setPerms(new File(filename));
    758831            // hold the lock for a long time
    759832            addTorrent(filename);
     
    770843     * @since 0.8.4
    771844     */
    772     private static void locked_writeMetaInfo(MetaInfo metainfo, String filename) throws IOException {
     845    private static void locked_writeMetaInfo(MetaInfo metainfo, String filename, boolean areFilesPublic) throws IOException {
    773846        File file = new File(filename);
    774847        if (file.exists())
     
    776849        OutputStream out = null;
    777850        try {
    778             out = new SecureFileOutputStream(filename);
     851            if (areFilesPublic)
     852                out = new FileOutputStream(filename);
     853            else
     854                out = new SecureFileOutputStream(filename);
    779855            out.write(metainfo.getTorrentData());
    780856        } catch (IOException ioe) {
     
    11711247                    meta = meta.reannounce(announce);
    11721248                synchronized (_snarks) {
    1173                     locked_writeMetaInfo(meta, name);
     1249                    locked_writeMetaInfo(meta, name, areFilesPublic());
    11741250                    // put it in the list under the new name
    11751251                    _snarks.remove(snark.getName());
  • apps/i2psnark/java/src/org/klomp/snark/Storage.java

    rbd06a447 r87439e1  
    4949
    5050  private final StorageListener listener;
    51   private I2PSnarkUtil _util;
     51  private final I2PSnarkUtil _util;
    5252
    5353  private /* FIXME final FIXME */ BitField bitfield; // BitField to represent the pieces
     
    434434  public void check(String rootDir, long savedTime, BitField savedBitField) throws IOException
    435435  {
    436     File base = new SecureFile(rootDir, filterName(metainfo.getName()));
     436    File base;
     437    boolean areFilesPublic = _util.getFilesPublic();
     438    if (areFilesPublic)
     439        base = new File(rootDir, filterName(metainfo.getName()));
     440    else
     441        base = new SecureFile(rootDir, filterName(metainfo.getName()));
    437442    boolean useSavedBitField = savedTime > 0 && savedBitField != null;
    438443
     
    480485          {
    481486            List<String> path = files.get(i);
    482             File f = createFileFromNames(base, path);
     487            File f = createFileFromNames(base, path, areFilesPublic);
    483488            // dup file name check after filtering
    484489            for (int j = 0; j < i; j++) {
     
    496501                        lastPath = '_' + lastPath;
    497502                    path.set(last, lastPath);
    498                     f = createFileFromNames(base, path);
     503                    f = createFileFromNames(base, path, areFilesPublic);
    499504                    j = 0;
    500505                }
     
    586591   *  in intermediate path elements after filtering.
    587592   */
    588   private static File createFileFromNames(File base, List<String> names) throws IOException
     593  private static File createFileFromNames(File base, List<String> names, boolean areFilesPublic) throws IOException
    589594  {
    590595    File f = null;
     
    596601          {
    597602            // Another dir in the hierarchy.
    598             f = new File(base, name);
     603            if (areFilesPublic)
     604                f = new File(base, name);
     605            else
     606                f = new SecureFile(base, name);
    599607            if (!f.mkdir() && !f.isDirectory())
    600608              throw new IOException("Could not create directory " + f);
     
    604612          {
    605613            // The final element (file) in the hierarchy.
    606             f = new SecureFile(base, name);
     614            if (areFilesPublic)
     615                f = new File(base, name);
     616            else
     617                f = new SecureFile(base, name);
    607618            if (!f.createNewFile() && !f.exists())
    608619              throw new IOException("Could not create file " + f);
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    rbd06a447 r87439e1  
    3434import net.i2p.util.I2PAppThread;
    3535import net.i2p.util.Log;
    36 import net.i2p.util.SecureFileOutputStream;
    3736
    3837import org.klomp.snark.I2PSnarkUtil;
     
    209208                                         
    210209        // we want it to go to the base URI so we don't refresh with some funky action= value
    211         if (!isConfigure)
    212             out.write("<meta http-equiv=\"refresh\" content=\"60;/i2psnark/" + peerString + "\">\n");
     210        if (!isConfigure) {
     211            int delay = _manager.getRefreshDelaySeconds();
     212            if (delay > 0)
     213                out.write("<meta http-equiv=\"refresh\" content=\"" + delay + ";/i2psnark/" + peerString + "\">\n");
     214        }
    213215        out.write(HEADER_A + _themePath + HEADER_B);
    214216        out.write("</head><body>");
     
    612614        } else if ("Save".equals(action)) {
    613615            String dataDir = req.getParameter("dataDir");
     616            boolean filesPublic = req.getParameter("filesPublic") != null;
    614617            boolean autoStart = req.getParameter("autoStart") != null;
    615618            String seedPct = req.getParameter("seedPct");
     
    621624            String upLimit = req.getParameter("upLimit");
    622625            String upBW = req.getParameter("upBW");
     626            String refreshDel = req.getParameter("refreshDelay");
    623627            String startupDel = req.getParameter("startupDelay");
    624628            boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
    625629            String openTrackers = req.getParameter("openTrackers");
    626630            String theme = req.getParameter("theme");
    627             _manager.updateConfig(dataDir, autoStart, startupDel, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers, theme);
     631            _manager.updateConfig(dataDir, filesPublic, autoStart, refreshDel, startupDel,
     632                                  seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts,
     633                                  upLimit, upBW, useOpenTrackers, openTrackers, theme);
    628634        } else if ("Create".equals(action)) {
    629635            String baseData = req.getParameter("baseFile");
     
    12601266                  "title=\"");
    12611267        out.write(_("Specify custom tracker announce URL"));
    1262         out.write("\" > ");
    1263         out.write("<input type=\"submit\" value=\"");
     1268        out.write("\" > " +
     1269                  "<input type=\"submit\" value=\"");
    12641270        out.write(_("Create torrent"));
    1265         out.write("\" name=\"foo\" ></table>\n");
    1266         out.write("</form></div></div>");       
     1271        out.write("\" name=\"foo\" ></table>\n" +
     1272                  "</form></div></div>");       
    12671273    }
    12681274   
     1275    private static final int[] times = { 30, 60, 2*60, 5*60, 10*60, 30*60, -1 };
     1276
    12691277    private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
    12701278        String dataDir = _manager.getDataDir().getAbsolutePath();
     1279        boolean filesPublic = _manager.areFilesPublic();
    12711280        boolean autoStart = _manager.shouldAutoStart();
    12721281        boolean useOpenTrackers = _manager.util().shouldUseOpenTrackers();
     
    12741283        //int seedPct = 0;
    12751284       
    1276         out.write("<form action=\"/i2psnark/configure\" method=\"POST\">\n");
    1277         out.write("<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n");
    1278         out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
    1279         out.write("<input type=\"hidden\" name=\"action\" value=\"Save\" >\n");
    1280         out.write("<span class=\"snarkConfigTitle\">");
    1281         out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
     1285        out.write("<form action=\"/i2psnark/configure\" method=\"POST\">\n" +
     1286                  "<div class=\"configsectionpanel\"><div class=\"snarkConfig\">\n" +
     1287                  "<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n" +
     1288                  "<input type=\"hidden\" name=\"action\" value=\"Save\" >\n" +
     1289                  "<span class=\"snarkConfigTitle\">" +
     1290                  "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
    12821291        out.write(_("Configuration"));
    1283         out.write("</span><hr>\n");
    1284         out.write("<table border=\"0\"><tr><td>");
     1292        out.write("</span><hr>\n"   +
     1293                  "<table border=\"0\"><tr><td>");
    12851294
    12861295        out.write(_("Data directory"));
    12871296        out.write(": <td><code>" + dataDir + "</code> <i>(");
    12881297        out.write(_("Edit i2psnark.config and restart to change"));
    1289         out.write(")</i><br>\n");
    1290 
    1291         out.write("<tr><td>");
     1298        out.write(")</i><br>\n" +
     1299
     1300                  "<tr><td>");
     1301        out.write(_("Files readable by all"));
     1302        out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"filesPublic\" value=\"true\" "
     1303                  + (filesPublic ? "checked " : "")
     1304                  + "title=\"");
     1305        out.write(_("If checked, other users may access the downloaded files"));
     1306        out.write("\" >" +
     1307
     1308                  "<tr><td>");
    12921309        out.write(_("Auto start"));
    12931310        out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"autoStart\" value=\"true\" "
     
    12951312                  + "title=\"");
    12961313        out.write(_("If checked, automatically start torrents that are added"));
    1297         out.write("\" >");
    1298 
    1299         out.write("<tr><td>");
     1314        out.write("\" >" +
     1315
     1316                  "<tr><td>");
    13001317        out.write(_("Theme"));
    13011318        out.write(": <td><select name='theme'>");
     
    13081325                out.write("\n<OPTION value=\"" + themes[i] + "\">" + themes[i]);
    13091326        }
    1310         out.write("</select>\n");
    1311 
    1312         out.write("<tr><td>");
     1327        out.write("</select>\n" +
     1328
     1329                  "<tr><td>");
     1330        out.write(_("Refresh time"));
     1331        out.write(": <td><select name=\"refreshDelay\">");
     1332        int delay = _manager.getRefreshDelaySeconds();
     1333        for (int i = 0; i < times.length; i++) {
     1334            out.write("<option value=\"");
     1335            out.write(Integer.toString(times[i]));
     1336            out.write("\"");
     1337            if (times[i] == delay)
     1338                out.write(" selected=\"true\"");
     1339            out.write(">");
     1340            if (times[i] > 0)
     1341                out.write(DataHelper.formatDuration2(times[i] * 1000));
     1342            else
     1343                out.write(_("Never"));
     1344            out.write("</option>\n");
     1345        }
     1346        out.write("</select><br>" +
     1347
     1348                  "<tr><td>");
    13131349        out.write(_("Startup delay"));
    13141350        out.write(": <td><input name=\"startupDelay\" size=\"3\" class=\"r\" value=\"" + _manager.util().getStartupDelay() + "\"> ");
     
    13411377                  + _manager.util().getMaxUploaders() + "\" size=\"3\" maxlength=\"3\" > ");
    13421378        out.write(_("peers"));
    1343         out.write("<br>\n");
    1344 
    1345         out.write("<tr><td>");
     1379        out.write("<br>\n" +
     1380
     1381                  "<tr><td>");
    13461382        out.write(_("Up bandwidth limit"));
    13471383        out.write(": <td><input type=\"text\" name=\"upBW\" class=\"r\" value=\""
     
    13501386        out.write(" <a href=\"/config.jsp\" target=\"blank\">");
    13511387        out.write(_("View or change router bandwidth"));
    1352         out.write("</a>)</i><br>\n");
     1388        out.write("</a>)</i><br>\n" +
    13531389       
    1354         out.write("<tr><td>");
     1390                  "<tr><td>");
    13551391        out.write(_("Use open trackers also"));
    13561392        out.write(": <td><input type=\"checkbox\" class=\"optbox\" name=\"useOpenTrackers\" value=\"true\" "
     
    13581394                  + "title=\"");
    13591395        out.write(_("If checked, announce torrents to open trackers as well as the tracker listed in the torrent file"));
    1360         out.write("\" > ");
    1361 
    1362         out.write("<tr><td>");
     1396        out.write("\" > " +
     1397
     1398                  "<tr><td>");
    13631399        out.write(_("Open tracker announce URLs"));
    13641400        out.write(": <td><input type=\"text\" name=\"openTrackers\" value=\""
     
    13891425            out.write(_("I2CP host"));
    13901426            out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\""
    1391                       + _manager.util().getI2CPHost() + "\" size=\"15\" > ");
    1392 
    1393             out.write("<tr><td>");
     1427                      + _manager.util().getI2CPHost() + "\" size=\"15\" > " +
     1428
     1429                      "<tr><td>");
    13941430            out.write(_("I2CP port"));
    13951431            out.write(": <td><input type=\"text\" name=\"i2cpPort\" class=\"r\" value=\"" +
     
    13971433        }
    13981434
     1435        options.remove(I2PSnarkUtil.PROP_MAX_BW);
     1436        // was accidentally in the I2CP options prior to 0.8.9 so it will be in old config files
     1437        options.remove(SnarkManager.PROP_OPENTRACKERS);
    13991438        StringBuilder opts = new StringBuilder(64);
    1400         for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
    1401             Map.Entry entry = (Map.Entry)iter.next();
    1402             String key = (String)entry.getKey();
    1403             String val = (String)entry.getValue();
     1439        for (Map.Entry<String, String> e : options.entrySet()) {
     1440            String key = e.getKey();
     1441            String val = e.getValue();
    14041442            opts.append(key).append('=').append(val).append(' ');
    14051443        }
     
    14071445        out.write(_("I2CP options"));
    14081446        out.write(": <td><textarea name=\"i2cpOpts\" cols=\"60\" rows=\"1\" wrap=\"off\" spellcheck=\"false\" >"
    1409                   + opts.toString() + "</textarea><br>\n");
    1410 
    1411         out.write("<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
     1447                  + opts.toString() + "</textarea><br>\n" +
     1448
     1449                  "<tr><td>&nbsp;<td><input type=\"submit\" value=\"");
    14121450        out.write(_("Save configuration"));
    1413         out.write("\" name=\"foo\" >\n");
    1414         out.write("</table></div></div></form>");
     1451        out.write("\" name=\"foo\" >\n" +
     1452                  "</table></div></div></form>");
    14151453    }
    14161454   
    14171455    private void writeConfigLink(PrintWriter out) throws IOException {
    1418         out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
    1419         out.write("<span class=\"snarkConfigTitle\"><a href=\"configure\">");
    1420         out.write("<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
     1456        out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n" +
     1457                  "<span class=\"snarkConfigTitle\"><a href=\"configure\">" +
     1458                  "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "config.png\"> ");
    14211459        out.write(_("Configuration"));
    14221460        out.write("</a></span></span></div>\n");
  • history.txt

    rbd06a447 r87439e1  
     12011-09-14 zzz
     2  * Console: Verify valid host/IP before saving on net config form
     3  * i2psnark:
     4    - Add refresh time option
     5    - Add public file permissions option (ticket #501)
     6    - Fix configuration of tunnel parameters (ticket #524)
     7    - Allow changing I2CP parameters while tunnel is open
     8    - Remove duplicated options in I2CP options string
     9    - Don't open tunnel when saving config
     10  * IRC DCC: Fix conn limit options
     11  * Router: Set permissions on router.ping file
     12
    1132011-09-13 kytv
    214  * Update i2prouter script
  • router/java/src/net/i2p/router/RouterVersion.java

    rbd06a447 r87439e1  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 17;
     21    public final static long BUILD = 18;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.