<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
				  >
<channel>
<title>SOFT 5G SERVER</title>
<link>http://soft-5g-mobile.net/blogs.php</link>
<description><![CDATA[SOFT 5G SERVER]]></description>
<language>en-us</language>
<pubDate>Tue, 23 Jun 2026 13:53:12 -0500</pubDate>
<item>
<title>tools</title>
<link>http://soft-5g-mobile.net/blog\?postid=2</link>
<pubDate>Tue, 23 Jun 2026 13:53:12 -0500</pubDate>
<description><![CDATA[<p></p>
<p> 
<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2.45.0/dist/umd/supabase.min.js"></script>
</p>
<div class="bg-glow"></div>
<div class="bg-grid"></div>
<div class="wrap">
<div class="hero">
<div class="hero-badge">Professional Mobile Suite v1.5.4</div>
<h1><span class="gold">SOFT 5G</span> TOOLS</h1>
<p>Advanced mobile unlocking, flashing and repair solution for service centers and professionals.</p>
</div>
<div class="features-bar">
<div class="feat-item">
<div class="feat-dot"></div>
MTK Flashing</div>
<div class="feat-item">
<div class="feat-dot"></div>
Qualcomm EDL</div>
<div class="feat-item">
<div class="feat-dot"></div>
ADB Tools</div>
<div class="feat-item">
<div class="feat-dot"></div>
SPD Support</div>
</div>
<div class="container">
<div class="card" id="authCard">
<div class="card-sub">
<h2>Account Access</h2>
<p>Register for a new account or sign in to check your subscription.</p>
</div>
<form id="authForm" onsubmit="return false;">
<div class="field"><label>Email Address</label> <input type="email" id="authEmail" placeholder="you@example.com" required="" autocomplete="email" />
<div class="hint"><i class="fas fa-exclamation-triangle"></i> Use a real email &mdash; disposable emails are not allowed and you need it to recover your password.</div>
</div>
<div class="field"><label>Password</label> <input type="password" id="authPass" placeholder="Minimum 6 characters" required="" minlength="6" autocomplete="current-password" /></div>
<div class="btn-row"><button type="button" class="btn btn-outline" id="btnRegister">Register</button> <button type="button" class="btn btn-primary" id="btnSignIn">Sign In</button></div>
<a href="#" class="forgot-link" id="forgotLink">Forgot your password? <span>Reset it</span></a>
<div id="authMsg"></div>
</form></div>
<div class="change-pass-card hidden" id="forgotCard">
<div class="card-sub">
<h3>Reset Password</h3>
<p>Enter your email and we will send you a password reset link.</p>
</div>
<div class="field"><label>Email Address</label> <input type="email" id="forgotEmail" placeholder="you@example.com" required="" autocomplete="email" /></div>
<div class="btn-row"><button type="button" class="btn btn-outline" id="btnForgotCancel" style="flex: 1;">Cancel</button> <button type="button" class="btn btn-primary" id="btnForgotSend" style="flex: 1;">Send Link</button></div>
<div id="forgotMsg"></div>
</div>
<div class="change-pass-card hidden" id="changePassCard">
<div class="card-sub">
<h3>Change Password</h3>
<p>Enter your current password and a new one below.</p>
</div>
<div class="field"><label>Current Password</label> <input type="password" id="currentPass" placeholder="Your current password" required="" minlength="6" /></div>
<div class="field"><label>New Password</label> <input type="password" id="newPass" placeholder="Minimum 6 characters" required="" minlength="6" /></div>
<div class="field"><label>Confirm New Password</label> <input type="password" id="confirmPass" placeholder="Re-enter new password" required="" minlength="6" /></div>
<div class="btn-row"><button type="button" class="btn btn-outline" id="btnChangeCancel" style="flex: 1;">Cancel</button> <button type="button" class="btn btn-primary" id="btnChangePass" style="flex: 1;">Update Password</button></div>
<div id="changeMsg"></div>
</div>
<div class="recovery-card hidden" id="recoveryCard">
<div class="card-sub">
<h3><i class="fas fa-lock"></i> Set New Password</h3>
<p>You arrived from a password reset email.<br />Create a new password below.</p>
</div>
<div class="field"><label>New Password</label> <input type="password" id="recoveryPass" placeholder="Minimum 6 characters" required="" minlength="6" /></div>
<div class="field"><label>Confirm Password</label> <input type="password" id="recoveryConfirm" placeholder="Re-enter new password" required="" minlength="6" /></div>
<div class="btn-row"><button type="button" class="btn btn-outline" onclick="location.href=location.pathname" style="flex: 1;">Cancel</button> <button type="button" class="btn btn-primary" id="btnRecovery" style="flex: 1;">Set Password</button></div>
<div id="recoveryMsg"></div>
</div>
<div class="card result-card hidden" id="resultCard">
<div class="status-box">
<div class="status-icon" id="resIconWrap"><i id="resIcon" class="fas fa-clipboard-list"></i></div>
<div class="status-title" id="resTitle">Subscription Status</div>
<div class="status-text" id="resText"></div>
<div class="status-detail" id="resDetails"></div>
<div id="resBadge"></div>
</div>
<div class="btn-row" style="margin-top: 20px;"><button type="button" class="btn btn-outline" onclick="location.reload()" style="flex: 1;">Back to Form</button> <button type="button" class="btn btn-primary" id="btnShowChange" style="flex: 1;">Change Password</button></div>
</div>
</div>
<div class="links-section">
<h3>Our Channels</h3>
<div class="links-grid"><a href="https://api.whatsapp.com/send/?phone=963994039458&amp;text&amp;type=phone_number&amp;app_absent=0" target="_blank" class="link-btn wa" rel="noopener"><i class="fab fa-whatsapp"></i> Activation</a> <a href="https://t.me/soft55g" target="_blank" class="link-btn tg" rel="noopener"><i class="fab fa-telegram-plane"></i> Telegram</a> <a href="https://www.youtube.com/@soft-5g-mobile/videos" target="_blank" class="link-btn yt" rel="noopener"><i class="fab fa-youtube"></i> YouTube</a> <a href="https://www.facebook.com/profile.php?id=100087924113832" target="_blank" class="link-btn fb" rel="noopener"><i class="fab fa-facebook-f"></i> Facebook</a> <a href="https://soft-5g-mobile.blogspot.com/" target="_blank" class="link-btn" rel="noopener"><i class="fas fa-download"></i> Download</a> <a href="https://whatsapp.com/channel/0029Va9dexn3GJOqRgoWA347" target="_blank" class="link-btn wa" rel="noopener"><i class="fas fa-bullhorn"></i> WA Channel</a> <a href="https://soft-5g-mobile.net/" target="_blank" class="link-btn" rel="noopener"><i class="fas fa-tools"></i> Repair Server</a> <a href="https://chat.whatsapp.com/CjqaiSAdUzP5I4kgnGazdD" target="_blank" class="link-btn wa" rel="noopener"><i class="fas fa-wrench"></i> Tech Support</a></div>
</div>
<footer>SOFT 5G TOOLS &copy; 2026. All rights reserved.</footer></div>
<p>
<script>
  const { createClient } = supabase;
  const sb = createClient('https://ektmtwfdyrmzmdcbrzbc.supabase.co', 'sb_publishable_pHFDIVFaSgzfn2d7AqAYEw_s1g_iFih');

  function show(el, html, type) {
    el.innerHTML = `<div class="msg ${type}">${html}</div>`;
  }

  function setIcon(type) {
    const w = document.getElementById('resIconWrap');
    w.className = 'status-icon ' + (type==='ok'?'ok':type==='err'?'err':'warn');
    const icon = document.getElementById('resIcon');
    icon.className = type==='ok'?'fas fa-check':type==='err'?'fas fa-times':'fas fa-clock';
  }

  function isValidEmail(email) {
    const strictRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$/;
    if (!strictRegex.test(email)) return false;
    const domain = email.split('@')[1].toLowerCase();
    const disposableDomains = ['tempmail.com','guerrillamail.com','mailinator.com','10minutemail.com','yopmail.com','sharklasers.com','throwawaymail.com','getairmail.com','temp-mail.org','fakeinbox.com'];
    if (disposableDomains.includes(domain)) return false;
    return true;
  }

  async function checkGmailExists(email) {
    if (!email.toLowerCase().endsWith('@gmail.com')) return true;
    const localPart = email.split('@')[0];
    if (/^testd*@/i.test(email)) return false;
    if (/^faked*@/i.test(email)) return false;
    if (/^tempd*@/i.test(email)) return false;
    if (/^userd*@/i.test(email)) return false;
    if (localPart.length < 3) return false;
    return true;
  }

  document.getElementById('btnRegister').onclick = async () => {
    const btn = document.getElementById('btnRegister');
    const msg = document.getElementById('authMsg');
    const email = document.getElementById('authEmail').value.trim();
    const pass = document.getElementById('authPass').value;

    if (!email || !pass || pass.length < 6) {
      show(msg, 'Please enter a valid email and password (6+ characters).', 'err');
      return;
    }
    if (!isValidEmail(email)) {
      show(msg, 'Invalid email format or disposable email not allowed. Please use a real email.', 'err');
      return;
    }
    const gmailCheck = await checkGmailExists(email);
    if (!gmailCheck) {
      show(msg, 'This email appears to be invalid. Please use a real Gmail account.', 'err');
      return;
    }

    btn.disabled = true;
    btn.innerHTML = '<span class="spinner"></span> Creating...';
    document.getElementById('btnSignIn').disabled = true;

    const res = await fetch(`${sb.supabaseUrl}/auth/v1/signup`, {
      method: 'POST',
      headers: { 'apikey': sb.supabaseKey, 'Content-Type': 'application/json' },
      body: JSON.stringify({ email, password: pass })
    });
    const data = await res.json();

    if (!res.ok) {
      show(msg, data.msg || data.message || 'Signup failed. Please try again.', 'err');
      btn.disabled = false;
      btn.innerHTML = 'Register';
      document.getElementById('btnSignIn').disabled = false;
    } else {
      // Insert into users table so admin panel can see pending approval
      const userId = data.id || data.user?.id;
      const accessToken = data.access_token || data.session?.access_token;
      if (userId) {
        fetch(`${sb.supabaseUrl}/rest/v1/users`, {
          method: 'POST',
          headers: {
            'apikey': sb.supabaseKey,
            'Authorization': `Bearer ${accessToken || sb.supabaseKey}`,
            'Content-Type': 'application/json',
            'Prefer': 'return=minimal'
          },
          body: JSON.stringify({
            id: userId,
            email: email,
            status: false,
            check_id: false
          })
        }).catch(e => console.error('Failed to insert user metadata:', e));
      }

      document.getElementById('authCard').classList.add('hidden');
      document.getElementById('resultCard').classList.remove('hidden');
      setIcon('warn');
      document.getElementById('resTitle').textContent = 'Account Created';
      document.getElementById('resText').innerHTML = 'Your account has been created successfully.<br>It is now pending admin approval before you can use the software.';
      document.getElementById('resDetails').innerHTML = '';
      document.getElementById('resBadge').innerHTML = '<span class="badge badge-warn"><span class="badge-dot"></span>Pending Approval</span>';
    }
  };

  document.getElementById('btnSignIn').onclick = async () => {
    const btn = document.getElementById('btnSignIn');
    const msg = document.getElementById('authMsg');
    const email = document.getElementById('authEmail').value.trim();
    const pass = document.getElementById('authPass').value;

    if (!email || !pass) {
      show(msg, 'Please enter your email and password.', 'err');
      return;
    }
    if (!isValidEmail(email)) {
      show(msg, 'Invalid email format. Please enter a valid email.', 'err');
      return;
    }

    btn.disabled = true;
    btn.innerHTML = '<span class="spinner"></span> Signing in...';
    document.getElementById('btnRegister').disabled = true;

    const authRes = await fetch(`${sb.supabaseUrl}/auth/v1/token?grant_type=password`, {
      method: 'POST',
      headers: { 'apikey': sb.supabaseKey, 'Content-Type': 'application/json' },
      body: JSON.stringify({ email, password: pass })
    });
    const authData = await authRes.json();

    if (!authRes.ok || !authData.access_token) {
      show(msg, 'Invalid email or password. Please try again.', 'err');
      btn.disabled = false;
      btn.innerHTML = 'Sign In';
      document.getElementById('btnRegister').disabled = false;
      return;
    }

    const metaRes = await fetch(`${sb.supabaseUrl}/rest/v1/users?id=eq.${authData.user.id}`, {
      headers: { 'apikey': sb.supabaseKey, 'Authorization': `Bearer ${authData.access_token}` }
    });
    const metaData = await metaRes.json();
    const meta = metaData && metaData[0];

    document.getElementById('authCard').classList.add('hidden');
    document.getElementById('resultCard').classList.remove('hidden');

    if (!meta) {
      setIcon('err');
      document.getElementById('resTitle').textContent = 'Account Not Found';
      document.getElementById('resText').innerHTML = 'We could not find your account in our system.<br>Please contact support for assistance.';
      document.getElementById('resDetails').innerHTML = '';
      document.getElementById('resBadge').innerHTML = '<span class="badge badge-danger"><span class="badge-dot"></span>No Data</span>';
    } else if (!meta.status) {
      setIcon('warn');
      document.getElementById('resTitle').textContent = 'Pending Approval';
      document.getElementById('resText').innerHTML = 'Your account is waiting for admin activation.<br>You will receive access once approved.';
      document.getElementById('resDetails').innerHTML = `<div class="detail-item"><span class="val">${meta.email}</span><span class="lbl">Email</span></div>`;
      document.getElementById('resBadge').innerHTML = '<span class="badge badge-warn"><span class="badge-dot"></span>Pending Approval</span>';
    } else {
      const expiry = meta.expiry_date ? new Date(meta.expiry_date) : null;
      const days = expiry ? Math.ceil((expiry - new Date()) / 86400000) : -1;
      const isExpired = days <= 0;
      const dateStr = expiry ? expiry.toLocaleDateString('en-GB') : 'N/A';

      setIcon(isExpired ? 'err' : 'ok');
      document.getElementById('resTitle').textContent = isExpired ? 'Subscription Expired' : 'Active Subscription';
      document.getElementById('resText').innerHTML = isExpired
        ? 'Your subscription has expired.<br>Please contact admin to renew your access.'
        : 'Your subscription is active and ready to use.';
      document.getElementById('resDetails').innerHTML = `
        <div class="detail-item"><span class="val">${days > 0 ? days : 0}</span><span class="lbl">Days Left</span></div>
        <div class="detail-item"><span class="val">${dateStr}</span><span class="lbl">Expires On</span></div>
      `;
      const badgeClass = isExpired ? 'badge-danger' : days <= 7 ? 'badge-warn' : 'badge-success';
      const badgeText = isExpired ? 'Expired' : days <= 7 ? `${days} Days Left` : 'Active';
      document.getElementById('resBadge').innerHTML = `<span class="badge ${badgeClass}"><span class="badge-dot"></span>${badgeText}</span>`;
    }

    btn.disabled = false;
    btn.innerHTML = 'Sign In';
    document.getElementById('btnRegister').disabled = false;
    msg.innerHTML = '';
  };

  // - Forgot Password -
  document.getElementById('forgotLink').onclick = (e) => {
    e.preventDefault();
    document.getElementById('authCard').classList.add('hidden');
    document.getElementById('forgotCard').classList.remove('hidden');
    document.getElementById('forgotEmail').value = document.getElementById('authEmail').value;
  };
  document.getElementById('btnForgotCancel').onclick = () => {
    document.getElementById('forgotCard').classList.add('hidden');
    document.getElementById('authCard').classList.remove('hidden');
    document.getElementById('forgotMsg').innerHTML = '';
  };
  document.getElementById('btnForgotSend').onclick = async () => {
    const btn = document.getElementById('btnForgotSend');
    const msg = document.getElementById('forgotMsg');
    const email = document.getElementById('forgotEmail').value.trim();
    if (!email) { show(msg, 'Please enter your email address.', 'err'); return; }
    if (!isValidEmail(email)) { show(msg, 'Invalid email format. Please enter a valid email.', 'err'); return; }
    btn.disabled = true;
    btn.innerHTML = '<span class="spinner"></span> Sending...';
    const res = await fetch(`${sb.supabaseUrl}/auth/v1/recover`, {
      method: 'POST',
      headers: { 'apikey': sb.supabaseKey, 'Content-Type': 'application/json' },
      body: JSON.stringify({ email })
    });
    if (res.ok) {
      show(msg, 'Password reset link sent to your email. Check your inbox.', 'ok');
    } else {
      const data = await res.json().catch(() => ({}));
      show(msg, data.msg || data.message || 'Failed to send reset link. Try again.', 'err');
    }
    btn.disabled = false;
    btn.innerHTML = 'Send Link';
  };

  // - Change Password (after login) -
  let currentToken = null;
  document.getElementById('btnShowChange').onclick = () => {
    document.getElementById('resultCard').classList.add('hidden');
    document.getElementById('changePassCard').classList.remove('hidden');
  };
  document.getElementById('btnChangeCancel').onclick = () => {
    document.getElementById('changePassCard').classList.add('hidden');
    document.getElementById('resultCard').classList.remove('hidden');
    document.getElementById('changeMsg').innerHTML = '';
    document.getElementById('currentPass').value = '';
    document.getElementById('newPass').value = '';
    document.getElementById('confirmPass').value = '';
  };
  document.getElementById('btnChangePass').onclick = async () => {
    const btn = document.getElementById('btnChangePass');
    const msg = document.getElementById('changeMsg');
    const current = document.getElementById('currentPass').value;
    const newPass = document.getElementById('newPass').value;
    const confirm = document.getElementById('confirmPass').value;

    if (!current || !newPass || newPass.length < 6) {
      show(msg, 'Please fill all fields. New password must be 6+ characters.', 'err');
      return;
    }
    if (newPass !== confirm) {
      show(msg, 'New password and confirmation do not match.', 'err');
      return;
    }

    btn.disabled = true;
    btn.innerHTML = '<span class="spinner"></span> Updating...';

    // First re-authenticate with current password to get a fresh token
    const email = document.getElementById('authEmail').value.trim();
    const authRes = await fetch(`${sb.supabaseUrl}/auth/v1/token?grant_type=password`, {
      method: 'POST',
      headers: { 'apikey': sb.supabaseKey, 'Content-Type': 'application/json' },
      body: JSON.stringify({ email, password: current })
    });
    const authData = await authRes.json();

    if (!authRes.ok || !authData.access_token) {
      show(msg, 'Current password is incorrect.', 'err');
      btn.disabled = false;
      btn.innerHTML = 'Update Password';
      return;
    }

    // Update password
    const updateRes = await fetch(`${sb.supabaseUrl}/auth/v1/user`, {
      method: 'PUT',
      headers: { 'apikey': sb.supabaseKey, 'Authorization': `Bearer ${authData.access_token}`, 'Content-Type': 'application/json' },
      body: JSON.stringify({ password: newPass })
    });

    if (updateRes.ok) {
      show(msg, 'Password updated successfully!', 'ok');
      setTimeout(() => {
        document.getElementById('changePassCard').classList.add('hidden');
        document.getElementById('resultCard').classList.remove('hidden');
        document.getElementById('changeMsg').innerHTML = '';
        document.getElementById('currentPass').value = '';
        document.getElementById('newPass').value = '';
        document.getElementById('confirmPass').value = '';
      }, 1500);
    } else {
      const data = await updateRes.json().catch(() => ({}));
      show(msg, data.msg || data.message || 'Failed to update password.', 'err');
    }
    btn.disabled = false;
    btn.innerHTML = 'Update Password';
  };

  // - Handle password reset from email link (access_token in URL hash) -
  (function handleEmailRecovery() {
    const hash = window.location.hash;
    if (!hash || !hash.includes('access_token')) return;

    const params = new URLSearchParams(hash.slice(1));
    const accessToken = params.get('access_token');
    const type = params.get('type');

    if (!accessToken || type !== 'recovery') return;

    // Hide auth card, show recovery card
    document.getElementById('authCard').classList.add('hidden');
    document.getElementById('forgotCard').classList.add('hidden');
    document.getElementById('recoveryCard').classList.remove('hidden');

    // Clear hash from URL (clean look)
    history.replaceState(null, '', location.pathname);

    document.getElementById('btnRecovery').onclick = async () => {
      const btn = document.getElementById('btnRecovery');
      const msg = document.getElementById('recoveryMsg');
      const newPass = document.getElementById('recoveryPass').value;
      const confirm = document.getElementById('recoveryConfirm').value;

      if (!newPass || newPass.length < 6) {
        show(msg, 'Password must be at least 6 characters.', 'err');
        return;
      }
      if (newPass !== confirm) {
        show(msg, 'Passwords do not match.', 'err');
        return;
      }

      btn.disabled = true;
      btn.innerHTML = '<span class="spinner"></span> Updating...';

      const res = await fetch(`${sb.supabaseUrl}/auth/v1/user`, {
        method: 'PUT',
        headers: {
          'apikey': sb.supabaseKey,
          'Authorization': `Bearer ${accessToken}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ password: newPass })
      });

      if (res.ok) {
        show(msg, 'Password reset successful! You can now sign in with your new password.', 'ok');
        setTimeout(() => {
          document.getElementById('recoveryCard').classList.add('hidden');
          document.getElementById('authCard').classList.remove('hidden');
          document.getElementById('recoveryMsg').innerHTML = '';
          document.getElementById('recoveryPass').value = '';
          document.getElementById('recoveryConfirm').value = '';
        }, 2500);
      } else {
        const data = await res.json().catch(() => ({}));
        show(msg, data.msg || data.message || 'Failed to reset password. Link may have expired.', 'err');
      }
      btn.disabled = false;
      btn.innerHTML = 'Set Password';
    };
  })();
</script>
</p>]]></description>
</item>
</channel>
</rss>