Initial code, moved here from the "jilo" repo.
parent
79de371404
commit
051b461c40
|
@ -0,0 +1,6 @@
|
||||||
|
*.log
|
||||||
|
*.log.*
|
||||||
|
jilo.db
|
||||||
|
jilo-web.db
|
||||||
|
packaging/deb-package/
|
||||||
|
packaging/rpm-package/
|
15
README.md
15
README.md
|
@ -1,2 +1,15 @@
|
||||||
# jilo-web
|
# Jilo Web
|
||||||
|
|
||||||
|
## requirements
|
||||||
|
|
||||||
|
- web server (deb: apache | nginx)
|
||||||
|
|
||||||
|
- php support in the web server (deb: php-fpm | libapache2-mod-php)
|
||||||
|
|
||||||
|
- pdo and pdo_sqlite support in php (deb: php-db, php-sqlite3) uncomment in php.ini: ;extension=pdo_sqlite
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
- jilo-web.db outside web root
|
||||||
|
|
||||||
|
- jilo-web.db writable by web server user
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
echo 'todo install script'
|
|
@ -0,0 +1,5 @@
|
||||||
|
CREATE TABLE users (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
username TEXT NOT NULL UNIQUE,
|
||||||
|
password TEXT NOT NULL
|
||||||
|
);
|
|
@ -0,0 +1,25 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class Database {
|
||||||
|
private $pdo;
|
||||||
|
|
||||||
|
public function __construct($dbFile) {
|
||||||
|
if ( !extension_loaded('pdo_sqlite') ) {
|
||||||
|
throw new Exception('PDO extension for SQLite not loaded.');
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->pdo = new PDO("sqlite:" . $dbFile);
|
||||||
|
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
throw new Exception('DB connection failed: ' . $e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getConnection() {
|
||||||
|
return $this->pdo;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
class User {
|
||||||
|
private $db;
|
||||||
|
|
||||||
|
public function __construct($database) {
|
||||||
|
$this->db = $database->getConnection();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function register($username, $password) {
|
||||||
|
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
|
||||||
|
$query = $this->db->prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
|
||||||
|
$query->bindParam(':username', $username);
|
||||||
|
$query->bindParam(':password', $hashedPassword);
|
||||||
|
|
||||||
|
return $query->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function login($username, $password) {
|
||||||
|
$query = $this->db->prepare("SELECT * FROM users WHERE username = :username");
|
||||||
|
$query->bindParam(':username', $username);
|
||||||
|
$query->execute();
|
||||||
|
|
||||||
|
$user = $query->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if ( $user && password_verify($password, $user['password'])) {
|
||||||
|
session_start();
|
||||||
|
$_SESSION['user_id'] = $user['id'];
|
||||||
|
$_SESSION['username'] = $user['username'];
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
unset($error);
|
||||||
|
|
||||||
|
if (isset($_GET['page'])) {
|
||||||
|
$page = $_GET['page'];
|
||||||
|
} elseif (isset($_POST['page'])) {
|
||||||
|
$page = $_POST['page'];
|
||||||
|
} else {
|
||||||
|
$page = 'front';
|
||||||
|
}
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
|
||||||
|
if ( !isset($_SESSION['user_id']) && ($page !== 'login' && $page !== 'register') ) {
|
||||||
|
header('Location: index.php?page=login');
|
||||||
|
exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isset($_SESSION['username']) ) {
|
||||||
|
$user = htmlspecialchars($_SESSION['username']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($error)) {
|
||||||
|
echo "<p style='color: red;'>Error: $error</p>";
|
||||||
|
}
|
||||||
|
|
||||||
|
$allowed_urls = [
|
||||||
|
'front',
|
||||||
|
'login',
|
||||||
|
'logout',
|
||||||
|
'register',
|
||||||
|
'profile',
|
||||||
|
'config',
|
||||||
|
];
|
||||||
|
|
||||||
|
include 'templates/header.php';
|
||||||
|
|
||||||
|
if (in_array($page, $allowed_urls)) {
|
||||||
|
include "pages/{$page}.php";
|
||||||
|
} else {
|
||||||
|
include 'pages/front.php';
|
||||||
|
}
|
||||||
|
|
||||||
|
include 'templates/footer.php';
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1 @@
|
||||||
|
<?php ?>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'classes/database.php';
|
||||||
|
require 'classes/user.php';
|
||||||
|
unset($error);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$db = new Database('./jilo-web.db');
|
||||||
|
$user = new User($db);
|
||||||
|
|
||||||
|
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
|
||||||
|
$username = $_POST['username'];
|
||||||
|
$password = $_POST['password'];
|
||||||
|
|
||||||
|
if ( $user->login($username, $password) ) {
|
||||||
|
header('Location: index.php');
|
||||||
|
exit();
|
||||||
|
} else {
|
||||||
|
echo "Login failed.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$error = $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
include 'templates/form-login.php';
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,10 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
session_start();
|
||||||
|
session_unset();
|
||||||
|
session_destroy();
|
||||||
|
unset($error);
|
||||||
|
|
||||||
|
echo "You logged out.";
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,3 @@
|
||||||
|
<?php ?>
|
||||||
|
|
||||||
|
profile of <?= $user ?>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'classes/database.php';
|
||||||
|
require 'classes/user.php';
|
||||||
|
unset($error);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$db = new Database('./jilo-web.db');
|
||||||
|
$user = new User($db);
|
||||||
|
|
||||||
|
if ( $_SERVER['REQUEST_METHOD'] == 'POST' ) {
|
||||||
|
$username = $_POST['username'];
|
||||||
|
$password = $_POST['password'];
|
||||||
|
|
||||||
|
if ( $user->register($username, $password) ) {
|
||||||
|
echo "Registration successful.";
|
||||||
|
} else {
|
||||||
|
echo "Registration failed.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$error = $e->getMessage();
|
||||||
|
}
|
||||||
|
|
||||||
|
include 'templates/form-register.php';
|
||||||
|
|
||||||
|
?>
|
|
@ -0,0 +1,38 @@
|
||||||
|
.menu-container {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
background-color: #777;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-left, .menu-right {
|
||||||
|
display: flex;
|
||||||
|
list-style: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-left li, .menu-right li {
|
||||||
|
margin: 0 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-left a, .menu-right a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-left li a, .menu-right li a {
|
||||||
|
display: block;
|
||||||
|
color: white;
|
||||||
|
text-align: center;
|
||||||
|
padding: 14px 16px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-left li a:hover, .menu-right li a:hover {
|
||||||
|
background-color: #111;
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
<div id="footer">Jilo Web</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
<form method="POST" action="?page=login">
|
||||||
|
<input type="text" name="username" placeholder="Username" required />
|
||||||
|
<input type="password" name="password" placeholder="Password" required />
|
||||||
|
<button type="submit">Login</button>
|
||||||
|
</form>
|
|
@ -0,0 +1,6 @@
|
||||||
|
|
||||||
|
<form method="POST" action="?page=register">
|
||||||
|
<input type="text" name="username" placeholder="Username" required />
|
||||||
|
<input type="password" name="password" placeholder="Password" required />
|
||||||
|
<button type="submit">Register</button>
|
||||||
|
</form>
|
|
@ -0,0 +1,28 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="stylesheet" type="text/css" href="static/all.css">
|
||||||
|
<title>Jilo Web</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div class="menu-container">
|
||||||
|
<ul class="menu-left">
|
||||||
|
<li><a href="index.php">home</a></li>
|
||||||
|
<?php if ( isset($_SESSION['user_id']) ) { ?>
|
||||||
|
<li><a href="?page=config">config</a></li>
|
||||||
|
<?php } ?>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<ul class="menu-right">
|
||||||
|
<?php if ( isset($_SESSION['user_id']) ) { ?>
|
||||||
|
<li><a href="?page=profile"><?= $user ?></a></li>
|
||||||
|
<li><a href="?page=logout">logout</a></li>
|
||||||
|
<?php } else { ?>
|
||||||
|
<li><a href="?page=login">login</a></li>
|
||||||
|
<li><a href="?page=register">register</a></li>
|
||||||
|
<?php } ?>
|
||||||
|
</ul>
|
||||||
|
</div>
|
Loading…
Reference in New Issue