From e38f326875752a27a2819b6b7914ffe65e848aba Mon Sep 17 00:00:00 2001 From: yo momma Date: Fri, 30 Jan 2026 01:20:07 +0000 Subject: Refactor: JS init + HTTPS-safe URLs --- static/js/finger.js | 2 +- static/js/pages/chat_init.js | 36 ++++++++++++++++++++++++ static/js/pichat.butt.js | 35 ++++++++++++++--------- static/js/pichat.js | 66 +++++++++++++++++++++++++++----------------- static/js/src/_main.js | 14 ++++++++-- static/js/src/search.js | 11 +++----- static/js/src/share.js | 8 +++--- static/js/src/tag.js | 2 +- static/js/src/text.js | 8 ++---- static/js/src/util.js | 10 ++++++- static/js/src/youtube.js | 13 +++++---- 11 files changed, 139 insertions(+), 66 deletions(-) create mode 100644 static/js/pages/chat_init.js (limited to 'static') diff --git a/static/js/finger.js b/static/js/finger.js index 5f75c12..3c5db9e 100755 --- a/static/js/finger.js +++ b/static/js/finger.js @@ -1,3 +1,3 @@ -;(function(name,context,definition){if(typeof module!=='undefined'&&module.exports){module.exports=definition()}else if(typeof define==='function'&&define.amd){define(definition)}else{context[name]=definition()}})('Fingerprint',this,function(){'use strict';var Fingerprint=function(options){var nativeForEach,nativeMap;nativeForEach=Array.prototype.forEach;nativeMap=Array.prototype.map;this.each=function(obj,iterator,context){if(obj===null){return}if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i>>16)*c1)&0xffff)<<16)))&0xffffffff;k1=(k1<<15)|(k1>>>17);k1=((((k1&0xffff)*c2)+((((k1>>>16)*c2)&0xffff)<<16)))&0xffffffff;h1^=k1;h1=(h1<<13)|(h1>>>19);h1b=((((h1&0xffff)*5)+((((h1>>>16)*5)&0xffff)<<16)))&0xffffffff;h1=(((h1b&0xffff)+0x6b64)+((((h1b>>>16)+0xe654)&0xffff)<<16))}k1=0;switch(remainder){case 3:k1^=(key.charCodeAt(i+2)&0xff)<<16;case 2:k1^=(key.charCodeAt(i+1)&0xff)<<8;case 1:k1^=(key.charCodeAt(i)&0xff);k1=(((k1&0xffff)*c1)+((((k1>>>16)*c1)&0xffff)<<16))&0xffffffff;k1=(k1<<15)|(k1>>>17);k1=(((k1&0xffff)*c2)+((((k1>>>16)*c2)&0xffff)<<16))&0xffffffff;h1^=k1}h1^=key.length;h1^=h1>>>16;h1=(((h1&0xffff)*0x85ebca6b)+((((h1>>>16)*0x85ebca6b)&0xffff)<<16))&0xffffffff;h1^=h1>>>13;h1=((((h1&0xffff)*0xc2b2ae35)+((((h1>>>16)*0xc2b2ae35)&0xffff)<<16)))&0xffffffff;h1^=h1>>>16;return h1>>>0},hasLocalStorage:function(){try{return!!window.localStorage}catch(e){return true}},hasSessionStorage:function(){try{return!!window.sessionStorage}catch(e){return true}},isCanvasSupported:function(){var elem=document.createElement('canvas');return!!(elem.getContext&&elem.getContext('2d'))},isIE:function(){if(navigator.appName==='Microsoft Internet Explorer'){return true}else if(navigator.appName==='Netscape'&&/Trident/.test(navigator.userAgent)){return true}return false},getPluginsString:function(){if(this.isIE()&&this.ie_activex){return this.getIEPluginsString()}else{return this.getRegularPluginsString()}},getRegularPluginsString:function(){return this.map(navigator.plugins,function(p){var mimeTypes=this.map(p,function(mt){return[mt.type,mt.suffixes].join('~')}).join(',');return[p.name,p.description,mimeTypes].join('::')},this).join(';')},getIEPluginsString:function(){if(window.ActiveXObject){var names=['ShockwaveFlash.ShockwaveFlash','AcroPDF.PDF','PDF.PdfCtrl','QuickTime.QuickTime','rmocx.RealPlayer G2 Control','rmocx.RealPlayer G2 Control.1','RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)','RealVideo.RealVideo(tm) ActiveX Control (32-bit)','RealPlayer','SWCtl.SWCtl','WMPlayer.OCX','AgControl.AgControl','Skype.Detection'];return this.map(names,function(name){try{new ActiveXObject(name);return name}catch(e){return null}}).join(';')}else{return""}},getScreenResolution:function(){var resolution;if(this.screen_orientation){resolution=(screen.height>screen.width)?[screen.height,screen.width]:[screen.width,screen.height]}else{resolution=[screen.height,screen.width]}return resolution},getCanvasFingerprint:function(){var canvas=document.createElement('canvas');var ctx=canvas.getContext('2d');var txt='http://valve.github.io';ctx.textBaseline="top";ctx.font="14px 'Arial'";ctx.textBaseline="alphabetic";ctx.fillStyle="#f60";ctx.fillRect(125,1,62,20);ctx.fillStyle="#069";ctx.fillText(txt,2,15);ctx.fillStyle="rgba(102, 204, 0, 0.7)";ctx.fillText(txt,4,17);return canvas.toDataURL()}};return Fingerprint}); $(function(){ var data = {}; data.nick = Nick; data.token = new Fingerprint({canvas: true}).get(); $.getJSON("http://polanski.herokuapp.com/check/", data, function(data){ if (data.status == "KO") window.location.href = "about:blank" }) }) +;(function(name,context,definition){if(typeof module!=='undefined'&&module.exports){module.exports=definition()}else if(typeof define==='function'&&define.amd){define(definition)}else{context[name]=definition()}})('Fingerprint',this,function(){'use strict';var Fingerprint=function(options){var nativeForEach,nativeMap;nativeForEach=Array.prototype.forEach;nativeMap=Array.prototype.map;this.each=function(obj,iterator,context){if(obj===null){return}if(nativeForEach&&obj.forEach===nativeForEach){obj.forEach(iterator,context)}else if(obj.length===+obj.length){for(var i=0,l=obj.length;i>>16)*c1)&0xffff)<<16)))&0xffffffff;k1=(k1<<15)|(k1>>>17);k1=((((k1&0xffff)*c2)+((((k1>>>16)*c2)&0xffff)<<16)))&0xffffffff;h1^=k1;h1=(h1<<13)|(h1>>>19);h1b=((((h1&0xffff)*5)+((((h1>>>16)*5)&0xffff)<<16)))&0xffffffff;h1=(((h1b&0xffff)+0x6b64)+((((h1b>>>16)+0xe654)&0xffff)<<16))}k1=0;switch(remainder){case 3:k1^=(key.charCodeAt(i+2)&0xff)<<16;case 2:k1^=(key.charCodeAt(i+1)&0xff)<<8;case 1:k1^=(key.charCodeAt(i)&0xff);k1=(((k1&0xffff)*c1)+((((k1>>>16)*c1)&0xffff)<<16))&0xffffffff;k1=(k1<<15)|(k1>>>17);k1=(((k1&0xffff)*c2)+((((k1>>>16)*c2)&0xffff)<<16))&0xffffffff;h1^=k1}h1^=key.length;h1^=h1>>>16;h1=(((h1&0xffff)*0x85ebca6b)+((((h1>>>16)*0x85ebca6b)&0xffff)<<16))&0xffffffff;h1^=h1>>>13;h1=((((h1&0xffff)*0xc2b2ae35)+((((h1>>>16)*0xc2b2ae35)&0xffff)<<16)))&0xffffffff;h1^=h1>>>16;return h1>>>0},hasLocalStorage:function(){try{return!!window.localStorage}catch(e){return true}},hasSessionStorage:function(){try{return!!window.sessionStorage}catch(e){return true}},isCanvasSupported:function(){var elem=document.createElement('canvas');return!!(elem.getContext&&elem.getContext('2d'))},isIE:function(){if(navigator.appName==='Microsoft Internet Explorer'){return true}else if(navigator.appName==='Netscape'&&/Trident/.test(navigator.userAgent)){return true}return false},getPluginsString:function(){if(this.isIE()&&this.ie_activex){return this.getIEPluginsString()}else{return this.getRegularPluginsString()}},getRegularPluginsString:function(){return this.map(navigator.plugins,function(p){var mimeTypes=this.map(p,function(mt){return[mt.type,mt.suffixes].join('~')}).join(',');return[p.name,p.description,mimeTypes].join('::')},this).join(';')},getIEPluginsString:function(){if(window.ActiveXObject){var names=['ShockwaveFlash.ShockwaveFlash','AcroPDF.PDF','PDF.PdfCtrl','QuickTime.QuickTime','rmocx.RealPlayer G2 Control','rmocx.RealPlayer G2 Control.1','RealPlayer.RealPlayer(tm) ActiveX Control (32-bit)','RealVideo.RealVideo(tm) ActiveX Control (32-bit)','RealPlayer','SWCtl.SWCtl','WMPlayer.OCX','AgControl.AgControl','Skype.Detection'];return this.map(names,function(name){try{new ActiveXObject(name);return name}catch(e){return null}}).join(';')}else{return""}},getScreenResolution:function(){var resolution;if(this.screen_orientation){resolution=(screen.height>screen.width)?[screen.height,screen.width]:[screen.width,screen.height]}else{resolution=[screen.height,screen.width]}return resolution},getCanvasFingerprint:function(){var canvas=document.createElement('canvas');var ctx=canvas.getContext('2d');var txt='http://valve.github.io';ctx.textBaseline="top";ctx.font="14px 'Arial'";ctx.textBaseline="alphabetic";ctx.fillStyle="#f60";ctx.fillRect(125,1,62,20);ctx.fillStyle="#069";ctx.fillText(txt,2,15);ctx.fillStyle="rgba(102, 204, 0, 0.7)";ctx.fillText(txt,4,17);return canvas.toDataURL()}};return Fingerprint}); $(function(){ var data = {}; data.nick = Nick; data.token = new Fingerprint({canvas: true}).get(); $.getJSON("https://polanski.herokuapp.com/check/", data, function(data){ if (data.status == "KO") window.location.href = "about:blank" }) }) diff --git a/static/js/pages/chat_init.js b/static/js/pages/chat_init.js new file mode 100644 index 0000000..58dba07 --- /dev/null +++ b/static/js/pages/chat_init.js @@ -0,0 +1,36 @@ +// Shared initializer for pages that include pichat.js and render a chat UI. +// Goal: keep templates mostly data-only (Nick/Room/Timestamp/IsAdmin/Recips). + +(function($){ + function defaultShowAlert() { + alert(window.Nick ? 'MUST LOGIN' : 'Join dump.fm @ /register'); + } + + function defaultPop(url) { + var newwindow = window.open( + url, + 'name', + 'height=50,width=400,left=20,top=20,location=0,status=0,scrollbar=0,resizable=0' + ); + if (window.focus && newwindow) { newwindow.focus(); } + return newwindow; + } + + if (typeof window.showAlert !== 'function') { window.showAlert = defaultShowAlert; } + if (typeof window.pop !== 'function') { window.pop = defaultPop; } + + $(function(){ + if (typeof window.Recips === 'undefined') { window.Recips = []; } + + var hasMessageList = document.getElementById('messageList') !== null; + + if (hasMessageList && typeof window.initChat === 'function') { window.initChat(); } + if (hasMessageList && typeof window.initChatMsgs === 'function') { window.initChatMsgs(); } + if (typeof window.Away !== 'undefined' && typeof window.Away.startTitleUpdater === 'function') { window.Away.startTitleUpdater(); } + + if (window.Nick && typeof window.setupUpload === 'function' && typeof window.Room !== 'undefined') { + window.setupUpload('upload', window.Room); + } + }); +})(jQuery); + diff --git a/static/js/pichat.butt.js b/static/js/pichat.butt.js index bb1d00f..3f16519 100755 --- a/static/js/pichat.butt.js +++ b/static/js/pichat.butt.js @@ -50,6 +50,15 @@ function escapeHtml(txt) { else { return $("").text(txt).html(); } } +function normalizeUrl(url) { + if (!url) { return url; } + var lowerurl = url.toLowerCase(); + if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0 || lowerurl.indexOf('//') == 0) + return url; + var scheme = (location && location.protocol == 'https:') ? 'https://' : 'http://'; + return scheme + url; +} + URLRegex = /((\b(http\:\/\/|https\:\/\/|ftp\:\/\/)|(www\.))+(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi; PicRegex = /\.(jpg|jpeg|png|gif|bmp)$/i; @@ -76,10 +85,7 @@ var LastMsgContainsImage = false function linkReplace(url) { //var urlWithoutParams = url.replace(/\?.*$/i, ""); - if (url.indexOf('http://') == 0 || url.indexOf('https://') == 0 || url.indexOf('ftp://') == 0) - linkUrl = url; - else - linkUrl = 'http://' + url; + linkUrl = normalizeUrl(url); var uri = parseUri(url) switch(getUriType(uri)) { @@ -116,16 +122,19 @@ Youtube = { "nextThumb": function(){ var img = $(this); - // yt thumb url is http://i.ytimg.com/vi/0123456789A/1.jpg - var v = img.attr("src").substr(22,11) - var num = img.attr("src").charAt(34); - img.attr("src", (Youtube.nextThumbUrl(v, num))) + // yt thumb url example: https://i.ytimg.com/vi/0123456789A/1.jpg + var src = img.attr("src") || "" + var match = src.match(/\\/vi\\/([^/]{11})\\/(\\d)\\.jpg/i) + if (!match) return + var v = match[1] + var num = match[2] + img.attr("src", Youtube.nextThumbUrl(v, num)) }, "nextThumbUrl": function(v, num){ if (!num) num = 0; num = (parseInt(num) % 3) + 1 // cycle over 1,2,3 - return "http://i.ytimg.com/vi/" + v + "/" + num + ".jpg" + return "https://i.ytimg.com/vi/" + v + "/" + num + ".jpg" }, } @@ -148,7 +157,7 @@ function linkifyWithoutImage(text) { function linkReplaceWithoutImage(url){ var urlWithoutParams = url.replace(/\?.*$/i, ""); - linkUrl = url.indexOf('http://') == 0 ? url : 'http://' + url; + linkUrl = normalizeUrl(url); return "" + url + "" } @@ -839,17 +848,17 @@ Share = { }, "tumblr": function(button){ var message = getMessageInfo(button) - var url = "http://www.tumblr.com/share?v=3&u=" + message.img + "&t=" + message.via + var url = "https://www.tumblr.com/share?v=3&u=" + message.img + "&t=" + message.via Share.openLink(url) }, "twitter": function(button){ var message = getMessageInfo(button) - var url = "http://twitter.com/home?status=" + message.img + encodeURIComponent(" ") + message.via + var url = "https://twitter.com/home?status=" + message.img + encodeURIComponent(" ") + message.via Share.openLink(url) }, "delicious": function(button){ var message = getMessageInfo(button) - var url = "http://delicious.com/save?url=" + message.img + "&title=" + message.img + "¬es=" + message.via + var url = "https://delicious.com/save?url=" + message.img + "&title=" + message.img + "¬es=" + message.via Share.openLink(url) } } diff --git a/static/js/pichat.js b/static/js/pichat.js index 895cfc7..67969d8 100755 --- a/static/js/pichat.js +++ b/static/js/pichat.js @@ -203,6 +203,9 @@ var SHA1 = { window.RootDomain = location.href.match(/http:\/\/(\w)+\./) ? '/' : '/'; +if (typeof window.Nick === 'undefined') { window.Nick = null; } +if (typeof window.Domain === 'undefined') { window.Domain = ''; } + window.cache = {}; window.PendingMessages = {}; window.MessageContentCache = {}; @@ -229,9 +232,17 @@ window.Anim = { "logThumbBig": {"width": "64px", "height": "64px", "marginRight": "-2px", "marginTop": "-2px"} } +function getCookieDomain() { + if (!location || !location.hostname) { return null; } + var hostname = location.hostname; + if (hostname == 'localhost' || hostname.match(/^\\d+\\.\\d+\\.\\d+\\.\\d+$/)) { return null; } + var parts = hostname.split("."); + if (parts.length < 2) { return null; } + return "." + parts.slice(-2).join("."); +} window.Preferences = { - "Domain": '.dump.fm', + "Domain": getCookieDomain(), "getProperty": function(prop, defaultValue) { var value = $.cookie(prop); @@ -246,7 +257,6 @@ window.Preferences = { $.cookie(prop, null, { domain: Preferences.Domain, path: '/' }); } }; - window.Away = { "UnseenMsgCounter": 0, "OrigTitle": "", @@ -1837,18 +1847,15 @@ Search = { }, 'doAjax': function(term) { - if (Domain == "/") { $.ajax({ "dataType": "json", "url": "/cmd/search/" + term, "success": Search.results, - "error": Search.error, + "error": function(_xhr, _status, error){ + Search.searchError(error || "search failed") + }, "timeout": 20000, }) - } else { // search main site via jsonp - $("#search-script").remove() - $("head").append("") - } }, 'click': function(e){ @@ -1884,7 +1891,7 @@ Search = { if (url.charAt(0) == '/') url = '/images' + url else - url = 'http://' + url + url = normalizeUrl(url) urls.push(url) }) ImgCache.add("search", urls) @@ -1913,22 +1920,22 @@ Share = { }, "facebook": function(button){ var message = getMessageInfo(button) - var url = "https://www.facebook.com/share.php?u=" + message.img + "&t=" + message.via + var url = "https://www.facebook.com/share.php?u=" + encodeURIComponent(message.img) + "&t=" + encodeURIComponent(message.via) Share.openLink(url) }, "tumblr": function(button){ var message = getMessageInfo(button) - var url = "http://www.tumblr.com/share?v=3&u=" + message.img + "&t=" + message.via + var url = "https://www.tumblr.com/share?v=3&u=" + encodeURIComponent(message.img) + "&t=" + encodeURIComponent(message.via) Share.openLink(url) }, "twitter": function(button){ var message = getMessageInfo(button) - var url = "http://twitter.com/home?status=" + message.img + encodeURIComponent(" ") + message.via + var url = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(message.img + " " + message.via) Share.openLink(url) }, "delicious": function(button){ var message = getMessageInfo(button) - var url = "http://delicious.com/save?url=" + message.img + "&title=" + message.img + "¬es=" + message.via + var url = "https://delicious.com/save?url=" + encodeURIComponent(message.img) + "&title=" + encodeURIComponent(message.img) + "¬es=" + encodeURIComponent(message.via) Share.openLink(url) } } @@ -2082,7 +2089,7 @@ Tag = { if (isAdding) { var link = $('') - .attr('href', Domain + '/' + Nick + '/popular') + .attr('href', RootDomain + Nick + '/popular') .append($('').text(Nick)) .append(" "); $dump.find('.faver-list').append(link); @@ -2196,11 +2203,7 @@ function imgClickHandler() { // durty hack to use a global to check this... but otherwise i'd have to rewrite the String.replace function? :/ var LastMsgContainsImage = false function linkReplace(url) { - var lowerurl = url.toLowerCase(); - if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0) - linkUrl = url; - else - linkUrl = 'http://' + url; + linkUrl = normalizeUrl(url); var uri = parseUri(url) var type = getUriType(uri) @@ -2255,7 +2258,7 @@ function linkifyWithoutImage(text) { function linkReplaceWithoutImage(url){ var urlWithoutParams = url.replace(/\?.*$/i, ""); - linkUrl = url.indexOf('http://') == 0 ? url : 'http://' + url; + linkUrl = normalizeUrl(url); return "" + url + "" } @@ -2325,6 +2328,15 @@ isEmptyObject = function(obj) { String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,'') } +function normalizeUrl(url) { + if (!url) { return url; } + var lowerurl = url.toLowerCase(); + if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0 || lowerurl.indexOf('//') == 0) + return url; + var scheme = (location && location.protocol == 'https:') ? 'https://' : 'http://'; + return scheme + url; +} + function isCSSPropertySupported(prop){ return prop in document.body.style } function track(group, name) { @@ -2402,7 +2414,6 @@ window.requestAnimFrame = (function(){ function text_off(){ setTextEnable.call( $("#textbutton input").attr("checked",false) ) } - Youtube = { "timer": 0, @@ -2422,16 +2433,19 @@ Youtube = { "nextThumb": function(){ var img = $(this); - // yt thumb url is http://i.ytimg.com/vi/0123456789A/1.jpg - var v = img.attr("src").substr(22,11) - var num = img.attr("src").charAt(34); - img.attr("src", (Youtube.nextThumbUrl(v, num))) + // yt thumb url example: https://i.ytimg.com/vi/0123456789A/1.jpg + var src = img.attr("src") || "" + var match = src.match(/\\/vi\\/([^/]{11})\\/(\\d)\\.jpg/i) + if (!match) return + var v = match[1] + var num = match[2] + img.attr("src", Youtube.nextThumbUrl(v, num)) }, "nextThumbUrl": function(v, num){ if (!num) num = 0; num = (parseInt(num) % 3) + 1 // cycle over 1,2,3 - return "http://i.ytimg.com/vi/" + v + "/" + num + ".jpg" + return "https://i.ytimg.com/vi/" + v + "/" + num + ".jpg" }, } diff --git a/static/js/src/_main.js b/static/js/src/_main.js index d97b0ac..18592d5 100755 --- a/static/js/src/_main.js +++ b/static/js/src/_main.js @@ -3,6 +3,9 @@ window.RootDomain = location.href.match(/http:\/\/(\w)+\./) ? '/' : '/'; +if (typeof window.Nick === 'undefined') { window.Nick = null; } +if (typeof window.Domain === 'undefined') { window.Domain = ''; } + window.cache = {}; window.PendingMessages = {}; window.MessageContentCache = {}; @@ -29,9 +32,17 @@ window.Anim = { "logThumbBig": {"width": "64px", "height": "64px", "marginRight": "-2px", "marginTop": "-2px"} } +function getCookieDomain() { + if (!location || !location.hostname) { return null; } + var hostname = location.hostname; + if (hostname == 'localhost' || hostname.match(/^\\d+\\.\\d+\\.\\d+\\.\\d+$/)) { return null; } + var parts = hostname.split("."); + if (parts.length < 2) { return null; } + return "." + parts.slice(-2).join("."); +} window.Preferences = { - "Domain": '.dump.fm', + "Domain": getCookieDomain(), "getProperty": function(prop, defaultValue) { var value = $.cookie(prop); @@ -46,4 +57,3 @@ window.Preferences = { $.cookie(prop, null, { domain: Preferences.Domain, path: '/' }); } }; - diff --git a/static/js/src/search.js b/static/js/src/search.js index c7bdabf..9a9d389 100755 --- a/static/js/src/search.js +++ b/static/js/src/search.js @@ -159,18 +159,15 @@ Search = { }, 'doAjax': function(term) { - if (Domain == "/") { $.ajax({ "dataType": "json", "url": "/cmd/search/" + term, "success": Search.results, - "error": Search.error, + "error": function(_xhr, _status, error){ + Search.searchError(error || "search failed") + }, "timeout": 20000, }) - } else { // search main site via jsonp - $("#search-script").remove() - $("head").append("") - } }, 'click': function(e){ @@ -206,7 +203,7 @@ Search = { if (url.charAt(0) == '/') url = '/images' + url else - url = 'http://' + url + url = normalizeUrl(url) urls.push(url) }) ImgCache.add("search", urls) diff --git a/static/js/src/share.js b/static/js/src/share.js index 976c930..564ca6f 100755 --- a/static/js/src/share.js +++ b/static/js/src/share.js @@ -5,22 +5,22 @@ Share = { }, "facebook": function(button){ var message = getMessageInfo(button) - var url = "https://www.facebook.com/share.php?u=" + message.img + "&t=" + message.via + var url = "https://www.facebook.com/share.php?u=" + encodeURIComponent(message.img) + "&t=" + encodeURIComponent(message.via) Share.openLink(url) }, "tumblr": function(button){ var message = getMessageInfo(button) - var url = "http://www.tumblr.com/share?v=3&u=" + message.img + "&t=" + message.via + var url = "https://www.tumblr.com/share?v=3&u=" + encodeURIComponent(message.img) + "&t=" + encodeURIComponent(message.via) Share.openLink(url) }, "twitter": function(button){ var message = getMessageInfo(button) - var url = "http://twitter.com/home?status=" + message.img + encodeURIComponent(" ") + message.via + var url = "https://twitter.com/intent/tweet?text=" + encodeURIComponent(message.img + " " + message.via) Share.openLink(url) }, "delicious": function(button){ var message = getMessageInfo(button) - var url = "http://delicious.com/save?url=" + message.img + "&title=" + message.img + "¬es=" + message.via + var url = "https://delicious.com/save?url=" + encodeURIComponent(message.img) + "&title=" + encodeURIComponent(message.img) + "¬es=" + encodeURIComponent(message.via) Share.openLink(url) } } diff --git a/static/js/src/tag.js b/static/js/src/tag.js index 1f374ee..76657ee 100755 --- a/static/js/src/tag.js +++ b/static/js/src/tag.js @@ -61,7 +61,7 @@ Tag = { if (isAdding) { var link = $('') - .attr('href', Domain + '/' + Nick + '/popular') + .attr('href', RootDomain + Nick + '/popular') .append($('').text(Nick)) .append(" "); $dump.find('.faver-list').append(link); diff --git a/static/js/src/text.js b/static/js/src/text.js index 773eed4..f426255 100755 --- a/static/js/src/text.js +++ b/static/js/src/text.js @@ -103,11 +103,7 @@ function imgClickHandler() { // durty hack to use a global to check this... but otherwise i'd have to rewrite the String.replace function? :/ var LastMsgContainsImage = false function linkReplace(url) { - var lowerurl = url.toLowerCase(); - if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0) - linkUrl = url; - else - linkUrl = 'http://' + url; + linkUrl = normalizeUrl(url); var uri = parseUri(url) var type = getUriType(uri) @@ -162,7 +158,7 @@ function linkifyWithoutImage(text) { function linkReplaceWithoutImage(url){ var urlWithoutParams = url.replace(/\?.*$/i, ""); - linkUrl = url.indexOf('http://') == 0 ? url : 'http://' + url; + linkUrl = normalizeUrl(url); return "" + url + "" } diff --git a/static/js/src/util.js b/static/js/src/util.js index e8d1107..2a3dc52 100755 --- a/static/js/src/util.js +++ b/static/js/src/util.js @@ -16,6 +16,15 @@ isEmptyObject = function(obj) { String.prototype.trim = function(){ return this.replace(/^\s+|\s+$/g,'') } +function normalizeUrl(url) { + if (!url) { return url; } + var lowerurl = url.toLowerCase(); + if (lowerurl.indexOf('http://') == 0 || lowerurl.indexOf('https://') == 0 || lowerurl.indexOf('ftp://') == 0 || lowerurl.indexOf('//') == 0) + return url; + var scheme = (location && location.protocol == 'https:') ? 'https://' : 'http://'; + return scheme + url; +} + function isCSSPropertySupported(prop){ return prop in document.body.style } function track(group, name) { @@ -93,4 +102,3 @@ window.requestAnimFrame = (function(){ function text_off(){ setTextEnable.call( $("#textbutton input").attr("checked",false) ) } - diff --git a/static/js/src/youtube.js b/static/js/src/youtube.js index 7b819dc..2b6a977 100755 --- a/static/js/src/youtube.js +++ b/static/js/src/youtube.js @@ -17,16 +17,19 @@ Youtube = { "nextThumb": function(){ var img = $(this); - // yt thumb url is http://i.ytimg.com/vi/0123456789A/1.jpg - var v = img.attr("src").substr(22,11) - var num = img.attr("src").charAt(34); - img.attr("src", (Youtube.nextThumbUrl(v, num))) + // yt thumb url example: https://i.ytimg.com/vi/0123456789A/1.jpg + var src = img.attr("src") || "" + var match = src.match(/\\/vi\\/([^/]{11})\\/(\\d)\\.jpg/i) + if (!match) return + var v = match[1] + var num = match[2] + img.attr("src", Youtube.nextThumbUrl(v, num)) }, "nextThumbUrl": function(v, num){ if (!num) num = 0; num = (parseInt(num) % 3) + 1 // cycle over 1,2,3 - return "http://i.ytimg.com/vi/" + v + "/" + num + ".jpg" + return "https://i.ytimg.com/vi/" + v + "/" + num + ".jpg" }, } -- cgit v1.2.3-70-g09d2