Ticket #20310: 20310.2.diff

File 20310.2.diff, 8.5 KB (added by Bjoeni, 5 years ago)
  • src/org/openstreetmap/josm/gui/io/importexport/ImageImporter.java

     
    88import java.util.ArrayList;
    99import java.util.Arrays;
    1010import java.util.Collections;
     11import java.util.EnumSet;
    1112import java.util.HashSet;
    1213import java.util.List;
    1314import java.util.Set;
     15import java.util.regex.Matcher;
     16import java.util.regex.Pattern;
    1417import java.util.stream.Collectors;
    1518
    1619import javax.imageio.ImageIO;
     
    1922import org.openstreetmap.josm.gui.layer.GpxLayer;
    2023import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
    2124import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     25import org.openstreetmap.josm.io.CachedFile;
    2226import org.openstreetmap.josm.io.IllegalDataException;
    2327
    2428/**
     
    2630 * @since 17548
    2731 */
    2832public class ImageImporter extends FileImporter {
     33
     34    /** Check if the filename starts with a borked path ({@link java.io.File#File} drops consecutive {@code /} characters). */
     35    private static final Pattern URL_START_BAD = Pattern.compile("^(https?:/)([^/].*)$");
     36    /** Check for the beginning of a "good" url */
     37    private static final Pattern URL_START_GOOD = Pattern.compile("^https?://.*$");
     38
    2939    private GpxLayer gpx;
    3040
    3141    /**
     
    90100        try {
    91101            List<File> files = new ArrayList<>();
    92102            Set<String> visitedDirs = new HashSet<>();
    93             addRecursiveFiles(files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
     103            addRecursiveFiles(this.options, files, visitedDirs, sel, progressMonitor.createSubTaskMonitor(1, true));
    94104
    95105            if (progressMonitor.isCanceled())
    96106                return;
     
    106116
    107117    static void addRecursiveFiles(List<File> files, Set<String> visitedDirs, List<File> sel, ProgressMonitor progressMonitor)
    108118            throws IOException {
     119        addRecursiveFiles(EnumSet.noneOf(Options.class), files, visitedDirs, sel, progressMonitor);
     120    }
    109121
     122    static void addRecursiveFiles(Set<Options> options, List<File> files, Set<String> visitedDirs, List<File> sel,
     123            ProgressMonitor progressMonitor) throws IOException {
     124
    110125        if (progressMonitor.isCanceled())
    111126            return;
    112127
     
    117132                    if (visitedDirs.add(f.getCanonicalPath())) { // Do not loop over symlinks
    118133                        File[] dirFiles = f.listFiles(); // Can be null for some strange directories (like lost+found)
    119134                        if (dirFiles != null) {
    120                             addRecursiveFiles(files, visitedDirs, Arrays.asList(dirFiles), progressMonitor.createSubTaskMonitor(1, true));
     135                            addRecursiveFiles(options, files, visitedDirs, Arrays.asList(dirFiles),
     136                                    progressMonitor.createSubTaskMonitor(1, true));
    121137                        }
    122138                    } else {
    123139                        progressMonitor.worked(1);
    124140                    }
    125141                } else {
    126                     if (FILE_FILTER.accept(f)) {
     142                    /* Check if the path is a web path, and if so, ensure that it is "correct" */
     143                    final String path = f.getPath();
     144                    Matcher matcherBad = URL_START_BAD.matcher(path);
     145                    final String realPath;
     146                    if (matcherBad.matches()) {
     147                        realPath = matcherBad.replaceFirst(matcherBad.group(1) + "/" + matcherBad.group(2));
     148                    } else {
     149                        realPath = path;
     150                    }
     151                    if (URL_START_GOOD.matcher(realPath).matches() && FILE_FILTER.accept(f)
     152                            && options.contains(Options.ALLOW_WEB_RESOURCES)) {
     153                        try (CachedFile cachedFile = new CachedFile(realPath)) {
     154                            files.add(cachedFile.getFile());
     155                        }
     156                    } else if (FILE_FILTER.accept(f)) {
    127157                        files.add(f);
    128158                    }
    129159                    progressMonitor.worked(1);