shelloid
Version:
Simple and secure Node.js web application server.
341 lines (325 loc) • 13.7 kB
JavaScript
/**
* Created by Harikrishnan on 16-07-2014.
*/
var numOfPortMappings;
var PORT_MAP_DELETED = "0";
var PORT_MAP_APP_SIDE_CLOSED = "1";
var PORT_MAP_SVC_SIDE_OPEN = "2";
var PORT_MAP_APP_SIDE_OPEN = "3";
var portSvcMap = {};
var portMapDataset = [];
function initPortMappingsTab() {
if (isLoggedIn()) {
createSrvIndex();
registerForm(addPortMappingForm());
setupAddPortMappingHandlers();
resetAddPortMappingForm();
refreshPortMappingsList(true);
updateNodeListInPortMappings();
preparePortCombo();
pollForNewPortMaps();
bindToolTip();
setupTour();
}
else {
window.location = window.actualSite + "/?msgId=1"
}
}
function bindToolTip(){
$(".mappedPortColTitle").tooltip();
$("[data-toggle='tooltip']").tooltip();
}
function pollForNewPortMaps(){
poll.addLongPollHandler("newPortMap:" + getUser().id, -1, function (ch, res) {
var portMapId = (res.from == "db") ? res.params : res.portMapId;
if (!isThereInDataSet(portMapDataset, "portMapping" + portMapId)) {
doPost("/getPortMapInfo", {portMapId: portMapId}, function (resp) {
if (resp.status == 200) {
if (!isThereInDataSet(portMapDataset, "portMapping" + portMapId)) {
numOfPortMappings++;
portMapDataset.push(getNewPortMappingRow(true, numOfPortMappings, resp.info.id, resp.info.fromDeviceName, resp.info.fromPort, resp.info.toDeviceName, resp.info.toPort, resp.info.date, resp.info.protocol, resp.info.disabled, resp.info.fromDeviceUserName, resp.info.toDeviceUserName));
refreshPortMappingsList(true);
bindToolTip();
}
else{
//console.log("skipping...");
}
} else {
//console.log(resp);
}
});
}
else{
//console.log("skipping...");
}
});
}
function createSrvIndex() {
for (var i = 0; i < srvList.length; i++) {
portSvcMap[srvList[i].port] = srvList[i].name;
}
}
function getSvcForPort(port) {
if (portSvcMap[port] != undefined) {
return portSvcMap[port] + " (" + port + ")";
}
else {
if (port == "" || port == undefined || port == null) {
port = "Not ready";
}
return port;
}
}
function preparePortCombo() {
$("#portMappingNumber").select2({
minimumInputLength: 1,
query: function (query) {
var filterPortFn = function (element) {
return getAsStr(element.port).indexOf(query.term) > -1;
};
var filterSvcFn = function (element) {
return getAsStr(element.name).indexOf(query.term) > -1;
};
var data = {results: []};
var filteredPorts = srvList.filter(filterPortFn);
var filteredSvcs = srvList.filter(filterSvcFn);
data.results.push({id: query.term, text: query.term});
for (var i = 0; i < filteredPorts.length; i++) {
data.results.push({id: filteredPorts[i].port, text: filteredPorts[i].name + " (" + filteredPorts[i].port + ")"});
}
for (var i = 0; i < filteredSvcs.length; i++) {
data.results.push({id: filteredSvcs[i].port, text: filteredSvcs[i].name + " (" + filteredSvcs[i].port + ")"});
}
query.callback(data);
}
});
}
function pollForPortMappings(id) {
poll.addLongPollHandler("portMapStatus:" + id, -1, function (ch, res) {
var addedPort = false;
var status;
if (res.from == "db") {
status = res.status;
} else {
status = res.action;
}
switch (status) {
case PORT_MAP_DELETED:
{
if (res.from == "db") {
removePortMappingPoll(res.refId);
removeFromDataset(portMapDataset, "portMapping" + res.refId);
}
else {
removePortMappingPoll(id);
removeFromDataset(portMapDataset, "portMapping" + id);
}
showPortMapDataTable();
break;
}
case PORT_MAP_SVC_SIDE_OPEN:
{
var toPort;
if (res.from == "db") {
toPort = res.params;
}
else {
toPort = res.mappedPort;
}
updateDataSet(portMapDataset, "portMapping" + id, "6", '<span class="mappedPortColTitle" data-toggle="tooltip" data-placement="top" data-html="true" title="The service can be accessed at localhost:'+toPort+' from the guest device.">' + toPort + "</span>");
showPortMapDataTable();
break;
}
default:
{
//console.log("Not processing: ", res + " because action = " + status);
break;
}
}
bindToolTip();
}, function (err) {
console.log("Error: ", err);
});
}
function removePortMappingPoll(id) {
poll.removeLongPollHandler("portMapStatus:" + id);
}
function refreshPortMappingsList(addPoll) {
numOfPortMappings = 0;
doPost("/listPortMappings", {}, function (resp) {
if (resp.status == 200) {
portMapDataset = [];
for (var i = 0; i < resp.list.length; i++) {
numOfPortMappings++;
portMapDataset.push(getNewPortMappingRow(addPoll, i + 1, resp.list[i].id, resp.list[i].fromDeviceName, resp.list[i].fromPort, resp.list[i].toDeviceName, resp.list[i].toPort, new Date(resp.list[i].date), resp.list[i].protocol, resp.list[i].disabled, resp.list[i].fromDeviceUserName, resp.list[i].toDeviceUserName));
}
showPortMapDataTable();
$("[data-toggle='tooltip']").tooltip();
}
else {
bootbox.alert("<b>An error has occurred while listing the port mappings.</b><br/>" + (typeof resp.msg == "string" ? resp.msg : ""));
}
});
}
function showPortMapDataTable() {
$('#portMappingListTbl').dataTable().fnDestroy();
$('#portMappingListTbl').dataTable({
destroy: true,
data: portMapDataset,
paging: false,
searching: true,
autoWidth: false,
"columns": [
{ "data": "0" },
{ "data": "1" },
{ "data": "2" },
{ "data": "3" },
{ "data": "4" },
{ "data": "5" },
{ "data": "6" },
{ "data": "7" },
{ "data": "8" }
],
fnCreatedRow: function (nRow, aData, iDataIndex) {
if (aData[9] == 1) {
$(nRow).addClass("disabled_row");
}
}
});
}
var addPortMappingForm = function () {
var form = {};
form.name = 'frmAddPortMap';
form.obj = $('#' + form.name);
form.validator = form.obj.validate();
form.addPortMappingBtn = function (e) {
e.preventDefault();
form.obj.validate();
if (form.validator.form()) {
var data = {
portMappingNodesFrom: undefined,
portMappingNumber: undefined,
portMappingNodesTo: undefined
};
fillModel(form.obj, data);
if (data.portMappingNodesFrom != data.portMappingNodesTo) {
var port = parseInt(data.portMappingNumber);
if (port > 0 && port <= 65535) {
data.portMappingProtocolTcp = $("#portMappingProtocolTcp").is(":checked");
addWaitingOverlay();
doPost("/addPortMapping", data, function (resp) {
removeWaitingOverlay();
if (resp.status == 500) {
console.log(resp);
bootbox.alert("<b>An error has occurred while adding the device.</b><br/>" + (typeof resp.msg == "string" ? resp.msg : "Probably a same mapping exists."));
}
else {
portMapDataset.push(getNewPortMappingRow(true, numOfPortMappings++, resp.insertId, $("#portMappingNodesFrom").find(":selected").text(), data.portMappingNumber, $("#portMappingNodesTo").find(":selected").text(), "", new Date(), data.portMappingProtocolTcp == true ? "TCP" : "UDP", 0, resp.svcDevUserName, resp.mappedDevUserName));
showPortMapDataTable();
$("#addPortMappingCancelBtn").click();
if (resp.status != 200) {
bootbox.alert("Successfully saved port map. But some warnings occurred: " + (typeof resp.msg == "string"? resp.msg : "") + ". However the mapping will be available when the device connects for the next time.");
}
}
bindToolTip();
}, function (err) {
removeWaitingOverlay();
console.log(err);
bootbox.alert("Server Error: " + err.error);
});
}
else {
bootbox.alert('Port number must be a number, greater than zero and less than 65536.');
}
}
else {
bootbox.alert('You must select two different devices to share ports.');
}
}
else {
bootbox.alert('Please fix input errors and try again.');
}
};
return form;
};
function setupAddPortMappingHandlers() {
$("#addPortMappingPanel").hide();
$("#addPortMappingPanelBtn").click(function (e) {
e.preventDefault();
$("#addPortMappingPanel").show("fast");
$("#addPortMappingPanelBtn").hide();
});
$("#addPortMappingCancelBtn").click(function (e) {
e.preventDefault();
$("#addPortMappingPanel").hide("fast");
resetAddPortMappingForm();
$("#addPortMappingPanelBtn").show();
});
}
function resetAddPortMappingForm() {
$("#portMappingNumber").text("");
$("#portMappingProtocolTcp").click();
}
function updateNodeListInPortMappings() {
doPost("/listDevices", {disabled: false, showShares: true}, function (resp) {
if (resp.status == 200) {
var toDevices = $("#portMappingNodesTo");
var fromDevices = $("#portMappingNodesFrom");
toDevices.empty();
fromDevices.empty();
for (var i = 0; i < resp.list.length; i++) {
toDevices.append($('<option value="' + resp.list[i].id + '">' + resp.list[i].name + '</option>'));
if (resp.list[i].owner_id == getUser().id) {
fromDevices.append($('<option value="' + resp.list[i].id + '">' + resp.list[i].name + '</option>'));
}
}
}
else {
bootbox.alert("<b>An error has occurred while listing the devices.</b><br/>" + (typeof resp.msg == "string"? resp.msg : ""));
}
});
}
function getNewPortMappingRow(addPoll, seqNo, id, portMappingNodesFrom, portMappingNumber, portMappingNodesTo, toPort, date, protocol, disabled, fromUserName, toUserName) {
var formattedDate = moment(date).format("D MMM YYYY, h:mm a");
if (toPort == undefined){
toPort = "";
}
var row = {
DT_RowId: "portMapping" + id,
"1": fromUserName,
"0": portMappingNodesFrom,
"2": getSvcForPort(portMappingNumber),
"3": protocol,
"5": toUserName,
"4": portMappingNodesTo,
"6": (isEmptyString(toPort) ? "Not ready" : '<span class="mappedPortColTitle" data-toggle="tooltip" data-placement="top" data-html="true" title="The service can be accessed at localhost:'+toPort+' from the guest device.">' + toPort + "</span>"),
"7": formattedDate,
"8": '<span class="glyphicon glyphicon-remove" onclick="deletePortMapping(' + id + ')" data-toggle="tooltip" data-placement="top" title="Remove Port map"></span>',
"9": disabled
};
if (addPoll == true) {
pollForPortMappings(id);
}
return row;
}
function deletePortMapping(id) {
bootbox.confirm("Are you sure to delete this port mapping?", function (result) {
if (result == true) {
var data = {id: id};
doPost("/deletePortMapping", data, function (resp) {
if (resp.status == 500) {
bootbox.alert("Error: " + (typeof resp.msg == "string" ? resp.msg : "Can't delete port mapping"));
}
else {
$("#portMapping" + id).addClass("disabled_row");
if (resp.status != 200) {
console.log(resp);
bootbox.alert("Operation completed with some warnings: " + (typeof resp.msg == "string"? resp.msg : ""));
}
}
}, function (err) {
bootbox.alert("Error: " + err);
});
}
});
}