Changeset b340f4a


Ignore:
Timestamp:
May 12, 2017 5:16:25 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
040af11, 6f60d64
Parents:
93cb2a0
Message:

i2psnark: Better handling of read-only i2psnark dir (ticket #1990)
Prevent add/create/remove/delete
More handling of RuntimeException? via Snark.fatal() in SnarkManager?

Location:
apps/i2psnark/java/src/org/klomp/snark
Files:
3 edited

Legend:

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

    r93cb2a0 rb340f4a  
    12441244          if (storage != null) {
    12451245              try { storage.close(); } catch (IOException ioee) {}
     1246              // clear storage, we have a mess if we have non-null storage and null metainfo,
     1247              // as on restart, Storage.reopen() will throw an ioe
     1248              storage = null;
    12461249          }
    1247           fatal("Could not check or create storage", ioe);
     1250          // TODO we're still in an inconsistent state, won't work if restarted
     1251          // (PeerState "disconnecting seed that connects to seeds"
     1252          fatal("Could not create data files", ioe);
    12481253      }
    12491254  }
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    r93cb2a0 rb340f4a  
    732732    }
    733733
    734     /** null to set initial defaults */
     734    /** @param filename null to set initial defaults */
    735735    public void loadConfig(String filename) {
    736736        synchronized(_configLock) {
     
    897897        _util.setCommentsEnabled(Boolean.parseBoolean(_config.getProperty(PROP_COMMENTS, "true")));
    898898        _util.setCommentsName(_config.getProperty(PROP_COMMENTS_NAME, ""));
    899         getDataDir().mkdirs();
     899        File dd = getDataDir();
     900        if (dd.isDirectory()) {
     901            if (!dd.canWrite())
     902                addMessage(_t("No write permissions for data directory") + ": " + dd);
     903        } else {
     904            if (!dd.mkdirs())
     905                addMessage(_t("Data directory cannot be created") + ": " + dd);
     906        }
    900907        initTrackerMap();
    901908    }
     
    10321039                addMessage(_t("Unreadable") + ": " + dataDir);
    10331040            } else {
     1041                if (!dd.canWrite())
     1042                    addMessage(_t("No write permissions for data directory") + ": " + dataDir);
    10341043                changed = true;
    10351044                interruptMonitor = true;
     
    26412650    /**
    26422651     *  If not connected, thread it, otherwise inline
     2652     *  @throws RuntimeException via Snark.fatal()
    26432653     *  @since 0.9.1
    26442654     */
     
    26552665    /**
    26562666     *  If not connected, thread it, otherwise inline
     2667     *  @throws RuntimeException via Snark.fatal()
    26572668     *  @since 0.9.23
    26582669     */
     
    27022713        public ThreadedStarter(Snark s) { snark = s; }
    27032714        public void run() {
    2704             try {
    2705                 run2();
    2706             } catch (RuntimeException e) {
    2707                 _log.error("Error starting", e);
    2708             }
    2709         }
    2710 
    2711         private void run2() {
    27122715            if (snark != null) {
    2713                 if (snark.isStopped())
    2714                     snark.startTorrent();
     2716                if (snark.isStopped()) {
     2717                    try {
     2718                        snark.startTorrent();
     2719                    } catch (RuntimeException re) {
     2720                        // Snark.fatal() will log and call fatal() here for user message before throwing
     2721                    }
     2722                }
    27152723            } else {
    27162724                startAll();
     
    27252733    private void startAll() {
    27262734        for (Snark snark : _snarks.values()) {
    2727             if (snark.isStopped())
    2728                 snark.startTorrent();
     2735            if (snark.isStopped()) {
     2736                try {
     2737                    snark.startTorrent();
     2738                } catch (RuntimeException re) {
     2739                    // Snark.fatal() will log and call fatal() here for user message before throwing
     2740                }
     2741            }
    27292742        }
    27302743    }
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r93cb2a0 rb340f4a  
    988988                    }
    989989                }
     990                File dd = _manager.getDataDir();
     991                if (!dd.canWrite()) {
     992                    _manager.addMessage(_t("No write permissions for data directory") + ": " + dd);
     993                    return;
     994                }
    990995                if (newURL.startsWith("http://")) {
    991996                    FetchAndAdd fetch = new FetchAndAdd(_context, _manager, newURL, dir);
     
    10461051                                return;
    10471052                            }
    1048                             _manager.stopTorrent(snark, true);
    1049                             // should we delete the torrent file?
    1050                             // yeah, need to, otherwise it'll get autoadded again (at the moment
    10511053                            File f = new File(name);
    1052                             f.delete();
    1053                             _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath()));
     1054                            File dd = _manager.getDataDir();
     1055                            boolean canDelete = dd.canWrite() || !f.exists();
     1056                            _manager.stopTorrent(snark, canDelete);
     1057                            // TODO race here with the DirMonitor, could get re-added
     1058                            if (f.delete()) {
     1059                                _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath()));
     1060                            } else if (f.exists()) {
     1061                                if (!canDelete)
     1062                                    _manager.addMessage(_t("No write permissions for data directory") + ": " + dd);
     1063                                _manager.addMessage(_t("Torrent file could not be deleted: {0}", f.getAbsolutePath()));
     1064                            }
    10541065                            break;
    10551066                        }
     
    10751086                                return;
    10761087                            }
    1077                             _manager.stopTorrent(snark, true);
    10781088                            File f = new File(name);
    1079                             f.delete();
    1080                             _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath()));
     1089                            File dd = _manager.getDataDir();
     1090                            boolean canDelete = dd.canWrite() || !f.exists();
     1091                            _manager.stopTorrent(snark, canDelete);
     1092                            // TODO race here with the DirMonitor, could get re-added
     1093                            if (f.delete()) {
     1094                                _manager.addMessage(_t("Torrent file deleted: {0}", f.getAbsolutePath()));
     1095                            } else if (f.exists()) {
     1096                                if (!canDelete)
     1097                                    _manager.addMessage(_t("No write permissions for data directory") + ": " + dd);
     1098                                _manager.addMessage(_t("Torrent file could not be deleted: {0}", f.getAbsolutePath()));
     1099                                return;
     1100                            }
    10811101                            Storage storage = snark.getStorage();
    10821102                            if (storage == null)
     
    11791199
    11801200                if (baseFile.exists()) {
     1201                    File dd = _manager.getDataDir();
     1202                    if (!dd.canWrite()) {
     1203                        _manager.addMessage(_t("No write permissions for data directory") + ": " + dd);
     1204                        return;
     1205                    }
    11811206                    String torrentName = baseFile.getName();
    11821207                    if (torrentName.toLowerCase(Locale.US).endsWith(".torrent")) {
Note: See TracChangeset for help on using the changeset viewer.