/foo.php (in HTML) // MLT_BASE_URL . '/foo.php' (in PHP code) // window.MLT_BASE + '/foo.php' (in pure JS files) if (!defined('MLT_BASE_URL')) { $_mlt_candidates = []; // 1) Manual override — set MLT_BASE_URL_OVERRIDE = '' or '/mlt' upstream to force if (defined('MLT_BASE_URL_OVERRIDE')) { define('MLT_BASE_URL', MLT_BASE_URL_OVERRIDE); } else { // 2) X-Forwarded-Host (most common: nginx, Apache mod_proxy, Cloudflare) if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) { // May be a comma-separated chain (CDN, multiple proxies) — first is original client $first = trim(explode(',', $_SERVER['HTTP_X_FORWARDED_HOST'])[0]); if ($first) $_mlt_candidates[] = $first; } // 3) RFC 7239 Forwarded header if (!empty($_SERVER['HTTP_FORWARDED'])) { if (preg_match('/host=("?)([^";,]+)\1/i', $_SERVER['HTTP_FORWARDED'], $m)) { $_mlt_candidates[] = $m[2]; } } // 4) Direct host (works when no proxy or proxy preserves Host header) if (!empty($_SERVER['HTTP_HOST'])) { $_mlt_candidates[] = $_SERVER['HTTP_HOST']; } // 5) Referer host fallback — useful for asset requests where the page // referred from mylabelteam.com but the asset request itself didn't // come through the proxy properly if (!empty($_SERVER['HTTP_REFERER'])) { $rh = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST); if ($rh) $_mlt_candidates[] = $rh; } $_mlt_base = '/mlt'; // default foreach ($_mlt_candidates as $h) { $h = strtolower($h); if (($p = strpos($h, ':')) !== false) $h = substr($h, 0, $p); if ($h === 'mylabelteam.com' || preg_match('/\.mylabelteam\.com$/', $h)) { $_mlt_base = ''; break; } } define('MLT_BASE_URL', $_mlt_base); unset($_mlt_base); } unset($_mlt_candidates); } define('MLT_UPLOAD_DIR', __DIR__ . '/../uploads'); define('MLT_UPLOAD_URL', MLT_BASE_URL . '/uploads'); define('MLT_SESSION_DAYS', 30); // --------------------------------------------------------------- // Claude API: inherit from MMP parent constants if defined there, // otherwise fall back to locally-pinned key. // Priority at resolution time: mlt_settings.claude_api_key (admin-editable) // -> CLAUDE_API_KEY (parent) -> ANTHROPIC_API_KEY (parent) -> MLT_CLAUDE_API_KEY // --------------------------------------------------------------- if (!defined('MLT_CLAUDE_API_KEY')) { if (defined('CLAUDE_API_KEY') && CLAUDE_API_KEY) { define('MLT_CLAUDE_API_KEY', CLAUDE_API_KEY); } elseif (defined('ANTHROPIC_API_KEY') && ANTHROPIC_API_KEY) { define('MLT_CLAUDE_API_KEY', ANTHROPIC_API_KEY); } else { define('MLT_CLAUDE_API_KEY', ''); } } if (!defined('MLT_CLAUDE_MODEL')) { if (defined('CLAUDE_MODEL') && CLAUDE_MODEL) { define('MLT_CLAUDE_MODEL', CLAUDE_MODEL); } else { define('MLT_CLAUDE_MODEL', 'claude-sonnet-4-20250514'); } } if (!defined('MLT_OPENAI_API_KEY')) { define('MLT_OPENAI_API_KEY', defined('OPENAI_API_KEY') ? OPENAI_API_KEY : ''); } if (!defined('MLT_TINYMCE_API_KEY')) { define('MLT_TINYMCE_API_KEY', 'phhx92sgxypegddpduarcwz0o9u3qwns0mnxh8cie2nuw6o9'); } // TurboSMTP (consumer key / secret) if (!defined('MLT_TURBO_KEY')) define('MLT_TURBO_KEY', '5c29929081a1b2c5bb83532480d18925'); if (!defined('MLT_TURBO_SECRET')) define('MLT_TURBO_SECRET', 'ItzlbraH6NoJ0EVQpR2cykMATL8v3WDK'); if (!defined('MLT_FROM_EMAIL')) define('MLT_FROM_EMAIL', 'noreply@mymarketingpro.com'); // Twilio — prefer parent TWILIO_* constants (API-key auth is the fix for the 401 from Auth Token) if (!defined('MLT_TWILIO_SID')) { define('MLT_TWILIO_SID', defined('TWILIO_ACCOUNT_SID') ? TWILIO_ACCOUNT_SID : 'AC89eac4dabbb501617af5f2efab701d64'); } if (!defined('MLT_TWILIO_TOKEN')) { // MMP uses API Key auth now; fall back to old token for back-compat if some env still has it if (defined('TWILIO_API_KEY_SECRET') && TWILIO_API_KEY_SECRET) { define('MLT_TWILIO_TOKEN', TWILIO_API_KEY_SECRET); } elseif (defined('TWILIO_AUTH_TOKEN') && TWILIO_AUTH_TOKEN) { define('MLT_TWILIO_TOKEN', TWILIO_AUTH_TOKEN); } else { define('MLT_TWILIO_TOKEN', 'a05ff4af7909ad998bad5d0c4eb4abe6'); } } if (!defined('MLT_TWILIO_FROM')) define('MLT_TWILIO_FROM', '+16812771506'); // Wire-distribution backend (configurable so we can swap providers without code changes) if (!defined('MLT_PRNOW_API_KEY')) define('MLT_PRNOW_API_KEY', 'prnow_66bbc1d239fcd6ac84f95724a6656304ff7b265ec7ed08bb'); if (!defined('MLT_PRNOW_BASE_URL')) define('MLT_PRNOW_BASE_URL', 'https://prnow.io/api/v1'); if (!defined('MLT_PRNOW_SUBMIT_PATH')) define('MLT_PRNOW_SUBMIT_PATH', '/press-releases'); if (!defined('MLT_PRNOW_DEFAULT_PLAN')) define('MLT_PRNOW_DEFAULT_PLAN', 'standard'); // Stripe (for credit purchases) — bridge from MMP parent if (!defined('MLT_STRIPE_SECRET_KEY')) { define('MLT_STRIPE_SECRET_KEY', defined('STRIPE_SECRET_KEY') ? STRIPE_SECRET_KEY : ''); } if (!defined('MLT_STRIPE_PUBLIC_KEY')) { define('MLT_STRIPE_PUBLIC_KEY', defined('STRIPE_PUBLIC_KEY') ? STRIPE_PUBLIC_KEY : (defined('STRIPE_PUBLISHABLE_KEY') ? STRIPE_PUBLISHABLE_KEY : '')); } // Support email if (!defined('MLT_SUPPORT_EMAIL')) define('MLT_SUPPORT_EMAIL', 'support@mylabelteam.com'); // Ensure upload directory exists if (!is_dir(MLT_UPLOAD_DIR)) { @mkdir(MLT_UPLOAD_DIR, 0755, true); } if (session_status() === PHP_SESSION_NONE) { session_start(); } My Label Team — Your Label, Powered By You