anyproxy/lib/webInterface.js

157 lines
5.0 KiB
JavaScript
Raw Normal View History

2014-09-18 17:42:01 +08:00
var express = require("express"),
url = require('url'),
fs = require("fs"),
2015-04-25 10:28:40 +08:00
path = require("path"),
2014-09-18 17:42:01 +08:00
events = require("events"),
inherits = require("util").inherits,
2014-10-21 11:18:55 +08:00
qrCode = require('qrcode-npm'),
2015-04-25 10:28:40 +08:00
util = require("./util"),
certMgr = require("./certMgr"),
logUtil = require("./log"),
2015-07-12 21:19:49 +08:00
juicer = require("juicer"),
compress = require('compression');
2014-09-18 17:42:01 +08:00
2015-04-25 10:28:40 +08:00
function webInterface(config){
var port = config.port,
wsPort = config.wsPort,
2015-07-07 17:31:56 +08:00
ipAddress = config.ip,
userRule = config.userRule,
2015-07-12 21:19:49 +08:00
ruleSummary = "",
customMenu = [],
server;
2015-07-07 17:31:56 +08:00
try{
ruleSummary = userRule.summary();
2015-07-12 21:19:49 +08:00
customMenu = userRule._getCustomMenu();
2015-07-07 17:31:56 +08:00
}catch(e){}
var self = this,
myAbsAddress = "http://" + ipAddress + ":" + port +"/",
2015-04-25 10:28:40 +08:00
crtFilePath = certMgr.getRootCAFilePath(),
staticDir = path.join(__dirname,'../web');
2014-09-18 17:42:01 +08:00
var app = express();
app.use(compress()); //invoke gzip
2014-09-18 17:42:01 +08:00
app.use(function(req, res, next) {
res.setHeader("note", "THIS IS A REQUEST FROM ANYPROXY WEB INTERFACE");
return next();
});
2015-08-06 23:13:17 +08:00
app.get("/lastestLog",function(req,res){
2015-08-07 14:27:57 +08:00
recorder.getRecords(null,120,function(err,docs){
2015-08-06 23:13:17 +08:00
if(err){
res.end(err.toString());
}else{
res.json(docs);
}
});
});
2014-09-18 17:42:01 +08:00
app.get("/fetchBody",function(req,res){
var query = req.query;
if(query && query.id){
GLOBAL.recorder.getDecodedBody(query.id, function(err, result){
if(err || !result || !result.content){
res.json({});
}else if(result.type && result.type == "image" && result.mime){
if(query.raw){
//TODO : cache query result
res.type(result.mime).end(result.content);
}else{
res.json({
id : query.id,
type : result.type,
ref : "/fetchBody?id=" + query.id + "&raw=true"
});
}
}else{
res.json({
id : query.id,
type : result.type,
content : result.content
});
}
});
}else{
res.end({});
}
});
app.get("/fetchCrtFile",function(req,res){
if(crtFilePath){
res.setHeader("Content-Type","application/x-x509-ca-cert");
res.setHeader("Content-Disposition",'attachment; filename="rootCA.crt"');
res.end(fs.readFileSync(crtFilePath,{encoding:null}));
}else{
res.setHeader("Content-Type","text/html");
res.end("can not file rootCA ,plase use <strong>anyproxy --root</strong> to generate one");
}
});
2014-10-21 11:18:55 +08:00
//make qr code
app.get("/qr",function(req,res){
var qr = qrCode.qrcode(4, 'M'),
targetUrl = myAbsAddress,
qrImageTag,
resDom;
qr.addData(targetUrl);
qr.make();
qrImageTag = qr.createImgTag(4);
resDom = '<a href="__url"> __img <br> click or scan qr code to start client </a>'.replace(/__url/,targetUrl).replace(/__img/,qrImageTag);
res.setHeader("Content-Type", "text/html");
2015-01-09 16:16:08 +08:00
res.end(resDom);
});
app.get("/qr_root",function(req,res){
var qr = qrCode.qrcode(4, 'M'),
targetUrl = myAbsAddress + "fetchCrtFile",
qrImageTag,
resDom;
qr.addData(targetUrl);
qr.make();
qrImageTag = qr.createImgTag(4);
resDom = '<a href="__url"> __img <br> click or scan qr code to download rootCA.crt </a>'.replace(/__url/,targetUrl).replace(/__img/,qrImageTag);
res.setHeader("Content-Type", "text/html");
2014-10-21 11:18:55 +08:00
res.end(resDom);
});
2015-04-25 10:28:40 +08:00
2014-09-18 17:42:01 +08:00
app.use(function(req,res,next){
2015-04-28 21:10:14 +08:00
var indexTpl = fs.readFileSync(path.join(staticDir,"/index.html"),{encoding:"utf8"}),
2015-07-12 21:19:49 +08:00
opt = {
rule : ruleSummary || "",
customMenu : customMenu || [],
wsPort : wsPort,
ipAddress : ipAddress || "127.0.0.1"
};
2015-07-31 14:00:34 +08:00
if( url.parse(req.url).pathname == "/"){
2014-09-18 17:42:01 +08:00
res.setHeader("Content-Type", "text/html");
2015-07-12 21:19:49 +08:00
res.end(juicer(indexTpl, opt));
2014-09-18 17:42:01 +08:00
}else{
next();
}
});
2015-04-25 10:28:40 +08:00
app.use(express.static(staticDir));
2015-07-07 17:31:56 +08:00
2015-08-06 23:13:17 +08:00
//plugin from rule file
2015-07-07 17:31:56 +08:00
if(typeof userRule._plugIntoWebinterface == "function"){
userRule._plugIntoWebinterface(app,function(){
server = app.listen(port);
2015-07-07 17:31:56 +08:00
});
}else{
server = app.listen(port);
2015-07-07 17:31:56 +08:00
}
2014-09-18 17:42:01 +08:00
self.app = app;
self.server = server;
2014-09-18 17:42:01 +08:00
}
2015-04-25 10:28:40 +08:00
inherits(webInterface, events.EventEmitter);
2014-09-18 17:42:01 +08:00
2015-04-25 10:28:40 +08:00
module.exports = webInterface;