CRITICAL修复: - 移除allowFileAccessFromFileURLs/allowUniversalAccessFromFileURLs - 移除MIXED_CONTENT_ALWAYS_ALLOW - WebContentsDebugging仅DEBUG模式开启 - 下载HTML用Web Crypto SHA256校验(version.txt|url|sha256)
68 lines
3.4 KiB
HTML
68 lines
3.4 KiB
HTML
<!DOCTYPE html>
|
|
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width">
|
|
<style>
|
|
body{font-family:monospace;background:#0c0a1d;color:#e8e0f0;padding:16px;margin:0}
|
|
header{background:linear-gradient(135deg,#7c3aed,#2563eb);margin:-16px -16px 12px -16px;padding:20px 16px;text-align:center}
|
|
h1{font-size:20px;color:#fff;margin:0}
|
|
.sub{color:#c4b5fd;font-size:12px;margin-top:4px}
|
|
.card{background:#1a1530;border-radius:12px;padding:16px;margin:8px 0;border:1px solid #2d2650}
|
|
.card-title{color:#a78bfa;font-size:14px;font-weight:bold;margin-bottom:8px}
|
|
.chip-row{display:flex;gap:8px;margin:8px 0}
|
|
.chip{flex:1;text-align:center;padding:10px 0;border-radius:8px;font-size:13px;cursor:pointer;border:1px solid #4c3a80;background:#1e1740;color:#aaa}
|
|
.chip-on{background:#7c3aed;color:#fff;border-color:#a78bfa}
|
|
.btn{display:block;width:100%;padding:14px;margin:8px 0;border:none;border-radius:10px;font-size:16px;cursor:pointer;font-weight:bold}
|
|
.btn-check{background:#7c3aed;color:#fff}
|
|
.btn-download{background:#059669;color:#fff}
|
|
.log{background:#0f0b20;padding:12px;border-radius:8px;margin-top:12px;font-size:11px;color:#888;white-space:pre-wrap;max-height:200px;overflow-y:auto}
|
|
.badge{display:inline-block;background:#7c3aed;color:#fff;padding:3px 10px;border-radius:6px;font-size:11px}
|
|
</style></head><body>
|
|
<header>
|
|
<h1>Yuzu GCA <span class="badge">v6</span></h1>
|
|
<div class="sub">热更新 v6 — 渠道选择器</div>
|
|
</header>
|
|
<div class="card">
|
|
<div class="card-title">更新渠道</div>
|
|
<div class="chip-row">
|
|
<div class="chip chip-on" onclick="selectCh(this,'stable')">Stable</div>
|
|
<div class="chip chip-off" onclick="selectCh(this,'beta')">Beta</div>
|
|
<div class="chip chip-off" onclick="selectCh(this,'nightly')">Nightly</div>
|
|
</div>
|
|
</div>
|
|
<button class="btn btn-check" onclick="checkUpdate()">检查更新</button>
|
|
<button class="btn btn-download" onclick="applyUpdate()" id="btnApply" disabled>下载更新</button>
|
|
<div class="log" id="log"></div>
|
|
<script>
|
|
var dlUrl='',dlVer='',dlSha='';
|
|
var BASE='https://git.childish-ghost.com/LukeMackin/Yuzu-GCA/raw/branch/main/ota';
|
|
|
|
function selectCh(el,ch){
|
|
document.querySelectorAll('.chip').forEach(function(c){c.className='chip chip-off'});
|
|
el.className='chip chip-on';
|
|
log('channel: '+ch)
|
|
}
|
|
function log(m){document.getElementById('log').innerText+=m+'\n'}
|
|
function checkUpdate(){
|
|
fetch(BASE+'/version.txt?t='+Date.now(),{cache:'no-store'})
|
|
.then(r=>{if(!r.ok)throw Error('HTTP '+r.status);return r.text()})
|
|
.then(function(t){t=t.trim();log('remote: '+t);
|
|
var parts=t.split('|');var remoteVer=parts[0];dlUrl=parts[1]||'';dlSha=parts[2]||'';
|
|
if(!dlUrl)dlUrl=BASE+'/h5/index-v'+remoteVer.replace('0.1.0-dav-android-','')+'.html';
|
|
if(remoteVer!=='0.1.0-dav-android-6'){dlVer=remoteVer;
|
|
log('*** NEW VERSION ***');document.getElementById('btnApply').disabled=false}
|
|
else log('up to date')})
|
|
.catch(function(e){log('ERR: '+e.message)})
|
|
}
|
|
function applyUpdate(){
|
|
fetch(dlUrl+'?t='+Date.now(),{cache:'no-store'})
|
|
.then(r=>{if(!r.ok)throw Error('HTTP '+r.status);return r.arrayBuffer()})
|
|
.then(function(buf){
|
|
return crypto.subtle.digest('SHA-256',buf).then(function(hash){
|
|
var hex=Array.from(new Uint8Array(hash)).map(function(b){return b.toString(16).padStart(2,'0')}).join('');
|
|
if(dlSha&&hex!==dlSha){log('SHA256 MISMATCH!');return}
|
|
Android.saveCache(new TextDecoder().decode(buf));log('OK! restart app to apply')
|
|
})
|
|
})
|
|
.catch(function(e){log('ERR: '+e.message)})
|
|
}
|
|
</script></body></html>
|