From 3873cad7baf5d2f63b4399b7bfb0ec4d7d66adb9 Mon Sep 17 00:00:00 2001 From: Connor Thomson Date: Sat, 19 Sep 2026 17:02:13 -0700 Subject: Add signup and other stuff --- css/desktop/body.css | 2 +- css/desktop/button.css | 36 +++++++++++++++++ css/desktop/input.css | 27 +++++++++++++ css/desktop/login.css | 44 +++++++++++++++++++++ html/app.html | 45 ---------------------- html/main.html | 48 +++++++++++++++++++++++ php/render.php | 4 +- signin/content.html | 19 +++++++++ signin/index.php | 29 ++++++++++++++ signup/content.html | 45 ++++++++++++++++++++++ signup/index.php | 1 + signup/signup.php | 96 ++++++++++++++++++++++++++++++++++++++++++++++ signup/verify/content.html | 32 ++++++++++++++++ signup/verify/index.php | 1 + signup/verify/verify.php | 96 ++++++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 477 insertions(+), 48 deletions(-) create mode 100644 css/desktop/button.css create mode 100644 css/desktop/input.css create mode 100644 css/desktop/login.css delete mode 100755 html/app.html create mode 100755 html/main.html create mode 100644 signin/content.html create mode 100644 signin/index.php create mode 100644 signup/content.html create mode 120000 signup/index.php create mode 100644 signup/signup.php create mode 100644 signup/verify/content.html create mode 120000 signup/verify/index.php create mode 100644 signup/verify/verify.php diff --git a/css/desktop/body.css b/css/desktop/body.css index e252f1c..aecb18a 100755 --- a/css/desktop/body.css +++ b/css/desktop/body.css @@ -26,7 +26,7 @@ html, body { margin: 0; padding: 0; background-color: #F5F7FA; - line-height: 1; + line-height: 1.4; } .content p, diff --git a/css/desktop/button.css b/css/desktop/button.css new file mode 100644 index 0000000..9164f93 --- /dev/null +++ b/css/desktop/button.css @@ -0,0 +1,36 @@ +/* + * GNUfault.org - GNUfault's website + * Copyright (C) 2026 Connor Thomson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +.button { + background-color: #ffffff; + border: 1px solid #98A5B0; + border-radius: 3px; + padding: 1px 3px 1px 3px; + width: fit-content; + display: inline-flex; + justify-content: center; + align-items: center; +} + +.button:hover { + background-color: #F2F2F2; +} + +.button:active { + background-color: #E6E6E6; +} diff --git a/css/desktop/input.css b/css/desktop/input.css new file mode 100644 index 0000000..883e124 --- /dev/null +++ b/css/desktop/input.css @@ -0,0 +1,27 @@ +/* + * GNUfault.org - GNUfault's website + * Copyright (C) 2026 Connor Thomson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +.input { + border: 1px solid #98A5B0; + border-radius: 3px; +} + +.input:focus { + outline: none; + border: 1px solid #12A3EB; +} diff --git a/css/desktop/login.css b/css/desktop/login.css new file mode 100644 index 0000000..257924a --- /dev/null +++ b/css/desktop/login.css @@ -0,0 +1,44 @@ +/* + * GNUfault.org - GNUfault's website + * Copyright (C) 2026 Connor Thomson + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +.login { + display: grid; + grid-template-columns: minmax(0, 1fr) 200px minmax(0, 1fr); + column-gap: 15px; + row-gap: 15px; + align-items: center; +} + +.login .group { + display: contents; +} + +.login .group label { + grid-column: 1; + text-align: right; +} + +.login .group input { + grid-column: 2; + width: 100%; +} + +.login button { + grid-column: 2; + justify-self: center; +} diff --git a/html/app.html b/html/app.html deleted file mode 100755 index a01ca45..0000000 --- a/html/app.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - GNUfault.org - - - - - - - - - - -
- {{header}} - -
- {{content}} -
- - {{footer}} -
- - diff --git a/html/main.html b/html/main.html new file mode 100755 index 0000000..d4a3534 --- /dev/null +++ b/html/main.html @@ -0,0 +1,48 @@ + + + + + + + + GNUfault.org + + + + + + + + + + + + + +
+ {{header}} + +
+ {{content}} +
+ + {{footer}} +
+ + diff --git a/php/render.php b/php/render.php index 00aafb0..eab7c82 100755 --- a/php/render.php +++ b/php/render.php @@ -30,8 +30,8 @@ function render_page(string $page) { '{{device}}' => $device ]; - $app_html = replace(ROOT . '/html/app.html', $targets); + $main_html = replace(ROOT . '/html/main.html', $targets); - echo $app_html; + echo $main_html; } ?> diff --git a/signin/content.html b/signin/content.html new file mode 100644 index 0000000..90fcafa --- /dev/null +++ b/signin/content.html @@ -0,0 +1,19 @@ + + +

WIP

diff --git a/signin/index.php b/signin/index.php new file mode 100644 index 0000000..2f2377d --- /dev/null +++ b/signin/index.php @@ -0,0 +1,29 @@ +. + */ + +define('ROOT', rtrim($_SERVER['DOCUMENT_ROOT'], '/') . '/'); + +require_once ROOT . '/php/render.php'; + +$path = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); +$file = rtrim($path, '/') . '/content.html'; + +render_page(ROOT . $file); + +?> diff --git a/signup/content.html b/signup/content.html new file mode 100644 index 0000000..83c9fe7 --- /dev/null +++ b/signup/content.html @@ -0,0 +1,45 @@ + + +

Create a GNUfault.org account

+
+

If you need any help, email me at <connor@gnufault.org>.

+
+ diff --git a/signup/index.php b/signup/index.php new file mode 120000 index 0000000..1876f97 --- /dev/null +++ b/signup/index.php @@ -0,0 +1 @@ +../php/index.php \ No newline at end of file diff --git a/signup/signup.php b/signup/signup.php new file mode 100644 index 0000000..5ba3ca8 --- /dev/null +++ b/signup/signup.php @@ -0,0 +1,96 @@ +. + */ + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $username = $_POST['username']; + $password = $_POST['password']; + $confirmpassword = $_POST['confirmpassword']; + $email = $_POST['email']; + + if ($confirmpassword != $password) { + echo "Passwords do not match!"; + exit; + } + + $hashed_password = password_hash($password, PASSWORD_DEFAULT); + + $code = rand(1000, 9999); + + $host = '127.0.0.1'; + $db = 'gnufaultdb'; + $db_user = 'gnufaultdb_user'; + $pass = trim(file_get_contents('/etc/gnufault.d/password')); + + $charset = 'utf8mb4'; + $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; + + $options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + + try { + $pdo = new PDO($dsn, $db_user, $pass, $options); + } catch (\PDOException $e) { + throw new \PDOException($e->getMessage(), (int)$e->getCode()); + } + + try { + $sql = "INSERT INTO users (username, email, password, verification_code) VALUES (:username, :email, :password, :code)"; + $stmt = $pdo->prepare($sql); + $stmt->execute([ + 'username' => $username, + 'email' => $email, + 'password' => $hashed_password, + 'code' => $code + ]); + + $user_id = $pdo->lastInsertId(); + + setcookie('user_id', (string)$user_id, [ + 'expires' => 2147483647, + 'path' => '/', + 'secure' => true, + 'httponly' => true, + 'samesite' => 'Strict' + ]); + } catch (\PDOException $e) { + if ($e->getCode() == 23000) { + echo "Error: Username or email is already taken."; + } else { + echo "Error: " . $e->getMessage(); + } + exit; + } + + $subject = "GNUfault.org Verification Code"; + + $headers = "From: noreply@gnufault.org" . "\r\n" . + "Reply-To: noreply@gnufault.org" . "\r\n" . + "X-Mailer: PHP/" . phpversion(); + + if (mail($email, $subject, $code, $headers)) { + header("Location: verify"); + } else { + echo "Failed to send"; + exit; + } +} +?> diff --git a/signup/verify/content.html b/signup/verify/content.html new file mode 100644 index 0000000..2ba116b --- /dev/null +++ b/signup/verify/content.html @@ -0,0 +1,32 @@ + + +

Verify your GNUfault.org account

+
+

To prevent spam, an email was sent to you with a 4-digit code from <noreply@gnufault.org>.

+

The email will most likely go to spam due to me using self-hosted email. If it does, please report it as not spam.

+

If you need any help, email me at <connor@gnufault.org> using the same email you signed up with.

+
+ diff --git a/signup/verify/index.php b/signup/verify/index.php new file mode 120000 index 0000000..3e5d98e --- /dev/null +++ b/signup/verify/index.php @@ -0,0 +1 @@ +../../php/index.php \ No newline at end of file diff --git a/signup/verify/verify.php b/signup/verify/verify.php new file mode 100644 index 0000000..e5e729f --- /dev/null +++ b/signup/verify/verify.php @@ -0,0 +1,96 @@ +. + */ + +if ($_SERVER["REQUEST_METHOD"] == "POST") { + $code = $_POST['code']; + $user_id = $_COOKIE['user_id'] ?? null; + + if (!$user_id) { + echo "Not logged in."; + exit; + } + + $host = '127.0.0.1'; + $db = 'gnufaultdb'; + $db_user = 'gnufaultdb_user'; + $pass = trim(file_get_contents('/etc/gnufault.d/password')); + + $charset = 'utf8mb4'; + $dsn = "mysql:host=$host;dbname=$db;charset=$charset"; + + $options = [ + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + PDO::ATTR_EMULATE_PREPARES => false, + ]; + + try { + $pdo = new PDO($dsn, $db_user, $pass, $options); + } catch (\PDOException $e) { + throw new \PDOException($e->getMessage(), (int)$e->getCode()); + } + + try { + $sql = "SELECT verification_code FROM users WHERE id = :id"; + $stmt = $pdo->prepare($sql); + + $stmt->execute(['id' => $user_id]); + + $user = $stmt->fetch(); + if (!$user) { + echo "User not found."; + exit; + } + + $real_code = $user['verification_code']; + } catch (\PDOException $e) { + echo "Error: " . $e->getMessage(); + exit; + } + + if ($real_code == '0001') { + echo "Account is already verifed"; + exit; + } + + if ($code != $real_code) { + echo "Code is not correct!"; + exit; + } + + try { + $sql = "UPDATE users SET verification_code = :code WHERE id = :id"; + $stmt = $pdo->prepare($sql); + + $stmt->execute([ + 'code' => '0001', + 'id' => $user_id + ]); + + if ($stmt->rowCount() == 0) { + echo "User not found."; + } + } catch (\PDOException $e) { + echo "Error: " . $e->getMessage(); + exit; + } + + header("Location: /signin"); +} +?> -- cgit v1.2.3