Added staring a device feature.
Ylian Saint-Hilaire committed
Jul 28, 2020 at 15:27 UTC
2d677298dbf8f21a215ba108a8ccd9b8d1dc090c
11 files changed
+159
-30
meshuser.js
+1
-1
@@ -4219,7 +4219,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
4219
case 'userWebState': {
4220
if (common.validateString(command.state, 1, 10000) == false) break; // Check state size, no more than 10k
4221
command.state = parent.filterUserWebState(command.state); // Filter the state to remove anything bad
4222
- if ((command.state == null) || (typeof command.state !== 'object')) break; // If state did not validate correctly, quit here.
4222
+ if ((command.state == null) || (typeof command.state !== 'string')) { console.log('tt'); break; } // If state did not validate correctly, quit here.
4223
db.Set({ _id: 'ws' + user._id, state: command.state });
4224
parent.parent.DispatchEvent([user._id], obj, { action: 'userWebState', nolog: 1, domain: domain.id, state: command.state });
4225
break;
public/images/icon-star-notify-10.png
Binary files /dev/null and b/public/images/icon-star-notify-10.png differ
public/images/icon-star-notify-16.png
Binary files /dev/null and b/public/images/icon-star-notify-16.png differ
public/images/icon-star-notify-40.png
Binary files /dev/null and b/public/images/icon-star-notify-40.png differ
public/images/icon-star-notify.png
Binary files /dev/null and b/public/images/icon-star-notify.png differ
public/scripts/amt-wsman-0.2.0-min.js
+1
-1
@@ -1 +1 @@
1
-var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns="http://www.w3.org/2003/05/soap-envelope" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,d,c){var m="",i="";null!=d&&null!=c&&(m="<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>"+d+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+c+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var d in s)l+="<g:"+d+">"+s[d]+"</g:"+d+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var d in r)if(null!=r[d])if(Array.isArray(r[d]))for(var c in r[d])l+="<r:"+d+">"+r[d][c]+"</r:"+d+">";else l+="<r:"+d+">"+r[d]+"</r:"+d+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" /></Body></Envelope>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration"><EnumerationContext>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
1
+var WsmanStackCreateService=function(e,s,r,a,o,t){var p={};function l(e){if(!e)return"";var s=" ";for(var r in e)e.hasOwnProperty(r)&&0===r.indexOf("@")&&(s+=r.substring(1)+'="'+e[r]+'" ');return s}function w(e){if(!e)return"";if("string"==typeof e)return e;if(e.InstanceID)return'<w:SelectorSet><w:Selector Name="InstanceID">'+e.InstanceID+"</w:Selector></w:SelectorSet>";var s="<w:SelectorSet>";for(var r in e)if(e.hasOwnProperty(r)){if(s+='<w:Selector Name="'+r+'">',e[r].ReferenceParameters){s+="<a:EndpointReference>",s+="<a:Address>"+e[r].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+e[r].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var a=e[r].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(a))for(var o=0;o<a.length;o++)s+="<w:Selector"+l(a[o])+">"+a[o].Value+"</w:Selector>";else s+="<w:Selector"+l(a)+">"+a.Value+"</w:Selector>";s+="</w:SelectorSet></a:ReferenceParameters></a:EndpointReference>"}else s+=e[r];s+="</w:Selector>"}return s+="</w:SelectorSet>"}return p.NextMessageId=1,p.Address="/wsman",p.comm=CreateWsmanComm(e,s,r,a,o,t),p.PerformAjax=function(e,o,s,r,a){null==a&&(a=""),p.comm.PerformAjax('<?xml version=\"1.0\" encoding=\"utf-8\"?><Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:a="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:w="http://schemas.dmtf.org/wbem/wsman/1/wsman.xsd" xmlns="http://www.w3.org/2003/05/soap-envelope" '+a+"><Header><a:Action>"+e,function(e,s,r){if(200==s){var a=p.ParseWsman(e);a&&null!=a?o(p,a.Header.ResourceURI,a,200,r):o(p,null,{Header:{HttpError:s}},601,r)}else o(p,null,{Header:{HttpError:s}},s,r)},s,r)},p.CancelAllQueries=function(e){p.comm.CancelAllQueries(e)},p.GetNameFromUrl=function(e){var s=e.lastIndexOf("/");return-1==s?e:e.substring(s+1)},p.ExecSubscribe=function(e,s,r,a,o,t,n,l,c,d){var m="",i="";null!=c&&null!=d&&(m="<t:IssuedTokens><t:RequestSecurityTokenResponse><t:TokenType>http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken</t:TokenType><t:RequestedSecurityToken><se:UsernameToken><se:Username>"+c+'</se:Username><se:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd#PasswordText">'+d+"</se:Password></se:UsernameToken></t:RequestedSecurityToken></t:RequestSecurityTokenResponse></t:IssuedTokens>",i='<Auth Profile="http://schemas.xmlsoap.org/ws/2004/08/eventing/DeliveryModes/secprofile/http/digest"/>'),l=null!=l&&null!=l?"<a:ReferenceParameters>"+l+"</a:ReferenceParameters>":"";var u="http://schemas.xmlsoap.org/ws/2004/08/eventing/Subscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(n)+m+'</Header><Body><e:Subscribe><e:Delivery Mode="http://schemas.dmtf.org/wbem/wsman/1/wsman/'+s+'"><e:NotifyTo><a:Address>'+r+"</a:Address></e:NotifyTo>"+i+"</e:Delivery><e:Expires>PT0.000000S</e:Expires></e:Subscribe>";p.PerformAjax(u+"</Body></Envelope>",a,o,t,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing" xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust" xmlns:se="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:m="http://x.com"')},p.ExecUnSubscribe=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/08/eventing/Unsubscribe</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo>"+w(o)+"</Header><Body><e:Unsubscribe/>";p.PerformAjax(t+"</Body></Envelope>",s,r,a,'xmlns:e="http://schemas.xmlsoap.org/ws/2004/08/eventing"')},p.ExecPut=function(e,s,r,a,o,t){var n="http://schemas.xmlsoap.org/ws/2004/09/transfer/Put</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout>"+w(t)+"</Header><Body>"+function(e,s){if(!e||null==s)return"";var r=p.GetNameFromUrl(e),a="<r:"+r+' xmlns:r="'+e+'">';for(var o in s)if(s.hasOwnProperty(o)&&0!==o.indexOf("__")&&0!==o.indexOf("@")&&void 0!==s[o]&&null!==s[o]&&"function"!=typeof s[o])if("object"==typeof s[o]&&s[o].ReferenceParameters){a+="<r:"+o+"><a:Address>"+s[o].Address+"</a:Address><a:ReferenceParameters><w:ResourceURI>"+s[o].ReferenceParameters.ResourceURI+"</w:ResourceURI><w:SelectorSet>";var t=s[o].ReferenceParameters.SelectorSet.Selector;if(Array.isArray(t))for(var n=0;n<t.length;n++)a+="<w:Selector"+l(t[n])+">"+t[n].Value+"</w:Selector>";else a+="<w:Selector"+l(t)+">"+t.Value+"</w:Selector>";a+="</w:SelectorSet></a:ReferenceParameters></r:"+o+">"}else if(Array.isArray(s[o]))for(n=0;n<s[o].length;n++)a+="<r:"+o+">"+s[o][n].toString()+"</r:"+o+">";else a+="<r:"+o+">"+s[o].toString()+"</r:"+o+">";return a+="</r:"+r+">"}(e,s);p.PerformAjax(n+"</Body></Envelope>",r,a,o)},p.ExecCreate=function(e,s,r,a,o,t){var n=p.GetNameFromUrl(e),l="http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(t)+"</Header><Body><g:"+n+' xmlns:g="'+e+'">';for(var c in s)l+="<g:"+c+">"+s[c]+"</g:"+c+">";p.PerformAjax(l+"</g:"+n+"></Body></Envelope>",r,a,o)},p.ExecCreateXml=function(e,s,r,a,o){var t=p.GetNameFromUrl(e);p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Create</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60.000S</w:OperationTimeout></Header><Body><r:"+t+' xmlns:r="'+e+'">'+s+"</r:"+t+"></Body></Envelope>",r,a,o)},p.ExecDelete=function(e,s,r,a,o){var t="http://schemas.xmlsoap.org/ws/2004/09/transfer/Delete</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(s)+"</Header><Body /></Envelope>";p.PerformAjax(t,r,a,o)},p.ExecGet=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/transfer/Get</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body /></Envelope>",s,r,a)},p.ExecMethod=function(e,s,r,a,o,t,n){var l="";for(var c in r)if(null!=r[c])if(Array.isArray(r[c]))for(var d in r[c])l+="<r:"+c+">"+r[c][d]+"</r:"+c+">";else l+="<r:"+c+">"+r[c]+"</r:"+c+">";p.ExecMethodXml(e,s,l,a,o,t,n)},p.ExecMethodXml=function(e,s,r,a,o,t,n){p.PerformAjax(e+"/"+s+"</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++"</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout>"+w(n)+"</Header><Body><r:"+s+'_INPUT xmlns:r="'+e+'">'+r+"</r:"+s+"_INPUT></Body></Envelope>",a,o,t)},p.ExecEnum=function(e,s,r,a){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Enumerate</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Enumerate xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration" /></Body></Envelope>',s,r,a)},p.ExecPull=function(e,s,r,a,o){p.PerformAjax("http://schemas.xmlsoap.org/ws/2004/09/enumeration/Pull</a:Action><a:To>"+p.Address+"</a:To><w:ResourceURI>"+e+"</w:ResourceURI><a:MessageID>"+p.NextMessageId+++'</a:MessageID><a:ReplyTo><a:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</a:Address></a:ReplyTo><w:OperationTimeout>PT60S</w:OperationTimeout></Header><Body><Pull xmlns="http://schemas.xmlsoap.org/ws/2004/09/enumeration"><EnumerationContext>'+s+"</EnumerationContext><MaxElements>999</MaxElements><MaxCharacters>99999</MaxCharacters></Pull></Body></Envelope>",r,a,o)},p.ParseWsman=function(s){try{s.childNodes||(s=function(e){{if(window.DOMParser)return(new DOMParser).parseFromString(e,"text/xml");var s=new ActiveXObject("Microsoft.XMLDOM");return s.async=!1,s.loadXML(e),s}}(s));var e,r={Header:{}},a=s.getElementsByTagName("Header")[0];if(!(a=a||s.getElementsByTagName("a:Header")[0]))return null;for(var o=0;o<a.childNodes.length;o++){var t=a.childNodes[o];r.Header[t.localName]=t.textContent}var n=s.getElementsByTagName("Body")[0];return(n=n||s.getElementsByTagName("a:Body")[0])?(0<n.childNodes.length&&((e=n.childNodes[0].localName).indexOf("_OUTPUT")==e.length-7&&(e=e.substring(0,e.length-7)),r.Header.Method=e,r.Body=function e(s){var r,a={};for(var o=0;o<s.childNodes.length;o++){var t=s.childNodes[o];"true"==(r=0==t.childElementCount?t.textContent:e(t))&&(r=!0),"false"==r&&(r=!1);var n=r;if(0<t.attributes.length){n={Value:r};for(var l=0;l<t.attributes.length;l++)n["@"+t.attributes[l].name]=t.attributes[l].value}a[t.localName]instanceof Array?a[t.localName].push(n):null==a[t.localName]?a[t.localName]=n:a[t.localName]=[a[t.localName],n]}return a}(n.childNodes[0])),r):null}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
public/styles/style.css
+21
-8
@@ -746,40 +746,48 @@ NoMeshesPanel img {
746
}
747
748
.deviceNotifyDot {
749
- text-align:center;
749
position:absolute;
750
right:10px;
751
top:0px;
753
- width:16px;
752
height:16px;
753
+}
754
+
755
+.deviceNotifyDotSub {
756
+ text-align:center;
757
color:#FFF;
758
+ width:16px;
759
background-color:#00F;
760
padding:2px;
761
border-radius:10px;
762
box-shadow: 2px 2px 10px black;
763
cursor:pointer;
764
+ margin-left:3px;
765
}
766
763
- .deviceNotifyDot:hover {
767
+ .deviceNotifyDotSub:hover {
768
background-color:#44F;
769
}
770
771
.deviceNotifySmallDot {
768
- text-align:center;
772
position:absolute;
773
right:10px;
774
top:0px;
772
- width:10px;
775
height:10px;
776
+}
777
+
778
+.deviceNotifySmallDotSub {
779
+ text-align:center;
780
color:#FFF;
781
+ width:10px;
782
padding:2px;
783
background-color:#00F;
784
border-radius:10px;
785
box-shadow: 2px 2px 10px black;
786
cursor:pointer;
787
+ margin-left:2px;
788
}
789
782
- .deviceNotifySmallDot:hover {
790
+ .deviceNotifySmallDotSub:hover {
791
background-color:#44F;
792
}
793
@@ -828,10 +836,14 @@ NoMeshesPanel img {
836
.deviceBatterySmall11 { background: url(../images/batteries24.png) -140px 0px; }
837
838
.deviceNotifyLargeDot {
831
- text-align:center;
839
position:absolute;
840
right:10px;
841
top:140px;
842
+ height:40px;
843
+}
844
+
845
+.deviceNotifyLargeDotSub {
846
+ text-align:center;
847
width:40px;
848
height:40px;
849
color:#FFF;
@@ -840,9 +852,10 @@ NoMeshesPanel img {
852
border-radius:20px;
853
box-shadow: 2px 2px 10px black;
854
cursor:pointer;
855
+ margin-left:4px;
856
}
857
845
- .deviceNotifyLargeDot:hover {
858
+ .deviceNotifyLargeDotSub:hover {
859
background-color:#44F;
860
}
861
translate/translate.json
+7
-1
@@ -26719,6 +26719,12 @@
26719
"default.handlebars->container->column_l->p12->termTable->1->1->6->1->1->terminalSettingsButtons"
26720
]
26721
},
26722
+ {
26723
+ "en": "Toggle Star",
26724
+ "xloc": [
26725
+ "default.handlebars->contextMenu->cxstar"
26726
+ ]
26727
+ },
26728
{
26729
"cs": "Přepnout režim zobrazení",
26730
"de": "Ansichtsmodus umschalten",
@@ -31769,4 +31775,4 @@
31775
]
31776
}
31777
]
31772
-}
31778
+}
\ No newline at end of file
views/default-mobile.handlebars
+69
-9
@@ -214,29 +214,60 @@
214
}
215
216
.deviceNotifyDot {
217
- text-align:center;
217
position:absolute;
218
right:10px;
219
top:0px;
221
- width:16px;
220
height:16px;
221
+ }
222
+
223
+ .deviceNotifyDotSub {
224
+ text-align:center;
225
color:#FFF;
226
+ width:16px;
227
background-color:#00F;
228
padding:2px;
229
border-radius:10px;
230
box-shadow: 2px 2px 10px black;
231
cursor:pointer;
232
+ margin-left:3px;
233
}
234
231
- .deviceNotifyDot:hover {
235
+ .deviceNotifyDotSub:hover {
236
background-color:#44F;
237
}
238
235
- .deviceNotifyLargeDot {
239
+ .deviceNotifySmallDot {
240
+ position:absolute;
241
+ right:10px;
242
+ top:0px;
243
+ height:10px;
244
+ }
245
+
246
+ .deviceNotifySmallDotSub {
247
text-align:center;
248
+ color:#FFF;
249
+ width:10px;
250
+ padding:2px;
251
+ background-color:#00F;
252
+ border-radius:10px;
253
+ box-shadow: 2px 2px 10px black;
254
+ cursor:pointer;
255
+ margin-left:2px;
256
+ }
257
+
258
+ .deviceNotifySmallDotSub:hover {
259
+ background-color:#44F;
260
+ }
261
+
262
+ .deviceNotifyLargeDot {
263
position:absolute;
264
right:10px;
265
top:10px;
266
+ height:40px;
267
+ }
268
+
269
+ .deviceNotifyLargeDotSub {
270
+ text-align:center;
271
width:40px;
272
height:40px;
273
color:#FFF;
@@ -245,9 +276,10 @@
276
border-radius:20px;
277
box-shadow: 2px 2px 10px black;
278
cursor:pointer;
279
+ margin-left:4px;
280
}
281
250
- .deviceNotifyLargeDot:hover {
282
+ .deviceNotifyLargeDotSub:hover {
283
background-color:#44F;
284
}
285
@@ -485,7 +517,10 @@
517
</tr>
518
</table>
519
<div id=p10general style="overflow-y:scroll;position:absolute;top:55px;bottom:0px;width:100%">
488
- <img id="p10deviceNotify" onclick=showDeviceSessions() class=deviceNotifyLargeDot src=images/icon-relay-notify-40.png width=40 height=40>
520
+ <div class="deviceNotifyLargeDot">
521
+ <img id="p10deviceStar" class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>
522
+ <img id="p10deviceNotify" onclick=showDeviceSessions() class=deviceNotifyLargeDotSub src=images/icon-relay-notify-40.png width=40 height=40>
523
+ </div>
524
<div id="p10deviceBattery" class="deviceBatteryLarge deviceBatteryLarge1"></div>
525
<div id=p10html style="margin-left:8px;margin-right:8px"></div>
526
<div id=p10html2></div>
@@ -752,6 +787,7 @@
787
var meshserver = null;
788
var xdr = null;
789
var usergroups = null;
790
+ var stars = {}; // Devices that have been "stared" by the user.
791
var serverinfo = null;
792
var nodes = [];
793
var meshes = {};
@@ -792,6 +828,9 @@
828
meshserver.onMessage = onMessage;
829
meshserver.Start();
830
831
+ // Setup stared devices
832
+ try { stars = JSON.parse(getstore('stars', '{}')); } catch (ex) { }
833
+
834
// Load desktop settings
835
var t = localStorage.getItem('desktopsettings');
836
if (t != null) { desktopsettings = JSON.parse(t); }
@@ -1070,11 +1109,17 @@
1109
var webstate = JSON.parse(message.event.state);
1110
for (var i in webstate) { localStorage.setItem(i, webstate[i]); }
1111
1112
+ // Update stars
1113
+ if (webstate.stars != null) { stars = JSON.parse(webstate.stars); }
1114
+
1115
// Update the web page
1116
if ((webstate.loctag != null) && (webstate.loctag != oldLoctag)) {
1117
if (webstate.loctag != null) { args.locale = webstate.loctag; } else { delete args.locale; }
1118
updateDevices();
1119
updateMeshes();
1120
+ } else if (webstate.stars != null) {
1121
+ updateDevices();
1122
+ if (Q('SearchInput').value == '*') { onSearchInputChanged(); }
1123
}
1124
}
1125
break;
@@ -1953,6 +1998,9 @@
1998
nodes[d].v = false;
1999
if (nodes[d].users && nodes[d].users.length > 0) { for (var i in nodes[d].users) { if (nodes[d].users[i].toLowerCase().indexOf(userSearch) >= 0) { nodes[d].v = true; } } }
2000
}
2001
+ } else if (x == '*') {
2002
+ // Star filter
2003
+ for (var d in nodes) { nodes[d].v = (stars[nodes[d]._id] == 1); }
2004
} else {
2005
// Device name search
2006
try {
@@ -2109,11 +2157,19 @@
2157
if (showRealNames == true && nodes[i].rname != null) name = EscapeHtml(nodes[i].rname);
2158
if (name.length == 0) { name = '<i>' + "None" + '</i>'; }
2159
2112
- // Setup device notification
2113
- var devNotify = '';
2160
+ // Add device notification icons
2161
+ var devNotify = '', devNotifySub = '';
2162
+
2163
+ // This device is "starred"
2164
+ if (stars[nodes[i]._id] == 1) {
2165
+ devNotifySub += '<img class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>';
2166
+ }
2167
+
2168
+ // This device has session information
2169
if (nodes[i].sessions != null) {
2170
+ // Sessions are active
2171
if ((nodes[i].sessions.kvm != null) || (nodes[i].sessions.terminal != null) || (nodes[i].sessions.files != null) || (nodes[i].sessions.tcp != null) || (nodes[i].sessions.udp != null)) {
2116
- devNotify = '<img class=deviceNotifyDot src=images/icon-relay-notify.png width=16 height=16>';
2172
+ devNotifySub += '<img class=deviceNotifyDotSub src=images/icon-relay-notify.png width=16 height=16>';
2173
}
2174
2175
// Battery state
@@ -2137,6 +2193,9 @@
2193
}
2194
}
2195
2196
+ // Add any device icons
2197
+ if (devNotifySub != '') { devNotify += '<div class=deviceNotifyDot>' + devNotifySub + '</div>'; }
2198
+
2199
// Node
2200
var icon = nodes[i].icon, nodestate = NodeStateStr(nodes[i]);
2201
if ((!nodes[i].conn) || (nodes[i].conn == 0)) { icon += ' gray'; }
@@ -2310,6 +2369,7 @@
2369
2370
// Setup session notification
2371
QV('p10deviceNotify', (currentNode.sessions != null) && ((node.sessions.kvm != null) || (node.sessions.terminal != null) || (node.sessions.files != null) || (node.sessions.tcp != null) || (node.sessions.udp != null)));
2372
+ QV('p10deviceStar', stars[currentNode._id] == 1);
2373
2374
// Device Battery
2375
QV('p10deviceBattery', false);
views/default.handlebars
+58
-9
@@ -48,6 +48,7 @@
48
<div id="cxconsole" class="cmtext" onclick="cmaction(7,event)">Console</div>
49
<div id="cxplugins" class="cmtext" onclick="cmaction(8,event)" style="display:none">Plugins</div>
50
<hr id="cxmgroupsplit" />
51
+ <div id="cxstar" class="cmtext" onclick="cmaction(10,event)" style="display:none">Toggle Star</div>
52
<div id="cxmdesktop" class="cmtext" onclick="cmaction(9,event)" style="display:none">Multi-Desktop</div>
53
</div>
54
<div id="meshContextMenu" class="contextMenu noselect" style="display:none;min-width:0px">
@@ -494,7 +495,10 @@
495
</td>
496
<td style=width:20px></td>
497
<td style=width:200px;vertical-align:top;position:relative valign=top>
497
- <img id="p10deviceNotify" onclick=showDeviceSessions(null,null,event) class=deviceNotifyLargeDot src=images/icon-relay-notify-40.png width=40 height=40>
498
+ <div class="deviceNotifyLargeDot">
499
+ <img id="p10deviceStar" class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>
500
+ <img id="p10deviceNotify" onclick=showDeviceSessions(null,null,event) class=deviceNotifyLargeDotSub src=images/icon-relay-notify-40.png width=40 height=40>
501
+ </div>
502
<div id="p10deviceBattery" class="deviceBatteryLarge deviceBatteryLarge1"></div>
503
<a href=# onclick=p10showiconselector()><img id=MainComputerImage></a>
504
<div id=MainComputerState></div>
@@ -1217,6 +1221,7 @@
1221
var events = [];
1222
var users = null;
1223
var wssessions = null;
1224
+ var stars = {}; // Devices that have been "stared" by the user.
1225
var nodeShortIdent = 0;
1226
var desktop;
1227
var desktopsettings = { encoding: 2, showfocus: false, showmouse: true, showcad: true, quality: 40, scaling: 1024, framerate: 50, localkeymap: false };
@@ -1309,6 +1314,9 @@
1314
if (nightMode) { QC('body').add('night'); QS('body')['background-color'] = '#000'; }
1315
toggleFullScreen();
1316
1317
+ // Setup stared devices
1318
+ try { stars = JSON.parse(getstore('stars', '{}')); } catch (ex) {}
1319
+
1320
// Setup page visuals
1321
var hide = 0;
1322
var globalHide = parseInt('{{{hide}}}');
@@ -2039,6 +2047,9 @@
2047
}
2048
}
2049
2050
+ // Remove any stars for nodes that don't exist
2051
+ for (var i in stars) { if (getNodeFromId(i) == null) { delete stars[i]; } }
2052
+
2053
// If we are currently looking at a node this is now gone, change the view.
2054
if ((currentNode != null) && (IsNodeViewable(currentNode) == false)) { currentNode = null; go(1); }
2055
@@ -2461,6 +2472,8 @@
2472
// New user web state, update the web page as needed
2473
try {
2474
if (localStorage != null) {
2475
+ // TODO: The problem with this "old" values is that if changed from a different tab, the old and new values will be the same.
2476
+ // So comparing against these values is not a good idea.
2477
var oldShowRealNames = localStorage.getItem('showRealNames');
2478
var oldUiMode = localStorage.getItem('uiMode');
2479
var oldSort = localStorage.getItem('sort');
@@ -2479,6 +2492,7 @@
2492
if ((webstate.loctag != null) && (webstate.loctag != oldLoctag)) { if (webstate.loctag != null) { args.locale = webstate.loctag; } else { delete args.locale; } mainUpdate(0xFFFFFFFF); }
2493
if ((webstate.nightMode != null) && (webstate.nightMode != oldNightMode)) { nightMode = (webstate.nightMode == '1'); if (nightMode) { QC('body').add('night'); QS('body')['background-color'] = '#000'; } else { QC('body').remove('night'); QS('body')['background-color'] = '#d3d9d6'; } }
2494
if ((webstate.footerBar != null) && (webstate.footerBar != oldFooterBar)) { footerBar = (webstate.footerBar == '1'); QS('container')['grid-template-rows'] = null; QS('container')['-ms-grid-rows'] = null; adjustPanels(); }
2495
+ if ((webstate.stars != null) && (webstate.stars != JSON.stringify(stars))) { stars = JSON.parse(webstate.stars); if (Q('SearchInput').value == '*') { mainUpdate(5); } else { mainUpdate(4); } }
2496
}
2497
} catch (ex) {}
2498
break;
@@ -3337,15 +3351,26 @@
3351
if (showRealNames == true && node.rname != null) name = EscapeHtml(node.rname);
3352
if (name.length == 0) { name = '<i>' + "None" + '</i>'; }
3353
3340
- // Setup device notification
3341
- var devNotify = '';
3354
+ // Add device notification icons
3355
+ var devNotify = '', devNotifySub = '';
3356
+
3357
+ // This device is "starred"
3358
+ if (stars[node._id] == 1) {
3359
+ if (view == 2) {
3360
+ devNotifySub += '<img class=deviceNotifySmallDotSub src=images/icon-star-notify-10.png width=10 height=10>';
3361
+ } else {
3362
+ devNotifySub += '<img class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>';
3363
+ }
3364
+ }
3365
+
3366
+ // This device has session information
3367
if (node.sessions != null) {
3368
// Sessions are active
3369
if ((node.sessions.kvm != null) || (node.sessions.terminal != null) || (node.sessions.files != null) || (node.sessions.tcp != null) || (node.sessions.udp != null)) {
3370
if (view == 2) {
3346
- devNotify = '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifySmallDot src=images/icon-relay-notify10.png width=10 height=10>';
3371
+ devNotifySub += '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifySmallDotSub src=images/icon-relay-notify10.png width=10 height=10>';
3372
} else {
3348
- devNotify = '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifyDot src=images/icon-relay-notify.png width=16 height=16>';
3373
+ devNotifySub += '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifyDotSub src=images/icon-relay-notify.png width=16 height=16>';
3374
}
3375
}
3376
@@ -3370,6 +3395,15 @@
3395
}
3396
}
3397
3398
+ // Add any device icons
3399
+ if (devNotifySub != '') {
3400
+ if (view == 2) {
3401
+ devNotify += '<div class=deviceNotifySmallDot>' + devNotifySub + '</div>';
3402
+ } else {
3403
+ devNotify += '<div class=deviceNotifyDot>' + devNotifySub + '</div>';
3404
+ }
3405
+ }
3406
+
3407
// Node
3408
var icon = node.icon;
3409
if ((!node.conn) || (node.conn == 0)) { icon += ' gray'; }
@@ -4205,12 +4239,10 @@
4239
if (checkcount > 0) {
4240
QE('GroupActionButton', true);
4241
Q('SelectAllButton').value = "Select None";
4208
- QV('cxmgroupsplit', true);
4242
QV('cxmdesktop', true);
4243
} else {
4244
QE('GroupActionButton', false);
4245
Q('SelectAllButton').value = "Select All";
4213
- QV('cxmgroupsplit', false);
4246
QV('cxmdesktop', false);
4247
}
4248
@@ -4390,12 +4422,15 @@
4422
for (var d in nodes) {
4423
nodes[d].v = (((nodes[d].agent != null) && (nodes[d].agent.tag == null)) && (agentTagSearch == '')) || ((nodes[d].agent != null) && (nodes[d].agent.tag != null) && (nodes[d].agent.tag.toLowerCase().indexOf(agentTagSearch) >= 0));
4424
}
4393
- } else if (userSearch != null) {
4425
+ } else if (userSearch != null) {
4426
// User search
4427
for (var d in nodes) {
4428
nodes[d].v = false;
4429
if (nodes[d].users && nodes[d].users.length > 0) { for (var i in nodes[d].users) { if (nodes[d].users[i].toLowerCase().indexOf(userSearch) >= 0) { nodes[d].v = true; } } }
4430
}
4431
+ } else if (x == '*') {
4432
+ // Star filter
4433
+ for (var d in nodes) { nodes[d].v = (stars[nodes[d]._id] == 1); }
4434
} else {
4435
// Device name search
4436
try {
@@ -4473,6 +4508,8 @@
4508
QV('cxfiles', ((mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 4) != 0))) && (rights & 8) && fileAccess);
4509
QV('cxevents', (node.intelamt != null) && ((node.intelamt.state == 2) || (node.conn & 2)) && (rights & 8));
4510
QV('cxconsole', (consoleRights && (mesh.mtype == 2) && ((node.agent == null) || (node.agent.caps == null) || ((node.agent.caps & 8) != 0))) && (rights & 8));
4511
+ QV('cxmgroupsplit', true);
4512
+ QV('cxstar', true);
4513
break;
4514
}
4515
default: {
@@ -4518,6 +4555,17 @@
4555
}
4556
}
4557
}
4558
+ if (action == 10) {
4559
+ // Toggle star
4560
+ var elements = document.getElementsByClassName('DeviceCheckbox'), selectedDevices = [];
4561
+ for (var i = 0; i < elements.length; i++) { if (elements[i].checked === true) { selectedDevices.push(elements[i].defaultValue.substring(6)); } }
4562
+ if (selectedDevices.length == 0) { selectedDevices.push(nodeid); }
4563
+ for (var i in selectedDevices) { if (stars[selectedDevices[i]] != null) { delete stars[selectedDevices[i]]; delete selectedDevices[i]; } }
4564
+ var starcount = Object.keys(stars).length;
4565
+ for (var i in selectedDevices) { if ((starcount < 20) && (stars[selectedDevices[i]] == null)) { stars[selectedDevices[i]] = 1; starcount++; } }
4566
+ putstore('stars', JSON.stringify(stars));
4567
+ if (Q('SearchInput').value == '*') { mainUpdate(5); } else { mainUpdate(4); }
4568
+ }
4569
}
4570
4571
function cmmeshaction(action) {
@@ -5269,6 +5317,7 @@
5317
5318
// Device Notification
5319
QV('p10deviceNotify', (currentNode.sessions != null) && ((currentNode.sessions.kvm != null) || (currentNode.sessions.terminal != null) || (currentNode.sessions.files != null) || (currentNode.sessions.tcp != null) || (currentNode.sessions.udp != null)));
5320
+ QV('p10deviceStar', stars[currentNode._id] == 1);
5321
5322
// Device Battery
5323
QV('p10deviceBattery', false);
@@ -13041,7 +13090,7 @@
13090
var k = localStorage.key(i);
13091
if (k[0] != '_') {
13092
s[k] = localStorage.getItem(k);
13044
- if ((k != 'desktopsettings') && (typeof s[k] == 'string') && (s[k].length > 64)) { delete s[k]; }
13093
+ if ((k != 'desktopsettings') && (k != 'stars') && (typeof s[k] == 'string') && (s[k].length > 64)) { delete s[k]; }
13094
}
13095
}
13096
} catch (ex) {}
webserver.js
+2
-1
@@ -5704,8 +5704,9 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
5704
var out = {};
5705
for (var i in acceptableUserWebStateStrings) {
5706
var n = acceptableUserWebStateStrings[i];
5707
- if ((state[n] != null) && ((typeof state[n] == 'number') || (typeof state[n] == 'boolean') || ((typeof state[n] == 'string') && (state[n].length < 32)))) { out[n] = state[n]; }
5707
+ if ((state[n] != null) && ((typeof state[n] == 'number') || (typeof state[n] == 'boolean') || ((typeof state[n] == 'string') && (state[n].length < 64)))) { out[n] = state[n]; }
5708
}
5709
+ if ((typeof state.stars == 'string') && (state.stars.length < 2048)) { out.stars = state.stars; }
5710
if (typeof state.desktopsettings == 'string') { try { state.desktopsettings = JSON.parse(state.desktopsettings); } catch (ex) { delete state.desktopsettings; } }
5711
if (state.desktopsettings != null) {
5712
out.desktopsettings = {};