blob: d3842685698af72893149a0bc48b8dbb4f202553 [file] [log] [blame]
AyumuUeha76a01bc2017-05-18 13:34:13 +09001/**
2 * httpServer - HTTP server for user's credential
3 */
4var express = require('express');
5var path = require('path');
6var http = require('http');
7var https = require('https');
8var radiusOper = require('./startClient');
9var body_parser = require('body-parser');
10var os=require('os');
11var ifaces = os.networkInterfaces();
12var app = express();
13var fs = require("fs");
14var Promise=require('bluebird');
15var execAsync=Promise.promisify(require('child_process').exec);
16app.use(express.static(path.join(__dirname,'authwebapp')));
17
18var config = {
19 key: fs.readFileSync('./certs/server.key'),
20 cert: fs.readFileSync('./certs/server.crt'),
21 ca: fs.readFileSync('./certs/ca.crt'),
22 requestCert: true,
23 rejectUnauthorized: false
24};
25
26function natRecoverPkt(iface, ipAddr, port) {
27
28 var cmd = 'ip6tables -w -t nat -D PREROUTING -i ' + iface +
29 ' -p tcp --dport ' + port + ' -j DNAT --to-destination ['
30 + ipAddr + ']:' + port;
31 var checkCmd = 'ip6tables -w -t nat -v -L PREROUTING';
32 var check = 'to:[' + ipAddr + ']:' + port;
33
34 console.log(checkCmd + ' to check ' + check);
35 execAsync(checkCmd).then(function (result) {
36 console.log("indexOf:" + result.indexOf(check));
37 if (result.indexOf(check) > 0) {
38 execAsync(cmd);
39 console.log(cmd);
40 }
41 else {
42 console.log("nat rule not exist.");
43 }
44 }, function (err) {console.error(err);});
45
46}
47
48function connDev(iface) {
49 var cmd = 'ip6tables -w -D FORWARD -i ' + iface + ' -j DROP';
50 var checkCmd = 'ip6tables -w -v -L FORWARD 1';
51 var check = 'DROP all ' + iface;
52
53 console.log(checkCmd + ' to check ' + check);
54 execAsync(checkCmd).then(function (result) {
55 console.log("indexOf:" + result.indexOf(check));
56 if (result.indexOf(check) > 0) {
57 execAsync(cmd);
58 console.log(cmd);
59 }
60 else {
61 console.log("Forward rule not exist.");
62 }
63 }, function (err) {console.error(err);});
64
65}
66
67function rmDnsRoute(ipAddr) {
68 //delete blindly, minor side effect
69 var cmd = 'route del ' + ipAddr;
70 execAsync(cmd);
71 console.log(cmd);
72}
73
74function pppoeRmRedirectPkt(ipAddr) {
75 natRecoverPkt('eth1', ipAddr, '80');
76 natRecoverPkt('eth1', ipAddr, '443');
77 connDev('eth1');
78 rmDnsRoute('8.8.8.8');
79}
80
81app.use(body_parser.json());
82app.use(body_parser.urlencoded({ extended: true }));
83
84app.get('/', function (req, res) {
85
86 console.log("===Please login.===" );
87 execAsync('cat adminState.txt').then(function (result) {
88 if (result.indexOf("enable") > 0)
89 {
90 res.sendFile(__dirname+'/authwebapp/login.html');
91 }
92 else
93 {
94 console.log("PPPoE disabled.");
95 res.send('PPPoE disabled.');
96 }
97 }, function (err) {
98 console.error(err);
99 });
100})
101
102app.post('/',function(req,res){
103 console.log("===post request===");
104 var username = req.body.username;
105 var password = req.body.password;
106 console.log("===user:"+username+",pwd:"+password+"===");
107
108 var data = radiusOper.verifyFun(username,password);
109 data.then(function(result){
110 console.log("===verifyFun result:"+result+"===");
111 if(result)
112 {
113 setTimeout(function(){
114 console.log("enter timeout");
115 execAsync("ifconfig").then(function (result) {
116 console.log("result.indexOf :"+result.indexOf("ppp0"));
117 if(result.indexOf("ppp0") >= 0)
118 {
119 console.log("===PPPoE session has set up.===");
120 pppoeRmRedirectPkt(eh1ip);
121 res.setHeader("Access-Control-Allow-Origin", "*");
122 res.jsonp({'result':'Auth successfully!!'});
123 }
124 else
125 {
126 execAsync("poff -a");
127 console.log("===PPPoE session failed.===");
128 res.setHeader("Access-Control-Allow-Origin", "*");
129 res.jsonp({'result':'error!'});
130 }
131 });
132 },5000);
133 }
134 else
135 {
136 execAsync("poff -a");
137 console.log("===PPPoE session failed.===");
138 res.setHeader("Access-Control-Allow-Origin", "*");
139 res.jsonp({'result':'error!'});
140 }
141 });
142});
143
144var eh1ip='a';
145var i = false;
146ifaces['eth1'].forEach(function(details){
147 if (details.family=='IPv6' && i == false)
148 {
149 i = true;
150 eh1ip = details.address;
151 console.log('eh1ip:'+eh1ip);
152 }
153});
154
155var httpPort = "80";
156var httpsPort = "443";
157
158http.createServer(app).listen(httpPort, eh1ip);
159https.createServer(config, app).listen(httpsPort, eh1ip);
160
161console.log("PPPoE Web Server listens on ports " + httpPort + " and " + httpsPort);
162