From 9a888d14c3e03889e13b1f857b9a14a7d61fc518 Mon Sep 17 00:00:00 2001 From: "Elias F." Date: Mon, 24 Nov 2025 14:37:27 +0100 Subject: [PATCH] Re-install huge so it will work correctly --- .htaccess | 52 + .idea/.gitignore | 8 + .idea/copilot.data.migration.agent.xml | 6 + .idea/copilot.data.migration.ask.xml | 6 + .idea/copilot.data.migration.ask2agent.xml | 6 + .idea/copilot.data.migration.edit.xml | 6 + .idea/huge.iml | 35 + .idea/modules.xml | 8 + .idea/php.xml | 51 + .idea/phpunit.xml | 10 + .idea/vcs.xml | 7 + .scrutinizer.yml | 9 + .travis.yml | 38 + README.md | 786 +++-------- composer.lock | 1374 -------------------- 15 files changed, 430 insertions(+), 1972 deletions(-) create mode 100644 .htaccess create mode 100644 .idea/.gitignore create mode 100644 .idea/copilot.data.migration.agent.xml create mode 100644 .idea/copilot.data.migration.ask.xml create mode 100644 .idea/copilot.data.migration.ask2agent.xml create mode 100644 .idea/copilot.data.migration.edit.xml create mode 100644 .idea/huge.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/php.xml create mode 100644 .idea/phpunit.xml create mode 100644 .idea/vcs.xml create mode 100644 .scrutinizer.yml create mode 100644 .travis.yml delete mode 100644 composer.lock diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..0faa952 --- /dev/null +++ b/.htaccess @@ -0,0 +1,52 @@ +# This file is - if you set up HUGE correctly - not needed. +# But, for fallback reasons (if you don't route your vhost to /public), it will stay here. +RewriteEngine on +RewriteRule ^(.*) public/$1 [L] + +# Everything from is for browser caching and is totally optional + +# Deflate Compression by FileType + + AddOutputFilterByType DEFLATE text/plain + AddOutputFilterByType DEFLATE text/html + AddOutputFilterByType DEFLATE text/xml + AddOutputFilterByType DEFLATE text/css + AddOutputFilterByType DEFLATE text/javascript + AddOutputFilterByType DEFLATE application/xml + AddOutputFilterByType DEFLATE application/xhtml+xml + AddOutputFilterByType DEFLATE application/rss+xml + AddOutputFilterByType DEFLATE application/atom_xml + AddOutputFilterByType DEFLATE application/javascript + AddOutputFilterByType DEFLATE application/x-javascript + AddOutputFilterByType DEFLATE application/x-shockwave-flash + + +# Set browser caching to 1 month + + ExpiresActive On + ExpiresByType text/css "access plus 1 month" + ExpiresByType text/javascript "access plus 1 month" + ExpiresByType text/html "access plus 1 month" + ExpiresByType application/javascript "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/x-icon "access plus 1 month" + + + + # if you want to prevent your site from being embedded into other sites via an iframe (sometimes used for scam), then + # simply uncomment these lines below. you need to have apache rewrite headers activated, usually via + # "a2enmod rewrite headers" on the command line + #Header set X-Frame-Options Deny + #Header always append X-Frame-Options SAMEORIGIN + + Header set Cache-Control "max-age=2592000, public" + + + Header set Cache-Control "max-age=604800, public" + + + Header set Cache-Control "max-age=216000, private" + + \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/copilot.data.migration.agent.xml b/.idea/copilot.data.migration.agent.xml new file mode 100644 index 0000000..4ea72a9 --- /dev/null +++ b/.idea/copilot.data.migration.agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask.xml b/.idea/copilot.data.migration.ask.xml new file mode 100644 index 0000000..7ef04e2 --- /dev/null +++ b/.idea/copilot.data.migration.ask.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.ask2agent.xml b/.idea/copilot.data.migration.ask2agent.xml new file mode 100644 index 0000000..1f2ea11 --- /dev/null +++ b/.idea/copilot.data.migration.ask2agent.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/copilot.data.migration.edit.xml b/.idea/copilot.data.migration.edit.xml new file mode 100644 index 0000000..8648f94 --- /dev/null +++ b/.idea/copilot.data.migration.edit.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/huge.iml b/.idea/huge.iml new file mode 100644 index 0000000..7c57dc8 --- /dev/null +++ b/.idea/huge.iml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..26e19fc --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..b8c1523 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/phpunit.xml b/.idea/phpunit.xml new file mode 100644 index 0000000..af7d528 --- /dev/null +++ b/.idea/phpunit.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..09a7b4e --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.scrutinizer.yml b/.scrutinizer.yml new file mode 100644 index 0000000..f023049 --- /dev/null +++ b/.scrutinizer.yml @@ -0,0 +1,9 @@ +# This file just tells the wonderful code quality analyzer Scrutinizer (https://scrutinizer-ci.com/g/panique/huge/) +# that we are using external services (Travis) to generate code coverage stats +checks: + php: + code_rating: true + duplication: true +# test coverage is commented out as this does not seem to work properly right now +#tools: +# external_code_coverage: true \ No newline at end of file diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3dccb0c --- /dev/null +++ b/.travis.yml @@ -0,0 +1,38 @@ +language: php + +php: + - 5.6 + - 7.0 + - 7.1 + - 7.2 + - 7.3 + - 7.4 + +# optional, define the environment, in this case useful to test stuff that only runs in development / production +env: + global: + - APPLICATION_ENV=testing + +before_install: + - sudo apt-get update > /dev/null + +before_script: + - sudo apt-get install apache2 + - sudo a2enmod rewrite + # configure apache virtual hosts, create vhost via travis-ci-apache file template + - sudo cp -f travis-ci-apache /etc/apache2/sites-available/default + - sudo sed -e "s?%TRAVIS_BUILD_DIR%?$(pwd)?g" --in-place /etc/apache2/sites-available/default + - sudo service apache2 restart + # composer + - composer self-update + - composer install --prefer-source --no-interaction + # go to tests folder + - cd tests + +# run unit tests, create result file +script: ../vendor/bin/phpunit --configuration phpunit.xml --coverage-text --coverage-clover=coverage.clover + +# gets tools from Scrutinizer, uploads unit tests results to Scrutinizer (?) +after_script: + - wget https://scrutinizer-ci.com/ocular.phar + - php ocular.phar code-coverage:upload --format=php-clover coverage.clover diff --git a/README.md b/README.md index 1c78838..afa4a04 100644 --- a/README.md +++ b/README.md @@ -1,632 +1,222 @@ -![HUGE, formerly "php-login" logo](_pictures/huge.png) +# HUGE – Installation und Setup -# HUGE +--- -[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/panique/huge/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/panique/huge/?branch=master) -[![Code Climate](https://codeclimate.com/github/panique/huge/badges/gpa.svg)](https://codeclimate.com/github/panique/huge) -[![Codacy Badge](https://api.codacy.com/project/badge/Grade/01a221d168b04b1c94a85813519dab40)](https://www.codacy.com/app/panique/huge?utm_source=github.com&utm_medium=referral&utm_content=panique/huge&utm_campaign=Badge_Grade) -[![Travis CI](https://travis-ci.org/panique/huge.svg?branch=master)](https://travis-ci.org/panique/huge) -[![Dependency Status](https://www.versioneye.com/user/projects/54ca11fbde7924f81a000010/badge.svg?style=flat)](https://www.versioneye.com/user/projects/54ca11fbde7924f81a000010) -[![Support](https://supporterhq.com/api/b/9guz00i6rep05k1mwxyquz30k)](https://supporterhq.com/give/9guz00i6rep05k1mwxyquz30k) +## Schnellstart -Just a simple user authentication solution inside a super-simple framework skeleton that works out-of-the-box -(and comes with an auto-installer), using the future-proof official bcrypt password hashing/salting implementation of -PHP 5.5+, plus some nice features that will speed up the time from idea to first usable prototype application -dramatically. Nothing more. This project has its focus on hardcore simplicity. Everything is as simple as possible, -made for smaller projects, typical agency work and quick drafts. If you want to build massive corporate -applications with all the features modern frameworks have, then have a look at [Laravel](http://laravel.com), -[Symfony](http://symfony.com) or [Yii](http://www.yiiframework.com), but if you just want to quickly create something -that just works, then this script might be interesting for you. +- Voraussetzungen prüfen (siehe unten) +- Abhängigkeiten installieren +- Datenbank anlegen +- Webserver auf `public/` zeigen lassen +- Starten und testen -HUGE's simple-as-possible architecture was inspired by several conference talks, slides and articles about huge -applications that - surprisingly and intentionally - go back to the basics of programming, using procedural programming, -static classes, extremely simple constructs, not-totally-DRY code etc. while keeping the code extremely readable -([StackOverflow](http://www.dev-metal.com/architecture-stackoverflow/), Wikipedia, SoundCloud). +Befehle (Beispiele): -Some interesting Buzzwords in this context: [KISS](http://en.wikipedia.org/wiki/KISS_principle), -[YAGNI](http://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it), [Feature Creep](https://en.wikipedia.org/wiki/Feature_creep), -[Minimum viable product](https://en.wikipedia.org/wiki/Minimum_viable_product). - -#### HUGE has reached "soft End Of Life" - -To keep this project stable, secure, clean and minimal I've decided to reduce the development of HUGE to a -minimum. *Don't worry, this is actually a good thing:* New features usually mean new bugs, lots of testing, fixes, -incompatibilities, and for some people even hardcore update stress. As HUGE is a security-critical script new features -are not as important as a stable and secure core, this is why people use it. This means: - -- HUGE will not get new features -- but will be maintained, so it will get bugfixes, corrections etc for sure, maybe for years - -And to be honest, maintaining a framework for free in my rare free-time is also not what I want to do permanently. :) - -Finally a little note: The PHP world has evolved dramatically, we have excellent frameworks with awesome features and -big professional teams behind, very well written documentations and large communities, so there's simply no reason -to put much work into another framework. Instead, please commit to the popular frameworks, then your work will have -much more impact and is used by much more people! - -Thanks to everybody around this project, have a wonderful time! -XOXO, -Chris - -#### Releases & development - -* stable [v3.1](https://github.com/panique/huge/releases/tag/v3.1), -* public beta branch: [master](https://github.com/panique/huge) -* public in-development branch (please commit new code here): [develop](https://github.com/panique/huge/tree/develop) - -#### Quick-Index - -+ [Features](#features) -+ [Live-Demo](#live-demo) -+ [Support](#support) -+ [Follow the project](#follow) -+ [License](#license) -+ [Requirements](#requirements) -+ [Auto-Installation](#auto-installation) - - [Auto-Installation in Vagrant](#auto-installation-vagrant) (also useful for 100% reproducible installation of HUGE) - - [Auto-Installation in Ubuntu 14.04 LTS server](#auto-installation-ubuntu) -+ [Installation (Ubuntu 14.04 LTS)](#installation) - - [Quick Installation](#quick-installation) - - [Detailed Installation](#detailed-installation) - - [NGINX setup](#nginx-setup) - - [IIS setup](#iis-setup) -+ [Documentation](#documentation) - - [How to use the user roles](#user_roles) - - [How to use the CSRF feature](#csrf) -+ [Community-provided features & feature discussions](#community) -+ [Future of the project, announcing soft EOL](#future) -+ [Why is there no support forum anymore ?](#why-no-support-forum) -+ [Zero tolerance for idiots, trolls and vandals](#zero-tolerance) -+ [Contribute](#contribute) -+ [Code-Quality scanner links](#code-quality) -+ [Report a bug](#bug-report) - -### The History of HUGE - -Back in 2010/2011 there were no useful login solutions in the PHP world, at least not for non-experts. So I did the worst -mistake every young developer does: Trying to build something by myself without having any clue about security basics. -What made it even worse was: The web was (and is) full of totally broken tutorials about building user authentication -systems, even the biggest companies in the world did this completely wrong (we are talking about SONY, LinkedIn and -Adobe here), and also lots of major framework in all big programming languages (!) used totally outdated and insecure -password saving technologies. - -However, in 2012 security expert [Anthony Ferrara](https://github.com/ircmaxell) published a [little PHP library](https://github.com/ircmaxell/password_compat), -allowing extremely secure, modern and correct hashing of passwords in PHP 5.3 and 5.4, usable by every developer without any stress and without any knowledge -about security internals. The script was so awesome that it was written into the core of PHP 5.5, it's the de-facto standard these days. - -When this came out I tried to use this naked library to build a fully working out-of-the-box login system for several private and commercial projects, -and put the code on GitHub. Lots of people found this useful, contributed and bugfixed the project, made forks, smaller and larger versions. -The result is this project. - -Please note: Now, in 2015, most major frameworks have excellent user authentication logic embedded by default. This was -not the case years ago. So, from today's perspective it might be smarter to chose Laravel, Yii or Symfony for serious -projects. But feel free to try out HUGE, the auto-installer will spin up a fully working installation within minutes and -without any configuration. - -And why the name "HUGE" ? It's a nice combination to -[TINY](https://github.com/panique/tiny), -[MINI](https://github.com/panique/mini) and -[MINI2](https://github.com/panique/mini2), -[MINI3](https://github.com/panique/mini3), -which are some of my other older projects. Super-minimal micro frameworks for extremely fast and simple development of simple websites. - -### Features -* built with the official PHP password hashing functions, fitting the most modern password hashing/salting web standards -* proper security features, like CSRF blocking (via form tokens), encryption of cookie contents etc. -* users can register, login, logout (with username, email, password) -* password-forget / reset -* remember-me (login via cookie) -* account verification via mail -* captcha -* failed-login-throttling -* user profiles -* account upgrade / downgrade -* simple user types (type 1, type 2, admin) -* supports local avatars and remote Gravatars -* supports native mail and SMTP sending (via PHPMailer and other tools) -* uses PDO for database access for sure, has nice DatabaseFactory (in case your project goes big) -* uses URL rewriting ("beautiful URLs") -* proper split of application and public files (requests only go into /public) -* uses Composer to load external dependencies (PHPMailer, Captcha-Generator, etc.) for sure -* fits PSR-0/1/2/4 coding guidelines -* uses [Post-Redirect-Get pattern](https://en.wikipedia.org/wiki/Post/Redirect/Get) for nice application flow -* masses of comments -* is actively maintained and bug-fixed (however, no big new features as project slowly reaches End of Life) - -### Planned features - -* A real documentation (currently there's none, but the code is well commented) - -### Live-Demo - -See a [live demo of older 3.0 version here](http://104.131.8.128) and [the server's phpinfo() here](104.131.8.128/info.php). - -### Support the project - -There is a lot of work behind this project. I might save you hundreds, maybe thousands of hours of work (calculate that -in developer costs). So when you are earning money by using HUGE, be fair and give something back to open-source. -HUGE is totally free to private and commercial use. - -Support the project by renting a server at [DigitalOcean](https://www.digitalocean.com/?refcode=40d978532a20) or just tipping a coffee at BuyMeACoffee.com. Thanks! :) - -Buy Me A Coffee - -Also feel free to contribute to this project. - -### License - -Licensed under [MIT](http://www.opensource.org/licenses/mit-license.php). -Totally free for private or commercial projects. - -### Requirements - -Make sure you know the basics of object-oriented programming and MVC, are able to use the command line and have -used Composer before. This script is not for beginners. - -* **PHP 5.5+** -* **MySQL 5** database (better use versions 5.5+ as very old versions have a [PDO injection bug](http://stackoverflow.com/q/134099/1114320) -* installed PHP extensions: pdo, gd, openssl (the install guideline shows how to do) -* installed tools on your server: git, curl, composer (the install guideline shows how to do) -* for professional mail sending: an SMTP account (I use [SMTP2GO](http://www.smtp2go.com/?s=devmetal)) -* activated mod_rewrite on your server (the install guideline shows how to do) - -### Auto-Installations - -Yo, fully automatic. Why ? Because I always hated it to spend days trying to find out how to install a thing. -This will save you masses of time and nerves. Donate a coffee if you like it. - -#### Auto-Installation (in Vagrant) - -If you are using Vagrant for your development, then simply - -1. Add the official Ubuntu 14.04 LTS box to your Vagrant: `vagrant box add ubuntu/trusty64` -2. Move *Vagrantfile* and *bootstrap.sh* (from *_one-click-installation* folder) to a folder where you want to initialize your project. -3. Do `vagrant up` in that folder. - -5 minutes later you'll have a fully installed HUGE inside Ubuntu 14.04 LTS. The full code will be auto-synced with -the current folder. MySQL root password and the PHPMyAdmin root password are set to *12345678*. By default -192.168.33.111 is the IP of your new box. - -#### Auto-Installation in a naked Ubuntu 14.04 LTS server - -Extremely simple installation in a fresh and naked typical Ubuntu 14.04 LTS server: - -Download the installer script ```bash -wget https://raw.githubusercontent.com/panique/huge/master/_one-click-installation/bootstrap.sh +# Composer installieren (macOS – über Homebrew) +brew install composer + +# Abhängigkeiten holen (im Projektordner) +composer install + +# Datenbank & Tabellen anlegen +mysql -u root -p < application/_installation/01-create-database.sql +mysql -u root -p < application/_installation/02-create-table-users.sql +mysql -u root -p < application/_installation/03-create-table-notes.sql + +# Rechte für Avatare (je nach OS anpassen) +# Ubuntu/Debian: +sudo chown -R www-data:www-data public/avatars +sudo chmod -R 775 public/avatars + +# macOS (Apache Standardnutzer _www): +sudo chown -R _www:_www public/avatars +sudo chmod -R 775 public/avatars ``` -Make it executable +--- + +## Voraussetzungen + +- PHP >= 5.5 (laut composer.json) +- Composer +- Apache 2.4 mit `mod_rewrite` +- MySQL/MariaDB +- PHP-Erweiterungen: PDO + pdo_mysql, OpenSSL, mbstring +- Schreibrechte für `public/avatars/` + +--- + +## Projekt beziehen + +- Repository klonen oder entpacken +- In den Projektordner wechseln + +--- + +## Abhängigkeiten installieren (Composer) + +- Im Projektordner ausführen: + ```bash -chmod +x bootstrap.sh +composer install ``` -Run it! Give it some minutes to perform all the tasks. And yes, you can thank me later :) -```bash -sudo ./bootstrap.sh -``` -### Installation +--- -#### Quick guide: +## Webserver konfigurieren (Apache) -0. Make sure you have Apache, PHP, MySQL installed. [Tutorial](http://www.dev-metal.com/installsetup-basic-lamp-stack-linux-apache-mysql-php-ubuntu-14-04-lts/). -1. Clone the repo to a folder on your server -2. Activate mod_rewrite, route all traffic to application's /public folder. [Tutorial](http://www.dev-metal.com/enable-mod_rewrite-ubuntu-14-04-lts/). -3. Edit application/config: Set your database credentials -4. Execute SQL statements from application/_installation to setup database tables -5. [Install Composer](http://www.dev-metal.com/install-update-composer-windows-7-ubuntu-debian-centos/), - run `Composer install` on application's root folder to install dependencies -6. Make avatar folder (application/public/avatars) writable -7. For proper email usage: Set SMTP credentials in config file, set EMAIL_USE_SMTP to true +- DocumentRoot auf `.../huge/public` setzen +- `AllowOverride All` aktivieren (damit `.htaccess` greift) +- `mod_rewrite` aktivieren +- Apache neu starten -"Email does not work" ? See the troubleshooting below. TODO +Minimalbeispiel VirtualHost: -#### Detailed guide (Ubuntu 14.04 LTS): - -This is just a quick guideline for easy setup of a development environment! - -Make sure you have Apache, PHP 5.5+ and MySQL installed. [Tutorial here](http://www.dev-metal.com/installsetup-basic-lamp-stack-linux-apache-mysql-php-ubuntu-14-04-lts/). -Nginx will work for sure too, but no install guidelines are available yet. - -Edit vhost to make clean URLs possible and route all traffic to /public folder of your project: -```bash -sudo nano /etc/apache2/sites-available/000-default.conf -``` - -and make the file look like -``` +```apacheconf - DocumentRoot "/var/www/html/public" - + ServerName huge.local + DocumentRoot "/pfad/zu/huge/public" + + AllowOverride All Require all granted + + SetEnv APPLICATION_ENV development + ErrorLog "${APACHE_LOG_DIR}/huge_error.log" + CustomLog "${APACHE_LOG_DIR}/huge_access.log" combined ``` -Enable mod_rewrite and restart apache. +Hinweis: `.htaccess` leitet auf `public/index.php` um. + +--- + +## Datenbank anlegen + +- SQL-Skripte in dieser Reihenfolge ausführen (`application/_installation/`): + - `01-create-database.sql` + - `02-create-table-users.sql` + - `03-create-table-notes.sql` + +Beispiel in der Shell: + ```bash -sudo a2enmod rewrite -service apache2 restart +mysql -u root -p < application/_installation/01-create-database.sql +mysql -u root -p < application/_installation/02-create-table-users.sql +mysql -u root -p < application/_installation/03-create-table-notes.sql ``` -Install curl (needed to use git), openssl (needed to clone from GitHub, as github is https only), -PHP GD, the graphic lib (we create captchas and avatars), and git. +--- + +## Framework-Konfiguration (Entwicklung) + +- Datei: `application/config/config.development.php` +- Wichtige Schlüssel: + - URL + - `URL` (Basis-URL, endet mit `/`; auto-detect möglich) + - Pfade + - `PATH_CONTROLLER`, `PATH_VIEW` (meist unverändert) + - Routing + - `DEFAULT_CONTROLLER`, `DEFAULT_ACTION` + - Datenbank + - `DB_TYPE`, `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASS`, `DB_CHARSET` + - Captcha + - `CAPTCHA_WIDTH`, `CAPTCHA_HEIGHT` + - Cookies & Session + - `COOKIE_RUNTIME`, `COOKIE_PATH`, `COOKIE_DOMAIN`, `COOKIE_SECURE`, `COOKIE_HTTP` + - `SESSION_RUNTIME` + - Avatare/Gravatar + - `USE_GRAVATAR`, `GRAVATAR_DEFAULT_IMAGESET`, `GRAVATAR_RATING` + - `AVATAR_SIZE`, `AVATAR_JPEG_QUALITY`, `AVATAR_DEFAULT_IMAGE` + - Ordner `public/avatars/` beschreibbar machen + - Sicherheit + - `ENCRYPTION_KEY`, `HMAC_SALT` (für eigene Installation ändern) + - E-Mail + - `EMAIL_USED_MAILER`, `EMAIL_USE_SMTP` + - `EMAIL_SMTP_HOST`, `EMAIL_SMTP_AUTH`, `EMAIL_SMTP_USERNAME`, `EMAIL_SMTP_PASSWORD`, `EMAIL_SMTP_PORT`, `EMAIL_SMTP_ENCRYPTION` + - `EMAIL_PASSWORD_RESET_*`, `EMAIL_VERIFICATION_*` + +--- + +## Umgebungen (Environment) + +- Klasse: `application/core/Environment.php` +- Ermittelt `APPLICATION_ENV` (Fallback: `development`) +- Weitere Datei möglich: `config.production.php` +- Apache-Variable setzen: + +```apacheconf +SetEnv APPLICATION_ENV production +``` + +--- + +## Verzeichnisrechte + +- `public/avatars/` beschreibbar +- Optional Logs/Uploads je nach Bedarf + +--- + +## Starten + +- Browser: `http:///` +- Registrierung/Login testen +- Mailversand nur mit korrekt konfiguriertem SMTP + +--- + +## Tests ausführen + +- PHPUnit unter `vendor/bin/phpunit` +- Konfiguration: `tests/phpunit.xml` + ```bash -sudo apt-get -y install curl -sudo apt-get -y install php5-curl -sudo apt-get -y install openssl -sudo apt-get -y install php5-gd -sudo apt-get -y install git +vendor/bin/phpunit -c tests/phpunit.xml ``` -git clone HUGE +--- + +## Häufige Probleme + +- 404 bei allen Routen + - `mod_rewrite` aktivieren + - `AllowOverride All` setzen + - DocumentRoot auf `public/` +- Falsche Links/Assets + - `URL` in der Config prüfen +- Datenbankfehler + - `DB_*`-Werte und Rechte prüfen +- E-Mails kommen nicht an + - `EMAIL_USE_SMTP=true` und SMTP-Daten prüfen +- Avatare fehlen + - Schreibrechte für `public/avatars/` + +--- + +## Option: Vagrant „One-Click-Installation“ + +- Ordner: `_one-click-installation/` +- Voraussetzungen: Vagrant + VirtualBox + ```bash -sudo git clone https://github.com/panique/huge "/var/www/html" +cd _one-click-installation +vagrant up ``` -Install Composer -```bash -curl -s https://getcomposer.org/installer | php -mv composer.phar /usr/local/bin/composer -``` +- Projekt über die VM nutzen (Host/Ports laut Vagrant-Ausgabe) -Go to project folder, load Composer packages (--dev is optional, you know the deal) -```bash -cd /var/www/html -composer install --dev -``` +--- -Execute the SQL statements. Via phpmyadmin or via the command line for example. 12345678 is the example password. -Note that this is written without a space. -```bash -sudo mysql -h "localhost" -u "root" "-p12345678" < "/var/www/html/application/_installation/01-create-database.sql" -sudo mysql -h "localhost" -u "root" "-p12345678" < "/var/www/html/application/_installation/02-create-table-users.sql" -sudo mysql -h "localhost" -u "root" "-p12345678" < "/var/www/html/application/_installation/03-create-table-notes.sql" -``` +## Struktur (Kurz) -Make avatar folder writable (make sure it's the correct path!) -```bash -sudo chown -R www-data "/var/www/html/public/avatars" -``` -If this doesn't work for you, then you might try the hard way by setting alternatively -```bash -sudo chmod 0777 -R "/var/www/html/public/avatars" -``` - -Remove Apache's default demo file -```bash -sudo rm "/var/www/html/index.html" -``` - -Edit the application's config in application/config/config.development.php and put in your database credentials. - -Last part (not needed for a first test): Set your SMTP credentials in the same file and set EMAIL_USE_SMTP to true, so -you can send proper emails. It's highly recommended to use SMTP for mail sending! Native sending via PHP's mail() will -not work in nearly every case (spam blocking). I use [SMTP2GO](http://www.smtp2go.com/?s=devmetal). - -Then check your server's IP / domain. Everything should work fine. - -#### NGINX setup: - -This is an untested NGINX setup. Please comment [on the ticket](https://github.com/panique/huge/issues/622) if you see -issues. - -``` -server { - # your listening port - listen 80; - - # your server name - server_name example.com; - - # your path to access log files - access_log /srv/www/example.com/logs/access.log; - error_log /srv/www/example.com/logs/error.log; - - # your root - root /srv/www/example.com/public_html; - - # huge - index index.php; - - # huge - location / { - try_files $uri /index.php?url=$uri&$args; - } - - # your PHP config - location ~ \.php$ { - try_files $uri = 401; - include /etc/nginx/fastcgi_params; - fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - } -} -``` - -#### IIS setup: - -Big thanks to razuro for this fine setup: Put this inside your root folder, but don't put any web.config in your public -folder. - -``` - - - - - - - - - - - - - - - - - -``` - -Find the original [ticket here](https://github.com/panique/huge/issues/788). - -#### Testing with demo users - -By default there are two demo users, a normal user and an admin user. For more info on that please have a look on the -user role part of the small documentation block inside this readme. - -Normal user: Username is `demo2`, password is `12345678`. The user is already activated. -Admin user (can delete and suspend other users): Username is `demo`, password is `12345678`. The user is already activated. - -### What the hell are .travis.yml, .scrutinizer.yml etc. ? - -There are several files in the root folder of the project that might be irritating: - - - *.htaccess* (optionally) routes all traffic to /public/index.php! If you installed this project correctly, then this - file is not necessary, but as lots of people have problems setting up the vhost correctly, .htaccess it still there - to increase security, even on partly-broken-installations. - - *.scrutinizer.yml* (can be deleted): Configs for the external code quality analyzer Scrutinizer, just used here on - GitHub, you don't need this for your project. - - *.travis.yml* (can be deleted): Same like above. Travis is an external service that creates installations of this - repo after each code change to make sure everything runs fine. Also runs the unit tests. You don't need this inside - your project. - - *composer.json* (important): You should know what this does. ;) This file says what external dependencies are used. - - *travis-ci-apache* (can be deleted): Config file for Travis, see above, so Travis knows how to setup the Apache. - -*README* and *CHANGELOG* are self-explaining. - -### Documentation - -A real documentation is in the making. Until then, please have a look at the code and use your IDE's code completion -features to get an idea how things work, it's quite obvious when you look at the controller files, the model files and -how data is shown in the view files. A big sorry that there's no documentation yet, but time is rare and we are all -doing this for free in our free time :) - - - TODO: Full documentation - - TODO: Basic examples on how to do things - -#### How to use the different user roles - -Currently there are two types of users: Normal users and admins. There are exactly the same, but... - -1. Admin users can delete and suspend other users, they have an additional button "admin" in the navigation. Admin users -have a value of `7` inside the database table field `user_account_type`. They cannot upgrade or downgrade their accounts -(as this wouldn't make sense). - -2. Normal users don't have admin features for sure. But they can upgrade and downgrade their accounts (try it out via -/user/changeUserRole), which is basically a super-simple implementation of the basic-user / premium-user concept. -Normal users have a value of `1` or `2` inside the database table field `user_account_type`. By default all new -registered users are normal users with user role 1 for sure. - -See the "Testing with demo users" section of this readme for more info. - -There's also a very interesting [pull request adding user roles and user permissions](https://github.com/panique/huge/pull/691), -which is not integrated into the project as it's too advanced and complex. But, this might be exactly what you need, -feel free to try. - -#### How to use the CSRF feature - -To prevent [CSRF attacks](https://en.wikipedia.org/wiki/Cross-site_request_forgery), HUGE does this in the most common -way, by using a security *token* when the user submits critical forms. This means: When PHP renders a form for the user, -the application puts a "random string" inside the form (as a hidden input field), generated via Csrf::makeToken() -(application/core/Csrf.php), which also saves this token to the session. When the form is submitted, the application -checks if the POST request contains exactly the form token that is inside the session. - -This CSRF prevention feature is currently implemented on the login form process (see *application/view/login/index.php*) -and user name change form process (see *application/view/user/editUsername.php*), most other forms are not security- -critical and should stay as simple as possible. - -So, to do this with a normal form, simply: At your form, before the submit button put: -`` -Then, in the controller action validate the CSRF token submitted with the form by doing: -``` -// check if csrf token is valid -if (!Csrf::isTokenValid()) { - LoginModel::logout(); - Redirect::home(); - exit(); -} -``` - -A big thanks to OmarElGabry for implementing this! - -#### Can a user be logged in from multiple devices ? - -In theory: Yes, but this feature didn't work in my tests. As it's an external feature please have a look into the -[according ticket](https://github.com/panique/huge/pull/693) for more. - -#### Troubleshooting & Glitches - -* In 3.0 and 3.1 a user could log into the application from different devices / browsers / locations. This was intended - behaviour as this is standard in most web applications these days. In 3.2 still feature is "missing" by default, a - user will only be able to log in from one browser at the same time. This is a security improvement, but for sure not - optimal for many developers. The plan is to implement a config switch that will allow / disallow logins from multiple - browsers. -* Using this on a sub-domain ? You might get problems with the cookies in IE11. Fix this by replacing "/" with "./" of - the cookie location COOKIE_PATH inside application/config/config.xxx.php! - Check [ticket #733](https://github.com/panique/huge/issues/733) for more info. Thanks to jahbiuabft for figuring this - out. Update: There's another ticket focusing on the same issue: [ticket #681](https://github.com/panique/huge/issues/681) - -### Community-provided features & feature discussions - -There are some awesome features or feature ideas build by awesome people, but these features are too special-interest -to go into the main version of HUGE, but have a look into these tickets if you are interested: - - - [Caching system](https://github.com/panique/huge/issues/643) - - [ReCaptcha as captcha](https://github.com/panique/huge/issues/665) - - [Internationalization feature](https://github.com/panique/huge/issues/582) - - [Using controller A inside controller B](https://github.com/panique/huge/issues/706) - - [HTML mails](https://github.com/panique/huge/issues/738) - - [Deep user roles / user permission system](https://github.com/panique/huge/pull/691) - -### Future of HUGE: Announcing "soft End Of Life" - -The idea of this project is and was to provide a super-simple barebone application with a full user authentication -system inside that just works fine and stable. Due to the highly security-related nature of this script any changes -mean a lot of work, lots of testing, catching edge cases etc., and in the end I spent 90% of the time testing and fixing -new features or new features break existing stuff, and doing this is really not what anybody wants to do for free in -the rare free-time :) - -To keep the project stable, clean and maintainable, I would kindly announce the "soft-End of Life" for this project, -meaning: - -A. HUGE will not get any new features in the future, but ... -B. bugfixes and corrections will be made, probably for years - -### Coding guideline behind HUGE - -While HUGE was in development, there were 3 main rules that helped me (and probably others) to write minimal, clean - and working code. Might be useful for you too: - -1. Reduce features to the bare minimum. -2. Don't implement features that are not needed by most users. -3. Only build everything for the most common use case (like MySQL, not PostGre, NoSQL etc). - -As noted in the intro of this README, there are also some powerful concepts that might help you when developing cool -stuff: [KISS](http://en.wikipedia.org/wiki/KISS_principle), -[YAGNI](http://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it), [Feature Creep](https://en.wikipedia.org/wiki/Feature_creep), -[Minimum viable product](https://en.wikipedia.org/wiki/Minimum_viable_product). - -#### List of features / ideas provided in tickets / pull requests - -To avoid unnecessary work for all of us I would kindly recommend everybody to use HUGE for simple project that only -need the features that already exist, and if you really need a RESTful architecture, migrations, routing, 2FA etc, -then it's easier, cleaner and faster to simply use Laravel, Symfony or Zend. - -However, here are the community-suggested possible features, taken from lots of tickets. Feel free to implement them -into your forks of the project: - -* OAuth2 implementation (let your users create accounts and login via 3rd party auth, like Facebook, Twitter, GitHub, - etc). As this is a lot of work and would make the project much more complicated it might make sense to do this in a - fork or totally skip it. (see [Ticket #528](https://github.com/panique/huge/issues/528)) -* Router (map all URLs to according controller-methods inside one file), [Ticket 727](https://github.com/panique/huge/issues/727) -* RESTful architecture (see [ticket #488](https://github.com/panique/huge/issues/488) for discussion) -* Horizontal MySQL scaling (see [ticket #423](https://github.com/panique/huge/issues/423) for discussion) -* Modules / middleware -* Logging -* Two-Factor-Authentication (see [ticket #732](https://github.com/panique/huge/issues/732)) -* Controller-less URLs (see [ticket #704](https://github.com/panique/huge/issues/704)) -* Email-re-validation after email change (see [ticket #705](https://github.com/panique/huge/issues/705)) -* Connect to multiple databases (see [ticket #702](https://github.com/panique/huge/issues/702)) -* A deeper user role system (see [ticket #701](https://github.com/panique/huge/issues/701), -[pull-request #691](https://github.com/panique/huge/pull/691)), -[ticket #603](https://github.com/panique/huge/issues/603) -* How to run without using Composer [ticket #826](https://github.com/panique/huge/issues/826) - -### Why is there no support forum (anymore) ? - -There were two (!) support forums for v1 and v2 of this project (HUGE is v3), and both were vandalized by people who -didn't even read the readme and / or the install guidelines. Most asked question was "script does not work plz help" -without giving any useful information (like code or server setup or even the version used). While I'm writing these -lines somebody just asked via Twitter "how to install without Composer". You know what I mean :) - 99% of the questions -were not necessary if the people would had read the guidelines, do a minimal research on their own or would stop making -things so unnecessarily complicated. And even when writing detailed answers most of them still messed it up, resulting -in rants and complaints (for free support for a free software!). It was just frustrating to deal with this every day, -especially when people take it for totally granted that *it's the duty* of open-source developers to give detailed, -free and personal support for every "plz help"-request. - -So I decided to completely stop any free support. For serious questions about real problems inside the script please -use the GitHub issues feature. - -### Zero tolerance for idiots, trolls and vandals! - -Harsh words, but as basically every public internet project gets harassed, vandalized and trolled these days by very -strange people it's necessary: Some simple rules. - -1. Respect that this is just a simple script written by unpaid volunteers in their free-time. - This is NOT business-software you've bought for $10.000. - There's no reason to complain (!) about free open-source software. The attitude against free software - is really frustrating these days, people take everything for granted without realizing the work behind it, and the - fact that they get serious software totally for free, saving thousands of dollars. If you don't like it, then don't - use it. If you want a feature, try to take part in the process, maybe even build it by yourself and add it to the - project! Be nice and respectful. Constructive criticism is for sure always welcome! - -2. Don't bash, don't hate, don't spam, don't vandalize. Please don't ask for personal free support, don't ask if - somebody could do your work for you. Before you ask something, make sure you've read the README, followed every - tutorial, double-checked the code and tried to solve the problem by yourself. - -Trolls and very annoying people will get a permanent ban / block. GitHub has a very powerful anti-abuse team. - -### Contribute - -Please commit only in *develop* branch. The *master* branch will always contain the stable version. - -### Code-Quality scanner links - -[Scrutinizer (master branch)](https://scrutinizer-ci.com/g/panique/huge/?branch=master), -[Scrutinizer (develop branch)](https://scrutinizer-ci.com/g/panique/huge/?branch=develop), -[Code Climate](https://codeclimate.com/github/panique/huge), -[Codacy](https://www.codacy.com/public/panique/phplogin/dashboard?bid=789836), -[SensioLabs Insight](https://insight.sensiolabs.com/projects/d4f4e3c0-1445-4245-8cb2-d75026c11fa7/analyses/2). - -### Found a bug (Responsible Disclosure) ? - -Due to the possible consequences when publishing a bug on a public open-source project I'd kindly ask you to send really -big bugs to my email address, not posting this here. If the bug is not interesting for attackers: Feel free to create -an normal GitHub issue. - -### Current and further development - -See active issues here: -https://github.com/panique/huge/issues?state=open - -### Why you should use a favicon.ico in your project :) - -Interesting issue: When a user hits your website, the user's browser will also request one or more (!) favicons -(different sizes). If these static files don't exist, your application will start to generate a 404 response and a 404 -page for each file. This wastes a lot of server power and is also useless, therefore make sure you always have favicons -or handle this from Apache/nginx level. - -HUGE tries to handle this by sending an empty image in the head of the view/_templates/header.php ! - -More inside this ticket: [Return proper 404 for missing favicon.ico, missing images etc.](https://github.com/panique/huge/issues/530) - -More here on Stackflow: [How to prevent favicon.ico requests?](http://stackoverflow.com/questions/1321878/how-to-prevent-favicon-ico-requests), -[Isn't it silly that a tiny favicon requires yet another HTTP request? How to make favicon go into a sprite?](http://stackoverflow.com/questions/5199902/isnt-it-silly-that-a-tiny-favicon-requires-yet-another-http-request-how-to-mak?lq=1). - -### Useful links - -- [How long will my session last?](http://stackoverflow.com/questions/1516266/how-long-will-my-session-last/1516338#1516338) -- [How to do expire a PHP session after X minutes?](http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes/1270960#1270960) -- [How to use PDO](http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers) -- [A short guideline on how to use the PHP 5.5 password hashing functions and its PHP 5.3 & 5.4 implementations](http://www.dev-metal.com/use-php-5-5-password-hashing-functions/) -- [How to setup latest version of PHP 5.5 on Ubuntu 12.04 LTS](http://www.dev-metal.com/how-to-setup-latest-version-of-php-5-5-on-ubuntu-12-04-lts/) -- [How to setup latest version of PHP 5.5 on Debian Wheezy 7.0/7.1 (and how to fix the GPG key error)](http://www.dev-metal.com/setup-latest-version-php-5-5-debian-wheezy-7-07-1-fix-gpg-key-error/) -- [Notes on password & hashing salting in upcoming PHP versions (PHP 5.5.x & 5.6 etc.)](https://github.com/panique/huge/wiki/Notes-on-password-&-hashing-salting-in-upcoming-PHP-versions-%28PHP-5.5.x-&-5.6-etc.%29) -- [Some basic "benchmarks" of all PHP hash/salt algorithms](https://github.com/panique/huge/wiki/Which-hashing-&-salting-algorithm-should-be-used-%3F) -- [How to prevent PHP sessions being shared between different apache vhosts / different applications](http://www.dev-metal.com/prevent-php-sessions-shared-different-apache-vhosts-different-applications/) - -## Interesting links regarding user authentication and application security - -- [interesting article about password resets (by Troy Hunt, security expert)](http://www.troyhunt.com/2012/05/everything-you-ever-wanted-to-know.html) -- Password-Free Email Logins: [Ticket & discussion](https://github.com/panique/huge/issues/674), [article](http://techcrunch.com/2015/06/30/blogging-site-medium-rolls-out-password-free-email-logins/?ref=webdesignernews.com) -- Logging in via QR code: [Ticket & discussion](https://github.com/panique/huge/issues/290), [english article](https://www.grc.com/sqrl/sqrl.htm), - [german article](http://www.phpgangsta.de/sesam-oeffne-dich-sicher-einloggen-im-internetcafe), - [repo](https://github.com/PHPGangsta/Sesame), [live-demo](http://sesame.phpgangsta.de/). Big thanks to *PHPGangsta* for writing this! - -### My blog - -I'm also blogging at **[Dev Metal](http://www.dev-metal.com)**. +- `public/` (Webroot, `.htaccess`, `index.php`) +- `application/controller/` (Controller) +- `application/model/` (Modelle) +- `application/view/` (Views) +- `application/config/` (Konfiguration je Environment) +- `application/_installation/` (SQL-Skripte) +- `vendor/` (Composer-Abhängigkeiten) +- `tests/` (PHPUnit) diff --git a/composer.lock b/composer.lock deleted file mode 100644 index af67e06..0000000 --- a/composer.lock +++ /dev/null @@ -1,1374 +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": "20821c10675bc4dd005e512556018d4f", - "packages": [], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.5.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b", - "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "require-dev": { - "doctrine/coding-standard": "^9 || ^11", - "ext-pdo": "*", - "ext-phar": "*", - "phpbench/phpbench": "^0.16 || ^1", - "phpstan/phpstan": "^1.4", - "phpstan/phpstan-phpunit": "^1", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", - "vimeo/psalm": "^4.30 || ^5.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "https://ocramius.github.io/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://www.doctrine-project.org/projects/instantiator.html", - "keywords": [ - "constructor", - "instantiate" - ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/1.5.0" - }, - "funding": [ - { - "url": "https://www.doctrine-project.org/sponsorship.html", - "type": "custom" - }, - { - "url": "https://www.patreon.com/phpdoctrine", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", - "type": "tidelift" - } - ], - "time": "2022-12-30T00:15:36+00:00" - }, - { - "name": "gregwar/captcha", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/Gregwar/Captcha.git", - "reference": "4edbcd09fde4353b94ce550f43460eba73baf2cc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/4edbcd09fde4353b94ce550f43460eba73baf2cc", - "reference": "4edbcd09fde4353b94ce550f43460eba73baf2cc", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "ext-gd": "*", - "ext-mbstring": "*", - "php": ">=5.3.0", - "symfony/finder": "*" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7.21 || ^6.4 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Gregwar\\": "src/Gregwar" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Passault", - "email": "g.passault@gmail.com", - "homepage": "http://www.gregwar.com/" - }, - { - "name": "Jeremy Livingston", - "email": "jeremy.j.livingston@gmail.com" - } - ], - "description": "Captcha generator", - "homepage": "https://github.com/Gregwar/Captcha", - "keywords": [ - "bot", - "captcha", - "spam" - ], - "support": { - "issues": "https://github.com/Gregwar/Captcha/issues", - "source": "https://github.com/Gregwar/Captcha/tree/v1.3.0" - }, - "time": "2025-06-23T12:25:54+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "2.0.5", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "reference": "e6a969a640b00d8daa3c66518b0405fb41ae0c4b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "suggest": { - "dflydev/markdown": "~1.0", - "erusev/parsedown": "~1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-0": { - "phpDocumentor": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "mike.vanriel@naenius.com" - } - ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/2.x" - }, - "time": "2016-01-25T08:17:30+00:00" - }, - { - "name": "phpmailer/phpmailer", - "version": "v6.12.0", - "source": { - "type": "git", - "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/d1ac35d784bf9f5e61b424901d5a014967f15b12", - "reference": "d1ac35d784bf9f5e61b424901d5a014967f15b12", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-filter": "*", - "ext-hash": "*", - "php": ">=5.5.0" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/annotations": "^1.2.6 || ^1.13.3", - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.3.2", - "phpcompatibility/php-compatibility": "^9.3.5", - "roave/security-advisories": "dev-latest", - "squizlabs/php_codesniffer": "^3.7.2", - "yoast/phpunit-polyfills": "^1.0.4" - }, - "suggest": { - "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication", - "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses", - "ext-openssl": "Needed for secure SMTP sending and DKIM signing", - "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication", - "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", - "league/oauth2-google": "Needed for Google XOAUTH2 authentication", - "psr/log": "For optional PSR-3 debug logging", - "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)", - "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication" - }, - "type": "library", - "autoload": { - "psr-4": { - "PHPMailer\\PHPMailer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-2.1-only" - ], - "authors": [ - { - "name": "Marcus Bointon", - "email": "phpmailer@synchromedia.co.uk" - }, - { - "name": "Jim Jagielski", - "email": "jimjag@gmail.com" - }, - { - "name": "Andy Prevost", - "email": "codeworxtech@users.sourceforge.net" - }, - { - "name": "Brent R. Matzelle" - } - ], - "description": "PHPMailer is a full-featured email creation and transfer class for PHP", - "support": { - "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.12.0" - }, - "funding": [ - { - "url": "https://github.com/Synchro", - "type": "github" - } - ], - "time": "2025-10-15T16:49:08+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "phpdocumentor/reflection-docblock": "~2.0", - "sebastian/comparator": "~1.1" - }, - "require-dev": { - "phpspec/phpspec": "~2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/master" - }, - "time": "2015-08-13T10:07:40+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "2.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "phpunit/php-file-iterator": "~1.3", - "phpunit/php-text-template": "~1.2", - "phpunit/php-token-stream": "~1.3", - "sebastian/environment": "^1.3.2", - "sebastian/version": "~1.0" - }, - "require-dev": { - "ext-xdebug": ">=2.1.4", - "phpunit/phpunit": "~4" - }, - "suggest": { - "ext-dom": "*", - "ext-xdebug": ">=2.2.1", - "ext-xmlwriter": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/2.2" - }, - "time": "2015-10-06T15:47:00+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4", - "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" - }, - "time": "2017-11-27T13:52:08+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" - }, - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260", - "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4|~5" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" - }, - "time": "2016-05-12T18:03:57+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "1.4.12", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/1ce90ba27c42e4e44e6d8458241466380b51fa16", - "reference": "1ce90ba27c42e4e44e6d8458241466380b51fa16", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/1.4" - }, - "abandoned": true, - "time": "2017-12-04T08:55:13+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "4.8.36", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "46023de9a91eec7dfb06cc56cb4e260017298517" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/46023de9a91eec7dfb06cc56cb4e260017298517", - "reference": "46023de9a91eec7dfb06cc56cb4e260017298517", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-pcre": "*", - "ext-reflection": "*", - "ext-spl": "*", - "php": ">=5.3.3", - "phpspec/prophecy": "^1.3.1", - "phpunit/php-code-coverage": "~2.1", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "~2.3", - "sebastian/comparator": "~1.2.2", - "sebastian/diff": "~1.2", - "sebastian/environment": "~1.3", - "sebastian/exporter": "~1.2", - "sebastian/global-state": "~1.0", - "sebastian/version": "~1.0", - "symfony/yaml": "~2.1|~3.0" - }, - "suggest": { - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.8.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/4.8.36" - }, - "time": "2017-06-21T08:07:12+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "2.3.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": ">=5.3.3", - "phpunit/php-text-template": "~1.2", - "sebastian/exporter": "~1.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", - "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/2.3" - }, - "abandoned": true, - "time": "2015-10-02T06:51:40+00:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/1.2" - }, - "time": "2017-01-29T09:50:25+00:00" - }, - { - "name": "sebastian/diff", - "version": "1.4.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e", - "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, - "time": "2015-12-08T07:14:41+00:00" - }, - { - "name": "sebastian/environment", - "version": "1.3.7", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716", - "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/1.3.7" - }, - "time": "2016-05-17T03:18:57+00:00" - }, - { - "name": "sebastian/exporter", - "version": "1.2.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/42c4c2eec485ee3e159ec9884f95b431287edde4", - "reference": "42c4c2eec485ee3e159ec9884f95b431287edde4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~1.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/master" - }, - "time": "2016-06-17T09:04:28+00:00" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1" - }, - "time": "2015-10-12T03:26:01+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "reference": "b19cc3298482a335a95f3016d2f8a6950f0fbcd7", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/master" - }, - "time": "2016-10-03T07:41:43+00:00" - }, - { - "name": "sebastian/version", - "version": "1.0.6", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6", - "shasum": "" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/1.0.6" - }, - "time": "2015-06-21T13:59:46+00:00" - }, - { - "name": "symfony/finder", - "version": "v7.3.5", - "source": { - "type": "git", - "url": "https://github.com/symfony/finder.git", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/9f696d2f1e340484b4683f7853b273abff94421f", - "reference": "9f696d2f1e340484b4683f7853b273abff94421f", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "symfony/filesystem": "^6.4|^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Finder\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Finds files and directories via an intuitive fluent interface", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v7.3.5" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2025-10-15T18:45:57+00:00" - }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.33.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.33.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://github.com/nicolas-grekas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2024-09-09T11:45:10+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.4.47", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "88289caa3c166321883f67fe5130188ebbb47094" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/88289caa3c166321883f67fe5130188ebbb47094", - "reference": "88289caa3c166321883f67fe5130188ebbb47094", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-ctype": "~1.8" - }, - "conflict": { - "symfony/console": "<3.4" - }, - "require-dev": { - "symfony/console": "~3.4|~4.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/yaml/tree/v3.4.47" - }, - "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": "2020-10-24T10:57:07+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": {}, - "platform-dev": { - "php": ">=5.5.0" - }, - "plugin-api-version": "2.9.0" -}