summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConnor Thomson <blumatrikz@gmail.com>2026-09-19 17:02:13 -0700
committerConnor Thomson <blumatrikz@gmail.com>2026-09-19 17:02:13 -0700
commit3873cad7baf5d2f63b4399b7bfb0ec4d7d66adb9 (patch)
tree32e2b8c18d08f1b891122b503fc0f45bb16594f8
parent90aab6db1cd794bd582bd6531b732c39846adae8 (diff)
Add signup and other stuff
-rwxr-xr-xcss/desktop/body.css2
-rw-r--r--css/desktop/button.css36
-rw-r--r--css/desktop/input.css27
-rw-r--r--css/desktop/login.css44
-rwxr-xr-xhtml/main.html (renamed from html/app.html)13
-rwxr-xr-xphp/render.php4
-rw-r--r--signin/content.html19
-rw-r--r--signin/index.php29
-rw-r--r--signup/content.html45
l---------signup/index.php1
-rw-r--r--signup/signup.php96
-rw-r--r--signup/verify/content.html32
l---------signup/verify/index.php1
-rw-r--r--signup/verify/verify.php96
14 files changed, 437 insertions, 8 deletions
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 <https://www.gnu.org/licenses/>.
+ */
+
+.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 <https://www.gnu.org/licenses/>.
+ */
+
+.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 <https://www.gnu.org/licenses/>.
+ */
+
+.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/main.html
index a01ca45..d4a3534 100755
--- a/html/app.html
+++ b/html/main.html
@@ -25,11 +25,14 @@
<link rel="icon" type="image/x-icon" href="/images/logos/taya.gif">
- <link rel="stylesheet" href="/css/{{device}}/body.css" media="(min-width: 768px)">
- <link rel="stylesheet" href="/css/{{device}}/content.css" media="(min-width: 768px)">
- <link rel="stylesheet" href="/css/{{device}}/header.css" media="(min-width: 768px)">
- <link rel="stylesheet" href="/css/{{device}}/footer.css" media="(min-width: 768px)">
- <link rel="stylesheet" href="/css/{{device}}/container.css" media="(min-width: 768px)">
+ <link rel="stylesheet" href="/css/{{device}}/body.css">
+ <link rel="stylesheet" href="/css/{{device}}/content.css">
+ <link rel="stylesheet" href="/css/{{device}}/header.css">
+ <link rel="stylesheet" href="/css/{{device}}/footer.css">
+ <link rel="stylesheet" href="/css/{{device}}/container.css">
+ <link rel="stylesheet" href="/css/{{device}}/button.css">
+ <link rel="stylesheet" href="/css/{{device}}/input.css">
+ <link rel="stylesheet" href="/css/{{device}}/login.css">
</head>
<body ontouchstart>
<div class="container">
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 @@
+<!--
+ -- 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 <https://www.gnu.org/licenses/>.
+ -->
+
+<p>WIP</p>
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 @@
+<?php
+/*
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+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 @@
+<!--
+ -- 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 <https://www.gnu.org/licenses/>.
+ -->
+
+<h2>Create a GNUfault.org account</h2>
+<hr>
+<p>If you need any help, email me at &lt;<a href="mailto:noreply@gnufault.org">connor@gnufault.org</a>&gt;.</p>
+<br>
+<form class="login" action="signup.php" method="POST">
+ <div class="group">
+ <label for="user">Username:</label>
+ <input class="input" type="text" id="username" name="username" required>
+ </div>
+
+ <div class="group">
+ <label for="password">Password:</label>
+ <input class="input" type="password" id="password" name="password" required>
+ </div>
+
+ <div class="group">
+ <label for="confirmpassword">Confirm password:</label>
+ <input class="input" type="password" id="confirmpassword" name="confirmpassword" required>
+ </div>
+
+ <div class="group">
+ <label for="email">Email:</label>
+ <input class="input" type="email" id="email" name="email" required>
+ </div>
+
+ <button class="button" type="submit">Send</button>
+</form>
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 @@
+<?php
+/*
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+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 @@
+<!--
+ -- 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 <https://www.gnu.org/licenses/>.
+ -->
+
+<h2>Verify your GNUfault.org account</h2>
+<hr>
+<p>To prevent spam, an email was sent to you with a 4-digit code from &lt;<a href="mailto:noreply@gnufault.org">noreply@gnufault.org</a>&gt;.</p>
+<p>The email will most likely go to spam due to me using self-hosted email. If it does, please report it as not spam.</p>
+<p>If you need any help, email me at &lt;<a href="mailto:noreply@gnufault.org">connor@gnufault.org</a>&gt; using the same email you signed up with.</p>
+<br>
+<form class="login" action="verify.php" method="POST">
+ <div class="group">
+ <label for="user">Code:</label>
+ <input class="input" type="text" maxlength="4" id="code" name="code" required>
+ </div>
+
+ <button class="button" type="submit">Send</button>
+</form>
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 @@
+<?php
+/*
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+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");
+}
+?>