first commit
18
.gitignore
vendored
Executable file
@@ -0,0 +1,18 @@
|
||||
# 💥 Build-Ordner (von CodeKit generiert, wird nicht versioniert)
|
||||
build/
|
||||
|
||||
# 🧱 Node-Abhängigkeiten (lokale Entwicklung, niemals ins Repo)
|
||||
node_modules/
|
||||
package-lock.json
|
||||
|
||||
# ⚙️ CodeKit-Konfigurationsdatei
|
||||
config.codekit3
|
||||
|
||||
# ⚙️ Nova-Konfigurationsdatei
|
||||
.nova/
|
||||
|
||||
# 🖥 macOS-spezifisch
|
||||
.DS_Store
|
||||
|
||||
# 📦 Projekt-spezifisch (optional, falls du z. B. Logs oder temporäre Dateien hast)
|
||||
*.log
|
||||
19
README.md
Normal file
@@ -0,0 +1,19 @@
|
||||
# urbanis
|
||||
### Setup
|
||||
|
||||
Das ist *nur* der **source** Ordner. [CodeKit App](https://codekitapp.com) als Build-tool/Processor.
|
||||
|
||||
|
||||
### Template/Design
|
||||
Standard Bootstrap
|
||||
|
||||
### Libraries
|
||||
- [Composer](https://getcomposer.org) autoload liegt im Verzeichnis `domains` auf dem Webspace. Relativ heißt das: `require '../../vendor/autoload.php'`
|
||||
- [Bootstrap](https://github.com/twbs)
|
||||
- [loginScript](https://github.com/PHP-Einfach/loginscript) Inspiration
|
||||
- [PHP Mailer](https://github.com/PHPMailer/PHPMailer/) (siehe [meldung.php](source/meldung.php) zur Konfiguration.
|
||||
- [fontawesome icons](https://fontawesome.com/how-to-use/on-the-web/using-with/sass) (neue/weitere Icons in der Datei [_icons-selected.scss](source/assets/sass/_icons-selected.scss) hinzufügen, die webfonts werden über npm direkt in den `build/assets/webfonts` Ordner geladen)
|
||||
|
||||
|
||||
### Todos
|
||||
- Upload auf bilder beschränken
|
||||
16
package.json
Executable file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"description": "CodeKit created this starter package.json file. You should customize it appropriately.",
|
||||
"devDependencies": {},
|
||||
"license": "UNLICENSED",
|
||||
"author": "",
|
||||
"version": "1.0.0",
|
||||
"name": "codekit-project",
|
||||
"dependencies": {
|
||||
"@fortawesome/fontawesome-free": "^6.2.1",
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"bootstrap": "^5.2.3"
|
||||
},
|
||||
"repository": {},
|
||||
"scripts": {},
|
||||
"optionalDependencies": {}
|
||||
}
|
||||
140
source/.htaccess
Executable file
@@ -0,0 +1,140 @@
|
||||
# Fonts
|
||||
# Add correct content-type for fonts
|
||||
AddType application/vnd.ms-fontobject .eot
|
||||
AddType application/x-font-ttf .ttf
|
||||
AddType application/x-font-opentype .otf
|
||||
AddType application/x-font-woff .woff
|
||||
AddType application/font-woff2 .woff2
|
||||
AddType image/svg+xml .svg
|
||||
|
||||
|
||||
|
||||
# Serve resources with far-future expires headers.
|
||||
#
|
||||
# (!) If you don't control versioning with filename-based
|
||||
# cache busting, you should consider lowering the cache times
|
||||
# to something like one week.
|
||||
#
|
||||
# https://httpd.apache.org/docs/current/mod/mod_expires.html
|
||||
#<IfModule mod_expires.c>
|
||||
# ExpiresActive On
|
||||
#
|
||||
# # Images
|
||||
# ExpiresByType image/jpeg "access plus 1 year"
|
||||
# ExpiresByType image/gif "access plus 1 year"
|
||||
# ExpiresByType image/png "access plus 1 year"
|
||||
# ExpiresByType image/webp "access plus 1 year"
|
||||
# ExpiresByType image/svg+xml "access plus 1 year"
|
||||
# ExpiresByType image/x-icon "access plus 1 year"
|
||||
#
|
||||
# # Video
|
||||
# ExpiresByType video/webm "access plus 1 year"
|
||||
# ExpiresByType video/mp4 "access plus 1 year"
|
||||
# ExpiresByType video/mpeg "access plus 1 year"
|
||||
#
|
||||
# # Fonts
|
||||
# ExpiresByType font/ttf "access plus 1 year"
|
||||
# ExpiresByType font/otf "access plus 1 year"
|
||||
# ExpiresByType font/woff "access plus 1 year"
|
||||
# ExpiresByType font/woff2 "access plus 1 year"
|
||||
# ExpiresByType application/font-woff "access plus 1 year"
|
||||
#
|
||||
# # CSS, JavaScript
|
||||
# ExpiresByType text/css "access plus 1 month"
|
||||
# ExpiresByType text/javascript "access plus 1 month"
|
||||
# ExpiresByType application/javascript "access plus 1 month"
|
||||
#
|
||||
# # Others
|
||||
# ExpiresByType application/pdf "access plus 1 month"
|
||||
# ExpiresByType image/vnd.microsoft.icon "access plus 1 year"
|
||||
#</IfModule>
|
||||
|
||||
<IfModule mod_deflate.c>
|
||||
# Insert filters / compress text, html, javascript, css, xml:
|
||||
AddOutputFilterByType DEFLATE text/plain
|
||||
AddOutputFilterByType DEFLATE text/html
|
||||
AddOutputFilterByType DEFLATE text/xml
|
||||
AddOutputFilterByType DEFLATE text/css
|
||||
AddOutputFilterByType DEFLATE text/vtt
|
||||
AddOutputFilterByType DEFLATE text/x-component
|
||||
AddOutputFilterByType DEFLATE application/xml
|
||||
AddOutputFilterByType DEFLATE application/xhtml+xml
|
||||
AddOutputFilterByType DEFLATE application/rss+xml
|
||||
AddOutputFilterByType DEFLATE application/js
|
||||
AddOutputFilterByType DEFLATE application/javascript
|
||||
AddOutputFilterByType DEFLATE application/x-javascript
|
||||
AddOutputFilterByType DEFLATE application/x-httpd-php
|
||||
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
|
||||
AddOutputFilterByType DEFLATE application/atom+xml
|
||||
AddOutputFilterByType DEFLATE application/json
|
||||
AddOutputFilterByType DEFLATE application/ld+json
|
||||
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
|
||||
AddOutputFilterByType DEFLATE application/x-font-ttf
|
||||
AddOutputFilterByType DEFLATE application/x-web-app-manifest+json
|
||||
AddOutputFilterByType DEFLATE font/opentype
|
||||
AddOutputFilterByType DEFLATE image/svg+xml
|
||||
AddOutputFilterByType DEFLATE image/x-icon
|
||||
# Exception: Images
|
||||
SetEnvIfNoCase REQUEST_URI \.(?:gif|jpg|jpeg|png|svg)$ no-gzip dont-vary
|
||||
# Drop problematic browsers
|
||||
BrowserMatch ^Mozilla/4 gzip-only-text/html
|
||||
BrowserMatch ^Mozilla/4\.0[678] no-gzip
|
||||
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
|
||||
# Make sure proxies don't deliver the wrong content
|
||||
Header append Vary User-Agent env=!dont-vary
|
||||
</IfModule>
|
||||
#Alternative caching using Apache's "mod_headers", if it's installed.
|
||||
#Caching of common files - ENABLED
|
||||
<IfModule mod_headers.c>
|
||||
<FilesMatch "\.(ico|pdf|flv|swf|js|css|gif|png|jpg|jpeg|woff|woff2|webp|webm|pdf|otf|ttf|mp4|mpeg|svg|txt)$">
|
||||
Header set Cache-Control "max-age=31536000, public"
|
||||
</FilesMatch>
|
||||
</IfModule>
|
||||
<IfModule mod_headers.c>
|
||||
<FilesMatch "\.(js|css|xml|gz)$">
|
||||
Header append Vary Accept-Encoding
|
||||
</FilesMatch>
|
||||
</IfModule>
|
||||
# Set Keep Alive Header
|
||||
<IfModule mod_headers.c>
|
||||
Header set Connection keep-alive
|
||||
</IfModule>
|
||||
|
||||
#http security headers
|
||||
<IfModule mod_headers.c>
|
||||
Header set X-Frame-Options "sameorigin"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_headers.c>
|
||||
Header set X-XSS-Protection "1; mode=block"
|
||||
</IfModule>
|
||||
|
||||
<IfModule mod_headers.c>
|
||||
Header set X-Content-Type-Options "nosniff"
|
||||
</IfModule>
|
||||
|
||||
#<IfModule mod_headers.c>
|
||||
# Header set Content-Security-Policy: "default-src 'self'; object-src 'none'; script-src 'self' ; style-src 'self'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests;"
|
||||
# Header set X-Content-Security-Policy: "default-src 'self'; object-src 'none'; script-src 'self' ; style-src 'self'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests;"
|
||||
# Header set X-WebKit-CSP: "default-src 'self'; object-src 'none'; script-src 'self'; style-src 'self'; frame-ancestors 'none'; base-uri 'self'; upgrade-insecure-requests;"
|
||||
# Header set Feature-Policy: "sync-xhr 'none'; geolocation 'none' ; midi 'none'; microphone 'none'; camera 'none'; magnetometer 'none'; gyroscope 'none'; fullscreen 'self'; payment 'none'"
|
||||
# Header set Referrer-Policy "strict-origin-when-cross-origin"
|
||||
#</IfModule>
|
||||
|
||||
# Options +MultiViews
|
||||
# RewriteEngine On
|
||||
#
|
||||
# RewriteBase /
|
||||
# # remove .php
|
||||
# RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
|
||||
# RewriteRule ^ /%1 [NC,L,R]
|
||||
#
|
||||
# RewriteCond %{REQUEST_FILENAME}.php -f
|
||||
# RewriteRule ^ %{REQUEST_URI}.php [NC,L]
|
||||
|
||||
# #remove .html
|
||||
# RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
|
||||
# RewriteRule ^ /%1 [NC,L,R]
|
||||
#
|
||||
# RewriteCond %{REQUEST_FILENAME}.html -f
|
||||
# RewriteRule ^ %{REQUEST_URI}.html [NC,L]
|
||||
BIN
source/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
source/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
source/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
57
source/assets/js/utils.js
Normal file
@@ -0,0 +1,57 @@
|
||||
function yesnoCheck() {
|
||||
if (document.getElementById('muell-tech-maengel').checked) {
|
||||
document.getElementById('ifYes').style.display = 'block';
|
||||
document.getElementById("muell-tech-maengel-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes').style.display = 'none';
|
||||
|
||||
if (document.getElementById('muell-sonstiges').checked) {
|
||||
document.getElementById('ifYes2').style.display = 'block';
|
||||
document.getElementById("muell-sonstiges-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes2').style.display = 'none';
|
||||
|
||||
if (document.getElementById('wc-tech-maengel').checked) {
|
||||
document.getElementById('ifYes3').style.display = 'block';
|
||||
document.getElementById("wc-tech-maengel-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes3').style.display = 'none';
|
||||
|
||||
if (document.getElementById('wc-sonstiges').checked) {
|
||||
document.getElementById('ifYes4').style.display = 'block';
|
||||
document.getElementById("wc-sonstiges-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes4').style.display = 'none';
|
||||
|
||||
if (document.getElementById('miete-sonstiges').checked) {
|
||||
document.getElementById('ifYes5').style.display = 'block';
|
||||
document.getElementById("miete-sonstiges-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes5').style.display = 'none';
|
||||
|
||||
if (document.getElementById('automaten-sonstiges').checked) {
|
||||
document.getElementById('ifYes6').style.display = 'block';
|
||||
document.getElementById("automaten-sonstiges-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes6').style.display = 'none';
|
||||
|
||||
if (document.getElementById('werbeflaechen-sonstiges').checked) {
|
||||
document.getElementById('ifYes7').style.display = 'block';
|
||||
document.getElementById("werbeflaechen-sonstiges-text").required = true;
|
||||
}
|
||||
else document.getElementById('ifYes7').style.display = 'none';
|
||||
}
|
||||
|
||||
// function OnFileValidation() {
|
||||
// var image = document.getElementById("file");
|
||||
// if (typeof (file.files) != "undefined") {
|
||||
// var size = parseFloat(file.files[0].size / (1024 * 1024)).toFixed(2);
|
||||
// if(size > 5) {
|
||||
// alert('Please select image size less than 5 MB');
|
||||
// }else{
|
||||
// alert('success');
|
||||
// }
|
||||
// } else {
|
||||
// alert("This browser does not support HTML5.");
|
||||
// }
|
||||
// }
|
||||
15
source/assets/scss/_fontawesome-selected.scss
Executable file
@@ -0,0 +1,15 @@
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/functions';
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/variables';
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/mixins';
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/core';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/larger';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/fixed-width';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/list';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/bordered-pulled';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/animated';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/rotated-flipped';
|
||||
// @import '../../../node_modules/@fortawesome/fontawesome-free/scss/stacked';
|
||||
@import 'icons-selected'; //Anpassung für Auswahl der Icons
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/screen-reader';
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/solid.scss';
|
||||
@import '../../../node_modules/@fortawesome/fontawesome-free/scss/brands.scss';
|
||||
19
source/assets/scss/_icons-selected.scss
Executable file
@@ -0,0 +1,19 @@
|
||||
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
|
||||
readers do not read off random characters that represent icons */
|
||||
|
||||
.#{$fa-css-prefix}-angle-down:before { content: fa-content($fa-var-angle-down); }
|
||||
.#{$fa-css-prefix}-apple:before { content: fa-content($fa-var-apple); }
|
||||
.#{$fa-css-prefix}-building:before { content: fa-content($fa-var-building); }
|
||||
.#{$fa-css-prefix}-code:before { content: fa-content($fa-var-code); }
|
||||
.#{$fa-css-prefix}-envelope:before { content: fa-content($fa-var-envelope); }
|
||||
.#{$fa-css-prefix}-linkedin:before { content: fa-content($fa-var-linkedin); }
|
||||
.#{$fa-css-prefix}-paper-plane:before { content: fa-content($fa-var-paper-plane); }
|
||||
.#{$fa-css-prefix}-phone:before { content: fa-content($fa-var-phone); }
|
||||
.#{$fa-css-prefix}-server:before { content: fa-content($fa-var-server); }
|
||||
.#{$fa-css-prefix}-unsplash:before { content: fa-content($fa-var-unsplash); }
|
||||
.#{$fa-css-prefix}-user-md:before { content: fa-content($fa-var-user-md); }
|
||||
.#{$fa-css-prefix}-windows:before { content: fa-content($fa-var-windows); }
|
||||
.#{$fa-css-prefix}-xing:before { content: fa-content($fa-var-xing); }
|
||||
.#{$fa-css-prefix}-heart:before { content: fa-content($fa-var-heart); }
|
||||
.#{$fa-css-prefix}-google-play:before { content: fa-content($fa-var-google-play); }
|
||||
.#{$fa-css-prefix}-app-store:before { content: fa-content($fa-var-app-store); }
|
||||
62
source/assets/scss/bootstrap.scss
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
/*!
|
||||
* Bootstrap v5.1.1 (https://getbootstrap.com/)
|
||||
* Copyright 2011-2021 The Bootstrap Authors
|
||||
* Copyright 2011-2021 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
@use "sass:math";
|
||||
|
||||
// scss-docs-start import-stack
|
||||
// Configuration
|
||||
@import "../../../node_modules/bootstrap/scss/functions";
|
||||
@import "../../../node_modules/bootstrap/scss/variables";
|
||||
@import "../../../node_modules/bootstrap/scss/variables-dark";
|
||||
@import "../../../node_modules/bootstrap/scss/mixins";
|
||||
@import "../../../node_modules/bootstrap/scss/maps";
|
||||
@import "../../../node_modules/bootstrap/scss/utilities";
|
||||
|
||||
|
||||
// Layout & components
|
||||
@import "../../../node_modules/bootstrap/scss/root";
|
||||
@import "../../../node_modules/bootstrap/scss/reboot";
|
||||
@import "../../../node_modules/bootstrap/scss/type";
|
||||
@import "../../../node_modules/bootstrap/scss/images";
|
||||
@import "../../../node_modules/bootstrap/scss/containers";
|
||||
@import "../../../node_modules/bootstrap/scss/grid";
|
||||
//@import "../../../node_modules/bootstrap/scss/tables";
|
||||
@import "../../../node_modules/bootstrap/scss/forms";
|
||||
@import "../../../node_modules/bootstrap/scss/buttons";
|
||||
@import "../../../node_modules/bootstrap/scss/transitions";
|
||||
//@import "../../../node_modules/bootstrap/scss/dropdown";
|
||||
@import "../../../node_modules/bootstrap/scss/button-group";
|
||||
@import "../../../node_modules/bootstrap/scss/nav";
|
||||
@import "../../../node_modules/bootstrap/scss/navbar";
|
||||
//@import "../../../node_modules/bootstrap/scss/card";
|
||||
// @import "../../../node_modules/bootstrap/scss/accordion";
|
||||
// @import "../../../node_modules/bootstrap/scss/breadcrumb";
|
||||
// @import "../../../node_modules/bootstrap/scss/pagination";
|
||||
//@import "../../../node_modules/bootstrap/scss/badge";
|
||||
@import "../../../node_modules/bootstrap/scss/alert";
|
||||
//@import "../../../node_modules/bootstrap/scss/progress";
|
||||
@import "../../../node_modules/bootstrap/scss/list-group";
|
||||
@import "../../../node_modules/bootstrap/scss/close";
|
||||
//@import "../../../node_modules/bootstrap/scss/toasts";
|
||||
//@import "../../../node_modules/bootstrap/scss/modal";
|
||||
// @import "../../../node_modules/bootstrap/scss/tooltip";
|
||||
// @import "../../../node_modules/bootstrap/scss/popover";
|
||||
// @import "../../../node_modules/bootstrap/scss/carousel";
|
||||
// @import "../../../node_modules/bootstrap/scss/spinners";
|
||||
//@import "../../../node_modules/bootstrap/scss/offcanvas";
|
||||
// @import "../../../node_modules/bootstrap/scss/placeholders";
|
||||
|
||||
|
||||
// Helpers
|
||||
@import "../../../node_modules/bootstrap/scss/helpers";
|
||||
|
||||
// Utilities
|
||||
@import "../../../node_modules/bootstrap/scss/utilities/api";
|
||||
// scss-docs-end import-stack
|
||||
|
||||
//Fontawesome
|
||||
|
||||
@import "_fontawesome-selected.scss";
|
||||
9
source/browserconfig.xml
Normal file
@@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square150x150logo src="/mstile-150x150.png"/>
|
||||
<TileColor>#ffe500</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
||||
195
source/datenschutz.php
Executable file
@@ -0,0 +1,195 @@
|
||||
<?php
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
//Überprüfe, dass der User eingeloggt ist
|
||||
//Der Aufruf von check_user() muss in alle internen Seiten eingebaut sein
|
||||
//$user = check_user();
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
<h2>Datenschutzerklärung</h2>
|
||||
<p>Wir informieren Sie nachfolgend gemäß den gesetzlichen Vorgaben des Datenschutzrechts (insb. gemäß BDSG n.F. und der europäischen Datenschutz-Grundverordnung ‚DS-GVO‘) über die Art, den Umfang und Zweck der Verarbeitung personenbezogener Daten durch unser Unternehmen. Diese Datenschutzerklärung gilt auch für unsere Websites und Sozial-Media-Profile. Bezüglich der Definition von Begriffen wie etwa „personenbezogene Daten“ oder „Verarbeitung“ verweisen wir auf Art. 4 DS-GVO.</p>
|
||||
<strong>Name und Kontaktdaten des / der Verantwortlichen</strong><br />
|
||||
Unser/e Verantwortliche/r (nachfolgend „Verantwortlicher“) i.S.d. Art. 4 Zif. 7 DS-GVO ist:<br />
|
||||
<br />
|
||||
IT-Beratung Patrick Davidt<br />Jägerallee 15<br />14469 Potsdam<br />E-Mail-Adresse: info@davidt.de<br /><br />
|
||||
|
||||
|
||||
<strong>Datenarten, Zwecke der Verarbeitung und Kategorien betroffener Personen</strong><br />
|
||||
<p>Nachfolgend informieren wir Sie über Art, Umfang und Zweck der Erhebung, Verarbeitung und Nutzung personenbezogener Daten.</p>
|
||||
<strong>1. Arten der Daten, die wir verarbeiten</strong><br />
|
||||
Nutzungsdaten (Zugriffszeiten, besuchte Websites etc.), Bestandsdaten (Name, Adresse etc.), Kommunikationsdaten (IP-Adresse etc.), <br />
|
||||
<br />
|
||||
<strong>2. Zwecke der Verarbeitung nach Art. 13 Abs. 1 c) DS-GVO</strong><br />
|
||||
Website technisch und wirtschaftlich optimieren, Erfüllung vertraglicher Verpflichtungen, Websites mit Funktionen und Inhalten bereitstellen, Maßnahmen der Sicherheit, <br />
|
||||
<br />
|
||||
<strong>3. Kategorien der betroffenen Personen nach Art. 13 Abs. 1 e) DS-GVO</strong><br />
|
||||
Besucher/Nutzer der Website, Interessenten, <br />
|
||||
<br />
|
||||
<p>Die betroffenen Personen werden zusammenfassend als „Nutzer“ bezeichnet.</p>
|
||||
<br />
|
||||
|
||||
<strong>Rechtsgrundlagen der Verarbeitung personenbezogener Daten</strong>
|
||||
<p>Nachfolgend Informieren wir Sie über die Rechtsgrundlagen der Verarbeitung personenbezogener Daten:</p>
|
||||
<ol style="margin:10px 0px; padding:15px;">
|
||||
<li>Wenn wir Ihre Einwilligung für die Verarbeitung personenbezogenen Daten eingeholt haben, ist Art. 6 Abs. 1 S. 1 lit. a) DS-GVO Rechtsgrundlage.</li>
|
||||
<li>Ist die Verarbeitung zur Erfüllung eines Vertrags oder zur Durchführung vorvertraglicher Maßnahmen erforderlich, die auf Ihre Anfrage hin erfolgen, so ist Art. 6 Abs. 1 S. 1 lit. b) DS-GVO Rechtsgrundlage.</li>
|
||||
<li>Ist die Verarbeitung zur Erfüllung einer rechtlichen Verpflichtung erforderlich, der wir unterliegen (z.B. gesetzliche Aufbewahrungspflichten), so ist Art. 6 Abs. 1 S. 1 lit. c) DS-GVO Rechtsgrundlage.</li>
|
||||
<li>Ist die Verarbeitung erforderlich, um lebenswichtige Interessen der betroffenen Person oder einer anderen natürlichen Person zu schützen, so ist Art. 6 Abs. 1 S. 1 lit. d) DS-GVO Rechtsgrundlage.</li>
|
||||
<li>Ist die Verarbeitung zur Wahrung unserer oder der berechtigten Interessen eines Dritten erforderlich und überwiegen diesbezüglich Ihre Interessen oder Grundrechte und Grundfreiheiten nicht, so ist Art. 6 Abs. 1 S. 1 lit. f) DS-GVO Rechtsgrundlage.</li>
|
||||
</ol>
|
||||
<br />
|
||||
<strong>Weitergabe personenbezogener Daten an Dritte und Auftragsverarbeiter</strong>
|
||||
<p>Ohne Ihre Einwilligung geben wir grundsätzlich keine Daten an Dritte weiter. Sollte dies doch der Fall sein, dann erfolgt die Weitergabe auf der Grundlage der zuvor genannten Rechtsgrundlagen z.B. bei der Weitergabe von Daten an Online-Paymentanbieter zur Vertragserfüllung oder aufgrund gerichtlicher Anordnung oder wegen einer gesetzlichen Verpflichtung zur Herausgabe der Daten zum Zwecke der Strafverfolgung, zur Gefahrenabwehr oder zur Durchsetzung der Rechte am geistigen Eigentum.<br />
|
||||
Wir setzen zudem Auftragsverarbeiter (externe Dienstleister z.B. zum Webhosting unserer Websites und Datenbanken) zur Verarbeitung Ihrer Daten ein. Wenn im Rahmen einer Vereinbarung zur Auftragsverarbeitung an die Auftragsverarbeiter Daten weitergegeben werden, erfolgt dies immer nach Art. 28 DS-GVO. Wir wählen dabei unsere Auftragsverarbeiter sorgfältig aus, kontrollieren diese regelmäßig und haben uns ein Weisungsrecht hinsichtlich der Daten einräumen lassen. Zudem müssen die Auftragsverarbeiter geeignete technische und organisatorische Maßnahmen getroffen haben und die Datenschutzvorschriften gem. BDSG n.F. und DS-GVO einhalten</p>
|
||||
|
||||
<br />
|
||||
<strong>Datenübermittlung in Drittstaaten</strong>
|
||||
<p>Durch die Verabschiedung der europäischen Datenschutz-Grundverordnung (DS-GVO) wurde eine einheitliche Grundlage für den Datenschutz in Europa geschaffen. Ihre Daten werden daher vorwiegend durch Unternehmen verarbeitet, für die DS-GVO Anwendung findet. Sollte doch die Verarbeitung durch Dienste Dritter außerhalb der Europäischen Union oder des Europäischen Wirtschaftsraums stattfinden, so müssen diese die besonderen Voraussetzungen der Art. 44 ff. DS-GVO erfüllen. Das bedeutet, die Verarbeitung erfolgt aufgrund besonderer Garantien, wie etwa die von der EU-Kommission offiziell anerkannte Feststellung eines der EU entsprechenden Datenschutzniveaus oder der Beachtung offiziell anerkannter spezieller vertraglicher Verpflichtungen, der so genannten „Standardvertragsklauseln“. <br />Soweit wir aufgrund der Unwirksamkeit des sog. „Privacy Shields“, nach Art. 49 Abs. 1 S. 1 lit. a) DSGVO die ausdrückliche Einwilligung in die Datenübermittlung in die USA von Ihnen einholen, weisen wird diesbezüglich auf das Risiko eines geheimen Zugriffs durch US-Behörden und die Nutzung der Daten zu Überwachungszwecken, ggf. ohne Rechtsbehelfsmöglichkeiten für EU-Bürger, hin.</p>
|
||||
|
||||
<br />
|
||||
<strong>Löschung von Daten und Speicherdauer</strong>
|
||||
<p>Sofern nicht in dieser Datenschutzerklärung ausdrücklich angegeben, werden Ihre personenbezogen Daten gelöscht oder gesperrt, sobald die zur Verarbeitung erteilte Einwilligung von Ihnen widerrufen wird oder der Zweck für die Speicherung entfällt bzw. die Daten für den Zweck nicht mehr erforderlich sind, es sei denn deren weitere Aufbewahrung ist zu Beweiszwecken erforderlich oder dem stehen gesetzliche Aufbewahrungspflichten entgegenstehen. Darunter fallen etwa handelsrechtliche Aufbewahrungspflichten von Geschäftsbriefen nach § 257 Abs. 1 HGB (6 Jahre) sowie steuerrechtliche Aufbewahrungspflichten nach § 147 Abs. 1 AO von Belegen (10 Jahre). Wenn die vorgeschriebene Aufbewahrungsfrist abläuft, erfolgt eine Sperrung oder Löschung Ihrer Daten, es sei denn die Speicherung ist weiterhin für einen Vertragsabschluss oder zur Vertragserfüllung erforderlich.</p>
|
||||
|
||||
<br/>
|
||||
<strong>Bestehen einer automatisierten Entscheidungsfindung</strong>
|
||||
<p>Wir setzen keine automatische Entscheidungsfindung oder ein Profiling ein.</p>
|
||||
|
||||
<br/>
|
||||
<strong>Bereitstellung unserer Website und Erstellung von Logfiles</strong>
|
||||
<ol style="margin:10px 0px; padding:15px;">
|
||||
<li>Wenn Sie unsere Webseite lediglich informatorisch nutzen (also keine Registrierung und auch keine anderweitige Übermittlung von Informationen), erheben wir nur die personenbezogenen Daten, die Ihr Browser an unseren Server übermittelt. Wenn Sie unsere Website betrachten möchten, erheben wir die folgenden Daten:<br />
|
||||
• IP-Adresse;<br />
|
||||
• Internet-Service-Provider des Nutzers;<br />
|
||||
• Datum und Uhrzeit des Abrufs;<br />
|
||||
• Browsertyp;<br />
|
||||
• Sprache und Browser-Version;<br />
|
||||
• Inhalt des Abrufs;<br />
|
||||
• Zeitzone;<br />
|
||||
• Zugriffsstatus/HTTP-Statuscode;<br />
|
||||
• Datenmenge;<br />
|
||||
• Websites, von denen die Anforderung kommt;<br />
|
||||
• Betriebssystem.<br />
|
||||
Eine Speicherung dieser Daten zusammen mit anderen personenbezogenen Daten von Ihnen findet nicht statt.<br /><br />
|
||||
</li>
|
||||
<li>Diese Daten dienen dem Zweck der nutzerfreundlichen, funktionsfähigen und sicheren Auslieferung unserer Website an Sie mit Funktionen und Inhalten sowie deren Optimierung und statistischen Auswertung.<br /><br /></li>
|
||||
<li>Rechtsgrundlage hierfür ist unser in den obigen Zwecken auch liegendes berechtigtes Interesse an der Datenverarbeitung nach Art. 6 Abs. 1 S.1 lit. f) DS-GVO.<br /><br /></li>
|
||||
<li>Wir speichern aus Sicherheitsgründen diese Daten in Server-Logfiles für die Speicherdauer von 30 Tagen. Nach Ablauf dieser Frist werden diese automatisch gelöscht, es sei denn wir benötigen deren Aufbewahrung zu Beweiszwecken bei Angriffen auf die Serverinfrastruktur oder anderen Rechtsverletzungen.<br /></li>
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<br/>
|
||||
<strong>Kontaktaufnahme per Kontaktformular / E-Mail / Fax / Post</strong>
|
||||
<ol style="margin:10px 0px; padding:15px;">
|
||||
<li>Bei der Kontaktaufnahme mit uns per Kontaktformular, Fax, Post oder E-Mail werden Ihre Angaben zum Zwecke der Abwicklung der Kontaktanfrage verarbeitet.<br /><br /></li>
|
||||
<li>Rechtsgrundlage für die Verarbeitung der Daten ist bei Vorliegen einer Einwilligung von Ihnen Art. 6 Abs. 1 S. 1 lit. a) DS-GVO. Rechtsgrundlage für die Verarbeitung der Daten, die im Zuge einer Kontaktanfrage oder E-Mail, eines Briefes oder Faxes übermittelt werden, ist Art. 6 Abs. 1 S. 1 lit. f) DS-GVO. Der Verantwortliche hat ein berechtigtes Interesse an der Verarbeitung und Speicherung der Daten, um Anfragen der Nutzer beantworten zu können, zur Beweissicherung aus Haftungsgründen und um ggf. seiner gesetzlichen Aufbewahrungspflichten bei Geschäftsbriefen nachkommen zu können. Zielt der Kontakt auf den Abschluss eines Vertrages ab, so ist zusätzliche Rechtsgrundlage für die Verarbeitung Art. 6 Abs. 1 S. 1 lit. b) DS-GVO.<br /><br /></li>
|
||||
<li>Wir können Ihre Angaben und Kontaktanfrage in unserem Customer-Relationship-Management System ("CRM System") oder einem vergleichbaren System speichern.<br /><br /></li>
|
||||
<li>Die Daten werden gelöscht, sobald sie für die Erreichung des Zweckes ihrer Erhebung nicht mehr erforderlich sind. Für die personenbezogenen Daten aus der Eingabemaske des Kontaktformulars und diejenigen, die per E-Mail übersandt wurden, ist dies dann der Fall, wenn die jeweilige Konversation mit Ihnen beendet ist. Beendet ist die Konversation dann, wenn sich aus den Umständen entnehmen lässt, dass der betroffene Sachverhalt abschließend geklärt ist. Anfragen von Nutzern, die über einen Account bzw. Vertrag mit uns verfügen, speichern wir bis zum Ablauf von zwei Jahren nach Vertragsbeendigung. Im Fall von gesetzlichen Archivierungspflichten erfolgt die Löschung nach deren Ablauf: Ende handelsrechtlicher (6 Jahre) und steuerrechtlicher (10 Jahre) Aufbewahrungspflicht.<br /><br /></li>
|
||||
<li>Sie haben jederzeit die Möglichkeit, die Einwilligung nach Art. 6 Abs. 1 S. 1 lit. a) DS-GVO zur Verarbeitung der personenbezogenen Daten zu widerrufen. Nehmen Sie per E-Mail Kontakt mit uns auf, so können Sie der Speicherung der personenbezogenen Daten jederzeit widersprechen.<br /><br /></li>
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<br/>
|
||||
<strong>Präsenz in sozialen Medien</strong>
|
||||
|
||||
<ol style="margin:10px 0px; padding:15px;">
|
||||
<li>Wir unterhalten in sozialen Medien Profile bzw. Fanpages. Bei der Nutzung und dem Aufruf unseres Profils im jeweiligen Netzwerk durch Sie gelten die jeweiligen Datenschutzhinweise und Nutzungsbedingungen des jeweiligen Netzwerks.<br /><br /></li>
|
||||
<li><strong>Datenkategorien und Beschreibung der Datenverarbeitung:</strong> Nutzungsdaten, Kontaktdaten, Inhaltsdaten, Bestandsdaten. Ferner werden die Daten der Nutzer innerhalb sozialer Netzwerke im Regelfall für Marktforschungs- und Werbezwecke verarbeitet. So können z.B. anhand des Nutzungsverhaltens und sich daraus ergebender Interessen der Nutzer Nutzungsprofile erstellt werden. Die Nutzungsprofile können wiederum verwendet werden, um z.B. Werbeanzeigen innerhalb und außerhalb der Netzwerke zu schalten, die mutmaßlich den Interessen der Nutzer entsprechen. Zu diesen Zwecken werden im Regelfall Cookies auf den Rechnern der Nutzer gespeichert, in denen das Nutzungsverhalten und die Interessen der Nutzer gespeichert werden. Ferner können in den Nutzungsprofilen auch Daten unabhängig der von den Nutzern verwendeten Geräte gespeichert werden (insbesondere, wenn die Nutzer Mitglieder der jeweiligen Plattformen sind und bei diesen eingeloggt sind). Für eine detaillierte Darstellung der jeweiligen Verarbeitungsformen und der Widerspruchsmöglichkeiten (Opt-Out) verweisen wir auf die Datenschutzerklärungen und Angaben der Betreiber der jeweiligen Netzwerke. Auch im Fall von Auskunftsanfragen und der Geltendmachung von Betroffenenrechten weisen wir darauf hin, dass diese am effektivsten bei den Anbietern geltend gemacht werden können. Nur die Anbieter haben jeweils Zugriff auf die Daten der Nutzer und können direkt entsprechende Maßnahmen ergreifen und Auskünfte geben. Sollten Sie dennoch Hilfe benötigen, dann können Sie sich an uns wenden.<br /><br /></li>
|
||||
<li><strong>Zweck der Verarbeitung:</strong> Kommunikation mit den auf den sozialen Netzwerken angeschlossenen und registrierten Nutzern; Information und Werbung für unsere Produkte, Angebote und Dienstleistungen; Außerdarstellung und Imagepflege; Auswertung und Analyse der Nutzer und Inhalte unserer Präsenzen in den sozialen Medien.<br /><br /></li>
|
||||
<li><strong>Rechtsgrundlagen:</strong> Die Rechtsgrundlage für die Verarbeitung der personenbezogenen Daten ist unser in den obigen Zwecken liegendes berechtigtes Interesse gemäß Art. 6 Abs. 1 S. 1 lit. f) DS-GVO. Soweit Sie uns bzw. dem Verantwortlichen des sozialen Netzwerks eine Einwilligung in die Verarbeitung Ihrer personenbezogenen Daten erteilt haben, ist Rechtsgrundlage Art. 6 Abs. 1 S. 1 lit. a) i.V.m. Art. 7 DS-GVO.<br /><br /></li>
|
||||
<li><strong>Datenübermittlung/Empfängerkategorie:</strong> Soziales Netzwerk.<br /><br /></li>
|
||||
<li>Die Datenschutzhinweise, Auskunftsmöglichkeiten und Widerspruchmöglichkeiten (Opt-Out) der jeweiligen Netzwerke / Diensteanbieter finden Sie hier:<br /><br />
|
||||
• <strong>XING</strong> – Diensteanbieter: XING AG, Dammtorstraße 29-32, 20354 Hamburg, Deutschland) - Datenschutzerklärung/ Opt-Out: <a href="https://privacy.xing.com/de/datenschutzerklaerung" target="_blank" rel="nofollow">https://privacy.xing.com/de/datenschutzerklaerung</a>.<br /><br />
|
||||
• <strong>LinkedIn</strong> – Diensteanbieter: LinkedIn Ireland Unlimited Company, Wilton Place, Dublin 2, Irland) – Datenschutzerklärung: <a href="https://www.linkedin.com/legal/privacy-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/privacy-policy</a>, Cookie-Richtlinie und Opt-Out: <a href="https://www.linkedin.com/legal/cookie-policy" target="_blank" rel="nofollow">https://www.linkedin.com/legal/cookie-policy</a>.<br /><br />
|
||||
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
|
||||
<br/>
|
||||
<strong>Rechte der betroffenen Person</strong>
|
||||
|
||||
<ol style="margin:10px 0px; padding:15px;">
|
||||
<li><strong>Widerspruch oder Widerruf gegen die Verarbeitung Ihrer Daten<br /><br />
|
||||
Soweit die Verarbeitung auf Ihrer Einwilligung gemäß Art. 6 Abs. 1 S. 1 lit. a), Art. 7 DS-GVO beruht, haben Sie das Recht, die Einwilligung jederzeit zu widerrufen. Die Rechtmäßigkeit der aufgrund der Einwilligung bis zum Widerruf erfolgten Verarbeitung wird dadurch nicht berührt.<br /><br />
|
||||
Soweit wir die Verarbeitung Ihrer personenbezogenen Daten auf die Interessenabwägung gemäß Art. 6 Abs. 1 S. 1 lit. f) DS-GVO stützen, können Sie Widerspruch gegen die Verarbeitung einlegen. Dies ist der Fall, wenn die Verarbeitung insbesondere nicht zur Erfüllung eines Vertrags mit Ihnen erforderlich ist, was von uns jeweils bei der nachfolgenden Beschreibung der Funktionen dargestellt wird. Bei Ausübung eines solchen Widerspruchs bitten wir um Darlegung der Gründe, weshalb wir Ihre personenbezogenen Daten nicht wie von uns durchgeführt verarbeiten sollten. Im Falle Ihres begründeten Widerspruchs prüfen wir die Sachlage und werden entweder die Datenverarbeitung einstellen bzw. anpassen oder Ihnen unsere zwingenden schutzwürdigen Gründe aufzeigen, aufgrund derer wir die Verarbeitung fortführen.<br /><br />
|
||||
Sie können der Verarbeitung Ihrer personenbezogenen Daten für Zwecke der Werbung und Datenanalyse jederzeit widersprechen. Das Widerspruchsrecht können Sie kostenfrei ausüben. Über Ihren Werbewiderspruch können Sie uns unter folgenden Kontaktdaten informieren:<br /><br />
|
||||
|
||||
IT-Beratung Patrick Davidt<br />Jägerallee 15<br />14469 Potsdam<br />E-Mail-Adresse: info@davidt.de<br /></strong>
|
||||
<br /></li>
|
||||
<li><strong>Recht auf Auskunft</strong><br />
|
||||
Sie haben ein Recht auf Auskunft über Ihre bei uns gespeicherten persönlichen Daten nach Art. 15 DS-GVO. Dies beinhaltet insbesondere die Auskunft über die Verarbeitungszwecke, die Kategorie der personenbezogenen Daten, die Kategorien von Empfängern, gegenüber denen Ihre Daten offengelegt wurden oder werden, die geplante Speicherdauer, die Herkunft ihrer Daten, sofern diese nicht direkt bei Ihnen erhoben wurden.<br /><br /></li>
|
||||
<li><strong>Recht auf Berichtigung</strong><br />
|
||||
Sie haben ein Recht auf Berichtigung unrichtiger oder auf Vervollständigung richtiger Daten nach Art. 16 DS-GVO.
|
||||
<br /><br />
|
||||
</li>
|
||||
<li><strong>Recht auf Löschung</strong><br />
|
||||
Sie haben ein Recht auf Löschung Ihrer bei uns gespeicherten Daten nach Art. 17 DS-GVO, es sei denn gesetzliche oder vertraglichen Aufbewahrungsfristen oder andere gesetzliche Pflichten bzw. Rechte zur weiteren Speicherung stehen dieser entgegen.
|
||||
<br /><br />
|
||||
</li>
|
||||
<li><strong>Recht auf Einschränkung</strong><br />
|
||||
Sie haben das Recht, eine Einschränkung bei der Verarbeitung Ihrer personenbezogenen Daten zu verlangen, wenn eine der Voraussetzungen in Art. 18 Abs. 1 lit. a) bis d) DS-GVO erfüllt ist:<br />
|
||||
• Wenn Sie die Richtigkeit der Sie betreffenden personenbezogenen für eine Dauer bestreiten, die es dem Verantwortlichen ermöglicht, die Richtigkeit der personenbezogenen Daten zu überprüfen;<br /><br />
|
||||
• die Verarbeitung unrechtmäßig ist und Sie die Löschung der personenbezogenen Daten ablehnen und stattdessen die Einschränkung der Nutzung der personenbezogenen Daten verlangen;<br /><br />
|
||||
• der Verantwortliche die personenbezogenen Daten für die Zwecke der Verarbeitung nicht länger benötigt, Sie diese jedoch zur Geltendmachung, Ausübung oder Verteidigung von Rechtsansprüchen benötigen, oder<br /><br />
|
||||
• wenn Sie Widerspruch gegen die Verarbeitung gemäß Art. 21 Abs. 1 DS-GVO eingelegt haben und noch nicht feststeht, ob die berechtigten Gründe des Verantwortlichen gegenüber Ihren Gründen überwiegen.<br /><br />
|
||||
</li>
|
||||
<li><strong>Recht auf Datenübertragbarkeit</strong><br />
|
||||
Sie haben ein Recht auf Datenübertragbarkeit nach Art. 20 DS-GVO, was bedeutet, dass Sie die bei uns über Sie gespeicherten personenbezogenen Daten in einem strukturierten, gängigen und maschinenlesbaren Format erhalten können oder die Übermittlung an einen anderen Verantwortlichen verlangen können.
|
||||
<br /><br />
|
||||
</li>
|
||||
<li><strong>Recht auf Beschwerde</strong><br />
|
||||
Sie haben ein Recht auf Beschwerde bei einer Aufsichtsbehörde. In der Regel können Sie sich hierfür an die Aufsichtsbehörde insbesondere in dem Mitgliedstaat ihres Aufenthaltsorts, ihres Arbeitsplatzes oder des Orts des mutmaßlichen Verstoßes wenden.
|
||||
<br /><br />
|
||||
</li>
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
<br/>
|
||||
<strong>Datensicherheit</strong>
|
||||
<p>Um alle personenbezogen Daten, die an uns übermittelt werden, zu schützen und um sicherzustellen, dass die Datenschutzvorschriften von uns, aber auch unseren externen Dienstleistern eingehalten werden, haben wir geeignete technische und organisatorische Sicherheitsmaßnahmen getroffen. Deshalb werden unter anderem alle Daten zwischen Ihrem Browser und unserem Server über eine sichere SSL-Verbindung verschlüsselt übertragen.</p>
|
||||
<br />
|
||||
|
||||
<br/>
|
||||
<strong>Stand: 15.10.2021</strong>
|
||||
|
||||
<p>Quelle: <a href="https://www.juraforum.de/datenschutzerklaerung-muster/" target="_blank" rel="noopener noreferrer">Mehr >></a></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
BIN
source/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 534 B |
BIN
source/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
source/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
47
source/impressum.php
Executable file
@@ -0,0 +1,47 @@
|
||||
<?php
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
//Überprüfe, dass der User eingeloggt ist
|
||||
//Der Aufruf von check_user() muss in alle internen Seiten eingebaut sein
|
||||
//$user = check_user();
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
<h2>Impressum</h2>
|
||||
<p>OpenEye ist ein Dienst der<br />IT-Beratung Patrick Davidt<br />
|
||||
<br />Jägerallee 15<br />14469 Potsdam</p>
|
||||
<p>Telefon: +49 172 2063265<br />
|
||||
E-Mail: <a href="mailto:info@davidt.de">info@davidt.de</a><br />
|
||||
</p>
|
||||
<p><strong>Umsatzsteuer-ID: </strong><br />Umsatzsteuer-Identifikationsnummer nach §27a Umsatzsteuergesetz:<br />DE321554480</p>
|
||||
|
||||
<p><strong>Technische Umsetzung:</strong><br><a href="https://davidt.de" title="Patrick Davidt - Projektmanagement und IT-Versteher." target="_blank">Patrick Davidt</a></p><br />
|
||||
|
||||
<br />
|
||||
<h3>Disclaimer – rechtliche Hinweise</h3>
|
||||
§ 1 Warnhinweis zu Inhalten<br />
|
||||
Die kostenlosen und frei zugänglichen Inhalte dieser Webseite wurden mit größtmöglicher Sorgfalt erstellt. Der Anbieter dieser Webseite übernimmt jedoch keine Gewähr für die Richtigkeit und Aktualität der bereitgestellten kostenlosen und frei zugänglichen journalistischen Ratgeber und Nachrichten. Namentlich gekennzeichnete Beiträge geben die Meinung des jeweiligen Autors und nicht immer die Meinung des Anbieters wieder. Allein durch den Aufruf der kostenlosen und frei zugänglichen Inhalte kommt keinerlei Vertragsverhältnis zwischen dem Nutzer und dem Anbieter zustande, insoweit fehlt es am Rechtsbindungswillen des Anbieters.<br />
|
||||
<br />
|
||||
§ 2 Externe Links<br />
|
||||
Diese Website enthält Verknüpfungen zu Websites Dritter ("externe Links"). Diese Websites unterliegen der Haftung der jeweiligen Betreiber. Der Anbieter hat bei der erstmaligen Verknüpfung der externen Links die fremden Inhalte daraufhin überprüft, ob etwaige Rechtsverstöße bestehen. Zu dem Zeitpunkt waren keine Rechtsverstöße ersichtlich. Der Anbieter hat keinerlei Einfluss auf die aktuelle und zukünftige Gestaltung und auf die Inhalte der verknüpften Seiten. Das Setzen von externen Links bedeutet nicht, dass sich der Anbieter die hinter dem Verweis oder Link liegenden Inhalte zu Eigen macht. Eine ständige Kontrolle der externen Links ist für den Anbieter ohne konkrete Hinweise auf Rechtsverstöße nicht zumutbar. Bei Kenntnis von Rechtsverstößen werden jedoch derartige externe Links unverzüglich gelöscht.<br />
|
||||
<br />
|
||||
§ 3 Urheber- und Leistungsschutzrechte<br />
|
||||
Die auf dieser Website veröffentlichten Inhalte unterliegen dem deutschen Urheber- und Leistungsschutzrecht. Jede vom deutschen Urheber- und Leistungsschutzrecht nicht zugelassene Verwertung bedarf der vorherigen schriftlichen Zustimmung des Anbieters oder jeweiligen Rechteinhabers. Dies gilt insbesondere für Vervielfältigung, Bearbeitung, Übersetzung, Einspeicherung, Verarbeitung bzw. Wiedergabe von Inhalten in Datenbanken oder anderen elektronischen Medien und Systemen. Inhalte und Rechte Dritter sind dabei als solche gekennzeichnet. Die unerlaubte Vervielfältigung oder Weitergabe einzelner Inhalte oder kompletter Seiten ist nicht gestattet und strafbar. Lediglich die Herstellung von Kopien und Downloads für den persönlichen, privaten und nicht kommerziellen Gebrauch ist erlaubt.<br />
|
||||
<br />
|
||||
Die Darstellung dieser Website in fremden Frames ist nur mit schriftlicher Erlaubnis zulässig.<br />
|
||||
<br />
|
||||
§ 4 Besondere Nutzungsbedingungen<br />
|
||||
Soweit besondere Bedingungen für einzelne Nutzungen dieser Website von den vorgenannten Paragraphen abweichen, wird an entsprechender Stelle ausdrücklich darauf hingewiesen. In diesem Falle gelten im jeweiligen Einzelfall die besonderen Nutzungsbedingungen.<p>Quelle: <a href="https://www.juraforum.de/impressum-generator/" target="_blank" rel="noopener noreferrer">Impressum Generator von JuraForum.de</a></p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
6
source/inc/config.inc.php
Executable file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
$db_host = 'localhost';
|
||||
$db_name = 'openeye-urbanis';
|
||||
$db_user = 'openeye-urbanis';
|
||||
$db_password = 'LU2zJPUhH5sZ1OIFfekq';
|
||||
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8", $db_user, $db_password);
|
||||
96
source/inc/functions.inc.php
Executable file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
/**
|
||||
* A complete login script with registration and members area.
|
||||
*
|
||||
* @author: Nils Reimers / http://www.php-einfach.de/experte/php-codebeispiele/loginscript/
|
||||
* @license: GNU GPLv3
|
||||
*/
|
||||
include_once("password.inc.php");
|
||||
|
||||
/**
|
||||
* Checks that the user is logged in.
|
||||
* @return Returns the row of the logged in user
|
||||
*/
|
||||
function check_user() {
|
||||
global $pdo;
|
||||
|
||||
if(!isset($_SESSION['userid']) && isset($_COOKIE['identifier']) && isset($_COOKIE['securitytoken'])) {
|
||||
$identifier = $_COOKIE['identifier'];
|
||||
$securitytoken = $_COOKIE['securitytoken'];
|
||||
|
||||
$statement = $pdo->prepare("SELECT * FROM securitytokens WHERE identifier = ?");
|
||||
$result = $statement->execute(array($identifier));
|
||||
$securitytoken_row = $statement->fetch();
|
||||
|
||||
if(sha1($securitytoken) !== $securitytoken_row['securitytoken']) {
|
||||
//Vermutlich wurde der Security Token gestohlen
|
||||
//Hier ggf. eine Warnung o.ä. anzeigen
|
||||
|
||||
} else { //Token war korrekt
|
||||
//Setze neuen Token
|
||||
$neuer_securitytoken = random_string();
|
||||
$insert = $pdo->prepare("UPDATE securitytokens SET securitytoken = :securitytoken WHERE identifier = :identifier");
|
||||
$insert->execute(array('securitytoken' => sha1($neuer_securitytoken), 'identifier' => $identifier));
|
||||
setcookie("identifier",$identifier,time()+(3600*24*365)); //1 Jahr Gültigkeit
|
||||
setcookie("securitytoken",$neuer_securitytoken,time()+(3600*24*365)); //1 Jahr Gültigkeit
|
||||
|
||||
//Logge den Benutzer ein
|
||||
$_SESSION['userid'] = $securitytoken_row['user_id'];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if(!isset($_SESSION['userid'])) {
|
||||
$error_msg='Bitte zuerst <a href="login.php">einloggen</a>';
|
||||
error($error_msg);
|
||||
//die('Bitte zuerst <a href="login.php">einloggen</a>');
|
||||
}
|
||||
|
||||
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE id = :id");
|
||||
$result = $statement->execute(array('id' => $_SESSION['userid']));
|
||||
$user = $statement->fetch();
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true when the user is checked in, else false
|
||||
*/
|
||||
function is_checked_in() {
|
||||
return isset($_SESSION['userid']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a random string
|
||||
*/
|
||||
function random_string() {
|
||||
if(function_exists('openssl_random_pseudo_bytes')) {
|
||||
$bytes = openssl_random_pseudo_bytes(16);
|
||||
$str = bin2hex($bytes);
|
||||
} else if(function_exists('mcrypt_create_iv')) {
|
||||
$bytes = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
|
||||
$str = bin2hex($bytes);
|
||||
} else {
|
||||
//Replace your_secret_string with a string of your choice (>12 characters)
|
||||
$str = md5(uniqid('your_secret_string', true));
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the URL to the site without the script name
|
||||
*/
|
||||
function getSiteURL() {
|
||||
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
|
||||
return $protocol.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/';
|
||||
}
|
||||
|
||||
/**
|
||||
* Outputs an error message and stops the further exectution of the script.
|
||||
*/
|
||||
function error($error_msg) {
|
||||
include("templates/header.inc.php");
|
||||
include("templates/error.inc.php");
|
||||
include("templates/footer.inc.php");
|
||||
exit();
|
||||
}
|
||||
317
source/inc/password.inc.php
Executable file
@@ -0,0 +1,317 @@
|
||||
<?php
|
||||
/**
|
||||
* A Compatibility library with PHP 5.5's simplified password hashing API.
|
||||
*
|
||||
* @author Anthony Ferrara <ircmaxell@php.net>
|
||||
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
||||
* @copyright 2012 The Authors
|
||||
*/
|
||||
|
||||
namespace {
|
||||
|
||||
if (!defined('PASSWORD_BCRYPT')) {
|
||||
/**
|
||||
* PHPUnit Process isolation caches constants, but not function declarations.
|
||||
* So we need to check if the constants are defined separately from
|
||||
* the functions to enable supporting process isolation in userland
|
||||
* code.
|
||||
*/
|
||||
define('PASSWORD_BCRYPT', 1);
|
||||
define('PASSWORD_DEFAULT', PASSWORD_BCRYPT);
|
||||
define('PASSWORD_BCRYPT_DEFAULT_COST', 10);
|
||||
}
|
||||
|
||||
if (!function_exists('password_hash')) {
|
||||
|
||||
/**
|
||||
* Hash the password using the specified algorithm
|
||||
*
|
||||
* @param string $password The password to hash
|
||||
* @param int $algo The algorithm to use (Defined by PASSWORD_* constants)
|
||||
* @param array $options The options for the algorithm to use
|
||||
*
|
||||
* @return string|false The hashed password, or false on error.
|
||||
*/
|
||||
function password_hash($password, $algo, array $options = array()) {
|
||||
if (!function_exists('crypt')) {
|
||||
trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (is_null($password) || is_int($password)) {
|
||||
$password = (string) $password;
|
||||
}
|
||||
if (!is_string($password)) {
|
||||
trigger_error("password_hash(): Password must be a string", E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (!is_int($algo)) {
|
||||
trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
$resultLength = 0;
|
||||
switch ($algo) {
|
||||
case PASSWORD_BCRYPT:
|
||||
$cost = PASSWORD_BCRYPT_DEFAULT_COST;
|
||||
if (isset($options['cost'])) {
|
||||
$cost = (int) $options['cost'];
|
||||
if ($cost < 4 || $cost > 31) {
|
||||
trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// The length of salt to generate
|
||||
$raw_salt_len = 16;
|
||||
// The length required in the final serialization
|
||||
$required_salt_len = 22;
|
||||
$hash_format = sprintf("$2y$%02d$", $cost);
|
||||
// The expected length of the final crypt() output
|
||||
$resultLength = 60;
|
||||
break;
|
||||
default:
|
||||
trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
$salt_req_encoding = false;
|
||||
if (isset($options['salt'])) {
|
||||
switch (gettype($options['salt'])) {
|
||||
case 'NULL':
|
||||
case 'boolean':
|
||||
case 'integer':
|
||||
case 'double':
|
||||
case 'string':
|
||||
$salt = (string) $options['salt'];
|
||||
break;
|
||||
case 'object':
|
||||
if (method_exists($options['salt'], '__tostring')) {
|
||||
$salt = (string) $options['salt'];
|
||||
break;
|
||||
}
|
||||
case 'array':
|
||||
case 'resource':
|
||||
default:
|
||||
trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING);
|
||||
return null;
|
||||
}
|
||||
if (PasswordCompat\binary\_strlen($salt) < $required_salt_len) {
|
||||
trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", PasswordCompat\binary\_strlen($salt), $required_salt_len), E_USER_WARNING);
|
||||
return null;
|
||||
} elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) {
|
||||
$salt_req_encoding = true;
|
||||
}
|
||||
} else {
|
||||
$buffer = '';
|
||||
$buffer_valid = false;
|
||||
if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) {
|
||||
$buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM);
|
||||
if ($buffer) {
|
||||
$buffer_valid = true;
|
||||
}
|
||||
}
|
||||
if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) {
|
||||
$strong = false;
|
||||
$buffer = openssl_random_pseudo_bytes($raw_salt_len, $strong);
|
||||
if ($buffer && $strong) {
|
||||
$buffer_valid = true;
|
||||
}
|
||||
}
|
||||
if (!$buffer_valid && @is_readable('/dev/urandom')) {
|
||||
$file = fopen('/dev/urandom', 'r');
|
||||
$read = 0;
|
||||
$local_buffer = '';
|
||||
while ($read < $raw_salt_len) {
|
||||
$local_buffer .= fread($file, $raw_salt_len - $read);
|
||||
$read = PasswordCompat\binary\_strlen($local_buffer);
|
||||
}
|
||||
fclose($file);
|
||||
if ($read >= $raw_salt_len) {
|
||||
$buffer_valid = true;
|
||||
}
|
||||
$buffer = str_pad($buffer, $raw_salt_len, "\0") ^ str_pad($local_buffer, $raw_salt_len, "\0");
|
||||
}
|
||||
if (!$buffer_valid || PasswordCompat\binary\_strlen($buffer) < $raw_salt_len) {
|
||||
$buffer_length = PasswordCompat\binary\_strlen($buffer);
|
||||
for ($i = 0; $i < $raw_salt_len; $i++) {
|
||||
if ($i < $buffer_length) {
|
||||
$buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255));
|
||||
} else {
|
||||
$buffer .= chr(mt_rand(0, 255));
|
||||
}
|
||||
}
|
||||
}
|
||||
$salt = $buffer;
|
||||
$salt_req_encoding = true;
|
||||
}
|
||||
if ($salt_req_encoding) {
|
||||
// encode string with the Base64 variant used by crypt
|
||||
$base64_digits =
|
||||
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
|
||||
$bcrypt64_digits =
|
||||
'./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||
|
||||
$base64_string = base64_encode($salt);
|
||||
$salt = strtr(rtrim($base64_string, '='), $base64_digits, $bcrypt64_digits);
|
||||
}
|
||||
$salt = PasswordCompat\binary\_substr($salt, 0, $required_salt_len);
|
||||
|
||||
$hash = $hash_format . $salt;
|
||||
|
||||
$ret = crypt($password, $hash);
|
||||
|
||||
if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != $resultLength) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get information about the password hash. Returns an array of the information
|
||||
* that was used to generate the password hash.
|
||||
*
|
||||
* array(
|
||||
* 'algo' => 1,
|
||||
* 'algoName' => 'bcrypt',
|
||||
* 'options' => array(
|
||||
* 'cost' => PASSWORD_BCRYPT_DEFAULT_COST,
|
||||
* ),
|
||||
* )
|
||||
*
|
||||
* @param string $hash The password hash to extract info from
|
||||
*
|
||||
* @return array The array of information about the hash.
|
||||
*/
|
||||
function password_get_info($hash) {
|
||||
$return = array(
|
||||
'algo' => 0,
|
||||
'algoName' => 'unknown',
|
||||
'options' => array(),
|
||||
);
|
||||
if (PasswordCompat\binary\_substr($hash, 0, 4) == '$2y$' && PasswordCompat\binary\_strlen($hash) == 60) {
|
||||
$return['algo'] = PASSWORD_BCRYPT;
|
||||
$return['algoName'] = 'bcrypt';
|
||||
list($cost) = sscanf($hash, "$2y$%d$");
|
||||
$return['options']['cost'] = $cost;
|
||||
}
|
||||
return $return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the password hash needs to be rehashed according to the options provided
|
||||
*
|
||||
* If the answer is true, after validating the password using password_verify, rehash it.
|
||||
*
|
||||
* @param string $hash The hash to test
|
||||
* @param int $algo The algorithm used for new password hashes
|
||||
* @param array $options The options array passed to password_hash
|
||||
*
|
||||
* @return boolean True if the password needs to be rehashed.
|
||||
*/
|
||||
function password_needs_rehash($hash, $algo, array $options = array()) {
|
||||
$info = password_get_info($hash);
|
||||
if ($info['algo'] !== (int) $algo) {
|
||||
return true;
|
||||
}
|
||||
switch ($algo) {
|
||||
case PASSWORD_BCRYPT:
|
||||
$cost = isset($options['cost']) ? (int) $options['cost'] : PASSWORD_BCRYPT_DEFAULT_COST;
|
||||
if ($cost !== $info['options']['cost']) {
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify a password against a hash using a timing attack resistant approach
|
||||
*
|
||||
* @param string $password The password to verify
|
||||
* @param string $hash The hash to verify against
|
||||
*
|
||||
* @return boolean If the password matches the hash
|
||||
*/
|
||||
function password_verify($password, $hash) {
|
||||
if (!function_exists('crypt')) {
|
||||
trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
$ret = crypt($password, $hash);
|
||||
if (!is_string($ret) || PasswordCompat\binary\_strlen($ret) != PasswordCompat\binary\_strlen($hash) || PasswordCompat\binary\_strlen($ret) <= 13) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$status = 0;
|
||||
for ($i = 0; $i < PasswordCompat\binary\_strlen($ret); $i++) {
|
||||
$status |= (ord($ret[$i]) ^ ord($hash[$i]));
|
||||
}
|
||||
|
||||
return $status === 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace PasswordCompat\binary {
|
||||
|
||||
if (!function_exists('PasswordCompat\\binary\\_strlen')) {
|
||||
|
||||
/**
|
||||
* Count the number of bytes in a string
|
||||
*
|
||||
* We cannot simply use strlen() for this, because it might be overwritten by the mbstring extension.
|
||||
* In this case, strlen() will count the number of *characters* based on the internal encoding. A
|
||||
* sequence of bytes might be regarded as a single multibyte character.
|
||||
*
|
||||
* @param string $binary_string The input string
|
||||
*
|
||||
* @internal
|
||||
* @return int The number of bytes
|
||||
*/
|
||||
function _strlen($binary_string) {
|
||||
if (function_exists('mb_strlen')) {
|
||||
return mb_strlen($binary_string, '8bit');
|
||||
}
|
||||
return strlen($binary_string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a substring based on byte limits
|
||||
*
|
||||
* @see _strlen()
|
||||
*
|
||||
* @param string $binary_string The input string
|
||||
* @param int $start
|
||||
* @param int $length
|
||||
*
|
||||
* @internal
|
||||
* @return string The substring
|
||||
*/
|
||||
function _substr($binary_string, $start, $length) {
|
||||
if (function_exists('mb_substr')) {
|
||||
return mb_substr($binary_string, $start, $length, '8bit');
|
||||
}
|
||||
return substr($binary_string, $start, $length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if current PHP version is compatible with the library
|
||||
*
|
||||
* @return boolean the check result
|
||||
*/
|
||||
function check() {
|
||||
static $pass = NULL;
|
||||
|
||||
if (is_null($pass)) {
|
||||
if (function_exists('crypt')) {
|
||||
$hash = '$2y$04$usesomesillystringfore7hnbRJHxXVLeakoG8K30oukPsA.ztMG';
|
||||
$test = crypt("password", $hash);
|
||||
$pass = $test == $hash;
|
||||
} else {
|
||||
$pass = false;
|
||||
}
|
||||
}
|
||||
return $pass;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
107
source/index.php
Executable file
@@ -0,0 +1,107 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
$error_msg = "";
|
||||
if(isset($_POST['email']) && isset($_POST['passwort'])) {
|
||||
$email = $_POST['email'];
|
||||
$passwort = $_POST['passwort'];
|
||||
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
|
||||
$result = $statement->execute(array('email' => $email));
|
||||
$user = $statement->fetch();
|
||||
|
||||
//Überprüfung des Passworts
|
||||
if ($user !== false && password_verify($passwort, $user['passwort'])) {
|
||||
$_SESSION['userid'] = $user['id'];
|
||||
|
||||
//Möchte der Nutzer angemeldet beleiben?
|
||||
if(isset($_POST['angemeldet_bleiben'])) {
|
||||
$identifier = random_string();
|
||||
$securitytoken = random_string();
|
||||
|
||||
$insert = $pdo->prepare("INSERT INTO securitytokens (user_id, identifier, securitytoken) VALUES (:user_id, :identifier, :securitytoken)");
|
||||
$insert->execute(array('user_id' => $user['id'], 'identifier' => $identifier, 'securitytoken' => sha1($securitytoken)));
|
||||
setcookie("identifier",$identifier,time()+(3600*24*365)); //Valid for 1 year
|
||||
setcookie("securitytoken",$securitytoken,time()+(3600*24*365)); //Valid for 1 year
|
||||
}
|
||||
|
||||
header("location: meldung.php");
|
||||
exit;
|
||||
} else {
|
||||
$error_msg = "E-Mail oder Passwort war ungültig<br><br>";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$email_value = "";
|
||||
if(isset($_POST['email']))
|
||||
$email_value = htmlentities($_POST['email']);
|
||||
|
||||
include("templates/header.inc.php");
|
||||
|
||||
?>
|
||||
|
||||
|
||||
<div class="b-example-divider"></div>
|
||||
|
||||
<div class="container col-xl-10 col-xxl-8 px-4 py-5">
|
||||
<div class="row align-items-center g-lg-5 py-5">
|
||||
<div class="col-lg-7 text-center text-lg-start">
|
||||
<h1 class="display-4 fw-bold lh-1 mb-3"><b>urbanis</b>.openeye</h1>
|
||||
<p class="col-lg-10 fs-4">Herzlich Willkommen zum OpenEye der Urbanis GmbH. Meldungen bequem per App versenden.</p>
|
||||
</div>
|
||||
<?php if(!is_checked_in()): ?>
|
||||
<div class="col-md-10 mx-auto col-lg-5">
|
||||
<?php
|
||||
if(isset($error_msg) && !empty($error_msg)) {
|
||||
echo $error_msg;
|
||||
}
|
||||
?>
|
||||
<form action="login.php" method="post" class="p-4 p-md-5 border rounded-3 bg-light">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="E-Mail" value="<?php echo $email_value; ?>" required autofocus>
|
||||
<label for="inputEmail">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-floating mb-3">
|
||||
<input type="password" name="passwort" id="inputPassword" class="form-control" placeholder="Passwort" required>
|
||||
<label for="inputPassword">Passwort</label>
|
||||
</div>
|
||||
<div class="checkbox mb-3">
|
||||
<label>
|
||||
<input type="checkbox" value="remember-me" name="angemeldet_bleiben" value="1" checked> Angemeldet bleiben
|
||||
</label>
|
||||
</div>
|
||||
<button class="w-100 btn btn-lg btn-primary" type="submit">Login</button>
|
||||
<!-- <hr class="my-4">
|
||||
<small class="text-muted"><a href="passwortvergessen.php">Passwort vergessen</a></small> -->
|
||||
</form>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="col-md-10 mx-auto col-lg-5">
|
||||
<form class="p-4 p-md-5 border rounded-3 bg-light">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="E-Mail" value="<?php echo $email_value; ?>" required autofocus disabled>
|
||||
<label for="inputEmail">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-floating mb-3">
|
||||
<input type="password" name="passwort" id="inputPassword" class="form-control" placeholder="******" required disabled>
|
||||
<label for="inputPassword">Passwort</label>
|
||||
</div>
|
||||
<div class="checkbox mb-3">
|
||||
<label>
|
||||
<input type="checkbox" value="remember-me" name="angemeldet_bleiben" value="1" checked disabled> Angemeldet bleiben
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<a class="w-100 btn btn-lg btn-primary" href="meldung.php" role="button">Start</a>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
103
source/login.php
Executable file
@@ -0,0 +1,103 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
$error_msg = "";
|
||||
if(isset($_POST['email']) && isset($_POST['passwort'])) {
|
||||
$email = $_POST['email'];
|
||||
$passwort = $_POST['passwort'];
|
||||
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
|
||||
$result = $statement->execute(array('email' => $email));
|
||||
$user = $statement->fetch();
|
||||
|
||||
//Überprüfung des Passworts
|
||||
if ($user !== false && password_verify($passwort, $user['passwort'])) {
|
||||
$_SESSION['userid'] = $user['id'];
|
||||
|
||||
//Möchte der Nutzer angemeldet beleiben?
|
||||
if(isset($_POST['angemeldet_bleiben'])) {
|
||||
$identifier = random_string();
|
||||
$securitytoken = random_string();
|
||||
|
||||
$insert = $pdo->prepare("INSERT INTO securitytokens (user_id, identifier, securitytoken) VALUES (:user_id, :identifier, :securitytoken)");
|
||||
$insert->execute(array('user_id' => $user['id'], 'identifier' => $identifier, 'securitytoken' => sha1($securitytoken)));
|
||||
setcookie("identifier",$identifier,time()+(3600*24*365)); //Valid for 1 year
|
||||
setcookie("securitytoken",$securitytoken,time()+(3600*24*365)); //Valid for 1 year
|
||||
}
|
||||
|
||||
header("location: meldung.php");
|
||||
exit;
|
||||
} else {
|
||||
$error_msg = "E-Mail oder Passwort war ungültig<br><br>";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$email_value = "";
|
||||
if(isset($_POST['email']))
|
||||
$email_value = htmlentities($_POST['email']);
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md px-5 py-4">
|
||||
<?php if(!is_checked_in()): ?>
|
||||
<div class="col-md-10 mx-auto col-lg-5">
|
||||
<?php
|
||||
if(isset($error_msg) && !empty($error_msg)) {
|
||||
echo $error_msg;
|
||||
}
|
||||
?>
|
||||
<form action="login.php" method="post" class="border rounded-3 bg-light p-4 p-md-5 ">
|
||||
<h2 class="form-signin-heading">Login</h2>
|
||||
|
||||
<div class="form-floating mb-3">
|
||||
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="E-Mail" value="<?php echo $email_value; ?>" required autofocus>
|
||||
<label for="inputEmail">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-floating mb-3">
|
||||
<input type="password" name="passwort" id="inputPassword" class="form-control" placeholder="Passwort" required>
|
||||
<label for="inputPassword">Passwort</label>
|
||||
</div>
|
||||
<div class="checkbox mb-3">
|
||||
<label>
|
||||
<input type="checkbox" value="remember-me" name="angemeldet_bleiben" value="1" checked> Angemeldet bleiben
|
||||
</label>
|
||||
</div>
|
||||
<button class="w-100 btn btn-lg btn-primary" type="submit">Login</button>
|
||||
<!-- <hr class="my-4">
|
||||
<small class="text-muted"><a href="passwortvergessen.php">Passwort vergessen</a></small> -->
|
||||
</form>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="col-md-10 mx-auto col-lg-5">
|
||||
<form class="p-4 p-md-5 border rounded-3 bg-light">
|
||||
<div class="form-floating mb-3">
|
||||
<input type="email" name="email" id="inputEmail" class="form-control" placeholder="E-Mail" value="<?php echo $email_value; ?>" required autofocus disabled>
|
||||
<label for="inputEmail">E-Mail</label>
|
||||
</div>
|
||||
<div class="form-floating mb-3">
|
||||
<input type="password" name="passwort" id="inputPassword" class="form-control" placeholder="******" required disabled>
|
||||
<label for="inputPassword">Passwort</label>
|
||||
</div>
|
||||
<div class="checkbox mb-3">
|
||||
<label>
|
||||
<input type="checkbox" value="remember-me" name="angemeldet_bleiben" value="1" checked disabled> Angemeldet bleiben
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<a class="w-100 btn btn-lg btn-primary" href="meldung.php" role="button">Start</a>
|
||||
</form>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div> <!-- /container -->
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
23
source/logout.php
Executable file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
session_start();
|
||||
session_destroy();
|
||||
unset($_SESSION['userid']);
|
||||
|
||||
//Remove Cookies
|
||||
setcookie("identifier","",time()-(3600*24*365));
|
||||
setcookie("securitytoken","",time()-(3600*24*365));
|
||||
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
Der Logout war erfolgreich. <a href="login.php">Zurück zum Login</a>.
|
||||
</div>
|
||||
</div>
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
525
source/meldung.php
Executable file
@@ -0,0 +1,525 @@
|
||||
<?php
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
//Überprüfe, dass der User eingeloggt ist
|
||||
//Der Aufruf von check_user() muss in alle internen Seiten eingebaut sein
|
||||
$user = check_user();
|
||||
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
#require 'vendor/autoload.php';
|
||||
#require '../vendor/autoload.php'; #prod
|
||||
#require '../../vendor/autoload.php'; #stage
|
||||
|
||||
require '../../../vendor/autoload.php'; #netcup neu
|
||||
$bahnhof = "";
|
||||
if (array_key_exists('bahnhof', $_POST)) {
|
||||
date_default_timezone_set('Europe/Berlin');
|
||||
|
||||
$timestamp = time();
|
||||
$datum = date("d.m.Y - H:i", $timestamp);
|
||||
$datum_kurz = date("Ymd", $timestamp);
|
||||
|
||||
|
||||
$err = false;
|
||||
$msg = '';
|
||||
$email = '';
|
||||
$honey = '';
|
||||
mb_internal_encoding("UTF-8");
|
||||
$maxDim = 1200;
|
||||
|
||||
//Apply some basic validation and filtering to the subject
|
||||
if (array_key_exists('bahnhof', $_POST)) {
|
||||
$bahnhof = substr(strip_tags($_POST['bahnhof']), 0, 255);
|
||||
} else {
|
||||
$bahnhof = 'Kein Bahnhof';
|
||||
}
|
||||
|
||||
if (array_key_exists('userfile', $_FILES) AND !empty($_FILES['userfile']['tmp_name'])) {
|
||||
$file_name = $_FILES['userfile']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename = $file_name;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename = $file_name;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile2', $_FILES) AND !empty($_FILES['userfile2']['tmp_name'])) {
|
||||
$file_name2 = $_FILES['userfile2']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name2 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename2 = $file_name2;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name2 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename2 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename2 = $file_name2;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile3', $_FILES) AND !empty($_FILES['userfile3']['tmp_name'])) {
|
||||
$file_name3 = $_FILES['userfile3']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name3 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename3 = $file_name3;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name3 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename3 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename3 = $file_name3;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile4', $_FILES) AND !empty($_FILES['userfile4']['tmp_name'])) {
|
||||
$file_name4 = $_FILES['userfile4']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name4 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename4 = $file_name4;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name4 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename4 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename4 = $file_name4;
|
||||
}
|
||||
}
|
||||
|
||||
if (array_key_exists('userfile5', $_FILES) AND !empty($_FILES['userfile5']['tmp_name'])) {
|
||||
// Auf Bilder beschränken!
|
||||
// alter code
|
||||
// $ext5 = PHPMailer::mb_pathinfo($_FILES['userfile5']['name'], PATHINFO_EXTENSION);
|
||||
// $uploadfile5 = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile5']['name'])) . '.' . $ext5;
|
||||
$file_name5 = $_FILES['userfile5']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name5 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename5 = $file_name5;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name5 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename5 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename5 = $file_name5;
|
||||
}
|
||||
}
|
||||
//Apply some basic validation and filtering to the name
|
||||
if (array_key_exists('muell', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_status = substr(strip_tags($_POST['muell']), 0, 255);
|
||||
} else {
|
||||
$muell_status = '';
|
||||
}
|
||||
if (array_key_exists('muell-tech-maengel-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_maengel = substr(strip_tags($_POST['muell-tech-maengel-text']), 0, 500);
|
||||
} else {
|
||||
$muell_maengel = '';
|
||||
}
|
||||
if (array_key_exists('muell-sonstiges-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_sonstiges = substr(strip_tags($_POST['muell-sonstiges-text']), 0, 500);
|
||||
} else {
|
||||
$muell_sonstiges = '';
|
||||
}
|
||||
if (array_key_exists('wc', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$wc_status = substr(strip_tags($_POST['wc']), 0, 255);
|
||||
} else {
|
||||
$wc_status = '';
|
||||
}
|
||||
if (array_key_exists('wc-tech-maengel-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$wc_maengel = substr(strip_tags($_POST['wc-tech-maengel-text']), 0, 500);
|
||||
|
||||
}
|
||||
if (array_key_exists('wc-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$wc_sonstiges =substr(strip_tags($_POST['wc-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('miete-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$miete_sonstiges =substr(strip_tags($_POST['miete-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('miete', $_POST)) {
|
||||
$miete_status = substr(strip_tags($_POST['miete']), 0, 255);
|
||||
} else {
|
||||
$miete_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('automaten', $_POST)) {
|
||||
$automaten_status = substr(strip_tags($_POST['automaten']), 0, 255);
|
||||
} else {
|
||||
$automaten_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('werbeflaechen', $_POST)) {
|
||||
$werbeflaechen_status = substr(strip_tags($_POST['werbeflaechen']), 0, 255);
|
||||
} else {
|
||||
$werbeflaechen_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('automaten-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$automaten_sonstiges =substr(strip_tags($_POST['automaten-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('werbeflaechen-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$werbeflaechen_sonstiges =substr(strip_tags($_POST['werbeflaechen-sonstiges-text']), 0, 500);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//honeypot
|
||||
if (array_key_exists('email', $_POST)) {
|
||||
$honey = substr(strip_tags($_POST['email']), 0, 255);
|
||||
if (!$honey) {
|
||||
|
||||
$err = false;
|
||||
}
|
||||
else {
|
||||
$err = true;
|
||||
}
|
||||
}
|
||||
if (!$err) {
|
||||
//$to = 'info@davidt.de'; // für Tests
|
||||
//$to = 'davidt@urbanis-berlin.de'; // live-test
|
||||
//$ ip = getenv("REMOTE_ADDR") ; // für Tests
|
||||
|
||||
|
||||
//holt den betreuer als array $betreuer['betreuer'] aus der DB zum passenden Bahnhof
|
||||
$sql = "SELECT * FROM `standorte` WHERE `bahnhof` = '".$bahnhof."';";
|
||||
$betreuer = $pdo->query($sql)->fetch();
|
||||
|
||||
$werbeflaechen_betreuer='wegener@urbanis-berlin.de';
|
||||
$werbeflaechen_betreuer2='menke@urbanis-berlin.de';
|
||||
$automaten_betreuer='breuer@urbanis-berlin.de';
|
||||
|
||||
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
try {
|
||||
$mail->isSMTP();
|
||||
//$mail->SMTPDebug = 2; // für tests
|
||||
|
||||
$mail->Host = 'mail.davidt.cloud';
|
||||
$mail->Port = 587;
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = 'urbanis@openeye.app';
|
||||
$mail->Password = 'YKW6vTaNwx9JKvH3s';
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
$mail->setLanguage('de');
|
||||
$mail->setFrom('urbanis@openeye.app', 'OpenEye App '); //noch anpassen
|
||||
//$mail->addAddress($to); //test
|
||||
$mail->addAddress($betreuer['betreuer'], $betreuer['Vorname']. " " .$betreuer['Nachname']); //Live
|
||||
$mail->addCC($user['email'], $user['vorname']. " " .$user['nachname'] ); //Live
|
||||
$mail->addReplyTo($user['email'], $user['vorname']. " " .$user['nachname'] ); //Live)
|
||||
$mail->addBCC('patrick@davidt.de'); //test
|
||||
if (strcasecmp($werbeflaechen_status,"wurde nicht kontrolliert") !==0) {
|
||||
$mail->addCC($werbeflaechen_betreuer, 'Thomas Wegener'); //live
|
||||
$mail->addCC($werbeflaechen_betreuer2, 'Henning Menke');
|
||||
$werbeflaechen_status .= " (Thomas Wegener und Henning Menke im cc)";
|
||||
}
|
||||
if (strcasecmp($automaten_status,"wurde nicht kontrolliert") !==0) {
|
||||
$mail->addCC($automaten_betreuer, 'Mike Breuer' ); //live
|
||||
$automaten_status .= " (Mike Breuer im cc)";
|
||||
}
|
||||
|
||||
$mail->Subject = '[Begehungsnotiz] ' . $bahnhof;
|
||||
if (isset($target_filename)){
|
||||
$mail->addAttachment($target_filename, $datum_kurz . "_" . substr($bahnhof,6) .'.jpg');}
|
||||
if (isset($target_filename2)){
|
||||
$mail->addAttachment($target_filename2, $datum_kurz . "_" . substr($bahnhof,6) .' 2.jpg');}
|
||||
if (isset($target_filename3)){
|
||||
$mail->addAttachment($target_filename3, $datum_kurz . "_" . substr($bahnhof,6) .' 3.jpg');}
|
||||
if (isset($target_filename4)){
|
||||
$mail->addAttachment($target_filename4, $datum_kurz . "_" . substr($bahnhof,6) .' 4.jpg');}
|
||||
if (isset($target_filename5)){
|
||||
$mail->addAttachment($target_filename5, $datum_kurz . "_" . substr($bahnhof,6) .' 5.jpg');}
|
||||
|
||||
|
||||
|
||||
$mail->Body = "Hallo ".$betreuer['Vorname']. " " .$betreuer['Nachname'].",\n\nfür " . $bahnhof . " wurde am " . $datum . " von " . $user['vorname'] . " " . $user['nachname'] . " eine Meldung mit folgendem Inhalt abgesetzt.\n\n Müllraum:\n" . $muell_status . "\n" . $muell_maengel . $muell_sonstiges ."\n\n WC-Anlage:\n" . $wc_status . "\n" . $wc_maengel . $wc_sonstiges . "\n\n Mietobjekte:\n" . $miete_status . "\n" . $miete_sonstiges . "\n\n Automaten:\n" . $automaten_status ."\n" . $automaten_sonstiges . "\n\n Werbeflächen:\n" . $werbeflaechen_status . "\n" . $werbeflaechen_sonstiges . "\n\n -- \n Diese E-Mail wurde über https://urbanis.openeye.app von gesendet.\n\n Wenn Sie die Antwortfunktion Ihres E-Mailclients nutzen, wird diese Antwort direkt an " . $user['vorname'] . " " . $user['nachname']." (". $user['email'].") zugestellt.";
|
||||
$mail->send();
|
||||
$msg .= 'Meldung übermittelt. <a href="/meldung.php">Weitere Meldung absetzen</a>?';;
|
||||
// error_log(PHP_EOL. $datum . " | Absender: " . $email . " | Betreff: " . $query . " | gesendet an: " . $to , 3, "emails.log");
|
||||
} catch (Exception $e) {
|
||||
$msg .= 'Fehler beim Versand: ' . $e->errorMessage(); //Pretty error messages from PHPMailer
|
||||
} catch (\Exception $e) { //The leading slash means the Global PHP Exception class will be caught
|
||||
$msg .= 'Fehler beim Versand: ' . $e->getMessage(); //Boring error messages from anything else!
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
<?php if (empty($msg)) { ?>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<h2>Begehungsnotiz</h2>
|
||||
<p>angemeldet: <?php echo htmlentities($user['vorname']); ?> <?php echo htmlentities($user['nachname']); ?></p>
|
||||
<!-- honeypot -->
|
||||
<div class="kontaktmail" style="display:none"><label for="email">email
|
||||
<input type="email" name="email" id="email" value="" placeholder="E-Mail-Adresse (Pflichtfeld)" autocomplete="off" /></label>
|
||||
</div>
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Standort</h5>
|
||||
</div>
|
||||
<div class="col-sm-4 mb-3">
|
||||
<select class="form-select" aria-label="bahnhof" name="bahnhof" id="bahnhof" required>
|
||||
<option value="">- Bahnhof auswählen -</option>
|
||||
<?php
|
||||
$sql = "SELECT bahnhof FROM `standorte`;";
|
||||
foreach ($pdo->query($sql) as $row) {
|
||||
echo "<option value='" . $row['bahnhof'] . "'>" . $row['bahnhof'] . "</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Müllraum</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" id="muell-keine-meldung" onclick="javascript:yesnoCheck();" name="muell" value="wurde nicht kontrolliert">
|
||||
<label for="muell-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-io" name="muell" value="in Ordnung" required>
|
||||
<label for="muell-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-reinigung-erf" name="muell" value="Reinigung erforderlich">
|
||||
<label for="muell-reinigung-erf">Reinigung erforderlich</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-tech-maengel" name="muell" value="hat folgende technische Mängel:">
|
||||
<label for="muell-tech-maengel">Technische Mängel</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" id="muell-sonstiges" onclick="javascript:yesnoCheck();" name="muell" value="sonstige Anmerkungen:">
|
||||
<label for="muell-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes" style="display:none">
|
||||
<textarea class="form-control" name="muell-tech-maengel-text" id="muell-tech-maengel-text" placeholder="Technische Mängel beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes2" style="display:none">
|
||||
<textarea class="form-control" name="muell-sonstiges-text" id="muell-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>WC-Anlagen</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="wc-keine-meldung" onclick="javascript:yesnoCheck();" name="wc" value="wurde nicht kontrolliert">
|
||||
<label for="wc-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-io" name="wc" value="in Ordnung" required>
|
||||
<label for="wc-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-reinigung-erf" name="wc" value="Reinigung erforderlich">
|
||||
<label for="wc-reinigung-erf">Reinigung erforderlich</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-tech-maengel" name="wc" value="hat folgende technische Mängel:">
|
||||
<label for="wc-tech-maengel">Technische Mängel</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="wc-sonstiges" onclick="javascript:yesnoCheck();" name="wc" value="sonstige Anmerkungen:">
|
||||
<label for="wc-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
|
||||
<div class="col-12 form-check" id="ifYes3" style="display:none">
|
||||
<textarea class="form-control" name="wc-tech-maengel-text" id="wc-tech-maengel-text" placeholder="Technische Mängel beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes4" style="display:none">
|
||||
<textarea class="form-control" name="wc-sonstiges-text" id="wc-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="gy-4 col-12">
|
||||
<h5>Mietobjekte</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="miete-keine-meldung" onclick="javascript:yesnoCheck();" name="miete" value="wurde nicht kontrolliert">
|
||||
<label for="miete-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="miete-io" name="miete" value="in Ordnung" required>
|
||||
<label for="miete-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" id="miete-sonstiges" onclick="javascript:yesnoCheck();" name="miete" value="sonstige Anmerkungen:">
|
||||
<label for="miete-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes5" style="display:none">
|
||||
<textarea class="form-control" name="miete-sonstiges-text" id="miete-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Automaten</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="automaten-keine-meldung" onclick="javascript:yesnoCheck();" name="automaten" value="wurde nicht kontrolliert">
|
||||
<label for="automaten-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="automaten-io" name="automaten" value="in Ordnung" required>
|
||||
<label for="automaten-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" id="automaten-sonstiges" onclick="javascript:yesnoCheck();" name="automaten" value="sonstige Anmerkungen:">
|
||||
<label for="automaten-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes6" style="display:none">
|
||||
<textarea class="form-control" name="automaten-sonstiges-text" id="automaten-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Werbeflächen</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="werbeflaechen-keine-meldung" onclick="javascript:yesnoCheck();" name="werbeflaechen" value="wurde nicht kontrolliert" required>
|
||||
<label for="werbeflaechen-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="werbeflaechen-io" name="werbeflaechen" value="in Ordnung">
|
||||
<label for="werbeflaechen-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="werbeflaechen-sonstiges" onclick="javascript:yesnoCheck();" name="werbeflaechen" value="sonstige Anmerkungen:">
|
||||
<label for="werbeflaechen-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes7" style="display:none">
|
||||
<textarea class="form-control" name="werbeflaechen-sonstiges-text" id="werbeflaechen-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Fotos</h5><small>(nur JPG, Anhänge werden autom. verkleinert)</small>
|
||||
</div>
|
||||
<div class="col-sm-6 form-check" id="upload">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" onchange="OnFileValidation()" name="userfile" id="file" type="file"><br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile2" type="file"> <br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm"name="userfile3" type="file"><br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile4" type="file"> <br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile5" type="file"><br />
|
||||
</div>
|
||||
<div class="col-8"></div>
|
||||
|
||||
<!-- Break -->
|
||||
<div class="col-sm-6 col-md-3 btn-toolbar justify-content-between" role="toolbar" aria-label="Toolbar with button groups">
|
||||
<div class="btn-group" role="group" aria-label="First group">
|
||||
<input class="form-control btn btn-primary " type="submit" value="Absenden" />
|
||||
</div>
|
||||
<div class="btn-group" role="group" aria-label="second group">
|
||||
<input class="form-control btn btn-secondary" type="reset" value="zurücksetzen" />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php }
|
||||
else {
|
||||
echo $msg;
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
BIN
source/mstile-150x150.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
123
source/passwortvergessen.php
Executable file
@@ -0,0 +1,123 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require '../../vendor/autoload.php';
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
<div class="container small-container-330">
|
||||
<h2 >Passwort vergessen</h2>
|
||||
|
||||
|
||||
<?php
|
||||
$showForm = true;
|
||||
|
||||
if(isset($_GET['send']) ) {
|
||||
if(!isset($_POST['email']) || empty($_POST['email'])) {
|
||||
$error = "<b>Bitte eine E-Mail-Adresse eintragen</b>";
|
||||
} else {
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
|
||||
$result = $statement->execute(array('email' => $_POST['email']));
|
||||
$user = $statement->fetch();
|
||||
|
||||
if($user === false) {
|
||||
$error = "<b>Kein Benutzer gefunden</b>";
|
||||
} else {
|
||||
date_default_timezone_set('Europe/Berlin');
|
||||
$timestamp = time();
|
||||
$datum = date("d.m.Y - H:i", $timestamp);
|
||||
$passwortcode = random_string();
|
||||
$statement = $pdo->prepare("UPDATE users SET passwortcode = :passwortcode, passwortcode_time = NOW() WHERE id = :userid");
|
||||
$result = $statement->execute(array('passwortcode' => sha1($passwortcode), 'userid' => $user['id']));
|
||||
|
||||
$empfaenger = $user['email'];
|
||||
$betreff = "Neues Passwort für urbanis.openeye.app"; //Ersetzt hier den Domain-Namen
|
||||
$from = "urbanis@openeye.app"; //Ersetzt hier euren Name und E-Mail-Adresse
|
||||
$url_passwortcode = getSiteURL().'passwortzuruecksetzen.php?userid='.$user['id'].'&code='.$passwortcode; //Setzt hier eure richtige Domain ein
|
||||
$text = 'Hallo ' . $user['vorname'] . ' ' . $user['nachname'] . ',\n\n für den Account auf urbanis.openeye.app wurde am ' .$datum . ' nach einem neuen Passwort gefragt.\n Um ein neues Passwort zu vergeben, rufen Sie innerhalb der nächsten 24 Stunden die folgende Website auf:\n' . $url_passwortcode . '\nSollte Ihnen Ihr Passwort wieder eingefallen sein oder haben Sie dies nicht angefordert, können Sie diese E-Mail ignorieren.\n\nViele Grüße,\nOpenEye App';
|
||||
|
||||
//echo $text;
|
||||
|
||||
|
||||
|
||||
$err = false;
|
||||
$msg = '';
|
||||
$email = '';
|
||||
|
||||
mb_internal_encoding("UTF-8");
|
||||
|
||||
if (!$err) {
|
||||
//$to = 'info@davidt.de'; // für Tests
|
||||
//$to = 'davidt@urbanis-berlin.de'; //Live
|
||||
//$ ip = getenv("REMOTE_ADDR") ; // für Tests
|
||||
|
||||
|
||||
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
try {
|
||||
$mail->isSMTP();
|
||||
// $mail->SMTPDebug = 2; // für tests
|
||||
|
||||
$mail->Host = 'webspace.linevast.de';
|
||||
$mail->Port = 587;
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = 'urbanis@openeye.app';
|
||||
$mail->Password = 'YKW6vTaNwx9JKvH3s';
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
$mail->setLanguage('de');
|
||||
$mail->setFrom('urbanis@openeye.app', 'OpenEye App '); //noch anpassen
|
||||
$mail->addAddress($empfaenger);
|
||||
$mail->Subject = $betreff;
|
||||
$mail->Body = $text;
|
||||
$mail->send();
|
||||
$msg .= 'Ein Link um dein Passwort zurückzusetzen wurde an deine E-Mail-Adresse gesendet.';
|
||||
// error_log(PHP_EOL. $datum . " | Absender: " . $email . " | Betreff: " . $query . " | gesendet an: " . $to , 3, "emails.log");
|
||||
} catch (Exception $e) {
|
||||
$msg .= 'Fehler beim Versand: ' . $e->errorMessage(); //Pretty error messages from PHPMailer
|
||||
} catch (\Exception $e) { //The leading slash means the Global PHP Exception class will be caught
|
||||
$msg .= 'Fehler beim Versand: ' . $e->getMessage(); //Boring error messages from anything else!
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//mail($empfaenger, $betreff, $text, $from);
|
||||
|
||||
echo "Ein Link um dein Passwort zurückzusetzen wurde an deine E-Mail-Adresse gesendet.";
|
||||
$showForm = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($showForm):
|
||||
?>
|
||||
Gib hier deine E-Mail-Adresse ein, um ein neues Passwort anzufordern.<br><br>
|
||||
|
||||
<?php
|
||||
if(isset($error) && !empty($error)) {
|
||||
echo $error;
|
||||
}
|
||||
|
||||
?>
|
||||
<form action="?send=1" method="post">
|
||||
<label for="inputEmail">E-Mail</label>
|
||||
<input class="form-control" placeholder="E-Mail" name="email" type="email" value="<?php echo isset($_POST['email']) ? htmlentities($_POST['email']) : ''; ?>" required>
|
||||
<br>
|
||||
<input class="btn btn-lg btn-primary btn-block" type="submit" value="Neues Passwort">
|
||||
</form>
|
||||
<?php
|
||||
endif; //Endif von if($showForm)
|
||||
?>
|
||||
|
||||
</div> <!-- /container -->
|
||||
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
87
source/passwortzuruecksetzen.php
Executable file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
if(!isset($_GET['userid']) || !isset($_GET['code'])) {
|
||||
error("Leider wurde beim Aufruf dieser Website kein Code zum Zurücksetzen deines Passworts übermittelt");
|
||||
}
|
||||
|
||||
|
||||
|
||||
$showForm = true;
|
||||
$userid = $_GET['userid'];
|
||||
$code = $_GET['code'];
|
||||
|
||||
//Abfrage des Nutzers
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE id = :userid");
|
||||
$result = $statement->execute(array('userid' => $userid));
|
||||
$user = $statement->fetch();
|
||||
|
||||
//Überprüfe dass ein Nutzer gefunden wurde und dieser auch ein Passwortcode hat
|
||||
if($user === null || $user['passwortcode'] === null) {
|
||||
error("Der Benutzer wurde nicht gefunden oder hat kein neues Passwort angefordert.");
|
||||
}
|
||||
|
||||
if($user['passwortcode_time'] === null || strtotime($user['passwortcode_time']) < (time()-24*3600) ) {
|
||||
error("Dein Code ist leider abgelaufen. Bitte benutze die Passwort vergessen Funktion erneut.");
|
||||
}
|
||||
|
||||
|
||||
//Überprüfe den Passwortcode
|
||||
if(sha1($code) != $user['passwortcode']) {
|
||||
error("Der übergebene Code war ungültig. Stell sicher, dass du den genauen Link in der URL aufgerufen hast. Solltest du mehrmals die Passwort-vergessen Funktion genutzt haben, so ruf den Link in der neuesten E-Mail auf.");
|
||||
}
|
||||
|
||||
//Der Code war korrekt, der Nutzer darf ein neues Passwort eingeben
|
||||
|
||||
if(isset($_GET['send'])) {
|
||||
$passwort = $_POST['passwort'];
|
||||
$passwort2 = $_POST['passwort2'];
|
||||
|
||||
if($passwort != $passwort2) {
|
||||
$msg = "Bitte identische Passwörter eingeben";
|
||||
} else { //Speichere neues Passwort und lösche den Code
|
||||
$passworthash = password_hash($passwort, PASSWORD_DEFAULT);
|
||||
$statement = $pdo->prepare("UPDATE users SET passwort = :passworthash, passwortcode = NULL, passwortcode_time = NULL WHERE id = :userid");
|
||||
$result = $statement->execute(array('passworthash' => $passworthash, 'userid'=> $userid ));
|
||||
|
||||
if($result) {
|
||||
$msg = "Dein Passwort wurde erfolgreich geändert";
|
||||
$showForm = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
|
||||
<div class="container small-container-500">
|
||||
|
||||
<h1>Neues Passwort vergeben</h1>
|
||||
<?php
|
||||
if(isset($msg)) {
|
||||
echo $msg;
|
||||
}
|
||||
|
||||
if($showForm):
|
||||
?>
|
||||
|
||||
<form action="?send=1&userid=<?php echo htmlentities($userid); ?>&code=<?php echo htmlentities($code); ?>" method="post">
|
||||
<label for="passwort">Bitte gib ein neues Passwort ein:</label><br>
|
||||
<input type="password" id="passwort" name="passwort" class="form-control" required><br>
|
||||
|
||||
<label for="passwort2">Passwort erneut eingeben:</label><br>
|
||||
<input type="password" id="passwort2" name="passwort2" class="form-control" required><br>
|
||||
|
||||
<input type="submit" value="Passwort speichern" class="btn btn-lg btn-primary btn-block">
|
||||
</form>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
|
||||
</div> <!-- /container -->
|
||||
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
111
source/register.php
Executable file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
include("templates/header.inc.php")
|
||||
?>
|
||||
<div class="container main-container registration-form">
|
||||
<h1>Registrierung</h1>
|
||||
<?php
|
||||
echo mb_internal_encoding();
|
||||
|
||||
$showFormular = true; //Variable ob das Registrierungsformular anezeigt werden soll
|
||||
|
||||
if(isset($_GET['register'])) {
|
||||
$error = false;
|
||||
$vorname = trim($_POST['vorname']);
|
||||
$nachname = trim($_POST['nachname']);
|
||||
$email = trim($_POST['email']);
|
||||
$passwort = $_POST['passwort'];
|
||||
$passwort2 = $_POST['passwort2'];
|
||||
|
||||
if(empty($vorname) || empty($nachname) || empty($email)) {
|
||||
echo 'Bitte alle Felder ausfüllen<br>';
|
||||
$error = true;
|
||||
}
|
||||
|
||||
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
echo 'Bitte eine gültige E-Mail-Adresse eingeben<br>';
|
||||
$error = true;
|
||||
}
|
||||
if(strlen($passwort) == 0) {
|
||||
echo 'Bitte ein Passwort angeben<br>';
|
||||
$error = true;
|
||||
}
|
||||
if($passwort != $passwort2) {
|
||||
echo 'Die Passwörter müssen übereinstimmen<br>';
|
||||
$error = true;
|
||||
}
|
||||
|
||||
//Überprüfe, dass die E-Mail-Adresse noch nicht registriert wurde
|
||||
if(!$error) {
|
||||
|
||||
$statement = $pdo->prepare("SELECT * FROM users WHERE email = :email");
|
||||
$result = $statement->execute(array('email' => $email));
|
||||
$user = $statement->fetch();
|
||||
|
||||
if($user !== false) {
|
||||
echo 'Diese E-Mail-Adresse ist bereits vergeben<br>';
|
||||
$error = true;
|
||||
}
|
||||
}
|
||||
|
||||
//Keine Fehler, wir können den Nutzer registrieren
|
||||
if(!$error) {
|
||||
$passwort_hash = password_hash($passwort, PASSWORD_DEFAULT);
|
||||
|
||||
$statement = $pdo->prepare("INSERT INTO users (email, passwort, vorname, nachname) VALUES (:email, :passwort, :vorname, :nachname)");
|
||||
$result = $statement->execute(array('email' => $email, 'passwort' => $passwort_hash, 'vorname' => $vorname, 'nachname' => $nachname));
|
||||
|
||||
if($result) {
|
||||
echo 'Du wurdest erfolgreich registriert. <a href="login.php">Zum Login</a>';
|
||||
$showFormular = false;
|
||||
} else {
|
||||
echo 'Beim Abspeichern ist leider ein Fehler aufgetreten<br>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($showFormular) {
|
||||
?>
|
||||
|
||||
<form action="?register=1" method="post">
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputVorname">Vorname:</label>
|
||||
<input type="text" id="inputVorname" size="40" maxlength="250" name="vorname" class="form-control" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputNachname">Nachname:</label>
|
||||
<input type="text" id="inputNachname" size="40" maxlength="250" name="nachname" class="form-control" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputEmail">E-Mail:</label>
|
||||
<input type="email" id="inputEmail" size="40" maxlength="250" name="email" class="form-control" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputPasswort">Dein Passwort:</label>
|
||||
<input type="password" id="inputPasswort" size="40" maxlength="250" name="passwort" class="form-control" required>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputPasswort2">Passwort wiederholen:</label>
|
||||
<input type="password" id="inputPasswort2" size="40" maxlength="250" name="passwort2" class="form-control" required>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-lg btn-primary btn-block">Registrieren</button>
|
||||
</form>
|
||||
|
||||
<?php
|
||||
} //Ende von if($showFormular)
|
||||
|
||||
|
||||
?>
|
||||
</div>
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
34
source/robots.txt
Normal file
@@ -0,0 +1,34 @@
|
||||
# ===================================
|
||||
# Generator: http://pixelfolk.net/tools/robots
|
||||
# Erstellt am: 06.10.2021, 19:48
|
||||
# Webseite: http://http://urbanis.openeye.app
|
||||
# ===================================
|
||||
|
||||
|
||||
# ===================================
|
||||
# Folgende Seiten sollen nicht indexiert werden:
|
||||
# ===================================
|
||||
|
||||
User-agent: *
|
||||
Disallow: /cgi-bin/
|
||||
Disallow: /templates/
|
||||
Disallow: /inc/
|
||||
Disallow: /logout.php
|
||||
Disallow: /meldung.php
|
||||
Disallow: /passwortvergessen.php
|
||||
Disallow: /passwortzuruecksetzen.php
|
||||
Disallow: /register.php
|
||||
Disallow: /settings.php
|
||||
|
||||
# ===================================
|
||||
# Schließe folgende Spider komplett aus:
|
||||
# ===================================
|
||||
|
||||
User-agent: WebReaper
|
||||
User-agent: WebCopier
|
||||
User-agent: Offline Explorer
|
||||
User-agent: HTTrack
|
||||
User-agent: Microsoft.URL.Control
|
||||
User-agent: EmailCollector
|
||||
User-agent: penthesilea
|
||||
Disallow: /
|
||||
229
source/settings.php
Executable file
@@ -0,0 +1,229 @@
|
||||
<?php
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
//Überprüfe, dass der User eingeloggt ist
|
||||
//Der Aufruf von check_user() muss in alle internen Seiten eingebaut sein
|
||||
$user = check_user();
|
||||
|
||||
include("templates/header.inc.php");
|
||||
|
||||
if(isset($_GET['save'])) {
|
||||
$save = $_GET['save'];
|
||||
|
||||
if($save == 'personal_data') {
|
||||
$vorname = trim($_POST['vorname']);
|
||||
$nachname = trim($_POST['nachname']);
|
||||
|
||||
if($vorname == "" || $nachname == "") {
|
||||
$error_msg = "Bitte Vor- und Nachname ausfüllen.";
|
||||
} else {
|
||||
$statement = $pdo->prepare("UPDATE users SET vorname = :vorname, nachname = :nachname, updated_at=NOW() WHERE id = :userid");
|
||||
$result = $statement->execute(array('vorname' => $vorname, 'nachname'=> $nachname, 'userid' => $user['id'] ));
|
||||
|
||||
$success_msg = "Daten erfolgreich gespeichert.";
|
||||
}
|
||||
} else if($save == 'email') {
|
||||
$passwort = $_POST['passwort'];
|
||||
$email = trim($_POST['email']);
|
||||
$email2 = trim($_POST['email2']);
|
||||
|
||||
if($email != $email2) {
|
||||
$error_msg = "Die eingegebenen E-Mail-Adressen stimmten nicht überein.";
|
||||
} else if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$error_msg = "Bitte eine gültige E-Mail-Adresse eingeben.";
|
||||
} else if(!password_verify($passwort, $user['passwort'])) {
|
||||
$error_msg = "Bitte korrektes Passwort eingeben.";
|
||||
} else {
|
||||
$statement = $pdo->prepare("UPDATE users SET email = :email WHERE id = :userid");
|
||||
$result = $statement->execute(array('email' => $email, 'userid' => $user['id'] ));
|
||||
|
||||
$success_msg = "E-Mail-Adresse erfolgreich gespeichert.";
|
||||
}
|
||||
|
||||
} else if($save == 'passwort') {
|
||||
$passwortAlt = $_POST['passwortAlt'];
|
||||
$passwortNeu = trim($_POST['passwortNeu']);
|
||||
$passwortNeu2 = trim($_POST['passwortNeu2']);
|
||||
|
||||
if($passwortNeu != $passwortNeu2) {
|
||||
$error_msg = "Die eingegebenen Passwörter stimmten nicht überein.";
|
||||
} else if($passwortNeu == "") {
|
||||
$error_msg = "Das Passwort darf nicht leer sein.";
|
||||
} else if(!password_verify($passwortAlt, $user['passwort'])) {
|
||||
$error_msg = "Bitte korrektes Passwort eingeben.";
|
||||
} else {
|
||||
$passwort_hash = password_hash($passwortNeu, PASSWORD_DEFAULT);
|
||||
|
||||
$statement = $pdo->prepare("UPDATE users SET passwort = :passwort WHERE id = :userid");
|
||||
$result = $statement->execute(array('passwort' => $passwort_hash, 'userid' => $user['id'] ));
|
||||
|
||||
$success_msg = "Passwort erfolgreich gespeichert.";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$user = check_user();
|
||||
|
||||
?>
|
||||
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
<h2>Einstellungen</h2>
|
||||
|
||||
<?php
|
||||
if(isset($success_msg) && !empty($success_msg)):
|
||||
?>
|
||||
<div class="alert alert-success alert-dismissible fade show" role="alert">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
<?php echo $success_msg; ?>
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
|
||||
<?php
|
||||
if(isset($error_msg) && !empty($error_msg)):
|
||||
?>
|
||||
<div class="alert alert-danger alert-dismissible fade show" role="alert">
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
|
||||
<?php echo $error_msg; ?>
|
||||
</div>
|
||||
<?php
|
||||
endif;
|
||||
?>
|
||||
|
||||
<div>
|
||||
|
||||
|
||||
<ul class="nav nav-tabs" id="myTab" role="tablist">
|
||||
<!-- <li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="data-tab" data-bs-toggle="tab" data-bs-target="#data" type="button" role="tab" aria-controls="data" aria-selected="true">Persönliche Daten</button>
|
||||
</li> -->
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link active" id="email-tab" data-bs-toggle="tab" data-bs-target="#email" type="button" role="tab" aria-controls="email" aria-selected="false">E-Mail</button>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation">
|
||||
<button class="nav-link" id="passwort-tab" data-bs-toggle="tab" data-bs-target="#passwort" type="button" role="tab" aria-controls="passwort" aria-selected="false">Passwort</button>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="tab-content" id="myTabContent">
|
||||
<!-- <div class="tab-pane fade show active" id="data" role="tabpanel" aria-labelledby="data-tab">
|
||||
<br>
|
||||
<form action="?save=personal_data" method="post" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
<label for="inputVorname" class="col-sm-2 control-label">Vorname</label>
|
||||
<div class="col-sm-10">
|
||||
<input class="form-control" id="inputVorname" name="vorname" type="text" value="<?php echo htmlentities($user['vorname']); ?>" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="inputNachname" class="col-sm-2 control-label">Nachname</label>
|
||||
<div class="col-sm-10">
|
||||
<input class="form-control" id="inputNachname" name="nachname" type="text" value="<?php echo htmlentities($user['nachname']); ?>" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div> -->
|
||||
<div class="tab-pane fade show active" id="email" role="tabpanel" aria-labelledby="email-tab">
|
||||
<br>
|
||||
<p>Zum Ändern der E-Mail-Adresse bitte das aktuelles Passwort sowie die neue E-Mail-Adresse eingeben.</p>
|
||||
<form action="?save=email" method="post" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputPasswort" placeholder="Passwort" name="passwort" type="password" required>
|
||||
<label for="inputPasswort" class="col-sm-2 control-label">Passwort</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group ">
|
||||
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputEmail" placeholder="E-Mail" name="email" type="email" value="<?php echo htmlentities($user['email']); ?>" required>
|
||||
<label for="inputEmail" >E-Mail</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputEmail2" placeholder="E-Mail (wiederholen)" name="email2" type="email" required>
|
||||
<label for="inputEmail2">E-Mail (wiederholen)</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="tab-pane fade" id="passwort" role="tabpanel" aria-labelledby="contact-tab">
|
||||
<br />
|
||||
<p>Zum Ändern des Passworts bitte das aktuelles Passwort sowie das neue Passwort eingeben.</p>
|
||||
<form action="?save=passwort" method="post" class="form-horizontal">
|
||||
<div class="form-group">
|
||||
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputPasswort" name="passwortAlt" placeholder="Aktuelles Passwort" type="password" required>
|
||||
<label for="inputPasswort">Aktuelles Passwort</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputPasswortNeu" name="passwortNeu" placeholder="Neues Passwort" type="password" required>
|
||||
<label for="inputPasswortNeu">Neues Passwort</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-10 form-floating">
|
||||
<input class="form-control" id="inputPasswortNeu2" name="passwortNeu2" type="password" placeholder="Neues Passwort (wiederholen)" required>
|
||||
<label for="inputPasswortNeu2" >Neues Passwort (wiederholen)</label>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-2 col-sm-10">
|
||||
<button type="submit" class="btn btn-primary">Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
20
source/site.webmanifest
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
"name": "OpenEye",
|
||||
"short_name": "OpenEye",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#ffe500",
|
||||
"background_color": "#ffe500",
|
||||
"start_url": "https://urbanis.openeye.app/meldung.php",
|
||||
"display": "standalone"
|
||||
}
|
||||
521
source/start.php
Executable file
@@ -0,0 +1,521 @@
|
||||
<?php
|
||||
header('Content-Type: text/html; charset=utf-8');
|
||||
session_start();
|
||||
require_once("inc/config.inc.php");
|
||||
require_once("inc/functions.inc.php");
|
||||
|
||||
//Überprüfe, dass der User eingeloggt ist
|
||||
//Der Aufruf von check_user() muss in alle internen Seiten eingebaut sein
|
||||
$user = check_user();
|
||||
|
||||
use PHPMailer\PHPMailer\PHPMailer;
|
||||
use PHPMailer\PHPMailer\SMTP;
|
||||
use PHPMailer\PHPMailer\Exception;
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
$bahnhof = "";
|
||||
if (array_key_exists('bahnhof', $_POST)) {
|
||||
date_default_timezone_set('Europe/Berlin');
|
||||
|
||||
$timestamp = time();
|
||||
$datum = date("d.m.Y - H:i", $timestamp);
|
||||
$datum_kurz = date("Ymd", $timestamp);
|
||||
|
||||
|
||||
$err = false;
|
||||
$msg = '';
|
||||
$email = '';
|
||||
$honey = '';
|
||||
mb_internal_encoding("UTF-8");
|
||||
$maxDim = 1200;
|
||||
|
||||
//Apply some basic validation and filtering to the subject
|
||||
if (array_key_exists('bahnhof', $_POST)) {
|
||||
$bahnhof = substr(strip_tags($_POST['bahnhof']), 0, 255);
|
||||
} else {
|
||||
$bahnhof = 'Kein Bahnhof';
|
||||
}
|
||||
|
||||
if (array_key_exists('userfile', $_FILES) AND !empty($_FILES['userfile']['tmp_name'])) {
|
||||
$file_name = $_FILES['userfile']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename = $file_name;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename = $file_name;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile2', $_FILES) AND !empty($_FILES['userfile2']['tmp_name'])) {
|
||||
$file_name2 = $_FILES['userfile2']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name2 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename2 = $file_name2;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name2 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename2 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename2 = $file_name2;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile3', $_FILES) AND !empty($_FILES['userfile3']['tmp_name'])) {
|
||||
$file_name3 = $_FILES['userfile3']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name3 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename3 = $file_name3;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name3 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename3 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename3 = $file_name3;
|
||||
}
|
||||
}
|
||||
if (array_key_exists('userfile4', $_FILES) AND !empty($_FILES['userfile4']['tmp_name'])) {
|
||||
$file_name4 = $_FILES['userfile4']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name4 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename4 = $file_name4;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name4 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename4 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename4 = $file_name4;
|
||||
}
|
||||
}
|
||||
|
||||
if (array_key_exists('userfile5', $_FILES) AND !empty($_FILES['userfile5']['tmp_name'])) {
|
||||
// Auf Bilder beschränken!
|
||||
// alter code
|
||||
// $ext5 = PHPMailer::mb_pathinfo($_FILES['userfile5']['name'], PATHINFO_EXTENSION);
|
||||
// $uploadfile5 = tempnam(sys_get_temp_dir(), hash('sha256', $_FILES['userfile5']['name'])) . '.' . $ext5;
|
||||
$file_name5 = $_FILES['userfile5']['tmp_name'];
|
||||
list($width, $height, $type, $attr) = getimagesize( $file_name5 );
|
||||
if ( $width > $maxDim || $height > $maxDim ) {
|
||||
$target_filename5 = $file_name5;
|
||||
$ratio = $width/$height;
|
||||
if( $ratio > 1) {
|
||||
$new_width = $maxDim;
|
||||
$new_height = $maxDim/$ratio;
|
||||
} else {
|
||||
$new_width = $maxDim*$ratio;
|
||||
$new_height = $maxDim;
|
||||
}
|
||||
$src = imagecreatefromstring( file_get_contents( $file_name5 ) );
|
||||
$dst = imagecreatetruecolor( $new_width, $new_height );
|
||||
imagecopyresampled( $dst, $src, 0, 0, 0, 0, $new_width, $new_height, $width, $height );
|
||||
imagedestroy( $src );
|
||||
imagejpeg( $dst, $target_filename5 ); // adjust format as needed
|
||||
imagedestroy( $dst );
|
||||
}
|
||||
else {
|
||||
$target_filename5 = $file_name5;
|
||||
}
|
||||
}
|
||||
//Apply some basic validation and filtering to the name
|
||||
if (array_key_exists('muell', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_status = substr(strip_tags($_POST['muell']), 0, 255);
|
||||
} else {
|
||||
$muell_status = '';
|
||||
}
|
||||
if (array_key_exists('muell-tech-maengel-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_maengel = substr(strip_tags($_POST['muell-tech-maengel-text']), 0, 500);
|
||||
} else {
|
||||
$muell_maengel = '';
|
||||
}
|
||||
if (array_key_exists('muell-sonstiges-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$muell_sonstiges = substr(strip_tags($_POST['muell-sonstiges-text']), 0, 500);
|
||||
} else {
|
||||
$muell_sonstiges = '';
|
||||
}
|
||||
if (array_key_exists('wc', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$wc_status = substr(strip_tags($_POST['wc']), 0, 255);
|
||||
} else {
|
||||
$wc_status = '';
|
||||
}
|
||||
if (array_key_exists('wc-tech-maengel-text', $_POST)) {
|
||||
//Limit length and strip HTML tags
|
||||
$wc_maengel = substr(strip_tags($_POST['wc-tech-maengel-text']), 0, 500);
|
||||
|
||||
}
|
||||
if (array_key_exists('wc-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$wc_sonstiges =substr(strip_tags($_POST['wc-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('miete-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$miete_sonstiges =substr(strip_tags($_POST['miete-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('miete', $_POST)) {
|
||||
$miete_status = substr(strip_tags($_POST['miete']), 0, 255);
|
||||
} else {
|
||||
$miete_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('automaten', $_POST)) {
|
||||
$automaten_status = substr(strip_tags($_POST['automaten']), 0, 255);
|
||||
} else {
|
||||
$automaten_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('werbeflaechen', $_POST)) {
|
||||
$werbeflaechen_status = substr(strip_tags($_POST['werbeflaechen']), 0, 255);
|
||||
} else {
|
||||
$werbeflaechen_status = '';
|
||||
}
|
||||
|
||||
if (array_key_exists('automaten-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$automaten_sonstiges =substr(strip_tags($_POST['automaten-sonstiges-text']), 0, 500);
|
||||
}
|
||||
if (array_key_exists('werbeflaechen-sonstiges-text', $_POST)) {
|
||||
|
||||
//Limit length and strip HTML tags
|
||||
$werbeflaechen_sonstiges =substr(strip_tags($_POST['werbeflaechen-sonstiges-text']), 0, 500);
|
||||
}
|
||||
|
||||
|
||||
|
||||
//honeypot
|
||||
if (array_key_exists('email', $_POST)) {
|
||||
$honey = substr(strip_tags($_POST['email']), 0, 255);
|
||||
if (!$honey) {
|
||||
|
||||
$err = false;
|
||||
}
|
||||
else {
|
||||
$err = true;
|
||||
}
|
||||
}
|
||||
if (!$err) {
|
||||
//$to = 'info@davidt.de'; // für Tests
|
||||
//$to = 'davidt@urbanis-berlin.de'; // live-test
|
||||
//$ ip = getenv("REMOTE_ADDR") ; // für Tests
|
||||
|
||||
|
||||
//holt den betreuer als array $betreuer['betreuer'] aus der DB zum passenden Bahnhof
|
||||
$sql = "SELECT * FROM `standorte` WHERE `bahnhof` = '".$bahnhof."';";
|
||||
$betreuer = $pdo->query($sql)->fetch();
|
||||
|
||||
$werbeflaechen_betreuer='wegener@urbanis-berlin.de';
|
||||
$werbeflaechen_betreuer2='menke@urbanis-berlin.de';
|
||||
$automaten_betreuer='breuer@urbanis-berlin.de';
|
||||
|
||||
|
||||
$mail = new PHPMailer(true);
|
||||
|
||||
try {
|
||||
$mail->isSMTP();
|
||||
//$mail->SMTPDebug = 2; // für tests
|
||||
|
||||
$mail->Host = 'webspace.linevast.de';
|
||||
$mail->Port = 587;
|
||||
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = 'urbanis@openeye.app';
|
||||
$mail->Password = 'YKW6vTaNwx9JKvH3s';
|
||||
$mail->CharSet = PHPMailer::CHARSET_UTF8;
|
||||
$mail->setLanguage('de');
|
||||
$mail->setFrom('urbanis@openeye.app', 'OpenEye App '); //noch anpassen
|
||||
//$mail->addAddress($to); //test
|
||||
$mail->addAddress($betreuer['betreuer'], $betreuer['Vorname']. " " .$betreuer['Nachname']); //Live
|
||||
$mail->addCC($user['email'], $user['vorname']. " " .$user['nachname'] ); //Live
|
||||
$mail->addReplyTo($user['email'], $user['vorname']. " " .$user['nachname'] ); //Live)
|
||||
$mail->addBCC('patrick@davidt.de'); //test
|
||||
if (strcasecmp($werbeflaechen_status,"wurde nicht kontrolliert") !==0) {
|
||||
$mail->addCC($werbeflaechen_betreuer, 'Thomas Wegener'); //live
|
||||
$mail->addCC($werbeflaechen_betreuer2, 'Henning Menke');
|
||||
$werbeflaechen_status .= " (Thomas Wegener und Henning Menke im cc)";
|
||||
}
|
||||
if (strcasecmp($automaten_status,"wurde nicht kontrolliert") !==0) {
|
||||
$mail->addCC($automaten_betreuer, 'Mike Breuer' ); //live
|
||||
$automaten_status .= " (Mike Breuer im cc)";
|
||||
}
|
||||
|
||||
$mail->Subject = '[Begehungsnotiz] ' . $bahnhof;
|
||||
if (isset($target_filename)){
|
||||
$mail->addAttachment($target_filename, $datum_kurz . "_" . substr($bahnhof,6) .'.jpg');}
|
||||
if (isset($target_filename2)){
|
||||
$mail->addAttachment($target_filename2, $datum_kurz . "_" . substr($bahnhof,6) .' 2.jpg');}
|
||||
if (isset($target_filename3)){
|
||||
$mail->addAttachment($target_filename3, $datum_kurz . "_" . substr($bahnhof,6) .' 3.jpg');}
|
||||
if (isset($target_filename4)){
|
||||
$mail->addAttachment($target_filename4, $datum_kurz . "_" . substr($bahnhof,6) .' 4.jpg');}
|
||||
if (isset($target_filename5)){
|
||||
$mail->addAttachment($target_filename5, $datum_kurz . "_" . substr($bahnhof,6) .' 5.jpg');}
|
||||
|
||||
|
||||
|
||||
$mail->Body = "Hallo ".$betreuer['Vorname']. " " .$betreuer['Nachname'].",\n\nfür " . $bahnhof . " wurde am " . $datum . " von " . $user['vorname'] . " " . $user['nachname'] . " eine Meldung mit folgendem Inhalt abgesetzt.\n\n Müllraum:\n" . $muell_status . "\n" . $muell_maengel . $muell_sonstiges ."\n\n WC-Anlage:\n" . $wc_status . "\n" . $wc_maengel . $wc_sonstiges . "\n\n Mietobjekte:\n" . $miete_status . "\n" . $miete_sonstiges . "\n\n Automaten:\n" . $automaten_status ."\n" . $automaten_sonstiges . "\n\n Werbeflächen:\n" . $werbeflaechen_status . "\n" . $werbeflaechen_sonstiges . "\n\n -- \n Diese E-Mail wurde über https://urbanis.openeye.app von gesendet.\n\n Wenn Sie die Antwortfunktion Ihres E-Mailclients nutzen, wird diese Antwort direkt an " . $user['vorname'] . " " . $user['nachname']." (". $user['email'].") zugestellt.";
|
||||
$mail->send();
|
||||
$msg .= 'Meldung übermittelt. <a href="/meldung.php">Weitere Meldung absetzen</a>?';;
|
||||
// error_log(PHP_EOL. $datum . " | Absender: " . $email . " | Betreff: " . $query . " | gesendet an: " . $to , 3, "emails.log");
|
||||
} catch (Exception $e) {
|
||||
$msg .= 'Fehler beim Versand: ' . $e->errorMessage(); //Pretty error messages from PHPMailer
|
||||
} catch (\Exception $e) { //The leading slash means the Global PHP Exception class will be caught
|
||||
$msg .= 'Fehler beim Versand: ' . $e->getMessage(); //Boring error messages from anything else!
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
include("templates/header.inc.php");
|
||||
?>
|
||||
|
||||
<div class="container-fluid bg-body w-100 mb-3"></div>
|
||||
<div class="container-fluid">
|
||||
<div class="container-md border rounded-3 bg-light px-5 py-4">
|
||||
<?php if (empty($msg)) { ?>
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
<h2>Begehungsnotiz</h2>
|
||||
<p>angemeldet: <?php echo htmlentities($user['vorname']); ?> <?php echo htmlentities($user['nachname']); ?></p>
|
||||
<!-- honeypot -->
|
||||
<div class="kontaktmail" style="display:none"><label for="email">email
|
||||
<input type="email" name="email" id="email" value="" placeholder="E-Mail-Adresse (Pflichtfeld)" autocomplete="off" /></label>
|
||||
</div>
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Standort</h5>
|
||||
</div>
|
||||
<div class="col-sm-4 mb-3">
|
||||
<select class="form-select" aria-label="bahnhof" name="bahnhof" id="bahnhof" required>
|
||||
<option value="">- Bahnhof auswählen -</option>
|
||||
<?php
|
||||
$sql = "SELECT bahnhof FROM `standorte`;";
|
||||
foreach ($pdo->query($sql) as $row) {
|
||||
echo "<option value='" . $row['bahnhof'] . "'>" . $row['bahnhof'] . "</option>";
|
||||
}
|
||||
?>
|
||||
</select>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Müllraum</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" id="muell-keine-meldung" onclick="javascript:yesnoCheck();" name="muell" value="wurde nicht kontrolliert">
|
||||
<label for="muell-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-io" name="muell" value="in Ordnung" required>
|
||||
<label for="muell-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-reinigung-erf" name="muell" value="Reinigung erforderlich">
|
||||
<label for="muell-reinigung-erf">Reinigung erforderlich</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input class="form-check-input" type="radio" onclick="javascript:yesnoCheck();" id="muell-tech-maengel" name="muell" value="hat folgende technische Mängel:">
|
||||
<label for="muell-tech-maengel">Technische Mängel</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input class="form-check-input" type="radio" id="muell-sonstiges" onclick="javascript:yesnoCheck();" name="muell" value="sonstige Anmerkungen:">
|
||||
<label for="muell-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes" style="display:none">
|
||||
<textarea class="form-control" name="muell-tech-maengel-text" id="muell-tech-maengel-text" placeholder="Technische Mängel beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes2" style="display:none">
|
||||
<textarea class="form-control" name="muell-sonstiges-text" id="muell-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>WC-Anlagen</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="wc-keine-meldung" onclick="javascript:yesnoCheck();" name="wc" value="wurde nicht kontrolliert">
|
||||
<label for="wc-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-io" name="wc" value="in Ordnung" required>
|
||||
<label for="wc-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-reinigung-erf" name="wc" value="Reinigung erforderlich">
|
||||
<label for="wc-reinigung-erf">Reinigung erforderlich</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="wc-tech-maengel" name="wc" value="hat folgende technische Mängel:">
|
||||
<label for="wc-tech-maengel">Technische Mängel</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="wc-sonstiges" onclick="javascript:yesnoCheck();" name="wc" value="sonstige Anmerkungen:">
|
||||
<label for="wc-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
|
||||
<div class="col-12 form-check" id="ifYes3" style="display:none">
|
||||
<textarea class="form-control" name="wc-tech-maengel-text" id="wc-tech-maengel-text" placeholder="Technische Mängel beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes4" style="display:none">
|
||||
<textarea class="form-control" name="wc-sonstiges-text" id="wc-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="gy-4 col-12">
|
||||
<h5>Mietobjekte</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="miete-keine-meldung" onclick="javascript:yesnoCheck();" name="miete" value="wurde nicht kontrolliert">
|
||||
<label for="miete-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="miete-io" name="miete" value="in Ordnung" required>
|
||||
<label for="miete-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" id="miete-sonstiges" onclick="javascript:yesnoCheck();" name="miete" value="sonstige Anmerkungen:">
|
||||
<label for="miete-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes5" style="display:none">
|
||||
<textarea class="form-control" name="miete-sonstiges-text" id="miete-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Automaten</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="automaten-keine-meldung" onclick="javascript:yesnoCheck();" name="automaten" value="wurde nicht kontrolliert">
|
||||
<label for="automaten-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="automaten-io" name="automaten" value="in Ordnung" required>
|
||||
<label for="automaten-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-3 form-check">
|
||||
<input type="radio" class="form-check-input" id="automaten-sonstiges" onclick="javascript:yesnoCheck();" name="automaten" value="sonstige Anmerkungen:">
|
||||
<label for="automaten-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes6" style="display:none">
|
||||
<textarea class="form-control" name="automaten-sonstiges-text" id="automaten-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Werbeflächen</h5>
|
||||
</div>
|
||||
<div class="container-fluid mb-3">
|
||||
<div class="row">
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="werbeflaechen-keine-meldung" onclick="javascript:yesnoCheck();" name="werbeflaechen" value="wurde nicht kontrolliert" required>
|
||||
<label for="werbeflaechen-keine-meldung">keine Meldung</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" onclick="javascript:yesnoCheck();" id="werbeflaechen-io" name="werbeflaechen" value="in Ordnung">
|
||||
<label for="werbeflaechen-io">i.O.</label>
|
||||
</div>
|
||||
<div class="col-sm-2 form-check">
|
||||
<input type="radio" class="form-check-input" id="werbeflaechen-sonstiges" onclick="javascript:yesnoCheck();" name="werbeflaechen" value="sonstige Anmerkungen:">
|
||||
<label for="werbeflaechen-sonstiges">Sonstiges</label>
|
||||
</div>
|
||||
<div class="col-12 form-check" id="ifYes7" style="display:none">
|
||||
<textarea class="form-control" name="werbeflaechen-sonstiges-text" id="werbeflaechen-sonstiges-text" placeholder="Sonstiges beschreiben" rows="6"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Break -->
|
||||
<div class="col-12 gy-4">
|
||||
<h5>Fotos</h5><small>(nur JPG, Anhänge werden autom. verkleinert)</small>
|
||||
</div>
|
||||
<div class="col-sm-6 form-check" id="upload">
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" onchange="OnFileValidation()" name="userfile" id="file" type="file"><br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile2" type="file"> <br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm"name="userfile3" type="file"><br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile4" type="file"> <br />
|
||||
<input type="hidden" name="MAX_FILE_SIZE" value="5000000">
|
||||
<input class="form-control form-control-sm" name="userfile5" type="file"><br />
|
||||
</div>
|
||||
<div class="col-8"></div>
|
||||
|
||||
<!-- Break -->
|
||||
<div class="col-sm-6 col-md-3 btn-toolbar justify-content-between" role="toolbar" aria-label="Toolbar with button groups">
|
||||
<div class="btn-group" role="group" aria-label="First group">
|
||||
<input class="form-control btn btn-primary " type="submit" value="Absenden" />
|
||||
</div>
|
||||
<div class="btn-group" role="group" aria-label="second group">
|
||||
<input class="form-control btn btn-secondary" type="reset" value="zurücksetzen" />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<?php }
|
||||
else {
|
||||
echo $msg;
|
||||
} ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php
|
||||
include("templates/footer.inc.php")
|
||||
?>
|
||||
5
source/templates/error.inc.php
Executable file
@@ -0,0 +1,5 @@
|
||||
<div class="container">
|
||||
<h2>Fehler</h2>
|
||||
|
||||
<?php echo $error_msg; ?>
|
||||
</div>
|
||||
27
source/templates/footer.inc.php
Executable file
@@ -0,0 +1,27 @@
|
||||
|
||||
<div class="container">
|
||||
|
||||
|
||||
<footer class="py-3 my-4">
|
||||
<p class="text-center text-muted">made with <i class="fas fa-heart"></i> in Potsdam</p>
|
||||
<p title="Zuverlässiges Webhosting und IT-Services aus Potsdam" class="text-center text-muted">Hosting powered by <a class="text-muted" href="https://davidt.cloud" title="Professionelles Webhosting und IT-Services von davidt.cloud">davidt.cloud</a></p>
|
||||
<ul class="nav justify-content-center border-top pb-3 mb-3">
|
||||
<li class="nav-item"><a class="nav-link px-2 text-muted" href="https://davidt.de" target="_blank" title="Professionelle Webentwicklung & Hosting von davidt.de">© 2025 davidt.de</a></li>
|
||||
<li class="nav-item"><a class="nav-link px-2 text-muted" href="/impressum.php" >Impressum</a></li>
|
||||
<li class="nav-item"><a class="nav-link px-2 text-muted" href="/datenschutz.php" >Datenschutz</a> </li>
|
||||
</ul>
|
||||
|
||||
</footer>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Bootstrap core JavaScript
|
||||
================================================== -->
|
||||
<!-- Placed at the end of the document so the pages load faster -->
|
||||
|
||||
<script src="/assets/js/bootstrap.bundle.min.js" type="text/javascript"></script>
|
||||
<script src="/assets/js/utils.js" type="text/javascript"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
67
source/templates/header.inc.php
Executable file
@@ -0,0 +1,67 @@
|
||||
<!doctype html>
|
||||
<html lang="de">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>urbanis OpenEye</title>
|
||||
<meta name="description" content="">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<meta property="og:title" content="">
|
||||
<meta property="og:type" content="">
|
||||
<meta property="og:url" content="">
|
||||
<meta property="og:image" content="">
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<meta name="apple-mobile-web-app-title" content="OpenEye">
|
||||
<meta name="application-name" content="OpenEye">
|
||||
<meta name="msapplication-TileColor" content="#ffe500">
|
||||
<!-- <meta name="theme-color" content="#ffe500"> -->
|
||||
<link rel="stylesheet" href="assets/css/bootstrap.css">
|
||||
<meta name="theme-color" content="#fafafa">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<nav class="navbar navbar-expand-md navbar-light bg-light me-auto">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" href="index.php"><b>urbanis</b>.openeye</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<?php if(!is_checked_in()): ?>
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarCollapse">
|
||||
<ul class="navbar-nav me-2 mb-2 mb-md-0">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link active" aria-current="page" href="index.php">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" disabled>Meldung</a>
|
||||
</li>
|
||||
<!-- <li class="nav-item">
|
||||
<a class="nav-link" disabled>Einstellungen</a>
|
||||
</li> -->
|
||||
</ul>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<div class="collapse navbar-collapse justify-content-end" id="navbarCollapse">
|
||||
<ul class="navbar-nav me-2 mb-2 mb-md-0">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="index.php">Home</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="meldung.php">Meldung</a>
|
||||
</li>
|
||||
<!-- <li class="nav-item">
|
||||
<a class="nav-link" href="/settings">Einstellungen</a>
|
||||
</li> -->
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="logout.php">Logout</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</nav>
|
||||