commit 31312e505ecc19dbe9e203b379fb684983e54765 Author: Flatlogic Bot Date: Thu Sep 11 04:56:28 2025 +0000 Initial version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e427ff3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +*/node_modules/ +*/build/ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..e2bbc23 --- /dev/null +++ b/.htaccess @@ -0,0 +1,18 @@ +DirectoryIndex index.php index.html +Options -Indexes +Options -MultiViews + +RewriteEngine On + +# 0) Serve existing files/directories as-is +RewriteCond %{REQUEST_FILENAME} -f [OR] +RewriteCond %{REQUEST_FILENAME} -d +RewriteRule ^ - [L] + +# 1) Internal map: /page or /page/ -> /page.php (if such PHP file exists) +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.+?)/?$ $1.php [L] + +# 2) Optional: strip trailing slash for non-directories (keeps .php links working) +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule ^(.+)/$ $1 [R=301,L] diff --git a/.perm_test_apache b/.perm_test_apache new file mode 100644 index 0000000..e69de29 diff --git a/.perm_test_exec b/.perm_test_exec new file mode 100644 index 0000000..e69de29 diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..0e8d3f4 --- /dev/null +++ b/admin.php @@ -0,0 +1,27 @@ + +
+ +
+
+
+
+
+

Admin Panel

+

Welcome, !

+

This is your admin dashboard. You can add content and manage your site from here.

+
+
+
+
+
+ +
+ \ No newline at end of file diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..a565a13 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,88 @@ +:root { + --primary-color: #0D6EFD; + --secondary-color: #6C757D; + --background-color: #F8F9FA; + --surface-color: #FFFFFF; + --primary-font: 'Poppins', sans-serif; +} + +body { + font-family: var(--primary-font); + background: linear-gradient(270deg, #a1c4fd, #c2e9fb); + background-size: 400% 400%; + animation: moveGradient 15s ease infinite; +} + +@keyframes moveGradient { + 0%{background-position:0% 50%} + 50%{background-position:100% 50%} + 100%{background-position:0% 50%} +} + +.hero-section { + background: linear-gradient(rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url('https://picsum.photos/seed/nimbus-hero/1600/900'); + background-size: cover; + background-position: center; + color: white; + padding: 10rem 0; +} + +.navbar.scrolled { + background-color: rgba(255, 255, 255, 0.9); + box-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +.form-control:focus { + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + border-color: #86b7fe; +} + +.btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); +} + +.section-icon { + font-size: 2.5rem; + color: var(--primary-color); +} + +.feature-card { + background: rgba(255, 255, 255, 0.1); + backdrop-filter: blur(10px); + -webkit-backdrop-filter: blur(10px); /* For Safari */ + border-radius: 15px; + border: 1px solid rgba(255, 255, 255, 0.2); + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.feature-card:hover { + transform: translateY(-5px); + box-shadow: 0 8px 12px rgba(0, 0, 0, 0.15); +} + +.hero-section .btn-primary { + background-color: var(--primary-color); + border-color: var(--primary-color); + padding: 12px 30px; + font-weight: 600; + transition: background-color 0.3s ease; +} + +.hero-section .btn-primary:hover { + background-color: #0b5ed7; +} + +.hero-section .btn-outline-secondary { + color: white; + border-color: white; + padding: 12px 30px; + font-weight: 600; + transition: background-color 0.3s ease, color 0.3s ease; +} + +.hero-section .btn-outline-secondary:hover { + background-color: white; + color: black; +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..435830f --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,39 @@ +document.addEventListener('DOMContentLoaded', function () { + // Navbar shrink on scroll + const navbar = document.querySelector('.navbar'); + if (navbar) { + window.addEventListener('scroll', () => { + if (window.scrollY > 50) { + navbar.classList.add('scrolled'); + } else { + navbar.classList.remove('scrolled'); + } + }); + } + + // Smooth scroll for anchor links + document.querySelectorAll('a[href^="#"]').forEach(anchor => { + anchor.addEventListener('click', function (e) { + e.preventDefault(); + const target = document.querySelector(this.getAttribute('href')); + if (target) { + target.scrollIntoView({ + behavior: 'smooth' + }); + } + }); + }); + + // Pricing toggle + const priceToggle = document.getElementById('priceToggle'); + if (priceToggle) { + priceToggle.addEventListener('change', function() { + const isYearly = this.checked; + document.querySelectorAll('[data-monthly]').forEach(priceEl => { + const monthly = priceEl.getAttribute('data-monthly'); + const yearly = priceEl.getAttribute('data-yearly'); + priceEl.textContent = isYearly ? yearly : monthly; + }); + }); + } +}); diff --git a/db/config.php b/db/config.php new file mode 100644 index 0000000..5f000bc --- /dev/null +++ b/db/config.php @@ -0,0 +1,17 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ]); + } + return $pdo; +} diff --git a/db/migrate.php b/db/migrate.php new file mode 100644 index 0000000..c4df483 --- /dev/null +++ b/db/migrate.php @@ -0,0 +1,29 @@ +exec($sql); + echo "Success.\n"; + } + + echo "\nAll migrations completed successfully.\n"; + +} catch (PDOException $e) { + die("Database error: " . $e->getMessage() . "\n"); +} + diff --git a/db/migrations/001_create_users_table.sql b/db/migrations/001_create_users_table.sql new file mode 100644 index 0000000..205005a --- /dev/null +++ b/db/migrations/001_create_users_table.sql @@ -0,0 +1,7 @@ +CREATE TABLE IF NOT EXISTS `users` ( + `id` INT AUTO_INCREMENT PRIMARY KEY, + `username` VARCHAR(50) NOT NULL UNIQUE, + `email` VARCHAR(100) NOT NULL UNIQUE, + `password_hash` VARCHAR(255) NOT NULL, + `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/index.php b/index.php new file mode 100644 index 0000000..4e60532 --- /dev/null +++ b/index.php @@ -0,0 +1,288 @@ + + + + +
+
+

Your Cloud, Simplified

+

Nimbus is the single pane of glass for your entire cloud infrastructure. Monitor, optimize, and automate with ease.

+ Start Your Free Trial + Explore Features +
+
+ + +
+
+
TRUSTED BY LEADING COMPANIES WORLDWIDE
+
+ + + + + +
+
+
+ + +
+
+
+

Core Features

+

Everything you need in one platform.

+
+
+
+
+ +

Unified Monitoring

+

Get a bird's-eye view of your entire infrastructure in one place.

+
+
+
+
+ +

Cost Optimization

+

Identify and eliminate wasted cloud spend with smart recommendations.

+
+
+
+
+ +

Automated Security

+

Proactively secure your cloud environment against threats.

+
+
+
+
+
+ + +
+
+
+

See Nimbus in Action

+
+ A mock screenshot of the Nimbus dashboard showing key performance metrics. +
+
+ + +
+
+
+

What Our Customers Say

+
+
+
+
+

"Nimbus has been a game-changer for us. We've saved over 30% on our cloud bills."

+
+ Avatar of a satisfied Nimbus customer. +
+
Jane Doe
+ CTO, TechCorp +
+
+
+
+
+
+

"The unified dashboard is incredibly intuitive. Our team was up and running in minutes."

+
+ Avatar of a satisfied Nimbus customer. +
+
John Smith
+ CEO, Innovate LLC +
+
+
+
+
+
+

"I can't imagine managing our infrastructure without Nimbus. It's essential."

+
+ Avatar of a satisfied Nimbus customer. +
+
Sam Wilson
+ DevOps Lead, Future Solutions +
+
+
+
+
+
+
+ + +
+
+
+

Simple, Transparent Pricing

+
+ + +
+
+
+ +
+
+

Starter

+
+ $49/mo +
+
    +
  • 10 Projects
  • +
  • Basic Analytics
  • +
  • Email Support
  • +
+ +
+
+ +
+
+

Pro

+
+ $99/mo +
+
    +
  • Unlimited Projects
  • +
  • Advanced Analytics
  • +
  • Priority Support
  • +
+ +
+
+ +
+
+

Enterprise

+
Contact Us
+
    +
  • Dedicated Infrastructure
  • +
  • Custom Integrations
  • +
  • 24/7 Support
  • +
+ +
+
+
+
+
+ + +
+
+
+

Frequently Asked Questions

+
+
+
+

+
+
Nimbus is a B2B SaaS platform that helps businesses manage their cloud infrastructure.
+
+
+
+

+
+
We support AWS, Google Cloud, and Azure.
+
+
+
+

+
+
Yes, you can cancel your subscription at any time.
+
+
+
+
+
+ + +
+
+
+

Get in Touch

+

We'd love to hear from you.

+
+
+
+ + + + + + + + +
+ +
+ + +
+
+ + +
Please provide a valid email.
+
+
+ + +
+ +
+
+
+
+
+ + diff --git a/login.php b/login.php new file mode 100644 index 0000000..1026a93 --- /dev/null +++ b/login.php @@ -0,0 +1,86 @@ +prepare("SELECT id, username, password_hash FROM users WHERE email = ?"); + $stmt->execute([$email]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password_hash'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + header("Location: admin.php"); + exit(); + } else { + $errors[] = 'Invalid email or password'; + } + } +} +?> +
+ +
+
+
+
+
+

Login

+ + +
+ Registration successful! You can now log in. +
+ + + +
+ +

+ +
+ + +
+
+ + +
+
+ + +
+
+ +
+
+

+ Don't have an account? Register here. +

+
+
+
+
+
+ +
+ \ No newline at end of file diff --git a/logout.php b/logout.php new file mode 100644 index 0000000..248c535 --- /dev/null +++ b/logout.php @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/mail/MailService.php b/mail/MailService.php new file mode 100644 index 0000000..d801067 --- /dev/null +++ b/mail/MailService.php @@ -0,0 +1,235 @@ + false, 'error' => 'PHPMailer not available' ]; + } + + $mail = new PHPMailer\PHPMailer\PHPMailer(true); + try { + $mail->isSMTP(); + $mail->Host = $cfg['smtp_host'] ?? ''; + $mail->Port = (int)($cfg['smtp_port'] ?? 587); + $secure = $cfg['smtp_secure'] ?? 'tls'; + if ($secure === 'ssl') $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS; + elseif ($secure === 'tls') $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; + else $mail->SMTPSecure = false; + $mail->SMTPAuth = true; + $mail->Username = $cfg['smtp_user'] ?? ''; + $mail->Password = $cfg['smtp_pass'] ?? ''; + + $fromEmail = $opts['from_email'] ?? ($cfg['from_email'] ?? 'no-reply@localhost'); + $fromName = $opts['from_name'] ?? ($cfg['from_name'] ?? 'App'); + $mail->setFrom($fromEmail, $fromName); + if (!empty($opts['reply_to']) && filter_var($opts['reply_to'], FILTER_VALIDATE_EMAIL)) { + $mail->addReplyTo($opts['reply_to']); + } elseif (!empty($cfg['reply_to'])) { + $mail->addReplyTo($cfg['reply_to']); + } + + // Recipients + $toList = []; + if ($to) { + if (is_string($to)) $toList = array_map('trim', explode(',', $to)); + elseif (is_array($to)) $toList = $to; + } elseif (!empty(getenv('MAIL_TO'))) { + $toList = array_map('trim', explode(',', getenv('MAIL_TO'))); + } + $added = 0; + foreach ($toList as $addr) { + if (filter_var($addr, FILTER_VALIDATE_EMAIL)) { $mail->addAddress($addr); $added++; } + } + if ($added === 0) { + return [ 'success' => false, 'error' => 'No recipients defined (set MAIL_TO or pass $to)' ]; + } + + foreach ((array)($opts['cc'] ?? []) as $cc) { if (filter_var($cc, FILTER_VALIDATE_EMAIL)) $mail->addCC($cc); } + foreach ((array)($opts['bcc'] ?? []) as $bcc){ if (filter_var($bcc, FILTER_VALIDATE_EMAIL)) $mail->addBCC($bcc); } + + // Optional DKIM + if (!empty($cfg['dkim_domain']) && !empty($cfg['dkim_selector']) && !empty($cfg['dkim_private_key_path'])) { + $mail->DKIM_domain = $cfg['dkim_domain']; + $mail->DKIM_selector = $cfg['dkim_selector']; + $mail->DKIM_private = $cfg['dkim_private_key_path']; + } + + $mail->isHTML(true); + $mail->Subject = $subject; + $mail->Body = $htmlBody; + $mail->AltBody = $textBody ?? strip_tags($htmlBody); + $ok = $mail->send(); + return [ 'success' => $ok ]; + } catch (\Throwable $e) { + return [ 'success' => false, 'error' => 'PHPMailer error: ' . $e->getMessage() ]; + } + } + private static function loadConfig(): array + { + $configPath = __DIR__ . '/config.php'; + if (!file_exists($configPath)) { + throw new \RuntimeException('Mail config not found. Copy mail/config.sample.php to mail/config.php and fill in credentials.'); + } + $cfg = require $configPath; + if (!is_array($cfg)) { + throw new \RuntimeException('Invalid mail config format: expected array'); + } + return $cfg; + } + + // Send a contact message + // $to can be: a single email string, a comma-separated list, an array of emails, or null (fallback to MAIL_TO/MAIL_FROM) + public static function sendContactMessage(string $name, string $email, string $message, $to = null, string $subject = 'New contact form') + { + $cfg = self::loadConfig(); + + // Try Composer autoload if available (for PHPMailer) + $autoload = __DIR__ . '/../vendor/autoload.php'; + if (file_exists($autoload)) { + require_once $autoload; + } + // Fallback to system-wide PHPMailer (installed via apt: libphp-phpmailer) + if (!class_exists('PHPMailer\\PHPMailer\\PHPMailer')) { + // Debian/Ubuntu package layout (libphp-phpmailer) + @require_once 'libphp-phpmailer/autoload.php'; + if (!class_exists('PHPMailer\\PHPMailer\\PHPMailer')) { + @require_once 'libphp-phpmailer/src/Exception.php'; + @require_once 'libphp-phpmailer/src/SMTP.php'; + @require_once 'libphp-phpmailer/src/PHPMailer.php'; + } + // Alternative layout (older PHPMailer package names) + if (!class_exists('PHPMailer\\PHPMailer\\PHPMailer')) { + @require_once 'PHPMailer/src/Exception.php'; + @require_once 'PHPMailer/src/SMTP.php'; + @require_once 'PHPMailer/src/PHPMailer.php'; + } + if (!class_exists('PHPMailer\\PHPMailer\\PHPMailer')) { + @require_once 'PHPMailer/Exception.php'; + @require_once 'PHPMailer/SMTP.php'; + @require_once 'PHPMailer/PHPMailer.php'; + } + } + + $transport = $cfg['transport'] ?? 'smtp'; + if ($transport === 'smtp' && class_exists('PHPMailer\\PHPMailer\\PHPMailer')) { + return self::sendViaPHPMailer($cfg, $name, $email, $message, $to, $subject); + } + + // Fallback: attempt native mail() — works only if MTA is configured on the VM + return self::sendViaNativeMail($cfg, $name, $email, $message, $to, $subject); + } + + private static function sendViaPHPMailer(array $cfg, string $name, string $email, string $body, $to, string $subject) + { + $mail = new PHPMailer\PHPMailer\PHPMailer(true); + try { + $mail->isSMTP(); + $mail->Host = $cfg['smtp_host'] ?? ''; + $mail->Port = (int)($cfg['smtp_port'] ?? 587); + $secure = $cfg['smtp_secure'] ?? 'tls'; + if ($secure === 'ssl') $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_SMTPS; + elseif ($secure === 'tls') $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; + else $mail->SMTPSecure = false; + $mail->SMTPAuth = true; + $mail->Username = $cfg['smtp_user'] ?? ''; + $mail->Password = $cfg['smtp_pass'] ?? ''; + + $fromEmail = $cfg['from_email'] ?? 'no-reply@localhost'; + $fromName = $cfg['from_name'] ?? 'App'; + $mail->setFrom($fromEmail, $fromName); + + // Use Reply-To for the user's email to avoid spoofing From + if (filter_var($email, FILTER_VALIDATE_EMAIL)) { + $mail->addReplyTo($email, $name ?: $email); + } + if (!empty($cfg['reply_to'])) { + $mail->addReplyTo($cfg['reply_to']); + } + + // Destination: prefer dynamic recipients ($to), fallback to MAIL_TO; no silent FROM fallback + $toList = []; + if ($to) { + if (is_string($to)) { + // allow comma-separated list + $toList = array_map('trim', explode(',', $to)); + } elseif (is_array($to)) { + $toList = $to; + } + } elseif (!empty(getenv('MAIL_TO'))) { + $toList = array_map('trim', explode(',', getenv('MAIL_TO'))); + } + $added = 0; + foreach ($toList as $addr) { + if (filter_var($addr, FILTER_VALIDATE_EMAIL)) { + $mail->addAddress($addr); + $added++; + } + } + if ($added === 0) { + return [ 'success' => false, 'error' => 'No recipients defined (set MAIL_TO or pass $to)' ]; + } + + // DKIM (optional) + if (!empty($cfg['dkim_domain']) && !empty($cfg['dkim_selector']) && !empty($cfg['dkim_private_key_path'])) { + $mail->DKIM_domain = $cfg['dkim_domain']; + $mail->DKIM_selector = $cfg['dkim_selector']; + $mail->DKIM_private = $cfg['dkim_private_key_path']; + } + + $mail->isHTML(true); + $mail->Subject = $subject; + $safeName = htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $safeEmail = htmlspecialchars($email, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); + $safeBody = nl2br(htmlspecialchars($body, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + $mail->Body = "

Name: {$safeName}

Email: {$safeEmail}


{$safeBody}"; + $mail->AltBody = "Name: {$name}\nEmail: {$email}\n\n{$body}"; + + $ok = $mail->send(); + return [ 'success' => $ok ]; + } catch (\Throwable $e) { + return [ 'success' => false, 'error' => 'PHPMailer error: ' . $e->getMessage() ]; + } + } + + private static function sendViaNativeMail(array $cfg, string $name, string $email, string $body, $to, string $subject) + { + $opts = ['reply_to' => $email]; + $html = nl2br(htmlspecialchars($body, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8')); + return self::sendMail($to, $subject, $html, $body, $opts); + } +} diff --git a/mail/config.php b/mail/config.php new file mode 100644 index 0000000..626cca1 --- /dev/null +++ b/mail/config.php @@ -0,0 +1,76 @@ + config array for MailService. + +function env_val(string $key, $default = null) { + $v = getenv($key); + return ($v === false || $v === null || $v === '') ? $default : $v; +} + +// Fallback: if critical vars are missing from process env, try to parse executor/.env +// This helps in web/Apache contexts where .env is not exported. +// Supports simple KEY=VALUE lines; ignores quotes and comments. +function load_dotenv_if_needed(array $keys): void { + $missing = array_filter($keys, fn($k) => getenv($k) === false || getenv($k) === ''); + if (empty($missing)) return; + static $loaded = false; + if ($loaded) return; + $envPath = realpath(__DIR__ . '/../../.env'); // executor/.env + if ($envPath && is_readable($envPath)) { + $lines = @file($envPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) ?: []; + foreach ($lines as $line) { + if ($line[0] === '#' || trim($line) === '') continue; + if (!str_contains($line, '=')) continue; + [$k, $v] = array_map('trim', explode('=', $line, 2)); + // Strip potential surrounding quotes + $v = trim($v, "\"' "); + // Do not override existing env + if ($k !== '' && (getenv($k) === false || getenv($k) === '')) { + putenv("{$k}={$v}"); + } + } + $loaded = true; + } +} + +load_dotenv_if_needed([ + 'MAIL_TRANSPORT','SMTP_HOST','SMTP_PORT','SMTP_SECURE','SMTP_USER','SMTP_PASS', + 'MAIL_FROM','MAIL_FROM_NAME','MAIL_REPLY_TO','MAIL_TO', + 'DKIM_DOMAIN','DKIM_SELECTOR','DKIM_PRIVATE_KEY_PATH' +]); + +$transport = env_val('MAIL_TRANSPORT', 'smtp'); +$smtp_host = env_val('SMTP_HOST'); +$smtp_port = (int) env_val('SMTP_PORT', 587); +$smtp_secure = env_val('SMTP_SECURE', 'tls'); // tls | ssl | null +$smtp_user = env_val('SMTP_USER'); +$smtp_pass = env_val('SMTP_PASS'); + +$from_email = env_val('MAIL_FROM', 'no-reply@localhost'); +$from_name = env_val('MAIL_FROM_NAME', 'App'); +$reply_to = env_val('MAIL_REPLY_TO'); + +$dkim_domain = env_val('DKIM_DOMAIN'); +$dkim_selector = env_val('DKIM_SELECTOR'); +$dkim_private_key_path = env_val('DKIM_PRIVATE_KEY_PATH'); + +return [ + 'transport' => $transport, + + // SMTP + 'smtp_host' => $smtp_host, + 'smtp_port' => $smtp_port, + 'smtp_secure' => $smtp_secure, + 'smtp_user' => $smtp_user, + 'smtp_pass' => $smtp_pass, + + // From / Reply-To + 'from_email' => $from_email, + 'from_name' => $from_name, + 'reply_to' => $reply_to, + + // DKIM (optional) + 'dkim_domain' => $dkim_domain, + 'dkim_selector' => $dkim_selector, + 'dkim_private_key_path' => $dkim_private_key_path, +]; diff --git a/mail_log.txt b/mail_log.txt new file mode 100644 index 0000000..e662bca --- /dev/null +++ b/mail_log.txt @@ -0,0 +1,224 @@ +SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-UJAP95IYE gQZPHeokgr2tbwK3Dh8W + +CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app + +SERVER -> CLIENT: 250-email-smtp.amazonaws.com +250-8BITMIME +250-STARTTLS +250-AUTH PLAIN LOGIN +250 Ok + +CLIENT -> SERVER: STARTTLS + +SERVER -> CLIENT: 220 Ready to start TLS + +CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app + +SERVER -> CLIENT: 250-email-smtp.amazonaws.com +250-8BITMIME +250-STARTTLS +250-AUTH PLAIN LOGIN +250 Ok + +CLIENT -> SERVER: AUTH LOGIN + +SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +CLIENT -> SERVER: [credentials hidden] +SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +CLIENT -> SERVER: [credentials hidden] +SERVER -> CLIENT: 235 Authentication successful. + +CLIENT -> SERVER: MAIL FROM: + +SERVER -> CLIENT: 250 Ok + +CLIENT -> SERVER: RCPT TO: + +SERVER -> CLIENT: 250 Ok + +CLIENT -> SERVER: DATA + +SERVER -> CLIENT: 354 End data with . + +CLIENT -> SERVER: Date: Wed, 10 Sep 2025 13:14:43 +0000 + +CLIENT -> SERVER: To: support@yourdomain.com + +CLIENT -> SERVER: From: 10 + +CLIENT -> SERVER: Reply-To: Administrator , app@flatlogic.app + +CLIENT -> SERVER: Subject: New Lead from Nimbus Landing Page + +CLIENT -> SERVER: Message-ID: + +CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer) + +CLIENT -> SERVER: MIME-Version: 1.0 + +CLIENT -> SERVER: Content-Type: multipart/alternative; + +CLIENT -> SERVER: boundary="b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc" + +CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +CLIENT -> SERVER: + +CLIENT -> SERVER: This is a multi-part message in MIME format. + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc + +CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii + +CLIENT -> SERVER: + +CLIENT -> SERVER: Name: Administrator + +CLIENT -> SERVER: Email: Blarior@gmail.com + +CLIENT -> SERVER: + +CLIENT -> SERVER: 123123 + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc + +CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii + +CLIENT -> SERVER: + +CLIENT -> SERVER:

Name: Administrator

Email: Blarior@gmail.com


123123 + +CLIENT -> SERVER: + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_RGGz281O0f5ZTbjFzdr3xDUogbl4E1VbKQwy0wGzlc-- + +CLIENT -> SERVER: + +CLIENT -> SERVER: . + +SERVER -> CLIENT: 250 Ok 0100019933c3a725-dee3f92c-89a8-43b8-b180-c9a6a6fc68db-000000 + +CLIENT -> SERVER: QUIT + +SERVER -> CLIENT: 221 Bye + +SERVER -> CLIENT: 220 email-smtp.amazonaws.com ESMTP SimpleEmailService-d-UJAP95IYE 6w6jayOyd9KI2UxK7oOd + +CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app + +SERVER -> CLIENT: 250-email-smtp.amazonaws.com +250-8BITMIME +250-STARTTLS +250-AUTH PLAIN LOGIN +250 Ok + +CLIENT -> SERVER: STARTTLS + +SERVER -> CLIENT: 220 Ready to start TLS + +CLIENT -> SERVER: EHLO vm-30855.dev.flatlogic.app + +SERVER -> CLIENT: 250-email-smtp.amazonaws.com +250-8BITMIME +250-STARTTLS +250-AUTH PLAIN LOGIN +250 Ok + +CLIENT -> SERVER: AUTH LOGIN + +SERVER -> CLIENT: 334 VXNlcm5hbWU6 + +CLIENT -> SERVER: [credentials hidden] +SERVER -> CLIENT: 334 UGFzc3dvcmQ6 + +CLIENT -> SERVER: [credentials hidden] +SERVER -> CLIENT: 235 Authentication successful. + +CLIENT -> SERVER: MAIL FROM: + +SERVER -> CLIENT: 250 Ok + +CLIENT -> SERVER: RCPT TO: + +SERVER -> CLIENT: 250 Ok + +CLIENT -> SERVER: DATA + +SERVER -> CLIENT: 354 End data with . + +CLIENT -> SERVER: Date: Wed, 10 Sep 2025 13:14:44 +0000 + +CLIENT -> SERVER: To: support@yourdomain.com + +CLIENT -> SERVER: From: 10 + +CLIENT -> SERVER: Reply-To: Administrator , app@flatlogic.app + +CLIENT -> SERVER: Subject: New Lead from Nimbus Landing Page + +CLIENT -> SERVER: Message-ID: + +CLIENT -> SERVER: X-Mailer: PHPMailer 6.6.3 (https://github.com/PHPMailer/PHPMailer) + +CLIENT -> SERVER: MIME-Version: 1.0 + +CLIENT -> SERVER: Content-Type: multipart/alternative; + +CLIENT -> SERVER: boundary="b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU" + +CLIENT -> SERVER: Content-Transfer-Encoding: 8bit + +CLIENT -> SERVER: + +CLIENT -> SERVER: This is a multi-part message in MIME format. + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU + +CLIENT -> SERVER: Content-Type: text/plain; charset=us-ascii + +CLIENT -> SERVER: + +CLIENT -> SERVER: Name: Administrator + +CLIENT -> SERVER: Email: Blarior@gmail.com + +CLIENT -> SERVER: + +CLIENT -> SERVER: 123123 + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU + +CLIENT -> SERVER: Content-Type: text/html; charset=us-ascii + +CLIENT -> SERVER: + +CLIENT -> SERVER:

Name: Administrator

Email: Blarior@gmail.com


123123 + +CLIENT -> SERVER: + +CLIENT -> SERVER: + +CLIENT -> SERVER: --b1_cFHV6zdk7XiFa9a6KOQI4Pr2H941RS0y1Dmc5CeJU-- + +CLIENT -> SERVER: + +CLIENT -> SERVER: . + +SERVER -> CLIENT: 250 Ok 0100019933c3aa2d-e6f1f09d-c150-43d9-9c5a-d8f926c41ff2-000000 + +CLIENT -> SERVER: QUIT + +SERVER -> CLIENT: 221 Bye + diff --git a/register.php b/register.php new file mode 100644 index 0000000..a1f46c7 --- /dev/null +++ b/register.php @@ -0,0 +1,102 @@ +prepare("SELECT id FROM users WHERE username = ? OR email = ?"); + $stmt->execute([$username, $email]); + if ($stmt->fetch()) { + $errors[] = 'Username or email already taken'; + } + } + + // Insert user if no errors + if (empty($errors)) { + $password_hash = password_hash($password, PASSWORD_DEFAULT); + $stmt = db()->prepare("INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)"); + if ($stmt->execute([$username, $email, $password_hash])) { + // Redirect to login page + header("Location: login.php?registration=success"); + exit(); + } else { + $errors[] = 'Something went wrong. Please try again.'; + } + } +} +?> +
+ +
+
+
+
+
+

Create an Account

+ + +
+ +

+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+

+ Already have an account? Login here. +

+
+
+
+
+
+ +
+ \ No newline at end of file diff --git a/templates/footer.php b/templates/footer.php new file mode 100644 index 0000000..2bcc512 --- /dev/null +++ b/templates/footer.php @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/templates/header.php b/templates/header.php new file mode 100644 index 0000000..e406e23 --- /dev/null +++ b/templates/header.php @@ -0,0 +1,40 @@ + + + + + + + Nimbus - Effortless Cloud Management + + + + + + + + + + + \ No newline at end of file