( ′∀`)σ≡σ☆))Д′)レ(゚∀゚;)ヘ=З=З=Зε≡(ノ´_ゝ`)ノ
<?php
require_once __DIR__ . '/auth.php';
$cfg = require __DIR__ . '/config.php';
$redirect = isset($_REQUEST['redirect']) ? trim($_REQUEST['redirect']) : '';
if ($redirect === '') {
$redirect = '/';
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = isset($_POST['email']) ? trim($_POST['email']) : '';
$password = isset($_POST['password']) ? (string)$_POST['password'] : '';
$name = isset($_POST['name']) ? trim($_POST['name']) : '';
if ($email !== '' && $password !== '') {
// Issue SSO cookie
$uid = substr(sha1(strtolower($email)), 0, 16);
$token = issue_token([
'sub' => $uid,
'email' => $email,
'name' => $name,
]);
set_sso_cookie($token);
?>
<!doctype html>
<html lang="en" class="light-style layout-wide customizer-hide" data-theme="theme-default" data-assets-path="/brandcreator/dashboard/assets/" data-template="vertical-menu-template" data-style="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<title>Signing You In | TheBrand</title>
<link rel="icon" type="image/x-icon" href="https://thebrand.ai/favicon/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com/">
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Public+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/boxicons.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/fontawesome.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/flag-icons.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/rtl/core.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/rtl/theme-default.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/css/demo.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/pages/page-auth.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/libs/animate-css/animate.css" />
<style>
.hero-button { box-shadow:none;color:#fff;letter-spacing:-0.02em;background-color:#eb008b;border:0;padding:10px 40px;font-size:20px;border-radius:15px;cursor:pointer;transition:background-color .3s,color .3s,transform .2s ease-out }
.status { font-size: 13px; }
.ok { color: #0a7f28; }
.err { color: #b00020; }
</style>
</head>
<body>
<div class="authentication-wrapper authentication-cover">
<a href="/connect/index.php" class="app-brand auth-cover-brand gap-2">
<span class="app-brand-logo demo"><img src="/brandcreator/files/assets/logo-white3.png" style="max-height:60px"></span>
</a>
<div class="authentication-inner row m-0">
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center p-5" style="background-image:url('/brandcreator/dashboard/assets/img/illustrations/business-meeting-over-coffee.png');background-size:cover;background-repeat:no-repeat;background-position:bottom;background-color:#9fccde;"></div>
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg p-sm-12 p-6">
<div class="w-px-520 mx-auto mt-12 pt-5">
<h4 class="mb-1">Signing you in …</h4>
<div class="list-group mb-4" style="display: none;">
<div class="d-flex justify-content-between py-2"><span class="fw-bold">Insights</span><span id="st-insights" class="status">Initializing…</span></div>
<div class="d-flex justify-content-between py-2"><span class="fw-bold">Sites</span><span id="st-sites" class="status">Initializing…</span></div>
<div class="d-flex justify-content-between py-2"><span class="fw-bold">Design Templates</span><span id="st-i" class="status">Initializing…</span></div>
</div>
<button id="continueBtn" class="btn btn-primary w-100 hero-button" disabled>Continue</button>
<a class="btn btn-outline-secondary w-100 mt-2" href="/connect/index.php">Back</a>
</div>
</div>
</div>
</div>
<script>
(function(){
const email = <?php echo json_encode($email); ?>;
const password = <?php echo json_encode($password); ?>;
const redirect = <?php echo json_encode($redirect); ?>;
const statuses = {
insights: document.getElementById('st-insights'),
sites: document.getElementById('st-sites'),
i: document.getElementById('st-i')
};
const results = { insights: false, sites: false, i: false };
function setStatus(id, text, cls) {
statuses[id].textContent = text;
statuses[id].className = 'status ' + (cls || '');
}
function mark(id, ok, msg){
results[id] = !!ok;
setStatus(id, ok ? 'Signed in' : ('Failed: ' + (msg || 'Error')), ok ? 'ok' : 'err');
const allDone = Object.values(results).every(Boolean);
document.getElementById('continueBtn').disabled = !allDone;
}
function getCookie(name){
const v = (`; ${document.cookie}`).split(`; ${name}=`);
if (v.length === 2) return v.pop().split(';').shift();
return '';
}
async function ensureSitesCsrf(){
try {
await fetch('/sites/index.php/accounts/login', { method: 'GET', credentials: 'include' });
return getCookie('csrf_cookie_brandsites');
} catch (e) { return ''; }
}
async function logoutAll(){
try {
setStatus('insights', 'Signing out…');
setStatus('sites', 'Signing out…');
setStatus('i', 'Signing out…');
await Promise.allSettled([
fetch('/insights/auth-logout.php', { credentials: 'include' }),
fetch('/sites/index.php/logout', { credentials: 'include' }),
fetch('/i/logout', { credentials: 'include' })
]);
} catch (e) {}
}
async function loginInsights(){
try {
setStatus('insights', 'Signing in…');
const resp = await fetch('/insights/data/files/login.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
credentials: 'include',
body: new URLSearchParams({ email, password })
});
const ct = resp.headers.get('content-type') || '';
if (ct.includes('application/json')) {
const data = await resp.json();
if (data && data.success) return mark('insights', true);
return mark('insights', false, data && data.message);
}
return mark('insights', resp.ok);
} catch (e) { return mark('insights', false, e.message); }
}
async function loginSites(){
try {
setStatus('sites', 'Signing in…');
const resp = await fetch('/sites/index.php/authenticate/verifyLogin', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
credentials: 'include',
body: new URLSearchParams({ ppl_email: email, ppl_pass: password })
});
const bodyText = await resp.text();
let data = null;
try {
data = JSON.parse(bodyText);
} catch (e) {}
const msg = data && data.message ? String(data.message) : bodyText;
if (data && data.status === 'success') {
try { await fetch('/sites/index.php/accounts/splashPage', { credentials: 'include' }); } catch (e) {}
return mark('sites', true);
}
const lowerMsg = (msg || '').toLowerCase();
if (lowerMsg.indexOf('invalid credentials') !== -1) {
setStatus('sites', 'Creating account…');
const token = getCookie('csrf_cookie_brandsites') || await ensureSitesCsrf();
const signupResp = await fetch('/sites/index.php/authenticate/verifySignUp', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
credentials: 'include',
body: new URLSearchParams({
pps_name: email.split('@')[0],
pps_email: email,
pps_password: password,
csrf_brandsites: token
})
});
const signupText = await signupResp.text();
let signupData = null;
try {
signupData = JSON.parse(signupText);
} catch (e) {}
if (signupData && signupData.status === 'success') {
setStatus('sites', 'Retrying sign in…');
const resp2 = await fetch('/sites/index.php/authenticate/verifyLogin', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
credentials: 'include',
body: new URLSearchParams({ ppl_email: email, ppl_pass: password })
});
const bodyText2 = await resp2.text();
let data2 = null;
try {
data2 = JSON.parse(bodyText2);
} catch (e) {}
if (data2 && data2.status) {
const ok = data2.status === 'success';
if (ok) { try { await fetch('/sites/index.php/accounts/splashPage', { credentials: 'include' }); } catch (e) {} }
return mark('sites', ok, data2.message);
}
return mark('sites', resp2.ok);
}
if (signupData && signupData.message) {
return mark('sites', false, signupData.message);
}
return mark('sites', signupResp.ok, signupResp.ok ? '' : 'Signup failed');
}
setStatus('sites', 'Provisioning user…');
const prov = await fetch('/connect/provision_sites.php', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({ email: email, password: password })
});
const provText = await prov.text();
let pjson = null;
try {
pjson = JSON.parse(provText);
} catch (e) {}
if (pjson && pjson.debug) { try { console.info('Sites provision debug:', pjson.debug); } catch (e) {} }
if (pjson && pjson.success) {
setStatus('sites', 'Retrying sign in…');
const resp2 = await fetch('/sites/index.php/authenticate/verifyLogin', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
credentials: 'include',
body: new URLSearchParams({ ppl_email: email, ppl_pass: password })
});
const bodyText2 = await resp2.text();
let data2 = null;
try {
data2 = JSON.parse(bodyText2);
} catch (e) {}
if (data2 && data2.status) {
const ok = data2.status === 'success';
if (ok) { try { await fetch('/sites/index.php/accounts/splashPage', { credentials: 'include' }); } catch (e) {} }
return mark('sites', ok, data2.message);
}
return mark('sites', resp2.ok);
}
return mark('sites', false, (pjson && pjson.message) || 'Provisioning failed');
} catch (e) { return mark('sites', false, e.message); }
}
async function loginI(){
try {
setStatus('i', 'Signing in…');
const resp = await fetch('/i/auth_controller/login_post', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' },
credentials: 'include',
body: new URLSearchParams({ email: email, password: password, sys_lang_id: '1' })
});
const ct = resp.headers.get('content-type') || '';
if (ct.includes('application/json')) {
const data = await resp.json();
if (data && (data.result === 1 || data.success)) return mark('i', true);
return mark('i', false, (data && (data.error || data.message)));
}
return mark('i', resp.ok);
} catch (e) { return mark('i', false, e.message); }
}
(async function(){
await logoutAll();
await loginInsights();
await loginI();
await loginSites();
})();
document.getElementById('continueBtn').addEventListener('click', function(){
window.location.href = redirect;
});
})();
</script>
</body>
</html>
<?php
exit;
}
}
$user = current_user();
?>
<!doctype html>
<html lang="en" class="light-style layout-wide customizer-hide" data-theme="theme-default" data-assets-path="/brandcreator/dashboard/assets/" data-template="vertical-menu-template" data-style="light">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0" />
<title>Unified Sign In | TheBrand</title>
<link rel="icon" type="image/x-icon" href="https://thebrand.ai/favicon/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com/">
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Public+Sans:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/boxicons.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/fontawesome.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/fonts/flag-icons.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/rtl/core.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/rtl/theme-default.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/css/demo.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/css/pages/page-auth.css" />
<link rel="stylesheet" href="/brandcreator/dashboard/assets/vendor/libs/animate-css/animate.css" />
<style>
.hero-button { box-shadow:none;color:#fff;letter-spacing:-0.02em;background-color:#eb008b;border:0;padding:10px 40px;font-size:20px;border-radius:15px;cursor:pointer;transition:background-color .3s,color .3s,transform .2s ease-out }
#bgX { background-image:url('/brandcreator/dashboard/assets/img/illustrations/business-meeting-over-coffee.png');background-size:cover;background-repeat:no-repeat;background-position:bottom;background-color:#9fccde;height:100vh;margin:0 }
.gsi-material-button{background-color:#fff;border:1px solid #747775;border-radius:20px;box-sizing:border-box;color:#1f1f1f;cursor:pointer;font-family:'Roboto',arial,sans-serif;font-size:14px;height:40px;letter-spacing:.25px;outline:none;overflow:hidden;padding:0 12px;text-align:center;transition:background-color .218s,border-color .218s,box-shadow .218s;vertical-align:middle;white-space:nowrap;width:auto;max-width:400px}
.gsi-material-button-content{display:flex;align-items:center;justify-content:flex-start;height:100%}
.gsi-material-button-icon{height:20px;width:20px}
.gsi-material-button-contents{flex-grow:1;text-align:center}
.app-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;margin-top:12px}
.app-card{display:flex;align-items:center;justify-content:center;padding:16px;border:1px solid #e3e5e7;border-radius:12px;text-decoration:none;color:#1f1f1f;background:#fff;transition:box-shadow .2s,transform .1s}
.app-card:hover{box-shadow:0 2px 12px rgba(0,0,0,.08);transform:translateY(-1px)}
.app-card i{font-size:22px;margin-right:8px}
.app-card span{font-weight:600}
</style>
<script>
function googleSignIn() {
const redirect = <?php echo json_encode($redirect); ?>;
const url = '/connect/auth-google.php?redirect=' + encodeURIComponent(redirect);
// Force redirect on the top-most window (parent page)
if (window.top) {
window.top.location.href = url;
} else {
window.location.href = url;
}
}
</script>
</head>
<body>
<div class="authentication-wrapper authentication-cover">
<a href="/connect/index.php" class="app-brand auth-cover-brand gap-2">
<span class="app-brand-logo demo"><img src="/brandcreator/files/assets/logo-white3.png" style="max-height:60px"></span>
</a>
<div class="authentication-inner row m-0">
<div class="d-none d-lg-flex col-lg-7 col-xl-8 align-items-center p-5" id="bgX"></div>
<div class="d-flex col-12 col-lg-5 col-xl-4 align-items-center authentication-bg p-sm-12 p-6">
<div class="w-px-400 mx-auto mt-12 pt-5">
<h4 class="mb-1">Welcome Back to Brand AI👋</h4>
<p class="mb-6">Log in to access your brand identity, AI-powered insights, design tools, and more — all in one place.</p>
<?php if ($user): ?>
<div class="alert alert-info">Signed in as <strong><?php echo htmlspecialchars($user['email']); ?></strong></div>
<div class="app-grid">
<a class="app-card" target="_parent" href="/insights/"><i class="bx bx-line-chart"></i><span>Insights</span></a>
<a class="app-card" target="_parent" href="/sites/"><i class="bx bx-globe"></i><span>Sites</span></a>
<a class="app-card" target="_parent" href="/brandcreator/"><i class="bx bx-paint"></i><span>BrandCreator</span></a>
<a class="app-card" target="_parent" href="/i/"><i class="bx bx-image"></i><span>Templates</span></a>
<a class="app-card" target="_parent" href="/"><i class="bx bx-home"></i><span>Home</span></a>
<a class="app-card" target="_parent" href="/blogs"><i class="bx bx-edit"></i><span>Blogs</span></a>
</div>
<a class="btn btn-outline-secondary w-100 mt-3" href="/connect/logout.php?redirect=<?php echo urlencode($redirect); ?>">Sign out</a>
<?php else: ?>
<form id="formAuthentication" class="mb-6" method="POST" action="/connect/index.php">
<input type="hidden" name="redirect" value="<?php echo htmlspecialchars($redirect); ?>">
<div class="mb-6">
<label for="email" class="form-label">Email address</label>
<input type="email" class="form-control" id="email" name="email" placeholder="you@example.com" autofocus required>
</div>
<div class="mb-6 form-password-toggle">
<label class="form-label" for="password">Password</label>
<div class="input-group input-group-merge">
<input type="password" id="password" class="form-control" name="password" placeholder="············" aria-describedby="password" required />
<span class="input-group-text cursor-pointer"><i class="bx bx-hide"></i></span>
</div>
</div>
<button class="btn btn-primary d-grid w-100 hero-button" type="submit">Sign In</button>
</form>
<div class="divider my-6"><div class="divider-text">or</div></div>
<button type="button" class="gsi-material-button w-100" onclick="googleSignIn()">
<div class="gsi-material-button-content">
<img class="gsi-material-button-icon" src="https://www.gstatic.com/images/branding/googleg/1x/googleg_standard_color_128dp.png" alt="Google" />
<span class="gsi-material-button-contents">Continue with Google</span>
</div>
</button>
<div class="text-center mt-4">
<span>New here?</span>
<a href="/connect/register.php">Sign up for free</a>
</div>
<?php endif; ?>
</div>
</div>
</div>
</div>
<div class="container mt-4" style="max-width:720px; display:none; visibility:hidden">
<div class="row g-2">
<div class="col-6"><a class="btn btn-outline-primary w-100" href="/insights/">Go to Insights</a></div>
<div class="col-6"><a class="btn btn-outline-primary w-100" href="/sites/">Go to Sites</a></div>
<div class="col-6"><a class="btn btn-outline-primary w-100" href="/brandcreator/">Go to BrandCreator</a></div>
<div class="col-6"><a class="btn btn-outline-primary w-100" href="/i/">Go to I</a></div>
<div class="col-6"><a class="btn btn-outline-secondary w-100" href="/connect/index.php?redirect=/insights/">Sign then Insights</a></div>
<div class="col-6"><a class="btn btn-outline-secondary w-100" href="/connect/index.php?redirect=/sites/">Sign then Sites</a></div>
<div class="col-6"><a class="btn btn-outline-secondary w-100" href="/connect/index.php?redirect=/brandcreator/">Sign then BrandCreator</a></div>
<div class="col-6"><a class="btn btn-outline-secondary w-100" href="/connect/index.php?redirect=/i/">Sign then I</a></div>
</div>
</div>
</body>
</html>