미디어위키:Gadget-ProtectCGI.js: 두 판 사이의 차이

리버티게임(개발), 모두가 만들어가는 자유로운 게임
둘러보기로 이동 검색으로 이동
imported>Senouis
편집 요약 없음
imported>Senouis
(1월 13일 hsl0님 요청)
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
53번째 줄: 53번째 줄:


registerHandler(function() {
registerHandler(function() {
function hijack(link) {
var title;
if(link.href && link.href != location.href) location.replace(link.href);
else if(data) {
data = JSON.parse(data);
title = data.title;
delete data.title;
location.replace(mw.util.getUrl(title, data));
} else if(document.referrer) history.back();
else location.replace(mw.util.getUrl(getTitle(mw.config.get('wgPageName'))));
}
if(protect) (function() {
if(protect) (function() {
var clicked;
var clicked;
61번째 줄: 74번째 줄:
if(this.dataset.wait <= 0) {
if(this.dataset.wait <= 0) {
event.stopImmediatePropagation();
event.stopImmediatePropagation();
if(this.href) location.replace(this.href);
hijack(this);
}
}
} else if(this.href) location.replace(this.href);
} else hijack(this);
} else {
} else {
clicked = this;
clicked = this;
106번째 줄: 119번째 줄:
OO.ui.confirm('비상 저장된 세션이 있습니다. 다시 돌아가겠습니까?').then(function(res) {
OO.ui.confirm('비상 저장된 세션이 있습니다. 다시 돌아가겠습니까?').then(function(res) {
var data = JSON.parse(temp);
var data = JSON.parse(temp);
var title;
if(res && !compareObject(params, data)) {
if(res && !compareObject(params, data)) {
title = data.title;
delete data.title;
location.href = mw.util.getUrl(data.title, data);
location.href = mw.util.getUrl(data.title, data);
}
}
116번째 줄: 132번째 줄:
if(cheat) {
if(cheat) {
if(link) link.click();
if(link.length) link.click();
else if(data) {
else if(data) {
title = data.title;
title = data.title;
122번째 줄: 138번째 줄:
location.replace(mw.util.getUrl(title, data));
location.replace(mw.util.getUrl(title, data));
}
}
else history.back();
else if(document.referrer) history.back();
else location.replace(mw.util.getUrl(getTitle(mw.config.get('wgPageName'))));
}
}
document.body.classList.add('protectCGI-done');
if(cheat === false) {
document.body.classList.add('protectCGI-done');
$('.protectCGI-only').show();
}
});
});
})();
})();

2021년 1월 13일 (수) 17:04 기준 최신판

/**
 * [[틀:CGI보호]]
 * CGI나 주소를 조작하지 못하게 합니다.
 * 제작자: [[사용자:hsl0|hsl0]]
**/
(function protectCGI() {
	function getTitle(pagename) {
		pagename = pagename.split('/')[0].split(':');
		var ns = pagename[0].replace(/talk|토론/gi, '');
		return ns + (ns && ':') + pagename[1];
	}
	
	function compareObject(a, b) {
		var aKey = Object.keys(a);
		var bKey = Object.keys(b);
		
		if(aKey.length !== bKey.length) return false;
		
		for(var key in a) {
			if(a[key] !== b[key]) return false;
		}
		
		return true;
	}
	
	function filterLink() {
		var href = new URL(this.href, location);
		var params = geturlSearch(href);
		
		if(href.host !== location.host) return false;
		if(params.action || params.oldid) return false;
		if(href.pathname.startsWith('/wiki/')) params.title = href.pathname.slice(6);
		if(getTitle(params.title) !== title) return false;
		
		$(this).data('params', params);
		
		return true;
	}
	
	var params = geturlSearch();
	params.title = mw.config.get('wgPageName');
	var title = getTitle(params.title);
	var protect = document.getElementById('protectCGI');
	var cheat = null;
	var temp = localStorage.getItem('protectCGI-temp');
	var data = sessionStorage.getItem('protectCGI');
	var link;
	
	registerRenderer(function() {
		$('.protectCGI-link-container a').filter(filterLink).addClass('protectCGI-link');
		$('.protectCGI-link-container a:not(.protectCGI-link)').addClass('protectCGI-link-no');
	});

	registerHandler(function() {
		function hijack(link) {
			var title;
			
			if(link.href && link.href != location.href) location.replace(link.href);
			else if(data) {
				data = JSON.parse(data);
				title = data.title;
				delete data.title;
				location.replace(mw.util.getUrl(title, data));
			} else if(document.referrer) history.back();
			else location.replace(mw.util.getUrl(getTitle(mw.config.get('wgPageName'))));
		}
		
		if(protect) (function() {
			var clicked;
			link = $(protect).find('a').click(function(event) {
				event.preventDefault();
				if(this === clicked) {
					if('wait' in this.dataset) {
						if(this.dataset.wait <= 0) {
							event.stopImmediatePropagation();
							hijack(this);
						}
					} else hijack(this);
				} else {
					clicked = this;
					this.click();
				}
			});

			if(params.action || params.oldid) return;
			else cheat = false;
			
			if(data) {
				data = JSON.parse(data);
				cheat = !compareObject(data, params);
			} else cheat = true;
		})();
		else if(!(params.action || params.oldid)) cheat = false;
		
		if(cheat === false) $('.protectCGI-link').click(function(event) {
			sessionStorage.setItem('protectCGI', JSON.stringify($(this).data('params')));
			if(protect) {
				event.preventDefault();
				location.replace(this.href);
			}
		});
		
		window.addEventListener('hashchange', function(event) {
			var data, dataObj;
			if(location.hash.endsWith('##emergency-save')) {
				data = sessionStorage.getItem('protectCGI');
				if(data) dataObj = JSON.parse(data);
				if(data && dataObj.title === params.title) localStorage.setItem('protectCGI-temp', data);
			}
		});
	});
	
	registerTrigger(function() {
		if(temp) {
			if(!data) {
				sessionStorage.setItem('protectCGI', temp);
				data = temp;
				mw.loader.using('oojs-ui-windows').then(function() {
					OO.ui.confirm('비상 저장된 세션이 있습니다. 다시 돌아가겠습니까?').then(function(res) {
						var data = JSON.parse(temp);
						var title;
						if(res && !compareObject(params, data)) {
							title = data.title;
							delete data.title;
							location.href = mw.util.getUrl(data.title, data);
						}
					});
				});
			}
			localStorage.removeItem('protectCGI-temp');
		}
		
		if(cheat) {
			if(link.length) link.click();
			else if(data) {
				title = data.title;
				delete data.title;
				location.replace(mw.util.getUrl(title, data));
			}
			else if(document.referrer) history.back();
			else location.replace(mw.util.getUrl(getTitle(mw.config.get('wgPageName'))));
		}
		
		if(cheat === false) {
			document.body.classList.add('protectCGI-done');
			$('.protectCGI-only').show();
		}
	});	
})();