From a162ffbd84675a6e0c31b63f81ff10ae445f7c73 Mon Sep 17 00:00:00 2001 From: Cat Date: Mon, 23 Oct 2017 09:53:17 +0200 Subject: [PATCH 1/6] LSP: security patch --- lsp/minified.js | 6 +++--- lsp/mist.js | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lsp/minified.js b/lsp/minified.js index 028fe982..492a1e05 100644 --- a/lsp/minified.js +++ b/lsp/minified.js @@ -199,9 +199,9 @@ value:mist.user.name},{type:"email",label:"Your email address",validate:["requir return a==""||a==null?true:false}).each(function(){var a=[];$(this).is("input, select, textarea")?a.push($(this)):a=$(this).find("input, select, textarea");if(a.length){$(a[0]).focus();return false}});!navigator.doNotTrack&&mist.user.loggedin&&d.append($("").attr("src","https://www.google-analytics.com/collect?v=1&tid=UA-32426932-1&cid="+mist.data.config.iid+"&t=pageview&dp="+encodeURIComponent("/MI/"+a)+"&dh=MI."+(mist.data.LTS?"Pro":"OS")).css({width:"1px",height:"1px","min-width":"1px",opacity:0.1, position:"absolute",left:"-1000px"}))}}};"origin"in location||(location.origin=location.protocol+"//");var host;host="file://"==location.origin?"http://localhost:4242/api":location.origin+location.pathname.replace(/\/+$/,"")+"/api"; var mist={data:{},user:{name:"",password:"",host:host},send:function(a,c,d){var c=c||{},d=d||{},d=$.extend(true,{timeOut:3E4,sendData:c},d),b={authorize:{password:mist.user.authstring?MD5(mist.user.password+mist.user.authstring):"",username:mist.user.name}};$.extend(true,b,c);log("Send",$.extend(true,{},c));b={url:mist.user.host,type:"POST",data:{command:JSON.stringify(b)},dataType:"jsonp",crossDomain:true,timeout:d.timeout*1E3,async:true,error:function(b,e){delete mist.user.loggedin;if(!d.hide){switch(e){case "timeout":e= -$("").text("The connection timed out. ");break;case "abort":e=$("").text("The connection was aborted. ");break;default:e=$("").text(e+". ").css("text-transform","capitalize")}$("#message").addClass("red").text("An error occurred while attempting to communicate with MistServer:").append($("
")).append(e).append($("").text("Send server request again").click(function(){mist.send(a,c,d)}))}UI.navto("Login")},success:function(b){log("Receive",$.extend(true,{},b),"as reply to",d.sendData); -delete mist.user.loggedin;switch(b.authorize.status){case "OK":if("streams"in b)if(b.streams)if("incomplete list"in b.streams){delete b.streams["incomplete list"];$.extend(mist.data.streams,b.streams)}else mist.data.streams=b.streams;else mist.data.streams={};var e=$.extend({},b),h=["config","capabilities","ui_settings","LTS","active_streams","browse","log","totals"],q;for(q in e)h.indexOf(q)==-1&&delete e[q];$.extend(mist.data,e);mist.user.loggedin=true;UI.elements.connection.status.text("Connected").removeClass("red").addClass("green"); -UI.elements.connection.user_and_host.text(mist.user.name+" @ "+mist.user.host);UI.elements.connection.msg.removeClass("red").text("Last communication with the server at "+UI.format.time((new Date).getTime()/1E3));b.LTS&&UI.elements.menu.find(".LTSonly").removeClass("LTSonly");if(b.log){e=b.log[b.log.length-1];UI.elements.connection.msg.append($("
")).append("Last log entry: "+UI.format.time(e[0])+" ["+e[1]+"] "+e[2])}if("totals"in b){e=function(a,b,c){var d;d=function(){for(var a in c.fields)e[c.fields[a]].push([m, +$("").text("The connection timed out. ");break;case "abort":e=$("").text("The connection was aborted. ");break;default:e=$("").text(e+". ").css("text-transform","capitalize")}$("#message").addClass("red").text("An error occurred while attempting to communicate with MistServer:").append($("
")).append($("").text(e)).append($("
").text("Send server request again").click(function(){mist.send(a,c,d)}))}UI.navto("Login")},success:function(b){log("Receive",$.extend(true,{},b),"as reply to", +d.sendData);delete mist.user.loggedin;switch(b.authorize.status){case "OK":if("streams"in b)if(b.streams)if("incomplete list"in b.streams){delete b.streams["incomplete list"];$.extend(mist.data.streams,b.streams)}else mist.data.streams=b.streams;else mist.data.streams={};var e=$.extend({},b),h=["config","capabilities","ui_settings","LTS","active_streams","browse","log","totals"],q;for(q in e)h.indexOf(q)==-1&&delete e[q];$.extend(mist.data,e);mist.user.loggedin=true;UI.elements.connection.status.text("Connected").removeClass("red").addClass("green"); +UI.elements.connection.user_and_host.text(mist.user.name+" @ "+mist.user.host);UI.elements.connection.msg.removeClass("red").text("Last communication with the server at "+UI.format.time((new Date).getTime()/1E3));b.LTS&&UI.elements.menu.find(".LTSonly").removeClass("LTSonly");if(b.log){e=b.log[b.log.length-1];UI.elements.connection.msg.append($("
")).append($("").text("Last log entry: "+UI.format.time(e[0])+" ["+e[1]+"] "+e[2]))}if("totals"in b){e=function(a,b,c){var d;d=function(){for(var a in c.fields)e[c.fields[a]].push([m, 0])};var e={},f;for(f in c.fields)e[c.fields[f]]=[];var h=0,m;if(c.data){if(c.start>mist.data.config.time-600){m=(mist.data.config.time-600)*1E3;d();m=c.start*1E3;d()}else m=c.start*1E3;for(f in c.data){if(f==0){m=c.start*1E3;var q=0}else{m=m+c.interval[q][1]*1E3;c.interval[q][0]--;if(c.interval[q][0]<=0){q++;q20){d();m=(mist.data.config.time- 15)*1E3;d()}}else{m=(mist.data.config.time-600)*1E3;d();m=(mist.data.config.time-15)*1E3;d()}d=e;stream=a?a.join(" "):"all_streams";protocol=b?b.join("_"):"all_protocols";stream in mist.data.totals||(mist.data.totals[stream]={});protocol in mist.data.totals[stream]||(mist.data.totals[stream][protocol]={});$.extend(mist.data.totals[stream][protocol],d)};mist.data.totals={};if("fields"in b.totals)e(c.totals.streams,c.totals.protocols,b.totals);else for(q in b.totals)e(c.totals[q].streams,c.totals[q].protocols, b.totals[q])}a&&a(b,d);break;case "CHALL":if(b.authorize.challenge==mist.user.authstring){mist.user.password!=""&&UI.elements.connection.msg.text("The credentials you provided are incorrect.").addClass("red");UI.navto("Login")}else if(mist.user.password=="")UI.navto("Login");else{mist.user.authstring=b.authorize.challenge;mist.send(a,c,d);sessionStorage.setItem("mistLogin",JSON.stringify({host:mist.user.host,name:mist.user.name,password:mist.user.password}))}break;case "NOACC":UI.navto("Create a new account"); diff --git a/lsp/mist.js b/lsp/mist.js index 4367ae1d..1bc7f35e 100644 --- a/lsp/mist.js +++ b/lsp/mist.js @@ -5661,7 +5661,7 @@ var mist = { $('#message').addClass('red').text('An error occurred while attempting to communicate with MistServer:').append( $('
') ).append( - textStatus + $("").text(textStatus) ).append( $('
').text('Send server request again').click(function(){ mist.send(callback,sendData,opts); @@ -5716,7 +5716,9 @@ var mist = { if (d.log) { var lastlog = d.log[d.log.length-1]; UI.elements.connection.msg.append($('
')).append( - 'Last log entry: '+UI.format.time(lastlog[0])+' ['+lastlog[1]+'] '+lastlog[2] + $("").text( + 'Last log entry: '+UI.format.time(lastlog[0])+' ['+lastlog[1]+'] '+lastlog[2] + ) ); } if ('totals' in d) { From 816896b7b9f6cd7e905e82680125df3b6cfecdb8 Mon Sep 17 00:00:00 2001 From: Cat Date: Mon, 23 Oct 2017 10:11:03 +0200 Subject: [PATCH 2/6] LSP: added connector option type flag --- lsp/minified.js | 2 +- lsp/mist.js | 41 +++++++++++++++++++++++------------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/lsp/minified.js b/lsp/minified.js index 492a1e05..0307dd07 100644 --- a/lsp/minified.js +++ b/lsp/minified.js @@ -207,7 +207,7 @@ UI.elements.connection.user_and_host.text(mist.user.name+" @ "+mist.user.host);U b.totals[q])}a&&a(b,d);break;case "CHALL":if(b.authorize.challenge==mist.user.authstring){mist.user.password!=""&&UI.elements.connection.msg.text("The credentials you provided are incorrect.").addClass("red");UI.navto("Login")}else if(mist.user.password=="")UI.navto("Login");else{mist.user.authstring=b.authorize.challenge;mist.send(a,c,d);sessionStorage.setItem("mistLogin",JSON.stringify({host:mist.user.host,name:mist.user.name,password:mist.user.password}))}break;case "NOACC":UI.navto("Create a new account"); break;case "ACC_MADE":delete c.authorize;mist.send(a,c,d);break;default:UI.navto("Login")}}};d.hide||UI.elements.connection.msg.removeClass("red").text("Data sent, waiting for a reply..").append($("
")).append($("
").text("Cancel request").click(function(){e.abort()}));var e=$.ajax(b)},inputMatch:function(a,c){if(typeof a=="undefined")return false;typeof a=="string"&&(a=[a]);for(var d in a){var b=a[d].replace(/[^\w\s]/g,"\\$&"),b=b.replace(/\\\*/g,".*");if(RegExp("^(?:[a-zA-Z]:)?"+b+"(?:\\?[^\\?]*)?$", "i").test(c))return true}return false},convertBuildOptions:function(a,c){var d=[],b=["required","optional"];"desc"in a&&d.push({type:"help",help:a.desc});for(var e in b)if(a[b[e]]){d.push($("

").text(UI.format.capital(b[e])+" parameters"));for(var f in a[b[e]]){var m=a[b[e]][f],h={label:UI.format.capital(m.name),pointer:{main:c,index:f},validate:[]};b[e]=="required"&&(!("default"in m)||m["default"]=="")&&h.validate.push("required");if("default"in m)h.placeholder=m["default"];if("help"in m)h.help= -m.help;if("unit"in m)h.unit=m.unit;switch(m.type){case "int":h.type="int";break;case "uint":h.type="int";h.min=0;break;case "debug":h.type="debug";break;case "select":h.type="select";h.select=m.select;break;default:h.type="str"}d.push(h)}}return d},stored:{get:function(){return mist.data.ui_settings||{}},set:function(a,c){var d=this.get();d[a]=c;mist.send(function(){},{ui_settings:d})},del:function(a){delete mist.data.ui_settings[a];mist.send(function(){},{ui_settings:mist.data.ui_settings})}}}; +m.help;if("unit"in m)h.unit=m.unit;if("type"in m)switch(m.type){case "int":h.type="int";break;case "uint":h.type="int";h.min=0;break;case "debug":h.type="debug";break;case "select":h.type="select";h.select=m.select;break;default:h.type="str"}else h.type="checkbox";d.push(h)}}return d},stored:{get:function(){return mist.data.ui_settings||{}},set:function(a,c){var d=this.get();d[a]=c;mist.send(function(){},{ui_settings:d})},del:function(a){delete mist.data.ui_settings[a];mist.send(function(){},{ui_settings:mist.data.ui_settings})}}}; function log(){try{UI.debug&&[].push.call(arguments,Error().stack);[].unshift.call(arguments,"["+UI.format.time((new Date).getTime()/1E3)+"]");console.log.apply(console,arguments)}catch(a){}} $.fn.getval=function(){var a=$(this).data("opts"),c=$(this).val();if(a&&"type"in a)switch(a.type){case "span":c=$(this).html();break;case "checkbox":c=$(this).prop("checked");break;case "radioselect":a=$(this).find("label > input[type=radio]:checked").parent();if(a.length){c=[];c.push(a.children("input[type=radio]").val());a=a.children("select");a.length&&c.push(a.val())}else c="";break;case "checklist":c=[];$(this).find(".checklist input[type=checkbox]:checked").each(function(){c.push($(this).attr("name"))}); break;case "unix":c!=""&&(c=Math.round(new Date($(this).val())/1E3))}return c}; diff --git a/lsp/mist.js b/lsp/mist.js index 1bc7f35e..8beca2d3 100644 --- a/lsp/mist.js +++ b/lsp/mist.js @@ -5938,24 +5938,29 @@ var mist = { if ('unit' in ele) { obj.unit = ele.unit; } - switch (ele.type) { - case 'int': - obj.type = 'int'; - break; - case 'uint': - obj.type = 'int'; - obj.min = 0; - break; - case 'debug': - obj.type = 'debug'; - break; - case 'select': - obj.type = 'select'; - obj.select = ele.select; - break; - case 'str': - default: - obj.type = 'str'; + if ("type" in ele) { + switch (ele.type) { + case 'int': + obj.type = 'int'; + break; + case 'uint': + obj.type = 'int'; + obj.min = 0; + break; + case 'debug': + obj.type = 'debug'; + break; + case 'select': + obj.type = 'select'; + obj.select = ele.select; + break; + case 'str': + default: + obj.type = 'str'; + } + } + else { + obj.type = "checkbox"; } build.push(obj); } From a2fc7a19eb964941ec5cae396b91e973d577fcb0 Mon Sep 17 00:00:00 2001 From: Cat Date: Mon, 23 Oct 2017 10:39:51 +0200 Subject: [PATCH 3/6] LSP: display default option in select input type --- lsp/main.css | 3 + lsp/minified.js | 248 ++++++++++++++++++++++++------------------------ lsp/mist.js | 3 +- 3 files changed, 129 insertions(+), 125 deletions(-) diff --git a/lsp/main.css b/lsp/main.css index 4d269487..f7751773 100644 --- a/lsp/main.css +++ b/lsp/main.css @@ -295,6 +295,9 @@ textarea.embed_code { select option[disabled] { display: none; } +select option[value=""] { + color: #808080; +} .description { color: #777; diff --git a/lsp/minified.js b/lsp/minified.js index 0307dd07..6f7a3742 100644 --- a/lsp/minified.js +++ b/lsp/minified.js @@ -1,11 +1,11 @@ -var MD5=function(a){function c(a,c){var b,d,g,f,i;g=a&2147483648;f=c&2147483648;b=a&1073741824;d=c&1073741824;i=(a&1073741823)+(c&1073741823);return b&d?i^2147483648^g^f:b|d?i&1073741824?i^3221225472^g^f:i^1073741824^g^f:i^g^f}function d(a,b,d,g,f,i,h){a=c(a,c(c(b&d|~b&g,f),h));return c(a<>>32-i,b)}function b(a,b,d,g,f,i,h){a=c(a,c(c(b&g|d&~g,f),h));return c(a<>>32-i,b)}function e(a,b,d,g,f,i,h){a=c(a,c(c(b^d^g,f),h));return c(a<>>32-i,b)}function f(a,b,d,g,f,i,h){a=c(a,c(c(d^(b|~g), -f),h));return c(a<>>32-i,b)}function m(a){var c="",b="",d;for(d=0;3>=d;d++)b=a>>>8*d&255,b="0"+b.toString(16),c+=b.substr(b.length-2,2);return c}var h=[],q,p,l,u,g,i,k,j,h=a.replace(/\r\n/g,"\n"),a="";for(q=0;qp?a+=String.fromCharCode(p):(127p?a+=String.fromCharCode(p>>6|192):(a+=String.fromCharCode(p>>12|224),a+=String.fromCharCode(p>>6&63|128)),a+=String.fromCharCode(p&63|128));h=a;a=h.length;q=a+8;p=16*((q-q%64)/64+1);l=Array(p-1);for(g=u=0;g>>29;h=l;g=1732584193;i=4023233417;k=2562383102;j=271733878;for(a=0;ab?1*d:a .menu"),main:$("main"),header:$("header"),connection:{status:$("#connection"),user_and_host:$("#user_and_host"),msg:$("#message")}};UI.buildMenu();UI.stored.getOpts();try{if("mistLogin"in sessionStorage){var a=JSON.parse(sessionStorage.mistLogin);mist.user.name=a.name;mist.user.password=a.password;mist.user.host=a.host}}catch(c){}location.hash&&(a=decodeURIComponent(location.hash).substring(1).split("@")[0].split("&"),mist.user.name=a[0],a[1]&&(mist.user.host= +var MD5=function(a){function c(a,c){var b,d,h,g,f;h=a&2147483648;g=c&2147483648;b=a&1073741824;d=c&1073741824;f=(a&1073741823)+(c&1073741823);return b&d?f^2147483648^h^g:b|d?f&1073741824?f^3221225472^h^g:f^1073741824^h^g:f^h^g}function d(a,b,d,h,g,f,j){a=c(a,c(c(b&d|~b&h,g),j));return c(a<>>32-f,b)}function b(a,b,d,h,g,f,j){a=c(a,c(c(b&h|d&~h,g),j));return c(a<>>32-f,b)}function e(a,b,d,h,g,f,j){a=c(a,c(c(b^d^h,g),j));return c(a<>>32-f,b)}function g(a,b,d,h,g,f,j){a=c(a,c(c(d^(b|~h), +g),j));return c(a<>>32-f,b)}function m(a){var c="",b="",d;for(d=0;3>=d;d++)b=a>>>8*d&255,b="0"+b.toString(16),c+=b.substr(b.length-2,2);return c}var f=[],q,p,l,u,h,j,k,i,f=a.replace(/\r\n/g,"\n"),a="";for(q=0;qp?a+=String.fromCharCode(p):(127p?a+=String.fromCharCode(p>>6|192):(a+=String.fromCharCode(p>>12|224),a+=String.fromCharCode(p>>6&63|128)),a+=String.fromCharCode(p&63|128));f=a;a=f.length;q=a+8;p=16*((q-q%64)/64+1);l=Array(p-1);for(h=u=0;h>>29;f=l;h=1732584193;j=4023233417;k=2562383102;i=271733878;for(a=0;ab?1*d:a .menu"),main:$("main"),header:$("header"),connection:{status:$("#connection"),user_and_host:$("#user_and_host"),msg:$("#message")}};UI.buildMenu();UI.stored.getOpts();try{if("mistLogin"in sessionStorage){var a=JSON.parse(sessionStorage.mistLogin);mist.user.name=a.name;mist.user.password=a.password;mist.user.host=a.host}}catch(c){}location.hash&&(a=decodeURIComponent(location.hash).substring(1).split("@")[0].split("&"),mist.user.name=a[0],a[1]&&(mist.user.host= a[1]));mist.send(function(){$(window).trigger("hashchange")},{},{timeout:5,hide:!0});var d=0;$("body > div.filler").on("scroll",function(){var a=$(this).scrollLeft();a!=d&&UI.elements.header.css("margin-right",-1*a+"px");d=a})});$(window).on("hashchange",function(){var a=decodeURIComponent(location.hash).substring(1).split("@");a[1]||(a[1]="");a=a[1].split("&");""==a[0]&&(a[0]="Overview");UI.showTab(a[0],a[1])}); var otherhost={host:!1,https:!1},UI={debug:!1,elements:{},stored:{getOpts:function(){var a=localStorage.stored;a&&(a=JSON.parse(a));$.extend(!0,this.vars,a);return this.vars},saveOpt:function(a,c){this.vars[a]=c;localStorage.stored=JSON.stringify(this.vars);return this.vars},vars:{helpme:!0}},interval:{clear:function(){"undefined"!=typeof this.opts&&(clearInterval(this.opts.id),delete this.opts)},set:function(a,c){this.opts&&log("[interval]","Set called on interval, but an interval is already active."); this.opts={delay:c,callback:a};this.opts.id=setInterval(a,c)}},returnTab:["Overview"],countrylist:{AF:"Afghanistan",AX:"Åland Islands",AL:"Albania",DZ:"Algeria",AS:"American Samoa",AD:"Andorra",AO:"Angola",AI:"Anguilla",AQ:"Antarctica",AG:"Antigua and Barbuda",AR:"Argentina",AM:"Armenia",AW:"Aruba",AU:"Australia",AT:"Austria",AZ:"Azerbaijan",BS:"Bahamas",BH:"Bahrain",BD:"Bangladesh",BB:"Barbados",BY:"Belarus",BE:"Belgium",BZ:"Belize",BJ:"Benin",BM:"Bermuda",BT:"Bhutan",BO:"Bolivia, Plurinational State of", @@ -21,156 +21,156 @@ clearTimeout(this.hiding);delete this.hiding;var d=$(document).height()-$tooltip "HLS";break;case "html5/video/mp4":c="MP4";break;case "dash/video/mp4":c="DASH";break;case "flash/11":c="HDS";break;case "flash/10":c="RTMP";break;case "flash/7":c="Progressive";break;case "html5/audio/mp3":c="MP3";break;case "html5/video/mp2t":c="TS";break;case "html5/application/vnd.ms-ss":c="Smooth";break;case "html5/text/vtt":c="VTT Subtitles";break;case "html5/text/plain":c="SRT Subtitles";break;case "html5/text/javascript":c="JSON Subtitles"}return c},popup:{element:null,show:function(a){this.element= $("
").attr("id","popup").append($("