Version 2.0

实现基本功能
实现了基本界面admin.php
支持查看各种信息,支持自动base64解码

todolist
keepsession
认证
完全启用CSP
我的js
js模板

为实现一些jqxgrid无法实现的功能改动了jqx库,详见diff文件夹
This commit is contained in:
firesun
2015-10-27 12:26:59 +08:00
parent 6967a0bee1
commit aaa17b1691
81 changed files with 27088 additions and 120 deletions

View File

@@ -1 +0,0 @@
Options -Indexes

217
admin.php
View File

@@ -1,3 +1,218 @@
<?php
define("IN_XSS_PLATFORM",true);
require("auth.php");
?>
<!DOCTYPE html>
<html>
?>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="static/css/bootstrap.min.css" type="text/css" />
<link rel="stylesheet" href="static/css/Site.css" type="text/css" />
<link rel="stylesheet" href="static/css/notification.css" type="text/css" />
<link rel="stylesheet" href="static/css/jqx.base.css" type="text/css" />
<link rel="stylesheet" href="static/css/jqx.office.css" type="text/css" />
<link rel="stylesheet" href="static/css/animate.css" type="text/css" />
<script type="text/javascript" src="static/js/jquery.min.js"></script>
<script type="text/javascript" src="static/js/bootstrap.min.js"></script>
<script type="text/javascript" src="static/js/jquery-ui.min.js"></script>
<script type="text/javascript" src="static/js/notification.js"></script>
<script type="text/javascript" src="static/js/localization.js"></script>
<script type="text/javascript" src="static/js/jqxcore.js"></script>
<script type="text/javascript" src="static/js/jqxdata.js"></script>
<script type="text/javascript" src="static/js/jqxbuttons.js"></script>
<script type="text/javascript" src="static/js/jqxscrollbar.js"></script>
<script type="text/javascript" src="static/js/jqxmenu.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.selection.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.edit.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.sort.js"></script>
<script type="text/javascript" src="static/js/jqxtabs.js"></script>
<script type="text/javascript" src="static/js/getTheme.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.columnsresize.js"></script>
<script type="text/javascript" src="static/js/jqxwindow.js"></script>
<script type="text/javascript" src="static/js/jqxdropdownlist.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.pager.js"></script>
<script type="text/javascript" src="static/js/jqxlistbox.js"></script>
<script type="text/javascript" src="static/js/loadgrid.js"></script>
<script type="text/javascript" src="static/js/jqxgrid.filter.js"></script>
</head>
<body>
<div class="container-fluid">
<div class="row row-offcanvas row-offcanvas-left">
<div id="nav-section" class="col-xs-12 column">
<div class="navbar-default">
<button id="toggle-button" type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<h1 id="dash-logo" class="center-block">Blue-Lotus</h1>
<div class="collapse navbar-collapse" id="sidebar-nav" role="navigation">
<ul id="Tab" class="nav">
<li class="active">
<a href="#panel" data-toggle="tab">
<span class="icon icon-chart-column"></span>接收面板</a>
</li>
<li>
<a href="#js" data-toggle="tab">
<span class="icon icon-star-empty"></span>我的JS</a>
</li>
<li>
<a href="#template" data-toggle="tab">
<span class="icon icon-faves"></span>公共模板</a>
</li>
<li>
<a href="#aboutus" data-toggle="tab">
<span class="icon icon-info"></span>关于</a>
</li>
</ul>
<span id="rights">Copyright © 2015-2016 Powered by Firesun</span>
</div>
</div>
<div class="tab-content">
<div id="panel" class="tab-pane active main-section col-xs-12 column">
<div class="main-section-header row">
<h2 class="eam-efficiency col-xs-3">XSS接收面板</h2>
<div style="clear:both;"></div>
</div>
<div id="panelGrid"></div>
</div>
<div id="js" class="tab-pane main-section col-xs-12 column">
<div class="main-section-header row">
<h2 class="eam-efficiency col-xs-3">我的js</h2>
<div style="clear:both;"></div>
</div>
<div id="myJS"></div>
</div>
<div id="template" class="tab-pane main-section col-xs-12 column">
<div class="main-section-header row">
<h2 class="eam-efficiency col-xs-3">js模板</h2>
<div style="clear:both;"></div>
</div>
<div id="jsTemplate"></div>
</div>
<div id="aboutus" class="tab-pane main-section col-xs-12 column">
<div class="main-section-header row">
<h2 class="eam-efficiency col-xs-3">关于</h2>
<div style="clear:both;"></div>
</div>
<div id="about_detail"></div>
</div>
</div>
</div>
</div>
<div id="notifications-bottom-right"></div>
<div style="display: none;">
<div id="searchWindow" class="windows">
<div>
查找记录</div>
<div style="overflow: hidden;">
<div>
关键字:</div>
<div style='margin-top:5px;'>
<input id='inputField' type="text" class="jqx-input" style="width: 200px; height: 23px;" />
</div>
<div style="margin-top: 7px; clear: both;">
列名:</div>
<div style='margin-top:5px;'>
<div id='dropdownlist'>
</div>
</div>
<div>
<input type="button" style='margin-top: 15px; margin-left: 50px; float: left;' value="查找" id="findButton" />
<input type="button" style='margin-left: 5px; margin-top: 15px; float: left;' value="清除" id="clearButton" />
</div>
</div>
</div>
<div id="deleteConfirmWindow" class="windows">
<div>
<img width="14" height="14" src="static/images/help.png" alt="" />
确认</div>
<div>
<div style="margin: 5px;">
您确认执行删除操作么?
</div>
<div>
<div style="float: right; margin-top: 15px;">
<input type="button" id="deleteConfirm_ok" value="确认" style="margin-right: 10px" />
<input type="button" id="deleteConfirm_cancel" value="取消" />
</div>
</div>
</div>
</div>
<div id="clearConfirmWindow" class="windows">
<div>
<img width="14" height="14" src="static/images/help.png" alt="" />
确认</div>
<div>
<div style="margin: 5px;">
您确认清空所有记录么?
</div>
<div>
<div style="float: right; margin-top: 15px;">
<input type="button" id="clearConfirm_ok" value="确认" style="margin-right: 10px" />
<input type="button" id="clearConfirm_cancel" value="取消" />
</div>
</div>
</div>
</div>
<div id="failedWindow" class="windows">
<div>
<img width="14" height="14" src="static/images/close.png" alt="" />
失败</div>
<div>
<div style="margin: 5px;">
操作失败!
</div>
<div>
<div style="float: right; margin-top: 15px;">
<input type="button" id="failed_ok" value="确认" />
</div>
</div>
</div>
</div>
</div >
<script id="xss-detail-template" type="text/template">
<div style='margin: 10px;'>
<ul style='margin-left: 30px;'>
<li>GET</li>
<li>POST</li>
<li>Cookie</li>
<li>HTTP请求信息</li>
<li>其他信息</li>
</ul>
<div class='get_grid'></div>
<div class='post_grid'></div>
<div class='cookie_grid'></div>
<div class='headers_grid'></div>
<div class='information'></div>
</div>
</script>
</body>
</html>

View File

@@ -1,4 +1,8 @@
<?php
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
/*Aes.php
*Date 2009/09/04
*Auth song_qilin

90
api.php
View File

@@ -1,90 +0,0 @@
<?php
require('auth.php');
require_once("util.php");
require_once("config.php");
require_once("dio.php");
header('Content-Type: application/json');
if(isset($_GET['cmd']))
{
switch($_GET['cmd'])
{
case 'list':
echo json_encode(dirList());
break;
case 'get':
if(isset($_GET['id'])&&preg_match('/^[0-9]{10}$/',$_GET['id']))
echo json_encode(loadInfo($_GET['id']));
else
echo json_encode(false);
break;
case 'del':
if(isset($_GET['id'])&&preg_match('/^[0-9]{10}$/',$_GET['id']))
echo json_encode(delInfo($_GET['id']));
else
echo json_encode(false);
break;
case 'clear':
clearInfo();
break;
}
}
function dirList() {
$list=array();
$files = glob(DATA_PATH . '/*.php');
foreach ($files as $file) {
//$listinfo=array();
$info=loadInfo(basename($file,".php"));
//$listinfo["request_time"]=$info["request_time"];
//$listinfo['user_IP']=$info['user_IP'];
//$listinfo['location']=$info['location'];
//$listinfo['request_method']=$info['request_method'];
$data_type=array();
if(count($info['get_data'])>0)
{
$get_keys=array();
foreach($info['get_data'] as $k => $v) {
$get_keys[]=$k;
}
$data_type['GET']=$get_keys;
}
if(count($info['post_data'])>0)
{
$post_keys=array();
foreach($info['post_data'] as $k => $v) {
$post_keys[]=$k;
}
$data_type['POST']=$post_keys;
}
if(count($info['cookie_data'])>0)
{
$cookie_keys=array();
foreach($info['cookie_data'] as $k => $v) {
$cookie_keys[]=$k;
}
$data_type['COOKIE']=$cookie_keys;
}
$info['data_type']=json_encode($data_type);
$list[]= $info;
}
return $list;
}
?>

View File

@@ -1,3 +1,10 @@
<?php
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
header("Content-Security-Policy: default-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; frame-src 'none' ");
header("X-Content-Security-Policy: default-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; frame-src 'none' ");
header("X-WebKit-CSP: default-src 'self'; object-src 'none'; style-src 'self' 'unsafe-inline'; frame-src 'none' ");
?>

View File

@@ -1,7 +1,12 @@
<?php
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
define('PASS', 'bluelotus');
define('DATA_PATH', 'data');
define('ENABLE_ENCRYPT', true);
define('ENCRYPT_PASS', "bluelotus");
define('KEEP_SESSION', true);
define('IPDATA_PATH', "qqwry.dat");
?>

View File

@@ -1 +0,0 @@
Boom has been planted!

49
diff/jqxgrid.js.diff Normal file
View File

@@ -0,0 +1,49 @@
diff --git a/jqxgrid.js b/jqxgrid.js
index 97dd39c..605cf30 100644
--- a/jqxgrid.js
+++ b/jqxgrid.js
@@ -288,9 +288,9 @@ License: http://jqwidgets.com/license/
return
}
if (h.autorowheight && !h.autoheight && !h.pageable) {
- throw new Error('jqxGrid: "autorowheight" requires setting the "autoheight" or "pageable" property to true!');
- h.host.remove();
- return
+ //throw new Error('jqxGrid: "autorowheight" requires setting the "autoheight" or "pageable" property to true!');
+ //h.host.remove();
+ //return
}
if (h.virtualmode && h.rendergridrows == null) {
throw new Error('jqxGrid: "virtualmode" requires setting the "rendergridrows"!');
@@ -6038,6 +6042,13 @@ License: http://jqwidgets.com/license/
})
}
}
+ else{
+ var o = n - e;
+ var g = this.vScrollInstance.max;
+ this.vScrollBar.jqxScrollBar({
+ max: o
+ });
+ }
} else {
this.vScrollBar.jqxScrollBar({
value: 0,
@@ -6584,7 +6595,7 @@ License: http://jqwidgets.com/license/
if (ad.group != undefined && this._rendergroup) {
this._rendergroup(P, k, ad, am, r, ab, J)
}
- if (this.autorowheight && (this.autoheight || this.pageable)) {
+ if (this.autorowheight) {// && (this.autoheight || this.pageable)) {
var O = this.rowsheight;
for (var V = d; V < aa; V++) {
if (this.editable && this.editcell && this.editcell.column == this.columns.records[V].datafield && this.editcell.row == this.getboundindex(ad)) {
@@ -6661,7 +6672,7 @@ License: http://jqwidgets.com/license/
}
}
}
- if ((this.autoheight || this.pageable) && this.autorowheight) {
+ if (this.autorowheight) {//(this.autoheight || this.pageable) &&
this._pagescache = new Array();
var W = 0;
var g = 0;

View File

@@ -0,0 +1,30 @@
diff --git a/jqxgrid.selection.js b/jqxgrid.selection.js
index 2fe844f..3cda160 100644
--- a/jqxgrid.selection.js
+++ b/jqxgrid.selection.js
@@ -1398,16 +1398,17 @@ License: http://jqwidgets.com/license/
if (A.altKey) {
return true
}
+ /*
if (A.ctrlKey || A.metaKey) {
if (this.clipboard) {
var b = String.fromCharCode(H).toLowerCase();
if (this.clipboardbegin) {
var j = null;
if (b == "c") {
j = this.clipboardbegin("copy", this.copyselection())
} else {
if (b == "x") {
j = this.clipboardbegin("cut", this.copyselection())
} else {
if (b == "v") {
j = this.clipboardbegin("paste")
@@ -1488,6 +1489,7 @@ License: http://jqwidgets.com/license/
}
}
}
+ */
var n = Math.round(t._gettableheight());
var y = Math.round(n / t.rowsheight);
var f = t.getdatainformation();

18
dio.php
View File

@@ -1,6 +1,9 @@
<?php
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
require_once("config.php");
require_once("util.php");
require_once("functions.php");
function saveInfo($info,$filename)
{
@@ -35,6 +38,17 @@ function loadInfo($filename)
return false;
$info=json_decode($info, true);
$isChange=false;
if(!isset($info['location']))
{
$info['location']=convertip($info['user_IP'],IPDATA_PATH);
$isChange=true;
}
if($isChange)
saveInfo(json_encode($info),$filename);
return $info;
}
@@ -51,6 +65,6 @@ function clearInfo()
foreach ($files as $file) {
unlink($file);
}
return true;
}
?>

253
functions.php Normal file
View File

@@ -0,0 +1,253 @@
<?php
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
require_once("aes.php");
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
function isKeepSession($info){
$keepsession=false;
foreach($info['cookie_data'] as $k => $v) {
if($k==="keepsession")
$keepsession=($v==="1"?true:false);
}
foreach($info['post_data'] as $k => $v) {
if($k==="keepsession")
$keepsession=($v==="1"?true:false);
}
foreach($info['get_data'] as $k => $v) {
if($k==="keepsession")
$keepsession=($v==="1"?true:false);
}
return $keepsession;
}
function stripStr($str){
if(get_magic_quotes_gpc())
$str=stripslashes($str);
return addslashes(htmlspecialchars($str,ENT_QUOTES,'UTF-8'));
}
function stripArr($arr){
$new_arr=array();
foreach($arr as $k => $v) {
$new_arr[stripStr($k)] = stripStr($v);
}
return $new_arr;
}
function tryBase64Decode($arr)
{
if(isset($arr)&&count($arr)>0)
{
$isChanged=0;
$new_arr = array();
foreach($arr as $k => $v) {
$decoded_v="";
if(isBase64Formatted($v)) {
$decoded_v=base64_decode($v);
$isChanged=1;
}
$new_arr[$k]=$decoded_v;
}
if($isChanged)
return $new_arr;
else
return false;
}
else
return false;
}
function isBase64Formatted($str)
{
if(preg_match('/^[A-Za-z0-9+\/=]+$/',$str))
if ($str == base64_encode(base64_decode($str)))
if(preg_match('/^[A-Za-z0-9\x00-\x80~!@#$%&_+-=:";\'<>,\/"\[\]\\\^\.\|\?\*\+\(\)\{\}\s]+$/',base64_decode($str)))
return true;
return false;
}
function encrypt($info,$encryptPass)
{
return AESEncryptCtr($info,$encryptPass);
}
function decrypt($info,$encryptPass)
{
return AESDecryptCtr($info,$encryptPass);
}
function convertip($ip, $ipdatafile) {
$ipaddr = '未知';
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
$iparray = explode('.', $ip);
if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31))) {
$ipaddr = '局域网';
} elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255) {
$ipaddr = '错误ip';
} else {
if(@file_exists($ipdatafile)) {
if(!$fd = @fopen($ipdatafile, 'rb')) {
return 'ip库出错';
}
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return;
@$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
@$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = $ip2num = $ip1num = 0;
$ipAddr1 = $ipAddr2 = '';
$EndNum = $ipAllNum;
while($ip1num > $ipNum || $ip2num < $ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return '系统错误';
}
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return '系统错误';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return '系统错误';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return '未知';
}
$BeginNum = $Middle;
}
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(1)) {
$ipSeek = fread($fd, 3);
if(strlen($ipSeek) < 3) {
fclose($fd);
return '系统错误';
}
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
fseek($fd, $ipSeek);
$ipFlag = fread($fd, 1);
}
if($ipFlag == chr(2)) {
$AddrSeek = fread($fd, 3);
if(strlen($AddrSeek) < 3) {
fclose($fd);
return '系统错误';
}
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return '系统错误';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
fseek($fd, $AddrSeek);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
} else {
fseek($fd, -1, SEEK_CUR);
while(($char = fread($fd, 1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag = fread($fd, 1);
if($ipFlag == chr(2)) {
$AddrSeek2 = fread($fd, 3);
if(strlen($AddrSeek2) < 3) {
fclose($fd);
return '系统错误';
}
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
fseek($fd, $AddrSeek2);
} else {
fseek($fd, -1, SEEK_CUR);
}
while(($char = fread($fd, 1)) != chr(0))
$ipAddr2 .= $char;
}
fclose($fd);
$ipAddr1 = iconv("gb18030", "utf-8//IGNORE", $ipAddr1);
if($ipAddr2){
if(ord($ipAddr2{0}) == 2)
$ipAddr2 = "";
else
$ipAddr2 = iconv("gb18030", "utf-8//IGNORE", $ipAddr2);
}
if(preg_match('/http/i', $ipAddr2)) {
$ipAddr2 = '';
}
$ipaddr = $ipAddr1.$ipAddr2;
$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
$ipaddr = '未知';
}
return htmlspecialchars($ipaddr,ENT_QUOTES,'UTF-8');
}
}
}
return $ipaddr;
}
?>

View File

@@ -1,16 +1,16 @@
<?php
define("IN_XSS_PLATFORM",true);
//sometimes we only need "referfer".
/*
if(count($_GET)==0&&count($_POST)==0&&count($_COOKIE)==0)
exit();
*/
require_once("util.php");
require_once("functions.php");
require_once("dio.php");
$info = array();
$user_IP = getIP();
$user_IP = isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:"unknown";
$user_port = isset($_SERVER['REMOTE_PORT'])?$_SERVER['REMOTE_PORT']:"unknown";
$protocol = isset($_SERVER['SERVER_PROTOCOL'])?$_SERVER['SERVER_PROTOCOL']:"unknown";
$request_method = isset($_SERVER['REQUEST_METHOD'])?$_SERVER['REQUEST_METHOD']:"unknown";
@@ -32,7 +32,6 @@ $info['protocol'] = stripStr($protocol);
$info['request_method'] = stripStr($request_method);
$info['request_URI'] = stripStr($request_URI);
$info['request_time'] = stripStr($request_time);
$info['headers_data'] = stripArr($headers_data);
$info['get_data'] = stripArr($get_data);
@@ -47,6 +46,7 @@ $info['cookie_data'] = stripArr($cookie_data);
if($decoded_cookie_data)
$info['decoded_cookie_data'] = stripArr($decoded_cookie_data);
saveInfo(json_encode($info),$request_time);
$info['keepsession']=isKeepSession($info)?true:false;
saveInfo(json_encode($info),$request_time);
?>

12
keepsession.php Normal file
View File

@@ -0,0 +1,12 @@
<?php
define("IN_XSS_PLATFORM",true);
if(!defined('IN_XSS_PLATFORM')) {
exit('Access Denied');
}
require_once("config.php");
require_once("functions.php");
require_once("dio.php");
//to do
?>

BIN
qqwry.dat Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="icomoon" horiz-adv-x="512">
<font-face units-per-em="512" ascent="480" descent="-32" />
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
<glyph unicode="&#xe600;" d="M312 72c0-30.797-25.203-56-56-56v0c-30.801 0-56 25.203-56 56v160c0 30.801 25.199 56 56 56v0c30.797 0 56-25.199 56-56v-160zM312 376c0-30.801-25.203-56-56-56v0c-30.801 0-56 25.199-56 56v0c0 30.801 25.199 56 56 56v0c30.797 0 56-25.199 56-56v0z" />
<glyph unicode="&#xe601;" d="M124.063 272.297c0 26.398 20.801 53.824 46.219 60.941l136.719 38.281c25.422 7.121 46.219 26.207 46.219 42.426 0 16.215-20.797 23.664-46.219 16.543l-185.328-51.887c-25.426-7.121-46.215-34.547-46.215-60.945v-215.094c0-26.406 10.933-44.938 24.305-41.203 13.367 3.75 24.301 28.406 24.301 54.813v156.125zM205 309.168c-25.426-7.121-46.222-34.543-46.222-60.946v-195.66c0-26.406 20.797-42.18 46.222-35.063l185.328 51.883c25.422 7.133 46.219 34.547 46.219 60.945v195.664c0 26.399-20.805 42.176-46.219 35.054l-185.328-51.879zM351.594 156.515c6.797-18.508-2.203-28.242-20-21.64-17.797 6.594-46.922-3.75-64.719-23-17.793-19.258-26.793-15.922-19.996 7.414 6.801 23.336-2.199 47.836-20 54.445-17.801 6.601-14.359 18.406 7.641 26.219 22 7.828 45.551 33.313 52.356 56.649 6.797 23.336 17.922 27.285 24.719 8.781 6.805-18.504 30.367-27.246 52.359-19.422 21.992 7.816 25.43-1.535 7.64-20.801-17.797-19.254-26.797-50.145-20-68.645z" />
<glyph unicode="&#xe602;" d="M374.182 185.598l32.291-168.709-150.473 82.844-150.474-82.844 32.289 168.709-125.288 117.507 170.432 21.427 73.041 155.47 73.041-155.469 170.427-21.427-125.286-117.508zM300.527 288.752l-44.528 94.781-44.531-94.781-103.901-13.063 76.383-71.641-19.688-102.85 91.738 50.505 91.735-50.506-19.685 102.85 76.383 71.641-103.904 13.063z" />
<glyph unicode="&#xe603;" d="M127.999 64.002c-17.672 0-32.001 14.325-32.001 31.998v128.004c0 17.672 14.329 31.997 32.001 31.997 17.672 0 32.001-14.325 32.001-31.997v-128.004c0-17.672-14.329-31.998-32.001-31.998v0zM223.999 64.002c-17.672 0-32.001 14.325-32.001 31.998v64.004c0 17.67 14.329 31.998 32.001 31.998 17.672 0 32.001-14.328 32.001-31.998v-64.004c0-17.672-14.329-31.998-32.001-31.998v0zM319.998 64.002c-17.672 0-32 14.325-32 31.998v160.001c0 17.672 14.328 32.001 32 32.001 17.673 0 32.002-14.329 32.002-32.001v-160.001c0-17.672-14.33-31.998-32.002-31.998v0zM415.998 64.002c-17.672 0-32 14.325-32 31.998v256.001c0 17.675 14.328 32.001 32 32.001 17.676 0 32.002-14.326 32.002-32.001v-256.001c0-17.672-14.326-31.998-32.002-31.998v0z" />
<glyph unicode="&#xe604;" d="M368 480h-224c-26.4 0-48-21.6-48-48v-416c0-26.4 21.6-48 48-48h224c26.4 0 48 21.6 48 48v416c0 26.4-21.6 48-48 48zM192 456h128v-16h-128v16zM256 0c-17.673 0-32 14.327-32 32s14.327 32 32 32 32-14.327 32-32-14.327-32-32-32zM384 96h-256v320h256v-320z" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Binary file not shown.

200
static/css/Site.css Normal file
View File

@@ -0,0 +1,200 @@
html, body, div, span, iframe,
h1, h2, h3, h4, h5, h6, p, a, img, dl, dt, dd, ol, ul, li,
table, tfoot, thead, tr, th, td,
article, aside, canvas, details, footer, header, section {
margin: 0;
padding: 0;
border: 0;
font-size: 100%;
font: inherit;
}
/* HTML5 display-role reset for older browsers */
body {
line-height: 1;
font-size: 12px;
}
ol, ul {
list-style: none;
}
html, body {
height: 100%;
font-family: 'Microsoft YaHei','Open Sans',arial,sans-serif;
}
html,
body,
.container-fluid,
.row,
.column{
height: 100%;
}
/* font */
@font-face {
font-family: 'icomoon';
src:url('Fonts/icomoon.eot?c8m22a');
src:url('Fonts/icomoon.eot?#iefixc8m22a') format('embedded-opentype'),
url('Fonts/icomoon.woff?c8m22a') format('woff'),
url('Fonts/icomoon.ttf?c8m22a') format('truetype'),
url('Fonts/icomoon.svg?c8m22a#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
[class^="icon-"], [class*=" icon-"] {
font-family: 'icomoon';
speak: none;
font-style: normal;
font-weight: normal;
font-variant: normal;
text-transform: none;
line-height: 1;
/* Better Font Rendering =========== */
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-info:before {
content: "\e600";
}
.icon-faves:before {
content: "\e601";
}
.icon-star-empty:before {
content: "\e602";
}
.icon-chart-column:before {
content: "\e603";
}
.icon-mobile:before {
content: "\e604";
}
.icon {
margin-right: 0.917em;
}
/* Bootstrap overrides*/
.row,
.container-fluid {
padding: 0;
margin: 0;
}
.column{
padding-left: 0;
padding-right: 0;
}
.windows {
-moz-box-shadow: 0px 0px 10px rgba(0,0,0,0.5);
-webkit-box-shadow: 0px 0px 10px rgba(0,0,0,0.5);
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.5);
}
/* Nav section */
#nav-section{
background-color: #35373d;
width: 220px;
float: left;
height: 100%;
}
#nav-section li {
border-bottom: 1px solid #4a4b51;
white-space:nowrap;
font-size: 11px;
line-height: 11px;
}
#nav-section li a {
color: #b8bbc2;
text-transform: uppercase;
text-decoration: none;
margin-left: 2em;
font-size: 14px;
padding: 2em 1.2em;
}
#nav-section li:hover {
background-color: #212329;
}
#nav-section li.active {
background-color: #0d1016;
}
.nav > li > a:hover,
.nav > li > a:focus {
background: none;
}
#dash-logo {
color: #fff;
background-color: #1996e4;
text-align: center;
}
#sidebar-nav{
padding: 0;
}
#rights {
color: #848690;
font-size: 10px;
position: absolute;
bottom: 10px;
}
/* Toggle button */
#toggle-button {
margin-top: 27px;
border: none;
}
#toggle-button:hover,
#toggle-button:focus {
background-color: transparent;
}
#toggle-button .icon-bar {
background-color: #fff;
}
/* Main section */
.main-section {
float: none;
width: auto;
overflow: hidden;
height: 100%;
background-color: #eee;
}
#dash-logo,
.main-section-header > h2{
font-size: 18px;
text-transform: uppercase;
line-height: 26px;
padding-top: 30px;
padding-bottom: 30px;
}
.main-section-header > h2 {
padding-left: 1.667em;
white-space: nowrap;
}
.main-section-header {
height: auto;
border-bottom: 1px solid #ededee;
-moz-box-shadow: 1px 0 4px #ededee;
-webkit-box-shadow: 1px 0 4px #ededee;
box-shadow: 1px 0 4px #ededee;
background-color: #fff;
}

3158
static/css/animate.css vendored Normal file

File diff suppressed because it is too large Load Diff

7
static/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

6156
static/css/jqx.base.css Normal file

File diff suppressed because it is too large Load Diff

262
static/css/jqx.office.css Normal file
View File

@@ -0,0 +1,262 @@
.jqx-rc-tl-office
{
-moz-border-radius-topleft: 0px;
-webkit-border-top-left-radius: 0px;
border-top-left-radius: 0px;
}
.jqx-rc-tr-office
{
-moz-border-radius-topright: 0px;
-webkit-border-top-right-radius: 0px;
border-top-right-radius: 0px;
}
.jqx-rc-bl-office
{
-moz-border-radius-bottomleft: 0px;
-webkit-border-bottom-left-radius: 0px;
border-bottom-left-radius: 0px;
}
.jqx-rc-br-office
{
-moz-border-radius-bottomright: 0px;
-webkit-border-bottom-right-radius: 0px;
border-bottom-right-radius: 0px;
}
/*top rounded Corners*/
.jqx-rc-t-office
{
-moz-border-radius-topleft: 0px;
-webkit-border-top-left-radius: 0px;
border-top-left-radius: 0px;
-moz-border-radius-topright: 0px;
-webkit-border-top-right-radius: 0px;
border-top-right-radius: 0px;
}
/*bottom rounded Corners*/
.jqx-rc-b-office
{
-moz-border-radius-bottomleft: 0px;
-webkit-border-bottom-left-radius: 0px;
border-bottom-left-radius: 0px;
-moz-border-radius-bottomright: 0px;
-webkit-border-bottom-right-radius: 0px;
border-bottom-right-radius: 0px;
}
/*right rounded Corners*/
.jqx-rc-r-office
{
-moz-border-radius-topright: 0px;
-webkit-border-top-right-radius: 0px;
border-top-right-radius: 0px;
-moz-border-radius-bottomright: 0px;
-webkit-border-bottom-right-radius: 0px;
border-bottom-right-radius: 0px;
}
/*left rounded Corners*/
.jqx-rc-l-office
{
-moz-border-radius-topleft: 0px;
-webkit-border-top-left-radius: 0px;
border-top-left-radius: 0px;
-moz-border-radius-bottomleft: 0px;
-webkit-border-bottom-left-radius: 0px;
border-bottom-left-radius: 0px;
}
/*all rounded Corners*/
.jqx-rc-all-office
{
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
}
.jqx-widget-office {
font-family: Calibri;
}
.jqx-widget-content-office{font-family: Calibri; border-color: #d4d4d4; color: #444444; background-color: #fff;}
.jqx-widget-header-office{font-family: Calibri; color: #444444; border-color:#d4d4d4; background-color:#ffffff;}
.jqx-fill-state-normal-office{font-family: Calibri; border-color: #d4d4d4; color: #444444; background: #fdfdfd;}
.jqx-grid-cell-sort-alt-office, .jqx-grid-cell-filter-alt-office, .jqx-grid-cell-pinned-office, .jqx-grid-cell-alt-office, .jqx-grid-cell-sort-office{ background:#ededed; color: #000;}
.jqx-button-office {border-color: #d4d4d4;}
.jqx-fill-state-hover-office{border-color:#86bfa0; color: #000; background:#d3f0e0;}
.jqx-input-office, .jqx-input-button-content-office {border-color: #d4d4d4;}
.jqx-fill-state-focus-office, .jqx-combobox-content-focus-office, .jqx-numberinput-focus, .jqx-datetimeinput-office .jqx-fill-state-hover-office, .jqx-datetimeinput-office .jqx-fill-state-pressed-office{ border-color: #86bfa0; }
.jqx-fill-state-pressed-office{border-color:#429366; color: #000; background:#86bfa0;}
.jqx-scrollbar-state-normal-office, .jqx-grid-bottomright-office, .jqx-panel-bottomright-office, .jqx-listbox-bottomright-office{background:#f3f3f3;}
.jqx-widget-office .jqx-grid-column-header-office, .jqx-grid-cell-office, .jqx-widget-office .jqx-grid-cell-office, .jqx-widget-office .jqx-grid-group-cell-office, .jqx-grid-group-cell-office{font-family: Calibri; border-color:#f3f3f3;}
.jqx-tabs-title-bottom-office, .jqx-tabs-title-office{color: #666666;}
.jqx-tabs-title-hover-bottom-office, .jqx-tabs-title-hover-top-office{color: #217346; background: transparent; border-color: transparent;}
.jqx-tabs-title-selected-bottom-office, .jqx-tabs-selection-tracker-bottom-office, .jqx-tabs-title-selected-top-office, .jqx-tabs-selection-tracker-top-office{font-weight: bold; color: #217346; border-color:#d4d4d4; border-bottom:1px solid #fff; background:#fff}
.jqx-menu-vertical-office{background: #fff; border-color: #d4d4d4;}
.jqx-widget-office .jqx-grid-cell-office, .jqx-widget-office .jqx-grid-column-header-office, .jqx-widget-office .jqx-grid-group-cell-office {color: #000; border-color: #d4d4d4;}
.jqx-widget-office .jqx-grid-column-menubutton-office, .jqx-widget-office .jqx-grid-column-sortascbutton-office, .jqx-widget-office .jqx-grid-column-sortdescbutton-office, .jqx-widget-office .jqx-grid-column-filterbutton-office {
background-color: transparent;
border-color: #d4d4d4;
}
.jqx-input-button-header-office, .jqx-calendar-title-header-office, .jqx-grid-office .jqx-widget-header-office, .jqx-grid-header-office, .jqx-grid-column-header-office, .jqx-grid-office {font-family: Calibri; border-color: #d4d4d4; color: #444444; background: #fff;}
.jqx-window-header-office{font-family: Calibri; color: #444444; background: #fff;}
.jqx-grid-column-menubutton-office {
background-image: url('../images/office-icon-down.png');
}
/*applied to the column's sort button when the sort order is ascending.*/
.jqx-grid-column-sortascbutton-office {
background-image: url('../images/office-icon-up.png');
}
.jqx-grid-column-sortdescbutton-office {
background-image: url('../images/office-icon-down.png');
}
.jqx-checkbox-hover-office {
background: #fff;
}
.jqx-radiobutton-hover-office {
background: #fff;
}
.jqx-scrollbar-thumb-state-normal-horizontal-office, .jqx-scrollbar-thumb-state-normal-office {
background: #ffffff; border-color: #d4d4d4;
}
.jqx-scrollbar-thumb-state-hover-horizontal-office, .jqx-scrollbar-thumb-state-hover-office {
background: #f0f0f0; border-color: #d4d4d4;
}
.jqx-scrollbar-thumb-state-pressed-horizontal-office, .jqx-scrollbar-thumb-state-pressed-office {
background: #f0f0f0; border-color: #777777;
}
.jqx-scrollbar-button-state-normal-office
{
border: 1px solid #d4d4d4;
background: #fff;
}
/*applied to the scrollbar buttons in hovered state.*/
.jqx-scrollbar-button-state-hover-office
{
border: 1px solid #777777;
background: #fff;
}
/*applied to the scrollbar buttons in pressed state.*/
.jqx-scrollbar-button-state-pressed-office
{
border: 1px solid #777777;
background: #f0f0f0;
}
/*icons*/
.jqx-window-collapse-button-office
{
background-image: url(../images/office-icon-up.png);
background-repeat: no-repeat;
}
.jqx-window-collapse-button-collapsed-office {
background-image: url(../images/office-icon-down.png);
background-repeat: no-repeat;
}
.jqx-icon-arrow-up-office, .jqx-expander-arrow-bottom-office, .jqx-menu-item-arrow-up-office
{
background-image: url('../images/office-icon-up.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-icon-arrow-down-office, .jqx-expander-arrow-top-office, .jqx-tree-item-arrow-expand-office, .jqx-tree-item-arrow-expand-hover-office, .jqx-menu-item-arrow-down-office
{
background-image: url('../images/office-icon-down.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-icon-arrow-left-office, .jqx-menu-item-arrow-left-office
{
background-image: url('../images/office-icon-left.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-icon-arrow-right-office, .jqx-menu-item-arrow-right-office, .jqx-tree-item-arrow-collapse-office, .jqx-tree-item-arrow-collapse-hover-office
{
background-image: url('../images/office-icon-right.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-tabs-arrow-left-office, .jqx-tree-item-arrow-collapse-rtl-office, .jqx-tree-item-arrow-collapse-hover-rtl-office
{
background-image: url('../images/office-icon-left.png');
background-repeat: no-repeat;
}
.jqx-tabs-arrow-right-office
{
background-image: url('../images/office-icon-right.png');
background-repeat: no-repeat;
}
.jqx-menu-item-arrow-up-selected-office, .jqx-icon-arrow-up-selected-office{background-image:url('../images/office-icon-up.png');background-repeat:no-repeat;background-position:center;}
.jqx-menu-item-arrow-down-selected-office, .jqx-icon-arrow-down-selected-office{background-image:url('../images/office-icon-down.png');background-repeat:no-repeat;background-position:center;}
.jqx-menu-item-arrow-left-selected-office, .jqx-icon-arrow-left-selected-office{background-image:url('../images/office-icon-left.png');background-repeat:no-repeat;background-position:center;}
.jqx-menu-item-arrow-right-selected-office, .jqx-icon-arrow-right-selected-office{background-image:url('../images/office-icon-right.png');background-repeat:no-repeat;background-position:center;}
.jqx-tabs-close-button-office{background-image:url(../images/close.png); background-repeat:no-repeat; background-position:center;}
.jqx-tabs-close-button-selected-office{background-image:url(../images/close.png); background-repeat:no-repeat; background-position:center;}
.jqx-tabs-close-button-hover-office{background-image:url(../images/close.png); background-repeat:no-repeat; background-position:center;}
.jqx-expander-arrow-bottom-office,.jqx-scrollbar-office .jqx-icon-arrow-up-selected-office{background-image:url('../images/office-icon-up.png'); background-repeat:no-repeat; background-position:center;}
.jqx-expander-arrow-top-office, .jqx-scrollbar-office .jqx-icon-arrow-down-selected-office{background-image:url('../images/office-icon-down.png'); background-repeat:no-repeat; background-position:center;}
.jqx-scrollbar-office .jqx-icon-arrow-left-selected-office{background-image:url('../images/office-icon-left.png'); background-repeat:no-repeat; background-position:center;}
.jqx-scrollbar-office .jqx-icon-arrow-right-selected-office{background-image:url('../images/office-icon-right.png');background-repeat:no-repeat; background-position:center;}
.jqx-slider-slider-office
{
}
.jqx-slider-button-office
{
-moz-border-radius: 9px;
-webkit-border-radius: 9px;
border-radius: 9px;
}
.jqx-input-button-content-office
{
font-size: 10px;
}
.jqx-dropdownlist-state-normal-office, .jqx-dropdownlist-state-hover-office, .jqx-dropdownlist-state-selected-office,
.jqx-scrollbar-button-state-hover-office, .jqx-scrollbar-button-state-normal-office, .jqx-scrollbar-button-state-pressed-office,
.jqx-scrollbar-thumb-state-normal-horizontal-office, .jqx-scrollbar-thumb-state-hover-horizontal-office, .jqx-scrollbar-thumb-state-pressed-horizontal-office,
.jqx-scrollbar-thumb-state-normal-office, .jqx-scrollbar-thumb-state-pressed-office, .jqx-button-office, .jqx-tree-item-hover-office, .jqx-tree-item-selected-office,
.jqx-tree-item-office, .jqx-menu-item-office, .jqx-menu-item-hover-office, .jqx-menu-item-selected-office, .jqx-menu-item-top-office, .jqx-menu-item-top-hover-office,
.jqx-menu-item-top-selected-office, .jqx-slider-button-office, .jqx-slider-slider-office
{
-webkit-transition: background-color 100ms linear;
-moz-transition: background-color 100ms linear;
-o-transition: background-color 100ms linear;
-ms-transition: background-color 100ms linear;
transition: background-color 100ms linear;
}
.jqx-switchbutton-office {
-moz-border-radius: 0px;
-webkit-border-radius: 0px;
border-radius: 0px;
border: 2px solid #a6a6a6;
}
.jqx-switchbutton-thumb-office {
width: 12px;
background: #000;
border: 1px solid #000;
}
.jqx-switchbutton-label-on-office {
background: #429366;
color: #429366;
}
.jqx-switchbutton-label-off-office {
background: #a6a6a6;
color: #a6a6a6;
}
.jqx-icon-arrow-first-metro
{
background-image: url('../images/office-icon-first.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-icon-arrow-last-metro
{
background-image: url('../images/office-icon-last.png');
background-repeat: no-repeat;
background-position: center;
}
.jqx-switchbutton-wrapper-office {
}
.jqx-layout-office
{
background-color: #d4d4d4;
}

176
static/css/notification.css Normal file
View File

@@ -0,0 +1,176 @@
#notifications-bottom-right {
position: absolute;
width: 360px;
right: 20px;
bottom: 40px;
}
.webpushtipoutter {
z-index:9999;
position:absolute;
right:5px;
bottom:5px;
_width:330px;
}
.webpushtipinner {
position:relative;
height:66px;
padding:7px;
}
.newmailNotifyBox {
position:absolute;
bottom:0;
right:0;
z-index:5;
padding:8px 17px 7px 0;
overflow:hidden;
}
.newmailNotifyItem {
position:relative;
width:305px;
height:69px;
margin-bottom:10px;
padding:1px;
border-radius:5px;
-webkit-border-radius:5px;
box-shadow:0 2px 5px rgba(0,0,0,0.2);
-webkit-box-shadow:0 2px 5px rgba(0,0,0,0.2);
background:#ADBFC8;
background:-moz-linear-gradient(top,#C4D1D7,#98AFBA);
background:-webkit-gradient(linear,0 0,0 bottom,from(#C4D1D7),to(#98AFBA));
background:-o-linear-gradient(top,#C4D1D7,#98AFBA);
-moz-transition:box-shadow 1s;
}
.newmailNotifyItem:hover .newmailNotify {
box-shadow:0 0 5px #8EC7EF inset;
-webkit-box-shadow:0 0 5px #8EC7EF inset;
}
.newmailNotifyItem:hover .notify_type {
background:transparent;
*background:#EEF6F9;
}
.newmailNotify {
height:66px;
background:#F7FDFF;
cursor:pointer;
border-radius:5px;
-webkit-border-radius:5px;
box-shadow:0 0 9px #E5EFF5 inset;
-webkit-box-shadow:0 0 9px #E5EFF5 inset;
}
.newmailNotify .notify_close {
position:absolute;
top:-6px;
top:4px\9;
right:-6px;
right:4px\9;
width:15px;
height:15px;
height:14px\9;
overflow:hidden;
background:url(../images/mail.png) no-repeat -106px -18px #B6CFDA;
opacity:0;
filter:alpha(opacity=0);
border-radius:10px;
-webkit-border-radius:10px;
-moz-transition:opacity 0.2s ease;
-webkit-transition:opacity 0.1s ease;
_filter:alpha(opacity=100);
}
.newmailNotify:hover .notify_close:hover,.hover .notify_close:hover {
opacity:1;
filter:alpha(opacity=100);
}
.newmailNotify:hover .notify_close:active,.hover .notify_close:active {
opacity:1;
filter:alpha(opacity=100);
}
.newmailNotify:hover .notify_close,.hover .notify_close {
opacity:0.8;
filter:alpha(opacity=80);
}
.newmailNotify .notify_type {
position:relative;
float:left;
width:60px;
height:66px;
border-right:1px solid #CBDAE1;
background:#EEF6F9;
border-radius:5px 0 0 5px;
-webkit-border-radius:5px 0 0 5px;
}
.newmailNotify .notify_type span {
display:inline-block;
width:32px;
height:34px;
margin:16px 0 0 16px;
background:url(../images/notify_letter.png) no-repeat;
}
.newmailNotify .notify_type label {
position:absolute;
top:12px;
right:10px;
+right:5px;
text-align:center;
overflow:visible;
}
.newmailNotify .notify_type em {
display:inline-block;
cursor:pinter;
min-width:13px;
margin-right:-50%;
+margin-right:0;
padding:0 2px;
+padding:0 2px 2px;
border:1px solid white;
line-height:15px;
color:white;
font-weight:bold;
font-style:normal;
background:#D40707;
border-radius:8px;
-webkit-border-radius:8px;
background:-moz-linear-gradient(top,#E80505,#C70909);
background:-webkit-gradient(linear,0 0,0 bottom,from(#E80505),to(#C70909));
background:-o-linear-gradient(top,#E80505,#C70909);
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
.newmailNotify .notify_type em {
border:none;
}
}.newmailNotify .notify_content {
margin-left:66px;
overflow:hidden;
width:230px;
}
.newmailNotify p {
margin:0;
padding:2px 0 1px;
white-space:normal;
white-space:nowrap\9;
_white-space:normal;
height:auto\9;
_height:16px;
_line-height:16px;
overflow:hidden;
text-overflow:ellipsis;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
.newmailNotify p {
margin-top: 2px;
white-space:nowrap;
overflow:hidden;
text-overflow:ellipsis;
}
}.newmailNotify .notify_location {
padding:7px 0 1px;
font-size:12px;
font-weight:bold;
}
.newmailNotify .notify_digest {
color:#8596A9;
padding-top:2px
}

BIN
static/images/add.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 807 B

BIN
static/images/clear.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
static/images/close.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

BIN
static/images/delete.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
static/images/drag.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 541 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

BIN
static/images/filter.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

BIN
static/images/help.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 817 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
static/images/icon-down.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

BIN
static/images/icon-edit.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 B

BIN
static/images/icon-last.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

BIN
static/images/icon-left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

BIN
static/images/icon-save.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
static/images/icon-time.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 556 B

BIN
static/images/icon-up.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

BIN
static/images/loader.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
static/images/mail.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 154 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 B

BIN
static/images/refresh.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 881 B

BIN
static/images/search.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 B

BIN
static/images/sortasc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
static/images/sortdesc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

6
static/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

55
static/js/getTheme.js Normal file
View File

@@ -0,0 +1,55 @@
function getTheme() {
var theme = "office";
var url = "../css/jqx."+theme+".css";
if (document.createStyleSheet != undefined) {
var hasStyle = false;
$.each(document.styleSheets, function (index, value) {
if (value.href != undefined && value.href.indexOf(theme) != -1) {
hasStyle = true;
return false;
}
});
if (!hasStyle) {
document.createStyleSheet(url);
}
}
else {
var hasStyle = false;
if (document.styleSheets) {
$.each(document.styleSheets, function (index, value) {
if (value.href != undefined && value.href.indexOf(theme) != -1) {
hasStyle = true;
return false;
}
});
}
if (!hasStyle) {
var link = $('<link rel="stylesheet" href="' + url + '" media="screen" />');
link[0].onload = function () {
if ($.jqx && $.jqx.ready) {
$.jqx.ready();
};
}
$(document).find('head').append(link);
}
}
$.jqx = $.jqx || {};
$.jqx.theme = theme;
return theme;
};
var theme = '';
try
{
if (jQuery) {
theme = getTheme();
}
else {
$(document).ready(function () {
theme = getThemegetThemegetThemegetThemegetThemegetTheme();
});
}
}
catch (error) {
var er = error;
}

7
static/js/jquery-ui.min.js vendored Normal file

File diff suppressed because one or more lines are too long

4
static/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

7
static/js/jqxbuttons.js Normal file

File diff suppressed because one or more lines are too long

7
static/js/jqxcore.js Normal file

File diff suppressed because one or more lines are too long

7
static/js/jqxdata.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

13340
static/js/jqxgrid.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

7
static/js/jqxlistbox.js Normal file

File diff suppressed because one or more lines are too long

7
static/js/jqxmenu.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

7
static/js/jqxtabs.js Normal file

File diff suppressed because one or more lines are too long

7
static/js/jqxwindow.js Normal file

File diff suppressed because one or more lines are too long

758
static/js/loadgrid.js Normal file
View File

@@ -0,0 +1,758 @@
//全局变量
var urlbase="../../api.php";//api.php基地址
var messageList=null;//记录缓存,用于判断是否有新的记录
var setIntervalID=null;//定时器ID用于网络自适应调节timeout
var interval=1000;//向服务器获取记录的时间间隔同时也是ajax timeout时间
$(document).ready(function () {
var self = this;
var source =
{
datatype: "json",
datafields: [
{ name: 'user_IP' },
{ name: 'location'},
{ name: 'data_type'},
{ name: 'keepsession' },
{ name: 'user_port'},
{ name: 'protocol'},
{ name: 'request_method' },
{ name: 'request_URI' },
{ name: 'request_time' },
{ name: 'headers_data' },
{ name: 'get_data' },
{ name: 'post_data' },
{ name: 'cookie_data' },
{ name: 'decoded_get_data' },
{ name: 'decoded_post_data' },
{ name: 'decoded_cookie_data' },
{ name: 'request_date_string' },
{ name: 'request_time_string' },
{ name: 'request_date_and_time_string' },
{ name: 'client' },
],
id: 'request_time',
url: urlbase+"?cmd=list",
root: 'data',
};
var dataAdapter = new $.jqx.dataAdapter(source,{
downloadComplete: function (data, status, xhr) {
if(status=="success")
{
var i = data.length;
while (i--) {
var date=new Date(data[i].request_time*1000)
data[i].request_date_string=date.getFullYear()+ "年" +(date.getMonth() + 1) + "月" + date.getDate()+ "日";
data[i].request_time_string=date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
data[i].request_date_and_time_string=data[i].request_date_string+" "+data[i].request_time_string;
data[i].keepsession=(data[i].keepsession==true)?"是":"否";
data[i].client=data[i].headers_data["User-Agent"]?get_client_info(data[i].headers_data["User-Agent"]):"未知";
var data_type=new Object();
var get_keys=Object.keys(data[i].get_data);
var post_keys=Object.keys(data[i].post_data);
var cookie_keys=Object.keys(data[i].cookie_data);
if(get_keys.length>0)
data_type.GET=get_keys;
if(post_keys.length>0)
data_type.POST=post_keys;
if(cookie_keys.length>0)
data_type.COOKIE=cookie_keys;
data[i].data_type =JSON.stringify(data_type);
}
return data;
}
},
});
var initrowdetails = function (index, parentElement, gridElement, datarecord) {
var tabsdiv = null;
var information = null;
var notes = null;
var get_grid=null;
var post_grid=null;
var cookie_grid=null;
var headers_grid=null;
tabsdiv = $($(parentElement).children()[0]);
if (tabsdiv != null) {
information = tabsdiv.find('.information');
get_grid = tabsdiv.find('.get_grid');
post_grid = tabsdiv.find('.post_grid');
cookie_grid = tabsdiv.find('.cookie_grid');
headers_grid = tabsdiv.find('.headers_grid');
//datarecord.client=datarecord.headers_data["User-Agent"]?get_client_info(datarecord.headers_data["User-Agent"]):"未知";
var get_data=new Array();
for(key in datarecord.get_data){
var get_data_item=new Array();
get_data_item.push(key);
get_data_item.push(datarecord.get_data[key]);
var decoded_value="";
if(datarecord.decoded_get_data)
decoded_value=datarecord.decoded_get_data[key];
get_data_item.push(decoded_value);
get_data.push(get_data_item);
}
var get_source =
{
localdata: get_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
{ name: 'decoded_value', type: 'string', map: '2' },
],
datatype: "array"
};
var get_source_dataAdapter= new $.jqx.dataAdapter(get_source);
get_grid.jqxGrid(
{
autorowheight: true,
autorowheight: true,
columnsautoresize: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsresize: true,
height: 176,
width: '100%',
source: get_source_dataAdapter,
ready: function () {
if(get_source.localdata.length&&get_source.localdata.length>0)
get_grid.jqxGrid('autoresizecolumn', 'key');
},
columns: datarecord.decoded_get_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value'},
]
});
var post_data=new Array();
for(key in datarecord.post_data){
var post_data_item=new Array();
post_data_item.push(key);
post_data_item.push(datarecord.post_data[key]);
var decoded_value="";
if(datarecord.decoded_post_data)
decoded_value=datarecord.decoded_post_data[key];
post_data_item.push(decoded_value);
post_data.push(post_data_item);
}
var post_source =
{
localdata: post_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
{ name: 'decoded_value', type: 'string', map: '2' },
],
datatype: "array"
};
var post_source_dataAdapter= new $.jqx.dataAdapter(post_source);
post_grid.jqxGrid(
{
ready: function () {
if(post_source.localdata.length&&post_source.localdata.length>0)
post_grid.jqxGrid('autoresizecolumn', 'key');
},
autorowheight: true,
pageable: true,
columnsautoresize: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
height: 176,
width: '100%',
source: post_source_dataAdapter,
columns: datarecord.decoded_post_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
]
});
var cookie_data=new Array();
for(key in datarecord.cookie_data){
var cookie_data_item=new Array();
cookie_data_item.push(key);
cookie_data_item.push(datarecord.cookie_data[key]);
var decoded_value="";
if(datarecord.decoded_cookie_data)
decoded_value=datarecord.decoded_cookie_data[key];
cookie_data_item.push(decoded_value);
cookie_data.push(cookie_data_item);
}
var cookie_source =
{
localdata: cookie_data,
datafields: [
{ name: 'key', type:'string', map:'0'},
{ name: 'value', type:'string', map:'1'},
{ name: 'decoded_value', type:'string', map:'2'},
],
datatype: "array"
};
var cookie_source_dataAdapter= new $.jqx.dataAdapter(cookie_source);
cookie_grid.jqxGrid(
{
ready: function () {
if(cookie_source.localdata.length&&cookie_source.localdata.length>0)
cookie_grid.jqxGrid('autoresizecolumn', 'key');
},
columnsautoresize: true,
autorowheight: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
height: 176,
width: '100%',
source: cookie_source_dataAdapter,
columns: datarecord.decoded_cookie_data?[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
{ text: '解码', datafield: 'decoded_value'},
]:[
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value' },
]
});
var headers_data=new Array();
for(key in datarecord.headers_data){
var headers_data_item=new Array();
headers_data_item.push(key);
headers_data_item.push(datarecord.headers_data[key]);
headers_data.push(headers_data_item);
}
var headers_source =
{
localdata: headers_data,
datafields: [
{ name: 'key', type: 'string', map: '0'},
{ name: 'value', type: 'string', map: '1' },
],
datatype: "array"
};
var headers_source_dataAdapter= new $.jqx.dataAdapter(headers_source);
headers_grid.jqxGrid(
{
ready: function () {
if(headers_source.localdata.length&&headers_source.localdata.length>0)
headers_grid.jqxGrid('autoresizecolumn', 'key');
},
columnsautoresize: true,
autorowheight: true,
pageable: true,
pagermode: "simple",
scrollmode: 'deferred',
localization: getLocalization('zh'),
enablebrowserselection:true,
columnsautoresize: true,
columnsresize: true,
width: '100%',
height: 176,
source: headers_source_dataAdapter,
columns: [
{ text: '键', datafield: 'key' },
{ text: '值', datafield: 'value'},
]
});
var container = $('<div style="margin: 25px;"></div>')
container.appendTo($(information));
var leftcolumn = $('<div style="float: left; width: 45%;"></div>');
var rightcolumn = $('<div style="float: left; width: 40%;"></div>');
container.append(leftcolumn);
container.append(rightcolumn);
var data_item = "<div style='margin: 10px;'><b>日期:</b> " + datarecord.request_date_string + "</div>";
var ip_item = "<div style='margin: 10px;'><b>IP</b> " + datarecord.user_IP + "</div>";
var method_item = "<div style='margin: 10px;'><b>协议:</b> " + datarecord.request_method + "</div>";
var location_item = "<div style='margin: 10px;'><b>位置:</b> " + datarecord.location + "</div>";
$(leftcolumn).append(data_item);
$(leftcolumn).append(ip_item);
$(leftcolumn).append(method_item);
$(leftcolumn).append(location_item);
var time_item = "<div style='margin: 10px;'><b>时间:</b> " + datarecord.request_time_string + "</div>";
var port_item = "<div style='margin: 10px;'><b>端口:</b> " + datarecord.user_port + "</div>";
var uri_item = "<div style='margin: 10px;'><b>访问地址:</b> " + datarecord.request_URI + "</div>";
var client_item = "<div style='margin: 10px;'><b>客户端:</b> " + datarecord.client + "</div>";
$(rightcolumn).append(time_item);
$(rightcolumn).append(port_item);
$(rightcolumn).append(uri_item);
$(rightcolumn).append(client_item);
$(tabsdiv).jqxTabs({
width:'95%', height: '100%'
});
}
}
$("#panelGrid").jqxGrid(
{
pageable: true,
ready: function () {
//$('#panelGrid').jqxGrid('autoresizecolumn', 'request_date_and_time_string');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'data_type');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'user_IP');
},
pagerrenderer: function() {
var container = $("<div style='overflow: hidden; position: relative; '></div>");
var deleteButton = $("<div style='float: left; margin-left: 5px;'><img style='position: relative; margin-top: 2px;' src='static/images/delete.png'/><span style='margin-left: 4px; position: relative; top: 3px;'>删除</span></div>");
var clearButton = $("<div style='float: left; margin-left: 5px;'><img style='position: relative; margin-top: 2px;' src='static/images/clear.png'/><span style='margin-left: 4px; position: relative; top: 3px;'>清空</span></div>");
var searchButton = $("<div style='float: left; margin-left: 5px;'><img style='position: relative; margin-top: 2px;' src='static/images/search.png'/><span style='margin-left: 4px; position: relative; top: 3px;'>查询</span></div>");
container.append(deleteButton);
container.append(clearButton);
container.append(searchButton);
deleteButton.jqxButton({width: 65,height: 20});
clearButton.jqxButton({width: 65,height: 20});
searchButton.jqxButton({width: 65,height: 20});
// delete selected row.
deleteButton.click(function(event) {
var selectedrowindex = $("#panelGrid").jqxGrid('getselectedrowindex');
if(selectedrowindex>=0)
{
$('#deleteConfirmWindow').jqxWindow('open');
$("#deleteConfirmWindow").addClass('animated');
}
});
// reload grid data.
clearButton.click(function(event) {
$('#clearConfirmWindow').jqxWindow('open');
$("#clearConfirmWindow").addClass('animated');
//$("#panelGrid").jqxGrid({
// source: getAdapter()
//});
});
// search for a record.
searchButton.click(function(event) {
//var offset = $("#panelGrid").offset();
$("#searchWindow").jqxWindow('open');
$("#searchWindow").addClass('animated');
//$("#jqxwindow").jqxWindow('move', offset.left + 30, offset.top + 30);
});
var pageElementsContainer = $("<div style='overflow: hidden;float: right;position: relative;margin: 5.5px; '></div>");
var datainfo = $("#panelGrid").jqxGrid('getdatainformation');
var paginginfo = datainfo.paginginformation;
var leftButton = $("<div style='padding: 0px; float: left;'><div style='margin-left: 9px; width: 16px; height: 16px;'></div></div>");
leftButton.find('div').addClass('jqx-icon-arrow-left');
leftButton.width(36);
leftButton.jqxButton({
theme: 'energyblue'
});
var rightButton = $("<div style='padding: 0px; margin: 0px 3px; float: left;'><div style='margin-left: 9px; width: 16px; height: 16px;'></div></div>");
rightButton.find('div').addClass('jqx-icon-arrow-right');
rightButton.width(36);
rightButton.jqxButton({
theme: 'energyblue'
});
var label = $("<div style='font-size: 14px; margin: 1px 1px; font-weight: bold; float: left;'></div>");
label.text("1-" + paginginfo.pagesize + ' of ' + datainfo.rowscount);
leftButton.appendTo(pageElementsContainer);
rightButton.appendTo(pageElementsContainer);
label.appendTo(pageElementsContainer);
pageElementsContainer.appendTo(container);
self.label = label;
// update buttons states.
var handleStates = function(event, button, className, add) {
button.on(event,
function() {
if (add == true) {
button.find('div').addClass(className);
} else button.find('div').removeClass(className);
});
}
rightButton.click(function() {
$("#panelGrid").jqxGrid('gotonextpage');
});
leftButton.click(function() {
$("#panelGrid").jqxGrid('gotoprevpage');
});
return container;
},
//selectionmode: 'multiplerowsextended',
scrollmode: 'logical',
sortable:true,
pagesize:25,
localization: getLocalization('zh'),
width: '100%',
height:$("#nav-section").height()-$("#dash-logo").outerHeight(true)-3,
source: dataAdapter,
enablebrowserselection:true,
columnsresize: true,
rowdetails: true,
rowdetailstemplate: { rowdetails: $("#xss-detail-template").html(), rowdetailsheight: 222 },
initrowdetails: initrowdetails,
columns: [
{ text: '时间', datafield: 'request_date_and_time_string',width:160 },
{ text: 'IP', datafield: 'user_IP'},
{ text: '来源', datafield: 'location' },
{ text: '客户端', datafield: 'client' },
{ text: '请求', datafield: 'request_method' ,width:60},
{ text: '携带数据', datafield: 'data_type'},
{ text: '保持连接', datafield: 'keepsession',width:60,cellsalign: 'center'}
]
});
$("#panelGrid").on('pagechanged', function () {
var datainfo = $("#panelGrid").jqxGrid('getdatainformation');
var paginginfo = datainfo.paginginformation;
self.label.text(1 + paginginfo.pagenum * paginginfo.pagesize + "-" + Math.min(datainfo.rowscount, (paginginfo.pagenum + 1) * paginginfo.pagesize) + ' of ' + datainfo.rowscount);
});
/*所有窗口初始化*/
//删除记录确认窗口
$('#deleteConfirmWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#deleteConfirm_ok'), cancelButton: $('#deleteConfirm_cancel'),
autoOpen: false,
});
$('#deleteConfirm_ok').jqxButton({ width: '65px' });
$('#deleteConfirm_cancel').jqxButton({ width: '65px' });
$('#deleteConfirmWindow').on('close', function (event) {
if (event.args.dialogResult.OK) {
var selectedrowindex = $("#panelGrid").jqxGrid('getselectedrowindex');
var id = $("#panelGrid").jqxGrid('getrowid', selectedrowindex);
$.ajax({
url: urlbase+"?cmd=del&id="+id,
dataType: "json",
timeout : interval,
success: function(data)
{
if(data==true)
$("#panelGrid").jqxGrid('deleterow', id);
else
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
},
complete : function(XMLHttpRequest,status){
    if(status=='timeout')
    {
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
  }
});
}
});
//清空记录确认窗口
$('#clearConfirmWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#clearConfirm_ok'), cancelButton: $('#clearConfirm_cancel'),
autoOpen: false,
});
$('#clearConfirm_ok').jqxButton({ width: '65px' });
$('#clearConfirm_cancel').jqxButton({ width: '65px' });
$('#clearConfirmWindow').on('close', function (event) {
if (event.args.dialogResult.OK) {
$.ajax({
url: urlbase+"?cmd=clear",
dataType: "json",
timeout : interval,
success: function(data)
{
if(data==true)
$('#panelGrid').jqxGrid('clear');
else
{
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
},
complete : function(XMLHttpRequest,status){
    if(status=='timeout')
    {
$('#failedWindow').jqxWindow('open');
$("#failedWindow").addClass('animated');
}
  }
});
}
});
$('#failedWindow').jqxWindow({
height: 100, width: 270,
resizable: false, isModal: true, modalOpacity: 0.3,
okButton: $('#failed_ok'),
autoOpen: false,
});
$('#failed_ok').jqxButton({ width: '65px' });
//查询窗口
$("#searchWindow").jqxWindow({ resizable: false, autoOpen: false, width: 210, height: 180 });
// create find and clear buttons.
$("#findButton").jqxButton({ width: 70});
$("#clearButton").jqxButton({ width: 70});
// find records that match a criteria.
$("#dropdownlist").jqxDropDownList({ autoDropDownHeight: true, selectedIndex: 0, width: 200, height: 23,
source: [
'时间', 'IP', '来源', '客户端','请求', '携带数据', '保持连接'
]
});
$("#findButton").click(function () {
$("#panelGrid").jqxGrid('clearfilters');
var searchColumnIndex = $("#dropdownlist").jqxDropDownList('selectedIndex');
var datafield = "";
switch (searchColumnIndex) {
case 0:
datafield = "request_date_and_time_string";
break;
case 1:
datafield = "user_IP";
break;
case 2:
datafield = "location";
break;
case 3:
datafield = "client";
break;
case 4:
datafield = "request_method";
break;
case 5:
datafield = "data_type";
break;
case 6:
datafield = "keepsession";
break;
}
var searchText = $("#inputField").val();
var filtergroup = new $.jqx.filter();
var filter_or_operator = 1;
var filtervalue = searchText;
var filtercondition = 'contains';
var filter = filtergroup.createfilter('stringfilter', filtervalue, filtercondition);
filtergroup.addfilter(filter_or_operator, filter);
$("#panelGrid").jqxGrid('addfilter', datafield, filtergroup);
// apply the filters.
$("#panelGrid").jqxGrid('applyfilters');
});
// clear filters.
$("#clearButton").click(function () {
$("#panelGrid").jqxGrid('clearfilters');
});
//主面板大小自适应
$(window).resize(function() {
$('#panelGrid').jqxGrid({ height: $("#nav-section").height()-$("#dash-logo").outerHeight(true)-3 });
//$('#panelGrid').jqxGrid('autoresizecolumn', 'request_date_and_time_string');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'data_type');
//$('#panelGrid').jqxGrid('autoresizecolumn', 'user_IP');
});
//定时判断是否有新的记录
checkNewMessages();
setIntervalID=setInterval(checkNewMessages, interval);
});
//获取新列表
function checkNewMessages(){
$.ajax({
url: urlbase+"?cmd=simplelist",
dataType: "json",
timeout : interval,
success: function(data)
{
if(messageList)
{
var sum=0;
var lastedID=null;
for(var id in data) {
if(messageList.indexOf(data[id])<0)
{
sum++;
lastedID=data[id];
}
}
if(sum>0)
showNotification(sum,lastedID,interval);
}
messageList=data;
},
complete : function(XMLHttpRequest,status){
    if(status=='timeout'){
      interval*=2;
if(setIntervalID)
{
clearInterval(setIntervalID);
if(interval<10000)
setIntervalID=setInterval(checkNewMessages, interval);
}
    }
  }
});
}
//根据useragent判断操作系统浏览器版本
function get_client_info(agent){
var browser = "未知浏览器";
var browser_version = "";
if (agent.indexOf("Firefox/") > 0) {
var bv=agent.match(/Firefox\/([^;)]+)+/i);
browser = "Firefox";
browser_version = bv[1]; //获取火狐浏览器的版本号
} else if (agent.indexOf("Maxthon") > 0) {
var bv=agent.match(/Maxthon\/([\d\.]+)/);
browser = "傲游";
browser_version = bv[1];
} else if (agent.indexOf("MSIE") > 0) {
var bv=agent.match(/MSIE\s+([^;)]+)+/i);
browser = "IE";
browser_version = bv[1]; //获取IE的版本号
} else if (agent.indexOf("OPR") > 0) {
var bv=agent.match(/OPR\/([\d\.]+)/);
browser = "Opera";
browser_version = bv[1];
} else if(agent.indexOf("Edge") > 0) {
//win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
var bv=agent.match(/Edge\/([\d\.]+)/);
browser = "Edge";
browser_version = bv[1];
} else if (agent.indexOf("Chrome") > 0) {
var bv=agent.match(/Chrome\/([\d\.]+)/);
browser = "Chrome";
browser_version = bv[1]; //获取google chrome的版本号
} else if(agent.indexOf('rv:')>0 && agent.indexOf('Gecko')>0){
var bv=agent.match(/rv:([\d\.]+)/);
browser = "IE";
browser_version = bv[1];
}
browser_version=browser_version.match(/^[0-9\.]+$/)?browser_version:"未知";
$os = '未知操作系统';
if (agent.match(/win/i) && (agent.indexOf("95") > 0))
$os = 'Windows 95';
else if (agent.match(/win 9x/i) && (agent.indexOf("4.90") > 0))
$os = 'Windows ME';
else if (agent.match(/win/i) && agent.match(/98/i))
$os = 'Windows 98';
else if (agent.match(/win/i) && agent.match(/nt 6.0/i))
$os = 'Windows Vista';
else if (agent.match(/win/i) && agent.match(/nt 6.1/i))
$os = 'Windows 7';
else if (agent.match(/win/i) && agent.match(/nt 6.2/i))
$os = 'Windows 8';
else if(agent.match(/win/i) && agent.match(/nt 10.0/i))
$os = 'Windows 10';
else if (agent.match(/win/i) && agent.match(/nt 5.1/i))
$os = 'Windows XP';
else if (agent.match(/win/i) && agent.match(/nt 5/i))
$os = 'Windows 2000';
else if (agent.match(/win/i) && agent.match(/nt/i))
$os = 'Windows NT';
else if (agent.match(/win/i) && agent.match(/32/i))
$os = 'Windows 32';
else if (agent.match(/linux/i))
$os = 'Linux';
else if (agent.match(/unix/i))
$os = 'Unix';
else if (agent.match(/sun/i) && agent.match(/os/i))
$os = 'SunOS';
else if (agent.match(/ibm/i) && agent.match(/os/i))
$os = 'IBM OS/2';
else if (agent.match(/Mac/i) && agent.match(/PC/i))
$os = 'Macintosh';
else if (agent.match(/PowerPC/i))
$os = 'PowerPC';
else if (agent.match(/AIX/i))
$os = 'AIX';
else if (agent.match(/HPUX/i))
$os = 'HPUX';
else if (agent.match(/NetBSD/i))
$os = 'NetBSD';
else if (agent.match(/BSD/i))
$os = 'BSD';
else if (agent.match(/OSF1/i))
$os = 'OSF1';
else if (agent.match(/IRIX/i))
$os = 'IRIX';
else if (agent.match(/FreeBSD/i))
$os = 'FreeBSD';
else if (agent.match(/teleport/i))
$os = 'teleport';
else if (agent.match(/flashget/i))
$os = 'flashget';
else if (agent.match(/webzip/i))
$os = 'webzip';
else if (agent.match(/offline/i))
$os = 'offline';
return $os+' '+browser+'('+browser_version+')';
}

118
static/js/localization.js Normal file
View File

@@ -0,0 +1,118 @@
var getLocalization = function (culture) {
var localization = null;
switch (culture) {
case "zh":
default:
localization =
{
// separator of parts of a date (e.g. '/' in 11/05/1955)
'/': "/",
// separator of parts of a time (e.g. ':' in 05:44 PM)
':': ":",
// the first day of the week (0 = Sunday, 1 = Monday, etc)
firstDay: 0,
days: {
// full day names
names: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
// abbreviated day names
namesAbbr: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
// shortest day names
namesShort: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]
},
months: {
// full month names (13 months for lunar calendards -- 13th month should be "" if not lunar)
names: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", ""],
// abbreviated month names
namesAbbr: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", ""]
},
// AM and PM designators in one of these forms:
// The usual view, and the upper and lower case versions
// [standard,lowercase,uppercase]
// The culture does not use AM or PM (likely all standard date formats use 24 hour time)
// null
AM: ["AM", "am", "AM"],
PM: ["PM", "pm", "PM"],
eras: [
// eras in reverse chronological order.
// name: the name of the era in this culture (e.g. A.D., C.E.)
// start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era.
// offset: offset in years from gregorian calendar
{ "name": "A.D.", "start": null, "offset": 0 }
],
twoDigitYearMax: 2029,
patterns: {
// short date pattern
d: "M/d/yyyy",
// long date pattern
D: "dddd, MMMM dd, yyyy",
// short time pattern
t: "h:mm tt",
// long time pattern
T: "h:mm:ss tt",
// long date, short time pattern
f: "dddd, MMMM dd, yyyy h:mm tt",
// long date, long time pattern
F: "dddd, MMMM dd, yyyy h:mm:ss tt",
// month/day pattern
M: "MMMM dd",
// month/year pattern
Y: "yyyy MMMM",
// S is a sortable format that does not vary by culture
S: "yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss",
// formatting of dates in MySQL DataBases
ISO: "yyyy-MM-dd hh:mm:ss",
ISO2: "yyyy-MM-dd HH:mm:ss",
d1: "dd.MM.yyyy",
d2: "dd-MM-yyyy",
d3: "dd-MMMM-yyyy",
d4: "dd-MM-yy",
d5: "H:mm",
d6: "HH:mm",
d7: "HH:mm tt",
d8: "dd/MMMM/yyyy",
d9: "MMMM-dd",
d10: "MM-dd",
d11: "MM-dd-yyyy"
},
percentsymbol: "%",
currencysymbol: "$",
currencysymbolposition: "before",
decimalseparator: '.',
thousandsseparator: ',',
pagergotopagestring: "跳至:",
pagershowrowsstring: "页 行数:",
pagerrangestring: " of ",
pagerpreviousbuttonstring: "前一页",
pagernextbuttonstring: "后一页",
pagerfirstbuttonstring: "第一页",
pagerlastbuttonstring: "最后一页",
groupsheaderstring: "Drag a column and drop it here to group by that column",
sortascendingstring: "升序",
sortdescendingstring: "降序",
sortremovestring: "取消",
groupbystring: "Group By this column",
groupremovestring: "Remove from groups",
filterclearstring: "Clear",
filterstring: "Filter",
filtershowrowstring: "Show rows where:",
filterorconditionstring: "Or",
filterandconditionstring: "And",
filterselectallstring: "(Select All)",
filterchoosestring: "Please Choose:",
filterstringcomparisonoperators: ['empty', 'not empty', 'enthalten', 'enthalten(match case)',
'does not contain', 'does not contain(match case)', 'starts with', 'starts with(match case)',
'ends with', 'ends with(match case)', 'equal', 'equal(match case)', 'null', 'not null'],
filternumericcomparisonoperators: ['equal', 'not equal', 'less than', 'less than or equal', 'greater than', 'greater than or equal', 'null', 'not null'],
filterdatecomparisonoperators: ['equal', 'not equal', 'less than', 'less than or equal', 'greater than', 'greater than or equal', 'null', 'not null'],
filterbooleancomparisonoperators: ['equal', 'not equal'],
validationstring: "Entered value is not valid",
emptydatastring: "无数据",
filterselectstring: "Select Filter",
loadtext: "载入中",
clearstring: "清除",
todaystring: "今天"
}
break;
}
return localization;
}

56
static/js/notification.js Normal file
View File

@@ -0,0 +1,56 @@
var unreadNum=0;
var oldTitle=document.title;
document.documentElement.style.overflow="hidden";
function readNotification(){
unreadNum=0;
if(document.title)
document.title=oldTitle;
$(this).parent().fadeOut(200);
//reload data
$('#panelGrid').jqxGrid('updatebounddata');
//$("#panelGrid").jqxGrid({ source: getAdapter() });
}
function showNotification(newUnreadNum,lastedID,interval){
unreadNum+=newUnreadNum;
$.ajax({
url: urlbase+"?cmd=get&id="+lastedID,
dataType: "json",
timeout : interval,
success: function(data)
{
if(document.title)
document.title='【收到'+unreadNum+"份消息】"+document.title;
var notificationHTML='<div id="webpushtipcontainer" class="webpushtipoutter" ><div class="webpushtipinner"><div id="webpushtip1" style="visibility: visible; bottom: 0px;" class="newmailNotifyItem notify_mail"><div class="newmailNotify" id="newNotification"><a nocheck="true" id="webpushtip1close" class="notify_close"title="关闭"></a><div class="notify_type"><span></span><label><em id="unreadNum">1</em></label></div><div class="notify_content"><p class="notify_location">未知</p><p class="notify_title">0.0.0.0</p><p class="notify_digest">GET:0个 POST:0个 Cookie:0个</p></div></div></div></div></div>';
$("#webpushtipcontainer").remove();
$("#notifications-bottom-right").append(notificationHTML);
$("#webpushtipcontainer").addClass('animated bounceInUp');
$('#webpushtip1close').click(function(event){$(this).parent().parent().fadeOut(200);event.stopPropagation();});
$("#newNotification").click(readNotification);
$('#unreadNum').text(unreadNum);
$('.notify_location').text(data.location);
$('.notify_title').text(data.user_IP);
$('.notify_digest').text("GET:"+Object.keys(data.get_data).length+"个 POST:"+Object.keys(data.post_data).length+"个 Cookie:"+Object.keys(data.cookie_data).length+"个");
$("#notifications-bottom-right").addClass('animated bounceInUp');
},
complete : function(XMLHttpRequest,status){
if(status=='timeout'){
var notificationHTML='<div id="webpushtipcontainer" class="webpushtipoutter" ><div class="webpushtipinner"><div id="webpushtip1" style="visibility: visible; bottom: 0px;" class="newmailNotifyItem notify_mail"><div class="newmailNotify" id="newNotification"><a nocheck="true" id="webpushtip1close" class="notify_close"title="关闭"></a><div class="notify_type"><span></span><label><em id="unreadNum">1</em></label></div><div class="notify_content"><p class="notify_location">未知来源</p><p class="notify_title">网络错误</p><p class="notify_digest">请检查网络连接</p></div></div></div></div></div>';
$("#webpushtipcontainer").remove();
$("#notifications-bottom-right").append(notificationHTML);
$("#webpushtipcontainer").addClass('animated bounceInUp');
$('#webpushtip1close').click(function(event){$(this).parent().parent().fadeOut(200);event.stopPropagation();});
$("#newNotification").click(readNotification);
$('#unreadNum').text(unreadNum);
$("#notifications-bottom-right").addClass('animated bounceInUp');     
}
}
});
}

View File

@@ -1,6 +1,5 @@
<?php
require_once("aes.php");
function getIP()
{
if(isset($_SERVER['HTTP_CLIENT_IP'])) {
@@ -35,20 +34,6 @@ if (!function_exists('getallheaders')) {
}
}
function stripStr($str){
if(get_magic_quotes_gpc())
$str=stripslashes($str);
return addslashes(htmlspecialchars($str,ENT_QUOTES));
}
function stripArr($arr){
$new_arr=array();
foreach($arr as $k => $v) {
$new_arr[stripStr($k)] = stripStr($v);
}
return $new_arr;
}
function tryBase64Decode($arr)
{
if(isset($arr)&&count($arr)>0)
@@ -56,8 +41,10 @@ function tryBase64Decode($arr)
$isChanged=0;
$new_arr = array();
foreach($arr as $k => $v) {
if(isBase64Formatted($v)) {
foreach($arr as $k => $v)
{
if(isBase64Formatted($v))
{
$v=base64_decode($v);
$isChanged=1;
}
@@ -76,9 +63,16 @@ function tryBase64Decode($arr)
function isBase64Formatted($str)
{
if(preg_match('/^[A-Za-z0-9+\/=]+$/',$str))
if ($str == base64_encode(base64_decode($str)))
if(preg_match('/^[A-Za-z0-9\x00-\x80~!@#$%&_+-=:";\'<>,\/"\[\]\\\^\.\|\?\*\+\(\)\{\}\s]+$/',base64_decode($str)))
{
$decoded_str=base64_decode($str);
if ($str == base64_encode($decoded_str))
{
if(preg_match('/^[A-Za-z0-9\x00-\x80~!@#$%&_+-=:";\'<>,\/"\[\]\\\^\.\|\?\*\+\(\)\{\}\s]+$/',$decoded_str))
{
return true;
}
}
}
return false;
}
@@ -92,5 +86,4 @@ function decrypt($info,$encryptPass)
return AESDecryptCtr($info,$encryptPass);
}
?>