275 lines
19 KiB
HTML
Executable File
275 lines
19 KiB
HTML
Executable File
<!DOCTYPE html><html lang="fr" data-theme="dark"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1.0">
|
|
<title>WEVADS - CVC Vault</title>
|
|
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;700&family=DM+Sans:wght@400;500;600;700&display=swap" rel="stylesheet">
|
|
<style>
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
:root{--bg:#060a14;--s:#0c1220;--s2:#111827;--b:#1e293b;--t:#e2e8f0;--d:#64748b;--m:#475569;--cy:#22d3ee;--gn:#34d399;--am:#fbbf24;--rd:#f87171;--pu:#a78bfa;--bl:#60a5fa;--pk:#f472b6}
|
|
body{background:var(--bg);color:var(--t);font-family:'DM Sans',sans-serif;padding:20px}
|
|
.mono{font-family:'JetBrains Mono',monospace}
|
|
.hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;flex-wrap:wrap;gap:12px}
|
|
h1{font-size:24px;font-weight:700}h2{font-size:16px;font-weight:700;margin-bottom:12px}
|
|
.back{color:var(--d);text-decoration:none;font-size:12px;padding:6px 14px;border:1px solid var(--b);border-radius:8px}
|
|
.back:hover{border-color:var(--cy);color:var(--cy)}
|
|
.stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:12px;margin-bottom:20px}
|
|
.sc{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px}
|
|
.sv{font-size:26px;font-weight:700;font-family:'JetBrains Mono',monospace}
|
|
.sl{font-size:10px;color:var(--d);text-transform:uppercase;letter-spacing:.5px;margin-top:4px}
|
|
.panel{background:var(--s);border:1px solid var(--b);border-radius:12px;padding:16px;margin-bottom:16px}
|
|
table{width:100%;border-collapse:collapse;font-size:12px}
|
|
th{text-align:left;color:var(--d);font-size:10px;text-transform:uppercase;padding:8px 10px;border-bottom:1px solid var(--b)}
|
|
td{padding:8px 10px;border-bottom:1px solid rgba(30,41,59,.5)}
|
|
tr:hover{background:rgba(34,211,238,.03)}
|
|
.badge{padding:2px 8px;border-radius:6px;font-size:9px;font-weight:700;text-transform:uppercase}
|
|
.badge-ok{background:rgba(52,211,153,.15);color:var(--gn)}.badge-warn{background:rgba(251,191,36,.15);color:var(--am)}.badge-err{background:rgba(248,113,113,.15);color:var(--rd)}.badge-used{background:rgba(167,139,250,.15);color:var(--pu)}
|
|
.btn{padding:6px 14px;border-radius:8px;font-size:11px;font-weight:600;border:1px solid var(--b);background:var(--s2);color:var(--t);cursor:pointer;transition:all .2s;text-decoration:none;display:inline-block}
|
|
.btn:hover{border-color:var(--cy);color:var(--cy)}
|
|
.btn-p{background:rgba(34,211,238,.15);border-color:var(--cy);color:var(--cy)}
|
|
.btn-d{background:rgba(248,113,113,.1);border-color:var(--rd);color:var(--rd)}
|
|
.btn-sm{padding:3px 8px;font-size:10px}
|
|
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
|
|
@media(max-width:900px){.grid2{grid-template-columns:1fr}}
|
|
input,select,textarea{background:var(--s2);border:1px solid var(--b);border-radius:8px;padding:8px 12px;color:var(--t);font-size:12px;width:100%}
|
|
input:focus,select:focus{outline:none;border-color:var(--cy)}
|
|
.tabs{display:flex;gap:4px;margin-bottom:16px;border-bottom:1px solid var(--b);padding-bottom:8px}
|
|
.tab{padding:6px 16px;border-radius:8px 8px 0 0;font-size:12px;font-weight:600;cursor:pointer;color:var(--d)}
|
|
.tab.active{color:var(--cy);background:rgba(34,211,238,.08);border-bottom:2px solid var(--cy)}
|
|
|
|
/* Credit card visual */
|
|
.card-visual{background:linear-gradient(135deg,#1a1a2e 0%,#16213e 50%,#0f3460 100%);border-radius:14px;padding:20px;width:320px;height:190px;position:relative;overflow:hidden;margin:10px auto;box-shadow:0 8px 32px rgba(0,0,0,.4)}
|
|
.card-visual::after{content:'';position:absolute;top:-50%;right:-50%;width:100%;height:100%;background:radial-gradient(circle,rgba(255,255,255,.05) 0%,transparent 70%);border-radius:50%}
|
|
.card-chip{width:40px;height:30px;background:linear-gradient(135deg,#c9a84c,#f0d68a,#c9a84c);border-radius:6px;margin-bottom:16px}
|
|
.card-number{font-family:'JetBrains Mono',monospace;font-size:18px;letter-spacing:3px;margin-bottom:16px;color:#fff}
|
|
.card-bottom{display:flex;justify-content:space-between;align-items:end}
|
|
.card-name{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:rgba(255,255,255,.7)}
|
|
.card-exp{font-size:11px;color:rgba(255,255,255,.7)}.card-exp span{display:block;font-size:8px;text-transform:uppercase;margin-bottom:2px}
|
|
.card-brand{position:absolute;bottom:20px;right:20px;font-size:24px;font-weight:700;color:rgba(255,255,255,.3)}
|
|
|
|
.fr{display:flex;gap:10px;margin-bottom:10px;align-items:end}.fr>div{flex:1}
|
|
.fr label{display:block;font-size:10px;color:var(--d);text-transform:uppercase;margin-bottom:4px;letter-spacing:.5px}
|
|
</style><style>.light{--bg:#f0f2f5;--s:#ffffff;--s2:#f8fafc;--b:#e2e8f0;--t:#1e293b;--d:#64748b}.light input,.light select,.light textarea{background:#f8fafc;border-color:#e2e8f0;color:#1e293b}</style>
|
|
|
|
<style id="weval-theme-system">
|
|
/* Day/Night Theme Toggle */
|
|
[data-theme="light"] { --bg:#f0f2f5!important; --s:#ffffff!important; --s2:#f8fafc!important; --b:#e2e8f0!important; --t:#1e293b!important; --d:#64748b!important; }
|
|
[data-theme="light"] input, [data-theme="light"] select, [data-theme="light"] textarea {
|
|
background:#f8fafc!important; border-color:#e2e8f0!important; color:#1e293b!important;
|
|
}
|
|
[data-theme="light"] .hdr, [data-theme="light"] header, [data-theme="light"] nav {
|
|
background:#ffffff!important; border-color:#e2e8f0!important;
|
|
}
|
|
[data-theme="light"] table, [data-theme="light"] th, [data-theme="light"] td {
|
|
border-color:#e2e8f0!important;
|
|
}
|
|
[data-theme="light"] th { background:#f8fafc!important; }
|
|
[data-theme="light"] .sc, [data-theme="light"] .card, [data-theme="light"] [class*="card"] {
|
|
background:#ffffff!important; border-color:#e2e8f0!important;
|
|
}
|
|
.weval-theme-btn {
|
|
position:fixed; bottom:16px; right:16px; z-index:9999;
|
|
width:40px; height:40px; border-radius:50%;
|
|
border:1px solid var(--b, #1e293b);
|
|
background:var(--s, #0c1220);
|
|
color:var(--t, #e2e8f0);
|
|
cursor:pointer; font-size:18px;
|
|
display:flex; align-items:center; justify-content:center;
|
|
box-shadow:0 2px 8px rgba(0,0,0,0.3);
|
|
transition:all 0.2s;
|
|
}
|
|
.weval-theme-btn:hover { transform:scale(1.1); }
|
|
</style>
|
|
</head><body>
|
|
<div class="hdr">
|
|
<div><h1>💳 CVC Vault</h1><div style="color:var(--d);font-size:12px;margin-top:2px">Systeme d'Identite → Cartes virtuelles pour personas et comptes</div></div>
|
|
<div style="display:flex;gap:8px"><a class="back" href="menu.html">← Menu</a><a class="back" href="mail-personas.html">Personas</a><a class="back" href="account-creator.html">Account Creator</a></div>
|
|
</div>
|
|
|
|
<div class="stats">
|
|
<div class="sc"><div class="sv" style="color:var(--cy)">2,847</div><div class="sl">Total Cards</div></div>
|
|
<div class="sc"><div class="sv" style="color:var(--gn)">2,134</div><div class="sl">Active</div></div>
|
|
<div class="sc"><div class="sv" style="color:var(--pu)">489</div><div class="sl">Assigned</div></div>
|
|
<div class="sc"><div class="sv" style="color:var(--am)">1,645</div><div class="sl">Available</div></div>
|
|
<div class="sc"><div class="sv" style="color:var(--rd)">224</div><div class="sl">Expired/Declined</div></div>
|
|
<div class="sc"><div class="sv" style="color:var(--bl)">$12,340</div><div class="sl">Total Spent</div></div>
|
|
</div>
|
|
|
|
<div class="tabs">
|
|
<div class="tab active" onclick="showTab('cards')">Card Inventory</div>
|
|
<div class="tab" onclick="showTab('gen')">+ Generate Cards</div>
|
|
<div class="tab" onclick="showTab('assign')">Assign to Persona</div>
|
|
<div class="tab" onclick="showTab('providers')">Providers</div>
|
|
<div class="tab" onclick="showTab('audit')">Audit Log</div>
|
|
</div>
|
|
|
|
<!-- CARDS TAB -->
|
|
<div id="tab-cards">
|
|
<div class="grid2">
|
|
<div class="panel">
|
|
<h2>Card Inventory</h2>
|
|
<div style="display:flex;gap:8px;margin-bottom:12px">
|
|
<select style="width:auto"><option>All Types</option><option>Visa</option><option>Mastercard</option><option>Amex</option></select>
|
|
<select style="width:auto"><option>All Status</option><option>Active</option><option>Assigned</option><option>Expired</option></select>
|
|
<input type="text" placeholder="Search BIN, last 4, persona..." style="width:200px">
|
|
</div>
|
|
<table>
|
|
<tr><th>Card</th><th>Type</th><th>BIN</th><th>Exp</th><th>Status</th><th>Persona</th><th></th></tr>
|
|
<tr><td class="mono">**** 4821</td><td>Visa</td><td class="mono">424242</td><td class="mono">03/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td>Jean Dupont</td><td><button class="btn btn-sm">Details</button></td></tr>
|
|
<tr><td class="mono">**** 7734</td><td>MC</td><td class="mono">512345</td><td class="mono">08/26</td><td><span class="badge badge-used">ASSIGNED</span></td><td>Marie Bernard</td><td><button class="btn btn-sm">Details</button></td></tr>
|
|
<tr><td class="mono">**** 1290</td><td>Visa</td><td class="mono">489312</td><td class="mono">12/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td>—</td><td><button class="btn btn-sm">Assign</button></td></tr>
|
|
<tr><td class="mono">**** 5543</td><td>Amex</td><td class="mono">371449</td><td class="mono">05/26</td><td><span class="badge badge-ok">ACTIVE</span></td><td>Pierre Martin</td><td><button class="btn btn-sm">Details</button></td></tr>
|
|
<tr><td class="mono">**** 8821</td><td>Visa</td><td class="mono">424242</td><td class="mono">01/26</td><td><span class="badge badge-err">EXPIRED</span></td><td>Luc Moreau</td><td><button class="btn btn-sm btn-d">Remove</button></td></tr>
|
|
<tr><td class="mono">**** 3398</td><td>MC</td><td class="mono">543210</td><td class="mono">11/27</td><td><span class="badge badge-ok">ACTIVE</span></td><td>—</td><td><button class="btn btn-sm">Assign</button></td></tr>
|
|
<tr><td class="mono">**** 6612</td><td>Visa</td><td class="mono">476123</td><td class="mono">07/27</td><td><span class="badge badge-used">ASSIGNED</span></td><td>Sophie Klein</td><td><button class="btn btn-sm">Details</button></td></tr>
|
|
<tr><td class="mono">**** 9945</td><td>MC</td><td class="mono">512345</td><td class="mono">02/27</td><td><span class="badge badge-warn">LOW BAL</span></td><td>Thomas Weber</td><td><button class="btn btn-sm">Top up</button></td></tr>
|
|
</table>
|
|
<div style="margin-top:10px;display:flex;gap:8px">
|
|
<button class="btn">Export CSV</button>
|
|
<button class="btn btn-d">Purge Expired</button>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<!-- CARD PREVIEW -->
|
|
<div class="panel">
|
|
<h2>Card Preview</h2>
|
|
<div class="card-visual">
|
|
<div class="card-chip"></div>
|
|
<div class="card-number">4242 •••• •••• 4821</div>
|
|
<div class="card-bottom">
|
|
<div><div class="card-name">Jean Dupont</div></div>
|
|
<div class="card-exp"><span>Expires</span>03/27</div>
|
|
</div>
|
|
<div class="card-brand">VISA</div>
|
|
</div>
|
|
<div style="margin-top:12px;text-align:center;font-size:11px;color:var(--d)">
|
|
CVC: <span class="mono" style="color:var(--am)">•••</span> · Balance: <span class="mono" style="color:var(--gn)">$245.00</span> · Created: 2025-12-15
|
|
</div>
|
|
</div>
|
|
|
|
<!-- STATS BY TYPE -->
|
|
<div class="panel">
|
|
<h2>Distribution</h2>
|
|
<table>
|
|
<tr><th>Provider</th><th>Cards</th><th>Active</th><th>Spend</th></tr>
|
|
<tr><td><b>Visa Virtual</b></td><td class="mono">1,420</td><td class="mono" style="color:var(--gn)">1,180</td><td class="mono">$6,800</td></tr>
|
|
<tr><td><b>Mastercard</b></td><td class="mono">890</td><td class="mono" style="color:var(--gn)">720</td><td class="mono">$3,200</td></tr>
|
|
<tr><td><b>Amex</b></td><td class="mono">340</td><td class="mono" style="color:var(--gn)">234</td><td class="mono">$1,890</td></tr>
|
|
<tr><td><b>Prepaid/Gift</b></td><td class="mono">197</td><td class="mono" style="color:var(--am)">120</td><td class="mono">$450</td></tr>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="panel">
|
|
<h2>Quick Actions</h2>
|
|
<div style="display:flex;flex-wrap:wrap;gap:8px">
|
|
<button class="btn btn-p" onclick="showTab('gen')">Generate Cards</button>
|
|
<button class="btn" onclick="alert('Auto-assigning to unlinked personas...')">Auto-Assign</button>
|
|
<button class="btn" onclick="alert('Checking all active cards...')">Health Check</button>
|
|
<a class="btn" href="mail-personas.html">Personas</a>
|
|
<a class="btn" href="account-creator.html">Account Creator</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- GENERATE TAB -->
|
|
<div id="tab-gen" style="display:none">
|
|
<div class="panel">
|
|
<h2>Generate Virtual Cards</h2>
|
|
<div class="fr">
|
|
<div><label>Provider</label><select id="gen-provider"><option>Privacy.com</option><option>Revolut Virtual</option><option>Wise Virtual</option><option>Stripe Issuing</option><option>Custom BIN</option></select></div>
|
|
<div><label>Card Type</label><select><option>Visa</option><option>Mastercard</option><option>Amex</option></select></div>
|
|
<div><label>Quantity</label><input type="number" value="50" placeholder="Cards to generate"></div>
|
|
<div><label>Initial Balance</label><input type="text" value="$25.00" placeholder="Per card"></div>
|
|
</div>
|
|
<div class="fr">
|
|
<div><label>BIN Prefix</label><input type="text" placeholder="424242 (auto from provider)"></div>
|
|
<div><label>Country</label><select><option>US</option><option>UK</option><option>FR</option><option>DE</option><option>Random EU</option></select></div>
|
|
<div><label>Expiry Range</label><select><option>12 months</option><option>24 months</option><option>36 months</option></select></div>
|
|
<div><label>Auto-Assign</label><select><option>No - Pool only</option><option selected>Yes - To available personas</option></select></div>
|
|
</div>
|
|
<div class="fr">
|
|
<div style="flex:2"><label>Billing Address Source</label><select><option selected>From assigned persona</option><option>Random (Lookalike Engine)</option><option>Custom address</option></select></div>
|
|
<div><label>Spending Limit/mo</label><input type="text" value="$100.00"></div>
|
|
</div>
|
|
<div style="display:flex;gap:8px;margin-top:8px">
|
|
<button class="btn btn-p" onclick="alert('Generating 50 Visa virtual cards via Privacy.com...')">Generate 50 Cards</button>
|
|
<button class="btn" onclick="alert('Test: generating 1 card...')">Test (1 card)</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- ASSIGN TAB -->
|
|
<div id="tab-assign" style="display:none">
|
|
<div class="panel">
|
|
<h2>Assign Cards to Personas</h2>
|
|
<div style="margin-bottom:12px;font-size:12px;color:var(--d)">
|
|
<b style="color:var(--am)">1,645</b> cards available · <b style="color:var(--pu)">489</b> already assigned · <b style="color:var(--cy)">863</b> personas without card
|
|
</div>
|
|
<div class="fr">
|
|
<div><label>Assignment Mode</label><select><option selected>Auto (1 card per persona)</option><option>Manual selection</option><option>Batch by ISP</option></select></div>
|
|
<div><label>Target Personas</label><select><option selected>All without card (863)</option><option>Gmail personas only</option><option>O365 personas only</option><option>European personas</option></select></div>
|
|
<div><label>Card Pool</label><select><option selected>Available Visa (1,180)</option><option>Available MC (720)</option><option>Any available</option></select></div>
|
|
</div>
|
|
<div style="display:flex;gap:8px;margin-top:8px">
|
|
<button class="btn btn-p" onclick="alert('Auto-assigning 863 cards to personas...')">Auto-Assign All</button>
|
|
<button class="btn" onclick="alert('Preview assignments...')">Preview</button>
|
|
</div>
|
|
<div style="margin-top:16px;padding:12px;background:var(--s2);border-radius:8px;font-size:11px;color:var(--d)">
|
|
<b>Flux:</b> CVC Vault → Persona Factory → Account Creator → O365/GSuite registration<br>
|
|
Chaque persona recoit une carte unique pour verification de compte et abonnements.
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PROVIDERS TAB -->
|
|
<div id="tab-providers" style="display:none">
|
|
<div class="panel">
|
|
<h2>Card Providers</h2>
|
|
<table>
|
|
<tr><th>Provider</th><th>API Status</th><th>Cards Created</th><th>Success Rate</th><th>Cost/Card</th><th></th></tr>
|
|
<tr><td><b>Privacy.com</b></td><td><span class="badge badge-ok">CONNECTED</span></td><td class="mono">1,420</td><td class="mono" style="color:var(--gn)">98%</td><td class="mono">$0.00</td><td><button class="btn btn-sm">Config</button></td></tr>
|
|
<tr><td><b>Revolut Business</b></td><td><span class="badge badge-ok">CONNECTED</span></td><td class="mono">640</td><td class="mono" style="color:var(--gn)">95%</td><td class="mono">$0.50</td><td><button class="btn btn-sm">Config</button></td></tr>
|
|
<tr><td><b>Wise Virtual</b></td><td><span class="badge badge-warn">API KEY</span></td><td class="mono">320</td><td class="mono" style="color:var(--am)">89%</td><td class="mono">$0.30</td><td><button class="btn btn-sm">Setup</button></td></tr>
|
|
<tr><td><b>Stripe Issuing</b></td><td><span class="badge badge-err">NOT SET</span></td><td class="mono">0</td><td class="mono">—</td><td class="mono">$1.00</td><td><button class="btn btn-sm btn-p">Connect</button></td></tr>
|
|
</table>
|
|
<div style="margin-top:12px">
|
|
<div class="fr">
|
|
<div><label>API Key</label><input type="password" placeholder="pk_live_..."></div>
|
|
<div><label>Webhook URL</label><input type="text" value="http://89.167.40.150:5825/api/cvc-webhook.php" readonly></div>
|
|
<div style="flex:0"><label> </label><button class="btn btn-p">Save</button></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- AUDIT TAB -->
|
|
<div id="tab-audit" style="display:none">
|
|
<div class="panel">
|
|
<h2>Audit Log</h2>
|
|
<table>
|
|
<tr><th>Time</th><th>Action</th><th>Card</th><th>Persona</th><th>Details</th></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:24:10</td><td>ASSIGNED</td><td class="mono">****4821</td><td>Jean Dupont</td><td style="color:var(--gn)">Auto-assigned from pool</td></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:23:45</td><td>GENERATED</td><td class="mono">****3398</td><td>—</td><td>50 cards batch via Privacy.com</td></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:20:12</td><td>CHARGED</td><td class="mono">****7734</td><td>Marie Bernard</td><td style="color:var(--am)">$4.99 - O365 subscription</td></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:18:30</td><td>DECLINED</td><td class="mono">****8821</td><td>Luc Moreau</td><td style="color:var(--rd)">Insufficient balance</td></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:15:00</td><td>TOPPED UP</td><td class="mono">****9945</td><td>Thomas Weber</td><td style="color:var(--gn)">+$50.00</td></tr>
|
|
<tr><td class="mono" style="color:var(--d)">22:10:44</td><td>EXPIRED</td><td class="mono">****2210</td><td>—</td><td style="color:var(--rd)">Auto-removed from pool</td></tr>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function showTab(n){document.querySelectorAll('[id^="tab-"]').forEach(t=>t.style.display='none');document.querySelectorAll('.tab').forEach(t=>t.classList.remove('active'));document.getElementById('tab-'+n).style.display='block';event.target.classList.add('active');}
|
|
</script>
|
|
<script>function toggleTheme(){var b=document.body,t=document.getElementById("theme-toggle");if(b.classList.contains("light")){b.classList.remove("light");t.textContent="🌙";localStorage.setItem("wevads-theme","dark")}else{b.classList.add("light");t.textContent="☀️";localStorage.setItem("wevads-theme","light")}}if(localStorage.getItem("wevads-theme")==="light"){document.body.classList.add("light");var tb=document.getElementById("theme-toggle");if(tb)tb.textContent="☀️"}</script><script src="arsenal-common.js"></script>
|
|
|
|
|
|
<button class="weval-theme-btn" id="weval-theme-toggle" onclick="(function(){
|
|
var h=document.documentElement;
|
|
var c=h.getAttribute('data-theme')||'dark';
|
|
var n=c==='dark'?'light':'dark';
|
|
h.setAttribute('data-theme',n);
|
|
localStorage.setItem('weval-theme',n);
|
|
document.getElementById('weval-theme-toggle').textContent=n==='dark'?'☀️':'🌙';
|
|
})()">☀️</button>
|