summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaksymilian Jopek <maks@jopek.eu>2023-04-13 15:47:15 +0200
committerMaksymilian Jopek <maks@jopek.eu>2023-04-13 15:47:15 +0200
commit87ffa36c1bfa49259e48d94f09e64f83632f0071 (patch)
tree87a5f2157474c6b31a2efddaf8df5aad886ff070
downloadcms-87ffa36c1bfa49259e48d94f09e64f83632f0071.tar.gz
cms-87ffa36c1bfa49259e48d94f09e64f83632f0071.tar.zst
cms-87ffa36c1bfa49259e48d94f09e64f83632f0071.zip
-rw-r--r--cardEdit.php84
-rw-r--r--cardsList.php103
-rw-r--r--cms.sql81
-rw-r--r--consts.php13
-rw-r--r--dbCredentials.php5
-rw-r--r--index.php91
-rw-r--r--login.php48
-rw-r--r--main.php122
-rw-r--r--userEdit.php149
-rw-r--r--users.php99
10 files changed, 795 insertions, 0 deletions
diff --git a/cardEdit.php b/cardEdit.php
new file mode 100644
index 0000000..9fce311
--- /dev/null
+++ b/cardEdit.php
@@ -0,0 +1,84 @@
+<?php
+session_start();
+
+require_once "dbCredentials.php";
+require_once "consts.php";
+checkLoggedIn();
+
+$card = $_SESSION["edited_card"];
+$adding = $card["id"] === null;
+if ($card["id"] === null)
+ $id = -1;
+else
+ $id = $card["id"];
+
+if (isset($_POST["body"]) && isset($_POST["title"])) {
+ $pdo = new PDO("mysql:dbname=$dbName;host=$dbHost;charset=utf8mb4", $dbUser, $dbPassword);
+ $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+
+ if ($id === -1)
+ $sql = "INSERT INTO `cms_card`(`title`, `body`) VALUES (:title, :body)";
+ else
+ $sql = "UPDATE `cms_card` SET `title`= :title, `body`=:body WHERE `id`=:id";
+
+ $stmt = $pdo->prepare($sql);
+
+ if ($id === -1) {
+ $stmt->execute([
+ "title" => $_POST["title"],
+ "body" => nl2br($_POST["body"]),
+ ]);
+ } else {
+ $stmt->execute([
+ "title" => $_POST["title"],
+ "body" => nl2br($_POST["body"]),
+ "id" => $_POST["id"],
+ ]);
+ }
+
+ $_POST["edited_card"] = null;
+ header("Location: cardsList.php");
+ exit();
+}
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
+
+ <title>Edit card</title>
+</head>
+
+<body class="bg-dark text-white">
+ <div style="margin: 0 auto; width: 50%;">
+ <!-- class="container"> -->
+ <div style="margin: 5px auto; width: 50%;">
+ <h4>Card <?= 14 ?></h4>
+ <hr style="margin-left: -150%; margin-top: 0; width: 100vw;">
+ <form action="cardEdit.php" method="post" style="width: 140%">
+ <input type="hidden" name="id" value="<?= $id ?>">
+ <label for="title">Title:</label><br>
+ <input type="text" name="title" id="title" value="<?= $card["title"] ?>" required><br>
+ <label for="body">Body:</label><br>
+ <textarea id="body" name="body" rows="4" cols="50" required><?= $card["body"] ?></textarea><br>
+ <?php
+ if ($adding === true)
+ echo "<button type='submit' class='btn btn-warning' style='float: right;'>Dodaj</button>";
+ else
+ echo "<button type='submit' class='btn btn-info' style='float: right;'>Zapisz</button>";
+ ?>
+ </form><br><br>
+ <h3 style="float: left; color: red;"><?= $error ?></h3>
+ </div>
+ </div>
+ <!-- Optional JavaScript; choose one of the two! -->
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/cardsList.php b/cardsList.php
new file mode 100644
index 0000000..7e2ffc5
--- /dev/null
+++ b/cardsList.php
@@ -0,0 +1,103 @@
+<?php
+session_start();
+
+require_once "dbCredentials.php";
+require_once "consts.php";
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+checkLoggedIn();
+
+if ($_SESSION["user_type"] !== 1) {
+ header("Location: main.php");
+}
+$pdo = new PDO("mysql:dbname=$dbName;host=$dbHost;charset=utf8mb4", $dbUser, $dbPassword);
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$stmt = $pdo->prepare("SELECT * FROM `cms_card`");
+$stmt->execute();
+$cards = $stmt->fetchAll(PDO::FETCH_ASSOC);
+function strStartsWith(string $needle, string $haystack)
+{
+ return substr($haystack, 0, strlen($needle)) === $needle;
+}
+if (isset($_GET["editType"])) {
+ $type = explode('!', $_GET["editType"]);
+ if ($type[0] === "Add" || $type[0] === "Edit") {
+ if ($type[0] === "Edit") {
+ $stmt = $pdo->prepare("SELECT * FROM `cms_card` WHERE `id` = :id");
+ $stmt->execute(["id" => $type[1]]);
+ $card = $stmt->fetchAll(PDO::FETCH_ASSOC)[0];
+ } else {
+ $card = [
+ "title" => "",
+ "body" => "",
+ ];
+ }
+ $_SESSION["edited_card"] = $card;
+ header("Location: cardEdit.php");
+ } elseif ($type[0] === "Remove") {
+ $stmt = $pdo->prepare("DELETE FROM `cms_card` WHERE `id` = :id");
+ $stmt->execute(["id" => $type[1]]);
+ $card = $stmt->fetchAll(PDO::FETCH_ASSOC);
+ header("Location: cardsList.php");
+ }
+ exit();
+}
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet">
+
+ <title>Card List</title>
+</head>
+
+<body class="bg-dark"><br>
+ <div class="container">
+ <table class="table table-dark table-bordered text-center" style="border: 1px solid white;">
+ <thead>
+ <tr>
+ <th>Id</th>
+ <th>Title</th>
+ <th>Body</th>
+ <th>Edit</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach ($cards as $card) {
+ if (strlen($card["body"]) > 25)
+ $title = substr($card["title"], 0, 25) . "...";
+ else
+ $title = $card["title"];
+ if (strlen($card["body"]) > 150)
+ $body = substr($card["body"], 0, 150) . "...";
+ else
+ $body = $card["body"];
+ echo "<tr>
+ <td>{$card["id"]}</td>
+ <td>$title</td>
+ <td style='width: 700px; border: 0; display: inline-block; overflow-wrap: break-word;'>$body</td>
+ <td style='width: 280px;'>
+ <a class='btn btn-primary' href='cardsList.php?editType=Edit!{$card["id"]}'>Edit <i class='fas fa-edit'></i></a>&nbsp;&nbsp;
+ <a class='btn btn-danger' href='cardsList.php?editType=Remove!{$card["id"]}'>Remove <i class='fas fa-trash'></i></a>
+ </td>
+ </tr>";
+ }
+ ?>
+ </tbody>
+ </table>
+ <a class="btn btn-success" style="float: right;" href="cardsList.php?editType=Add">Add</a>
+ <a class="btn btn-primary" style="float: left;" href="main.php">Go to main</a>
+ </div>
+ <!-- Optional JavaScript; choose one of the two! -->
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/cms.sql b/cms.sql
new file mode 100644
index 0000000..3adfe9f
--- /dev/null
+++ b/cms.sql
@@ -0,0 +1,81 @@
+-- MySQL dump 10.18 Distrib 10.3.27-MariaDB, for debian-linux-gnueabihf (armv8l)
+--
+-- Host: localhost Database: cms
+-- ------------------------------------------------------
+-- Server version 10.3.27-MariaDB-0+deb10u1
+
+/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
+/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
+/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
+/*!40101 SET NAMES utf8mb4 */;
+/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
+/*!40103 SET TIME_ZONE='+00:00' */;
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+
+--
+-- Table structure for table `cms_card`
+--
+
+DROP TABLE IF EXISTS `cms_card`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cms_card` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `title` text NOT NULL,
+ `body` text NOT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cms_card`
+--
+
+LOCK TABLES `cms_card` WRITE;
+/*!40000 ALTER TABLE `cms_card` DISABLE KEYS */;
+INSERT INTO `cms_card` VALUES (26,'Short tile','Short body'),(27,'Very long long long long long long long long long long long long long long long long long long long long long title','Very long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long long body'),(28,'New article','New article body');
+/*!40000 ALTER TABLE `cms_card` ENABLE KEYS */;
+UNLOCK TABLES;
+
+--
+-- Table structure for table `cms_user`
+--
+
+DROP TABLE IF EXISTS `cms_user`;
+/*!40101 SET @saved_cs_client = @@character_set_client */;
+/*!40101 SET character_set_client = utf8 */;
+CREATE TABLE `cms_user` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `login` varchar(50) NOT NULL,
+ `password` varchar(50) NOT NULL,
+ `firstname` varchar(50) NOT NULL,
+ `lastname` varchar(50) NOT NULL,
+ `email` varchar(50) NOT NULL,
+ `user_type` tinyint(3) unsigned NOT NULL DEFAULT 2,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4;
+/*!40101 SET character_set_client = @saved_cs_client */;
+
+--
+-- Dumping data for table `cms_user`
+--
+
+LOCK TABLES `cms_user` WRITE;
+/*!40000 ALTER TABLE `cms_user` DISABLE KEYS */;
+INSERT INTO `cms_user` VALUES (5,'uspiony','123','filip','polak','maks@example.com',2),(6,'123','123','name','eman','maks@example.com',2),(9,'admin','admin','admin','admin','admin@example.com',1),(10,'adamNowak','123','adam','nowak','adam@example.com',2),(11,'13','123','13','','maks@13.eu',2);
+/*!40000 ALTER TABLE `cms_user` ENABLE KEYS */;
+UNLOCK TABLES;
+/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
+/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
+/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
+
+-- Dump completed on 2021-06-06 21:29:18
diff --git a/consts.php b/consts.php
new file mode 100644
index 0000000..0f5e44d
--- /dev/null
+++ b/consts.php
@@ -0,0 +1,13 @@
+<?php
+$UserType = [
+ "admin" => 1, 1 => "admin",
+ "user" => 2, 2 => "user"
+];
+function checkLoggedIn()
+{
+ if ($_SESSION["logged"] !== true) {
+ header("HTTP/1.0 403 Teapot not for you :'(");
+ header("Location: index.php");
+ exit();
+ }
+}
diff --git a/dbCredentials.php b/dbCredentials.php
new file mode 100644
index 0000000..53181a5
--- /dev/null
+++ b/dbCredentials.php
@@ -0,0 +1,5 @@
+<?php
+$dbUser = "admin";
+$dbPassword = "qwerty";
+$dbName = "cms";
+$dbHost = "localhost";
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..0a1d9b2
--- /dev/null
+++ b/index.php
@@ -0,0 +1,91 @@
+<?php
+session_start();
+if ($_SESSION["logged"] === true) {
+ header("HTTP/1.0 307 Teapot is waiting for you :>");
+ header("Location: main.php");
+}
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous">
+
+ <title>CMS - Login</title>
+</head>
+
+<body class="bg-dark text-white">
+ <form method="POST" action="login.php" class="container" style="margin: 0 auto; width: fit-content">
+ <h1 class="text-center fw-bold">Login</h1>
+ <div>
+ <label for="username" class="m-1">Username:</label><br>
+ <input type="text" name="username" id="username" size="30"><br>
+ </div>
+ <div style="margin-top: 30px;">
+ <label for="password" class="m-1">Password:</label><br>
+ <input type="password" name="password" id="password" size="30">
+ </div>
+ <div style="margin-top: 15px;">
+ <div style="float: left;">
+ <input type="checkbox" name="remember" id="remember">
+ <label for="remember">Remember me</label>
+ </div>
+ <div style="float: right;">
+ <a href="#">Forgot password?</a>
+ </div>
+ </div>
+ <div class="text-center" style="margin-top: 70px;">
+ <button type="submit" class="btn btn-primary btn-lg">Log in</button>
+ </div>
+ <div style="margin-top: 30px;">
+ <div style="float: right;">
+ <a href="#">You don't have an account?</a>
+ </div>
+ </div>
+ </form>
+ <div class="modal fade" id="errorModal" tabindex="-1" aria-labelledby="errorModalLabel" aria-hidden="true">
+ <div class="modal-dialog">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title text-dark" id="errorModalLabel">Error</h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body text-dark">
+ <?= $_SESSION["error"] ?>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <button type="button" style="display: none;" id="btnErrorModal" data-bs-toggle="modal" data-bs-target="#errorModal">
+ </button>
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous"></script>
+ <script>
+ let errorModal = new bootstrap.Modal(document.getElementById('errorModal'));
+ let show = <?= isset($_SESSION["error"]) === true ? 1 : 0 ?>;
+ if (show === 1)
+ errorModal.show();
+
+ function getCookie(name) {
+ const parts = `; ${document.cookie}`.split(`; ${name}=`);
+ if (parts.length === 2) return parts.pop().split(';').shift();
+ else return null;
+ }
+ let username = getCookie("username");
+ console.log(username)
+ if(username !== null) {
+ document.getElementById("username").value = getCookie("username");
+ document.getElementById("remember").checked = true;
+ }
+ </script>
+</body>
+<?php unset($_SESSION["error"]); ?>
+
+</html> \ No newline at end of file
diff --git a/login.php b/login.php
new file mode 100644
index 0000000..cdd65e2
--- /dev/null
+++ b/login.php
@@ -0,0 +1,48 @@
+<?php
+session_start();
+
+$username = $_POST["username"];
+$password = $_POST["password"];
+$remember = $_POST["remember"];
+
+if ($remember === null)
+ $remember = false;
+elseif ($remember === "on")
+ $remember = true;
+
+if (in_array(null, [$username, $password, $remember], true) === true || in_array('', [$username, $password, $remember], true) === true) {
+ header("HTTP/1.0 400 No Teapot here :(");
+ header("Location: index.php");
+ $_SESSION['error'] = "You didn't specify username or password or remember option";
+ exit();
+}
+
+require_once "dbCredentials.php";
+
+$pdo = new PDO("mysql:dbname=$dbName;host=$dbHost;charset=utf8mb4", $dbUser, $dbPassword);
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$stmt = $pdo->prepare("SELECT `firstname`, `lastname`, `email`, `user_type` FROM `cms_user` WHERE `login`=:login AND `password`=:password");
+$stmt->execute(["login" => $username, "password" => $password]);
+$user = $stmt->fetchAll(PDO::FETCH_ASSOC);
+if (count($user) === 0) {
+ header("HTTP/1.0 403 No Teapot for you :)");
+ header("Location: index.php");
+ $_SESSION['error'] = "Wrong username or password";
+ exit();
+}
+$user = $user[0];
+$_SESSION['firstname'] = $user['firstname'];
+$_SESSION['lastname'] = $user['lastname'];
+$_SESSION['email'] = $user['email'];
+$_SESSION['user_type'] = $user['user_type'];
+$_SESSION['logged'] = true;
+
+if ($remember === true) {
+ setcookie("username", $username, time() + 60 * 60 * 24 * 365);
+} else {
+ unset($_COOKIE['username']);
+ setcookie('username', '', time() - 3600);
+}
+
+header("HTTP/1.0 200 Teapot for you :]");
+header("Location: main.php");
diff --git a/main.php b/main.php
new file mode 100644
index 0000000..5a0d62a
--- /dev/null
+++ b/main.php
@@ -0,0 +1,122 @@
+<?php
+session_start();
+require_once "consts.php";
+require_once "dbCredentials.php";
+checkLoggedIn();
+if ($_GET["logout"] === "1") {
+ header("HTTP/1.0 307 Teapot has no more tea :'(");
+ header("Location: index.php");
+ session_unset();
+ exit();
+}
+$pdo = new PDO("mysql:dbname=$dbName;host=$dbHost;charset=utf8mb4", $dbUser, $dbPassword);
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$stmt = $pdo->prepare("SELECT * FROM `cms_card`");
+$stmt->execute();
+$cards = $stmt->fetchAll(PDO::FETCH_ASSOC);
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous">
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity="sha512-iBBXm8fW90+nuLcSKlbmrPcLa0OT92xO1BIsZ+ywDWZCvqsWgccV3gFoRBv0z+8dLJgyAHIhR35VZc2oM/gI1w==" crossorigin="anonymous" referrerpolicy="no-referrer" />
+
+ <style>
+ .w-45 {
+ width: 49.5%;
+ margin-bottom: 5px;
+ margin-right: 5px;
+ }
+
+ footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ height: 3rem;
+ padding: 12px;
+ background-color: #202020;
+ color: white;
+ text-align: center;
+ color: #878787;
+ }
+ </style>
+
+ <title>CMS - Main</title>
+</head>
+
+<body class="bg-dark text-white" style="position: relative; min-height: 100vh;">
+ <div class="container" style="padding-bottom: 3rem;">
+ <nav class="navbar navbar-expand-lg navbar navbar-dark bg-dark">
+ <a class="navbar-brand" href="#">
+ <i class="fas fa-home"></i>
+ </a>
+ <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
+ <span class="navbar-toggler-icon"></span>
+ </button>
+ <div class="collapse navbar-collapse">
+ <div class="navbar-nav">
+ <a class="nav-item nav-link active" href="#">News</a>
+ <a class="nav-item nav-link" href="#">Articles</a>
+ <a class="nav-item nav-link" href="#">Pricing</a>
+ <?php
+ if ($_SESSION["user_type"] === 1)
+ echo '<a class="nav-item nav-link" href="users.php">Administration</a>'
+ ?>
+ </div>
+ </div>
+ </nav><br>
+ <div style='display: flex; flex-wrap: wrap;'>
+ <?php
+ $i = 0;
+ foreach ($cards as $card) {
+ if (strlen($card["body"]) > 40)
+ $title = substr($card["title"], 0, 40) . "...";
+ else
+ $title = $card["title"];
+ if (strlen($card["body"]) > 250)
+ $body = substr($card["body"], 0, 250) . "...";
+ else
+ $body = $card["body"];
+ $i++;
+ echo "
+ <div class='card w-45 bg-secondary'>
+ <h5 class='card-header'>News $i</h5>
+ <div class='card-body'>
+ <h5 class='card-title'>$title</h5>
+ <p class='card-text'>$body</p>
+ <a href='#' class='btn btn-primary'>Read whole</a>
+ </div>
+ </div>
+ ";
+ } ?>
+ </div>
+ <div class="card bg-secondary text-center" style="width: 99.4%">
+ <h5 class="card-header bg-success">Advertisement</h5>
+ <div class="card-body">
+ <h5 class="card-title">By our thing</h5>
+ <p class="card-text">Out thing is better than those other things</p>
+ <a href="#" class="btn btn-primary">Go somewhere</a>
+ </div>
+ <div class="card-footer">
+ Final countdown
+ </div>
+ </div><br>
+ <?php
+ if ($_SESSION["user_type"] === 1)
+ echo '<a class="btn btn-info" href="cardsList.php">Edit cards</a>';
+ ?>
+ <a class="btn btn-primary" href="main.php?logout=1" style="float: right;">Logout</a>
+ </div><br>
+ <footer>
+ <span>Copyright © 2021, All Right Reserved Maks Jopek</span>
+ </footer>
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous"></script>
+</body>
+
+</html>
diff --git a/userEdit.php b/userEdit.php
new file mode 100644
index 0000000..2eca5ff
--- /dev/null
+++ b/userEdit.php
@@ -0,0 +1,149 @@
+<?php
+session_start();
+require_once "consts.php";
+checkLoggedIn();
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+$error = '';
+$type = $_SESSION["u_Type"];
+if (!in_array($type, ["Add", "Edit", "Remove"])) {
+ header("HTTP/1.0 400 Teapot not here :(");
+ header("Location: main.php");
+ exit();
+}
+
+if (!empty($_POST["name"]) || !empty($_POST["login"]) || !empty($_POST["email"]) || !empty($_POST["password"]) || !empty($_POST["repeatedPassword"])) {
+ $name = preg_replace('/\s+/', ' ', $_POST["name"]);
+ if (str_contains($name, ' ')) {
+ $firstname = explode(' ', $name)[0];
+ $lastname = explode(' ', $name)[1];
+ } else {
+ $firstname = $name;
+ $lastname = '';
+ }
+ $login = $_POST["login"];
+ $email = $_POST["email"];
+ $password = $_POST["password"];
+ $repeatedPassword = $_POST["repeatedPassword"];
+
+ if ($password !== $repeatedPassword) {
+ $error = "Password aren't the same";
+ } else {
+ require_once "dbCredentials.php";
+ $pdo = new PDO("mysql:dbname=$dbName;host=localhost;charset=utf8mb4", $dbUser, $dbPassword);
+ $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+
+ $stmt = $pdo->prepare("SELECT `login` FROM `cms_user` WHERE `login`=:login");
+ $stmt->execute(["login" => $login]);
+ if ($type === "Add" && count($stmt->fetchAll(PDO::FETCH_ASSOC)) !== 0) {
+ $error = "User with this login already exists!";
+ } else {
+
+ if ($type === "Add")
+ $sql = "INSERT INTO `cms_user`(`login`, `password`, `firstname`, `lastname`, `email`) VALUES (:login, :password, :firstname, :lastname, :email)";
+ elseif ($type === "Edit")
+ $sql = "UPDATE `cms_user` SET `login`= :login, `password`=:password, `firstname`=:firstname, `lastname`=:lastname, `email`=:email WHERE `id`=:id";
+
+ $stmt = $pdo->prepare($sql);
+
+ if ($type === "Add") {
+ $stmt->execute([
+ "firstname" => $firstname,
+ "lastname" => $lastname,
+ "login" => $login,
+ "email" => $email,
+ "password" => $password,
+ ]);
+ } elseif ($type === "Edit") {
+ $stmt->execute([
+ "firstname" => $firstname,
+ "lastname" => $lastname,
+ "login" => $login,
+ "email" => $email,
+ "password" => $password,
+ "id" => $_SESSION["u_Id"],
+ ]);
+ }
+ $_SESSION = array_filter($_SESSION, function ($key) {
+ return strpos($key, 'u_') !== 0;
+ }, ARRAY_FILTER_USE_KEY);
+ header("Location: users.php");
+ exit();
+ }
+ }
+}
+
+if ($type === "Remove") {
+ $id = $_SESSION["u_Id"];
+ require_once "dbCredentials.php";
+ $pdo = new PDO("mysql:dbname=$dbName;host=localhost;charset=utf8mb4", $dbUser, $dbPassword);
+ $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+ $stmt = $pdo->prepare("DELETE FROM `cms_user` WHERE `id` = :id");
+ $stmt->execute(["id" => $id]);
+ $_SESSION = array_filter($_SESSION, function ($key) {
+ return strpos($key, 'u_') !== 0;
+ }, ARRAY_FILTER_USE_KEY);
+ header("Location: users.php");
+ exit();
+}
+$name = $login = $email = $password = $repeatPassword = "";
+if ($type === "Edit") {
+ $name = $_SESSION["u_Firstname"] . ' ' . $_SESSION["u_Lastname"];
+ $login = $_SESSION["u_Login"];
+ $email = $_SESSION["u_Email"];
+ $password = $_SESSION["u_Password"];
+ $repeatedPassword = $_SESSION["u_Password"];
+ // unset($_SESSION["uFirstname"], $_SESSION["uLastname"], $_SESSION["uLogin"], $_SESSION["uEmail"], $_SESSION["uPassword"]);
+}
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
+
+ <title><?= $type ?> user</title>
+ <style>
+ input {
+ width: 100%;
+ }
+ </style>
+</head>
+
+<body class="bg-dark text-white">
+ <!-- style="margin-left: 25vw;"> -->
+ <div style="margin: 0 auto; width: 50%;">
+ <!-- class="container"> -->
+ <div style="margin: 5px auto; width: 50%;">
+ <h4><?= $type ?> user</h4>
+ <hr style="margin-left: -150%; margin-top: 0; width: 100vw;">
+ <form action="userEdit.php" method="post">
+ <label for="name">Name:</label><br>
+ <input type="text" name="name" id="name" value="<?= $name ?>" required><br>
+ <label for="login">Login:</label><br>
+ <input type="text" name="login" id="login" value="<?= $login ?>" required><br>
+ <label for="email">Email:</label><br>
+ <input type="email" name="email" id="email" value="<?= $email ?>" required><br>
+ <label for="password">Password:</label><br>
+ <input type="password" name="password" id="password" value="<?= $password ?>" required><br>
+ <label for="repeatedPassword">Repeat password:</label><br>
+ <input type="password" name="repeatedPassword" id="repeatedPassword" value="<?= $repeatedPassword ?>" required><br><br>
+ <?php
+ if ($type === "Add")
+ echo "<button type='submit' class='btn btn-warning' style='float: right;'>Dodaj</button>";
+ else
+ echo "<button type='submit' class='btn btn-info' style='float: right;'>Zapisz</button>";
+ ?>
+ </form><br><br>
+ <h3 style="float: left; color: red;"><?= $error ?></h3>
+ </div>
+ </div>
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/users.php b/users.php
new file mode 100644
index 0000000..e1b1e18
--- /dev/null
+++ b/users.php
@@ -0,0 +1,99 @@
+<?php
+session_start();
+
+require_once "dbCredentials.php";
+require_once "consts.php";
+error_reporting(E_ALL);
+ini_set('display_errors', 1);
+$pdo = new PDO("mysql:dbname=$dbName;host=$dbHost;charset=utf8mb4", $dbUser, $dbPassword);
+$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+$stmt = $pdo->prepare("SELECT * FROM `cms_user`");
+$stmt->execute();
+$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
+
+function strStartsWith(string $needle, string $haystack)
+{
+ return substr($haystack, 0, strlen($needle)) === $needle;
+}
+if (isset($_GET["userEditType"])) {
+ $type = explode('!', $_GET["userEditType"]);
+ $_SESSION["u_Type"] = $type[0];
+ if (strStartsWith("Edit", $_GET["userEditType"]) === true || strStartsWith("Remove", $_GET["userEditType"]) === true) {
+ $stmt = $pdo->prepare("SELECT * FROM `cms_user` WHERE `id`=:id");
+ $stmt->execute(["id" => $type[1]]);
+ $user = $stmt->fetchAll(PDO::FETCH_ASSOC)[0];
+ $_SESSION["u_Id"] = $user["id"];
+ $_SESSION["u_Firstname"] = $user["firstname"];
+ $_SESSION["u_Lastname"] = $user["lastname"];
+ $_SESSION["u_Login"] = $user["login"];
+ $_SESSION["u_Password"] = $user["password"];
+ $_SESSION["u_Email"] = $user["email"];
+ $_SESSION["u_user_type"] = $user["user_type"];
+ } elseif (strStartsWith("Add", $_GET["userEditType"]) === true) {
+ $_SESSION["u_Id"] = "";
+ $_SESSION["u_Firstname"] = "";
+ $_SESSION["u_Lastname"] = "";
+ $_SESSION["u_Login"] = "";
+ $_SESSION["u_Password"] = "";
+ $_SESSION["u_Email"] = "";
+ $_SESSION["u_user_type"] = "";
+ } elseif (strStartsWith("Remove", $_GET["userEditType"]) === true) {
+ $_SESSION["u_Id"] = $type[1];
+ }
+ header("Location: userEdit.php");
+ exit();
+}
+?>
+<!doctype html>
+<html lang="en">
+
+<head>
+ <!-- Required meta tags -->
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+ <!-- Bootstrap CSS -->
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-+0n0xVW2eSR5OomGNYDnhzAbDsOXxcvSN1TPprVMTNDbiYZCxYbOOl7+AMvyTG2x" crossorigin="anonymous">
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet">
+
+ <title>sCMS - Users</title>
+</head>
+
+<body class="bg-dark">
+ <div class="container">
+ <table class="table table-dark table-bordered text-center" style="border: 1px solid white;">
+ <thead>
+ <tr>
+ <th>Id</th>
+ <th>Name</th>
+ <th>Login</th>
+ <th>Account type</th>
+ <th>Edit</th>
+ </tr>
+ </thead>
+ <tbody>
+ <?php
+ foreach ($users as $user) {
+ $user["firstname"] = ucfirst($user["firstname"]);
+ $user["lastname"] = ucfirst($user["lastname"]);
+ echo "<tr>
+ <td>{$user["id"]}</td>
+ <td>{$user["firstname"]} {$user["lastname"]}</td>
+ <td>{$user["login"]}</td>
+ <td>{$UserType[$user["user_type"]]}</td>
+ <td>
+ <a class='btn btn-primary' href='users.php?userEditType=Edit!{$user["id"]}'>Edit <i class='fas fa-edit'></i></a>&nbsp;&nbsp;
+ <a class='btn btn-danger' href='users.php?userEditType=Remove!{$user["id"]}'>Remove <i class='fas fa-trash'></i></a>
+ </td>
+ </tr>";
+ }
+ ?>
+ </tbody>
+ </table>
+ <a class="btn btn-primary" style="float: left;" href="main.php">Go to main</a>
+ <a class="btn btn-success" style="float: right;" href="users.php?userEditType=Add">Add</a>
+ </div>
+ <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-gtEjrD/SeCtmISkJkNUaaKMoLD0//ElJ19smozuHV6z3Iehds+3Ulb9Bn9Plx0x4" crossorigin="anonymous"></script>
+</body>
+
+</html> \ No newline at end of file