Help
RSS
API
Feed
Maltego
Contact
Domain > customers.msb.kusnjer.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2025-08-08
108.138.159.100
(
ClassC
)
2025-12-09
3.169.173.109
(
ClassC
)
Port 80
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 16590Connection: keep-aliveDate: Tue, 09 Dec 2025 07:53:04 GMTLast-Modified: Fri, 08 Aug 2025 18:17:16 GMTETag: 5236924a9c5f2ff661c152b3213bb621x-amz-server-side-encryption: AES256Accept-Ranges: bytesServer: AmazonS3X-Cache: Miss from cloudfrontVia: 1.1 e3d057b3e6efdd15e49b433f7704a6c8.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: Cov2-OynmDTG5V_DFFspK5d0G2AT8FPwvNueAgR0bsU3Sayk4dTHdQ !doctype html>html langen>head> meta charsetutf-8 /> meta nameviewport contentwidthdevice-width, initial-scale1 /> title>Media Service Bridge - Customer Portal/title> style> body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; margin: 0; padding: 2rem; background: #0b1220; color: #e7ecf3; } .card { max-width: 720px; margin: 0 auto; background: #131a2a; border: 1px solid #26314d; border-radius: 12px; padding: 1.5rem; } h1 { margin-top: 0; font-size: 1.6rem; } label { display: block; margin: 0.75rem 0 0.25rem; color: #b6c3db; } input { width: 100%; padding: 0.6rem 0.75rem; border-radius: 8px; border: 1px solid #2f3b59; background: #0f1524; color: #e7ecf3; } button { margin-top: 1rem; padding: 0.7rem 1rem; border: 0; border-radius: 8px; background: #3b82f6; color: white; cursor: pointer; } button:disabled { opacity: 0.6; cursor: not-allowed; } .muted { color: #90a2c0; font-size: 0.9rem; } .row { display: grid; grid-template-columns: 1fr; gap: 0.75rem; } .msg { margin-top: 1rem; font-size: 0.95rem; } a { color: #93c5fd; } /style>/head>body> div classcard> h1>Media Service Bridge/h1> div idauth> p classmuted>Sign in or sign up to manage your subscription and API access./p> div classrow stylemargin-bottom:1rem> button idsigninBtn>Sign in/button> button idsignupHostedBtn>Sign up/button> /div> hr styleborder-color:#26314d; margin:1rem 0/> p classmuted>After you sign in, you can subscribe from Billing Portal./p> /div> div iddashboard styledisplay:none> div styledisplay:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap> div>span classmuted>Signed in as/span> strong iduserEmail>-/strong>/div> div> button idlogoutBtn stylebackground:#ef4444>Log out/button> /div> /div> hr styleborder-color:#26314d; margin:1rem 0/> h2 stylefont-size:1.2rem;margin:0.5rem 0 0.25rem>Subscription/h2> p classmuted>Open Stripe Billing Portal to update payment method, view invoices, or cancel./p> div classrow> label fortenantId>Tenant ID/label> input idtenantId typetext placeholdert_xxxxxxxx /> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idsubscribeBtn stylebackground:#22c55e>Subscribe/button> button idbillingBtn>Open Billing Portal/button> /div> div classmsg idsubscribeMsg>/div> div classmsg idbillingMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>Usage/h2> div classrow> div idusageTotals classmuted>Last 24h: -/div> svg idusageSpark width100% height60 viewBox0 0 300 60 preserveAspectRationone stylebackground:#0f1524;border:1px solid #2f3b59;border-radius:6px>/svg> div classmsg idusageMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>API Keys/h2> p classmuted>Create and manage API keys for the data API./p> div classrow> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idcreateKeyBtn>Create key/button> button idlistKeysBtn stylebackground:#475569>List keys/button> /div> div classmsg idapiKeyMsg>/div> div idnewKey classmuted styledisplay:none>/div> ul idkeysList stylelist-style:none;padding:0;margin:0>/ul> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>API & Settings/h2> p classmuted>Your API base is code>https://api.msb.kusnjer.com/code>. Configure your media credentials below./p> div classrow> label formimirToken>Mimir Token/label> input idmimirToken typepassword placeholderpaste token /> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idsaveSettingsBtn>Save token/button> button idremoveSettingsBtn stylebackground:#ef4444>Remove token/button> /div> div classmsg idsettingsMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>Danger zone/h2> p classmuted>Suspend or delete subscription will be available here./p> /div> /div> script> const msg document.getElementById(msg); const signinBtn document.getElementById(signinBtn); const signupHostedBtn document.getElementById(signupHostedBtn); const logoutBtn document.getElementById(logoutBtn); const userEmailEl document.getElementById(userEmail); const tenantIdEl document.getElementById(tenantId); const billingBtn document.getElementById(billingBtn); const subscribeBtn document.getElementById(subscribeBtn); const billingMsg document.getElementById(billingMsg); const subscribeMsg document.getElementById(subscribeMsg); const saveSettingsBtn document.getElementById(saveSettingsBtn); const removeSettingsBtn document.getElementById(removeSettingsBtn); const usageMsg document.getElementById(usageMsg); const usageTotals document.getElementById(usageTotals); const usageSpark document.getElementById(usageSpark); const createKeyBtn document.getElementById(createKeyBtn); const listKeysBtn document.getElementById(listKeysBtn); const apiKeyMsg document.getElementById(apiKeyMsg); const newKeyEl document.getElementById(newKey); const keysList document.getElementById(keysList); const settingsMsg document.getElementById(settingsMsg); const userPoolDomain https://msb-kusnjer.auth.us-east-1.amazoncognito.com; const clientId 75scju8km56s4hcmvo9ppl9r8; const redirectUri https://customers.msb.kusnjer.com/; // Direct checkout removed; use hosted UI + billing portal instead signinBtn.addEventListener(click, () > { const url `${userPoolDomain}/login?client_id${encodeURIComponent(clientId)}&response_typetoken&scopeopenid+email+profile&redirect_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); signupHostedBtn.addEventListener(click, () > { const url `${userPoolDomain}/signup?client_id${encodeURIComponent(clientId)}&response_typetoken&scopeopenid+email+profile&redirect_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); logoutBtn.addEventListener(click, () > { sessionStorage.removeItem(id_token); sessionStorage.removeItem(access_token); const url `${userPoolDomain}/logout?client_id${encodeURIComponent(clientId)}&logout_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); function parseHashParams() { if (!window.location.hash) return {}; const h window.location.hash.substring(1); return Object.fromEntries(new URLSearchParams(h).entries()); } function decodeJwt(token) { const parts token.split(.); if (parts.length ! 3) return null; try { return JSON.parse(atob(parts1.replace(/-/g,+).replace(/_/g,/))); } catch { return null; } } let currentEmail ; // Can be Stripe Price ID (price_...) or Product ID (prod_...). Product ID uses default price automatically. const DEFAULT_PRICE prod_SpVU8lbCgqYvZW; function showDashboard(idToken) { document.getElementById(auth).style.display none; document.getElementById(dashboard).style.display ; const claims decodeJwt(idToken) || {}; userEmailEl.textContent claims.email || (unknown); currentEmail claims.email || ; if (claims.email) discoverTenant(claims.email); } async function discoverTenant(email) { try { const res await fetch(`https://msb.kusnjer.com/tenant-info?email${encodeURIComponent(email)}`); if (!res.ok) return; const data await res.json(); if (data.tenants && data.tenants.length > 0) { tenantIdEl.value data.tenants0.tenantId; } } catch {} } async function maybeHandleImplicitReturn() { const params parseHashParams(); if (params.id_token) { sessionStorage.setItem(id_token, params.id_token); if (params.access_token) sessionStorage.setItem(access_token, params.access_token); // clean hash history.replaceState({}, document.title, window.location.pathname + window.location.search); } const idToken sessionStorage.getItem(id_token); if (idToken) showDashboard(idToken); } billingBtn.addEventListener(click, async () > { billingMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { billingMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/billing-portal, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.url) window.location.href data.url; else billingMsg.textContent No URL returned; } catch (e) { billingMsg.textContent Failed to open billing portal; } }); subscribeBtn.addEventListener(click, async () > { subscribeMsg.textContent ; if (!currentEmail) { subscribeMsg.textContent Sign in first; return; } try { const res await fetch(https://msb.kusnjer.com/signup, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ email: currentEmail, plan: DEFAULT_PRICE }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.tenantId) tenantIdEl.value data.tenantId; if (data.checkoutUrl) window.location.href data.checkoutUrl; else subscribeMsg.textContent No checkout URL returned; } catch (e) { subscribeMsg.textContent Failed to start checkout; } }); saveSettingsBtn.addEventListener(click, async () > { settingsMsg.textContent ; const tenantId tenantIdEl.value.trim(); const tokenInput document.getElementById(mimirToken); const token tokenInput && value in tokenInput ? tokenInput.value.trim() : ; if (!tenantId || !token) { settingsMsg.textContent Enter tenantId and token; return; } try { const res await fetch(https://msb.kusnjer.com/settings, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId, mimirToken: token }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); settingsMsg.textContent Saved; } catch (e) { settingsMsg.textContent Failed to save; } }); removeSettingsBtn.addEventListener(click, async () > { settingsMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { settingsMsg.textContent Enter tenantId; return; } try { const res await fetch(https://msb.kusnjer.com/settings, { method: DELETE, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); settingsMsg.textContent Removed; const tokenInput document.getElementById(mimirToken); if (tokenInput && value in tokenInput) tokenInput.value ; } catch (e) { settingsMsg.textContent Failed to remove; } }); async function loadUsage() { usageMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) return; try { const res await fetch(`https://msb.kusnjer.com/usage?tenantId${encodeURIComponent(tenantId)}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); const req data.series?.requests?.values || ; const sum req.reduce((a, b) > a + b, 0); usageTotals.textContent `Last 24h: ${sum} requests`; renderSpark(req); } catch (e) { usageMsg.textContent Failed to load usage; } } function renderSpark(values) { const svg usageSpark; svg.innerHTML ; const w 300, h 60, pad 4; const n values.length || 1; const max Math.max(1, ...values); const path values.map((v, i) > { const x pad + (i * (w - 2*pad)) / Math.max(1, n - 1); const y h - pad - (v / max) * (h - 2*pad); return `${i0?M:L}${x.toFixed(1)},${y.toFixed(1)}`; }).join( ); const p document.createElementNS(http://www.w3.org/2000/svg,path); p.setAttribute(d, path || `M${pad},${h-pad} L${w-pad},${h-pad}`); p.setAttribute(stroke, #3b82f6); p.setAttribute(fill, none); p.setAttribute(stroke-width, 2); svg.setAttribute(viewBox, `0 0 ${w} ${h}`); svg.appendChild(p); } tenantIdEl.addEventListener(change, loadUsage); createKeyBtn.addEventListener(click, async () > { apiKeyMsg.textContent ; newKeyEl.style.display none; newKeyEl.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/api-key, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.apiKey) { newKeyEl.textContent `New key (copy now): ${data.apiKey}`; newKeyEl.style.display ; } await listKeys(); } catch (e) { apiKeyMsg.textContent Failed to create key; } }); listKeysBtn.addEventListener(click, listKeys); async function listKeys() { apiKeyMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(`https://msb.kusnjer.com/api-key?tenantId${encodeURIComponent(tenantId)}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); renderKeys(data.keys || ); } catch (e) { apiKeyMsg.textContent Failed to list keys; } } function renderKeys(keys) { keysList.innerHTML ; for (const k of keys) { const li document.createElement(li); li.style.display flex; li.style.alignItems center; li.style.justifyContent space-between; li.style.gap 0.5rem; li.style.padding 0.5rem 0; li.style.borderBottom 1px solid #26314d; li.innerHTML `span classmuted>${k.keyId}/span>`; const del document.createElement(button); del.textContent Delete; del.style.background #ef4444; del.addEventListener(click, () > deleteKey(k.keyId)); li.appendChild(del); keysList.appendChild(li); } } async function deleteKey(keyId) { apiKeyMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/api-key, { method: DELETE, headers: { content-type:application/json }, body: JSON.stringify({ tenantId, keyId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); await listKeys(); } catch (e) { apiKeyMsg.textContent Failed to delete key; } } // load usage when tenant discovered const origDiscover discoverTenant; discoverTenant async (email) > { await origDiscover(email); await loadUsage(); await listKeys(); } maybeHandleImplicitReturn(); /script>/body>/html>
Port 443
HTTP/1.1 200 OKContent-Type: text/htmlContent-Length: 16590Connection: keep-aliveDate: Tue, 09 Dec 2025 07:53:04 GMTLast-Modified: Fri, 08 Aug 2025 18:17:16 GMTETag: 5236924a9c5f2ff661c152b3213bb621x-amz-server-side-encryption: AES256Accept-Ranges: bytesServer: AmazonS3X-Cache: Hit from cloudfrontVia: 1.1 743dabf2fdbfd64c0bd7adf3cea9dbec.cloudfront.net (CloudFront)X-Amz-Cf-Pop: HIO52-P4X-Amz-Cf-Id: GdhUzSak9Od2bYNd2NEWhoHoVXmcwqSeq-SoPWVJnME0O7h9YIwYcwAge: 1 !doctype html>html langen>head> meta charsetutf-8 /> meta nameviewport contentwidthdevice-width, initial-scale1 /> title>Media Service Bridge - Customer Portal/title> style> body { font-family: system-ui, -apple-system, Segoe UI, Roboto, Arial, sans-serif; margin: 0; padding: 2rem; background: #0b1220; color: #e7ecf3; } .card { max-width: 720px; margin: 0 auto; background: #131a2a; border: 1px solid #26314d; border-radius: 12px; padding: 1.5rem; } h1 { margin-top: 0; font-size: 1.6rem; } label { display: block; margin: 0.75rem 0 0.25rem; color: #b6c3db; } input { width: 100%; padding: 0.6rem 0.75rem; border-radius: 8px; border: 1px solid #2f3b59; background: #0f1524; color: #e7ecf3; } button { margin-top: 1rem; padding: 0.7rem 1rem; border: 0; border-radius: 8px; background: #3b82f6; color: white; cursor: pointer; } button:disabled { opacity: 0.6; cursor: not-allowed; } .muted { color: #90a2c0; font-size: 0.9rem; } .row { display: grid; grid-template-columns: 1fr; gap: 0.75rem; } .msg { margin-top: 1rem; font-size: 0.95rem; } a { color: #93c5fd; } /style>/head>body> div classcard> h1>Media Service Bridge/h1> div idauth> p classmuted>Sign in or sign up to manage your subscription and API access./p> div classrow stylemargin-bottom:1rem> button idsigninBtn>Sign in/button> button idsignupHostedBtn>Sign up/button> /div> hr styleborder-color:#26314d; margin:1rem 0/> p classmuted>After you sign in, you can subscribe from Billing Portal./p> /div> div iddashboard styledisplay:none> div styledisplay:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap> div>span classmuted>Signed in as/span> strong iduserEmail>-/strong>/div> div> button idlogoutBtn stylebackground:#ef4444>Log out/button> /div> /div> hr styleborder-color:#26314d; margin:1rem 0/> h2 stylefont-size:1.2rem;margin:0.5rem 0 0.25rem>Subscription/h2> p classmuted>Open Stripe Billing Portal to update payment method, view invoices, or cancel./p> div classrow> label fortenantId>Tenant ID/label> input idtenantId typetext placeholdert_xxxxxxxx /> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idsubscribeBtn stylebackground:#22c55e>Subscribe/button> button idbillingBtn>Open Billing Portal/button> /div> div classmsg idsubscribeMsg>/div> div classmsg idbillingMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>Usage/h2> div classrow> div idusageTotals classmuted>Last 24h: -/div> svg idusageSpark width100% height60 viewBox0 0 300 60 preserveAspectRationone stylebackground:#0f1524;border:1px solid #2f3b59;border-radius:6px>/svg> div classmsg idusageMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>API Keys/h2> p classmuted>Create and manage API keys for the data API./p> div classrow> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idcreateKeyBtn>Create key/button> button idlistKeysBtn stylebackground:#475569>List keys/button> /div> div classmsg idapiKeyMsg>/div> div idnewKey classmuted styledisplay:none>/div> ul idkeysList stylelist-style:none;padding:0;margin:0>/ul> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>API & Settings/h2> p classmuted>Your API base is code>https://api.msb.kusnjer.com/code>. Configure your media credentials below./p> div classrow> label formimirToken>Mimir Token/label> input idmimirToken typepassword placeholderpaste token /> div styledisplay:flex;gap:0.5rem;flex-wrap:wrap> button idsaveSettingsBtn>Save token/button> button idremoveSettingsBtn stylebackground:#ef4444>Remove token/button> /div> div classmsg idsettingsMsg>/div> /div> h2 stylefont-size:1.2rem;margin:1.5rem 0 0.25rem>Danger zone/h2> p classmuted>Suspend or delete subscription will be available here./p> /div> /div> script> const msg document.getElementById(msg); const signinBtn document.getElementById(signinBtn); const signupHostedBtn document.getElementById(signupHostedBtn); const logoutBtn document.getElementById(logoutBtn); const userEmailEl document.getElementById(userEmail); const tenantIdEl document.getElementById(tenantId); const billingBtn document.getElementById(billingBtn); const subscribeBtn document.getElementById(subscribeBtn); const billingMsg document.getElementById(billingMsg); const subscribeMsg document.getElementById(subscribeMsg); const saveSettingsBtn document.getElementById(saveSettingsBtn); const removeSettingsBtn document.getElementById(removeSettingsBtn); const usageMsg document.getElementById(usageMsg); const usageTotals document.getElementById(usageTotals); const usageSpark document.getElementById(usageSpark); const createKeyBtn document.getElementById(createKeyBtn); const listKeysBtn document.getElementById(listKeysBtn); const apiKeyMsg document.getElementById(apiKeyMsg); const newKeyEl document.getElementById(newKey); const keysList document.getElementById(keysList); const settingsMsg document.getElementById(settingsMsg); const userPoolDomain https://msb-kusnjer.auth.us-east-1.amazoncognito.com; const clientId 75scju8km56s4hcmvo9ppl9r8; const redirectUri https://customers.msb.kusnjer.com/; // Direct checkout removed; use hosted UI + billing portal instead signinBtn.addEventListener(click, () > { const url `${userPoolDomain}/login?client_id${encodeURIComponent(clientId)}&response_typetoken&scopeopenid+email+profile&redirect_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); signupHostedBtn.addEventListener(click, () > { const url `${userPoolDomain}/signup?client_id${encodeURIComponent(clientId)}&response_typetoken&scopeopenid+email+profile&redirect_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); logoutBtn.addEventListener(click, () > { sessionStorage.removeItem(id_token); sessionStorage.removeItem(access_token); const url `${userPoolDomain}/logout?client_id${encodeURIComponent(clientId)}&logout_uri${encodeURIComponent(redirectUri)}`; window.location.href url; }); function parseHashParams() { if (!window.location.hash) return {}; const h window.location.hash.substring(1); return Object.fromEntries(new URLSearchParams(h).entries()); } function decodeJwt(token) { const parts token.split(.); if (parts.length ! 3) return null; try { return JSON.parse(atob(parts1.replace(/-/g,+).replace(/_/g,/))); } catch { return null; } } let currentEmail ; // Can be Stripe Price ID (price_...) or Product ID (prod_...). Product ID uses default price automatically. const DEFAULT_PRICE prod_SpVU8lbCgqYvZW; function showDashboard(idToken) { document.getElementById(auth).style.display none; document.getElementById(dashboard).style.display ; const claims decodeJwt(idToken) || {}; userEmailEl.textContent claims.email || (unknown); currentEmail claims.email || ; if (claims.email) discoverTenant(claims.email); } async function discoverTenant(email) { try { const res await fetch(`https://msb.kusnjer.com/tenant-info?email${encodeURIComponent(email)}`); if (!res.ok) return; const data await res.json(); if (data.tenants && data.tenants.length > 0) { tenantIdEl.value data.tenants0.tenantId; } } catch {} } async function maybeHandleImplicitReturn() { const params parseHashParams(); if (params.id_token) { sessionStorage.setItem(id_token, params.id_token); if (params.access_token) sessionStorage.setItem(access_token, params.access_token); // clean hash history.replaceState({}, document.title, window.location.pathname + window.location.search); } const idToken sessionStorage.getItem(id_token); if (idToken) showDashboard(idToken); } billingBtn.addEventListener(click, async () > { billingMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { billingMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/billing-portal, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.url) window.location.href data.url; else billingMsg.textContent No URL returned; } catch (e) { billingMsg.textContent Failed to open billing portal; } }); subscribeBtn.addEventListener(click, async () > { subscribeMsg.textContent ; if (!currentEmail) { subscribeMsg.textContent Sign in first; return; } try { const res await fetch(https://msb.kusnjer.com/signup, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ email: currentEmail, plan: DEFAULT_PRICE }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.tenantId) tenantIdEl.value data.tenantId; if (data.checkoutUrl) window.location.href data.checkoutUrl; else subscribeMsg.textContent No checkout URL returned; } catch (e) { subscribeMsg.textContent Failed to start checkout; } }); saveSettingsBtn.addEventListener(click, async () > { settingsMsg.textContent ; const tenantId tenantIdEl.value.trim(); const tokenInput document.getElementById(mimirToken); const token tokenInput && value in tokenInput ? tokenInput.value.trim() : ; if (!tenantId || !token) { settingsMsg.textContent Enter tenantId and token; return; } try { const res await fetch(https://msb.kusnjer.com/settings, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId, mimirToken: token }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); settingsMsg.textContent Saved; } catch (e) { settingsMsg.textContent Failed to save; } }); removeSettingsBtn.addEventListener(click, async () > { settingsMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { settingsMsg.textContent Enter tenantId; return; } try { const res await fetch(https://msb.kusnjer.com/settings, { method: DELETE, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); settingsMsg.textContent Removed; const tokenInput document.getElementById(mimirToken); if (tokenInput && value in tokenInput) tokenInput.value ; } catch (e) { settingsMsg.textContent Failed to remove; } }); async function loadUsage() { usageMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) return; try { const res await fetch(`https://msb.kusnjer.com/usage?tenantId${encodeURIComponent(tenantId)}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); const req data.series?.requests?.values || ; const sum req.reduce((a, b) > a + b, 0); usageTotals.textContent `Last 24h: ${sum} requests`; renderSpark(req); } catch (e) { usageMsg.textContent Failed to load usage; } } function renderSpark(values) { const svg usageSpark; svg.innerHTML ; const w 300, h 60, pad 4; const n values.length || 1; const max Math.max(1, ...values); const path values.map((v, i) > { const x pad + (i * (w - 2*pad)) / Math.max(1, n - 1); const y h - pad - (v / max) * (h - 2*pad); return `${i0?M:L}${x.toFixed(1)},${y.toFixed(1)}`; }).join( ); const p document.createElementNS(http://www.w3.org/2000/svg,path); p.setAttribute(d, path || `M${pad},${h-pad} L${w-pad},${h-pad}`); p.setAttribute(stroke, #3b82f6); p.setAttribute(fill, none); p.setAttribute(stroke-width, 2); svg.setAttribute(viewBox, `0 0 ${w} ${h}`); svg.appendChild(p); } tenantIdEl.addEventListener(change, loadUsage); createKeyBtn.addEventListener(click, async () > { apiKeyMsg.textContent ; newKeyEl.style.display none; newKeyEl.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/api-key, { method: POST, headers: { content-type:application/json }, body: JSON.stringify({ tenantId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); if (data.apiKey) { newKeyEl.textContent `New key (copy now): ${data.apiKey}`; newKeyEl.style.display ; } await listKeys(); } catch (e) { apiKeyMsg.textContent Failed to create key; } }); listKeysBtn.addEventListener(click, listKeys); async function listKeys() { apiKeyMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(`https://msb.kusnjer.com/api-key?tenantId${encodeURIComponent(tenantId)}`); if (!res.ok) throw new Error(`HTTP ${res.status}`); const data await res.json(); renderKeys(data.keys || ); } catch (e) { apiKeyMsg.textContent Failed to list keys; } } function renderKeys(keys) { keysList.innerHTML ; for (const k of keys) { const li document.createElement(li); li.style.display flex; li.style.alignItems center; li.style.justifyContent space-between; li.style.gap 0.5rem; li.style.padding 0.5rem 0; li.style.borderBottom 1px solid #26314d; li.innerHTML `span classmuted>${k.keyId}/span>`; const del document.createElement(button); del.textContent Delete; del.style.background #ef4444; del.addEventListener(click, () > deleteKey(k.keyId)); li.appendChild(del); keysList.appendChild(li); } } async function deleteKey(keyId) { apiKeyMsg.textContent ; const tenantId tenantIdEl.value.trim(); if (!tenantId) { apiKeyMsg.textContent Enter tenant ID; return; } try { const res await fetch(https://msb.kusnjer.com/api-key, { method: DELETE, headers: { content-type:application/json }, body: JSON.stringify({ tenantId, keyId }) }); if (!res.ok) throw new Error(`HTTP ${res.status}`); await listKeys(); } catch (e) { apiKeyMsg.textContent Failed to delete key; } } // load usage when tenant discovered const origDiscover discoverTenant; discoverTenant async (email) > { await origDiscover(email); await loadUsage(); await listKeys(); } maybeHandleImplicitReturn(); /script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]