blob: 8e198b413f75c237622b6791e5ed4b60f7355d44 [file] [log] [blame]
/*
* Copyright 2017-present Open Networking Foundation
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* httpServer - HTTP server for user's credential
*/
var express = require('express');
var path = require('path');
var http = require('http');
var https = require('https');
var radiusOper = require('./startClient');
var body_parser = require('body-parser');
var os=require('os');
var ifaces = os.networkInterfaces();
var app = express();
var fs = require("fs");
var Promise=require('bluebird');
var execAsync=Promise.promisify(require('child_process').exec);
app.use(express.static(path.join(__dirname,'authwebapp')));
var config = {
key: fs.readFileSync('./certs/server.key'),
cert: fs.readFileSync('./certs/server.crt'),
ca: fs.readFileSync('./certs/ca.crt'),
requestCert: true,
rejectUnauthorized: false
};
function natRecoverPkt(iface, ipAddr, port) {
var cmd = 'ip6tables -w -t nat -D PREROUTING -i ' + iface +
' -p tcp --dport ' + port + ' -j DNAT --to-destination ['
+ ipAddr + ']:' + port;
var checkCmd = 'ip6tables -w -t nat -v -L PREROUTING';
var check = 'to:[' + ipAddr + ']:' + port;
console.log(checkCmd + ' to check ' + check);
execAsync(checkCmd).then(function (result) {
console.log("indexOf:" + result.indexOf(check));
if (result.indexOf(check) > 0) {
execAsync(cmd);
console.log(cmd);
}
else {
console.log("nat rule not exist.");
}
}, function (err) {console.error(err);});
}
function connDev(iface) {
var cmd = 'ip6tables -w -D FORWARD -i ' + iface + ' -j DROP';
var checkCmd = 'ip6tables -w -v -L FORWARD 1';
var check = 'DROP all ' + iface;
console.log(checkCmd + ' to check ' + check);
execAsync(checkCmd).then(function (result) {
console.log("indexOf:" + result.indexOf(check));
if (result.indexOf(check) > 0) {
execAsync(cmd);
console.log(cmd);
}
else {
console.log("Forward rule not exist.");
}
}, function (err) {console.error(err);});
}
function rmDnsRoute(ipAddr) {
//delete blindly, minor side effect
var cmd = 'route del ' + ipAddr;
execAsync(cmd);
console.log(cmd);
}
function pppoeRmRedirectPkt(ipAddr) {
natRecoverPkt('eth1', ipAddr, '80');
natRecoverPkt('eth1', ipAddr, '443');
connDev('eth1');
rmDnsRoute('8.8.8.8');
}
app.use(body_parser.json());
app.use(body_parser.urlencoded({ extended: true }));
app.get('/', function (req, res) {
console.log("===Please login.===" );
execAsync('cat adminState.txt').then(function (result) {
if (result.indexOf("enable") > 0)
{
res.sendFile(__dirname+'/authwebapp/login.html');
}
else
{
console.log("PPPoE disabled.");
res.send('PPPoE disabled.');
}
}, function (err) {
console.error(err);
});
})
app.post('/',function(req,res){
console.log("===post request===");
var username = req.body.username;
var password = req.body.password;
console.log("===user:"+username+",pwd:"+password+"===");
var data = radiusOper.verifyFun(username,password);
data.then(function(result){
console.log("===verifyFun result:"+result+"===");
if(result)
{
setTimeout(function(){
console.log("enter timeout");
execAsync("ifconfig").then(function (result) {
console.log("result.indexOf :"+result.indexOf("ppp0"));
if(result.indexOf("ppp0") >= 0)
{
console.log("===PPPoE session has set up.===");
pppoeRmRedirectPkt(eh1ip);
res.setHeader("Access-Control-Allow-Origin", "*");
res.jsonp({'result':'Auth successfully!!'});
}
else
{
execAsync("poff -a");
console.log("===PPPoE session failed.===");
res.setHeader("Access-Control-Allow-Origin", "*");
res.jsonp({'result':'error!'});
}
});
},5000);
}
else
{
execAsync("poff -a");
console.log("===PPPoE session failed.===");
res.setHeader("Access-Control-Allow-Origin", "*");
res.jsonp({'result':'error!'});
}
});
});
var eh1ip='a';
var i = false;
ifaces['eth1'].forEach(function(details){
if (details.family=='IPv6' && i == false)
{
i = true;
eh1ip = details.address;
console.log('eh1ip:'+eh1ip);
}
});
var httpPort = "80";
var httpsPort = "443";
http.createServer(app).listen(httpPort, eh1ip);
https.createServer(config, app).listen(httpsPort, eh1ip);
console.log("PPPoE Web Server listens on ports " + httpPort + " and " + httpsPort);