diff --git a/public/core/account-security-v1771.js b/public/core/account-security-v1771.js new file mode 100644 index 0000000..a3180f4 --- /dev/null +++ b/public/core/account-security-v1771.js @@ -0,0 +1,81 @@ +(()=>{ + 'use strict'; + if(window.CateriumAccountSecurityV1771)return; + + const VERSION='17.7.1'; + const RELEASE='20260908-v17-7-1-password-security'; + const $=id=>document.getElementById(id); + const cloud=()=>window.SunCloudV2||null; + const client=()=>cloud()?.getClient?.()||null; + const session=()=>cloud()?.getSession?.()||null; + const esc=v=>window.SunSafe?.escapeHTML?window.SunSafe.escapeHTML(String(v??'')):String(v??'').replace(/[&<>"']/g,c=>({'&':'&','<':'<','>':'>','"':'"',"'":'''}[c])); + const mustChange=user=>Boolean(user?.app_metadata?.must_change_password||user?.user_metadata?.must_change_password); + let forcedOpen=false,checking=false; + + function installStyle(){ + if($('cateriumAccountSecurityV1771Style'))return; + const st=document.createElement('style');st.id='cateriumAccountSecurityV1771Style';st.textContent=` + .cat-password-gate-v1771{position:fixed;inset:0;z-index:200500;background:rgba(12,16,14,.72);backdrop-filter:blur(8px);display:grid;place-items:center;padding:18px} + .cat-password-gate-v1771-card{width:min(460px,100%);background:#fff;border-radius:20px;padding:22px;box-shadow:0 28px 90px rgba(0,0,0,.32)} + .cat-password-gate-v1771-card h2{margin:0 0 6px}.cat-password-gate-v1771-card p{color:#6d746f;line-height:1.45} + .cat-password-gate-v1771-card label{display:block;margin-top:12px;font-size:12px;font-weight:800;color:#343a36}.cat-password-gate-v1771-card input{width:100%;box-sizing:border-box;margin-top:6px;padding:11px 12px;border:1px solid #d8ded9;border-radius:10px;font:inherit} + .cat-password-gate-v1771-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}.cat-password-gate-v1771-actions button{border-radius:10px;padding:9px 12px;font-weight:850}.cat-password-gate-v1771-actions .primary{background:#1d2a22;color:#fff;border:1px solid #1d2a22}.cat-password-gate-v1771-actions .outline{background:#fff;border:1px solid #d5dad6} + .cat-password-gate-v1771-error{min-height:20px;margin-top:10px;color:#9f2d2d;font-size:12px}.cat-password-gate-v1771-success{color:#1e6a3d} + .cat-profile-password-v1771{margin-top:10px;padding-top:10px;border-top:1px solid #e6e9e7;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}.cat-profile-password-v1771 small{display:block;color:#7a807c;margin-top:3px} + body.cat-password-required-v1771{overflow:hidden!important} + `;document.head.appendChild(st); + } + + async function signOut(){try{await cloud()?.signOut?.()}catch(_){try{await client()?.auth.signOut()}catch(__){}}} + + async function updatePassword({currentPassword='',newPassword,clearForced=false}){ + const c=client(),ss=session();if(!c||!ss?.user)throw new Error('Сессия пользователя недоступна.'); + const email=String(ss.user.email||'').trim(); + if(currentPassword){const verify=await c.auth.signInWithPassword({email,password:currentPassword});if(verify.error)throw new Error('Текущий пароль введён неверно.');} + const metadata={...(ss.user.user_metadata||{})};if(clearForced)metadata.must_change_password=false; + const result=await c.auth.updateUser({password:newPassword,data:metadata});if(result.error)throw result.error; + try{await c.auth.refreshSession()}catch(_){} + return result.data?.user||null; + } + + function openPasswordModal({forced=false}={}){ + installStyle();$('cateriumPasswordGateV1771')?.remove(); + const ss=session(),user=ss?.user;if(!user)return false; + forcedOpen=forced; + const host=document.createElement('div');host.id='cateriumPasswordGateV1771';host.className='cat-password-gate-v1771'; + host.innerHTML=`
${forced?'Вы вошли по временному паролю. Для продолжения работы задайте свой новый пароль. Закрыть это окно без смены пароля нельзя.':'Пароль меняется только для вашего аккаунта Caterium.'}
${forced?'':``}