Skip to content

Instantly share code, notes, and snippets.

@cafreamoroso
Created April 9, 2012 09:32
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cafreamoroso/2342509 to your computer and use it in GitHub Desktop.
Save cafreamoroso/2342509 to your computer and use it in GitHub Desktop.
ShimLink Link Protector
ShimLink = {
_hosts: {
your: 'your.host.com',
another: 'another.host.com',
www: 'www.host.com',
tld: 'host.com',
},
parse_url: function(str, component) {
// * returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}
var key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port',
'relative', 'path', 'directory', 'file', 'query', 'fragment'],
ini = (this.php_js && this.php_js.ini) || {},
mode = (ini['phpjs.parse_url.mode'] &&
ini['phpjs.parse_url.mode'].local_value) || 'php',
parser = {
php: /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
};
var m = parser[mode].exec(str),
uri = {},
i = 14;
while (i--) {
if (m[i]) {
uri[key[i]] = m[i];
}
}
if (component) {
return uri[component.replace('PHP_URL_', '').toLowerCase()];
}
if (mode !== 'php') {
var name = (ini['phpjs.parse_url.queryKey'] &&
ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
uri[name] = {};
uri[key[12]].replace(parser, function ($0, $1, $2) {
if ($1) {uri[name][$1] = $2;}
});
}
delete uri.source;
return uri;
},
_endpoint: {
url: 'http://where.host.com/youwanttoredirect?l='
},
process: function(link) {
url = this.parse_url(link);
if (this.is_local(url.host)) {
window.location = link;
return true;
}
else {
this.shim(link);
return true;
}
},
shim: function(link) {
var sl = this._endpoint.url+encodeURIComponent(link);
window.location = sl;
return false;
},
is_local: function(host) {
for (var key in this._hosts) {
if (this._hosts.hasOwnProperty(key)) {
if (host == this._hosts[key]) {
return true;
}
}
}
return false;
}
}
document.onclick = function (e) {
e = e || window.event;
var element = e.target || e.srcElement;
if (element.tagName == 'A') {
ShimLink.process(element.href);
return false;
}
else {
return true;
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment