Lines 13-30
Link Here
|
13 |
|
13 |
|
14 |
package org.openide.filesystems; |
14 |
package org.openide.filesystems; |
15 |
|
15 |
|
16 |
import org.openide.util.WeakListeners; |
16 |
import java.io.File; |
17 |
import java.io.*; |
17 |
import java.io.FileFilter; |
18 |
import java.net.URLStreamHandler; |
18 |
import java.io.FilenameFilter; |
19 |
import java.net.URL; |
19 |
import java.io.IOException; |
|
|
20 |
import java.io.InputStream; |
21 |
import java.io.OutputStream; |
22 |
import java.io.SyncFailedException; |
20 |
import java.net.MalformedURLException; |
23 |
import java.net.MalformedURLException; |
21 |
import java.net.URI; |
24 |
import java.net.URI; |
22 |
import java.util.*; |
25 |
import java.net.URL; |
23 |
import java.util.jar.*; |
26 |
import java.net.URLStreamHandler; |
|
|
27 |
import java.util.Arrays; |
28 |
import java.util.Enumeration; |
29 |
import java.util.HashMap; |
30 |
import java.util.HashSet; |
31 |
import java.util.Iterator; |
32 |
import java.util.Map; |
33 |
import java.util.Set; |
34 |
import java.util.StringTokenizer; |
35 |
import java.util.WeakHashMap; |
36 |
import java.util.jar.JarEntry; |
37 |
import java.util.jar.JarInputStream; |
38 |
import javax.swing.Icon; |
39 |
import javax.swing.JFileChooser; |
40 |
import javax.swing.filechooser.FileSystemView; |
24 |
import org.openide.ErrorManager; |
41 |
import org.openide.ErrorManager; |
25 |
|
|
|
26 |
import org.openide.util.Utilities; |
27 |
import org.openide.util.NbBundle; |
42 |
import org.openide.util.NbBundle; |
|
|
43 |
import org.openide.util.Utilities; |
28 |
|
44 |
|
29 |
/** Common utilities for handling files. |
45 |
/** Common utilities for handling files. |
30 |
* This is a dummy class; all methods are static. |
46 |
* This is a dummy class; all methods are static. |
Lines 930-936
Link Here
|
930 |
} |
946 |
} |
931 |
} else { |
947 |
} else { |
932 |
// On Unix, do not want to traverse symlinks. |
948 |
// On Unix, do not want to traverse symlinks. |
933 |
file = new File(file.toURI().normalize()).getAbsoluteFile(); |
949 |
if (file.getAbsolutePath().equals("/..")) { // NOI18N |
|
|
950 |
// Special treatment. |
951 |
file = new File("/"); // NOI18N |
952 |
} else { |
953 |
// URI.normalize removes ../ and ./ sequences nicely. |
954 |
file = new File(file.toURI().normalize()).getAbsoluteFile(); |
955 |
} |
934 |
} |
956 |
} |
935 |
return file; |
957 |
return file; |
936 |
} |
958 |
} |
Lines 1082-1087
Link Here
|
1082 |
return index != -1 && index > urlPath.lastIndexOf('/'); |
1104 |
return index != -1 && index > urlPath.lastIndexOf('/'); |
1083 |
} |
1105 |
} |
1084 |
} |
1106 |
} |
|
|
1107 |
|
1108 |
/** |
1109 |
* Make sure that a JFileChooser does not traverse symlinks on Unix. |
1110 |
* @see <a href="http://www.netbeans.org/issues/show_bug.cgi?id=46014">Issue #46014</a> |
1111 |
* @see <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4906607">JRE bug #4906607</a> |
1112 |
* @since XXX |
1113 |
*/ |
1114 |
public static void preventFileChooserSymlinkTraversal(JFileChooser jfc) { |
1115 |
if (!Utilities.isWindows()) { |
1116 |
jfc.setCurrentDirectory(wrapFileNoCanonicalize(jfc.getCurrentDirectory())); |
1117 |
jfc.setFileSystemView(new NonCanonicalizingFileSystemView()); |
1118 |
} |
1119 |
} |
1085 |
|
1120 |
|
|
|
1121 |
private static File wrapFileNoCanonicalize(File f) { |
1122 |
if (f instanceof NonCanonicalizingFile) { |
1123 |
return f; |
1124 |
} else if (f != null) { |
1125 |
return new NonCanonicalizingFile(f); |
1126 |
} else { |
1127 |
return null; |
1128 |
} |
1129 |
} |
1130 |
|
1131 |
private static File[] wrapFilesNoCanonicalize(File[] fs) { |
1132 |
if (fs != null) { |
1133 |
for (int i = 0; i < fs.length; i++) { |
1134 |
fs[i] = wrapFileNoCanonicalize(fs[i]); |
1135 |
} |
1136 |
} |
1137 |
return fs; |
1138 |
} |
1139 |
|
1140 |
private static final class NonCanonicalizingFile extends File { |
1141 |
public NonCanonicalizingFile(File orig) { |
1142 |
this(orig.getPath()); |
1143 |
} |
1144 |
private NonCanonicalizingFile(String path) { |
1145 |
super(path); |
1146 |
} |
1147 |
private NonCanonicalizingFile(URI uri) { |
1148 |
super(uri); |
1149 |
} |
1150 |
public File getCanonicalFile() throws IOException { |
1151 |
return wrapFileNoCanonicalize(normalizeFile(this)); |
1152 |
} |
1153 |
public String getCanonicalPath() throws IOException { |
1154 |
return normalizeFile(this).getAbsolutePath(); |
1155 |
} |
1156 |
public File getParentFile() { |
1157 |
return wrapFileNoCanonicalize(super.getParentFile()); |
1158 |
} |
1159 |
public File getAbsoluteFile() { |
1160 |
return wrapFileNoCanonicalize(super.getAbsoluteFile()); |
1161 |
} |
1162 |
public File[] listFiles() { |
1163 |
return wrapFilesNoCanonicalize(super.listFiles()); |
1164 |
} |
1165 |
public File[] listFiles(FileFilter filter) { |
1166 |
return wrapFilesNoCanonicalize(super.listFiles(filter)); |
1167 |
} |
1168 |
public File[] listFiles(FilenameFilter filter) { |
1169 |
return wrapFilesNoCanonicalize(super.listFiles(filter)); |
1170 |
} |
1171 |
} |
1172 |
|
1173 |
private static final class NonCanonicalizingFileSystemView extends FileSystemView { |
1174 |
private final FileSystemView delegate = FileSystemView.getFileSystemView(); |
1175 |
public NonCanonicalizingFileSystemView() {} |
1176 |
public boolean isFloppyDrive(File dir) { |
1177 |
return delegate.isFloppyDrive(dir); |
1178 |
} |
1179 |
public boolean isComputerNode(File dir) { |
1180 |
return delegate.isComputerNode(dir); |
1181 |
} |
1182 |
public File createNewFolder(File containingDir) throws IOException { |
1183 |
return wrapFileNoCanonicalize(delegate.createNewFolder(containingDir)); |
1184 |
} |
1185 |
public boolean isDrive(File dir) { |
1186 |
return delegate.isDrive(dir); |
1187 |
} |
1188 |
public boolean isFileSystemRoot(File dir) { |
1189 |
return delegate.isFileSystemRoot(dir); |
1190 |
} |
1191 |
public File getHomeDirectory() { |
1192 |
return wrapFileNoCanonicalize(delegate.getHomeDirectory()); |
1193 |
} |
1194 |
public File createFileObject(File dir, String filename) { |
1195 |
return wrapFileNoCanonicalize(delegate.createFileObject(dir, filename)); |
1196 |
} |
1197 |
public Boolean isTraversable(File f) { |
1198 |
return delegate.isTraversable(f); |
1199 |
} |
1200 |
public boolean isFileSystem(File f) { |
1201 |
return delegate.isFileSystem(f); |
1202 |
} |
1203 |
/* |
1204 |
protected File createFileSystemRoot(File f) { |
1205 |
return translate(delegate.createFileSystemRoot(f)); |
1206 |
} |
1207 |
*/ |
1208 |
public File getChild(File parent, String fileName) { |
1209 |
return wrapFileNoCanonicalize(delegate.getChild(parent, fileName)); |
1210 |
} |
1211 |
public File getParentDirectory(File dir) { |
1212 |
return wrapFileNoCanonicalize(delegate.getParentDirectory(dir)); |
1213 |
} |
1214 |
public Icon getSystemIcon(File f) { |
1215 |
return delegate.getSystemIcon(f); |
1216 |
} |
1217 |
public boolean isParent(File folder, File file) { |
1218 |
return delegate.isParent(folder, file); |
1219 |
} |
1220 |
public String getSystemTypeDescription(File f) { |
1221 |
return delegate.getSystemTypeDescription(f); |
1222 |
} |
1223 |
public File getDefaultDirectory() { |
1224 |
return wrapFileNoCanonicalize(delegate.getDefaultDirectory()); |
1225 |
} |
1226 |
public String getSystemDisplayName(File f) { |
1227 |
return delegate.getSystemDisplayName(f); |
1228 |
} |
1229 |
public File[] getRoots() { |
1230 |
return wrapFilesNoCanonicalize(delegate.getRoots()); |
1231 |
} |
1232 |
public boolean isHiddenFile(File f) { |
1233 |
return delegate.isHiddenFile(f); |
1234 |
} |
1235 |
public File[] getFiles(File dir, boolean useFileHiding) { |
1236 |
return wrapFilesNoCanonicalize(delegate.getFiles(dir, useFileHiding)); |
1237 |
} |
1238 |
public boolean isRoot(File f) { |
1239 |
return delegate.isRoot(f); |
1240 |
} |
1241 |
public File createFileObject(String path) { |
1242 |
return wrapFileNoCanonicalize(delegate.createFileObject(path)); |
1243 |
} |
1244 |
} |
1086 |
|
1245 |
|
1087 |
} |
1246 |
} |