diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f94c71d --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +.gitignore +node_modules +vendor +docker-compose.override.yml +source/uploads +mysql_data diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0a773c3 --- /dev/null +++ b/.env.example @@ -0,0 +1,15 @@ +APP_NAME=Zeszyt 2.0 +DB_PREFIX=xyz_ + +MYSQL_DATABASE=zeszyt +MYSQL_USER=zeszyt +MYSQL_PASSWORD=zeszyt +MYSQL_ROOT_PASSWORD=root + +MICROSOFT_OAUTH_ENABLED=false +MICROSOFT_OAUTH_TENANT=common +MICROSOFT_OAUTH_CLIENT_ID= +MICROSOFT_OAUTH_CLIENT_SECRET= +MICROSOFT_OAUTH_REDIRECT_URI=http://localhost:8080/oauth_callback.php +MICROSOFT_OAUTH_ALLOWED_TENANT= +MICROSOFT_OAUTH_AUTO_PROVISION=false diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..2b612e2 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,24 @@ +FROM php:8.2-apache + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + libzip-dev \ + libpng-dev \ + libjpeg62-turbo-dev \ + libfreetype6-dev \ + libonig-dev \ + unzip \ + curl \ + && docker-php-ext-configure gd --with-freetype --with-jpeg \ + && docker-php-ext-install -j"$(nproc)" pdo_mysql mysqli mbstring gd zip \ + && a2enmod rewrite headers \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /var/www/html + +COPY source/ /var/www/html/ + +RUN mkdir -p /var/www/html/uploads \ + && chown -R www-data:www-data /var/www/html + +EXPOSE 80 diff --git a/db/zeszyt.sql b/db/zeszyt.sql index fb392a2..8b759ff 100644 --- a/db/zeszyt.sql +++ b/db/zeszyt.sql @@ -79,8 +79,14 @@ CREATE TABLE `xyz_settings` ( CREATE TABLE `xyz_users` ( `id` int NOT NULL, `username` varchar(50) NOT NULL, + `email` varchar(255) DEFAULT NULL, + `display_name` varchar(255) DEFAULT NULL, `password` varchar(255) NOT NULL, - `role` enum('admin','user') DEFAULT 'user' + `role` enum('admin','user') DEFAULT 'user', + `oauth_provider` varchar(50) DEFAULT NULL, + `oauth_subject` varchar(191) DEFAULT NULL, + `oauth_tenant_id` varchar(64) DEFAULT NULL, + `last_login_at` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; -- -------------------------------------------------------- @@ -106,7 +112,9 @@ ALTER TABLE `xyz_settings` ALTER TABLE `xyz_users` ADD PRIMARY KEY (`id`), - ADD UNIQUE KEY `username` (`username`); + ADD UNIQUE KEY `username` (`username`), + ADD UNIQUE KEY `uniq_users_email` (`email`), + ADD KEY `idx_users_oauth_identity` (`oauth_provider`,`oauth_subject`,`oauth_tenant_id`); -- -- AUTO_INCREMENT dla zrzuconych tabel diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6fce2f1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +services: + app: + build: + context: . + dockerfile: Dockerfile + container_name: zeszyt_app + depends_on: + db: + condition: service_healthy + ports: + - "8080:80" + environment: + APP_NAME: "${APP_NAME:-Zeszyt 2.0}" + DB_HOST: db + DB_NAME: "${MYSQL_DATABASE:-zeszyt}" + DB_USER: "${MYSQL_USER:-zeszyt}" + DB_PASS: "${MYSQL_PASSWORD:-zeszyt}" + DB_PREFIX: "${DB_PREFIX:-xyz_}" + MICROSOFT_OAUTH_ENABLED: "${MICROSOFT_OAUTH_ENABLED:-false}" + MICROSOFT_OAUTH_TENANT: "${MICROSOFT_OAUTH_TENANT:-common}" + MICROSOFT_OAUTH_CLIENT_ID: "${MICROSOFT_OAUTH_CLIENT_ID:-}" + MICROSOFT_OAUTH_CLIENT_SECRET: "${MICROSOFT_OAUTH_CLIENT_SECRET:-}" + MICROSOFT_OAUTH_REDIRECT_URI: "${MICROSOFT_OAUTH_REDIRECT_URI:-http://localhost:8080/oauth_callback.php}" + MICROSOFT_OAUTH_ALLOWED_TENANT: "${MICROSOFT_OAUTH_ALLOWED_TENANT:-}" + MICROSOFT_OAUTH_AUTO_PROVISION: "${MICROSOFT_OAUTH_AUTO_PROVISION:-false}" + volumes: + - ./source:/var/www/html + - uploads_data:/var/www/html/uploads + restart: unless-stopped + + db: + image: mysql:8.0 + container_name: zeszyt_db + command: --default-authentication-plugin=mysql_native_password + environment: + MYSQL_DATABASE: "${MYSQL_DATABASE:-zeszyt}" + MYSQL_USER: "${MYSQL_USER:-zeszyt}" + MYSQL_PASSWORD: "${MYSQL_PASSWORD:-zeszyt}" + MYSQL_ROOT_PASSWORD: "${MYSQL_ROOT_PASSWORD:-root}" + ports: + - "3307:3306" + volumes: + - mysql_data:/var/lib/mysql + - ./db/zeszyt.sql:/docker-entrypoint-initdb.d/01-init.sql:ro + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-u${MYSQL_USER:-zeszyt}", "-p${MYSQL_PASSWORD:-zeszyt}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 20s + restart: unless-stopped + +volumes: + mysql_data: + uploads_data: diff --git a/source/add_order.php b/source/add_order.php index 2cab010..513f17e 100644 --- a/source/add_order.php +++ b/source/add_order.php @@ -5,18 +5,20 @@ checkAuth(); $message = ''; -if ($_SERVER["REQUEST_METHOD"] == "POST") { - $product_name = trim($_POST['product_name']); - $quantity = (int)$_POST['quantity']; - $purchase_place = trim($_POST['purchase_place']); - $price = (float)str_replace(',', '.', $_POST['price_per_unit']); - $delivery_date = $_POST['delivery_date']; - $notes = trim($_POST['notes']); - $recipient = trim($_POST['recipient']); - $delivery_address = trim($_POST['delivery_address']); - $company = trim($_POST['company'] ?? ''); // NOWE POLE +if ($_SERVER["REQUEST_METHOD"] === "POST") { + requireCsrfToken(); - if (!empty($product_name) && $quantity > 0) { + $product_name = trim($_POST['product_name'] ?? ''); + $quantity = (int)($_POST['quantity'] ?? 0); + $purchase_place = trim($_POST['purchase_place'] ?? ''); + $price = (float)str_replace(',', '.', $_POST['price_per_unit'] ?? '0'); + $delivery_date = $_POST['delivery_date'] ?? ''; + $notes = trim($_POST['notes'] ?? ''); + $recipient = trim($_POST['recipient'] ?? ''); + $delivery_address = trim($_POST['delivery_address'] ?? ''); + $company = trim($_POST['company'] ?? ''); + + if ($product_name !== '' && $quantity > 0) { try { $pdo->beginTransaction(); @@ -33,11 +35,11 @@ if ($_SERVER["REQUEST_METHOD"] == "POST") { $hist_stmt->execute([$order_id, $_SESSION['user_id'], 'Utworzono nowe zamówienie.']); $pdo->commit(); - - $message = "