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 = {};