Added server maintenance mode.

Ylian Saint-Hilaire committed Nov 20, 2020 at 16:43 UTC 9af599e4df2f90cd7ddf5604207dfaadab5d724b
9 files changed +154 -83
meshcentral-config-schema.json
+1
@@ -14,6 +14,7 @@
14 "mongoDumpPath": { "type": "string" },
15 "WANonly": { "type": "boolean", "default": false, "description": "When enabled, only MeshCentral WAN features are enabled and agents will connect to the server using a well known DNS name." },
16 "LANonly": { "type": "boolean", "default": false, "description": "When enabled, only MeshCentral LAN features are enabled and agents will find the server using multicast LAN packets." },
17 + "maintenanceMode": { "type": "boolean", "default": false, "description": "When enabled the server is in maintenance mode, only administrators can login. Use the maintenance command in server console to change." },
18 "sessionTime": { "type": "integer" },
19 "sessionKey": { "type": "string" },
20 "sessionSameSite": { "type": "string" },
meshuser.js
+9
@@ -1109,6 +1109,15 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1109 r = "Checking server update...";
1110 break;
1111 }
1112 + case 'maintenance': {
1113 + var arg = null, changed = false;
1114 + if ((cmdargs['_'] != null) && (cmdargs['_'][0] != null)) { arg = cmdargs['_'][0].toLowerCase(); }
1115 + if (arg == 'enabled') { parent.parent.config.settings.maintenancemode = 1; changed = true; }
1116 + else if (arg == 'disabled') { delete parent.parent.config.settings.maintenancemode; changed = true; }
1117 + r = 'Maintenance mode: ' + ((parent.parent.config.settings.maintenancemode == null) ? 'Disabled' : 'Enabled');
1118 + if (changed == false) { r += '\r\nTo change type: maintenance [enabled|disabled]'; }
1119 + break;
1120 + }
1121 case 'info': {
1122 var info = process.memoryUsage();
1123 info.dbType = ['None', 'NeDB', 'MongoJS', 'MongoDB'][parent.db.databaseType];
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];if(!(n=n||s.getElementsByTagName("a:Body")[0]))return null;if(0<n.childNodes.length){var l=(e=n.childNodes[0].localName).indexOf("_OUTPUT");-1!=l&&l==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])}return r}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];if(!(n=n||s.getElementsByTagName("a:Body")[0]))return null;if(0<n.childNodes.length){var l=(e=n.childNodes[0].localName).indexOf("_OUTPUT");-1!=l&&l==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])}return r}catch(e){return console.log("Unable to parse XML: "+s),null}},p}
\ No newline at end of file
translate/translate.json
+99 -78
@@ -12998,8 +12998,8 @@
12998 "zh-chs": "电邮“ {0} ”已在其他帐户上使用。更改电邮地址,然后重试。",
12999 "zh-cht": "電郵“ {0} ”已在其他帳戶上使用。更改電郵地址,然後重試。",
13000 "xloc": [
13001 - "message.handlebars->3->7",
13002 - "message2.handlebars->5->7"
13001 + "message.handlebars->3->8",
13002 + "message2.handlebars->5->8"
13003 ]
13004 },
13005 {
@@ -13019,8 +13019,8 @@
13019 "zh-chs": "用户“ {1} ”的电邮“ {0} ”已通过验证。",
13020 "zh-cht": "用戶“ {1} ”的電郵“ {0} ”已通過驗證。",
13021 "xloc": [
13022 - "message.handlebars->3->6",
13023 - "message2.handlebars->5->6"
13022 + "message.handlebars->3->7",
13023 + "message2.handlebars->5->7"
13024 ]
13025 },
13026 {
@@ -13040,8 +13040,8 @@
13040 "zh-chs": "未验证用户“ {1} ”的电邮“ {0} ”。",
13041 "zh-cht": "未驗證用戶“ {1} ”的電郵“ {0} ”。",
13042 "xloc": [
13043 - "message.handlebars->3->9",
13044 - "message2.handlebars->5->9"
13043 + "message.handlebars->3->10",
13044 + "message2.handlebars->5->10"
13045 ]
13046 },
13047 {
@@ -13098,8 +13098,8 @@
13098 "zh-chs": "错误:无效的帐户检查,验证网址仅在30分钟内有效。",
13099 "zh-cht": "錯誤:無效的帳戶檢查,驗證網址僅在30分鐘內有效。",
13100 "xloc": [
13101 - "message.handlebars->3->13",
13102 - "message2.handlebars->5->13"
13101 + "message.handlebars->3->14",
13102 + "message2.handlebars->5->14"
13103 ]
13104 },
13105 {
@@ -13119,8 +13119,8 @@
13119 "zh-chs": "错误:无效的帐户检查。",
13120 "zh-cht": "錯誤:無效的帳戶檢查。",
13121 "xloc": [
13122 - "message.handlebars->3->12",
13123 - "message2.handlebars->5->12"
13122 + "message.handlebars->3->13",
13123 + "message2.handlebars->5->13"
13124 ]
13125 },
13126 {
@@ -13140,8 +13140,8 @@
13140 "zh-chs": "错误:无效的域。",
13141 "zh-cht": "錯誤:無效的域。",
13142 "xloc": [
13143 - "message.handlebars->3->3",
13144 - "message2.handlebars->5->3"
13143 + "message.handlebars->3->4",
13144 + "message2.handlebars->5->4"
13145 ]
13146 },
13147 {
@@ -13161,8 +13161,8 @@
13161 "zh-chs": "错误:用户“ {1} ”的电邮“ {0} ”无效。",
13162 "zh-cht": "錯誤:用戶“ {1} ”的電郵“ {0} ”無效。",
13163 "xloc": [
13164 - "message.handlebars->3->5",
13165 - "message2.handlebars->5->5"
13164 + "message.handlebars->3->6",
13165 + "message2.handlebars->5->6"
13166 ]
13167 },
13168 {
@@ -13182,8 +13182,8 @@
13182 "zh-chs": "错误:无效的用户名“ {0} ”。",
13183 "zh-cht": "錯誤:無效的用戶名“ {0} ”。",
13184 "xloc": [
13185 - "message.handlebars->3->4",
13186 - "message2.handlebars->5->4"
13185 + "message.handlebars->3->5",
13186 + "message2.handlebars->5->5"
13187 ]
13188 },
13189 {
@@ -13680,11 +13680,11 @@
13680 "default.handlebars->29->320",
13681 "login-mobile.handlebars->5->42",
13682 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->tokenpanel->1->7->1->4->1->3",
13683 - "login.handlebars->5->43",
13683 + "login.handlebars->5->44",
13684 "login.handlebars->container->column_l->centralTable->1->0->logincell->resettokenpanel->1->5->1->2->1->3",
13685 "login.handlebars->container->column_l->centralTable->1->0->logincell->tokenpanel->1->7->1->4->1->3",
13686 - "login2.handlebars->7->22",
13687 - "login2.handlebars->7->44",
13686 + "login2.handlebars->7->23",
13687 + "login2.handlebars->7->45",
13688 "login2.handlebars->centralTable->1->0->logincell->resetpanel->1->7->1->0->1",
13689 "login2.handlebars->centralTable->1->0->logincell->resetpanel->1->7->1->0->1",
13690 "login2.handlebars->centralTable->1->0->logincell->resettokenpanel->1->5->1->2farow2->1->3",
@@ -13751,8 +13751,8 @@
13751 "zh-cht": "電郵確認",
13752 "xloc": [
13753 "login-mobile.handlebars->5->43",
13754 - "login.handlebars->5->44",
13755 - "login2.handlebars->7->45"
13754 + "login.handlebars->5->45",
13755 + "login2.handlebars->7->46"
13756 ]
13757 },
13758 {
@@ -13986,7 +13986,7 @@
13986 "login-mobile.handlebars->5->21",
13987 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->createpanel->1->1->9->1->2->1",
13988 "login-mobile.handlebars->container->page_content->column_l->1->1->0->1->resetpanel->1->7->1->0->1",
13989 - "login.handlebars->5->21",
13989 + "login.handlebars->5->22",
13990 "login.handlebars->container->column_l->centralTable->1->0->logincell->createpanel->1->9->1->2->nuEmail",
13991 "login.handlebars->container->column_l->centralTable->1->0->logincell->resetpanel->1->7->1->0->1",
13992 "login2.handlebars->centralTable->1->0->logincell->createpanel->1->9->1->2->nuEmail"
@@ -15639,8 +15639,8 @@
15639 "zh-cht": "忘記了密碼?",
15640 "xloc": [
15641 "login-mobile.handlebars->5->22",
15642 - "login.handlebars->5->22",
15643 - "login2.handlebars->7->23"
15642 + "login.handlebars->5->23",
15643 + "login2.handlebars->7->24"
15644 ]
15645 },
15646 {
@@ -16506,8 +16506,8 @@
16506 "zh-chs": "进入登录页面",
16507 "zh-cht": "進入登入頁面",
16508 "xloc": [
16509 - "message.handlebars->3->16",
16510 - "message2.handlebars->5->16"
16509 + "message.handlebars->3->18",
16510 + "message2.handlebars->5->18"
16511 ]
16512 },
16513 {
@@ -16570,10 +16570,10 @@
16570 "xloc": [
16571 "login-mobile.handlebars->5->29",
16572 "login-mobile.handlebars->5->33",
16573 - "login.handlebars->5->29",
16574 - "login.handlebars->5->33",
16575 - "login2.handlebars->7->30",
16576 - "login2.handlebars->7->34"
16573 + "login.handlebars->5->30",
16574 + "login.handlebars->5->34",
16575 + "login2.handlebars->7->31",
16576 + "login2.handlebars->7->35"
16577 ]
16578 },
16579 {
@@ -17777,6 +17777,13 @@
17777 "login2.handlebars->7->2"
17778 ]
17779 },
17780 + {
17781 + "en": "If you are an administrator, [login here].",
17782 + "xloc": [
17783 + "message.handlebars->3->17",
17784 + "message2.handlebars->5->17"
17785 + ]
17786 + },
17787 {
17788 "cs": "Pokud jste tento požadavek nezačali, ignorujte tento e-mail.",
17789 "de": "Wenn Sie diese Anfrage nicht initiiert haben, ignorieren Sie diese Mail bitte.",
@@ -21591,8 +21598,8 @@
21598 "zh-chs": "登录并转到“我的帐户”选项卡以更新密码。",
21599 "zh-cht": "登入並進入“我的帳戶”標籤以更新密碼。",
21600 "xloc": [
21594 - "message.handlebars->3->11",
21595 - "message2.handlebars->5->11"
21601 + "message.handlebars->3->12",
21602 + "message2.handlebars->5->12"
21603 ]
21604 },
21605 {
@@ -22590,8 +22597,8 @@
22597 "zh-cht": "最大長度為{0}",
22598 "xloc": [
22599 "login-mobile.handlebars->5->37",
22593 - "login.handlebars->5->37",
22594 - "login2.handlebars->7->38"
22600 + "login.handlebars->5->38",
22601 + "login2.handlebars->7->39"
22602 ]
22603 },
22604 {
@@ -23379,8 +23386,8 @@
23386 "zh-cht": "最小長度為{0}",
23387 "xloc": [
23388 "login-mobile.handlebars->5->36",
23382 - "login.handlebars->5->36",
23383 - "login2.handlebars->7->37"
23389 + "login.handlebars->5->37",
23390 + "login2.handlebars->7->38"
23391 ]
23392 },
23393 {
@@ -26617,8 +26624,8 @@
26624 "zh-cht": "密碼提示",
26625 "xloc": [
26626 "login-mobile.handlebars->5->27",
26620 - "login.handlebars->5->27",
26621 - "login2.handlebars->7->28",
26627 + "login.handlebars->5->28",
26628 + "login2.handlebars->7->29",
26629 "login2.handlebars->centralTable->1->0->logincell->loginpanel->1->5->1->4->1"
26630 ]
26631 },
@@ -26665,12 +26672,12 @@
26672 "xloc": [
26673 "login-mobile.handlebars->5->31",
26674 "login-mobile.handlebars->5->35",
26668 - "login.handlebars->5->31",
26669 - "login.handlebars->5->35",
26670 - "login.handlebars->5->42",
26671 - "login2.handlebars->7->32",
26672 - "login2.handlebars->7->36",
26673 - "login2.handlebars->7->43"
26675 + "login.handlebars->5->32",
26676 + "login.handlebars->5->36",
26677 + "login.handlebars->5->43",
26678 + "login2.handlebars->7->33",
26679 + "login2.handlebars->7->37",
26680 + "login2.handlebars->7->44"
26681 ]
26682 },
26683 {
@@ -26712,8 +26719,8 @@
26719 "zh-chs": "帐户{0}的密码已重置为:",
26720 "zh-cht": "帳戶{0}的密碼已重置為:",
26721 "xloc": [
26715 - "message.handlebars->3->10",
26716 - "message2.handlebars->5->10"
26722 + "message.handlebars->3->11",
26723 + "message2.handlebars->5->11"
26724 ]
26725 },
26726 {
@@ -28842,8 +28849,8 @@
28849 "zh-cht": "記住此裝置{0}天。",
28850 "xloc": [
28851 "login-mobile.handlebars->5->20",
28845 - "login.handlebars->5->20",
28846 - "login2.handlebars->7->21"
28852 + "login.handlebars->5->21",
28853 + "login2.handlebars->7->22"
28854 ]
28855 },
28856 {
@@ -31249,10 +31256,10 @@
31256 "xloc": [
31257 "login-mobile.handlebars->5->23",
31258 "login-mobile.handlebars->5->25",
31252 - "login.handlebars->5->23",
31253 - "login.handlebars->5->25",
31254 - "login2.handlebars->7->24",
31255 - "login2.handlebars->7->26"
31259 + "login.handlebars->5->24",
31260 + "login.handlebars->5->26",
31261 + "login2.handlebars->7->25",
31262 + "login2.handlebars->7->27"
31263 ]
31264 },
31265 {
@@ -31890,8 +31897,8 @@
31897 "zh-chs": "将保安编码发送到注册的电邮地址?",
31898 "zh-cht": "將保安編碼發送到註冊的電郵地址?",
31899 "xloc": [
31893 - "login.handlebars->5->24",
31894 - "login2.handlebars->7->25"
31900 + "login.handlebars->5->25",
31901 + "login2.handlebars->7->26"
31902 ]
31903 },
31904 {
@@ -31911,8 +31918,8 @@
31918 "zh-chs": "将保安编码发送到注册电话号码?",
31919 "zh-cht": "將保安編碼發送到註冊電話號碼?",
31920 "xloc": [
31914 - "login.handlebars->5->26",
31915 - "login2.handlebars->7->27"
31921 + "login.handlebars->5->27",
31922 + "login2.handlebars->7->28"
31923 ]
31924 },
31925 {
@@ -32203,6 +32210,13 @@
32210 "default.handlebars->29->2126"
32211 ]
32212 },
32213 + {
32214 + "en": "Server Under Maintenance",
32215 + "xloc": [
32216 + "message.handlebars->3->3",
32217 + "message2.handlebars->5->3"
32218 + ]
32219 + },
32220 {
32221 "cs": "Aktualizace serveru",
32222 "de": "Server-Aktualisierungen",
@@ -32346,6 +32360,13 @@
32360 "default.handlebars->container->column_l->p13->p13toolbar->1->0->1->1"
32361 ]
32362 },
32363 + {
32364 + "en": "Server under maintenance.",
32365 + "xloc": [
32366 + "login.handlebars->5->20",
32367 + "login2.handlebars->7->21"
32368 + ]
32369 + },
32370 {
32371 "cs": "ServerStats.csv",
32372 "de": "ServerStats.csv",
@@ -32788,8 +32809,8 @@
32809 "nl": "link voor delen is verlopen.",
32810 "fr": "Le lien de partage a expiré.",
32811 "xloc": [
32791 - "message.handlebars->3->15",
32792 - "message2.handlebars->5->15"
32812 + "message.handlebars->3->16",
32813 + "message2.handlebars->5->16"
32814 ]
32815 },
32816 {
@@ -32797,8 +32818,8 @@
32818 "nl": "Link voor delen is niet geldig.",
32819 "fr": "Le lien de partage n'est pas encore valide.",
32820 "xloc": [
32800 - "message.handlebars->3->14",
32801 - "message2.handlebars->5->14"
32821 + "message.handlebars->3->15",
32822 + "message2.handlebars->5->15"
32823 ]
32824 },
32825 {
@@ -34884,10 +34905,10 @@
34905 "xloc": [
34906 "login-mobile.handlebars->5->28",
34907 "login-mobile.handlebars->5->32",
34887 - "login.handlebars->5->28",
34888 - "login.handlebars->5->32",
34889 - "login2.handlebars->7->29",
34890 - "login2.handlebars->7->33"
34908 + "login.handlebars->5->29",
34909 + "login.handlebars->5->33",
34910 + "login2.handlebars->7->30",
34911 + "login2.handlebars->7->34"
34912 ]
34913 },
34914 {
@@ -38852,8 +38873,8 @@
38873 "zh-chs": "用户帐户{1}的已验证电邮{0}。",
38874 "zh-cht": "用戶帳戶{1}的已驗證電郵{0}。",
38875 "xloc": [
38855 - "message.handlebars->3->8",
38856 - "message2.handlebars->5->8"
38876 + "message.handlebars->3->9",
38877 + "message2.handlebars->5->9"
38878 ]
38879 },
38880 {
@@ -39375,10 +39396,10 @@
39396 "xloc": [
39397 "login-mobile.handlebars->5->30",
39398 "login-mobile.handlebars->5->34",
39378 - "login.handlebars->5->30",
39379 - "login.handlebars->5->34",
39380 - "login2.handlebars->7->31",
39381 - "login2.handlebars->7->35"
39399 + "login.handlebars->5->31",
39400 + "login.handlebars->5->35",
39401 + "login2.handlebars->7->32",
39402 + "login2.handlebars->7->36"
39403 ]
39404 },
39405 {
@@ -42452,8 +42473,8 @@
42473 "zh-cht": "{0}小寫",
42474 "xloc": [
42475 "login-mobile.handlebars->5->39",
42455 - "login.handlebars->5->39",
42456 - "login2.handlebars->7->40"
42476 + "login.handlebars->5->40",
42477 + "login2.handlebars->7->41"
42478 ]
42479 },
42480 {
@@ -42554,8 +42575,8 @@
42575 "zh-cht": "{0}非字母數字",
42576 "xloc": [
42577 "login-mobile.handlebars->5->41",
42557 - "login.handlebars->5->41",
42558 - "login2.handlebars->7->42"
42578 + "login.handlebars->5->42",
42579 + "login2.handlebars->7->43"
42580 ]
42581 },
42582 {
@@ -42576,8 +42597,8 @@
42597 "zh-cht": "{0}數字",
42598 "xloc": [
42599 "login-mobile.handlebars->5->40",
42579 - "login.handlebars->5->40",
42580 - "login2.handlebars->7->41"
42600 + "login.handlebars->5->41",
42601 + "login2.handlebars->7->42"
42602 ]
42603 },
42604 {
@@ -42744,8 +42765,8 @@
42765 "zh-cht": "{0}大寫",
42766 "xloc": [
42767 "login-mobile.handlebars->5->38",
42747 - "login.handlebars->5->38",
42748 - "login2.handlebars->7->39"
42768 + "login.handlebars->5->39",
42769 + "login2.handlebars->7->40"
42770 ]
42771 },
42772 {
views/login.handlebars
+1 -1
@@ -328,7 +328,7 @@
328 var i;
329 var messageid = parseInt('{{{messageid}}}');
330 var okmessages = ['', "If valid, reset mail sent.", "Email sent.", "Email verification required, check your mailbox and click the confirmation link.", "SMS sent."];
331 - var failmessages = ["Unable to create account.", "Account limit reached.", "Existing account with this email address.", "Invalid account creation token.", "Username already exists.", "Password rejected, use a different one.", "Invalid email.", "Account not found.", "Invalid token, try again.", "Unable to sent email.", "Account locked.", "Access denied.", "Login failed, check username and password.", "Password change requested.", "IP address blocked, try again later."];
331 + var failmessages = ["Unable to create account.", "Account limit reached.", "Existing account with this email address.", "Invalid account creation token.", "Username already exists.", "Password rejected, use a different one.", "Invalid email.", "Account not found.", "Invalid token, try again.", "Unable to sent email.", "Account locked.", "Access denied.", "Login failed, check username and password.", "Password change requested.", "IP address blocked, try again later.", "Server under maintenance."];
332 if (messageid > 0) {
333 var msg = '';
334 if ((messageid < 100) && (messageid < okmessages.length)) { msg = okmessages[messageid]; }
views/login2.handlebars
+1 -1
@@ -340,7 +340,7 @@
340 var i;
341 var messageid = parseInt('{{{messageid}}}');
342 var okmessages = ['', "If valid, reset mail sent.", "Email sent.", "Email verification required, check your mailbox and click the confirmation link.", "SMS sent."];
343 - var failmessages = ["Unable to create account.", "Account limit reached.", "Existing account with this email address.", "Invalid account creation token.", "Username already exists.", "Password rejected, use a different one.", "Invalid email.", "Account not found.", "Invalid token, try again.", "Unable to sent email.", "Account locked.", "Access denied.", "Login failed, check username and password.", "Password change requested.", "IP address blocked, try again later."];
343 + var failmessages = ["Unable to create account.", "Account limit reached.", "Existing account with this email address.", "Invalid account creation token.", "Username already exists.", "Password rejected, use a different one.", "Invalid email.", "Account not found.", "Invalid token, try again.", "Unable to sent email.", "Account locked.", "Access denied.", "Login failed, check username and password.", "Password change requested.", "IP address blocked, try again later.", "Server under maintenance."];
344 if (messageid > 0) {
345 var msg = '';
346 if ((messageid < 100) && (messageid < okmessages.length)) { msg = okmessages[messageid]; }
views/message.handlebars
+3 -1
@@ -53,6 +53,7 @@
53 var title = '';
54 if (titleid == 1) { title = "Account Verification"; }
55 if (titleid == 2) { title = "Desktop Sharing"; }
56 + if (titleid == 3) { title = "Server Under Maintenance"; }
57 QH('topTitle', Q('topTitle').innerText + ' - ' + title);
58 QH('mainTitle', title);
59
@@ -74,10 +75,11 @@
75 case 10: { msg = "ERROR: Invalid account check, verification url is only valid for 30 minutes."; break; }
76 case 11: { msg = "Sharing link not valid yet."; break; }
77 case 12: { msg = "Sharing link is expired."; break; }
78 + case 13: { msg = "If you are an administrator, [login here].".replace('[', '<a href=login?admin=1>').replace(']', '</a>'); break; }
79 }
80
81 // Add login page link
80 - if ((msgid != 11) && (msgid != 12)) { msg += ' <a href="' + domainurl + (urlargs.key ? ('?key=' + urlargs.key) : '') + '">' + "Go to login page" + '</a>.' }
82 + if ((msgid != 11) && (msgid != 12) && (msgid != 13)) { msg += ' <a href="' + domainurl + (urlargs.key ? ('?key=' + urlargs.key) : '') + '">' + "Go to login page" + '</a>.' }
83 QH('mainMessage', msg);
84
85 function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
views/message2.handlebars
+3 -1
@@ -54,6 +54,7 @@
54 var title = '';
55 if (titleid == 1) { title = "Account Verification"; }
56 if (titleid == 2) { title = "Desktop Sharing"; }
57 + if (titleid == 3) { title = "Server Under Maintenance"; }
58 QH('topTitle', Q('topTitle').innerText + ' - ' + title);
59 QH('mainTitle', title);
60
@@ -75,10 +76,11 @@
76 case 10: { msg = "ERROR: Invalid account check, verification url is only valid for 30 minutes."; break; }
77 case 11: { msg = "Sharing link not valid yet."; break; }
78 case 12: { msg = "Sharing link is expired."; break; }
79 + case 13: { msg = "If you are an administrator, [login here].".replace('[', '<a href=?admin=1>').replace(']', '</a>'); break; }
80 }
81
82 // Add login page link
81 - if ((msgid != 11) && (msgid != 12)) { msg += ' <a href="' + domainurl + (urlargs.key ? ('?key=' + urlargs.key) : '') + '">' + "Go to login page" + '</a>.' }
83 + if ((msgid != 11) && (msgid != 12) && (msgid != 13)) { msg += ' <a href="' + domainurl + (urlargs.key ? ('?key=' + urlargs.key) : '') + '">' + "Go to login page" + '</a>.' }
84 QH('mainMessage', msg);
85
86 function format(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(\d+)}/g, function (match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); };
webserver.js
+36
@@ -895,6 +895,14 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
895 if (userid) {
896 var user = obj.users[userid];
897
898 + // Check if we are in maintenance mode
899 + if ((parent.config.settings.maintenancemode != null) && (user.siteadmin != 4294967295)) {
900 + req.session.messageid = 115; // Server under maintenance
901 + req.session.loginmode = '1';
902 + if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); }
903 + return;
904 + }
905 +
906 var email2fa = (((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.email2factor != false)) && (parent.mailserver != null) && (user.email != null) && (user.emailVerified == true) && (user.otpekey != null));
907 var sms2fa = (((typeof domain.passwordrequirements != 'object') || (domain.passwordrequirements.sms2factor != false)) && (parent.smsserver != null) && (user.phone != null));
908
@@ -1103,6 +1111,14 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
1111 if ((domain.auth == 'sspi') || (domain.auth == 'ldap')) { parent.debug('web', 'handleCreateAccountRequest: failed checks.'); res.sendStatus(404); return; }
1112 if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
1113
1114 + // Check if we are in maintenance mode
1115 + if (parent.config.settings.maintenancemode != null) {
1116 + req.session.messageid = 115; // Server under maintenance
1117 + req.session.loginmode = '1';
1118 + if (direct === true) { handleRootRequestEx(req, res, domain); } else { res.redirect(domain.url + getQueryPortion(req)); }
1119 + return;
1120 + }
1121 +
1122 // Always lowercase the email address
1123 if (req.body.email) { req.body.email = req.body.email.toLowerCase(); }
1124
@@ -1653,6 +1669,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
1669 if (domain == null) { parent.debug('web', 'handleMSTSCRequest: failed checks.'); res.sendStatus(404); return; }
1670 if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
1671
1672 + // Check if we are in maintenance mode
1673 + if ((parent.config.settings.maintenancemode != null) && (req.query.admin !== '1')) {
1674 + render(req, res, getRenderPage((domain.sitestyle == 2) ? 'message2' : 'message', req, domain), getRenderArgs({ titleid: 3, msgid: 13, domainurl: encodeURIComponent(domain.url).replace(/'/g, '%27') }, req, domain));
1675 + return;
1676 + }
1677 +
1678 if (req.query.ws != null) {
1679 // This is a query with a websocket relay cookie, check that the cookie is valid and use it.
1680 var rcookie = parent.decodeCookie(req.query.ws, parent.loginCookieEncryptionKey, 60); // Cookie with 1 hour timeout
@@ -2092,6 +2114,13 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2114 if ((domain.loginkey != null) && (domain.loginkey.indexOf(req.query.key) == -1)) { res.sendStatus(404); return; } // Check 3FA URL key
2115 if (!obj.args) { parent.debug('web', 'handleRootRequest: no obj.args.'); res.sendStatus(500); return; }
2116
2117 + // Check if we are in maintenance mode
2118 + if ((parent.config.settings.maintenancemode != null) && (req.query.admin !== '1')) {
2119 + parent.debug('web', 'handleLoginRequest: Server under maintenance.');
2120 + render(req, res, getRenderPage((domain.sitestyle == 2) ? 'message2' : 'message', req, domain), getRenderArgs({ titleid: 3, msgid: 13, domainurl: encodeURIComponent(domain.url).replace(/'/g, '%27') }, req, domain));
2121 + return;
2122 + }
2123 +
2124 if ((domain.sspi != null) && ((req.query.login == null) || (obj.parent.loginCookieEncryptionKey == null))) {
2125 // Login using SSPI
2126 domain.sspi.authenticate(req, res, function (err) {
@@ -2463,6 +2492,7 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2492 // Check if we are allowed to create new users using the login screen
2493 var newAccountsAllowed = true;
2494 if ((domain.newaccounts !== 1) && (domain.newaccounts !== true)) { for (var i in obj.users) { if (obj.users[i].domain == domain.id) { newAccountsAllowed = false; break; } } }
2495 + if (parent.config.settings.maintenancemode != null) { newAccountsAllowed = false; }
2496
2497 // Encrypt the hardware key challenge state if needed
2498 var hwstate = null;
@@ -2640,6 +2670,12 @@ module.exports.CreateWebServer = function (parent, db, args, certificates) {
2670 if (domain == null) { parent.debug('web', 'handleMessengerRequest: no domain'); res.sendStatus(404); return; }
2671 parent.debug('web', 'handleMessengerRequest()');
2672
2673 + // Check if we are in maintenance mode
2674 + if (parent.config.settings.maintenancemode != null) {
2675 + render(req, res, getRenderPage((domain.sitestyle == 2) ? 'message2' : 'message', req, domain), getRenderArgs({ titleid: 3, msgid: 13, domainurl: encodeURIComponent(domain.url).replace(/'/g, '%27') }, req, domain));
2676 + return;
2677 + }
2678 +
2679 var webRtcConfig = null;
2680 if (obj.parent.config.settings && obj.parent.config.settings.webrtconfig && (typeof obj.parent.config.settings.webrtconfig == 'object')) { webRtcConfig = encodeURIComponent(JSON.stringify(obj.parent.config.settings.webrtconfig)).replace(/'/g, '%27'); }
2681 res.set({ 'Cache-Control': 'no-store' });