1/*
2 * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 * @test
26 * @bug 6203047
27 * @summary Inconsistency in FilePermission
28 */
29
30import java.io.*;
31
32public class CanonPath {
33
34    private static boolean windows;
35
36    private static final String WIN_FOOBAR = "\\foo\\bar\\";
37    private static final String UNIX_FOOBAR = "/foo/bar/";
38
39    private static final String WIN_FOO = "\\foo.txt";
40    private static final String UNIX_FOO = "/foo.txt";
41
42    private static final String WIN_BAR = "bar\\bar.txt";
43    private static final String UNIX_BAR = "bar/bar.txt";
44
45    private static final String WIN_SLASH = "\\";
46    private static final String UNIX_SLASH = "/";
47
48    private static void printCanonPath(String label, String path)
49                throws Exception {
50
51        File f = new File(path);
52        System.out.println(label + " path = " + f.getCanonicalPath());
53    }
54
55    public static void main(String[] args) throws Exception {
56
57        if (System.getProperty("os.name").startsWith("Windows")) {
58            windows = true;
59            System.out.println("Testing on Windows");
60        } else {
61            System.out.println("Testing on Unix");
62        }
63
64
65        System.out.println();
66        System.out.println("\\\\foo\\\\bar\\\\- versus /foo/bar/-");
67        FilePermission w = new FilePermission(WIN_FOOBAR + "-", "read");
68        FilePermission u = new FilePermission(UNIX_FOOBAR + "-", "read");
69        printCanonPath("WIN_FOOBAR", WIN_FOOBAR);
70        printCanonPath("UNIX_FOOBAR", UNIX_FOOBAR);
71        if (windows) {
72            if (!w.implies(u) || !u.implies(w)) {
73                throw new Exception("FOOBAR test failed");
74            }
75        } else {
76            if (w.implies(u) || u.implies(w)) {
77                throw new Exception("FOOBAR test failed");
78            }
79        }
80
81
82
83        System.out.println();
84        System.out.println("\\\\foo.txt versus /foo.txt");
85        w = new FilePermission(WIN_FOO, "read");
86        u = new FilePermission(UNIX_FOO, "read");
87        printCanonPath("WIN_FOO", WIN_FOO);
88        printCanonPath("UNIX_FOO", UNIX_FOO);
89        if (windows) {
90            if (!w.implies(u) || !u.implies(w)) {
91                throw new Exception("FOO test failed");
92            }
93        } else {
94            if (w.implies(u) || u.implies(w)) {
95                throw new Exception("FOO test failed");
96            }
97        }
98
99
100
101        System.out.println();
102        System.out.println("bar\\\\bar.txt versus bar/bar.txt");
103        w = new FilePermission(WIN_BAR, "read");
104        u = new FilePermission(UNIX_BAR, "read");
105        printCanonPath("WIN_BAR", WIN_BAR);
106        printCanonPath("UNIX_BAR", UNIX_BAR);
107        if (windows) {
108            if (!w.implies(u) || !u.implies(w)) {
109                throw new Exception("BAR test failed");
110            }
111        } else {
112            if (w.implies(u) || u.implies(w)) {
113                throw new Exception("BAR test failed");
114            }
115        }
116
117
118
119        System.out.println();
120        System.out.println("\\\\ versus /");
121        w = new FilePermission(WIN_SLASH, "read");
122        u = new FilePermission(UNIX_SLASH, "read");
123        printCanonPath("WIN_SLASH", WIN_SLASH);
124        printCanonPath("UNIX_SLASH", UNIX_SLASH);
125        if (windows) {
126            if (!w.implies(u) || !u.implies(w)) {
127                throw new Exception("SLASH test failed");
128            }
129        } else {
130            if (w.implies(u) || u.implies(w)) {
131                throw new Exception("SLASH test failed");
132            }
133        }
134
135
136
137        System.out.println();
138        System.out.println("\\\\- versus /-");
139        w = new FilePermission(WIN_SLASH + "-", "read");
140        u = new FilePermission(UNIX_SLASH + "-", "read");
141        printCanonPath("WIN_SLASH", WIN_SLASH);
142        printCanonPath("UNIX_SLASH", UNIX_SLASH);
143        if (windows) {
144            if (!w.implies(u) || !u.implies(w)) {
145                throw new Exception("SLASH/- test failed");
146            }
147        } else {
148
149            // XXX
150            //
151            // on unix, /- implies everything
152
153            //if (w.implies(u) || !u.implies(w)) {
154            //    throw new Exception("SLASH/- test failed");
155            //}
156        }
157
158
159
160        System.out.println();
161        System.out.println("- versus -");
162        w = new FilePermission("-", "read");
163        u = new FilePermission("-", "read");
164        printCanonPath("WIN_DASH", "");
165        printCanonPath("UNIX_DASH", "");
166        if (windows) {
167            if (!w.implies(u) || !u.implies(w)) {
168                throw new Exception("- test failed");
169            }
170        } else {
171            if (!w.implies(u) || !u.implies(w)) {
172                throw new Exception("- test failed");
173            }
174        }
175
176
177
178        System.out.println();
179        System.out.println("- versus *");
180        w = new FilePermission("-", "read");
181        u = new FilePermission("*", "read");
182        printCanonPath("WIN_DASH", "");
183        printCanonPath("UNIX_STAR", "");
184        if (windows) {
185
186            // XXX
187            //
188            // - implies *, but not the other way around
189
190            if (!w.implies(u) || u.implies(w)) {
191                throw new Exception("- test failed");
192            }
193        } else {
194
195            // XXX
196            //
197            // - implies *, but not the other way around
198
199            if (!w.implies(u) || u.implies(w)) {
200                throw new Exception("- test failed");
201            }
202        }
203
204
205
206        System.out.println();
207        System.out.println("\\\\* versus /*");
208        w = new FilePermission(WIN_SLASH + "*", "read");
209        u = new FilePermission(UNIX_SLASH + "*", "read");
210        printCanonPath("WIN_SLASH", WIN_SLASH);
211        printCanonPath("UNIX_SLASH", UNIX_SLASH);
212        if (windows) {
213            if (!w.implies(u) || !u.implies(w)) {
214                throw new Exception("SLASH/* test failed");
215            }
216        } else {
217            if (w.implies(u) || u.implies(w)) {
218                throw new Exception("SLASH/* test failed");
219            }
220        }
221
222
223
224        System.out.println();
225        System.out.println("\\\\foo\\\\bar\\\\- versus /foo/bar/foobar/w.txt");
226        w = new FilePermission(WIN_FOOBAR + "-", "read");
227        u = new FilePermission("/foo/bar/foobar/w.txt", "read");
228        printCanonPath("FOOBAR", WIN_FOOBAR);
229        printCanonPath("W.TXT", "/foo/bar/foobar/w.txt");
230        if (windows) {
231            if (!w.implies(u) || u.implies(w)) {
232                throw new Exception("w.txt (-) test failed");
233            }
234        } else {
235            if (w.implies(u) || u.implies(w)) {
236                throw new Exception("w.txt (-) test failed");
237            }
238        }
239
240
241
242        System.out.println();
243        System.out.println("\\\\foo\\\\bar\\\\* versus /foo/bar/w.txt");
244        w = new FilePermission(WIN_FOOBAR + "*", "read");
245        u = new FilePermission("/foo/bar/w.txt", "read");
246        printCanonPath("FOOBAR", WIN_FOOBAR);
247        printCanonPath("W.TXT", "/foo/bar/w.txt");
248        if (windows) {
249            if (!w.implies(u) || u.implies(w)) {
250                throw new Exception("w.txt (*) test failed");
251            }
252        } else {
253            if (w.implies(u) || u.implies(w)) {
254                throw new Exception("w.txt (*) test failed");
255            }
256        }
257
258
259        // make sure "/" does not imply "/-" nor "/*"
260
261        System.out.println();
262        System.out.println("/ versus /- and /*");
263        File file = new File(UNIX_SLASH);
264        FilePermission recursive = new FilePermission
265                                (file.getCanonicalPath() +
266                                File.separatorChar +
267                                "-",
268                                "read");
269        FilePermission wild = new FilePermission
270                                (file.getCanonicalPath() +
271                                File.separatorChar +
272                                "*",
273                                "read");
274        FilePermission standard = new FilePermission
275                                (file.getCanonicalPath(),
276                                "read");
277        if (standard.implies(recursive) || standard.implies(wild)) {
278            throw new Exception("standard vs directory test failed");
279        }
280    }
281}
282