From 18d6345968f3816f0fb8bc64c71e33a8bce13fe1 Mon Sep 17 00:00:00 2001 From: b1rdhous3 Date: Wed, 21 Aug 2019 17:46:49 +0200 Subject: [PATCH] WebUi: New Internet API logic, correct switch to last instance after refresh, current instance notification (#608) * Added new restricted ip api checkbox, initial instance localStorage support * Added instance notification, added correct instance switch after page refresh (to last current instance) * Optimize intention in wizard.js * ":" from i18n json to code * Changes for Responsive about site --- assets/webconfig/content/about.html | 2 +- assets/webconfig/i18n/de.json | 3 + assets/webconfig/i18n/en.json | 3 + assets/webconfig/index.html | 5 + assets/webconfig/js/content_colors.js | 1 - assets/webconfig/js/ui_utils.js | 22 +- assets/webconfig/js/wizard.js | 1610 ++++++++++---------- config/hyperion.config.json.commented | 1 + config/hyperion.config.json.default | 1 + libsrc/hyperion/schema/schema-network.json | 19 +- 10 files changed, 854 insertions(+), 813 deletions(-) diff --git a/assets/webconfig/content/about.html b/assets/webconfig/content/about.html index a4e5c61c..f853ad3f 100644 --- a/assets/webconfig/content/about.html +++ b/assets/webconfig/content/about.html @@ -60,7 +60,7 @@ else { response.text().then(function(text) { - $("#3rdpartylicenses").text(text); + $("#3rdpartylicenses").html(''+text+''); }); } }) diff --git a/assets/webconfig/i18n/de.json b/assets/webconfig/i18n/de.json index c869c7ce..c06d8733 100644 --- a/assets/webconfig/i18n/de.json +++ b/assets/webconfig/i18n/de.json @@ -76,6 +76,7 @@ "dashboard_alert_message_confsave_success" : "Deine Hyperion Konfiguration wurde erfolgreich gespeichert. Deine Änderungen sind somit übernommen.", "dashboard_message_global_setting_t": "Instanzunabhängige Einstellung", "dashboard_message_global_setting": "Die Einstellungen auf dieser Seite sind instanzunabhängig. Änderungen werden global übernommen.", + "dashboard_active_instance": "Ausgewählte Instanz", "main_menu_dashboard_token": "Dashboard", "main_menu_configuration_token": "Konfiguration", "main_menu_general_conf_token": "Allgemein", @@ -611,6 +612,8 @@ "edt_conf_net_apiAuth_expl":"Zwinge alle Anwendungen welche die Hyperion API nutzen sich zu authentifizieren. Aktivieren für höhere Sicherheit, da nun jede neue Anwendung einmalig von dir bestätigt werden muss.", "edt_conf_net_localApiAuth_title" : "Lokale API Authentifizierung", "edt_conf_net_localApiAuth_expl" : "Wenn aktiviert, müssen Verbindungen aus dem Heimnetzwerk mit einem Token authentifiziert werden.", + "edt_conf_net_restirctedInternetAccessAPI_title" : "Auf IP's beschränken", + "edt_conf_net_restirctedInternetAccessAPI_expl": "Den Zugriff auf die API durch das Internet auf bestimmte IP's beschränken", "edt_conf_js_heading_title": "JSON Server", "edt_conf_fbs_heading_title": "Flatbuffers Server", "edt_conf_fbs_timeout_title": "Zeitüberschreitung", diff --git a/assets/webconfig/i18n/en.json b/assets/webconfig/i18n/en.json index 6631a983..495e9364 100644 --- a/assets/webconfig/i18n/en.json +++ b/assets/webconfig/i18n/en.json @@ -75,6 +75,7 @@ "dashboard_alert_message_confsave_success" : "Your Hyperion configuration has been saved successfully. Your changes are now active.", "dashboard_message_global_setting_t": "Instance independent setting", "dashboard_message_global_setting": "The settings on this page are not depending on a specific instance. Changes will be stored globally for all instances.", + "dashboard_active_instance": "Selected instance", "main_menu_dashboard_token" : "Dashboard", "main_menu_configuration_token" : "Configuration", "main_menu_general_conf_token" : "General", @@ -610,6 +611,8 @@ "edt_conf_net_apiAuth_expl":"Enforce all applications that use the Hyperion API to authenticate themself against Hyperion (Exception see \"Local API Authentication\"). Higher security, as you control the access and revoke it at any time.", "edt_conf_net_localApiAuth_title" : "Local API Authentication", "edt_conf_net_localApiAuth_expl" : "When enabled, connections from your home network needs to authenticate themself against Hyperion too.", + "edt_conf_net_restirctedInternetAccessAPI_title" : "Restrict to IP's", + "edt_conf_net_restirctedInternetAccessAPI_expl": "You can restrict the access to the API through the internet to certain IP's.", "edt_conf_js_heading_title" : "JSON Server", "edt_conf_fbs_heading_title" : "Flatbuffers Server", "edt_conf_fbs_timeout_title" : "Timeout", diff --git a/assets/webconfig/index.html b/assets/webconfig/index.html index 8d54b19b..4e0b1569 100644 --- a/assets/webconfig/index.html +++ b/assets/webconfig/index.html @@ -211,6 +211,11 @@
+ '; + } + h +='
'; + } + else + h += '

'+$.i18n('wiz_cc_testintrowok')+' '+$.i18n('wiz_cc_link')+'

'; + h += '

'+$.i18n('wiz_cc_summary')+'

'; + $('#wiz_cc_desc').html(h); + + $('.videobtn').off().on('click', function(e){ + if(e.target.id == "stop") + sendToKodi("stop"); + else + sendToKodi("playV",e.target.id+'.mp4'); + + $(this).attr("disabled", true); + setTimeout(function(){$('.videobtn').attr("disabled", false)},10000); + }); + + $('#btn_wiz_next').attr("disabled", true); + $('#btn_wiz_save').toggle(true); + } + else + { + $('#btn_wiz_next').attr("disabled", false); + $('#btn_wiz_save').toggle(false); + } +} + +function updateWEditor(el, all) +{ + for (var key in cobj) + { + if(all === true || el[0] == key || el[1] == key || el[2] == key) + $('#editor_container_wiz [data-schemapath*=".'+profile+'.'+key+'"]').toggle(true); + else + $('#editor_container_wiz [data-schemapath*=".'+profile+'.'+key+'"]').toggle(false); + } +} + +function startWizardCC() +{ + //create html + $('#wiz_header').html(''+$.i18n('wiz_cc_title')); + $('#wizp1_body').html('

'+$.i18n('wiz_cc_title')+'

'+$.i18n('wiz_cc_intro1')+'

'); + $('#wizp1_footer').html(''); + $('#wizp2_body').html('
'); + $('#wizp2_footer').html(''); + + //open modal + $("#wizard_modal").modal({ + backdrop : "static", + keyboard: false, + show: true + }); + + $('#wiz_cc_kodiip').off().on('change',function() { + kodiAddress = $(this).val(); + setStorage("kodiAddress", kodiAddress); + sendToKodi("msg", $.i18n('wiz_cc_kodimsg_start'), function(cb){ + if(cb == "error") + { + $('#kodi_status').html('

'+$.i18n('wiz_cc_kodidiscon')+'

'+$.i18n('wiz_cc_kodidisconlink')+' '+$.i18n('wiz_cc_link')+'

'); + withKodi = false; } else { - $('#usrcont').toggle(false); - $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); - } - } - }; - - function assignHuePos(id, pos, inc) - { - var i = null; - - if(pos == "top") - i = huePosTop; - else if(pos == "bottom") - i = huePosBottom; - else if(pos == "left") - i = huePosLeft; - else if(pos == "right") - i = huePosRight; - else - i = huePosEntire; - - i.index = inc; - return i; - } - - function identHueId(id, off) - { - var on = true; - if(off !== true) - setTimeout(identHueId,1500,id,true); - else - on = false; - - $.ajax({ - url: 'http://'+$('#ip').val()+'/api/'+$('#user').val()+'/lights/'+id+'/state', - type: 'PUT', - timeout: 2000, - data: ' {"on":'+on+', "sat":254, "bri":254,"hue":47000}' - }) - } - - function getHueIPs(){ - $('#wiz_hue_ipstate').html($.i18n('wiz_hue_searchb')); - $.ajax({ - url: 'https://discovery.meethue.com', - crossDomain: true, - type: 'GET', - timeout: 3000 - }) - .done( function( data, textStatus, jqXHR ) { - if(data.length == 0) - $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); - else - { - hueIPs = data; - checkHueBridge(checkBridgeResult); - } - }) - .fail( function( jqXHR, textStatus ) { - $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); - }); - }; - - function beginWizardHue() - { - var usr = conf_editor.getEditor("root.specificOptions.username").getValue(); - if(usr != "") - { - $('#user').val(usr); - } - - //check if ip is empty/reachable/search for bridge - if(conf_editor.getEditor("root.specificOptions.output").getValue() == "") - getHueIPs(); - else - { - var ip = conf_editor.getEditor("root.specificOptions.output").getValue(); - $('#ip').val(ip); - hueIPs.push({internalipaddress : ip}); - checkHueBridge(checkBridgeResult); - } - - $('#retry_bridge').off().on('click', function(){ - hueIPs.push({internalipaddress : $('#ip').val()}); - hueIPsinc = 0; - checkHueBridge(checkBridgeResult); - }); - - $('#retry_usr').off().on('click', function(){ - checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); - }); - - $('#wiz_hue_create_user').off().on('click',function() { - createHueUser(); - }); - - $('#btn_wiz_save').off().on("click", function(){ - var hueLedConfig = []; - var finalLightIds = []; - - //create hue led config - var incC = 0; - for(var key in lightIDs) - { - if($('#hue_'+key).val() != "disabled") - { - hueLedConfig.push(assignHuePos(key, $('#hue_'+key).val(), incC)); - finalLightIds.push(parseInt(key)); - incC++; - } + $('#kodi_status').html('

'+$.i18n('wiz_cc_kodicon')+'

'); + withKodi = true; } - window.serverConfig.leds = hueLedConfig; - - //Adjust gamma, brightness and compensation - var c = window.serverConfig.color.channelAdjustment[0]; - c.gammaBlue = 1.0; - c.gammaRed = 1.0; - c.gammaGreen = 1.0; - c.brightness = 100; - c.brightnessCompensation = 0; - - //device config - var d = window.serverConfig.device; - d.output = $('#ip').val(); - d.lightIds = finalLightIds; - d.username = $('#user').val(); - d.type = "philipshue"; - d.transitiontime = 1; - d.switchOffOnBlack = true; - - //smoothing off - window.serverConfig.smoothing.enable = false; - - requestWriteConfig(window.serverConfig, true); - resetWizard(); + $('#btn_wiz_cont').attr('disabled', false); }); + }); - $('#btn_wiz_abort').off().on('click', resetWizard); - } - - function createHueUser() - { - var connectionRetries = 30; - var data = {"devicetype":"hyperion#"+Date.now()}; - var UserInterval = setInterval(function(){ - $.ajax({ - type: "POST", - url: 'http://'+$("#ip").val()+'/api', - processData: false, - timeout: 1000, - contentType: 'application/json', - data: JSON.stringify(data), - success: function(r) { - $('#wizp1').toggle(false); - $('#wizp2').toggle(false); - $('#wizp3').toggle(true); - - connectionRetries--; - $("#connectionTime").html(connectionRetries); - if(connectionRetries == 0) { - abortConnection(UserInterval); - } - else - { - if (typeof r[0].error != 'undefined') { - console.log(connectionRetries+": link not pressed"); - } - if (typeof r[0].success != 'undefined') { - $('#wizp1').toggle(false); - $('#wizp2').toggle(true); - $('#wizp3').toggle(false); - $('#user').val(r[0].success.username); - checkHueBridge(checkUserResult,r[0].success.username); - clearInterval(UserInterval); - } - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown) { - $('#wizp1').toggle(false); - $('#wizp2').toggle(true); - $('#wizp3').toggle(false); - clearInterval(UserInterval); - } - }); - },1000); - } - - function get_hue_lights(){ - $.ajax({ - type: "GET", - url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/lights', - processData: false, - contentType: 'application/json', - success: function(r) { - if(Object.keys(r).length > 0) - { - $('#wh_topcontainer').toggle(false); - $('#hue_ids_t, #btn_wiz_save').toggle(true); - lightIDs = r; - - for(var lightid in r) - { - $('.lidsb').append(createTableRow([lightid+' ('+r[lightid].name+')', '',''])); - } - - $('.hue_sel_watch').bind("change", function(){ - var cC = 0; - for(var key in lightIDs) - { - if($('#hue_'+key).val() != "disabled") - { - cC++; - } - } - cC == 0 ? $('#btn_wiz_save').attr("disabled",true) : $('#btn_wiz_save').attr("disabled",false); - }); - - $('.hue_sel_watch').trigger('change'); - } - else - { - $('#wizp2_body').html('

'+$.i18n('wiz_hue_noids')+'

') - } - } - }); - } - - function abortConnection(UserInterval){ - clearInterval(UserInterval); + //listen for continue + $('#btn_wiz_cont').off().on('click',function() { + beginWizardCC(); $('#wizp1').toggle(false); $('#wizp2').toggle(true); - $('#wizp3').toggle(false); - $("#wiz_hue_usrstate").html($.i18n('wiz_hue_failure_connection')); + }); + + $('#wiz_cc_kodiip').trigger("change"); + colorLength = window.serverConfig.color.channelAdjustment; + cobj = window.schema.color.properties.channelAdjustment.items.properties; + websAddress = document.location.hostname+':'+window.serverConfig.webConfig.port; + imgAddress = 'http://'+websAddress+'/img/cc/'; + setStorage("wizardactive", true); + + //check profile count + if(colorLength.length > 1) + { + $('#multi_cali').html('

'+$.i18n('wiz_cc_morethanone')+'

'); + for(var i = 0; i'+$.i18n('wiz_hue_title')); + $('#wizp1_body').html('

'+$.i18n('wiz_hue_title')+'

'+$.i18n('wiz_hue_intro1')+'

'); + $('#wizp1_footer').html(''); + $('#wizp2_body').html('
'); + $('#wh_topcontainer').append('

'+$.i18n('wiz_hue_desc1')+'

'); + $('#wh_topcontainer').append(''); + $('#wizp2_body').append(''); + createTable("lidsh", "lidsb", "hue_ids_t"); + $('.lidsh').append(createTableRow([$.i18n('edt_dev_spec_lightid_title'),$.i18n('wiz_hue_pos'),$.i18n('wiz_hue_ident')], true)); + $('#wizp2_footer').html(''); + $('#wizp3_body').html(''+$.i18n('wiz_hue_press_link')+'


'); + + //open modal + $("#wizard_modal").modal({ + backdrop : "static", + keyboard: false, + show: true + }); + + //listen for continue + $('#btn_wiz_cont').off().on('click',function() { + beginWizardHue(); + $('#wizp1').toggle(false); + $('#wizp2').toggle(true); + }); +} + +function checkHueBridge(cb,hueUser){ + var usr = ""; + + if(typeof hueUser != "undefined") + usr = hueUser; + + $.ajax({ + url: 'http://'+hueIPs[hueIPsinc].internalipaddress+'/api/'+usr, + contentType: 'application/json', + type: 'GET', + timeout: 2000 + }) + .done( function( data, textStatus, jqXHR ) { + if(Array.isArray(data) && data[0].error && data[0].error.type == 4) + cb(true); + else if(Array.isArray(data) && data[0].error) + cb(false); + else + cb(true); + }) + .fail( function( jqXHR, textStatus ) { + cb(false); + }); +} + +function checkUserResult(reply){ + if(reply) + { + $('#wiz_hue_usrstate').html(""); + $('#wiz_hue_create_user').toggle(false); + get_hue_lights(); + } + else + { + $('#wiz_hue_usrstate').html($.i18n('wiz_hue_failure_user')); + $('#wiz_hue_create_user').toggle(true); + } +}; + +function checkBridgeResult(reply){ + if(reply) + { + //abort checking, first reachable result is used + $('#wiz_hue_ipstate').html(""); + $('#ip').val(hueIPs[hueIPsinc].internalipaddress) + + //now check hue user on this bridge + $('#usrcont').toggle(true); + checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); + } + else + { + //increment and check again + if(hueIPs.length-1 > hueIPsinc) + { + hueIPsinc++; + checkHueBridge(checkBridgeResult); + } + else + { + $('#usrcont').toggle(false); + $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); + } + } +}; + +function assignHuePos(id, pos, inc) +{ + var i = null; + + if(pos == "top") + i = huePosTop; + else if(pos == "bottom") + i = huePosBottom; + else if(pos == "left") + i = huePosLeft; + else if(pos == "right") + i = huePosRight; + else + i = huePosEntire; + + i.index = inc; + return i; +} + +function identHueId(id, off) +{ + var on = true; + if(off !== true) + setTimeout(identHueId,1500,id,true); + else + on = false; + + $.ajax({ + url: 'http://'+$('#ip').val()+'/api/'+$('#user').val()+'/lights/'+id+'/state', + type: 'PUT', + timeout: 2000, + data: ' {"on":'+on+', "sat":254, "bri":254,"hue":47000}' + }) +} + +function getHueIPs(){ + $('#wiz_hue_ipstate').html($.i18n('wiz_hue_searchb')); + $.ajax({ + url: 'https://discovery.meethue.com', + crossDomain: true, + type: 'GET', + timeout: 3000 + }) + .done( function( data, textStatus, jqXHR ) { + if(data.length == 0) + $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); + else + { + hueIPs = data; + checkHueBridge(checkBridgeResult); + } + }) + .fail( function( jqXHR, textStatus ) { + $('#wiz_hue_ipstate').html($.i18n('wiz_hue_failure_ip')); + }); +}; + +function beginWizardHue() +{ + var usr = conf_editor.getEditor("root.specificOptions.username").getValue(); + if(usr != "") + { + $('#user').val(usr); + } + + //check if ip is empty/reachable/search for bridge + if(conf_editor.getEditor("root.specificOptions.output").getValue() == "") + getHueIPs(); + else + { + var ip = conf_editor.getEditor("root.specificOptions.output").getValue(); + $('#ip').val(ip); + hueIPs.push({internalipaddress : ip}); + checkHueBridge(checkBridgeResult); + } + + $('#retry_bridge').off().on('click', function(){ + hueIPs.push({internalipaddress : $('#ip').val()}); + hueIPsinc = 0; + checkHueBridge(checkBridgeResult); + }); + + $('#retry_usr').off().on('click', function(){ + checkHueBridge(checkUserResult,$('#user').val() ? $('#user').val() : "newdeveloper"); + }); + + $('#wiz_hue_create_user').off().on('click',function() { + createHueUser(); + }); + + $('#btn_wiz_save').off().on("click", function(){ + var hueLedConfig = []; + var finalLightIds = []; + + //create hue led config + var incC = 0; + for(var key in lightIDs) + { + if($('#hue_'+key).val() != "disabled") + { + hueLedConfig.push(assignHuePos(key, $('#hue_'+key).val(), incC)); + finalLightIds.push(parseInt(key)); + incC++; + } + } + + window.serverConfig.leds = hueLedConfig; + + //Adjust gamma, brightness and compensation + var c = window.serverConfig.color.channelAdjustment[0]; + c.gammaBlue = 1.0; + c.gammaRed = 1.0; + c.gammaGreen = 1.0; + c.brightness = 100; + c.brightnessCompensation = 0; + + //device config + var d = window.serverConfig.device; + d.output = $('#ip').val(); + d.lightIds = finalLightIds; + d.username = $('#user').val(); + d.type = "philipshue"; + d.transitiontime = 1; + d.switchOffOnBlack = true; + + //smoothing off + window.serverConfig.smoothing.enable = false; + + requestWriteConfig(window.serverConfig, true); + resetWizard(); + }); + + $('#btn_wiz_abort').off().on('click', resetWizard); +} + +function createHueUser() +{ + var connectionRetries = 30; + var data = {"devicetype":"hyperion#"+Date.now()}; + var UserInterval = setInterval(function(){ + $.ajax({ + type: "POST", + url: 'http://'+$("#ip").val()+'/api', + processData: false, + timeout: 1000, + contentType: 'application/json', + data: JSON.stringify(data), + success: function(r) { + $('#wizp1').toggle(false); + $('#wizp2').toggle(false); + $('#wizp3').toggle(true); + + connectionRetries--; + $("#connectionTime").html(connectionRetries); + if(connectionRetries == 0) + { + abortConnection(UserInterval); + } + else + { + if (typeof r[0].error != 'undefined') + { + console.log(connectionRetries+": link not pressed"); + } + if (typeof r[0].success != 'undefined') + { + $('#wizp1').toggle(false); + $('#wizp2').toggle(true); + $('#wizp3').toggle(false); + $('#user').val(r[0].success.username); + checkHueBridge(checkUserResult,r[0].success.username); + clearInterval(UserInterval); + } + } + }, + error: function(XMLHttpRequest, textStatus, errorThrown) { + $('#wizp1').toggle(false); + $('#wizp2').toggle(true); + $('#wizp3').toggle(false); + clearInterval(UserInterval); + } + }); + },1000); +} + +function get_hue_lights(){ + $.ajax({ + type: "GET", + url: 'http://'+$("#ip").val()+'/api/'+$("#user").val()+'/lights', + processData: false, + contentType: 'application/json', + success: function(r) { + if(Object.keys(r).length > 0) + { + $('#wh_topcontainer').toggle(false); + $('#hue_ids_t, #btn_wiz_save').toggle(true); + lightIDs = r; + + for(var lightid in r) + { + $('.lidsb').append(createTableRow([lightid+' ('+r[lightid].name+')', '',''])); + } + + $('.hue_sel_watch').bind("change", function(){ + var cC = 0; + for(var key in lightIDs) + { + if($('#hue_'+key).val() != "disabled") + { + cC++; + } + } + cC == 0 ? $('#btn_wiz_save').attr("disabled",true) : $('#btn_wiz_save').attr("disabled",false); + }); + + $('.hue_sel_watch').trigger('change'); + } + else + { + $('#wizp2_body').html('

'+$.i18n('wiz_hue_noids')+'

') + } + } + }); +} + +function abortConnection(UserInterval){ + clearInterval(UserInterval); + $('#wizp1').toggle(false); + $('#wizp2').toggle(true); + $('#wizp3').toggle(false); + $("#wiz_hue_usrstate").html($.i18n('wiz_hue_failure_connection')); +} diff --git a/config/hyperion.config.json.commented b/config/hyperion.config.json.commented index 3080c4f2..bc94c3fa 100644 --- a/config/hyperion.config.json.commented +++ b/config/hyperion.config.json.commented @@ -309,6 +309,7 @@ "network" : { "internetAccessAPI" : false, + "restirctedInternetAccessAPI" : false, "ipWhitelist" : [], "apiAuth" : true, "localApiAuth" : false diff --git a/config/hyperion.config.json.default b/config/hyperion.config.json.default index 520fcde9..ddc1fdde 100644 --- a/config/hyperion.config.json.default +++ b/config/hyperion.config.json.default @@ -178,6 +178,7 @@ "network" : { "internetAccessAPI" : false, + "restirctedInternetAccessAPI" : false, "ipWhitelist" : [], "apiAuth" : true, "localApiAuth" : false diff --git a/libsrc/hyperion/schema/schema-network.json b/libsrc/hyperion/schema/schema-network.json index cbf2e58d..922ba0e5 100644 --- a/libsrc/hyperion/schema/schema-network.json +++ b/libsrc/hyperion/schema/schema-network.json @@ -25,6 +25,19 @@ }, "propertyOrder" : 2 }, + "restirctedInternetAccessAPI" : + { + "type" : "boolean", + "title" : "edt_conf_net_restirctedInternetAccessAPI_title", + "required" : true, + "default" : false, + "options": { + "dependencies": { + "internetAccessAPI": true + } + }, + "propertyOrder" : 3 + }, "ipWhitelist" : { "type" : "array", @@ -36,10 +49,10 @@ }, "options": { "dependencies": { - "internetAccessAPI": false + "restirctedInternetAccessAPI": true } }, - "propertyOrder" : 3 + "propertyOrder" : 4 }, "localApiAuth" : { @@ -52,7 +65,7 @@ "apiAuth": true } }, - "propertyOrder" : 4 + "propertyOrder" : 5 } }, "additionalProperties" : false