미디어위키:Gadget-PluginX.js: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
>BANIP (PluginX 버전업) |
잔글 (alert -> warning) |
||
(사용자 2명의 중간 판 11개는 보이지 않습니다) | |||
4번째 줄: | 4번째 줄: | ||
* 작성자: [[사용자:Bd3076|Bd3076]] | * 작성자: [[사용자:Bd3076|Bd3076]] | ||
* v2.0.0 전체수정 --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 7월 9일 (일) 23:20 (KST) | * v2.0.0 전체수정 --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 7월 9일 (일) 23:20 (KST) | ||
* v2.0.1 스크립트 해쉬값 검증 추가 --[[사용자:BANIP|BANIP]] 2023년 7월 10일 (월) 09:53 (KST) | |||
* v2.0.2 자바스크립트가 위키텍스트로 파싱되는 문제 수정에 대한 스크립트쪽 소스 대응 --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 9월 4일 (월) 10:40 (KST) | |||
*/ | */ | ||
function pluginXCore() { | function pluginXCore() { | ||
18번째 줄: | 20번째 줄: | ||
// 이미 추가된 플러그인이면 추가하지 않음 | // 이미 추가된 플러그인이면 추가하지 않음 | ||
if (pluginItems.find(function(item) { return item.url == url; })) return; | if (pluginItems.find(function(item) { return item.url == url; })) return; | ||
var script = $this.text(); | |||
// 플러그인 목록에 추가 | // 플러그인 목록에 추가 | ||
pluginItems.push({ | pluginItems.push({ | ||
25번째 줄: | 28번째 줄: | ||
doc: $this.data('doc'), | doc: $this.data('doc'), | ||
revid: $this.data('rev-id'), | revid: $this.data('rev-id'), | ||
script: | script: script, | ||
revTimestamp: $this.data('rev-timestamp'), | revTimestamp: $this.data('rev-timestamp'), | ||
revUser: $this.data('rev-user'), | revUser: $this.data('rev-user'), | ||
scriptHash:cyrb53(script), | |||
}); | }); | ||
}); | }); | ||
return pluginItems; | return pluginItems; | ||
} | }; | ||
var cyrb53 = function(str, seed){ | |||
if(seed === undefined) seed = 0; | |||
var h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed; | |||
for(var i = 0, ch; i < str.length; i++) { | |||
ch = str.charCodeAt(i); | |||
h1 = Math.imul(h1 ^ ch, 2654435761); | |||
h2 = Math.imul(h2 ^ ch, 1597334677); | |||
} | |||
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507); | |||
h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909); | |||
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507); | |||
h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909); | |||
return 4294967296 * (2097151 & h2) + (h1 >>> 0); | |||
}; | |||
var setting = { | var setting = { | ||
STORAGE_IDENTIFIER: "gadget-pluginx", | |||
DEFAULT_CONFIG_TEXT:'{"trusted": [], "resetflag": ' + new Date().getTime() + ' }', | |||
get: function(){ | get: function(){ | ||
// trusted: {doc:string, revid, revUser:string, revTimestamp:string, }[] | // trusted: {doc:string, revid, revUser:string, revTimestamp:string, }[] | ||
return JSON.parse(localStorage.getItem(setting. | return JSON.parse(localStorage.getItem(setting.STORAGE_IDENTIFIER) || setting.DEFAULT_CONFIG_TEXT); | ||
}, | }, | ||
getTrustedItems: function(){ | getTrustedItems: function(){ | ||
48번째 줄: | 69번째 줄: | ||
}, | }, | ||
set: function(data){ | set: function(data){ | ||
localStorage.setItem(setting. | localStorage.setItem(setting.STORAGE_IDENTIFIER, JSON.stringify(data)); | ||
}, | }, | ||
setTrustedItems: function(items){ | setTrustedItems: function(items){ | ||
58번째 줄: | 79번째 줄: | ||
revUser : item.revUser, | revUser : item.revUser, | ||
doc : item.doc, | doc : item.doc, | ||
scriptHash : item.scriptHash, | |||
}; | }; | ||
var index = data.trusted.findIndex(function(trustedItem){ return trustedItem.doc == item.doc; }); | var index = data.trusted.findIndex(function(trustedItem){ return trustedItem.doc == item.doc; }); | ||
68번째 줄: | 90번째 줄: | ||
setting.set(data); | setting.set(data); | ||
} | }, | ||
reset: function(){ | |||
localStorage.setItem(setting.STORAGE_IDENTIFIER,setting.DEFAULT_CONFIG_TEXT); | |||
}, | |||
}; | }; | ||
93번째 줄: | 118번째 줄: | ||
+ '<div class="pluginx-popup-footer">' | + '<div class="pluginx-popup-footer">' | ||
+ '<div class="pluginx-trust-check-wrapper">' | + '<div class="pluginx-trust-check-wrapper">' | ||
+ '<input type="checkbox" id="pluginx-trust-check" />' | + '<input type="checkbox" id="pluginx-trust-check" checked="checked" />' | ||
+ '<label for="pluginx-trust-check"> | + '<label for="pluginx-trust-check" >다시 묻지 않기</label>' | ||
+ '</div>' | + '</div>' | ||
+ '<div class="pluginx-btn-accept pluginx-close pluginx-btn">사용</div>' | + '<div class="pluginx-btn-accept pluginx-close pluginx-btn">사용</div>' | ||
100번째 줄: | 125번째 줄: | ||
+ '</div>' | + '</div>' | ||
+ '</div>' | + '</div>' | ||
+ '</div>') | + '</div>'); | ||
// 만든팝업 캐싱 | // 만든팝업 캐싱 | ||
127번째 줄: | 152번째 줄: | ||
$popupWrapper.find(".pluginx-btn-deny").click(function(){ | $popupWrapper.find(".pluginx-btn-deny").click(function(){ | ||
closePopup(rejectCallback); | closePopup(rejectCallback); | ||
}) | }); | ||
return $popupWrapper | return $popupWrapper; | ||
}, | }, | ||
150번째 줄: | 175번째 줄: | ||
$plugin.find(".pluginx-popup-code").text(pluginItem.script); // 자동 이스케이프 | $plugin.find(".pluginx-popup-code").text(pluginItem.script); // 자동 이스케이프 | ||
$plugin.find(".pluginx-popup-summary").append("<li> 플러그인 이름 : " + pluginItem.name + "</li>"); | |||
$plugin.find(".pluginx-popup-summary").append("<li> 원본문서 : " + pluginItem.doc + "</li>"); | $plugin.find(".pluginx-popup-summary").append("<li> 원본문서 : " + pluginItem.doc + "</li>"); | ||
$plugin.find(".pluginx-popup-summary").append("<li> | $plugin.find(".pluginx-popup-summary").append("<li> 원본 문서 편집자 : " + pluginItem.creator + "</li>"); | ||
$plugin.find(".pluginx-popup-summary").append("<li> 수정자 : " + pluginItem.revUser + "</li>"); | $plugin.find(".pluginx-popup-summary").append("<li> 스크립트 수정자 : " + pluginItem.revUser + "</li>"); | ||
$plugin.find(".pluginx-popup-summary").append("<li> 수정일 : " + formatTimestamp(pluginItem.revTimestamp) + "</li>"); | $plugin.find(".pluginx-popup-summary").append("<li> 수정일 : " + formatTimestamp(pluginItem.revTimestamp) + "</li>"); | ||
var patternList = [ | var patternList = [ | ||
{ // 이전 신뢰된 편집자와 현재 편집자가 다른 경우 | { // 이전 신뢰된 편집자와 현재 편집자가 다른 경우 | ||
ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid && pluginItem.prevTrusted.revUser !== pluginItem.revUser; }, | ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid && pluginItem.prevTrusted.revUser !== pluginItem.revUser; }, | ||
severity: " | severity: "warning", | ||
message: "이전 신뢰된 편집자와 현재 편집자가 다릅니다. 사용자를 | message: "이전 신뢰된 편집자와 현재 편집자가 다릅니다. 사용자를 확인하시고 토론 문서 등에 스크립트 수정에 관한 언급이 없는 사용자가 편집한 경우 실행하지 않는 것을 권장합니다. 그래도 실행을 허용하려면 5초 간 기다려주세요.", | ||
}, | }, | ||
{ // 신뢰된 버전과 현재 버전의 리비전이 동일한 경우 | { // 신뢰된 버전과 현재 버전의 리비전이 동일한 경우 | ||
ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid === pluginItem.revid; }, | ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid === pluginItem.revid | ||
&& pluginItem.prevTrusted.revUser === pluginItem.revUser | |||
&& pluginItem.prevTrusted.scriptHash === pluginItem.scriptHash; | |||
}, | |||
severity: "safe", | severity: "safe", | ||
message: "이전에 신뢰된 플러그인입니다.", | message: "이전에 신뢰된 플러그인입니다.", | ||
173번째 줄: | 202번째 줄: | ||
severity: "safe", | severity: "safe", | ||
message: "이전에 신뢰되었지만 버전업으로 재확인이 필요합니다.", | message: "이전에 신뢰되었지만 버전업으로 재확인이 필요합니다.", | ||
}, | |||
{ // 이전에 신뢰된 버전이랑 리비전은 같은데 스크립트 해쉬가 다른 경우 | |||
ciritica: function(pluginItem){ | |||
return pluginItem.prevTrusted.revid === pluginItem.revid | |||
&& pluginItem.prevTrusted.scriptHash !== pluginItem.scriptHash | |||
&& pluginItem.prevTrusted.scriptHash; | |||
}, | |||
severity: "danger", | |||
message: "이전에 신뢰된 버전과 스크립트가 다른걸로 확인됩니다. 스크립트가 조작되었거나 PluginX 자체가 고장났을 가능성이 크므로, 설치하지 말고 관리자에게 알려주세요.", | |||
}, | |||
{ // 이전버전 해쉬가 없을때(스크립트 해쉬를 사용하지 않는 구버전 스크립트를 사용했을 때) | |||
ciritica: function(pluginItem){ | |||
return pluginItem.prevTrusted.revid === pluginItem.revid | |||
&& pluginItem.prevTrusted.scriptHash !== pluginItem.scriptHash | |||
&& !pluginItem.prevTrusted.scriptHash; | |||
}, | |||
severity: "safe", | |||
message: "이전에 신뢰된 스크립트이나 플러그인X 버전업으로 재확인이 필요합니다.", | |||
}, | }, | ||
]; | ]; | ||
181번째 줄: | 228번째 줄: | ||
$plugin.find(".pluginx-popup-summary").append("<li class='severity " + pattern.severity + "'>" + pattern.message + "</li>"); | $plugin.find(".pluginx-popup-summary").append("<li class='severity " + pattern.severity + "'>" + pattern.message + "</li>"); | ||
// danger일 때 저장링크 비활성화 | |||
if(pattern.severity === "danger"){ | |||
$popupWrapper.find(".pluginx-btn-accept").remove(); | |||
} else if (pattern.severity === "warning") { | |||
// warning의 경우 저장 링크를 숨기고, 5초 기다려야 허용 버튼이 뜬다. | |||
$popupWrapper.find(".pluginx-btn-accept").hide(); | |||
$popupWrapper.find(".pluginx-btn-accept").show(5000); | |||
} | |||
} | } | ||
} | } | ||
189번째 줄: | 244번째 줄: | ||
})}, | })}, | ||
}; | }; | ||
var executePluginItems = function(pluginItems){ | |||
pluginItems.forEach(function(pluginItem){ | |||
eval(pluginItem.script); | |||
}); | |||
var pluginNames = pluginItems.map(function(pluginItem){ return pluginItem.name; }).join(", "); | |||
$("#siteSub").text(function(i,prev){ return prev + " - PluginX " + pluginNames + " 사용중"}); | |||
}; | |||
/* -------------- 플러그인 체크 로직 시작 ---------------- */ | |||
// 신뢰여부 리셋 관련 | |||
(function(){ | |||
// 사용자 플러그인의 전체 신뢰 여부를 리셋할 필요가 있을 경우 (new Date().getTime()) 값으로 아래 상수를 수정 해 주세요 | |||
var LAST_RESET_TIME = 1693787747000; | |||
var settingInstance = setting.get(); | |||
if( (settingInstance.resetflag || 0) < LAST_RESET_TIME ){ | |||
setting.reset(); | |||
} | |||
})(); | |||
// 문서에서 사용중인 플러그인 확인 | // 문서에서 사용중인 플러그인 확인 | ||
200번째 줄: | 276번째 줄: | ||
// 플러그인의 신뢰여부 확인 | // 플러그인의 신뢰여부 확인 | ||
var isPluginTrusted = pluginItems.every(function(pluginItem){ | var isPluginTrusted = pluginItems.every(function(pluginItem){ | ||
return pluginItem.prevTrusted. | return pluginItem.prevTrusted.revid === pluginItem.revid && pluginItem.prevTrusted.scriptHash === pluginItem.scriptHash; | ||
}); | }); | ||
// | // 기존 pluginx-need-alert 삭제 | ||
$("#bodyContent .mw-parser-output .pluginx-need-alert").remove(); | |||
if( isPluginTrusted ){ | |||
// 스크립트 실행 | // 스크립트 실행 | ||
pluginItems. | executePluginItems(pluginItems); | ||
} else { | |||
var requestAlert = $('<div class="pluginx-need-alert mw-message-box-success mw-message-box"><p><strong><a>이 문서를 정상적으로 보려면 스크립트 허용이 필요해요.</a></strong></p></div>') | |||
$("#bodyContent .mw-parser-output").prepend(requestAlert); | |||
requestAlert.find("a").click(function(){ | |||
// todo localstoarge에서 대조 후 리비전이 다를때만 사용자 확인 필요 | |||
installPopup.show(pluginItems).then(function(result){ | |||
result = result || {}; | |||
// 사용자가 플러그인을 신뢰할 경우 localStoarge에 저장 | |||
if(result.trust){ | |||
setting.setTrustedItems(pluginItems); | |||
} | |||
// 스크립트 실행 | |||
executePluginItems(pluginItems); | |||
requestAlert.remove(); | |||
}); | |||
}); | }); | ||
} | } | ||
} | } | ||
$(pluginXCore); | $(pluginXCore); |
2023년 9월 4일 (월) 13:03 기준 최신판
/**
* pluginX Core
* pluginX 시스템이 제대로 돌아가게 해 줍니다.
* 작성자: [[사용자:Bd3076|Bd3076]]
* v2.0.0 전체수정 --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 7월 9일 (일) 23:20 (KST)
* v2.0.1 스크립트 해쉬값 검증 추가 --[[사용자:BANIP|BANIP]] 2023년 7월 10일 (월) 09:53 (KST)
* v2.0.2 자바스크립트가 위키텍스트로 파싱되는 문제 수정에 대한 스크립트쪽 소스 대응 --[[사용자:BANIP|BANIP]] ([[사용자토론:BANIP|토론]]) 2023년 9월 4일 (월) 10:40 (KST)
*/
function pluginXCore() {
//pluginX를 문서에서 사용하지 않으면 종료
if ($("#bodyContent .pluginx-script-wrapper").length == 0) return;
// 플러그인 목록 반환
var getPluginList = function() {
var pluginItems = [];
/// 현재 문서 페이지에서 필요한 플러그인 수집
$("#bodyContent .pluginx-script-wrapper").each(function() {
var $this = $(this);
var url = $this.data('url');
// 이미 추가된 플러그인이면 추가하지 않음
if (pluginItems.find(function(item) { return item.url == url; })) return;
var script = $this.text();
// 플러그인 목록에 추가
pluginItems.push({
url: url,
name: $this.data('name'),
creator: $this.data('creator'),
doc: $this.data('doc'),
revid: $this.data('rev-id'),
script: script,
revTimestamp: $this.data('rev-timestamp'),
revUser: $this.data('rev-user'),
scriptHash:cyrb53(script),
});
});
return pluginItems;
};
var cyrb53 = function(str, seed){
if(seed === undefined) seed = 0;
var h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
for(var i = 0, ch; i < str.length; i++) {
ch = str.charCodeAt(i);
h1 = Math.imul(h1 ^ ch, 2654435761);
h2 = Math.imul(h2 ^ ch, 1597334677);
}
h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);
h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);
h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);
h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);
return 4294967296 * (2097151 & h2) + (h1 >>> 0);
};
var setting = {
STORAGE_IDENTIFIER: "gadget-pluginx",
DEFAULT_CONFIG_TEXT:'{"trusted": [], "resetflag": ' + new Date().getTime() + ' }',
get: function(){
// trusted: {doc:string, revid, revUser:string, revTimestamp:string, }[]
return JSON.parse(localStorage.getItem(setting.STORAGE_IDENTIFIER) || setting.DEFAULT_CONFIG_TEXT);
},
getTrustedItems: function(){
return setting.get().trusted;
},
getTrustedItemByDoc: function(doc){
return setting.getTrustedItems().find(function(item){ return item.doc == doc; });
},
set: function(data){
localStorage.setItem(setting.STORAGE_IDENTIFIER, JSON.stringify(data));
},
setTrustedItems: function(items){
var data = setting.get();
items.forEach(function(item){
var itemForPush = {
revid : item.revid,
revTimestamp : item.revTimestamp,
revUser : item.revUser,
doc : item.doc,
scriptHash : item.scriptHash,
};
var index = data.trusted.findIndex(function(trustedItem){ return trustedItem.doc == item.doc; });
if(index == -1){
data.trusted.push(itemForPush);
}else{
data.trusted[index] = itemForPush;
}
});
setting.set(data);
},
reset: function(){
localStorage.setItem(setting.STORAGE_IDENTIFIER,setting.DEFAULT_CONFIG_TEXT);
},
};
var installPopup = {
// 플러그인 인스톨 페이지 가져오기
_getPopupElement:function(option){
option = option || {};
resolveCallback = option.resolveCallback || function(){};
rejectCallback = option.rejectCallback || function(){};
if(installPopup._$popupWrapper === undefined){
// 설치 팝업 생성
var $popupWrapperOrigin = $(''
+ '<div class="pluginx-popup-wrapper">'
+ '<div class="pluginx-popup">'
+ '<div class="pluginx-popup-header">'
+ '<div class="pluginx-popup-title">플러그인 설치가 필요합니다.</div>'
+ '</div>'
+ '<div class="pluginx-popup-content-wrapper">'
+ '<div class="pluginx-popup-content">'
+ '<div class="pluginx-popup-code"></div>'
+ '<div class="pluginx-popup-summary"></div>'
+ '</div>'
+ '</div>'
+ '<div class="pluginx-popup-footer">'
+ '<div class="pluginx-trust-check-wrapper">'
+ '<input type="checkbox" id="pluginx-trust-check" checked="checked" />'
+ '<label for="pluginx-trust-check" >다시 묻지 않기</label>'
+ '</div>'
+ '<div class="pluginx-btn-accept pluginx-close pluginx-btn">사용</div>'
+ '<div class="pluginx-btn-deny pluginx-close pluginx-btn">거부</div>'
+ '</div>'
+ '</div>'
+ '</div>');
// 만든팝업 캐싱
installPopup._$popupWrapper = $popupWrapperOrigin;
}
var $popupWrapper = installPopup._$popupWrapper.clone();
var closePopup = function(callback){
$popupWrapper.closest(".pluginx-popup-wrapper").fadeOut(0.3, function(){
$popupWrapper.remove();
callback($popupWrapper);
});
};
// 팝업 외부 클릭시 팝업 종료
$popupWrapper.click(function(e){
if(e.target == $popupWrapper[0]){
closePopup(rejectCallback);
}
})
// 팝업 종료 이벤트
$popupWrapper.find(".pluginx-btn-accept").click(function(){
closePopup(resolveCallback);
});
$popupWrapper.find(".pluginx-btn-deny").click(function(){
closePopup(rejectCallback);
});
return $popupWrapper;
},
// 플러그인 인스톨 페이지에 설정값 바인딩 후 표시
show:function(pluginItems){ return new Promise(function(resolve, reject){
var $popupWrapper = installPopup._getPopupElement({
resolveCallback: function($popupWrapper){ resolve({
trust: $popupWrapper.find("#pluginx-trust-check").is(":checked"),
}); },
rejectCallback: function(){ reject(); },
});
var formatTimestamp = function(timestamp){
timestamp = timestamp.toString();
return timestamp.substring(0,4) + "-" + timestamp.substring(4,6) + "-" + timestamp.substring(6,8) + " " + timestamp.substring(8,10) + ":" + timestamp.substring(10,12) + ":" + timestamp.substring(12,14);
};
pluginItems.forEach(function(pluginItem){
var $plugin = $popupWrapper.find(".pluginx-popup-content").eq(0).clone().css({display: "block"});
$plugin.find(".pluginx-popup-code").text(pluginItem.script); // 자동 이스케이프
$plugin.find(".pluginx-popup-summary").append("<li> 플러그인 이름 : " + pluginItem.name + "</li>");
$plugin.find(".pluginx-popup-summary").append("<li> 원본문서 : " + pluginItem.doc + "</li>");
$plugin.find(".pluginx-popup-summary").append("<li> 원본 문서 편집자 : " + pluginItem.creator + "</li>");
$plugin.find(".pluginx-popup-summary").append("<li> 스크립트 수정자 : " + pluginItem.revUser + "</li>");
$plugin.find(".pluginx-popup-summary").append("<li> 수정일 : " + formatTimestamp(pluginItem.revTimestamp) + "</li>");
var patternList = [
{ // 이전 신뢰된 편집자와 현재 편집자가 다른 경우
ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid && pluginItem.prevTrusted.revUser !== pluginItem.revUser; },
severity: "warning",
message: "이전 신뢰된 편집자와 현재 편집자가 다릅니다. 사용자를 확인하시고 토론 문서 등에 스크립트 수정에 관한 언급이 없는 사용자가 편집한 경우 실행하지 않는 것을 권장합니다. 그래도 실행을 허용하려면 5초 간 기다려주세요.",
},
{ // 신뢰된 버전과 현재 버전의 리비전이 동일한 경우
ciritica: function(pluginItem){ return pluginItem.prevTrusted.revid === pluginItem.revid
&& pluginItem.prevTrusted.revUser === pluginItem.revUser
&& pluginItem.prevTrusted.scriptHash === pluginItem.scriptHash;
},
severity: "safe",
message: "이전에 신뢰된 플러그인입니다.",
},
{// 이전에 신뢰되었지만 현재 버전이 다른 경우
ciritica: function(pluginItem){
return pluginItem.prevTrusted.revid
&& pluginItem.prevTrusted.revid !== pluginItem.revid
&& pluginItem.prevTrusted.revUser === pluginItem.revUser;
},
severity: "safe",
message: "이전에 신뢰되었지만 버전업으로 재확인이 필요합니다.",
},
{ // 이전에 신뢰된 버전이랑 리비전은 같은데 스크립트 해쉬가 다른 경우
ciritica: function(pluginItem){
return pluginItem.prevTrusted.revid === pluginItem.revid
&& pluginItem.prevTrusted.scriptHash !== pluginItem.scriptHash
&& pluginItem.prevTrusted.scriptHash;
},
severity: "danger",
message: "이전에 신뢰된 버전과 스크립트가 다른걸로 확인됩니다. 스크립트가 조작되었거나 PluginX 자체가 고장났을 가능성이 크므로, 설치하지 말고 관리자에게 알려주세요.",
},
{ // 이전버전 해쉬가 없을때(스크립트 해쉬를 사용하지 않는 구버전 스크립트를 사용했을 때)
ciritica: function(pluginItem){
return pluginItem.prevTrusted.revid === pluginItem.revid
&& pluginItem.prevTrusted.scriptHash !== pluginItem.scriptHash
&& !pluginItem.prevTrusted.scriptHash;
},
severity: "safe",
message: "이전에 신뢰된 스크립트이나 플러그인X 버전업으로 재확인이 필요합니다.",
},
];
for(var patternKey in patternList){
var pattern = patternList[patternKey];
if(pattern.ciritica(pluginItem)){
$plugin.find(".pluginx-popup-summary").append("<li class='severity " + pattern.severity + "'>" + pattern.message + "</li>");
// danger일 때 저장링크 비활성화
if(pattern.severity === "danger"){
$popupWrapper.find(".pluginx-btn-accept").remove();
} else if (pattern.severity === "warning") {
// warning의 경우 저장 링크를 숨기고, 5초 기다려야 허용 버튼이 뜬다.
$popupWrapper.find(".pluginx-btn-accept").hide();
$popupWrapper.find(".pluginx-btn-accept").show(5000);
}
}
}
$popupWrapper.find(".pluginx-popup-content-wrapper").append($plugin);
});
$popupWrapper.appendTo("body").fadeIn(0.2);
})},
};
var executePluginItems = function(pluginItems){
pluginItems.forEach(function(pluginItem){
eval(pluginItem.script);
});
var pluginNames = pluginItems.map(function(pluginItem){ return pluginItem.name; }).join(", ");
$("#siteSub").text(function(i,prev){ return prev + " - PluginX " + pluginNames + " 사용중"});
};
/* -------------- 플러그인 체크 로직 시작 ---------------- */
// 신뢰여부 리셋 관련
(function(){
// 사용자 플러그인의 전체 신뢰 여부를 리셋할 필요가 있을 경우 (new Date().getTime()) 값으로 아래 상수를 수정 해 주세요
var LAST_RESET_TIME = 1693787747000;
var settingInstance = setting.get();
if( (settingInstance.resetflag || 0) < LAST_RESET_TIME ){
setting.reset();
}
})();
// 문서에서 사용중인 플러그인 확인
var pluginItems = getPluginList();
// 모든 플러그인의 신뢰여부 체크
pluginItems = pluginItems.map(function(pluginItem){
return Object.assign(pluginItem, {prevTrusted: setting.getTrustedItemByDoc(pluginItem.doc) || {}});
});
// 플러그인의 신뢰여부 확인
var isPluginTrusted = pluginItems.every(function(pluginItem){
return pluginItem.prevTrusted.revid === pluginItem.revid && pluginItem.prevTrusted.scriptHash === pluginItem.scriptHash;
});
// 기존 pluginx-need-alert 삭제
$("#bodyContent .mw-parser-output .pluginx-need-alert").remove();
if( isPluginTrusted ){
// 스크립트 실행
executePluginItems(pluginItems);
} else {
var requestAlert = $('<div class="pluginx-need-alert mw-message-box-success mw-message-box"><p><strong><a>이 문서를 정상적으로 보려면 스크립트 허용이 필요해요.</a></strong></p></div>')
$("#bodyContent .mw-parser-output").prepend(requestAlert);
requestAlert.find("a").click(function(){
// todo localstoarge에서 대조 후 리비전이 다를때만 사용자 확인 필요
installPopup.show(pluginItems).then(function(result){
result = result || {};
// 사용자가 플러그인을 신뢰할 경우 localStoarge에 저장
if(result.trust){
setting.setTrustedItems(pluginItems);
}
// 스크립트 실행
executePluginItems(pluginItems);
requestAlert.remove();
});
});
}
}
$(pluginXCore);