messages-BoOJDvbd.js

43.7 KB · raw

1import{t as e}from"./dist-CQS6rvaI.js";import{A as t,C as n,O as r,S as i,X as a,_ as o,b as s,g as c,h as l,l as u,o as d,p as f,s as p,v as m,w as h,x as g,y as _}from"./index-rf_MMY20.js";import{activateLicense as ee,deactivateLicense as te,getLicenseInfo as ne,getLicenseKey as re,isProUser as v,markCelebrationPlayed as ie,shouldPlayCelebration as ae}from"./license-_bs9pA8t.js";async function y(e,t){return await f({password:e,salt:t,parallelism:4,iterations:3,memorySize:65536,hashLength:32,outputType:`binary`})}function oe(){return crypto.getRandomValues(new Uint8Array(16))}var se=`autolock`,ce=5,le=15;function ue(){let e=ye().autoLockMinutes;return typeof e==`number`?e:ce}function b(){if(!chrome.alarms?.clear||!chrome.alarms?.create)return;chrome.alarms.clear(se);let e=ue();e<=0||chrome.alarms.create(se,{delayInMinutes:e})}function de(){chrome.alarms?.clear&&chrome.alarms.clear(se)}async function fe(){if(await be(),!chrome.idle?.setDetectionInterval)return;let e=ue(),t=e>0?Math.max(le,e*60):le;chrome.idle.setDetectionInterval(t)}function pe(){chrome.runtime?.sendMessage?.({type:`VAULT_LOCKED`})?.catch?.(()=>{});try{chrome.tabs.query({},e=>{for(let t of e)t.id!==void 0&&chrome.tabs.sendMessage(t.id,{type:`VAULT_LOCKED`}).catch(()=>{})})}catch{}}chrome.alarms?.onAlarm?.addListener&&chrome.alarms.onAlarm.addListener(e=>{e.name===se&&(V(),pe())}),chrome.idle?.onStateChanged&&chrome.idle.onStateChanged.addListener(e=>{ue()<=0||(e===`idle`||e===`locked`)&&(V(),pe())});var x=`peach_vault_a`,S=`peach_vault_b`,me=`peach_vault`,he=`peach_decoy_vault`,ge=`peach_duress`,_e=1024,C=null,w=[],T=new Map,E=`real`,D=!1,ve=!1,O={};function ye(){return O}async function be(){return await A(),O}async function k(e){await A(),O={...O,...e},await xe()}async function xe(){try{await chrome.storage.local.set({peach_settings:O})}catch(e){throw Se(e)}}function Se(e){let t=e instanceof Error?e.message:String(e);return/QUOTA_BYTES|quota/i.test(t)?Error(`STORAGE_QUOTA_EXCEEDED`):e instanceof Error?e:Error(t)}async function A(){O=(await chrome.storage.local.get(`peach_settings`)).peach_settings??{}}async function j(e){let t=new TextEncoder,n=await crypto.subtle.digest(`SHA-1`,t.encode(e)),r=Array.from(new Uint8Array(n)).map(e=>e.toString(16).padStart(2,`0`)).join(``).toUpperCase(),i=r.slice(0,5),a=r.slice(5);try{let e=await fetch(`https://api.pwnedpasswords.com/range/${i}`);if(!e.ok)return 0;let t=(await e.text()).split(`\r2`).find(e=>e.startsWith(a));return t?parseInt(t.split(`:`)[1],10):0}catch{return 0}}async function Ce(e,t,n){let r=await Te(e,t,n);await A(),O={...O,declinedCardFingerprints:[...O.declinedCardFingerprints??[],r]},await xe()}async function we(e,t,n){await A();let r=await Te(e,t,n);return(O.declinedCardFingerprints??[]).includes(r)}async function Te(e,t,n){let r=new TextEncoder,i=await crypto.subtle.digest(`SHA-1`,r.encode(`${e}${t}${n}`));return Array.from(new Uint8Array(i)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function M(e){return Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function N(e){let t=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)t[n/2]=parseInt(e.slice(n,n+2),16);return t}async function P(e){return(await chrome.storage.local.get(e))[e]??null}async function F(e,t){try{await chrome.storage.local.set({[e]:t})}catch(e){throw Se(e)}}async function I(){if(ve)return;ve=!0;let e=[me,he,ge,x,S],t=await chrome.storage.local.get(e),n=t[x]!==void 0,r=t[S]!==void 0,i=t[me],a=t[he];if(!n&&!i||n&&r&&!i&&!a)return;if(i&&!n&&await F(x,i),!r){let e=i??t[x];a?await F(S,a):e&&await F(S,L(e.ciphertext.length/2))}let o=[];i&&o.push(me),a&&o.push(he),t[ge]!==void 0&&o.push(ge),o.length>0&&await chrome.storage.local.remove(o)}function Ee(e){let t=new TextEncoder().encode(e),n=Math.max(_e,Math.ceil(t.length/_e)*_e)-t.length;return e+` `.repeat(n)}var De=65536;function Oe(e){for(let t=0;t<e.length;t+=De){let n=Math.min(t+De,e.length),r=new Uint8Array(n-t);crypto.getRandomValues(r),e.set(r,t)}return e}function L(e){let t=crypto.getRandomValues(new Uint8Array(16)),n=crypto.getRandomValues(new Uint8Array(12)),r=Oe(new Uint8Array(e)),i=crypto.getRandomValues(new Uint8Array(16));return{version:1,salt:M(t),nonce:M(n),ciphertext:M(r),tag:M(i)}}function R(e,t){return Ee(JSON.stringify({entries:e,duressConfigured:t}))}function ke(e){if(`created`in e||`updated`in e)return!0;let t=e;return t.type===`passkey`||t.rpId!==void 0&&t.passkey===void 0}function Ae(e){let t=JSON.parse(e),n=Array.isArray(t)?t:t.entries??[],r=n.some(ke),i=n.map(nt),{merged:a}=je(i);return Array.isArray(t)?{entries:i,duressConfigured:!1,migratedFromLegacy:!0}:{entries:i,duressConfigured:t.duressConfigured===!0,migratedFromLegacy:r||a}}function je(e){let t=!1,n=Date.now(),r=e.filter(e=>!e.deletedAt&&e.passkey),i=new Map;for(let e of r){let t=e.passkey.rpId,n=i.get(t);n?n.push(e):i.set(t,[e])}for(let[r,a]of i){if(a.length===0)continue;a.sort((e,t)=>{let n=e.passkey.lastUsedAt??e.passkey.createdAt??e.modifiedAt??e.createdAt;return(t.passkey.lastUsedAt??t.passkey.createdAt??t.modifiedAt??t.createdAt)-n});let i=a[0],o=e.find(e=>{if(e.deletedAt||e.passkey||e.type!==`login`)return!1;if(e.url&&u(e.url)===r)return!0;for(let t of e.additionalUrls??[])if(u(t)===r)return!0;return!1});if(o){o.passkey=i.passkey,o.modifiedAt=n;for(let e of a)e.deletedAt||(e.deletedAt=n,e.modifiedAt=n);t=!0}else if(a.length>1){for(let e=1;e<a.length;e+=1){let t=a[e];t.deletedAt||(t.deletedAt=n,t.modifiedAt=n)}t=!0}}return{merged:t}}async function z(e,t){try{return Ae(await l(t,e.nonce,e.ciphertext,e.tag))}catch{return null}}function B(e){T=new Map;for(let t of e){if(t.deletedAt||t.type===`note`||t.type===`card`)continue;let e=new Set,n=u(t.url??``);n&&e.add(n);for(let n of t.additionalUrls??[]){let t=u(n);t&&e.add(t)}if(e.size!==0)for(let n of e){let e=T.get(n)??[];e.push(t),T.set(n,e)}}}async function Me(e){await I();let t=oe();C=await y(e,t),w=[],E=`real`,D=!1,B(w);let n=R(w,D),{nonce:r,ciphertext:i,tag:a}=await c(C,n);await F(x,{version:1,salt:M(t),nonce:r,ciphertext:i,tag:a}),await F(S,L(i.length/2)),b()}async function Ne(){return await I(),await P(x)!==null}async function Pe(){return E===`real`&&D}async function Fe(e){if(!C||E!==`real`)throw Error(`vault must be unlocked in real mode`);await I();let t=await P(x);if(!t)throw Error(`missing slot A`);let n=oe(),r=await y(e,n);try{let e=t.ciphertext.length/2,i=R([],!1),a=new TextEncoder().encode(i);a.length<e&&(i+=` `.repeat(e-a.length));let{nonce:o,ciphertext:s,tag:l}=await c(r,i);await F(S,{version:1,salt:M(n),nonce:o,ciphertext:s,tag:l})}finally{o(r)}D=!0,await K()}async function Ie(){if(!C||E!==`real`)throw Error(`vault must be unlocked in real mode`);await I();let e=await P(x);e&&await F(S,L(e.ciphertext.length/2)),D=!1,await K()}async function Le(e){await I();let t=await P(x);if(!t)return!1;let n=await y(e,N(t.salt));try{return await z(t,n)!==null}finally{o(n)}}async function Re(e){await I();let[t,n]=await Promise.all([P(x),P(S)]),[r,i]=await Promise.all([t?y(e,N(t.salt)):Promise.resolve(null),n?y(e,N(n.salt)):Promise.resolve(null)]),[a,s]=await Promise.all([r&&t?z(t,r):Promise.resolve(null),i&&n?z(n,i):Promise.resolve(null)]);return a&&r?(C=r,E=`real`,w=a.entries,D=a.duressConfigured,B(w),await A(),b(),i&&o(i),a.migratedFromLegacy&&await K(),!0):s&&i?(C=i,E=`decoy`,w=s.entries,D=!1,B(w),await A(),b(),r&&o(r),!0):(r&&o(r),i&&o(i),!1)}function V(){C&&=(o(C),null),w=[],T=new Map,E=`real`,D=!1,de()}function H(){return C!==null}function U(){if(!C)throw Error(`vault locked`);return w.filter(e=>!e.deletedAt)}var ze=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;function Be(){if(!C)throw Error(`vault locked`);let e=w.filter(e=>!e.deletedAt&&e.type===`login`),t=new Map,n=new Map;for(let r of e){let e=r.username?.trim();if(!e)continue;let i=ze.test(e)?t:n,a=i.get(e),o=u(r.url??``)??``,s=r.modifiedAt??r.createdAt??0;!a||s>a.lastUsed?i.set(e,{lastUsed:s,count:(a?.count??0)+1,domain:o}):i.set(e,{...a,count:a.count+1})}let r=e=>([t,n])=>({value:t,type:e,lastUsed:n.lastUsed,useCount:n.count,exampleDomain:n.domain||void 0});return[...[...t.entries()].map(r(`email`)).sort((e,t)=>t.useCount-e.useCount),...[...n.entries()].map(r(`username`)).sort((e,t)=>t.useCount-e.useCount)]}async function Ve(e){if(!C)throw Error(`vault locked`);let t=Date.now(),n=[];for(let r of e)try{let e={...et(r),id:crypto.randomUUID(),createdAt:t,modifiedAt:t};w.push(e),n.push(e)}catch{}return n.length>0&&await q(),n}async function He(e,t){if(!C)throw Error(`vault locked`);if(t===`replace`&&e.length===0)throw Error(`refuse to replace with empty entry set`);let n=0,r=0,i=0;if(t===`replace`){w=[];for(let t of e){let e=Ue(t);if(!e){i+=1;continue}w.push(e),n+=1}}else{let t=new Map;for(let e of w)t.set(e.id,e);for(let a of e){let e=Ue(a);if(!e){i+=1;continue}let o=t.get(e.id);if(!o)w.push(e),n+=1;else if(e.modifiedAt>o.modifiedAt){let t=w.findIndex(e=>e.id===o.id);t!==-1&&(w[t]=e,r+=1)}else i+=1}}return await q(),{added:n,updated:r,skipped:i}}function Ue(e){if(!e||typeof e!=`object`)return null;let t=typeof e.title==`string`?e.title.trim():``;if(!t)return null;let n=typeof e.id==`string`&&e.id?e.id:crypto.randomUUID(),r=Date.now(),i=typeof e.createdAt==`number`?e.createdAt:r,a=typeof e.modifiedAt==`number`?e.modifiedAt:i,o=rt({...e,id:n,title:t,type:e.type??`login`,createdAt:i,modifiedAt:a},e);return o.type===`login`&&!o.passkey&&typeof o.password!=`string`||o.passkey&&!o.passkey.credentialId?null:o}async function We(e){if(e!==`REPLACE_ALL`)throw Error(`clearVaultEntries requires explicit confirmation`);if(!C)throw Error(`vault locked`);for(let e of w)e.deletedAt||(e.deletedAt=Date.now(),e.modifiedAt=Date.now());await q()}async function Ge(e){if(!C)throw Error(`vault locked`);let t=et(e),n=Date.now(),r={...t,id:crypto.randomUUID(),createdAt:n,modifiedAt:n,passwordChangedAt:t.password?n:void 0};return w.push(r),await q(),O.breachMonitoring!==!1&&r.type===`login`&&r.password&&j(r.password).then(async e=>{if(e>0){let t=w.findIndex(e=>e.id===r.id);t!==-1&&(w[t]={...w[t],breach:e,modifiedAt:Date.now()},await q())}}),r}async function W(e,t){if(!C)throw Error(`vault locked`);let n=w.findIndex(t=>t.id===e);if(n===-1||w[n].deletedAt)throw Error(`entry not found`);let r=w[n],i=tt(t),a=`password`in t&&typeof i.password==`string`&&i.password!==r.password;if(w[n]={...r,...i,modifiedAt:Date.now(),...a?{passwordChangedAt:Date.now()}:{}},w[n].type===`login`&&!w[n].password&&!w[n].passkey)throw w[n]=r,Error(`password or passkey required`);if(w[n].type===`card`&&!w[n].cardNumber)throw w[n]=r,Error(`card number is required for card entries`);if(await q(),`password`in t&&O.breachMonitoring!==!1&&w[n].type===`login`&&w[n].password){let t=w[n].password;j(t).then(async t=>{let n=w.findIndex(t=>t.id===e);n!==-1&&(w[n]={...w[n],breach:t>0?t:void 0,modifiedAt:Date.now()},await q())})}}async function Ke(e){if(!C)throw Error(`vault locked`);let t=w.find(t=>t.id===e);if(!t||t.deletedAt)throw Error(`entry not found`);t.deletedAt=Date.now(),t.modifiedAt=Date.now(),await q()}function qe(){return C?w.filter(e=>!!e.deletedAt):[]}async function Je(e){if(!C)throw Error(`vault locked`);let t=w.find(t=>t.id===e&&t.deletedAt);if(!t)throw Error(`deleted entry not found`);delete t.deletedAt,t.modifiedAt=Date.now(),await q(),B(w)}async function Ye(e){if(!C)throw Error(`vault locked`);let t=w.findIndex(t=>t.id===e&&t.deletedAt);if(t===-1)throw Error(`deleted entry not found`);w.splice(t,1),await q()}async function Xe(e){if(!C||e===0)return 0;let t=Date.now()-e,n=w.length;w=w.filter(e=>!(e.deletedAt&&e.deletedAt<t));let r=n-w.length;return r>0&&await q(),r}function Ze(e){return T.get(e)??[]}function G(e){return w.find(t=>t.id===e&&!t.deletedAt)}async function K(){if(!C)throw Error(`vault locked`);let e=await P(x);if(!e)throw Error(`missing slot A`);let t=R(w,D),{nonce:n,ciphertext:r,tag:i}=await c(C,t),a={...e,nonce:n,ciphertext:r,tag:i};return await F(x,a),D||await F(S,L(r.length/2)),a}async function Qe(){if(!C)throw Error(`vault locked`);let e=await P(S);if(!e)throw Error(`missing slot B`);let t=R(w,!1),{nonce:n,ciphertext:r,tag:i}=await c(C,t);await F(S,{...e,nonce:n,ciphertext:r,tag:i})}async function q(){if(!C)throw Error(`vault locked`);if(E===`decoy`)await Qe();else{let e=await K(),t=w.filter(e=>!e.deletedAt).length;ct(e,t)}B(w)}function $e(e){if(!Array.isArray(e))return;let t=new Set,n=[];for(let r of e){let e=typeof r==`string`?r.trim():``;if(!e)continue;let i=e.toLowerCase();t.has(i)||(t.add(i),n.push(e))}return n.length>0?n:void 0}function et(e){let t=e.title.trim(),n=e.type??`login`;if(n===`passkey`&&(n=`login`),!t)throw Error(`title is required`);if(n===`login`&&!e.password?.trim()&&!e.passkey)throw Error(`password or passkey required`);if(e.passkey){let t=e.passkey;if(!t.rpId||!t.credentialId||!t.publicKeyCose||!t.userHandle||!t.userName||t.algorithm!==-7&&t.algorithm!==-8)throw Error(`invalid passkey credential`)}if(n===`card`&&(!e.cardholderName?.trim()||!e.cardNumber?.trim()))throw Error(`cardholder name and card number are required`);return{type:n,title:t,username:n===`login`?e.username?.trim()??``:void 0,password:n===`login`?e.password:void 0,url:n===`login`?e.url?.trim()??``:void 0,additionalUrls:n===`login`?$e(e.additionalUrls):void 0,totp:n===`login`&&e.totp?.trim()||void 0,notes:e.notes?.trim()||void 0,breach:n===`login`?e.breach:void 0,canary:n===`login`?e.canary:void 0,tags:e.tags,passkey:e.passkey,cardholderName:n===`card`?e.cardholderName?.trim():void 0,cardNumber:n===`card`?e.cardNumber?.trim():void 0,expMonth:n===`card`?e.expMonth?.trim():void 0,expYear:n===`card`?e.expYear?.trim():void 0,cvc:n===`card`?e.cvc?.trim():void 0,cardNickname:n===`card`&&e.cardNickname?.trim()||void 0,network:n===`card`?e.network:void 0,last4:n===`card`?e.last4?.trim():void 0}}function tt(e){let t={};if(`type`in e&&(t.type=e.type),`title`in e){let n=e.title?.trim()??``;if(!n)throw Error(`title is required`);t.title=n}if(`url`in e&&(t.url=e.url?.trim()??``),`additionalUrls`in e){let n=Array.isArray(e.additionalUrls)?e.additionalUrls:[],r=new Set,i=[];for(let e of n){let t=typeof e==`string`?e.trim():``;if(!t)continue;let n=t.toLowerCase();r.has(n)||(r.add(n),i.push(t))}t.additionalUrls=i.length>0?i:void 0}return`username`in e&&(t.username=e.username?.trim()??``),`password`in e&&(t.password=(e.password??``)||void 0),`totp`in e&&(t.totp=e.totp?.trim()||void 0),`notes`in e&&(t.notes=e.notes?.trim()||void 0),`breach`in e&&(t.breach=e.breach),`canary`in e&&(t.canary=e.canary),`passkey`in e&&(t.passkey=e.passkey),`tags`in e&&(t.tags=e.tags),`cardholderName`in e&&(t.cardholderName=e.cardholderName?.trim()||void 0),`cardNumber`in e&&(t.cardNumber=(e.cardNumber??``)||void 0),`expMonth`in e&&(t.expMonth=e.expMonth?.trim()||void 0),`expYear`in e&&(t.expYear=e.expYear?.trim()||void 0),`cvc`in e&&(t.cvc=e.cvc?.trim()||void 0),`cardNickname`in e&&(t.cardNickname=e.cardNickname?.trim()||void 0),`network`in e&&(t.network=e.network),`last4`in e&&(t.last4=e.last4?.trim()||void 0),t}function nt(e){let t=`createdAt`in e?e.createdAt:e.created,n=`modifiedAt`in e?e.modifiedAt:e.updated;return rt({id:e.id,type:`type`in e?e.type:`login`,title:e.title,username:e.username,password:e.password,url:e.url,totp:e.totp,notes:e.notes,breach:e.breach,canary:`canary`in e?e.canary:void 0,passkey:`passkey`in e?e.passkey:void 0,createdAt:t,modifiedAt:n,deletedAt:e.deletedAt,tags:`tags`in e?e.tags:void 0,cardholderName:`cardholderName`in e?e.cardholderName:void 0,cardNumber:`cardNumber`in e?e.cardNumber:void 0,expMonth:`expMonth`in e?e.expMonth:void 0,expYear:`expYear`in e?e.expYear:void 0,cvc:`cvc`in e?e.cvc:void 0,cardNickname:`cardNickname`in e?e.cardNickname:void 0,network:`network`in e?e.network:void 0,last4:`last4`in e?e.last4:void 0},e)}function rt(e,t){if(e.passkey)return e;let n=t,r=e.type===`passkey`,i=typeof n.rpId==`string`&&typeof n.credentialId==`string`&&typeof n.publicKeyCose==`string`&&typeof n.userHandle==`string`&&typeof n.userName==`string`;if(!r&&!i||!i)return e;let a=n.algorithm===-8?-8:-7;return e.passkey={rpId:n.rpId,rpName:n.rpName??n.rpId,credentialId:n.credentialId,publicKeyCose:n.publicKeyCose,privateKeyJwk:n.privateKeyJwk,userHandle:n.userHandle,userName:n.userName,userDisplayName:n.userDisplayName??n.userName,algorithm:a,signCount:n.signCount??0,aaguid:n.aaguid??``,backupEligible:n.backupEligible===!0,backupState:n.backupState===!0,lastUsedAt:n.lastUsedAt,browser:n.browser,transports:n.transports,createdAt:e.createdAt},r&&(e.type=`login`),e.username||=n.userName,e.url||=`https://${n.rpId}`,e}function it(e){return e.type===`note`?`note|${e.title.toLowerCase()}`:e.passkey?`passkey|${e.passkey.rpId.toLowerCase()}|${e.passkey.userName.toLowerCase()}`:`login|${e.title.toLowerCase()}|${(e.url??``).toLowerCase()}|${(e.username??``).toLowerCase()}`}function at(){let e=new Map,t=0;for(let n of w.filter(e=>!e.deletedAt)){let r=it(n),i=e.get(r);i?(t++,(n.modifiedAt??n.createdAt??0)>(i.modifiedAt??i.createdAt??0)&&e.set(r,n)):e.set(r,n)}return t}async function ot(){if(!C)throw Error(`vault locked`);if(E===`decoy`)throw Error(`deduplicate disabled in decoy mode`);let e=new Map;for(let t of w.filter(e=>!e.deletedAt)){let n=it(t),r=e.get(n);r?(t.modifiedAt??t.createdAt??0)>(r.modifiedAt??r.createdAt??0)&&e.set(n,t):e.set(n,t)}let t=new Set(Array.from(e.values()).map(e=>e.id)),n=Date.now(),r=0;return w=w.map(e=>!e.deletedAt&&!t.has(e.id)?(r++,{...e,deletedAt:n}):e),r>0&&await q(),r}var J=`peach_vault_snapshots`,st=6;async function ct(e,t){try{let n=(await chrome.storage.local.get(J))[J]??[],r=[{timestamp:Date.now(),entryCount:t,slot:e},...n].slice(0,st);await chrome.storage.local.set({[J]:r})}catch{}}async function lt(){return((await chrome.storage.local.get(J))[J]??[]).map((e,t)=>({index:t,timestamp:e.timestamp,entryCount:e.entryCount}))}async function ut(e,t){let n=((await chrome.storage.local.get(J))[J]??[])[e];if(!n)return!1;let r=await y(t,N(n.slot.salt)),i=await z(n.slot,r);return i?(await F(x,n.slot),await F(S,L(n.slot.ciphertext.length/2)),C&&o(C),C=r,w=i.entries,D=i.duressConfigured,E=`real`,B(w),await A(),b(),!0):(o(r),!1)}async function dt(e,t){if(!C||E!==`real`||!await Le(e))return!1;let n=await P(x);if(!n)return!1;let r=oe(),i=await y(t,r),{nonce:a,ciphertext:s,tag:l}=await c(i,R(w,D)),u={...n,salt:M(r),nonce:a,ciphertext:s,tag:l};await F(x,u),o(C),C=i;let d=w.filter(e=>!e.deletedAt).length;return ct(u,d),D||await F(S,L(s.length/2)),!0}var ft=30,Y=null;async function pt(e){try{let[t]=await chrome.tabs.query({active:!0,currentWindow:!0});if(t?.id){await chrome.scripting.executeScript({target:{tabId:t.id},func:e=>navigator.clipboard.writeText(e),args:[e]});return}}catch{}await navigator.clipboard.writeText(e)}async function mt(e,t,n=!1){Y&&=(clearTimeout(Y),null),n||await pt(e);let r=ye().clipboardClearSeconds,i=(typeof r==`number`&&r>0?r:ft)*1e3;Y=setTimeout(async()=>{try{await pt(``)}catch{}Y=null},i)}var ht=(()=>{let e=typeof chrome<`u`?chrome:void 0;if(e?.webAuthenticationProxy)return!1;try{return(e?.runtime?.getURL?.(``)??``).startsWith(`moz-extension://`)}catch{return!1}})(),gt=`passkey_pending_`,_t=6e4,X=!1,Z;__PEACH_E2E_PASSKEYS__;var vt=new Map;function yt(){if(typeof chrome.webAuthenticationProxy?.attach==`function`)return!0;if(d()===`firefox`){let e=p();if(Number.isFinite(e)&&e>=150)return!0}return!1}function bt(){let e=navigator.userAgent;if(/Firefox\/(\d+)/.test(e)){let t=e.match(/Firefox\/(\d+)/)?.[1];return t?`Firefox ${t}`:`Firefox`}let t=e.match(/Chrome\/(\d+)/)?.[1];return t?`Chrome ${t}`:`Chromium`}function xt(e){return`${gt}${e}`}async function St(e){chrome.action?.setBadgeText&&(await chrome.action.setBadgeText({text:e}),e&&await chrome.action.setBadgeBackgroundColor({color:`#D96830`}))}async function Ct(e){chrome.storage.session&&await chrome.storage.session.remove(xt(e)),await St(``)}async function Q(){try{await chrome.action.openPopup()}catch{await St(`PK`)}}async function wt(){if(!chrome.storage.session)return null;let e=await chrome.storage.session.get(null),t=Object.keys(e).find(e=>e.startsWith(gt));if(!t)return null;let n=e[t];return n&&typeof n==`object`?n:null}async function Tt(e,t){let n=vt.get(e);if(!n){await Ct(e),chrome.storage.session&&await chrome.storage.session.remove(Nt);return}clearTimeout(n.timeoutId),vt.delete(e),await Ct(e),n.resolve(t)}async function Et(e){return chrome.storage.session&&await chrome.storage.session.set({[xt(e.requestId)]:e}),await Q(),new Promise(t=>{let n=setTimeout(async()=>{vt.delete(e.requestId),await Ct(e.requestId),t(!1)},_t);vt.set(e.requestId,{resolve:t,timeoutId:n})})}async function Dt(){let e=await be(),t=yt(),n=e.passkeyProviderEnabled===!0;return{supported:t,enabled:n,attached:t&&X,browserLabel:bt(),statusLabel:t?X?`Active`:Z?`Another provider is active`:n?`Inactive`:`Disabled`:`Interception unavailable`,conflict:Z}}async function Ot(){if(!yt()){X=!1,Z=`This browser does not expose chrome.webAuthenticationProxy.`;return}if(d()===`firefox`){X=!0,Z=void 0;return}if(!X)try{await chrome.webAuthenticationProxy.attach(),X=!0,Z=void 0}catch(e){X=!1,Z=e instanceof Error?e.message:`Another provider is active.`}}async function kt(){if(!yt()){X=!1;return}if(d()===`firefox`){X=!1,Z=void 0;return}try{await chrome.webAuthenticationProxy.detach()}catch{}X=!1,Z=void 0}async function At(e){return await k({passkeyProviderEnabled:e}),e?await Ot():await kt(),Dt()}function jt(e){let t=U().find(t=>t.passkey?.rpId===e&&!t.deletedAt);if(t)return t;let n=Ze(e).filter(e=>e.type===`login`&&!e.passkey);return n.length===0?null:n.reduce((e,t)=>(t.modifiedAt??0)>(e.modifiedAt??0)?t:e)}function Mt(){chrome.tabs.query({},e=>{for(let t of e)t.id!==void 0&&chrome.tabs.sendMessage(t.id,{type:`PASSKEY_PRO_GATE`}).catch(()=>{})})}var Nt=`passkey_pending_firefox`,Pt=`peach_passkey_offer_declined:`,Ft=720*60*60*1e3;async function It(e){if(!await v())return Mt(),{ok:!1,error:`passkey creation requires Peach Pro`};if(!H())return await Q(),{ok:!1,error:`vault locked`};if(!chrome.storage.session)return{ok:!1,error:`session storage unavailable`};let t=Date.now(),n=m(crypto.getRandomValues(new Uint8Array(32))),r=m(crypto.getRandomValues(new Uint8Array(32))),i={requestId:t,type:`create`,rpId:e.rpId,rpName:e.rpName,userName:e.userName,userDisplayName:e.userDisplayName,browser:`firefox`,challenge:n,userHandle:r};return await chrome.storage.session.set({[Nt]:i}),await Q(),{ok:!0}}async function Lt(e){if(!H())return{ok:!1,error:`vault locked`};let t={rpId:e.rpId,rpName:e.rpName,credentialId:e.credentialId,publicKeyCose:e.publicKeyCose,userHandle:e.userHandle,userName:e.userName,userDisplayName:e.userDisplayName??e.userName,algorithm:e.algorithm,signCount:0,aaguid:e.aaguid??m(new Uint8Array(16)),backupEligible:e.backupEligible??!1,backupState:e.backupState??!1,browser:`firefox`,transports:e.transports??[`internal`],createdAt:Date.now()},n=jt(e.rpId);return n?await W(n.id,{passkey:t}):await Ge({type:`login`,title:e.rpName||e.rpId,url:`https://${e.rpId}`,username:e.userName,passkey:t}),chrome.storage.session&&await chrome.storage.session.remove(Nt),{ok:!0}}function Rt(e){return`${Pt}${e}`}async function zt(e){e&&await chrome.storage.local.set({[Rt(e)]:Date.now()})}async function Bt(e){if(!e)return!1;let t=Rt(e),n=(await chrome.storage.local.get(t))[t];return typeof n==`number`?Date.now()-n>Ft?(await chrome.storage.local.remove(t),!1):!0:!1}function Vt(){return U().filter(e=>e.passkey!==void 0&&!e.deletedAt)}async function Ht(e){if(!ht)return{ok:!1,error:`not_applicable`};if(!H())return{ok:!0,hasCredentials:!1};let t=Vt().filter(t=>t.passkey.rpId===e.rpId);if(t.length===0)return{ok:!0,hasCredentials:!1};let n=e.allowCredentials??[];return n.length===0?{ok:!0,hasCredentials:!0}:{ok:!0,hasCredentials:t.some(e=>n.some(t=>t.id===e.passkey.credentialId))}}async function Ut(e){return Et({requestId:Date.now()+Math.floor(Math.random()*1e3),type:e.type,rpId:e.rpId,rpName:e.rpName??e.rpId,userName:e.userName,userDisplayName:e.userDisplayName})}async function Wt(e){if(!ht)return{ok:!1,error:`not_applicable`};if(!await v())return Mt(),{ok:!1,error:`pro_required`};if(!H())return await Q(),{ok:!1,error:`vault_locked`};let t=n(e.pubKeyCredParams??[]);if(!t)return{ok:!1,error:`internal_error`,message:`No supported algorithm offered`};if(!await Ut({type:`create`,rpId:e.rpId,rpName:e.rpName,userName:e.userName,userDisplayName:e.userDisplayName}))return{ok:!1,error:`user_cancelled`};let{bytes:r,base64url:a}=g(),{publicKeyCose:o,publicKeySpki:c,privateKeyJwk:l}=await i(t),u=await _({rpId:e.rpId,flags:69,signCount:0,credentialId:r,publicKeyCose:o}),d=s(u),f={rpId:e.rpId,rpName:e.rpName??e.rpId,credentialId:a,publicKeyCose:m(o),privateKeyJwk:l,userHandle:e.userId,userName:e.userName,userDisplayName:e.userDisplayName??e.userName,algorithm:t,signCount:0,aaguid:m(new Uint8Array(16)),backupEligible:!1,backupState:!1,browser:`firefox`,transports:[`internal`],createdAt:Date.now()},p=jt(e.rpId);return p?await W(p.id,{passkey:f}):await Ge({type:`login`,title:e.rpName||e.rpId,url:`https://${e.rpId}`,username:e.userName,passkey:f}),{ok:!0,credential:{type:`create`,id:a,clientDataJSON:e.clientDataJSON,attestationObject:m(d),authenticatorData:m(u),publicKey:m(c),algorithm:t}}}async function Gt(e){if(!ht)return{ok:!1,error:`not_applicable`};if(!await v())return Mt(),{ok:!1,error:`pro_required`};if(!H())return await Q(),{ok:!1,error:`vault_locked`};let t=e.allowCredentials??[],n=Vt().filter(n=>n.passkey.rpId===e.rpId?t.length===0?!0:t.some(e=>e.id===n.passkey.credentialId):!1);if(n.length===0)return{ok:!1,error:`no_credentials`};n.sort((e,t)=>(t.passkey.lastUsedAt??0)-(e.passkey.lastUsedAt??0));let r=n[0],i=r.passkey;if(!i.privateKeyJwk)return{ok:!1,error:`no_credentials`};if(!await Ut({type:`get`,rpId:i.rpId,rpName:i.rpName,userName:i.userName,userDisplayName:i.userDisplayName}))return{ok:!1,error:`user_cancelled`};let a=i.signCount+1,o=5|(i.backupEligible?8:0)|(i.backupState?16:0),s=await _({rpId:i.rpId,flags:o,signCount:a}),c=new Uint8Array(e.clientDataJSON),l=new Uint8Array(await crypto.subtle.digest(`SHA-256`,c)),u=await h(i.privateKeyJwk,i.algorithm,s,l);return await W(r.id,{passkey:{...i,signCount:a,lastUsedAt:Date.now()}}),{ok:!0,credential:{type:`get`,id:i.credentialId,clientDataJSON:e.clientDataJSON,authenticatorData:m(s),signature:m(u),userHandle:i.userHandle}}}var Kt=/bank|pay|finance|invest|mail|gmail|outlook|yahoo|icloud|instagram|twitter|facebook|linkedin/i,qt=2160*60*60*1e3,Jt=4320*60*60*1e3,Yt=60,Xt=25,Zt=15,Qt=20,$t=10;async function en(e){let t=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e));return Array.from(new Uint8Array(t)).map(e=>e.toString(16).padStart(2,`0`)).join(``)}function tn(e){return Kt.test(e)}function nn(e){return tn(e)?qt:Jt}function rn(e){if(e.length<10)return!0;let t=0;return/[a-z]/.test(e)&&(t+=1),/[A-Z]/.test(e)&&(t+=1),/[0-9]/.test(e)&&(t+=1),/[^A-Za-z0-9]/.test(e)&&(t+=1),t<3}async function an(e){let t=Date.now(),n=e.filter(e=>!e.deletedAt&&(e.type===void 0||e.type===`login`)),r=new Map;for(let e of n){if(!e.password)continue;let t=await en(e.password),n=r.get(t)??[];n.push(e.id),r.set(t,n)}let i=new Set,a=0;for(let e of r.values())if(e.length>1){a+=1;for(let t of e)i.add(t)}let o=[],s=0,c=0,l=0;for(let e of n){let n=u(e.url??``)??``,r=n?tn(n):!1,a=t-(e.passwordChangedAt??e.createdAt??t),d=e.password?a>nn(n):!1;d&&(s+=1);let f=(e.breach??0)>0,p=i.has(e.id),m=e.password?rn(e.password):!1,h=r&&!e.totp,g=0;f&&(g+=Yt),p&&(g+=Xt),d&&(g+=Zt),m&&(g+=Qt),h&&(g+=$t),g>100&&(g=100);let _=[];if(f&&_.push(`Breached (${e.breach} exposures)`),p&&_.push(`Reused`),d){let e=Math.floor(a/864e5);_.push(`${e} days old`)}m&&_.push(`Weak`),h&&_.push(`No 2FA on sensitive site`);let ee=r?2:1;c+=g*ee,l+=ee,g>0&&o.push({id:e.id,title:e.title,domain:n,url:e.url,score:g,ageDays:Math.floor(a/864e5),reasons:_,factors:{breached:f,breachCount:e.breach??0,reused:p,aged:d,weak:m,missingTotpOnSensitive:h}})}return o.sort((e,t)=>t.score-e.score),{vaultScore:l>0?Math.round(c/l):0,generatedAt:t,entryCount:n.length,reusedGroups:a,agedCount:s,remediation:o}}function on(e){let t=e.url??``,n=u(t);if(!n)return null;for(let[e,t]of Object.entries({"google.com":`https://myaccount.google.com/security`,"gmail.com":`https://myaccount.google.com/security`,"github.com":`https://github.com/settings/security`,"twitter.com":`https://twitter.com/settings/password`,"x.com":`https://x.com/settings/password`,"facebook.com":`https://www.facebook.com/settings?tab=security`,"instagram.com":`https://www.instagram.com/accounts/password/change/`,"linkedin.com":`https://www.linkedin.com/psettings/change-password`,"amazon.com":`https://www.amazon.com/ap/changepassword`,"apple.com":`https://appleid.apple.com`,"icloud.com":`https://appleid.apple.com`,"microsoft.com":`https://account.microsoft.com/security`,"outlook.com":`https://account.microsoft.com/security`,"live.com":`https://account.microsoft.com/security`,"dropbox.com":`https://www.dropbox.com/account/security`,"netflix.com":`https://www.netflix.com/password`,"spotify.com":`https://www.spotify.com/account/change-password/`,"reddit.com":`https://www.reddit.com/settings/account`}))if(n===e||n.endsWith(`.`+e))return t;try{return`${new URL(t).origin}/account/security`}catch{return null}}async function $(t,n=`user`){return await v()?{allowed:!0}:(n===`user`?e.isNativePlatform()||chrome.runtime.sendMessage({type:`PRO_GATE_TRIGGERED`,payload:{feature:t}}).catch(()=>{}):!e.isNativePlatform()&&chrome.storage.session&&chrome.storage.session.set({pendingProNotice:{feature:t,triggeredAt:Date.now()}}).catch(()=>{}),{allowed:!1})}var sn=[];async function cn(){await ln();let t=await a(()=>import(`./sync-CmdMdEzY.js`),[]),{getPairedDevices:n}=await a(async()=>{let{getPairedDevices:e}=await import(`./sync-storage-CmN0QppZ.js`);return{getPairedDevices:e}},[]);t.connectSyncHost(),sn=[t.onPeerDiscovered(t=>{(async()=>{let r=(await n()).some(e=>e.deviceId===t.deviceId);e.isNativePlatform()||chrome.runtime.sendMessage({type:`SYNC_PEER_DISCOVERED`,peer:{deviceId:t.deviceId,deviceName:t.name,host:t.host,port:t.port,wsPort:t.wsPort,x25519PublicKey:t.x25519PublicKey,alreadyPaired:r}}).catch(()=>{})})()}),t.onPeerLost(t=>{e.isNativePlatform()||chrome.runtime.sendMessage({type:`SYNC_PEER_LOST`,deviceId:t}).catch(()=>{})})],t.discoverPeers()}async function ln(){for(let e of sn)e();sn=[];try{let e=await a(()=>import(`./sync-CmdMdEzY.js`),[]);e.isHostConnected()&&await e.stopDiscovery()}catch{}}var un=[{prefix:`10.`},{prefix:`127.`},{prefix:`169.254.`},{prefix:`192.168.`}];async function dn(n,i={}){try{if(!e.isNativePlatform()&&i.id!==void 0&&i.id!==chrome.runtime.id)return{ok:!1,error:`invalid sender`};switch(pn(n.type)&&H()&&b(),n.type){case`CREATE_VAULT`:{let{password:e}=n.payload;return await Me(e),await fe(),fn({type:`VAULT_UNLOCKED`}),{ok:!0}}case`UNLOCK`:{let{password:e}=n.payload,t=await Re(e);return t&&(await fe(),fn({type:`VAULT_UNLOCKED`})),{ok:t}}case`LOCK`:return V(),{ok:!0};case`IS_UNLOCKED`:return{ok:!0,data:H()};case`GET_VAULT_STATUS`:return{ok:!0,unlocked:H()};case`HAS_VAULT`:return{ok:!0,data:await Ne()};case`GET_ENTRIES`:return{ok:!0,data:U()};case`ADD_ENTRY`:return H()?{ok:!0,data:await Ge(n.payload)}:{ok:!1,error:`vault locked`};case`BATCH_ADD_ENTRIES`:{let{entries:e}=n.payload;return{ok:!0,data:await Ve(e)}}case`RESTORE_ENTRIES`:{let{entries:e,mode:t,settings:r}=n.payload,i=await He(e,t);return r&&typeof r==`object`&&await k(r),{ok:!0,data:i}}case`CLEAR_VAULT_ENTRIES`:return await We(`REPLACE_ALL`),{ok:!0};case`LIST_VAULT_SNAPSHOTS`:return{ok:!0,data:await lt()};case`RESTORE_VAULT_SNAPSHOT`:{let{index:e,password:t}=n.payload,r=await ut(e,t);return r&&fn({type:`VAULT_UNLOCKED`}),{ok:r}}case`COUNT_DUPLICATES`:return{ok:!0,data:at()};case`DEDUPLICATE_ENTRIES`:return{ok:!0,data:await ot()};case`UPDATE_ENTRY`:{let{id:e,patch:t}=n.payload;return await W(e,t),{ok:!0}}case`ADD_ADDITIONAL_URL`:{let{id:e,url:t}=n.payload,r=typeof t==`string`?t.trim():``;if(!r)return{ok:!1,error:`url required`};let i=G(e);return i?i.type===`login`?(await W(e,{additionalUrls:[...i.additionalUrls??[],r]}),{ok:!0}):{ok:!1,error:`login entries only`}:{ok:!1,error:`entry not found`}}case`DELETE_ENTRY`:{let{id:e}=n.payload;return await Ke(e),{ok:!0}}case`GET_DELETED_ENTRIES`:return{ok:!0,data:qe()};case`RESTORE_ENTRY`:{let{id:e}=n.payload;return await Je(e),{ok:!0}}case`PURGE_ENTRY`:{let{id:e}=n.payload;return await Ye(e),{ok:!0}}case`PURGE_EXPIRED_TRASH`:{let{retentionMs:e}=n.payload;return{ok:!0,data:await Xe(e)}}case`AUTOFILL_QUERY`:{if(!H())return{ok:!1,error:`VAULT_LOCKED`};let{domain:e,includeAll:t,kind:i}=n.payload;return i===`card`?{ok:!0,data:U().filter(e=>e.type===`card`).map(e=>({id:e.id,title:e.cardNickname||e.title,cardholderName:e.cardholderName,last4:e.last4,expMonth:e.expMonth,expYear:e.expYear,network:e.network}))}:{ok:!0,data:(t?U().filter(e=>e.type!==`note`&&e.type!==`card`):Ze(e)).filter(e=>!r(e)).map(e=>t?{id:e.id,title:e.title,hasPasskey:e.passkey!==void 0}:{id:e.id,title:e.title,username:e.username,url:e.url,hasTotp:!!e.totp,hasPasskey:e.passkey!==void 0})}}case`GET_ENTRY_FOR_FILL`:{if(!H())return{ok:!1,error:`vault locked`};let{id:e}=n.payload,t=G(e);if(!t)return{ok:!1,error:`entry not found`};if(r(t))return{ok:!1,error:`passkey not fillable`};let{passkey:i,...a}=t;return{ok:!0,data:a}}case`COPY`:{let{text:e,label:t,alreadyWritten:r}=n.payload;return await mt(e,t,!!r),{ok:!0}}case`CHECK_BREACH`:{let{password:e}=n.payload;return{ok:!0,data:await j(e)}}case`CHECK_ALL_BREACHES`:{let e=U(),t={};for(let n of e)n.type!==`note`&&n.password&&(t[n.id]=await j(n.password),await new Promise(e=>setTimeout(e,200)));for(let[e,n]of Object.entries(t)){let t=G(e);t&&(t.breach??0)!==n&&await W(e,{breach:n>0?n:void 0})}return{ok:!0,data:t}}case`GET_SETTINGS`:return{ok:!0,data:await be()};case`UPDATE_SETTINGS`:{let e=n.payload;return await k(e),typeof e.autoLockMinutes==`number`&&(await fe(),H()&&b()),{ok:!0}}case`GET_PENDING_PASSKEY`:return{ok:!0,data:await wt()};case`APPROVE_PASSKEY`:{let{requestId:e}=n.payload;return await Tt(e,!0),{ok:!0}}case`DENY_PASSKEY`:{let{requestId:e}=n.payload;return await Tt(e,!1),{ok:!0}}case`GET_PASSKEYS`:return{ok:!0,data:U().filter(e=>e.passkey!==void 0)};case`DELETE_PASSKEY`:{let{id:e}=n.payload;return await Ke(e),{ok:!0}}case`GET_PASSKEY_PROVIDER_STATE`:return{ok:!0,data:await Dt()};case`SET_PASSKEY_PROVIDER_ENABLED`:{let{enabled:e}=n.payload;return e&&!(await $(`passkeys`)).allowed?{ok:!1,error:`pro_required`}:{ok:!0,data:await At(e)}}case`FIRE_CANARY_PING`:{let{webhookUrl:e,entryTitle:t,trigger:r}=n.payload;if(!mn(e))return{ok:!1,error:`invalid webhook url`};let i=JSON.stringify({event:r===`test`?`peach_canary_test`:`peach_canary_accessed`,entry:t,trigger:r,timestamp:new Date().toISOString(),source:`peach-extension`});if(r===`test`)try{let t=await fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:i});return{ok:t.ok,error:t.ok?void 0:`HTTP ${t.status}`}}catch(e){return{ok:!1,error:e instanceof Error?e.message:`network error`}}return fetch(e,{method:`POST`,headers:{"Content-Type":`application/json`},body:i}).catch(()=>{}),{ok:!0}}case`ACTIVATE_LICENSE`:{let{key:e}=n.payload;return{ok:!0,data:await ee(e)}}case`GET_LICENSE`:return{ok:!0,data:await ne()};case`GET_LICENSE_KEY`:return{ok:!0,data:await re()};case`DEACTIVATE_LICENSE`:return await te(),{ok:!0};case`SHOULD_PLAY_CELEBRATION`:return{ok:!0,data:await ae()};case`MARK_CELEBRATION_PLAYED`:return await ie(),{ok:!0};case`OPEN_PRO_GATE`:{let{feature:e}=n.payload??{};chrome.storage.session&&await chrome.storage.session.set({pendingProGate:{feature:e??`passkeys`}});try{await chrome.action.openPopup()}catch{}return{ok:!0}}case`GET_IDENTITIES`:return H()?{ok:!0,data:Be()}:{ok:!1,error:`vault locked`};case`GET_ADVANCED_HEALTH_REPORT`:return(await $(`advanced_health`)).allowed?H()?{ok:!0,data:await an(U())}:{ok:!1,error:`vault locked`}:{ok:!1,error:`pro_required`};case`INITIATE_PASSWORD_CHANGE`:{if(!(await $(`smart_password_change`)).allowed)return{ok:!1,error:`pro_required`};if(!H())return{ok:!1,error:`vault locked`};let{id:e}=n.payload,t=G(e);if(!t)return{ok:!1,error:`entry not found`};let r=on(t);if(!r)return{ok:!1,error:`no reset url`};try{return await chrome.tabs.create({url:r}),{ok:!0,data:{url:r}}}catch(e){return{ok:!1,error:e instanceof Error?e.message:`failed to open tab`}}}case`IS_DURESS_ENABLED`:return{ok:!0,data:await Pe()};case`SETUP_DURESS`:{let{duressPassword:e}=n.payload;return await Fe(e),{ok:!0}}case`DISABLE_DURESS`:return await Ie(),{ok:!0};case`VERIFY_MAIN_PASSWORD`:{let{password:e}=n.payload;return{ok:!0,data:await Le(e)}}case`CHANGE_PASSWORD`:{let{currentPassword:e,newPassword:t}=n.payload;return await dt(e,t)?{ok:!0}:{ok:!1,error:`incorrect current password`}}case`GET_SITE_PASSWORD_POLICY`:{let[e]=await chrome.tabs.query({active:!0,currentWindow:!0});if(!e?.id)return{ok:!0,data:null};try{return await chrome.tabs.sendMessage(e.id,{type:`GET_SITE_PASSWORD_POLICY`})??{ok:!0,data:null}}catch{return{ok:!0,data:null}}}case`GET_SYNC_STATE`:{let{getPairedDevices:e,getTrustedNetworks:t}=await a(async()=>{let{getPairedDevices:e,getTrustedNetworks:t}=await import(`./sync-storage-CmN0QppZ.js`);return{getPairedDevices:e,getTrustedNetworks:t}},[]),{isOnTailscale:n}=await a(async()=>{let{isOnTailscale:e}=await import(`./sync-network-BZsxL6LD.js`);return{isOnTailscale:e}},[]),{isProUser:r}=await a(async()=>{let{isProUser:e}=await import(`./license-_bs9pA8t.js`);return{isProUser:e}},[]),i=await e(),o=await t(),s=await n(),c=await r(),l=`offline`;return l=s||o.some(e=>!e.isTailscale)?i.length===0?`no_peers`:`synced`:`not_trusted`,{ok:!0,data:{pairedDevices:i,trustedNetworks:o,status:l,isPro:c}}}case`TRIGGER_SYNC`:return(await $(`sync`)).allowed?{ok:!0}:{ok:!1,error:`pro_required`};case`START_PAIRING`:return(await $(`sync`)).allowed?{ok:!0}:{ok:!1,error:`pro_required`};case`CANCEL_PAIRING`:return{ok:!0};case`ACCEPT_PAIRING`:return(await $(`sync`)).allowed?{ok:!0}:{ok:!1,error:`pro_required`};case`REMOVE_PAIRED_DEVICE`:{let{deviceId:e}=n.payload,{removePairedDevice:t}=await a(async()=>{let{removePairedDevice:e}=await import(`./sync-storage-CmN0QppZ.js`);return{removePairedDevice:e}},[]);return await t(e),{ok:!0}}case`REMOVE_TRUSTED_NETWORK`:{let{ssid:e,bssid:t,isTailscale:r}=n.payload,{removeTrustedNetwork:i,getTrustedNetworks:o}=await a(async()=>{let{removeTrustedNetwork:e,getTrustedNetworks:t}=await import(`./sync-storage-CmN0QppZ.js`);return{removeTrustedNetwork:e,getTrustedNetworks:t}},[]),s=(await o()).find(n=>(r?n.isTailscale:n.ssid===e)&&(!t||n.bssid===t));return s&&await i(s.addedAt),{ok:!0}}case`MARK_NETWORK_TRUSTED`:{let{addTrustedNetwork:e}=await a(async()=>{let{addTrustedNetwork:e}=await import(`./sync-storage-CmN0QppZ.js`);return{addTrustedNetwork:e}},[]),{getCurrentNetwork:t}=await a(async()=>{let{getCurrentNetwork:e}=await import(`./sync-network-BZsxL6LD.js`);return{getCurrentNetwork:e}},[]),n=await t();return await e({ssid:n.ssid,bssid:n.bssid,isTailscale:n.isTailscale,addedAt:Date.now()}),{ok:!0}}case`GET_INCOMING_PAIRING_REQUEST`:{let{getIncomingPairingRequest:e}=await a(async()=>{let{getIncomingPairingRequest:e}=await import(`./sync-storage-CmN0QppZ.js`);return{getIncomingPairingRequest:e}},[]);return{ok:!0,data:await e()}}case`RESPOND_INCOMING_PAIRING`:{let{accept:e}=n.payload,{getIncomingPairingRequest:t,clearIncomingPairingRequest:r}=await a(async()=>{let{getIncomingPairingRequest:e,clearIncomingPairingRequest:t}=await import(`./sync-storage-CmN0QppZ.js`);return{getIncomingPairingRequest:e,clearIncomingPairingRequest:t}},[]),i=await t();if(!i)return{ok:!1,error:`no_pending_request`};if(await r(),e)try{let{trustDevice:e}=await a(async()=>{let{trustDevice:e}=await import(`./sync-CmdMdEzY.js`);return{trustDevice:e}},[]);await e(i.publicKeyHex,i.deviceName)}catch{}return{ok:!0,data:{accepted:e,deviceName:i.deviceName}}}case`START_PEER_DISCOVERY`:if(!(await $(`sync`)).allowed)return{ok:!1,error:`pro_required`};try{return await cn(),{ok:!0}}catch(e){return{ok:!1,error:e instanceof Error?e.message:`discovery_failed`}}case`STOP_PEER_DISCOVERY`:try{await ln()}catch{}return{ok:!0};case`INITIATE_PAIR_WITH_PEER`:{if(!(await $(`sync`)).allowed)return{ok:!1,error:`pro_required`};let{peer:e}=n.payload;try{let t=await(await a(()=>import(`./sync-CmdMdEzY.js`),[])).connectToPeer(e.host,e.port,e.x25519PublicKey),{addPairedDevice:n}=await a(async()=>{let{addPairedDevice:e}=await import(`./sync-storage-CmN0QppZ.js`);return{addPairedDevice:e}},[]);return await n({deviceId:e.deviceId,displayName:e.deviceName,x25519PublicKey:e.x25519PublicKey,pairedAt:Date.now()}),{ok:!0,data:{connectionId:t,deviceName:e.deviceName}}}catch(e){return{ok:!1,error:e instanceof Error?e.message:`pair_failed`}}}case`DEBUG_INJECT_INCOMING_PAIRING`:{let{deviceName:e,publicKeyHex:t}=n.payload??{};if(!e||!t)return{ok:!1,error:`missing_payload`};let{setIncomingPairingRequest:r}=await a(async()=>{let{setIncomingPairingRequest:e}=await import(`./sync-storage-CmN0QppZ.js`);return{setIncomingPairingRequest:e}},[]),i=Date.now();return await r({deviceName:e,publicKeyHex:t,receivedAt:i,expiresAt:i+6e4}),{ok:!0}}case`RESET_SYNC_IDENTITY`:{if(!(await $(`sync`)).allowed)return{ok:!1,error:`pro_required`};let{getPairedDevices:e,removePairedDevice:t}=await a(async()=>{let{getPairedDevices:e,removePairedDevice:t}=await import(`./sync-storage-CmN0QppZ.js`);return{getPairedDevices:e,removePairedDevice:t}},[]),n=await e();for(let e of n)await t(e.deviceId);let r=null;try{let{rotateNativeIdentity:e,disconnectSyncHost:t}=await a(async()=>{let{rotateNativeIdentity:e,disconnectSyncHost:t}=await import(`./sync-CmdMdEzY.js`);return{rotateNativeIdentity:e,disconnectSyncHost:t}},[]);r=await e(),t()}catch{r=null}return{ok:!0,data:{removedDevices:n.length,nativePublicKey:r}}}case`RECORD_MANUAL_SUMMON`:{let{domain:e}=n.payload,t=ye(),r=t.manualSummonDomains?.[e],i=Date.now();return await k({manualSummonDomains:{...t.manualSummonDomains,[e]:{firstSummonedAt:r?.firstSummonedAt??i,summonCount:(r?.summonCount??0)+1,lastSummonedAt:i}}}),{ok:!0}}case`DECLINE_CARD_SAVE`:{let{last4:e,expMonth:t,expYear:r}=n.payload;return await Ce(e,t,r),{ok:!0}}case`IS_CARD_DECLINED`:{let{last4:e,expMonth:t,expYear:r}=n.payload;return{ok:!0,data:await we(e,t,r)}}case`INITIATE_FIREFOX_PASSKEY_CREATE`:{let{rpId:e,rpName:t,userName:r,userDisplayName:i}=n.payload??{};return!e||!r?{ok:!1,error:`rpId and userName required`}:await It({rpId:e,rpName:t??e,userName:r,userDisplayName:i})}case`COMPLETE_FIREFOX_PASSKEY_CREATE`:{let e=n.payload;return e?await Lt(e):{ok:!1,error:`missing payload`}}case`PASSKEY_OFFER_DECLINE`:{let{domain:e}=n.payload??{};return e?(await zt(e),{ok:!0}):{ok:!1,error:`domain required`}}case`GET_PASSKEY_OFFER_DECLINED`:{let{domain:e}=n.payload??{};return e?{ok:!0,data:await Bt(e)}:{ok:!1,error:`domain required`}}case`PASSKEY_HAS_CREDENTIALS`:{let e=n.payload;return e?.rpId?await Ht({rpId:e.rpId,allowCredentials:e.allowCredentials??[]}):{ok:!1,error:`rpId required`}}case`PASSKEY_CREATE`:{let e=n.payload;return!e?.rpId||!e?.userName?{ok:!1,error:`rpId and userName required`}:await Wt(e)}case`PASSKEY_GET`:{let e=n.payload;return e?.rpId?await Gt(e):{ok:!1,error:`rpId required`}}case`GET_PASSKEY_FOR_DOMAIN`:{let{domain:e}=n.payload??{};if(!e)return{ok:!1,error:`domain required`};if(!H())return{ok:!0,data:null};let t=U().find(t=>t.passkey?.rpId===e);return!t||!t.passkey?{ok:!0,data:null}:{ok:!0,data:{rpId:t.passkey.rpId,userName:t.passkey.userName,browser:t.passkey.browser}}}case`DESTROY_VAULT`:return V(),await t(),!e.isNativePlatform()&&chrome.storage.session&&await chrome.storage.session.clear(),{ok:!0};case`SUBMIT_FEEDBACK`:{let{category:e,message:t,version:r,browser:i}=n.payload;return t.trim()?{ok:!0}:{ok:!1,error:`message is empty`}}default:return{ok:!1,error:`unknown message type`}}}catch(e){return{ok:!1,error:e instanceof Error?e.message:`operation failed`}}}function fn(t){e.isNativePlatform()||!chrome.tabs?.query||chrome.tabs.query({},e=>{for(let n of e)n.id!==void 0&&chrome.tabs.sendMessage(n.id,t).catch(()=>{})})}function pn(e){return e!==`HAS_VAULT`&&e!==`IS_UNLOCKED`&&e!==`GET_VAULT_STATUS`&&e!==`LOCK`&&e!==`UPDATE_SETTINGS`&&e!==`GET_PENDING_PASSKEY`&&e!==`GET_PASSKEY_PROVIDER_STATE`&&e!==`DECLINE_CARD_SAVE`&&e!==`IS_CARD_DECLINED`&&e!==`SUBMIT_FEEDBACK`}function mn(e){try{let t=new URL(e);if(t.protocol!==`https:`)return!1;let n=t.hostname.toLowerCase();return!(n===`localhost`||n.endsWith(`.localhost`)||hn(n)||gn(n))}catch{return!1}}function hn(e){if(un.some(t=>e.startsWith(t.prefix)))return!0;let t=e.split(`.`).map(e=>Number(e));return t.length!==4||t.some(e=>!Number.isInteger(e)||e<0||e>255)?!1:t[0]===172&&t[1]>=16&&t[1]<=31}function gn(e){let t=e.replace(/^\[|\]$/g,``).toLowerCase();return t===`::1`||t.startsWith(`fc`)||t.startsWith(`fd`)||t.startsWith(`fe80:`)}export{dn as handleMessage};