mirror of
https://github.com/Ylianst/MeshCentral.git
synced 2024-09-11 08:55:32 +03:00
Started work on mobile web site
This commit is contained in:
parent
7ff2f95a72
commit
328a6ff4d6
@ -200,8 +200,10 @@
|
|||||||
<Content Include="SourceFileList.txt" />
|
<Content Include="SourceFileList.txt" />
|
||||||
<Content Include="views\default.handlebars" />
|
<Content Include="views\default.handlebars" />
|
||||||
<Content Include="views\download.handlebars" />
|
<Content Include="views\download.handlebars" />
|
||||||
|
<Content Include="views\login-mobile.handlebars" />
|
||||||
<Content Include="views\login.handlebars" />
|
<Content Include="views\login.handlebars" />
|
||||||
<Content Include="views\message.handlebars" />
|
<Content Include="views\message.handlebars" />
|
||||||
|
<Content Include="views\terms-mobile.handlebars" />
|
||||||
<Content Include="views\terms.handlebars" />
|
<Content Include="views\terms.handlebars" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -274,7 +274,7 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) {
|
|||||||
obj.connectTime = Date.now();
|
obj.connectTime = Date.now();
|
||||||
if (nodes.length == 0) {
|
if (nodes.length == 0) {
|
||||||
// This node does not exist, create it.
|
// This node does not exist, create it.
|
||||||
device = { type: 'node', mtype: mesh.mtype, _id: obj.dbNodeKey, icon: obj.agentInfo.platformType, meshid: obj.dbMeshKey, name: obj.agentInfo.computerName, domain: domain.id, agent: { ver: obj.agentInfo.agentVersion, id: obj.agentInfo.agentId, caps: obj.agentInfo.capabilities }, host: null };
|
device = { type: 'node', mtype: mesh.mtype, _id: obj.dbNodeKey, icon: obj.agentInfo.platformType, meshid: obj.dbMeshKey, name: obj.agentInfo.computerName, rname: obj.agentInfo.computerName, domain: domain.id, agent: { ver: obj.agentInfo.agentVersion, id: obj.agentInfo.agentId, caps: obj.agentInfo.capabilities }, host: null };
|
||||||
obj.db.Set(device);
|
obj.db.Set(device);
|
||||||
|
|
||||||
// Event the new node
|
// Event the new node
|
||||||
@ -292,6 +292,7 @@ module.exports.CreateMeshAgent = function (parent, db, ws, req, args, domain) {
|
|||||||
device.agent = { ver: obj.agentInfo.agentVersion, id: obj.agentInfo.agentId, caps: obj.agentInfo.capabilities }; change = 1;
|
device.agent = { ver: obj.agentInfo.agentVersion, id: obj.agentInfo.agentId, caps: obj.agentInfo.capabilities }; change = 1;
|
||||||
} else {
|
} else {
|
||||||
var changes = [], change = 0, log = 0;
|
var changes = [], change = 0, log = 0;
|
||||||
|
if (device.rname != obj.agentInfo.computerName) { device.rname = obj.agentInfo.computerName; change = 1; changes.push('computer name'); }
|
||||||
if (device.agent.ver != obj.agentInfo.agentVersion) { device.agent.ver = obj.agentInfo.agentVersion; change = 1; changes.push('agent version'); }
|
if (device.agent.ver != obj.agentInfo.agentVersion) { device.agent.ver = obj.agentInfo.agentVersion; change = 1; changes.push('agent version'); }
|
||||||
if (device.agent.id != obj.agentInfo.agentId) { device.agent.id = obj.agentInfo.agentId; change = 1; changes.push('agent type'); }
|
if (device.agent.id != obj.agentInfo.agentId) { device.agent.id = obj.agentInfo.agentId; change = 1; changes.push('agent type'); }
|
||||||
if ((device.agent.caps & 24) != (obj.agentInfo.capabilities & 24)) { device.agent.caps = obj.agentInfo.capabilities; change = 1; changes.push('agent capabilities'); } // If agent console or javascript support changes, update capabilities
|
if ((device.agent.caps & 24) != (obj.agentInfo.capabilities & 24)) { device.agent.caps = obj.agentInfo.capabilities; change = 1; changes.push('agent capabilities'); } // If agent console or javascript support changes, update capabilities
|
||||||
|
33
meshuser.js
33
meshuser.js
@ -671,37 +671,34 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain) {
|
|||||||
if (obj.common.validateString(command.meshid, 1, 1024) == false) break; // Check meshid
|
if (obj.common.validateString(command.meshid, 1, 1024) == false) break; // Check meshid
|
||||||
if ((command.userid.split('/').length != 3) || (command.userid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain
|
if ((command.userid.split('/').length != 3) || (command.userid.split('/')[1] != domain.id)) return; // Invalid domain, operation only valid for current domain
|
||||||
|
|
||||||
// Check if the user exists
|
|
||||||
var deluserid = command.userid, deluser = obj.parent.users[deluserid];
|
|
||||||
if (deluser == null) {
|
|
||||||
// TODO: Send error back, user not found.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the mesh
|
// Get the mesh
|
||||||
var mesh = obj.parent.meshes[command.meshid];
|
var mesh = obj.parent.meshes[command.meshid];
|
||||||
if (mesh) {
|
if (mesh) {
|
||||||
// Check if this user has rights to do this
|
// Check if this user has rights to do this
|
||||||
if (mesh.links[user._id] == null || ((mesh.links[user._id].rights & 2) == 0)) return;
|
if (mesh.links[user._id] == null || ((mesh.links[user._id].rights & 2) == 0)) return;
|
||||||
|
|
||||||
// Remove mesh from user
|
// Check if the user exists - Just in case we need to delete a mesh right for a non-existant user, we do it this way. Technically, it's not possible, but just in case.
|
||||||
if (deluser.links != null && deluser.links[command.meshid] != null) {
|
var deluserid = command.userid, deluser = obj.parent.users[deluserid];
|
||||||
var delmeshrights = deluser.links[command.meshid].rights;
|
if (deluser != null) {
|
||||||
if ((delmeshrights == 0xFFFFFFFF) && (mesh.links[user._id].rights != 0xFFFFFFFF)) return; // A non-admin can't kick out an admin
|
// Remove mesh from user
|
||||||
delete deluser.links[command.meshid];
|
if (deluser.links != null && deluser.links[command.meshid] != null) {
|
||||||
obj.db.Set(deluser);
|
var delmeshrights = deluser.links[command.meshid].rights;
|
||||||
obj.parent.parent.DispatchEvent([deluser._id], obj, 'resubscribe');
|
if ((delmeshrights == 0xFFFFFFFF) && (mesh.links[user._id].rights != 0xFFFFFFFF)) return; // A non-admin can't kick out an admin
|
||||||
|
delete deluser.links[command.meshid];
|
||||||
|
obj.db.Set(deluser);
|
||||||
|
obj.parent.parent.DispatchEvent([deluser._id], obj, 'resubscribe');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove user from the mesh
|
// Remove user from the mesh
|
||||||
if (mesh.links[command.userid] != null) {
|
if (mesh.links[command.userid] != null) {
|
||||||
delete mesh.links[command.userid];
|
delete mesh.links[command.userid];
|
||||||
obj.db.Set(mesh);
|
obj.db.Set(mesh);
|
||||||
}
|
|
||||||
|
|
||||||
// Notify mesh change
|
// Notify mesh change
|
||||||
var change = 'Removed user ' + deluser.name + ' from mesh ' + mesh.name;
|
var change = 'Removed user ' + deluser.name + ' from mesh ' + mesh.name;
|
||||||
obj.parent.parent.DispatchEvent(['*', mesh._id, user._id, command.userid], obj, { etype: 'mesh', username: user.name, userid: deluser.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id })
|
obj.parent.parent.DispatchEvent(['*', mesh._id, user._id, command.userid], obj, { etype: 'mesh', username: user.name, userid: deluser.name, meshid: mesh._id, name: mesh.name, mtype: mesh.mtype, desc: mesh.desc, action: 'meshchange', links: mesh.links, msg: change, domain: domain.id })
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "meshcentral",
|
"name": "meshcentral",
|
||||||
"version": "0.1.7-n",
|
"version": "0.1.7-r",
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"Remote Management",
|
"Remote Management",
|
||||||
"Intel AMT",
|
"Intel AMT",
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
<script type="text/javascript" src="scripts/ol3-contextmenu.js"></script>
|
<script type="text/javascript" src="scripts/ol3-contextmenu.js"></script>
|
||||||
<title>MeshCentral</title>
|
<title>MeshCentral</title>
|
||||||
</head>
|
</head>
|
||||||
<body onload="javascript:if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)">
|
<body onload="if (typeof(startup) !== 'undefined') startup();" oncontextmenu="handleContextMenu(event)">
|
||||||
<!-- right click menu -->
|
<!-- right click menu -->
|
||||||
<div id="contextMenu" class="contextMenu" style="display: none">
|
<div id="contextMenu" class="contextMenu" style="display: none">
|
||||||
<div id="cxinfo" class="cmtext" onclick="cmaction(1)"><b>Information</b></div>
|
<div id="cxinfo" class="cmtext" onclick="cmaction(1)"><b>Information</b></div>
|
||||||
@ -124,7 +124,7 @@
|
|||||||
<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All" />
|
<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All" />
|
||||||
<input type=button id=GroupActionButton disabled="disabled" value="Group Action" onclick=groupActionFunction() />
|
<input type=button id=GroupActionButton disabled="disabled" value="Group Action" onclick=groupActionFunction() />
|
||||||
<input id=SearchInput type=text style=width:120px placeholder=Search onchange=onSearchInputChanged() onkeyup=onSearchInputChanged() autocomplete=off onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />
|
<input id=SearchInput type=text style=width:120px placeholder=Search onchange=onSearchInputChanged() onkeyup=onSearchInputChanged() autocomplete=off onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />
|
||||||
<input type=checkbox id=HostnameCheckBox onclick=onHostnameCheckBox() /><span title="Show device hostnames">Hostname</span>
|
<input type=checkbox id=RealNameCheckBox onclick=onRealNameCheckBox() /><span title="Show devices operating system name">OS Name</span>
|
||||||
</div>
|
</div>
|
||||||
<div id=kvmListToolbar class=style14 style=height:100%;float:left>
|
<div id=kvmListToolbar class=style14 style=height:100%;float:left>
|
||||||
<input type="button" onclick="connectAllKvmFunction()" value="Connect All" />
|
<input type="button" onclick="connectAllKvmFunction()" value="Connect All" />
|
||||||
@ -182,7 +182,7 @@
|
|||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div id="xdevices" style="max-height:calc(100vh - 228px);overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch"></div>
|
<div id="xdevices" style="max-height:calc(100vh - 242px);overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch"></div>
|
||||||
<div id="xdevicesmap" style="height:500px;width:100%;overflow:hidden;position:relative">
|
<div id="xdevicesmap" style="height:500px;width:100%;overflow:hidden;position:relative">
|
||||||
<div id=xmapSearchResultsDlg style="position:absolute;display:none;max-height:280px;left:5px;top:5px;max-width:250px;z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666">
|
<div id=xmapSearchResultsDlg style="position:absolute;display:none;max-height:280px;left:5px;top:5px;max-width:250px;z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666">
|
||||||
<div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0">
|
<div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0">
|
||||||
@ -748,7 +748,7 @@
|
|||||||
var searchFocus = 0;
|
var searchFocus = 0;
|
||||||
var mapSearchFocus = 0;
|
var mapSearchFocus = 0;
|
||||||
var consoleFocus = 0;
|
var consoleFocus = 0;
|
||||||
var showHostnames = false;
|
var showRealNames = false;
|
||||||
var meshserver = null;
|
var meshserver = null;
|
||||||
var meshes = {};
|
var meshes = {};
|
||||||
var meshcount = 0;
|
var meshcount = 0;
|
||||||
@ -829,8 +829,8 @@
|
|||||||
Q('sortselect').selectedIndex = sort = getstore("sort", 0);
|
Q('sortselect').selectedIndex = sort = getstore("sort", 0);
|
||||||
Q('sizeselect').selectedIndex = getstore("viewsize", 1);
|
Q('sizeselect').selectedIndex = getstore("viewsize", 1);
|
||||||
Q('SearchInput').value = getstore("search", "");
|
Q('SearchInput').value = getstore("search", "");
|
||||||
showHostnames = (getstore("showHostnames", 0) == 1);
|
showRealNames = (getstore("showRealNames", 0) == 1);
|
||||||
Q('HostnameCheckBox').checked = showHostnames;
|
Q('RealNameCheckBox').checked = showRealNames;
|
||||||
Q('viewselect').value = getstore("deviceView", 1);
|
Q('viewselect').value = getstore("deviceView", 1);
|
||||||
Q('DeskControl').checked = (getstore('DeskControl', 1) == 1);
|
Q('DeskControl').checked = (getstore('DeskControl', 1) == 1);
|
||||||
|
|
||||||
@ -1013,7 +1013,7 @@
|
|||||||
for (var n in message.nodes[m]) {
|
for (var n in message.nodes[m]) {
|
||||||
if (!meshes[m]) { console.log('Invalid mesh (1): ' + m); continue; }
|
if (!meshes[m]) { console.log('Invalid mesh (1): ' + m); continue; }
|
||||||
message.nodes[m][n].namel = message.nodes[m][n].name.toLowerCase();
|
message.nodes[m][n].namel = message.nodes[m][n].name.toLowerCase();
|
||||||
if (message.nodes[m][n].host) { message.nodes[m][n].hostl = message.nodes[m][n].host.toLowerCase(); } else { message.nodes[m][n].hostl = message.nodes[m][n].namel; }
|
if (message.nodes[m][n].rname) { message.nodes[m][n].rnamel = message.nodes[m][n].rname.toLowerCase(); } else { message.nodes[m][n].rnamel = message.nodes[m][n].namel; }
|
||||||
message.nodes[m][n].meshnamel = meshes[m].name.toLowerCase();
|
message.nodes[m][n].meshnamel = meshes[m].name.toLowerCase();
|
||||||
message.nodes[m][n].meshid = m;
|
message.nodes[m][n].meshid = m;
|
||||||
message.nodes[m][n].state = (message.nodes[m][n].state)?(message.nodes[m][n].state):0;
|
message.nodes[m][n].state = (message.nodes[m][n].state)?(message.nodes[m][n].state):0;
|
||||||
@ -1244,7 +1244,7 @@
|
|||||||
var node = message.event.node;
|
var node = message.event.node;
|
||||||
if (!meshes[node.meshid]) break; // This is a node for a mesh we don't know. Happens when we are site administrator, we get all messages.
|
if (!meshes[node.meshid]) break; // This is a node for a mesh we don't know. Happens when we are site administrator, we get all messages.
|
||||||
node.namel = node.name.toLowerCase();
|
node.namel = node.name.toLowerCase();
|
||||||
if (node.host) { node.hostl = node.host.toLowerCase(); } else { node.hostl = node.namel; }
|
if (node.rname) { node.rnamel = node.rname.toLowerCase(); } else { node.rnamel = node.namel; }
|
||||||
node.meshnamel = meshes[node.meshid].name.toLowerCase();
|
node.meshnamel = meshes[node.meshid].name.toLowerCase();
|
||||||
node.state = 0;
|
node.state = 0;
|
||||||
if (!node.icon) node.icon = 1;
|
if (!node.icon) node.icon = 1;
|
||||||
@ -1304,7 +1304,7 @@
|
|||||||
if (message.event.node.intelamt.state != null) { node.intelamt.state = message.event.node.intelamt.state; }
|
if (message.event.node.intelamt.state != null) { node.intelamt.state = message.event.node.intelamt.state; }
|
||||||
}
|
}
|
||||||
node.namel = node.name.toLowerCase();
|
node.namel = node.name.toLowerCase();
|
||||||
if (node.host) { node.hostl = node.host.toLowerCase(); } else { node.hostl = node.namel; }
|
if (node.host) { node.rnamel = node.rname.toLowerCase(); } else { node.rnamel = node.namel; }
|
||||||
if (message.event.node.icon) { node.icon = message.event.node.icon; }
|
if (message.event.node.icon) { node.icon = message.event.node.icon; }
|
||||||
|
|
||||||
onSortSelectChange(true);
|
onSortSelectChange(true);
|
||||||
@ -1396,9 +1396,9 @@
|
|||||||
// MY DEVICES
|
// MY DEVICES
|
||||||
//
|
//
|
||||||
|
|
||||||
function onHostnameCheckBox() {
|
function onRealNameCheckBox() {
|
||||||
showHostnames = Q('HostnameCheckBox').checked;
|
showRealNames = Q('RealNameCheckBox').checked;
|
||||||
putstore("showHostnames", showHostnames ? 1 : 0);
|
putstore("showRealNames", showRealNames ? 1 : 0);
|
||||||
onSortSelectChange();
|
onSortSelectChange();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1415,9 +1415,9 @@
|
|||||||
if (!xxdialogMode && xxcurrentView == 15) return agentConsoleHandleKeys(e);
|
if (!xxdialogMode && xxcurrentView == 15) return agentConsoleHandleKeys(e);
|
||||||
if (xxdialogMode || xxcurrentView != 1) return;
|
if (xxdialogMode || xxcurrentView != 1) return;
|
||||||
if (e.ctrlKey == true && e.charCode == 96) {
|
if (e.ctrlKey == true && e.charCode == 96) {
|
||||||
showHostnames = !showHostnames;
|
showRealNames = !showRealNames;
|
||||||
Q('HostnameCheckBox').value = showHostnames;
|
Q('RealNameCheckBox').value = showRealNames;
|
||||||
putstore("showHostnames", showHostnames ? 1 : 0);
|
putstore("showRealNames", showRealNames ? 1 : 0);
|
||||||
onSortSelectChange();
|
onSortSelectChange();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1545,9 +1545,9 @@
|
|||||||
count++;
|
count++;
|
||||||
var title = EscapeHtml(nodes[i].name);
|
var title = EscapeHtml(nodes[i].name);
|
||||||
if (title.length == 0) { title = '<i>None</i>'; }
|
if (title.length == 0) { title = '<i>None</i>'; }
|
||||||
if ((nodes[i].host != null) && (nodes[i].host.length > 0)) { title += " / " + EscapeHtml(nodes[i].host); }
|
if ((nodes[i].rname != null) && (nodes[i].rname.length > 0)) { title += " / " + EscapeHtml(nodes[i].rname); }
|
||||||
var name = EscapeHtml(nodes[i].name);
|
var name = EscapeHtml(nodes[i].name);
|
||||||
if (showHostnames == true && nodes[i].host != null) name = EscapeHtml(nodes[i].host);
|
if (showRealNames == true && nodes[i].rname != null) name = EscapeHtml(nodes[i].rname);
|
||||||
if (name.length == 0) { name = '<i>None</i>'; }
|
if (name.length == 0) { name = '<i>None</i>'; }
|
||||||
|
|
||||||
// Node
|
// Node
|
||||||
@ -2101,14 +2101,14 @@
|
|||||||
if (!skipsave) { putstore("sort", sort); }
|
if (!skipsave) { putstore("sort", sort); }
|
||||||
if (sort == 0) { nodes.sort(meshSort); }
|
if (sort == 0) { nodes.sort(meshSort); }
|
||||||
if (sort == 1) { nodes.sort(powerSort); }
|
if (sort == 1) { nodes.sort(powerSort); }
|
||||||
if (sort == 2) { if (showHostnames == true) { nodes.sort(deviceHostSort); } else { nodes.sort(deviceSort); } }
|
if (sort == 2) { if (showRealNames == true) { nodes.sort(deviceHostSort); } else { nodes.sort(deviceSort); } }
|
||||||
updateDevices();
|
updateDevices();
|
||||||
}
|
}
|
||||||
|
|
||||||
function meshSort(a, b) { if (a.meshnamel > b.meshnamel) return 1; if (a.meshnamel < b.meshnamel) return -1; if (a.meshid == b.meshid) { if (showHostnames == true) { if (a.hostl > b.hostl) return 1; if (a.hostl < b.hostl) return -1; return 0; } else { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; } } return 0; }
|
function meshSort(a, b) { if (a.meshnamel > b.meshnamel) return 1; if (a.meshnamel < b.meshnamel) return -1; if (a.meshid == b.meshid) { if (showRealNames == true) { if (a.rnamel > b.rnamel) return 1; if (a.rnamel < b.rnamel) return -1; return 0; } else { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; } } return 0; }
|
||||||
function powerSort(a, b) { var ap = a.pwr?a.pwr:0; var bp = b.pwr?b.pwr:0; if (ap == bp) { if (showHostnames == true) { if (a.hostl > b.hostl) return 1; if (a.hostl < b.hostl) return -1; return 0; } else { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; } } if (ap > bp) return 1; if (ap < bp) return -1; return 0; }
|
function powerSort(a, b) { var ap = a.pwr?a.pwr:0; var bp = b.pwr?b.pwr:0; if (ap == bp) { if (showRealNames == true) { if (a.rnamel > b.rnamel) return 1; if (a.rnamel < b.rnamel) return -1; return 0; } else { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; } } if (ap > bp) return 1; if (ap < bp) return -1; return 0; }
|
||||||
function deviceSort(a, b) { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; }
|
function deviceSort(a, b) { if (a.namel > b.namel) return 1; if (a.namel < b.namel) return -1; return 0; }
|
||||||
function deviceHostSort(a, b) { if (a.hostl > b.hostl) return 1; if (a.hostl < b.hostl) return -1; return 0; }
|
function deviceHostSort(a, b) { if (a.rnamel > b.rnamel) return 1; if (a.rnamel < b.rnamel) return -1; return 0; }
|
||||||
function onSearchFocus(x) { searchFocus = x; }
|
function onSearchFocus(x) { searchFocus = x; }
|
||||||
function onMapSearchFocus(x) { mapSearchFocus = x; }
|
function onMapSearchFocus(x) { mapSearchFocus = x; }
|
||||||
function onConsoleFocus(x) { consoleFocus = x; }
|
function onConsoleFocus(x) { consoleFocus = x; }
|
||||||
@ -2120,7 +2120,7 @@
|
|||||||
} else {
|
} else {
|
||||||
var rs = x.split(/\s+/).join('|'), rx = new RegExp(rs);
|
var rs = x.split(/\s+/).join('|'), rx = new RegExp(rs);
|
||||||
for (var d in nodes) {
|
for (var d in nodes) {
|
||||||
nodes[d].v = (rx.test(nodes[d].name.toLowerCase())) || (nodes[d].hostl != null && rx.test(nodes[d].hostl.toLowerCase()));
|
nodes[d].v = (rx.test(nodes[d].name.toLowerCase())) || (nodes[d].rnamel != null && rx.test(nodes[d].rnamel.toLowerCase()));
|
||||||
if ((nodes[d].v == false) && nodes[d].tags) {
|
if ((nodes[d].v == false) && nodes[d].tags) {
|
||||||
for (var s in nodes[d].tags) {
|
for (var s in nodes[d].tags) {
|
||||||
if (rx.test(nodes[d].tags[s].toLowerCase())) {
|
if (rx.test(nodes[d].tags[s].toLowerCase())) {
|
||||||
@ -2623,7 +2623,7 @@
|
|||||||
function updatePlaceNodeTable(inputSearch) {
|
function updatePlaceNodeTable(inputSearch) {
|
||||||
var elements = document.getElementsByName("PlaceMapDeviceCheckbox"), count = 0;
|
var elements = document.getElementsByName("PlaceMapDeviceCheckbox"), count = 0;
|
||||||
for (var i in nodes) {
|
for (var i in nodes) {
|
||||||
var visible = ((nodes[i].namel.indexOf(inputSearch) >= 0 || inputSearch == '') || (nodes[i].hostl != null && nodes[i].hostl.indexOf(inputSearch) >= 0));
|
var visible = ((nodes[i].namel.indexOf(inputSearch) >= 0 || inputSearch == '') || (nodes[i].rnamel != null && nodes[i].rnamel.indexOf(inputSearch) >= 0));
|
||||||
if (visible) { count++; }
|
if (visible) { count++; }
|
||||||
QV(nodes[i]._id + '-rowid', visible);
|
QV(nodes[i]._id + '-rowid', visible);
|
||||||
}
|
}
|
||||||
@ -2631,7 +2631,7 @@
|
|||||||
/*
|
/*
|
||||||
console.log(selected);
|
console.log(selected);
|
||||||
for (var i in nodes) {
|
for (var i in nodes) {
|
||||||
if ((nodes[i].name.toLowerCase().indexOf(inputSearch) >= 0 || inputSearch == '') || (nodes[i].hostl != null && nodes[i].hostl.toLowerCase().indexOf(inputSearch) >= 0)) {
|
if ((nodes[i].name.toLowerCase().indexOf(inputSearch) >= 0 || inputSearch == '') || (nodes[i].rnamel != null && nodes[i].rnamel.toLowerCase().indexOf(inputSearch) >= 0)) {
|
||||||
console.log(selected.indexOf(nodes[i]._id));
|
console.log(selected.indexOf(nodes[i]._id));
|
||||||
x += '<div class=noselect id=' + nodes[i]._id + '-rowid onclick=selectNodeToPlace(event,\''+ nodes[i]._id +'\') style=background-color:lightgray;margin-bottom:4px;border-radius:2px><input name=PlaceMapDeviceCheckbox id=' + nodes[i]._id + '-checkid type=checkbox style=width:16px;display:inline ' + ((selected.indexOf(nodes[i]._id) >= 0)?'checked':'') + ' />';
|
x += '<div class=noselect id=' + nodes[i]._id + '-rowid onclick=selectNodeToPlace(event,\''+ nodes[i]._id +'\') style=background-color:lightgray;margin-bottom:4px;border-radius:2px><input name=PlaceMapDeviceCheckbox id=' + nodes[i]._id + '-checkid type=checkbox style=width:16px;display:inline ' + ((selected.indexOf(nodes[i]._id) >= 0)?'checked':'') + ' />';
|
||||||
x += '<div class=j' + nodes[i].icon + ' style=width:16px;height:16px;margin-top:2px;margin-right:4px;display:inline-block></div><div style=width:16px;display:inline>' + nodes[i].name + '</div></div>';
|
x += '<div class=j' + nodes[i].icon + ' style=width:16px;height:16px;margin-top:2px;margin-right:4px;display:inline-block></div><div style=width:16px;display:inline>' + nodes[i].name + '</div></div>';
|
||||||
@ -2834,7 +2834,10 @@
|
|||||||
var x = '<table style=width:100%>';
|
var x = '<table style=width:100%>';
|
||||||
|
|
||||||
// Attribute: Mesh
|
// Attribute: Mesh
|
||||||
x += addDeviceAttribute('Mesh', '<a onclick=gotoMesh("' + node.meshid + '") style=cursor:pointer>' + EscapeHtml(meshes[node.meshid].name) + '</a>');
|
x += addDeviceAttribute('<span title="The name of the administrative group this computer belong to">Mesh</span>', '<a title="The name of the group this computer belong to" onclick=gotoMesh("' + node.meshid + '") style=cursor:pointer>' + EscapeHtml(meshes[node.meshid].name) + '</a>');
|
||||||
|
|
||||||
|
// Attribute: Name
|
||||||
|
if (node.rname != null) { x += addDeviceAttribute('<span title="The name of this computer as set in the operating system">Name</span>', '<span title="The name of this computer as set in the operating system">' + EscapeHtml(node.rname) + '</span>'); }
|
||||||
|
|
||||||
// Attribute: Host
|
// Attribute: Host
|
||||||
if ((mesh.mtype == 1) || (node.name != node.host)) {
|
if ((mesh.mtype == 1) || (node.name != node.host)) {
|
||||||
|
324
views/login-mobile.handlebars
Normal file
324
views/login-mobile.handlebars
Normal file
@ -0,0 +1,324 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html dir="ltr" xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||||
|
<meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="format-detection" content="telephone=no" />
|
||||||
|
<script type="text/javascript" src="scripts/common-0.0.1.js"></script>
|
||||||
|
<title>MeshCentral - Login</title>
|
||||||
|
<style>
|
||||||
|
a {
|
||||||
|
color: #036;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a:hover {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body onload="if (typeof(startup) !== 'undefined') startup();" style="overflow-y:hidden;margin:0;padding:0;border:0;color:black;font-size:13px;font-family:\'Trebuchet MS\', Arial, Helvetica, sans-serif">
|
||||||
|
<div id=container>
|
||||||
|
<div id=mastheadx></div>
|
||||||
|
<div id=masthead style="background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden">
|
||||||
|
<div style="float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:4px">
|
||||||
|
<strong><font style="font-size:36px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong>
|
||||||
|
</div>
|
||||||
|
<div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:7px">
|
||||||
|
<strong><font style="font-size:12px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id=page_content style="overflow-y:scroll;position:absolute;bottom:32px;top:50px">
|
||||||
|
<div id=column_l style="padding:10px">
|
||||||
|
<div align=center>
|
||||||
|
<img alt="" src=images/icons50.png width=300 height=50 />
|
||||||
|
</div>
|
||||||
|
<p>Connect to your devices anywhere using MeshCentral, the remote monitoring and management web site. Get started by creating an account if you don't have one already.</p>
|
||||||
|
<table style=width:100%>
|
||||||
|
<tr>
|
||||||
|
<td align=center>
|
||||||
|
<div id=loginpanel style="background-color:#979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none">
|
||||||
|
<form action="login" method=post>
|
||||||
|
<div id=message1>
|
||||||
|
{{{message}}}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<b>Log In</b>
|
||||||
|
</div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align=right width=100>Username:</td>
|
||||||
|
<td><input id=username type=text maxlength=64 name=username onchange=validateLogin(1) onkeyup=validateLogin(1,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=right>Password:</td>
|
||||||
|
<td><input id=password type=password maxlength=256 name=password autocomplete=off onchange=validateLogin(2) onkeyup=validateLogin(2,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><div id=showPassHintLink style=display:none><a onclick=showPassHint() style="cursor:pointer">Show Hint</a></div></td>
|
||||||
|
<td align=right><input id=loginButton type=submit value="Log In" disabled="disabled" /></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<div id="hrAccountDiv" style="display:none"><hr /></div>
|
||||||
|
<div id="resetAccountDiv" style="display:none;padding:2px">
|
||||||
|
Forgot user/password? <a onclick=xgo(3) style=cursor:pointer>Reset account</a>.
|
||||||
|
</div>
|
||||||
|
<div id="newAccountDiv" style="display:none;padding:2px">
|
||||||
|
Don't have an account? <a onclick=xgo(2) style=cursor:pointer>Create one</a>.
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div id=createpanel style="background-color: #979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none">
|
||||||
|
<form action=createaccount method=post>
|
||||||
|
<div id=message2>
|
||||||
|
{{{message}}}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<b>Account Creation</b>
|
||||||
|
</div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align=right width=100>Username:</td>
|
||||||
|
<td><input id=ausername type=text name=username onchange=validateCreate(1) maxlength=64 onkeydown=haltReturn(event) onkeyup=validateCreate(1,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=right width=100>Email:</td>
|
||||||
|
<td><input id=aemail type=text name=email onchange=validateCreate(2) maxlength=256 onkeydown=haltReturn(event) onkeyup=validateCreate(2,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=right>Password:</td>
|
||||||
|
<td><input id=apassword1 type=password name=password1 autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(3) onkeyup=validateCreate(3,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=right>Password:</td>
|
||||||
|
<td><input id=apassword2 type=password name=password2 autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(4) onkeyup=validateCreate(4,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align=right>Pass Hint:</td>
|
||||||
|
<td><input id=apasswordhint type=text name=apasswordhint autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(5) onkeyup=validateCreate(5,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr id=newAccountPass title="Enter the account creation token">
|
||||||
|
<td align=right>Creation Token:</td>
|
||||||
|
<td><input id=anewaccountpass type=password name=anewaccountpass autocomplete=off maxlength=256 onkeydown=haltReturn(event) onchange=validateCreate(6) onkeyup=validateCreate(6,event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan=2>
|
||||||
|
<div style=float:right><input id=createButton type=submit value="Create Account" disabled="disabled" /></div>
|
||||||
|
<div id=passWarning style="padding-top:6px"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr /><a onclick=xgo(1) style=cursor:pointer>Back to login</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div id=resetpanel style="background-color: #979797;border-radius:16px;width:260px;padding:16px;text-align:center;display:none">
|
||||||
|
<form action=resetaccount method=post>
|
||||||
|
<div id=message3>
|
||||||
|
{{{message}}}
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<b>Account Reset</b>
|
||||||
|
</div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td align=right width=100>Email:</td>
|
||||||
|
<td><input id=remail type=text name=email maxlength=256 onchange=validateReset() onkeyup=validateReset(event) /></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan=2>
|
||||||
|
<div style=float:right><input id=eresetButton type=submit value="Reset Account" disabled="disabled" /></div>
|
||||||
|
<div id=passWarning style="padding-top:6px"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr /><a onclick=xgo(1) style=cursor:pointer>Back to login</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id=footer style="height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0px">
|
||||||
|
<table cellpadding=0 cellspacing=6 style=width:100%>
|
||||||
|
<tr>
|
||||||
|
<td style=text-align:left;color:white>{{{footer}}}</td>
|
||||||
|
<td style=text-align:right>{{{rootCertLink}}} <a href=terms>Terms & Privacy</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id=dialog style="z-index:1000;background-color:#EEE;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:5px;position:fixed;top:180px;width:400px;display:none">
|
||||||
|
<div style="width:100%;background-color:#003366;color:#FFF;border-radius:5px 5px 0 0">
|
||||||
|
<div id=id_dialogclose style=float:right;padding:5px;cursor:pointer onclick=setDialogMode()><b>X</b></div>
|
||||||
|
<div id=id_dialogtitle style=padding:5px></div>
|
||||||
|
<div style=width:100%;margin:6px></div>
|
||||||
|
</div>
|
||||||
|
<div style="margin-right:16px;margin-left:8px">
|
||||||
|
<div id=dialog1 style="margin:auto;text-align:center;margin:3px">
|
||||||
|
<div id=id_dialogMessage style="padding:10px"></div>
|
||||||
|
</div>
|
||||||
|
<div id=dialog2 style="margin:auto;margin:3px">
|
||||||
|
<div id=id_dialogOptions></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="idx_dlgButtonBar" style="padding:10px;margin-bottom:20px">
|
||||||
|
<input id="idx_dlgCancelButton" type="button" value="Cancel" style="float:right;width:80px;margin-left:5px" onclick="dialogclose(0)">
|
||||||
|
<input id="idx_dlgOkButton" type="button" value="OK" style="float:right;width:80px" onclick="dialogclose(1)">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
var passhint = "{{{passhint}}}";
|
||||||
|
var newAccountPass = {{{newAccountPass}}};
|
||||||
|
var emailCheck = {{{emailcheck}}};
|
||||||
|
var features = {{{features}}};
|
||||||
|
|
||||||
|
function startup() {
|
||||||
|
if ((features & 32) == 0) {
|
||||||
|
// Guard against other site's top frames (web bugs).
|
||||||
|
var loc = null;
|
||||||
|
try { loc = top.location.toString().toLowerCase(); } catch (e) { }
|
||||||
|
if (top != self && (loc == null || top.active == false)) { top.location = self.location; return; }
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onresize = center;
|
||||||
|
center();
|
||||||
|
validateLogin();
|
||||||
|
validateCreate();
|
||||||
|
if ('{{loginmode}}' != '') { go({{loginmode}}); } else { go(1); }
|
||||||
|
QV('newAccountDiv', '{{{newAccount}}}' != '0' );
|
||||||
|
if ((passhint != null) && (passhint.length > 0)) { QV("showPassHintLink", true); }
|
||||||
|
QV("newAccountPass", (newAccountPass == 1));
|
||||||
|
QV("resetAccountDiv", (emailCheck == true));
|
||||||
|
QV("hrAccountDiv", (emailCheck == true) || (newAccountPass == 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPassHint() {
|
||||||
|
messagebox("Password Hint", passhint);
|
||||||
|
}
|
||||||
|
|
||||||
|
function xgo(x) {
|
||||||
|
QV('message1', false);
|
||||||
|
QV('message2', false);
|
||||||
|
go(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
function go(x) {
|
||||||
|
setDialogMode(0);
|
||||||
|
QV("showPassHintLink", false);
|
||||||
|
QV('loginpanel', x == 1);
|
||||||
|
QV('createpanel', x == 2);
|
||||||
|
QV('resetpanel', x == 3);
|
||||||
|
if (x == 1) { Q('username').focus(); }
|
||||||
|
if (x == 2) { Q('ausername').focus(); }
|
||||||
|
if (x == 3) { Q('remail').focus(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateLogin(box, e) {
|
||||||
|
var ok = ((Q('username').value.length > 0) && (Q('username').value.indexOf(' ') == -1) && (Q('password').value.length > 0));
|
||||||
|
QE('loginButton', ok);
|
||||||
|
setDialogMode(0);
|
||||||
|
if ((e != null) && (e.keyCode == 13)) { if (box == 1) { Q('password').focus(); } else if (box == 2) { Q('loginButton').click(); } }
|
||||||
|
if (e != null) { haltEvent(e); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateCreate(box,e) {
|
||||||
|
setDialogMode(0);
|
||||||
|
var ok = ((Q('ausername').value.length > 0) && (Q('ausername').value.indexOf(' ') == -1) && (validateEmail(Q('aemail').value) == true) && (Q('apassword1').value.length > 0) && (Q('apassword2').value == Q('apassword1').value));
|
||||||
|
if ((newAccountPass == 1) && (Q('anewaccountpass').value.length == 0)) { ok = false; }
|
||||||
|
QE('createButton', ok);
|
||||||
|
if (Q('apassword1').value == '') {
|
||||||
|
QH('passWarning', '');
|
||||||
|
} else {
|
||||||
|
var passStrength = checkPasswordStrength(Q('apassword1').value);
|
||||||
|
if (passStrength >= 80) { QH('passWarning', '<span style=color:green><b>Strong Password</b><span>'); }
|
||||||
|
else if (passStrength >= 60) { QH('passWarning', '<span style=color:blue><b>Good Password</b><span>'); }
|
||||||
|
else { QH('passWarning', '<span style=color:red><b>Weak Password</b><span>'); }
|
||||||
|
}
|
||||||
|
if ((e != null) && (e.keyCode == 13)) {
|
||||||
|
if (box == 1) { Q('aemail').focus(); }
|
||||||
|
if (box == 2) { Q('apassword1').focus(); }
|
||||||
|
if (box == 3) { Q('apassword2').focus(); }
|
||||||
|
if (box == 4) { Q('apasswordhint').focus(); }
|
||||||
|
if (box == 5) { if (newAccountPass == 1) { Q('anewaccountpass').focus(); } else { Q('createButton').click(); } }
|
||||||
|
if (box == 6) { Q('createButton').click(); }
|
||||||
|
}
|
||||||
|
if (e != null) { haltEvent(e); }
|
||||||
|
}
|
||||||
|
|
||||||
|
function validateReset(e) {
|
||||||
|
setDialogMode(0);
|
||||||
|
var x = validateEmail(Q('remail').value);
|
||||||
|
QE('eresetButton', x);
|
||||||
|
if ((e != null) && (e.keyCode == 13) && (x == true)) {
|
||||||
|
Q('eresetButton').click();
|
||||||
|
}
|
||||||
|
if (e != null) { haltEvent(e); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return a password strength score
|
||||||
|
function checkPasswordStrength(password) {
|
||||||
|
var r = 0, letters = {}, varCount = 0, variations = { digits: /\d/.test(password), lower: /[a-z]/.test(password), upper: /[A-Z]/.test(password), nonWords: /\W/.test(password) }
|
||||||
|
if (!password) return 0;
|
||||||
|
for (var i = 0; i< password.length; i++) { letters[password[i]] = (letters[password[i]] || 0) + 1; r += 5.0 / letters[password[i]]; }
|
||||||
|
for (var c in variations) { varCount += (variations[c] == true) ? 1 : 0; }
|
||||||
|
return parseInt(r + (varCount - 1) * 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// POPUP DIALOG
|
||||||
|
//
|
||||||
|
|
||||||
|
// undefined = Hidden, 1 = Generic Message
|
||||||
|
var xxdialogMode;
|
||||||
|
var xxdialogFunc;
|
||||||
|
var xxdialogButtons;
|
||||||
|
var xxdialogTag;
|
||||||
|
var xxcurrentView = 0;
|
||||||
|
|
||||||
|
// Display a dialog box
|
||||||
|
// Parameters: Dialog Mode (0 = none), Dialog Title, Buttons (1 = OK, 2 = Cancel, 3 = OK & Cancel), Call back function(0 = Cancel, 1 = OK), Dialog Content (Mode 2 only)
|
||||||
|
function setDialogMode(x, y, b, f, c, tag) {
|
||||||
|
xxdialogMode = x;
|
||||||
|
xxdialogFunc = f;
|
||||||
|
xxdialogButtons = b;
|
||||||
|
xxdialogTag = tag;
|
||||||
|
QE('idx_dlgOkButton', true);
|
||||||
|
QV('idx_dlgOkButton', b & 1);
|
||||||
|
QV('idx_dlgCancelButton', b & 2);
|
||||||
|
QV('id_dialogclose', (b & 2) || (b & 8));
|
||||||
|
QV('idx_dlgButtonBar', b & 7);
|
||||||
|
if (y) QH('id_dialogtitle', y);
|
||||||
|
for (var i = 1; i < 24; i++) { QV('dialog' + i, i == x); } // Edit this line when more dialogs are added
|
||||||
|
QV('dialog', x);
|
||||||
|
if (c) { if (x == 2) { QH('id_dialogOptions', c); } else { QH('id_dialogMessage', c); } }
|
||||||
|
}
|
||||||
|
|
||||||
|
function dialogclose(x) {
|
||||||
|
var f = xxdialogFunc;
|
||||||
|
var b = xxdialogButtons;
|
||||||
|
var t = xxdialogTag;
|
||||||
|
setDialogMode();
|
||||||
|
if (((b & 8) || x) && f) f(x, t);
|
||||||
|
}
|
||||||
|
|
||||||
|
function center() { QS('dialog').left = ((((getDocWidth() - 400) / 2)) + "px"); }
|
||||||
|
function messagebox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t, 1); }
|
||||||
|
function statusbox(t, m) { QH('id_dialogMessage', m); setDialogMode(1, t); }
|
||||||
|
function getDocWidth() { if (window.innerWidth) return window.innerWidth; if (document.documentElement && document.documentElement.clientWidth && document.documentElement.clientWidth != 0) return document.documentElement.clientWidth; return document.getElementsByTagName('body')[0].clientWidth; }
|
||||||
|
function haltEvent(e) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); return false; }
|
||||||
|
function haltReturn(e) { if (e.keyCode == 13) { haltEvent(e); } }
|
||||||
|
function validateEmail(v) { var emailReg = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; return emailReg.test(v); }
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
168
views/terms-mobile.handlebars
Normal file
168
views/terms-mobile.handlebars
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||||
|
<meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
|
<meta name="format-detection" content="telephone=no" />
|
||||||
|
<title>MeshCentral - Terms of use</title>
|
||||||
|
<style type="text/css">
|
||||||
|
a {
|
||||||
|
color: #036;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footer a:hover {
|
||||||
|
color: #fff;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body onload="if (typeof(startup) !== 'undefined') startup();" style="overflow-y:hidden;margin:0;padding:0;border:0;color:black;font-size:13px;font-family:\'Trebuchet MS\', Arial, Helvetica, sans-serif">
|
||||||
|
<div id="container">
|
||||||
|
<!-- Begin Masthead -->
|
||||||
|
<div id=masthead style="background-color:#036;background-repeat:no-repeat;height:50px;width:100%;overflow:hidden">
|
||||||
|
<div style="float:left;height:66px;color:#c8c8c8;padding-left:10px;padding-top:4px">
|
||||||
|
<strong><font style="font-size:36px;font-family:Arial,Helvetica,sans-serif">{{{title}}}</font></strong>
|
||||||
|
</div>
|
||||||
|
<div style="float:left;height:66px;color:#c8c8c8;padding-left:5px;padding-top:7px">
|
||||||
|
<strong><font style="font-size:12px;font-family:Arial,Helvetica,sans-serif">{{{title2}}}</font></strong>
|
||||||
|
</div>
|
||||||
|
<p>{{{logoutControl}}}</p>
|
||||||
|
</div>
|
||||||
|
<div id=page_content style="overflow-y:scroll;position:absolute;bottom:32px;top:50px">
|
||||||
|
<div id="column_l" style="padding-left:10px;padding-right:10px">
|
||||||
|
<h1>Terms of use</h1>
|
||||||
|
<p>Please contact the site administrator for terms of use.</p>
|
||||||
|
<hr />
|
||||||
|
<p class="MsoNormal">
|
||||||
|
The following are the required disclosures of open source components and software incorporated into this software.
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>1.AJAX Control Toolkit - New BSD License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright (c) 2009, CodePlex Foundation. All rights reserved.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>1.Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>3.Neither the name of CodePlex Foundation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>2.OpenSSL – OpenSSL and SSLeay License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span><a href="http://www.openssl.org/source/license.html">http://www.openssl.org/source/license.html</a> </span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>1.Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>2.Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. <o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>3.All advertising materials mentioning features or use of this software must display the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/)" <o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>4.The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact openssl-core@openssl.org.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>5.Products derived from this software may not be called "OpenSSL" nor may "OpenSSL" appear in their names without prior written permission of the OpenSSL Project.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>6.Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)". <o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>3.jQuery Foundation - MIT License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright 2013 jQuery Foundation and other contributors <a href="http://jquery.com/">http://jquery.com/</a></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>4.jQuery User Interface - MIT License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright 2013 jQuery Foundation and other contributors, <a href="http://jqueryui.com/">http://jqueryui.com/</a></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>This software consists of voluntary contributions made by many individuals (AUTHORS.txt, http://jqueryui.com/about ). For exact contribution history,see the revision history and logs, available at http://jquery-ui.googlecode.com/svn/ <o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>5.noVNC - Mozilla Public License 2.0</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span><a href="https://github.com/kanaka/noVNC/blob/master/LICENSE.txt">https://github.com/kanaka/noVNC/blob/master/LICENSE.txt</a></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright (C) 2011 Joel Martin This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>6.Rcarousel - MIT LIcense</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span><a href="https://github.com/ryrych/rcarousel/blob/master/widget/license">https://github.com/ryrych/rcarousel/blob/master/widget/license</a></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>Copyright (c) 2010 Wojciech 'RRH' Ryrych<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b><span>7.Webtoolkit Javascript Base 64 – Creative Commons Attribution 2.0 UK License</span></b><span><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<span>This software uses code from <a href="http://www.webtoolkit.info/javascript-base64.html">http://www.webtoolkit.info/javascript-base64.html</a> licensed under the <a href="http://creativecommons.org/licenses/by/2.0/uk/legalcode">http://creativecommons.org/licenses/by/2.0/uk/legalcode</a> and its source can be downloaded from <a href="http://www.webtoolkit.info/javascript-base64.html">http://www.webtoolkit.info/javascript-base64.html</a>.<o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
<b>8.Android LibJPEG</b>
|
||||||
|
</p>
|
||||||
|
<p class="MsoNormal">
|
||||||
|
This software uses code from <span style="color:#1F497D"><a href="https://github.com/android/platform_external_jpeg">https://github.com/android/platform_external_jpeg</a> </span>licensed under<span style="color:#1F497D"> <a href="https://github.com/android/platform_external_jpeg/blob/master/NOTICE">https://github.com/android/platform_external_jpeg/blob/master/NOTICE</a><o:p></o:p></span>
|
||||||
|
</p>
|
||||||
|
<br />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id=footer style="height:32px;width:100%;text-align:center;background-color:#113962;position:absolute;bottom:0px">
|
||||||
|
<table cellpadding=0 cellspacing=6 style=width:100%>
|
||||||
|
<tr>
|
||||||
|
<td style=text-align:left;color:white>{{{footer}}}</td>
|
||||||
|
<td style=text-align:right>{{{rootCertLink}}} <a href="/">Login</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -1,39 +1,13 @@
|
|||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
|
||||||
|
<meta name="viewport" content="user-scalable=1.0,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0" />
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||||
<meta name="format-detection" content="telephone=no" />
|
<meta name="format-detection" content="telephone=no" />
|
||||||
<link type="text/css" href="styles/style.css" media="screen" rel="stylesheet" title="CSS" />
|
<link type="text/css" href="styles/style.css" media="screen" rel="stylesheet" title="CSS" />
|
||||||
<title>MeshCentral - Terms of use</title>
|
<title>MeshCentral - Terms of use</title>
|
||||||
<style type="text/css">
|
|
||||||
.style1 {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.style2 {
|
|
||||||
text-align: center;
|
|
||||||
background-color: #808080;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.style3 {
|
|
||||||
text-align: center;
|
|
||||||
color: white;
|
|
||||||
background-color: #808080;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
|
|
||||||
.style4 {
|
|
||||||
color: white;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.style5 {
|
|
||||||
text-align: center;
|
|
||||||
background-color: #808080;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
</head>
|
||||||
<body onload="if (typeof(startup) !== 'undefined') startup();">
|
<body onload="if (typeof(startup) !== 'undefined') startup();">
|
||||||
<div id="container">
|
<div id="container">
|
||||||
@ -53,7 +27,7 @@
|
|||||||
<p>Please contact the site administrator for terms of use.</p>
|
<p>Please contact the site administrator for terms of use.</p>
|
||||||
<hr />
|
<hr />
|
||||||
<p class="MsoNormal">
|
<p class="MsoNormal">
|
||||||
The following are the required disclosures of open source components and software incorporated into Intel® Remote Managed Services.
|
The following are the required disclosures of open source components and software incorporated into this software.
|
||||||
</p>
|
</p>
|
||||||
<p class="MsoNormal">
|
<p class="MsoNormal">
|
||||||
<b><span>1.AJAX Control Toolkit - New BSD License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
<b><span>1.AJAX Control Toolkit - New BSD License</span></b><span style="font-size:10.0pt;font-family:"Courier New";mso-fareast-font-family:"Times New Roman""><o:p></o:p></span>
|
||||||
@ -170,7 +144,7 @@
|
|||||||
<table cellpadding="0" cellspacing="10" style="width: 100%">
|
<table cellpadding="0" cellspacing="10" style="width: 100%">
|
||||||
<tr>
|
<tr>
|
||||||
<td style="text-align:left"></td>
|
<td style="text-align:left"></td>
|
||||||
<td style="text-align:right"><a href="terms">Terms & Privacy</a></td>
|
<td style="text-align:right"><a href="/">Login</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
16
webserver.js
16
webserver.js
@ -715,12 +715,11 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
res.render(obj.path.join(__dirname, 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
|
res.render(obj.path.join(__dirname, 'views/default'), { viewmode: viewmode, currentNode: currentNode, logoutControl: logoutcontrol, title: domain.title, title2: domain.title2, domainurl: domain.url, domain: domain.id, debuglevel: parent.debugLevel, serverDnsName: getWebServerName(domain), serverRedirPort: args.redirport, serverPublicPort: httpsPort, noServerBackup: (args.noserverbackup == 1 ? 1 : 0), features: features, mpspass: args.mpspass, webcerthash: obj.webCertificateHashBase64, footer: (domain.footer == null) ? '' : domain.footer });
|
||||||
} else {
|
} else {
|
||||||
// Send back the login application
|
// Send back the login application
|
||||||
var loginmode = req.session.loginmode;
|
var loginmode = req.session.loginmode, features = 0;
|
||||||
delete req.session.loginmode; // Clear this state, if the user hits refresh, we want to go back to the login page.
|
delete req.session.loginmode; // Clear this state, if the user hits refresh, we want to go back to the login page.
|
||||||
var features = 0;
|
|
||||||
if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 32; } // Allow site within iframe
|
if ((parent.config != null) && (parent.config.settings != null) && (parent.config.settings.allowframing == true)) { features += 32; } // Allow site within iframe
|
||||||
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
var httpsPort = ((obj.args.aliasport == null) ? obj.args.port : obj.args.aliasport); // Use HTTPS alias port is specified
|
||||||
res.render(obj.path.join(__dirname, 'views/login'), { loginmode: loginmode, rootCertLink: getRootCertLink(), title: domain.title, title2: domain.title2, newAccount: domain.newaccounts, newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), serverDnsName: getWebServerName(domain), serverPublicPort: httpsPort, emailcheck: obj.parent.mailserver != null, features: features, footer: (domain.footer == null) ? '' : domain.footer });
|
res.render(obj.path.join(__dirname, isModuleBrowser(req) ?'views/login-mobile':'views/login'), { loginmode: loginmode, rootCertLink: getRootCertLink(), title: domain.title, title2: domain.title2, newAccount: domain.newaccounts, newAccountPass: (((domain.newaccountspass == null) || (domain.newaccountspass == '')) ? 0 : 1), serverDnsName: getWebServerName(domain), serverPublicPort: httpsPort, emailcheck: obj.parent.mailserver != null, features: features, footer: (domain.footer == null) ? '' : domain.footer });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -739,9 +738,9 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
if (req.session && req.session.userid) {
|
if (req.session && req.session.userid) {
|
||||||
if (req.session.domainid != domain.id) { req.session.destroy(function () { res.redirect(domain.url); }); return; } // Check is the session is for the correct domain
|
if (req.session.domainid != domain.id) { req.session.destroy(function () { res.redirect(domain.url); }); return; } // Check is the session is for the correct domain
|
||||||
var user = obj.users[req.session.userid];
|
var user = obj.users[req.session.userid];
|
||||||
res.render(obj.path.join(__dirname, 'views/terms'), { title: domain.title, title2: domain.title2, logoutControl: 'Welcome ' + user.name + '. <a href=' + domain.url + 'logout?' + Math.random() + ' style=color:white>Logout</a>' });
|
res.render(obj.path.join(__dirname, isModuleBrowser(req)?'views/terms-mobile':'views/terms'), { title: domain.title, title2: domain.title2, logoutControl: 'Welcome ' + user.name + '. <a href=' + domain.url + 'logout?' + Math.random() + ' style=color:white>Logout</a>' });
|
||||||
} else {
|
} else {
|
||||||
res.render(obj.path.join(__dirname, 'views/terms'), { title: domain.title, title2: domain.title2 });
|
res.render(obj.path.join(__dirname, isModuleBrowser(req)?'views/terms-mobile':'views/terms'), { title: domain.title, title2: domain.title2 });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1872,6 +1871,13 @@ module.exports.CreateWebServer = function (parent, db, args, secret, certificate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return true if a mobile browser is detected.
|
||||||
|
// This code comes from "http://detectmobilebrowsers.com/", This is free and unencumbered software released into the public domain. For more information, please refer to the http://unlicense.org/
|
||||||
|
function isModuleBrowser(req) {
|
||||||
|
var ua = req.headers['user-agent'].toLowerCase();
|
||||||
|
return (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(ua) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(ua.substr(0, 4)));
|
||||||
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user