sync
This commit is contained in:
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "quaxlyqueen/vintagecoding.net",
|
|
||||||
"description": "A blog and tutorial site.",
|
|
||||||
"type": "project",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Quaxlyqueen\\VintagecodingNet\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Josh Ashton",
|
|
||||||
"email": "me@joshashton.dev"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"require": {
|
|
||||||
"vlucas/phpdotenv": "^5.6"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Generated
-479
@@ -1,479 +0,0 @@
|
|||||||
{
|
|
||||||
"_readme": [
|
|
||||||
"This file locks the dependencies of your project to a known state",
|
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
|
||||||
"This file is @generated automatically"
|
|
||||||
],
|
|
||||||
"content-hash": "221cfbdaafd7336c85eb46b3ae913379",
|
|
||||||
"packages": [
|
|
||||||
{
|
|
||||||
"name": "graham-campbell/result-type",
|
|
||||||
"version": "v1.1.3",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/GrahamCampbell/Result-Type.git",
|
|
||||||
"reference": "3ba905c11371512af9d9bdd27d99b782216b6945"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/3ba905c11371512af9d9bdd27d99b782216b6945",
|
|
||||||
"reference": "3ba905c11371512af9d9bdd27d99b782216b6945",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2.5 || ^8.0",
|
|
||||||
"phpoption/phpoption": "^1.9.3"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"GrahamCampbell\\ResultType\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Graham Campbell",
|
|
||||||
"email": "hello@gjcampbell.co.uk",
|
|
||||||
"homepage": "https://github.com/GrahamCampbell"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "An Implementation Of The Result Type",
|
|
||||||
"keywords": [
|
|
||||||
"Graham Campbell",
|
|
||||||
"GrahamCampbell",
|
|
||||||
"Result Type",
|
|
||||||
"Result-Type",
|
|
||||||
"result"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/GrahamCampbell/Result-Type/issues",
|
|
||||||
"source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.1.3"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://github.com/GrahamCampbell",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-07-20T21:45:45+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "phpoption/phpoption",
|
|
||||||
"version": "1.9.3",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/schmittjoh/php-option.git",
|
|
||||||
"reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/schmittjoh/php-option/zipball/e3fac8b24f56113f7cb96af14958c0dd16330f54",
|
|
||||||
"reference": "e3fac8b24f56113f7cb96af14958c0dd16330f54",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": "^7.2.5 || ^8.0"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
|
||||||
"phpunit/phpunit": "^8.5.39 || ^9.6.20 || ^10.5.28"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"bamarni-bin": {
|
|
||||||
"bin-links": true,
|
|
||||||
"forward-command": false
|
|
||||||
},
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "1.9-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"PhpOption\\": "src/PhpOption/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"Apache-2.0"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Johannes M. Schmitt",
|
|
||||||
"email": "schmittjoh@gmail.com",
|
|
||||||
"homepage": "https://github.com/schmittjoh"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Graham Campbell",
|
|
||||||
"email": "hello@gjcampbell.co.uk",
|
|
||||||
"homepage": "https://github.com/GrahamCampbell"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Option Type for PHP",
|
|
||||||
"keywords": [
|
|
||||||
"language",
|
|
||||||
"option",
|
|
||||||
"php",
|
|
||||||
"type"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/schmittjoh/php-option/issues",
|
|
||||||
"source": "https://github.com/schmittjoh/php-option/tree/1.9.3"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://github.com/GrahamCampbell",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-07-20T21:41:07+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "symfony/polyfill-ctype",
|
|
||||||
"version": "v1.31.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/symfony/polyfill-ctype.git",
|
|
||||||
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638",
|
|
||||||
"reference": "a3cc8b044a6ea513310cbd48ef7333b384945638",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=7.2"
|
|
||||||
},
|
|
||||||
"provide": {
|
|
||||||
"ext-ctype": "*"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"ext-ctype": "For best performance"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"thanks": {
|
|
||||||
"url": "https://github.com/symfony/polyfill",
|
|
||||||
"name": "symfony/polyfill"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"files": [
|
|
||||||
"bootstrap.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Ctype\\": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Gert de Pagter",
|
|
||||||
"email": "BackEndTea@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Symfony Community",
|
|
||||||
"homepage": "https://symfony.com/contributors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Symfony polyfill for ctype functions",
|
|
||||||
"homepage": "https://symfony.com",
|
|
||||||
"keywords": [
|
|
||||||
"compatibility",
|
|
||||||
"ctype",
|
|
||||||
"polyfill",
|
|
||||||
"portable"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-09-09T11:45:10+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "symfony/polyfill-mbstring",
|
|
||||||
"version": "v1.31.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/symfony/polyfill-mbstring.git",
|
|
||||||
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341",
|
|
||||||
"reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=7.2"
|
|
||||||
},
|
|
||||||
"provide": {
|
|
||||||
"ext-mbstring": "*"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"ext-mbstring": "For best performance"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"thanks": {
|
|
||||||
"url": "https://github.com/symfony/polyfill",
|
|
||||||
"name": "symfony/polyfill"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"files": [
|
|
||||||
"bootstrap.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Mbstring\\": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Nicolas Grekas",
|
|
||||||
"email": "p@tchwork.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Symfony Community",
|
|
||||||
"homepage": "https://symfony.com/contributors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Symfony polyfill for the Mbstring extension",
|
|
||||||
"homepage": "https://symfony.com",
|
|
||||||
"keywords": [
|
|
||||||
"compatibility",
|
|
||||||
"mbstring",
|
|
||||||
"polyfill",
|
|
||||||
"portable",
|
|
||||||
"shim"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-09-09T11:45:10+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "symfony/polyfill-php80",
|
|
||||||
"version": "v1.31.0",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/symfony/polyfill-php80.git",
|
|
||||||
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
|
|
||||||
"reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"php": ">=7.2"
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"thanks": {
|
|
||||||
"url": "https://github.com/symfony/polyfill",
|
|
||||||
"name": "symfony/polyfill"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"files": [
|
|
||||||
"bootstrap.php"
|
|
||||||
],
|
|
||||||
"psr-4": {
|
|
||||||
"Symfony\\Polyfill\\Php80\\": ""
|
|
||||||
},
|
|
||||||
"classmap": [
|
|
||||||
"Resources/stubs"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"MIT"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Ion Bazan",
|
|
||||||
"email": "ion.bazan@gmail.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Nicolas Grekas",
|
|
||||||
"email": "p@tchwork.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Symfony Community",
|
|
||||||
"homepage": "https://symfony.com/contributors"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
|
|
||||||
"homepage": "https://symfony.com",
|
|
||||||
"keywords": [
|
|
||||||
"compatibility",
|
|
||||||
"polyfill",
|
|
||||||
"portable",
|
|
||||||
"shim"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://symfony.com/sponsor",
|
|
||||||
"type": "custom"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://github.com/fabpot",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-09-09T11:45:10+00:00"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "vlucas/phpdotenv",
|
|
||||||
"version": "v5.6.1",
|
|
||||||
"source": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/vlucas/phpdotenv.git",
|
|
||||||
"reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2"
|
|
||||||
},
|
|
||||||
"dist": {
|
|
||||||
"type": "zip",
|
|
||||||
"url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2",
|
|
||||||
"reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2",
|
|
||||||
"shasum": ""
|
|
||||||
},
|
|
||||||
"require": {
|
|
||||||
"ext-pcre": "*",
|
|
||||||
"graham-campbell/result-type": "^1.1.3",
|
|
||||||
"php": "^7.2.5 || ^8.0",
|
|
||||||
"phpoption/phpoption": "^1.9.3",
|
|
||||||
"symfony/polyfill-ctype": "^1.24",
|
|
||||||
"symfony/polyfill-mbstring": "^1.24",
|
|
||||||
"symfony/polyfill-php80": "^1.24"
|
|
||||||
},
|
|
||||||
"require-dev": {
|
|
||||||
"bamarni/composer-bin-plugin": "^1.8.2",
|
|
||||||
"ext-filter": "*",
|
|
||||||
"phpunit/phpunit": "^8.5.34 || ^9.6.13 || ^10.4.2"
|
|
||||||
},
|
|
||||||
"suggest": {
|
|
||||||
"ext-filter": "Required to use the boolean validator."
|
|
||||||
},
|
|
||||||
"type": "library",
|
|
||||||
"extra": {
|
|
||||||
"bamarni-bin": {
|
|
||||||
"bin-links": true,
|
|
||||||
"forward-command": false
|
|
||||||
},
|
|
||||||
"branch-alias": {
|
|
||||||
"dev-master": "5.6-dev"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"autoload": {
|
|
||||||
"psr-4": {
|
|
||||||
"Dotenv\\": "src/"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
|
||||||
"license": [
|
|
||||||
"BSD-3-Clause"
|
|
||||||
],
|
|
||||||
"authors": [
|
|
||||||
{
|
|
||||||
"name": "Graham Campbell",
|
|
||||||
"email": "hello@gjcampbell.co.uk",
|
|
||||||
"homepage": "https://github.com/GrahamCampbell"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Vance Lucas",
|
|
||||||
"email": "vance@vancelucas.com",
|
|
||||||
"homepage": "https://github.com/vlucas"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
|
|
||||||
"keywords": [
|
|
||||||
"dotenv",
|
|
||||||
"env",
|
|
||||||
"environment"
|
|
||||||
],
|
|
||||||
"support": {
|
|
||||||
"issues": "https://github.com/vlucas/phpdotenv/issues",
|
|
||||||
"source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1"
|
|
||||||
},
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"url": "https://github.com/GrahamCampbell",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
|
|
||||||
"type": "tidelift"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"time": "2024-07-20T21:52:34+00:00"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"packages-dev": [],
|
|
||||||
"aliases": [],
|
|
||||||
"minimum-stability": "stable",
|
|
||||||
"stability-flags": {},
|
|
||||||
"prefer-stable": false,
|
|
||||||
"prefer-lowest": false,
|
|
||||||
"platform": {},
|
|
||||||
"platform-dev": {},
|
|
||||||
"plugin-api-version": "2.6.0"
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
* {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.center-abs {
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
h1 {
|
||||||
|
font-size: clamp(4vw, 6vw, 8vw);
|
||||||
|
color: #00ee00;
|
||||||
|
}
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
/*
|
|
||||||
* Given some article data, create a card or thumbnail of the article with the
|
|
||||||
* following:
|
|
||||||
* - A thumbnail image,
|
|
||||||
* - The article heading,
|
|
||||||
* - A brief description,
|
|
||||||
* - A call to action button.
|
|
||||||
*/
|
|
||||||
function generate_article_card($data) {
|
|
||||||
$article = '
|
|
||||||
<div class="box shadow">
|
|
||||||
<img class="shadow thumbnail" src="' . $data['thumbnail'] . '">
|
|
||||||
<h3 class="card_heading">' . $data['heading'] . '</h3>
|
|
||||||
<p class="">' . $data['description'] . '</p>
|
|
||||||
<button href="' . $data['path'] . '">Read Article</button>
|
|
||||||
</div>
|
|
||||||
';
|
|
||||||
|
|
||||||
return $article;
|
|
||||||
}
|
|
||||||
?>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?php
|
|
||||||
echo '
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
';
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
include_once('includes/functions.php');
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Creates a form from an associative array of fields.
|
|
||||||
*
|
|
||||||
* See includes/input_validation.php for the structure of a fields array.
|
|
||||||
*/
|
|
||||||
function generate_form($fields, $error)
|
|
||||||
{
|
|
||||||
$form = '
|
|
||||||
<div class="standard_box outer_shadow form_container">
|
|
||||||
<form method="' . $fields['method'] . '" action="' . $fields['action'] . '">
|
|
||||||
';
|
|
||||||
|
|
||||||
foreach ($fields as $field => $metadata) {
|
|
||||||
if ($field == 'method' || $field == 'action')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
$form .= '
|
|
||||||
<div class="input_box inner_shadow">
|
|
||||||
<label for="' . $field . '">' . ucwords($metadata['label']) . '</label>
|
|
||||||
<input id="' . $field . '" name="' . $field . '" type="' . $metadata['type'] . '" placeholder="' . $metadata['placeholder'] . '">
|
|
||||||
</div>
|
|
||||||
';
|
|
||||||
}
|
|
||||||
|
|
||||||
$form .= '
|
|
||||||
<input type="submit" class="submit_button">
|
|
||||||
</form>
|
|
||||||
';
|
|
||||||
|
|
||||||
if (!empty($error)) {
|
|
||||||
$form .= '
|
|
||||||
<div class="standard_box inner_shadow error">
|
|
||||||
<p class="error">' . ucwords($error) . ' information!</p>
|
|
||||||
</div>
|
|
||||||
';
|
|
||||||
}
|
|
||||||
|
|
||||||
$form .= '
|
|
||||||
</div>
|
|
||||||
';
|
|
||||||
|
|
||||||
return $form;
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
echo '
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<title>Vintage Coding</title>
|
|
||||||
<link href="css/styles.css" type="text/css" rel="stylesheet">
|
|
||||||
<script src="js/index.js"></script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
';
|
|
||||||
include_once('nav.php');
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$nav = '
|
|
||||||
<nav>
|
|
||||||
<ul>
|
|
||||||
<li><a href="home.php">Home</a></li>
|
|
||||||
<li><a href="account.php">Account</a></li>
|
|
||||||
<li><a href="admin.php">Admin</a></li>
|
|
||||||
<li><a href="articles.php">Articles</a></li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
';
|
|
||||||
|
|
||||||
echo $nav;
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
<?php
|
|
||||||
$create_account_fields = [
|
|
||||||
'method' => 'post',
|
|
||||||
'action' => 'process.php?action=create_account',
|
|
||||||
'create_account_username' => [
|
|
||||||
'label' => 'username',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'e.g., jsmith',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'create_account_first_name' => [
|
|
||||||
'label' => 'first name',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'e.g., John',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'only_letters',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'create_account_last_name' => [
|
|
||||||
'label' => 'last name',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'e.g., Smith',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'only_letters',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'create_account_email' => [
|
|
||||||
'label' => 'email address',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'e.g., jsmith@email.com',
|
|
||||||
'validators' => [
|
|
||||||
'valid_email',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'create_account_password' => [
|
|
||||||
'label' => 'password',
|
|
||||||
'type' => 'password',
|
|
||||||
'placeholder' => '',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'pw_strength',
|
|
||||||
'no_backslash',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'verify_create_account_password' => [
|
|
||||||
'label' => 'password',
|
|
||||||
'type' => 'password',
|
|
||||||
'placeholder' => '',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'pw_strength',
|
|
||||||
'no_backslash',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<?php
|
|
||||||
$login_fields = [
|
|
||||||
'method' => 'post',
|
|
||||||
'action' => 'process.php?action=login',
|
|
||||||
'login_username' => [
|
|
||||||
'label' => 'username',
|
|
||||||
'type' => 'text',
|
|
||||||
'placeholder' => 'e.g., jsmith',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
'login_password' => [
|
|
||||||
'label' => 'password',
|
|
||||||
'type' => 'password',
|
|
||||||
'placeholder' => '',
|
|
||||||
'validators' => [
|
|
||||||
'no_spaces',
|
|
||||||
'pw_strength',
|
|
||||||
'no_backslash',
|
|
||||||
'check_sql',
|
|
||||||
],
|
|
||||||
],
|
|
||||||
];
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
include_once('sql.php');
|
|
||||||
|
|
||||||
function authorize($username, $password_hash)
|
|
||||||
{
|
|
||||||
$pw_hash = get_account_login($username);
|
|
||||||
pretty_print($pw_hash);
|
|
||||||
|
|
||||||
if (!empty($pw_hash)) {
|
|
||||||
if ($password_hash == $pw_hash) {
|
|
||||||
$user = get_account_info($username);
|
|
||||||
pretty_print($user);
|
|
||||||
// $_SESSION['is_logged_in'] = true;
|
|
||||||
// $_SESSION['username'] = $username;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function pretty_print($input)
|
|
||||||
{
|
|
||||||
echo '
|
|
||||||
<pre>
|
|
||||||
' . print_r($input) . '
|
|
||||||
</pre>
|
|
||||||
';
|
|
||||||
}
|
|
||||||
@@ -1,308 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Author: Joshua Ashton <me@joshashton.dev>
|
|
||||||
* Date: 06 March 2025
|
|
||||||
* Version: v0.1.0
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* A data format standard for easily creating forms with input validation.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This file provides functions for validating form input data. For any given
|
|
||||||
* field in an associative array, provide an array of validation requirements.
|
|
||||||
* This is to enable modular data fields while ensuring data integrity and
|
|
||||||
* safety from SQL injection.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Each function accepts at least an input string, and will return either true
|
|
||||||
* or false. It is up to the client to interpret that and create error messages
|
|
||||||
* and ensure data format consistency accordingly.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* *****************************************************************************
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* EXAMPLE LOGIN DATA IMPLEMENTATION
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* $login_fields = [
|
|
||||||
* 'method' => 'post',
|
|
||||||
* 'action' => 'process.php?action=login',
|
|
||||||
* 'login_username' => [
|
|
||||||
* 'label' => 'username',
|
|
||||||
* 'type' => 'text',
|
|
||||||
* 'placeholder' => 'e.g., jsmith',
|
|
||||||
* 'validators' => [
|
|
||||||
* 'no_spaces',
|
|
||||||
* 'check_sql',
|
|
||||||
* ],
|
|
||||||
* ],
|
|
||||||
*
|
|
||||||
* 'login_password' => [
|
|
||||||
* 'label' => 'password',
|
|
||||||
* 'type' => 'password',
|
|
||||||
* 'placeholder' => '',
|
|
||||||
* 'validators' => [
|
|
||||||
* 'no_spaces',
|
|
||||||
* 'pw_strength',
|
|
||||||
* 'no_backslash',
|
|
||||||
* 'check_sql',
|
|
||||||
* ],
|
|
||||||
* ],
|
|
||||||
* ];
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* *****************************************************************************
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* CLIENT VALIDATION IMPLEMENTATION
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* function validate($input, $validators)
|
|
||||||
* {
|
|
||||||
* include_once ('includes/input_validation.php');
|
|
||||||
*
|
|
||||||
* foreach ($validators as $v) {
|
|
||||||
* switch ($v) {
|
|
||||||
* case 'no_spaces':
|
|
||||||
* if (!no_spaces($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'no_digits':
|
|
||||||
* if (!no_digits($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'no_backslash':
|
|
||||||
* if (!no_backslash($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'no_special':
|
|
||||||
* if (!no_special($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'only_digits':
|
|
||||||
* if (!only_digits($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'only_digits_x':
|
|
||||||
* if (!only_digits_x($input, 5))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'only_letters':
|
|
||||||
* if (!only_letters($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'only_letters_x':
|
|
||||||
* if (!only_letters_x($input, 5))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'valid_email':
|
|
||||||
* if (!valid_email($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'valid_phone':
|
|
||||||
* if (!valid_phone($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'pw_strength':
|
|
||||||
* if (!pw_strength($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* case 'check_sql':
|
|
||||||
* if (check_sql($input))
|
|
||||||
* return false;
|
|
||||||
* break;
|
|
||||||
* }
|
|
||||||
* }
|
|
||||||
* return true;
|
|
||||||
* }
|
|
||||||
*/
|
|
||||||
|
|
||||||
function no_spaces($input)
|
|
||||||
{
|
|
||||||
return !str_contains($input, ' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
function no_digits($input)
|
|
||||||
{
|
|
||||||
for ($i = 0; $i < strlen($input); $i++)
|
|
||||||
if (is_numeric($input[$i]))
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function no_backslash($input)
|
|
||||||
{
|
|
||||||
for ($i = 0; $i < strlen($input); $i++)
|
|
||||||
if ($input[$i] === '\\')
|
|
||||||
return false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This checks for the following characters:
|
|
||||||
* ' ' ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [
|
|
||||||
* \ ] ^ _ ` { | } ~
|
|
||||||
*
|
|
||||||
* TODO: Add support for additional special characters available through
|
|
||||||
* other means.
|
|
||||||
*/
|
|
||||||
function no_special($input)
|
|
||||||
{
|
|
||||||
$special = [
|
|
||||||
'!',
|
|
||||||
'"',
|
|
||||||
'#',
|
|
||||||
'$',
|
|
||||||
'%',
|
|
||||||
'&',
|
|
||||||
"'",
|
|
||||||
'(',
|
|
||||||
')',
|
|
||||||
'*',
|
|
||||||
'+',
|
|
||||||
',',
|
|
||||||
'-',
|
|
||||||
'.',
|
|
||||||
'/',
|
|
||||||
':',
|
|
||||||
';',
|
|
||||||
'<',
|
|
||||||
'=',
|
|
||||||
'>',
|
|
||||||
'?',
|
|
||||||
'@',
|
|
||||||
'[',
|
|
||||||
'\\',
|
|
||||||
']',
|
|
||||||
'^',
|
|
||||||
'_',
|
|
||||||
'`',
|
|
||||||
'{',
|
|
||||||
'|',
|
|
||||||
'}',
|
|
||||||
'~',
|
|
||||||
];
|
|
||||||
|
|
||||||
for ($i = 0; $i < strlen($input); $i++)
|
|
||||||
if (in_array($input[$i], $special))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function only_digits($input)
|
|
||||||
{
|
|
||||||
for ($i = 0; $i < strlen($input); $i++)
|
|
||||||
if (!is_numeric($input[$i]))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function only_digits_x($input, $x)
|
|
||||||
{
|
|
||||||
if (strlen($input) != $x)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for ($i = 0; $i < strlen($input); $i++)
|
|
||||||
if (!is_numeric($input[$i]))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function only_letters($input)
|
|
||||||
{
|
|
||||||
return (preg_match('/[^A-Za-z]*/', $input) == 1 ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
function only_letters_x($input, $x)
|
|
||||||
{
|
|
||||||
if (strlen($input) != $x)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return (preg_match('/[^A-Za-z]*/', $input) ? true : false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Add additional step which tests if the email exists.
|
|
||||||
function valid_email($input)
|
|
||||||
{
|
|
||||||
if (!str_contains($input, '@'))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
$email = explode('@', $input);
|
|
||||||
if (count($email) != 2)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: While this function handles the most common variations of a phone
|
|
||||||
* number (and potential missed or inconsistent entry), it does not apply
|
|
||||||
* any formatting. The client must handle data consistency themselves.
|
|
||||||
*/
|
|
||||||
function valid_phone($input)
|
|
||||||
{
|
|
||||||
$formats = [
|
|
||||||
'/^\d{10}$/', // xxxxxxxxxx
|
|
||||||
'/^\d{3}-\d{7}$/', // xxx-xxxxxxx
|
|
||||||
'/^\d{6}-\d{4}$/', // xxxxxx-xxxx
|
|
||||||
'/^\d{3}-\d{3}-\d{4}$/', // xxx-xxx-xxxx
|
|
||||||
'/^\(\d{3}\)\d{7}$/', // (xxx)xxxxxxx
|
|
||||||
'/^\(\d{3}\)\d{3}-\d{4}$/', // (xxx)xxx-xxxx
|
|
||||||
'/^\(\d{3}\) \d{3}-\d{4}$/', // (xxx) xxx-xxxx
|
|
||||||
'/^\(\d{3}\)\d{3} -\d{4}$/', // (xxx)xxx -xxxx
|
|
||||||
'/^\(\d{3}\)\d{3}- \d{4}$/', // (xxx)xxx- xxxx
|
|
||||||
'/^\(\d{3}\)\d{3} - \d{4}$/', // (xxx)xxx - xxxx
|
|
||||||
'/^\(\d{3}\) \d{3} -\d{4}$/', // (xxx) xxx -xxxx
|
|
||||||
'/^\(\d{3}\) \d{3}- \d{4}$/', // (xxx) xxx- xxxx
|
|
||||||
'/^\(\d{3}\) \d{3} - \d{4}$/', // (xxx) xxx - xxxx
|
|
||||||
'/^\d{3} \d{7}$/', // xxx xxxxxxx
|
|
||||||
'/^\d{6} \d{4}$/', // xxxxxx xxxx
|
|
||||||
'/^\d{3} \d{3} \d{4}$/', // xxx xxx xxxx
|
|
||||||
'/^\d{3} \d{3}-\d{4}$/', // xxx xxx-xxxx
|
|
||||||
'/^\d{3}-\d{3} \d{4}$/', // xxx-xxx xxxx
|
|
||||||
'/^\d{3}\.\d{7}$/', // xxx.xxxxxxx
|
|
||||||
'/^\d{6}\.\d{4}$/', // xxxxxx.xxxx
|
|
||||||
'/^\d{3}\.\d{3}\.\d{4}$/', // xxx.xxx.xxxx
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($formats as $regex)
|
|
||||||
if (preg_match($regex, $input))
|
|
||||||
return true;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: This should ensure the user's password consists of the following:
|
|
||||||
* - length > 8,
|
|
||||||
* - 1+ uppercase letters,
|
|
||||||
* - 1+ lowercase letters,
|
|
||||||
* - 1+ digits,
|
|
||||||
* - 1+ special characters
|
|
||||||
*/
|
|
||||||
function pw_strength($input)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: Need to implement SQL Injection prevention.
|
|
||||||
*
|
|
||||||
* Note: This should have the additional step of blacklisting a user who
|
|
||||||
* attempts SQL Injection. At least adding any valid submitted information
|
|
||||||
* to a DB table in case they attempt to create a 'valid' account, or
|
|
||||||
* flagging a 'valid' account that attempts SQL Injection. This will require
|
|
||||||
* a lot of research and therefore time. For now, since this isn't public
|
|
||||||
* facing, I'll operate with some trust in the user.
|
|
||||||
*
|
|
||||||
* Also, this might be better in a database functions file instead.
|
|
||||||
*/
|
|
||||||
function check_sql($input)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
@@ -1,72 +0,0 @@
|
|||||||
<?php
|
|
||||||
// phpdotenv initialization
|
|
||||||
require_once 'vendor/autoload.php';
|
|
||||||
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
|
|
||||||
$dotenv->safeLoad();
|
|
||||||
|
|
||||||
// Use environment variables for the database password and IP address.
|
|
||||||
$db_user = $_ENV['DATABASE_USER'];
|
|
||||||
$db_pass = $_ENV['DATABASE_PASSWORD'];
|
|
||||||
|
|
||||||
define('HOST', 'localhost');
|
|
||||||
define('USER', $db_user);
|
|
||||||
define('PASS', $db_pass);
|
|
||||||
define('DB', 'vintagecodingdotnet');
|
|
||||||
|
|
||||||
// **************** ACCOUNT QUERIES *************** //
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMPORTANT: This should only be called once a user has been authorized as an
|
|
||||||
* administrator.
|
|
||||||
*
|
|
||||||
* TODO: Use JOIN to get other columns like roles and profile pictures.
|
|
||||||
*/
|
|
||||||
function get_all_accounts()
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT * FROM accounts;';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_account_login($username)
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT password_hash FROM accounts WHERE username = "' . $username . '";';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_account_info($username)
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT * FROM accounts WHERE username = "' . $username . '";';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_account_role($username)
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT * FROM accounts WHERE username = "' . $username . '";';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
// **************** ARTICLE QUERIES *************** //
|
|
||||||
|
|
||||||
function get_all_article_cards()
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT article_id, title, slug, featured_image, excerpt FROM articles;';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
|
|
||||||
function get_new_article_cards()
|
|
||||||
{
|
|
||||||
$conn = mysqli_connect(HOST, USER, PASS, DB);
|
|
||||||
$query = 'SELECT article_id, title, slug, featured_image, excerpt FROM articles ORDER BY publish_date;';
|
|
||||||
$results = mysqli_query($conn, $query);
|
|
||||||
return $results;
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,15 @@
|
|||||||
<?php
|
<!DOCTYPE html>
|
||||||
include_once('includes/components/head.php');
|
<html>
|
||||||
|
|
||||||
include_once('login.php');
|
<head>
|
||||||
|
<link href="css/base.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="css/text.css" rel="stylesheet" type="text/css">
|
||||||
|
</head>
|
||||||
|
|
||||||
include_once('includes/components/foot.php');
|
<body>
|
||||||
|
<div class="center-abs">
|
||||||
|
<h1>Under Construction</h1>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
<?php
|
|
||||||
include_once('includes/fields/login_fields.php');
|
|
||||||
include_once('includes/components/form.php');
|
|
||||||
|
|
||||||
if (isset($_GET['error']))
|
|
||||||
echo generate_form($login_fields, $_GET['error']);
|
|
||||||
else
|
|
||||||
echo generate_form($login_fields, '');
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?php
|
|
||||||
include_once('../includes/components/head.php');
|
|
||||||
|
|
||||||
echo '<h1>Home</h1>';
|
|
||||||
|
|
||||||
include_once('../includes/components/foot.php');
|
|
||||||
-114
@@ -1,114 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
if (!isset($_GET['action']))
|
|
||||||
header('Location: .');
|
|
||||||
|
|
||||||
include_once ('includes/functions.php');
|
|
||||||
|
|
||||||
$action = $_GET['action'];
|
|
||||||
|
|
||||||
switch ($action) {
|
|
||||||
case 'login':
|
|
||||||
$error_location = 'login.php?error=';
|
|
||||||
$success_location = 'pages/home.php';
|
|
||||||
|
|
||||||
// If fields are empty, redirect to login with error state.
|
|
||||||
if (empty($_POST['login_username']) || empty($_POST['login_password']))
|
|
||||||
header('Location: ' . $error_location . 'empty');
|
|
||||||
|
|
||||||
include_once ('fields/login_fields.php');
|
|
||||||
// If field inputs are invalid, redirect to login with error state.
|
|
||||||
foreach ($_POST as $field => $value) {
|
|
||||||
if (!validate($value, $login_fields[$field]['validators']))
|
|
||||||
header('Location: ' . $error_location . 'invalid');
|
|
||||||
}
|
|
||||||
|
|
||||||
$username = $_POST['login_username'];
|
|
||||||
$password_hash = hash('sha256', $_POST['login_password']);
|
|
||||||
|
|
||||||
// If username/password hash are incorrect, redirect to login with error state.
|
|
||||||
if (!authorize($username, $password_hash))
|
|
||||||
header('Location: ' . $error_location . 'incorrect');
|
|
||||||
|
|
||||||
unset($_POST['login_username']);
|
|
||||||
unset($_POST['login_password']);
|
|
||||||
|
|
||||||
// auth() handles setting $_SESSION variables, user is now OK to proceed to home.php.
|
|
||||||
header('Location: ' . $success_location);
|
|
||||||
default:
|
|
||||||
// code...
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
function validate($input, $validators)
|
|
||||||
{
|
|
||||||
include_once ('includes/input_validation.php');
|
|
||||||
|
|
||||||
foreach ($validators as $v) {
|
|
||||||
switch ($v) {
|
|
||||||
case 'no_spaces':
|
|
||||||
if (!no_spaces($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'no_digits':
|
|
||||||
if (!no_digits($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'no_backslash':
|
|
||||||
if (!no_backslash($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'no_special':
|
|
||||||
if (!no_special($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'only_digits':
|
|
||||||
if (!only_digits($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// TODO: Need to get x.
|
|
||||||
case 'only_digits_x':
|
|
||||||
if (!only_digits_x($input, 5))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'only_letters':
|
|
||||||
if (!only_letters($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// TODO: Need to get x.
|
|
||||||
case 'only_letters_x':
|
|
||||||
if (!only_letters_x($input, 5))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'valid_email':
|
|
||||||
if (!valid_email($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'valid_phone':
|
|
||||||
if (!valid_phone($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'pw_strength':
|
|
||||||
if (!pw_strength($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'check_sql':
|
|
||||||
if (check_sql($input))
|
|
||||||
return false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
@@ -1,123 +0,0 @@
|
|||||||
create_db() {
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "DROP DATABASE IF EXISTS vintagecodingdotnet;";
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "CREATE DATABASE vintagecodingdotnet;";
|
|
||||||
|
|
||||||
# Create file_types table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE file_types (
|
|
||||||
file_type_id INT PRIMARY KEY AUTO_INCREMENT,
|
|
||||||
file_type VARCHAR(8)
|
|
||||||
);";
|
|
||||||
|
|
||||||
# Create the media table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE media (
|
|
||||||
media_id INT PRIMARY KEY,
|
|
||||||
file_name TINYTEXT NOT NULL,
|
|
||||||
file_path VARCHAR(2048) NOT NULL,
|
|
||||||
file_type INT NOT NULL,
|
|
||||||
FOREIGN KEY (file_type) REFERENCES file_types(file_type_id)
|
|
||||||
);";
|
|
||||||
|
|
||||||
# Create the roles table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE roles (
|
|
||||||
role_id INT PRIMARY KEY AUTO_INCREMENT,
|
|
||||||
role VARCHAR(32) NOT NULL
|
|
||||||
);";
|
|
||||||
|
|
||||||
# Create the accounts table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE accounts (
|
|
||||||
account_id INT PRIMARY KEY,
|
|
||||||
username VARCHAR(32) UNIQUE NOT NULL,
|
|
||||||
first_name VARCHAR(64) NOT NULL,
|
|
||||||
last_name VARCHAR(64) NOT NULL,
|
|
||||||
email VARCHAR(64) UNIQUE NOT NULL,
|
|
||||||
password_hash VARCHAR(64) NOT NULL,
|
|
||||||
role INT NOT NULL,
|
|
||||||
registration_date DATETIME,
|
|
||||||
bio TINYTEXT,
|
|
||||||
profile_picture INT,
|
|
||||||
FOREIGN KEY (role) REFERENCES roles(role_id),
|
|
||||||
FOREIGN KEY (profile_picture) REFERENCES media(media_id)
|
|
||||||
);";
|
|
||||||
|
|
||||||
# Create the article_status table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE article_status (
|
|
||||||
status_id INT PRIMARY KEY AUTO_INCREMENT,
|
|
||||||
status VARCHAR(16) NOT NULL
|
|
||||||
);";
|
|
||||||
|
|
||||||
# Create the articles table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
CREATE TABLE articles (
|
|
||||||
article_id INT PRIMARY KEY AUTO_INCREMENT,
|
|
||||||
account_id INT NOT NULL,
|
|
||||||
title VARCHAR(128) UNIQUE NOT NULL,
|
|
||||||
slug VARCHAR(128) UNIQUE NOT NULL,
|
|
||||||
content LONGTEXT NOT NULL,
|
|
||||||
publish_date DATETIME,
|
|
||||||
last_modified DATETIME NOT NULL,
|
|
||||||
status INT NOT NULL,
|
|
||||||
featured_image INT,
|
|
||||||
excerpt VARCHAR(255),
|
|
||||||
FOREIGN KEY (account_id) REFERENCES accounts(account_id),
|
|
||||||
FOREIGN KEY (status) REFERENCES article_status(status_id)
|
|
||||||
);";
|
|
||||||
}
|
|
||||||
|
|
||||||
# Insert data constants into the database.
|
|
||||||
# Acceptable file types: png, jpg, jpeg, svg.
|
|
||||||
# Acceptable roles: administrator, contributor, commenter, guest.
|
|
||||||
# Acceptable article status: published, draft, archived.
|
|
||||||
#
|
|
||||||
# Also creates administrator user
|
|
||||||
const_data() {
|
|
||||||
# Insert the data to the file_types table.
|
|
||||||
# Acceptable file types are png, jpg, jpeg, svg
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
INSERT INTO file_types (file_type) VALUES ('png'), ('jpg'), ('jpeg'), ('svg');
|
|
||||||
";
|
|
||||||
|
|
||||||
# Insert the data to the roles table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
INSERT INTO roles (role) VALUES ('administrator'), ('contributor'), ('commenter'), ('guest');
|
|
||||||
";
|
|
||||||
|
|
||||||
# Insert the data to the article_status table.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
INSERT INTO article_status (status) VALUES ('published'), ('draft'), ('archived');
|
|
||||||
";
|
|
||||||
|
|
||||||
# Create an administrator user.
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
INSERT INTO accounts
|
|
||||||
(account_id, username, email, password_hash, role, registration_date, bio, profile_picture) VALUES
|
|
||||||
(42, 'admin', 'me@joshashton.dev', 'e03b1a00caa6e8113a3bc3e7101ecbd0fea710f5e091e7b195bdba53bbeb004e', 1, CURDATE(), null, null);
|
|
||||||
";
|
|
||||||
}
|
|
||||||
|
|
||||||
insert_data() {
|
|
||||||
/opt/lampp/bin/mariadb -u violet -p -e "
|
|
||||||
USE vintagecodingdotnet;
|
|
||||||
INSERT INTO articles (article_name) VALUES
|
|
||||||
('test'),
|
|
||||||
('another test'),
|
|
||||||
('a third test');
|
|
||||||
";
|
|
||||||
}
|
|
||||||
|
|
||||||
create_db
|
|
||||||
const_data
|
|
||||||
Reference in New Issue
Block a user