UNPKG

@mhg/blog

Version:
3 lines (2 loc) 5.67 kB
"use strict";(()=>{var y=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var S=y((tt,x)=>{"use strict";function D(e,t){if(!e)return;e.setAttribute("aria-busy",t?"true":"false");let r=e.querySelector(".hbe-button");r&&(r.disabled=!!t);let n=e.querySelector("#hbePass");n&&(n.disabled=!!t)}function C(e,t){let r=e.querySelector('[role="alert"]');if(!r){r=document.createElement("div"),r.setAttribute("role","alert"),r.className="hbe hbe-error";let n=e.querySelector("#hbeForm");n?n.parentNode.insertBefore(r,n.nextSibling):e.appendChild(r)}r.textContent=t}function k(e){let t=e.querySelector('[role="alert"]');t&&(t.textContent="")}function K(e){let t=e.querySelector("#hbePass");return t?t.value:""}function q(e,t){e&&e.addEventListener("submit",r=>{r.preventDefault(),t()})}x.exports={setBusy:D,showError:C,clearError:k,readPassword:K,attachSubmit:q}});var g=y((et,w)=>{"use strict";var M=new TextDecoder("utf-8",{fatal:!0}),O=new TextEncoder;function i(e){let t=e.length;if(t%2!==0)throw new Error("hexo-blog-encrypt: hex string has odd length");let r=new Uint8Array(t/2);for(let n=0;n<r.length;n++)r[n]=parseInt(e.substr(n*2,2),16);return r}async function b(e,t,r){let n=await crypto.subtle.importKey("raw",O.encode(e),{name:"PBKDF2"},!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:t,iterations:r,hash:"SHA-256"},n,{name:"AES-GCM",length:256},!0,["decrypt"])}async function p(e,t,r){let n=await crypto.subtle.decrypt({name:"AES-GCM",iv:t,tagLength:128},e,r);return M.decode(n)}async function N({password:e,saltHex:t,nonceHex:r,ciphertextHex:n,iterations:o}){try{let a=i(t),s=i(r),l=i(n);if(l.length<16)return{ok:!1};let f=await b(e,a,o);return{ok:!0,plaintext:await p(f,s,l),key:f}}catch(a){return{ok:!1}}}async function P({key:e,nonceHex:t,ciphertextHex:r}){try{let n=i(t),o=i(r);return o.length<16?{ok:!1}:{ok:!0,plaintext:await p(e,n,o)}}catch(n){return{ok:!1}}}w.exports={tryDecryptWithPassword:N,tryDecryptWithKey:P,deriveKey:b,decryptWithKey:p,hexToBytes:i}});var T=y((rt,v)=>{"use strict";function m(e){let t=document.createElement("script");for(let r of e.attributes)t.setAttribute(r.name,r.value);return t.text=e.text,t}function E(e){let t=document.createElement("div");t.innerHTML=e;for(let r of t.querySelectorAll("script"))r.parentNode.replaceChild(m(r),r);return t}function R(e,t){let r=E(t);return r.id="hexo-blog-encrypt",r.classList.add("hbe","hbe-decrypted-content"),e.parentNode.replaceChild(r,e),r}v.exports={getExecutableScript:m,convertHTMLToElement:E,swapInDecryptedDOM:R}});var A=y((nt,H)=>{"use strict";var _="hbe.v4.";function u(e){return _+e}function G(e){let t="";for(let r=0;r<e.length;r++)t+=String.fromCharCode(e[r]);return btoa(t)}function F(e){let t=atob(e),r=new Uint8Array(t.length);for(let n=0;n<t.length;n++)r[n]=t.charCodeAt(n);return r}async function W({pageKey:e,key:t,saltHex:r,nonceHex:n,autoSave:o}){if(o)try{let a=await crypto.subtle.exportKey("raw",t),s={version:4,dk:G(new Uint8Array(a)),salt:r,nonce:n};localStorage.setItem(u(e),JSON.stringify(s))}catch(a){}}async function L({pageKey:e,expectedSaltHex:t}){let r;try{let n=localStorage.getItem(u(e));if(!n)return null;r=JSON.parse(n)}catch(n){return null}if(!r||r.version!==4||typeof r.dk!="string"||typeof r.salt!="string"||typeof r.nonce!="string"||"hmk"in r||"hmacDigest"in r){try{localStorage.removeItem(u(e))}catch(n){}return null}if(r.salt!==t){try{localStorage.removeItem(u(e))}catch(n){}return null}try{let n=F(r.dk);return await crypto.subtle.importKey("raw",n,{name:"AES-GCM"},!0,["decrypt"])}catch(n){try{localStorage.removeItem(u(e))}catch(o){}return null}}function Y(e){try{localStorage.removeItem(u(e))}catch(t){}}H.exports={save:W,load:L,clear:Y,STORAGE_KEY_PREFIX:_,SCHEMA_VERSION:4}});var c=S(),B=g(),U=T(),d=A(),V="4";function X(e){let t=e.dataset,r=e.querySelector("script#hbeData");return{format:t.hbeFormat,wpm:t.wpm||"Wrong password.",whm:t.whm||t.wpm||"Wrong password.",saltHex:t.salt,nonceHex:t.nonce,iterations:parseInt(t.kdfIterations,10)||25e4,autoSave:t.autoSave==="true",ciphertextHex:r?r.textContent.trim():""}}function J(e){try{window.dispatchEvent(new CustomEvent("hexo-blog-decrypt",{detail:{mode:e}}))}catch(t){try{window.dispatchEvent(new Event("hexo-blog-decrypt"))}catch(r){}}}function h(){return location.pathname+location.search}async function j(e,t,r){U.swapInDecryptedDOM(e,t),J(r)}async function z(e,t,r){if(!t.autoSave)return!1;let n=await d.load({pageKey:h(),expectedSaltHex:t.saltHex});if(!n)return!1;let o=await B.tryDecryptWithKey({key:n,nonceHex:t.nonceHex,ciphertextHex:t.ciphertextHex});return o.ok?(await r(o.plaintext,"cached"),!0):(d.clear(h()),!1)}async function Q(e,t,r,n){c.clearError(e),c.setBusy(r,!0);let o=c.readPassword(r);if(!o){c.setBusy(r,!1),c.showError(e,t.wpm);return}let a;try{a=await B.tryDecryptWithPassword({password:o,saltHex:t.saltHex,nonceHex:t.nonceHex,ciphertextHex:t.ciphertextHex,iterations:t.iterations})}finally{c.setBusy(r,!1)}if(!a.ok){c.showError(e,t.wpm);return}t.autoSave&&await d.save({pageKey:h(),key:a.key,saltHex:t.saltHex,nonceHex:t.nonceHex,autoSave:!0}),await n(a.plaintext,"manual")}async function I(){let e=document.getElementById("hexo-blog-encrypt");if(!e)return;let t=X(e);if(t.format!==V){c.showError(e,"hexo-blog-encrypt: this page was built with an incompatible plugin version. Rebuild the site after upgrading the plugin.");return}let r=!1,n=async(s,l)=>{r||(r=!0,await j(e,s,l))},o=e.querySelector("#hbeForm");if(c.attachSubmit(o,()=>Q(e,t,o,n)),!await z(e,t,n)&&!r){let s=e.querySelector("#hbePass");s&&s.focus()}}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I):I();})(); //# sourceMappingURL=hbe.bundle.js.map