first commit
This commit is contained in:
8
.devcontainer/devcontainer.json
Normal file
8
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"name": "ARM Dev Container",
|
||||||
|
"image": "arm64v8/debian:bullseye",
|
||||||
|
"postCreateCommand": "echo Hello from Dev Container!",
|
||||||
|
"settings": {
|
||||||
|
"terminal.integrated.shell.linux": "/bin/bash"
|
||||||
|
}
|
||||||
|
}
|
||||||
5
composer.json
Normal file
5
composer.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"require": {
|
||||||
|
"phpseclib/bcmath_compat": "^2.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
308
composer.lock
generated
Normal file
308
composer.lock
generated
Normal file
@@ -0,0 +1,308 @@
|
|||||||
|
{
|
||||||
|
"_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": "153efce1ad7c016de8c0ffb3e84d3046",
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "paragonie/constant_time_encoding",
|
||||||
|
"version": "v3.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/paragonie/constant_time_encoding.git",
|
||||||
|
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
|
||||||
|
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9",
|
||||||
|
"vimeo/psalm": "^4|^5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"ParagonIE\\ConstantTime\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com",
|
||||||
|
"role": "Maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steve 'Sc00bz' Thomas",
|
||||||
|
"email": "steve@tobtu.com",
|
||||||
|
"homepage": "https://www.tobtu.com",
|
||||||
|
"role": "Original Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
|
||||||
|
"keywords": [
|
||||||
|
"base16",
|
||||||
|
"base32",
|
||||||
|
"base32_decode",
|
||||||
|
"base32_encode",
|
||||||
|
"base64",
|
||||||
|
"base64_decode",
|
||||||
|
"base64_encode",
|
||||||
|
"bin2hex",
|
||||||
|
"encoding",
|
||||||
|
"hex",
|
||||||
|
"hex2bin",
|
||||||
|
"rfc4648"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
|
||||||
|
"source": "https://github.com/paragonie/constant_time_encoding"
|
||||||
|
},
|
||||||
|
"time": "2024-05-08T12:36:18+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "paragonie/random_compat",
|
||||||
|
"version": "v9.99.100",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/paragonie/random_compat.git",
|
||||||
|
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
|
||||||
|
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">= 7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "4.*|5.*",
|
||||||
|
"vimeo/psalm": "^1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||||
|
"keywords": [
|
||||||
|
"csprng",
|
||||||
|
"polyfill",
|
||||||
|
"pseudorandom",
|
||||||
|
"random"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"issues": "https://github.com/paragonie/random_compat/issues",
|
||||||
|
"source": "https://github.com/paragonie/random_compat"
|
||||||
|
},
|
||||||
|
"time": "2020-10-15T08:29:30+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpseclib/bcmath_compat",
|
||||||
|
"version": "2.0.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpseclib/bcmath_compat.git",
|
||||||
|
"reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a",
|
||||||
|
"reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"phpseclib/phpseclib": "^3.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"ext-bcmath": "8.1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4",
|
||||||
|
"squizlabs/php_codesniffer": "^3.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gmp": "Will enable faster math operations"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"lib/bcmath.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"bcmath_compat\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jim Wigginton",
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"homepage": "http://phpseclib.sourceforge.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP 5.x-8.x polyfill for bcmath extension",
|
||||||
|
"keywords": [
|
||||||
|
"BigInteger",
|
||||||
|
"bcmath",
|
||||||
|
"bigdecimal",
|
||||||
|
"math",
|
||||||
|
"polyfill"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"issues": "https://github.com/phpseclib/bcmath_compat/issues",
|
||||||
|
"source": "https://github.com/phpseclib/bcmath_compat"
|
||||||
|
},
|
||||||
|
"time": "2024-06-06T14:17:54+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpseclib/phpseclib",
|
||||||
|
"version": "3.0.46",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||||
|
"reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6",
|
||||||
|
"reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"paragonie/constant_time_encoding": "^1|^2|^3",
|
||||||
|
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
|
||||||
|
"php": ">=5.6.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "*"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-dom": "Install the DOM extension to load XML formatted public keys.",
|
||||||
|
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
|
||||||
|
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||||
|
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||||
|
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"phpseclib/bootstrap.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"phpseclib3\\": "phpseclib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jim Wigginton",
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"role": "Lead Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Patrick Monnerat",
|
||||||
|
"email": "pm@datasphere.ch",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andreas Fischer",
|
||||||
|
"email": "bantu@phpbb.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hans-Jürgen Petrich",
|
||||||
|
"email": "petrich@tronic-media.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Graham Campbell",
|
||||||
|
"email": "graham@alt-three.com",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
|
||||||
|
"homepage": "http://phpseclib.sourceforge.net",
|
||||||
|
"keywords": [
|
||||||
|
"BigInteger",
|
||||||
|
"aes",
|
||||||
|
"asn.1",
|
||||||
|
"asn1",
|
||||||
|
"blowfish",
|
||||||
|
"crypto",
|
||||||
|
"cryptography",
|
||||||
|
"encryption",
|
||||||
|
"rsa",
|
||||||
|
"security",
|
||||||
|
"sftp",
|
||||||
|
"signature",
|
||||||
|
"signing",
|
||||||
|
"ssh",
|
||||||
|
"twofish",
|
||||||
|
"x.509",
|
||||||
|
"x509"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/phpseclib/phpseclib/issues",
|
||||||
|
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.46"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/terrafrost",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://www.patreon.com/phpseclib",
|
||||||
|
"type": "patreon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2025-06-26T16:29:55+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"
|
||||||
|
}
|
||||||
BIN
composer.phar
Executable file
BIN
composer.phar
Executable file
Binary file not shown.
17
docker-compose.yml
Normal file
17
docker-compose.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
version: '3'
|
||||||
|
services:
|
||||||
|
code-server:
|
||||||
|
image: codercom/code-server:latest
|
||||||
|
container_name: ecommerce-shop_code_server
|
||||||
|
ports:
|
||||||
|
- "10400:8080" # code-server
|
||||||
|
- "10401:8000" # PHP dev server (optional)
|
||||||
|
environment:
|
||||||
|
- PASSWORD=2005
|
||||||
|
- CERT=false
|
||||||
|
volumes:
|
||||||
|
- ./:/home/coder/project
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
working_dir: /home/coder/project
|
||||||
|
user: "1000:1000"
|
||||||
|
restart: unless-stopped
|
||||||
6
install.sh
Normal file
6
install.sh
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
|
||||||
|
php -r "if (hash_file('sha384', 'composer-setup.php') === 'dac665fdc30fdd8ec78b38b9800061b4150413ff2e3b6f88543c636f7cd84f6db9189d43a81e5503cda447da73c7e5b6') { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); exit(1); }"
|
||||||
|
php composer-setup.php
|
||||||
|
php -r "unlink('composer-setup.php');"
|
||||||
8
server/.env.example
Normal file
8
server/.env.example
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
HOST=0.0.0.0
|
||||||
|
PORT=1337
|
||||||
|
APP_KEYS="toBeModified1,toBeModified2"
|
||||||
|
API_TOKEN_SALT=tobemodified
|
||||||
|
ADMIN_JWT_SECRET=tobemodified
|
||||||
|
TRANSFER_TOKEN_SALT=tobemodified
|
||||||
|
JWT_SECRET=tobemodified
|
||||||
|
ENCRYPTION_KEY=tobemodified
|
||||||
131
server/.gitignore
vendored
Normal file
131
server/.gitignore
vendored
Normal file
@@ -0,0 +1,131 @@
|
|||||||
|
############################
|
||||||
|
# OS X
|
||||||
|
############################
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
Icon
|
||||||
|
.Spotlight-V100
|
||||||
|
.Trashes
|
||||||
|
._*
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Linux
|
||||||
|
############################
|
||||||
|
|
||||||
|
*~
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Windows
|
||||||
|
############################
|
||||||
|
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
Desktop.ini
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Packages
|
||||||
|
############################
|
||||||
|
|
||||||
|
*.7z
|
||||||
|
*.csv
|
||||||
|
*.dat
|
||||||
|
*.dmg
|
||||||
|
*.gz
|
||||||
|
*.iso
|
||||||
|
*.jar
|
||||||
|
*.rar
|
||||||
|
*.tar
|
||||||
|
*.zip
|
||||||
|
*.com
|
||||||
|
*.class
|
||||||
|
*.dll
|
||||||
|
*.exe
|
||||||
|
*.o
|
||||||
|
*.seed
|
||||||
|
*.so
|
||||||
|
*.swo
|
||||||
|
*.swp
|
||||||
|
*.swn
|
||||||
|
*.swm
|
||||||
|
*.out
|
||||||
|
*.pid
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Logs and databases
|
||||||
|
############################
|
||||||
|
|
||||||
|
.tmp
|
||||||
|
*.log
|
||||||
|
*.sql
|
||||||
|
*.sqlite
|
||||||
|
*.sqlite3
|
||||||
|
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Misc.
|
||||||
|
############################
|
||||||
|
|
||||||
|
*#
|
||||||
|
ssl
|
||||||
|
.idea
|
||||||
|
nbproject
|
||||||
|
public/uploads/*
|
||||||
|
!public/uploads/.gitkeep
|
||||||
|
.tsbuildinfo
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Node.js
|
||||||
|
############################
|
||||||
|
|
||||||
|
lib-cov
|
||||||
|
lcov.info
|
||||||
|
pids
|
||||||
|
logs
|
||||||
|
results
|
||||||
|
node_modules
|
||||||
|
.node_history
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Package managers
|
||||||
|
############################
|
||||||
|
|
||||||
|
.yarn/*
|
||||||
|
!.yarn/cache
|
||||||
|
!.yarn/unplugged
|
||||||
|
!.yarn/patches
|
||||||
|
!.yarn/releases
|
||||||
|
!.yarn/sdks
|
||||||
|
!.yarn/versions
|
||||||
|
.pnp.*
|
||||||
|
yarn-error.log
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Tests
|
||||||
|
############################
|
||||||
|
|
||||||
|
coverage
|
||||||
|
|
||||||
|
############################
|
||||||
|
# Strapi
|
||||||
|
############################
|
||||||
|
|
||||||
|
.env
|
||||||
|
license.txt
|
||||||
|
exports
|
||||||
|
.strapi
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
.strapi-updater.json
|
||||||
|
.strapi-cloud.json
|
||||||
61
server/README.md
Normal file
61
server/README.md
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# 🚀 Getting started with Strapi
|
||||||
|
|
||||||
|
Strapi comes with a full featured [Command Line Interface](https://docs.strapi.io/dev-docs/cli) (CLI) which lets you scaffold and manage your project in seconds.
|
||||||
|
|
||||||
|
### `develop`
|
||||||
|
|
||||||
|
Start your Strapi application with autoReload enabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-develop)
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run develop
|
||||||
|
# or
|
||||||
|
yarn develop
|
||||||
|
```
|
||||||
|
|
||||||
|
### `start`
|
||||||
|
|
||||||
|
Start your Strapi application with autoReload disabled. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-start)
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run start
|
||||||
|
# or
|
||||||
|
yarn start
|
||||||
|
```
|
||||||
|
|
||||||
|
### `build`
|
||||||
|
|
||||||
|
Build your admin panel. [Learn more](https://docs.strapi.io/dev-docs/cli#strapi-build)
|
||||||
|
|
||||||
|
```
|
||||||
|
npm run build
|
||||||
|
# or
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
## ⚙️ Deployment
|
||||||
|
|
||||||
|
Strapi gives you many possible deployment options for your project including [Strapi Cloud](https://cloud.strapi.io). Browse the [deployment section of the documentation](https://docs.strapi.io/dev-docs/deployment) to find the best solution for your use case.
|
||||||
|
|
||||||
|
```
|
||||||
|
yarn strapi deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📚 Learn more
|
||||||
|
|
||||||
|
- [Resource center](https://strapi.io/resource-center) - Strapi resource center.
|
||||||
|
- [Strapi documentation](https://docs.strapi.io) - Official Strapi documentation.
|
||||||
|
- [Strapi tutorials](https://strapi.io/tutorials) - List of tutorials made by the core team and the community.
|
||||||
|
- [Strapi blog](https://strapi.io/blog) - Official Strapi blog containing articles made by the Strapi team and the community.
|
||||||
|
- [Changelog](https://strapi.io/changelog) - Find out about the Strapi product updates, new features and general improvements.
|
||||||
|
|
||||||
|
Feel free to check out the [Strapi GitHub repository](https://github.com/strapi/strapi). Your feedback and contributions are welcome!
|
||||||
|
|
||||||
|
## ✨ Community
|
||||||
|
|
||||||
|
- [Discord](https://discord.strapi.io) - Come chat with the Strapi community including the core team.
|
||||||
|
- [Forum](https://forum.strapi.io/) - Place to discuss, ask questions and find answers, show your Strapi project and get feedback or just talk with other Community members.
|
||||||
|
- [Awesome Strapi](https://github.com/strapi/awesome-strapi) - A curated list of awesome things related to Strapi.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<sub>🤫 Psst! [Strapi is hiring](https://strapi.io/careers).</sub>
|
||||||
17
server/config/admin.js
Normal file
17
server/config/admin.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
module.exports = ({ env }) => ({
|
||||||
|
auth: {
|
||||||
|
secret: env('ADMIN_JWT_SECRET'),
|
||||||
|
},
|
||||||
|
apiToken: {
|
||||||
|
salt: env('API_TOKEN_SALT'),
|
||||||
|
},
|
||||||
|
transfer: {
|
||||||
|
token: {
|
||||||
|
salt: env('TRANSFER_TOKEN_SALT'),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
flags: {
|
||||||
|
nps: env.bool('FLAG_NPS', true),
|
||||||
|
promoteEE: env.bool('FLAG_PROMOTE_EE', true),
|
||||||
|
},
|
||||||
|
});
|
||||||
7
server/config/api.js
Normal file
7
server/config/api.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
module.exports = {
|
||||||
|
rest: {
|
||||||
|
defaultLimit: 25,
|
||||||
|
maxLimit: 100,
|
||||||
|
withCount: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
60
server/config/database.js
Normal file
60
server/config/database.js
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
module.exports = ({ env }) => {
|
||||||
|
const client = env('DATABASE_CLIENT', 'sqlite');
|
||||||
|
|
||||||
|
const connections = {
|
||||||
|
mysql: {
|
||||||
|
connection: {
|
||||||
|
host: env('DATABASE_HOST', 'localhost'),
|
||||||
|
port: env.int('DATABASE_PORT', 3306),
|
||||||
|
database: env('DATABASE_NAME', 'strapi'),
|
||||||
|
user: env('DATABASE_USERNAME', 'strapi'),
|
||||||
|
password: env('DATABASE_PASSWORD', 'strapi'),
|
||||||
|
ssl: env.bool('DATABASE_SSL', false) && {
|
||||||
|
key: env('DATABASE_SSL_KEY', undefined),
|
||||||
|
cert: env('DATABASE_SSL_CERT', undefined),
|
||||||
|
ca: env('DATABASE_SSL_CA', undefined),
|
||||||
|
capath: env('DATABASE_SSL_CAPATH', undefined),
|
||||||
|
cipher: env('DATABASE_SSL_CIPHER', undefined),
|
||||||
|
rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
pool: { min: env.int('DATABASE_POOL_MIN', 2), max: env.int('DATABASE_POOL_MAX', 10) },
|
||||||
|
},
|
||||||
|
postgres: {
|
||||||
|
connection: {
|
||||||
|
connectionString: env('DATABASE_URL'),
|
||||||
|
host: env('DATABASE_HOST', 'localhost'),
|
||||||
|
port: env.int('DATABASE_PORT', 5432),
|
||||||
|
database: env('DATABASE_NAME', 'strapi'),
|
||||||
|
user: env('DATABASE_USERNAME', 'strapi'),
|
||||||
|
password: env('DATABASE_PASSWORD', 'strapi'),
|
||||||
|
ssl: env.bool('DATABASE_SSL', false) && {
|
||||||
|
key: env('DATABASE_SSL_KEY', undefined),
|
||||||
|
cert: env('DATABASE_SSL_CERT', undefined),
|
||||||
|
ca: env('DATABASE_SSL_CA', undefined),
|
||||||
|
capath: env('DATABASE_SSL_CAPATH', undefined),
|
||||||
|
cipher: env('DATABASE_SSL_CIPHER', undefined),
|
||||||
|
rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
|
||||||
|
},
|
||||||
|
schema: env('DATABASE_SCHEMA', 'public'),
|
||||||
|
},
|
||||||
|
pool: { min: env.int('DATABASE_POOL_MIN', 2), max: env.int('DATABASE_POOL_MAX', 10) },
|
||||||
|
},
|
||||||
|
sqlite: {
|
||||||
|
connection: {
|
||||||
|
filename: path.join(__dirname, '..', env('DATABASE_FILENAME', '.tmp/data.db')),
|
||||||
|
},
|
||||||
|
useNullAsDefault: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
connection: {
|
||||||
|
client,
|
||||||
|
...connections[client],
|
||||||
|
acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
||||||
12
server/config/middlewares.js
Normal file
12
server/config/middlewares.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
module.exports = [
|
||||||
|
'strapi::logger',
|
||||||
|
'strapi::errors',
|
||||||
|
'strapi::security',
|
||||||
|
'strapi::cors',
|
||||||
|
'strapi::poweredBy',
|
||||||
|
'strapi::query',
|
||||||
|
'strapi::body',
|
||||||
|
'strapi::session',
|
||||||
|
'strapi::favicon',
|
||||||
|
'strapi::public',
|
||||||
|
];
|
||||||
1
server/config/plugins.js
Normal file
1
server/config/plugins.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = () => ({});
|
||||||
11
server/config/server.js
Normal file
11
server/config/server.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
module.exports = ({ env }) => ({
|
||||||
|
host: env('HOST', '0.0.0.0'),
|
||||||
|
port: env.int('PORT', 1337),
|
||||||
|
url:"http://code.mykolafesenko.de/proxy/1337",
|
||||||
|
app: {
|
||||||
|
keys: env.array('APP_KEYS'),
|
||||||
|
},
|
||||||
|
webhooks: {
|
||||||
|
populateRelations: env.bool('WEBHOOKS_POPULATE_RELATIONS', false),
|
||||||
|
},
|
||||||
|
});
|
||||||
0
server/database/migrations/.gitkeep
Normal file
0
server/database/migrations/.gitkeep
Normal file
BIN
server/favicon.png
Normal file
BIN
server/favicon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 497 B |
8
server/jsconfig.json
Normal file
8
server/jsconfig.json
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
|
"target": "ES2021",
|
||||||
|
"checkJs": true,
|
||||||
|
"allowJs": true
|
||||||
|
}
|
||||||
|
}
|
||||||
16669
server/package-lock.json
generated
Normal file
16669
server/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
36
server/package.json
Normal file
36
server/package.json
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
{
|
||||||
|
"name": "server",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"private": true,
|
||||||
|
"description": "A Strapi application",
|
||||||
|
"scripts": {
|
||||||
|
"build": "strapi build",
|
||||||
|
"console": "strapi console",
|
||||||
|
"deploy": "strapi deploy",
|
||||||
|
"dev": "strapi develop",
|
||||||
|
"develop": "strapi develop",
|
||||||
|
"start": "strapi start",
|
||||||
|
"strapi": "strapi",
|
||||||
|
"upgrade": "npx @strapi/upgrade latest",
|
||||||
|
"upgrade:dry": "npx @strapi/upgrade latest --dry"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@strapi/plugin-cloud": "5.18.0",
|
||||||
|
"@strapi/plugin-users-permissions": "5.18.0",
|
||||||
|
"@strapi/strapi": "5.18.0",
|
||||||
|
"better-sqlite3": "11.3.0",
|
||||||
|
"react": "^18.0.0",
|
||||||
|
"react-dom": "^18.0.0",
|
||||||
|
"react-router-dom": "^6.0.0",
|
||||||
|
"styled-components": "^6.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18.0.0 <=22.x.x",
|
||||||
|
"npm": ">=6.0.0"
|
||||||
|
},
|
||||||
|
"strapi": {
|
||||||
|
"uuid": "fb71a766-da17-4dcc-a61c-09a2f11d454e",
|
||||||
|
"installId": "69fe70a2bce636a58ef5239194e2219a8076a395c7c42d14dfc7b2640f5afb20"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
server/public/robots.txt
Normal file
3
server/public/robots.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# To prevent search engines from seeing the site altogether, uncomment the next two lines:
|
||||||
|
# User-Agent: *
|
||||||
|
# Disallow: /
|
||||||
0
server/public/uploads/.gitkeep
Normal file
0
server/public/uploads/.gitkeep
Normal file
39
server/src/admin/app.example.js
Normal file
39
server/src/admin/app.example.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
const config = {
|
||||||
|
locales: [
|
||||||
|
// 'ar',
|
||||||
|
// 'fr',
|
||||||
|
// 'cs',
|
||||||
|
// 'de',
|
||||||
|
// 'dk',
|
||||||
|
// 'es',
|
||||||
|
// 'he',
|
||||||
|
// 'id',
|
||||||
|
// 'it',
|
||||||
|
// 'ja',
|
||||||
|
// 'ko',
|
||||||
|
// 'ms',
|
||||||
|
// 'nl',
|
||||||
|
// 'no',
|
||||||
|
// 'pl',
|
||||||
|
// 'pt-BR',
|
||||||
|
// 'pt',
|
||||||
|
// 'ru',
|
||||||
|
// 'sk',
|
||||||
|
// 'sv',
|
||||||
|
// 'th',
|
||||||
|
// 'tr',
|
||||||
|
// 'uk',
|
||||||
|
// 'vi',
|
||||||
|
// 'zh-Hans',
|
||||||
|
// 'zh',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
const bootstrap = (app) => {
|
||||||
|
console.log(app);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default {
|
||||||
|
config,
|
||||||
|
bootstrap,
|
||||||
|
};
|
||||||
16
server/src/admin/vite.config.js
Normal file
16
server/src/admin/vite.config.js
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
const { mergeConfig } = require('vite');
|
||||||
|
|
||||||
|
module.exports = (config) => {
|
||||||
|
// Important: always return the modified config
|
||||||
|
return mergeConfig(config, {
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': '/src',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
allowedHosts: ["code.mykolafesenko.de"]
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
};
|
||||||
0
server/src/api/.gitkeep
Normal file
0
server/src/api/.gitkeep
Normal file
0
server/src/extensions/.gitkeep
Normal file
0
server/src/extensions/.gitkeep
Normal file
20
server/src/index.js
Normal file
20
server/src/index.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
/**
|
||||||
|
* An asynchronous register function that runs before
|
||||||
|
* your application is initialized.
|
||||||
|
*
|
||||||
|
* This gives you an opportunity to extend code.
|
||||||
|
*/
|
||||||
|
register(/*{ strapi }*/) {},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An asynchronous bootstrap function that runs before
|
||||||
|
* your application gets started.
|
||||||
|
*
|
||||||
|
* This gives you an opportunity to set up your data model,
|
||||||
|
* run jobs, or perform some special logic.
|
||||||
|
*/
|
||||||
|
bootstrap(/*{ strapi }*/) {},
|
||||||
|
};
|
||||||
3
server/types/generated/components.d.ts
vendored
Normal file
3
server/types/generated/components.d.ts
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/*
|
||||||
|
* The app doesn't have any components yet.
|
||||||
|
*/
|
||||||
897
server/types/generated/contentTypes.d.ts
vendored
Normal file
897
server/types/generated/contentTypes.d.ts
vendored
Normal file
@@ -0,0 +1,897 @@
|
|||||||
|
import type { Schema, Struct } from '@strapi/strapi';
|
||||||
|
|
||||||
|
export interface AdminApiToken extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_api_tokens';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Api Token';
|
||||||
|
name: 'Api Token';
|
||||||
|
pluralName: 'api-tokens';
|
||||||
|
singularName: 'api-token';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
accessKey: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
description: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}> &
|
||||||
|
Schema.Attribute.DefaultTo<''>;
|
||||||
|
encryptedKey: Schema.Attribute.Text &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
expiresAt: Schema.Attribute.DateTime;
|
||||||
|
lastUsedAt: Schema.Attribute.DateTime;
|
||||||
|
lifespan: Schema.Attribute.BigInteger;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<'oneToMany', 'admin::api-token'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
permissions: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'admin::api-token-permission'
|
||||||
|
>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
type: Schema.Attribute.Enumeration<['read-only', 'full-access', 'custom']> &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.DefaultTo<'read-only'>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminApiTokenPermission extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_api_token_permissions';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'API Token Permission';
|
||||||
|
name: 'API Token Permission';
|
||||||
|
pluralName: 'api-token-permissions';
|
||||||
|
singularName: 'api-token-permission';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
action: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'admin::api-token-permission'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
token: Schema.Attribute.Relation<'manyToOne', 'admin::api-token'>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminPermission extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'admin_permissions';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Permission';
|
||||||
|
name: 'Permission';
|
||||||
|
pluralName: 'permissions';
|
||||||
|
singularName: 'permission';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
action: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
actionParameters: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<{}>;
|
||||||
|
conditions: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<[]>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<'oneToMany', 'admin::permission'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
properties: Schema.Attribute.JSON & Schema.Attribute.DefaultTo<{}>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
role: Schema.Attribute.Relation<'manyToOne', 'admin::role'>;
|
||||||
|
subject: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminRole extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'admin_roles';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Role';
|
||||||
|
name: 'Role';
|
||||||
|
pluralName: 'roles';
|
||||||
|
singularName: 'role';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
code: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
description: Schema.Attribute.String;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<'oneToMany', 'admin::role'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
permissions: Schema.Attribute.Relation<'oneToMany', 'admin::permission'>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
users: Schema.Attribute.Relation<'manyToMany', 'admin::user'>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminTransferToken extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_transfer_tokens';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Transfer Token';
|
||||||
|
name: 'Transfer Token';
|
||||||
|
pluralName: 'transfer-tokens';
|
||||||
|
singularName: 'transfer-token';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
accessKey: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
description: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}> &
|
||||||
|
Schema.Attribute.DefaultTo<''>;
|
||||||
|
expiresAt: Schema.Attribute.DateTime;
|
||||||
|
lastUsedAt: Schema.Attribute.DateTime;
|
||||||
|
lifespan: Schema.Attribute.BigInteger;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'admin::transfer-token'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
permissions: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'admin::transfer-token-permission'
|
||||||
|
>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminTransferTokenPermission
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_transfer_token_permissions';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Transfer Token Permission';
|
||||||
|
name: 'Transfer Token Permission';
|
||||||
|
pluralName: 'transfer-token-permissions';
|
||||||
|
singularName: 'transfer-token-permission';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
action: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'admin::transfer-token-permission'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
token: Schema.Attribute.Relation<'manyToOne', 'admin::transfer-token'>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AdminUser extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'admin_users';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'User';
|
||||||
|
name: 'User';
|
||||||
|
pluralName: 'users';
|
||||||
|
singularName: 'user';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
blocked: Schema.Attribute.Boolean &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.DefaultTo<false>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
email: Schema.Attribute.Email &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 6;
|
||||||
|
}>;
|
||||||
|
firstname: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
isActive: Schema.Attribute.Boolean &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.DefaultTo<false>;
|
||||||
|
lastname: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<'oneToMany', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
password: Schema.Attribute.Password &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 6;
|
||||||
|
}>;
|
||||||
|
preferedLanguage: Schema.Attribute.String;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
registrationToken: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
resetPasswordToken: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
roles: Schema.Attribute.Relation<'manyToMany', 'admin::role'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
username: Schema.Attribute.String;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginContentReleasesRelease
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_releases';
|
||||||
|
info: {
|
||||||
|
displayName: 'Release';
|
||||||
|
pluralName: 'releases';
|
||||||
|
singularName: 'release';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
actions: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::content-releases.release-action'
|
||||||
|
>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::content-releases.release'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
releasedAt: Schema.Attribute.DateTime;
|
||||||
|
scheduledAt: Schema.Attribute.DateTime;
|
||||||
|
status: Schema.Attribute.Enumeration<
|
||||||
|
['ready', 'blocked', 'failed', 'done', 'empty']
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Required;
|
||||||
|
timezone: Schema.Attribute.String;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginContentReleasesReleaseAction
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_release_actions';
|
||||||
|
info: {
|
||||||
|
displayName: 'Release Action';
|
||||||
|
pluralName: 'release-actions';
|
||||||
|
singularName: 'release-action';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
contentType: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
entryDocumentId: Schema.Attribute.String;
|
||||||
|
isEntryValid: Schema.Attribute.Boolean;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::content-releases.release-action'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
release: Schema.Attribute.Relation<
|
||||||
|
'manyToOne',
|
||||||
|
'plugin::content-releases.release'
|
||||||
|
>;
|
||||||
|
type: Schema.Attribute.Enumeration<['publish', 'unpublish']> &
|
||||||
|
Schema.Attribute.Required;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginI18NLocale extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'i18n_locale';
|
||||||
|
info: {
|
||||||
|
collectionName: 'locales';
|
||||||
|
description: '';
|
||||||
|
displayName: 'Locale';
|
||||||
|
pluralName: 'locales';
|
||||||
|
singularName: 'locale';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
code: Schema.Attribute.String & Schema.Attribute.Unique;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::i18n.locale'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.SetMinMax<
|
||||||
|
{
|
||||||
|
max: 50;
|
||||||
|
min: 1;
|
||||||
|
},
|
||||||
|
number
|
||||||
|
>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginReviewWorkflowsWorkflow
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_workflows';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Workflow';
|
||||||
|
name: 'Workflow';
|
||||||
|
pluralName: 'workflows';
|
||||||
|
singularName: 'workflow';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
contentTypes: Schema.Attribute.JSON &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.DefaultTo<'[]'>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::review-workflows.workflow'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
stageRequiredToPublish: Schema.Attribute.Relation<
|
||||||
|
'oneToOne',
|
||||||
|
'plugin::review-workflows.workflow-stage'
|
||||||
|
>;
|
||||||
|
stages: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::review-workflows.workflow-stage'
|
||||||
|
>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginReviewWorkflowsWorkflowStage
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'strapi_workflows_stages';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Stages';
|
||||||
|
name: 'Workflow Stage';
|
||||||
|
pluralName: 'workflow-stages';
|
||||||
|
singularName: 'workflow-stage';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
version: '1.1.0';
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
color: Schema.Attribute.String & Schema.Attribute.DefaultTo<'#4945FF'>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::review-workflows.workflow-stage'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String;
|
||||||
|
permissions: Schema.Attribute.Relation<'manyToMany', 'admin::permission'>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
workflow: Schema.Attribute.Relation<
|
||||||
|
'manyToOne',
|
||||||
|
'plugin::review-workflows.workflow'
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginUploadFile extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'files';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'File';
|
||||||
|
pluralName: 'files';
|
||||||
|
singularName: 'file';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
alternativeText: Schema.Attribute.String;
|
||||||
|
caption: Schema.Attribute.String;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
ext: Schema.Attribute.String;
|
||||||
|
folder: Schema.Attribute.Relation<'manyToOne', 'plugin::upload.folder'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
folderPath: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
formats: Schema.Attribute.JSON;
|
||||||
|
hash: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
height: Schema.Attribute.Integer;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::upload.file'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
mime: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
name: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
previewUrl: Schema.Attribute.String;
|
||||||
|
provider: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
provider_metadata: Schema.Attribute.JSON;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
related: Schema.Attribute.Relation<'morphToMany'>;
|
||||||
|
size: Schema.Attribute.Decimal & Schema.Attribute.Required;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
url: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
width: Schema.Attribute.Integer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginUploadFolder extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'upload_folders';
|
||||||
|
info: {
|
||||||
|
displayName: 'Folder';
|
||||||
|
pluralName: 'folders';
|
||||||
|
singularName: 'folder';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
children: Schema.Attribute.Relation<'oneToMany', 'plugin::upload.folder'>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
files: Schema.Attribute.Relation<'oneToMany', 'plugin::upload.file'>;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::upload.folder'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
parent: Schema.Attribute.Relation<'manyToOne', 'plugin::upload.folder'>;
|
||||||
|
path: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 1;
|
||||||
|
}>;
|
||||||
|
pathId: Schema.Attribute.Integer &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginUsersPermissionsPermission
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'up_permissions';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Permission';
|
||||||
|
name: 'permission';
|
||||||
|
pluralName: 'permissions';
|
||||||
|
singularName: 'permission';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
action: Schema.Attribute.String & Schema.Attribute.Required;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::users-permissions.permission'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
role: Schema.Attribute.Relation<
|
||||||
|
'manyToOne',
|
||||||
|
'plugin::users-permissions.role'
|
||||||
|
>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginUsersPermissionsRole
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'up_roles';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'Role';
|
||||||
|
name: 'role';
|
||||||
|
pluralName: 'roles';
|
||||||
|
singularName: 'role';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
};
|
||||||
|
pluginOptions: {
|
||||||
|
'content-manager': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
'content-type-builder': {
|
||||||
|
visible: false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
description: Schema.Attribute.String;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::users-permissions.role'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
name: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 3;
|
||||||
|
}>;
|
||||||
|
permissions: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::users-permissions.permission'
|
||||||
|
>;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
type: Schema.Attribute.String & Schema.Attribute.Unique;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
users: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::users-permissions.user'
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PluginUsersPermissionsUser
|
||||||
|
extends Struct.CollectionTypeSchema {
|
||||||
|
collectionName: 'up_users';
|
||||||
|
info: {
|
||||||
|
description: '';
|
||||||
|
displayName: 'User';
|
||||||
|
name: 'user';
|
||||||
|
pluralName: 'users';
|
||||||
|
singularName: 'user';
|
||||||
|
};
|
||||||
|
options: {
|
||||||
|
draftAndPublish: false;
|
||||||
|
timestamps: true;
|
||||||
|
};
|
||||||
|
attributes: {
|
||||||
|
blocked: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo<false>;
|
||||||
|
confirmationToken: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
confirmed: Schema.Attribute.Boolean & Schema.Attribute.DefaultTo<false>;
|
||||||
|
createdAt: Schema.Attribute.DateTime;
|
||||||
|
createdBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
email: Schema.Attribute.Email &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 6;
|
||||||
|
}>;
|
||||||
|
locale: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
localizations: Schema.Attribute.Relation<
|
||||||
|
'oneToMany',
|
||||||
|
'plugin::users-permissions.user'
|
||||||
|
> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
password: Schema.Attribute.Password &
|
||||||
|
Schema.Attribute.Private &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 6;
|
||||||
|
}>;
|
||||||
|
provider: Schema.Attribute.String;
|
||||||
|
publishedAt: Schema.Attribute.DateTime;
|
||||||
|
resetPasswordToken: Schema.Attribute.String & Schema.Attribute.Private;
|
||||||
|
role: Schema.Attribute.Relation<
|
||||||
|
'manyToOne',
|
||||||
|
'plugin::users-permissions.role'
|
||||||
|
>;
|
||||||
|
updatedAt: Schema.Attribute.DateTime;
|
||||||
|
updatedBy: Schema.Attribute.Relation<'oneToOne', 'admin::user'> &
|
||||||
|
Schema.Attribute.Private;
|
||||||
|
username: Schema.Attribute.String &
|
||||||
|
Schema.Attribute.Required &
|
||||||
|
Schema.Attribute.Unique &
|
||||||
|
Schema.Attribute.SetMinMaxLength<{
|
||||||
|
minLength: 3;
|
||||||
|
}>;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module '@strapi/strapi' {
|
||||||
|
export module Public {
|
||||||
|
export interface ContentTypeSchemas {
|
||||||
|
'admin::api-token': AdminApiToken;
|
||||||
|
'admin::api-token-permission': AdminApiTokenPermission;
|
||||||
|
'admin::permission': AdminPermission;
|
||||||
|
'admin::role': AdminRole;
|
||||||
|
'admin::transfer-token': AdminTransferToken;
|
||||||
|
'admin::transfer-token-permission': AdminTransferTokenPermission;
|
||||||
|
'admin::user': AdminUser;
|
||||||
|
'plugin::content-releases.release': PluginContentReleasesRelease;
|
||||||
|
'plugin::content-releases.release-action': PluginContentReleasesReleaseAction;
|
||||||
|
'plugin::i18n.locale': PluginI18NLocale;
|
||||||
|
'plugin::review-workflows.workflow': PluginReviewWorkflowsWorkflow;
|
||||||
|
'plugin::review-workflows.workflow-stage': PluginReviewWorkflowsWorkflowStage;
|
||||||
|
'plugin::upload.file': PluginUploadFile;
|
||||||
|
'plugin::upload.folder': PluginUploadFolder;
|
||||||
|
'plugin::users-permissions.permission': PluginUsersPermissionsPermission;
|
||||||
|
'plugin::users-permissions.role': PluginUsersPermissionsRole;
|
||||||
|
'plugin::users-permissions.user': PluginUsersPermissionsUser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
shop/.editorconfig
Normal file
17
shop/.editorconfig
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# editorconfig.org
|
||||||
|
|
||||||
|
root = true
|
||||||
|
|
||||||
|
[*]
|
||||||
|
charset = utf-8
|
||||||
|
end_of_line = lf
|
||||||
|
indent_size = 4
|
||||||
|
indent_style = space
|
||||||
|
insert_final_newline = true
|
||||||
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
|
[{compose.yaml,compose.*.yaml}]
|
||||||
|
indent_size = 2
|
||||||
|
|
||||||
|
[*.md]
|
||||||
|
trim_trailing_whitespace = false
|
||||||
20
shop/.env
Normal file
20
shop/.env
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# In all environments, the following files are loaded if they exist,
|
||||||
|
# the latter taking precedence over the former:
|
||||||
|
#
|
||||||
|
# * .env contains default values for the environment variables needed by the app
|
||||||
|
# * .env.local uncommitted file with local overrides
|
||||||
|
# * .env.$APP_ENV committed environment-specific defaults
|
||||||
|
# * .env.$APP_ENV.local uncommitted environment-specific overrides
|
||||||
|
#
|
||||||
|
# Real environment variables win over .env files.
|
||||||
|
#
|
||||||
|
# DO NOT DEFINE PRODUCTION SECRETS IN THIS FILE NOR IN ANY OTHER COMMITTED FILES.
|
||||||
|
# https://symfony.com/doc/current/configuration/secrets.html
|
||||||
|
#
|
||||||
|
# Run "composer dump-env prod" to compile .env files for production use (requires symfony/flex >=1.2).
|
||||||
|
# https://symfony.com/doc/current/best_practices.html#use-environment-variables-for-infrastructure-configuration
|
||||||
|
|
||||||
|
###> symfony/framework-bundle ###
|
||||||
|
APP_ENV=dev
|
||||||
|
APP_SECRET=
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
4
shop/.env.dev
Normal file
4
shop/.env.dev
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
###> symfony/framework-bundle ###
|
||||||
|
APP_SECRET=55af0f9a786aad0e8b70b235e61cc0e0
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
15
shop/.gitignore
vendored
Normal file
15
shop/.gitignore
vendored
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
###> symfony/framework-bundle ###
|
||||||
|
/.env.local
|
||||||
|
/.env.local.php
|
||||||
|
/.env.*.local
|
||||||
|
/config/secrets/prod/prod.decrypt.private.php
|
||||||
|
/public/bundles/
|
||||||
|
/var/
|
||||||
|
/vendor/
|
||||||
|
###< symfony/framework-bundle ###
|
||||||
|
|
||||||
|
###> symfony/asset-mapper ###
|
||||||
|
/public/assets/
|
||||||
|
/assets/vendor/
|
||||||
|
###< symfony/asset-mapper ###
|
||||||
12
shop/assets/app.js
Normal file
12
shop/assets/app.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* Welcome to your app's main JavaScript file!
|
||||||
|
*
|
||||||
|
* This file will be included onto the page via the importmap() Twig function,
|
||||||
|
* which should already be in your base.html.twig.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import './styles/app.css';
|
||||||
|
import 'bootstrap';
|
||||||
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
||||||
|
console.log('This log comes from assets/app.js - welcome to AssetMapper! 🎉');
|
||||||
|
|
||||||
BIN
shop/assets/images/Logo.png
Normal file
BIN
shop/assets/images/Logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 951 B |
BIN
shop/assets/images/ant-design_facebook-filled.png
Normal file
BIN
shop/assets/images/ant-design_facebook-filled.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 301 B |
BIN
shop/assets/images/ant-design_instagram-filled.png
Normal file
BIN
shop/assets/images/ant-design_instagram-filled.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 368 B |
46
shop/assets/styles/app.css
Normal file
46
shop/assets/styles/app.css
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
|
||||||
|
|
||||||
|
|
||||||
|
* {
|
||||||
|
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Poppins;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.header-wrap {
|
||||||
|
color: white;
|
||||||
|
border-bottom: #CACDD8 1px solid;
|
||||||
|
}
|
||||||
|
.header-top {
|
||||||
|
height: 44px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight:600;
|
||||||
|
background-color: black;
|
||||||
|
}
|
||||||
|
.header-top .container {
|
||||||
|
height: 44px;
|
||||||
|
}
|
||||||
|
.header-top a img {
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.link-header {
|
||||||
|
color: #ffffff;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight:600;
|
||||||
|
text-underline-offset: 5px;
|
||||||
|
text-decoration-thickness:2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-bottom .logo {
|
||||||
|
width: 79px;
|
||||||
|
height: 69px;
|
||||||
|
}
|
||||||
|
.header-bottom nav a{
|
||||||
|
color: #000000;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
6
shop/assets/styles/bootstrap.min.css
vendored
Normal file
6
shop/assets/styles/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
21
shop/bin/console
Executable file
21
shop/bin/console
Executable file
@@ -0,0 +1,21 @@
|
|||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Kernel;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
|
|
||||||
|
if (!is_dir(dirname(__DIR__).'/vendor')) {
|
||||||
|
throw new LogicException('Dependencies are missing. Try running "composer install".');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!is_file(dirname(__DIR__).'/vendor/autoload_runtime.php')) {
|
||||||
|
throw new LogicException('Symfony Runtime is missing. Try running "composer require symfony/runtime".');
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||||
|
|
||||||
|
return function (array $context) {
|
||||||
|
$kernel = new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||||
|
|
||||||
|
return new Application($kernel);
|
||||||
|
};
|
||||||
77
shop/composer.json
Normal file
77
shop/composer.json
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"type": "project",
|
||||||
|
"license": "proprietary",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"prefer-stable": true,
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.2",
|
||||||
|
"ext-ctype": "*",
|
||||||
|
"ext-iconv": "*",
|
||||||
|
"symfony/asset": "7.3.*",
|
||||||
|
"symfony/asset-mapper": "7.3.*",
|
||||||
|
"symfony/console": "7.3.*",
|
||||||
|
"symfony/dotenv": "7.3.*",
|
||||||
|
"symfony/flex": "^2",
|
||||||
|
"symfony/framework-bundle": "7.3.*",
|
||||||
|
"symfony/runtime": "7.3.*",
|
||||||
|
"symfony/twig-bundle": "7.3.*",
|
||||||
|
"symfony/ux-twig-component": "^2.27",
|
||||||
|
"symfony/yaml": "7.3.*",
|
||||||
|
"twig/extra-bundle": "^2.12|^3.0",
|
||||||
|
"twig/twig": "^2.12|^3.0"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"allow-plugins": {
|
||||||
|
"php-http/discovery": true,
|
||||||
|
"symfony/flex": true,
|
||||||
|
"symfony/runtime": true
|
||||||
|
},
|
||||||
|
"bump-after-update": true,
|
||||||
|
"sort-packages": true
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"App\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"replace": {
|
||||||
|
"symfony/polyfill-ctype": "*",
|
||||||
|
"symfony/polyfill-iconv": "*",
|
||||||
|
"symfony/polyfill-php72": "*",
|
||||||
|
"symfony/polyfill-php73": "*",
|
||||||
|
"symfony/polyfill-php74": "*",
|
||||||
|
"symfony/polyfill-php80": "*",
|
||||||
|
"symfony/polyfill-php81": "*",
|
||||||
|
"symfony/polyfill-php82": "*"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"auto-scripts": {
|
||||||
|
"cache:clear": "symfony-cmd",
|
||||||
|
"assets:install %PUBLIC_DIR%": "symfony-cmd",
|
||||||
|
"importmap:install": "symfony-cmd"
|
||||||
|
},
|
||||||
|
"post-install-cmd": [
|
||||||
|
"@auto-scripts"
|
||||||
|
],
|
||||||
|
"post-update-cmd": [
|
||||||
|
"@auto-scripts"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"conflict": {
|
||||||
|
"symfony/symfony": "*"
|
||||||
|
},
|
||||||
|
"extra": {
|
||||||
|
"symfony": {
|
||||||
|
"allow-contrib": false,
|
||||||
|
"require": "7.3.*"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/maker-bundle": "^1.64"
|
||||||
|
}
|
||||||
|
}
|
||||||
3903
shop/composer.lock
generated
Normal file
3903
shop/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
shop/composer.phar
Executable file
BIN
shop/composer.phar
Executable file
Binary file not shown.
9
shop/config/bundles.php
Normal file
9
shop/config/bundles.php
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
|
||||||
|
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
|
||||||
|
Twig\Extra\TwigExtraBundle\TwigExtraBundle::class => ['all' => true],
|
||||||
|
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
|
||||||
|
Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true],
|
||||||
|
];
|
||||||
11
shop/config/packages/asset_mapper.yaml
Normal file
11
shop/config/packages/asset_mapper.yaml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
framework:
|
||||||
|
asset_mapper:
|
||||||
|
# The paths to make available to the asset mapper.
|
||||||
|
paths:
|
||||||
|
- assets/
|
||||||
|
missing_import_mode: strict
|
||||||
|
|
||||||
|
when@prod:
|
||||||
|
framework:
|
||||||
|
asset_mapper:
|
||||||
|
missing_import_mode: warn
|
||||||
19
shop/config/packages/cache.yaml
Normal file
19
shop/config/packages/cache.yaml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
framework:
|
||||||
|
cache:
|
||||||
|
# Unique name of your app: used to compute stable namespaces for cache keys.
|
||||||
|
#prefix_seed: your_vendor_name/app_name
|
||||||
|
|
||||||
|
# The "app" cache stores to the filesystem by default.
|
||||||
|
# The data in this cache should persist between deploys.
|
||||||
|
# Other options include:
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
#app: cache.adapter.redis
|
||||||
|
#default_redis_provider: redis://localhost
|
||||||
|
|
||||||
|
# APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
|
||||||
|
#app: cache.adapter.apcu
|
||||||
|
|
||||||
|
# Namespaced pools use the above "app" backend by default
|
||||||
|
#pools:
|
||||||
|
#my.dedicated.cache: null
|
||||||
17
shop/config/packages/framework.yaml
Normal file
17
shop/config/packages/framework.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# see https://symfony.com/doc/current/reference/configuration/framework.html
|
||||||
|
framework:
|
||||||
|
secret: '%env(APP_SECRET)%'
|
||||||
|
|
||||||
|
# Note that the session will be started ONLY if you read or write from it.
|
||||||
|
session: true
|
||||||
|
|
||||||
|
#esi: true
|
||||||
|
#fragments: true
|
||||||
|
asset_mapper:
|
||||||
|
public_prefix: /proxy/8000/assets
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
framework:
|
||||||
|
test: true
|
||||||
|
session:
|
||||||
|
storage_factory_id: session.storage.factory.mock_file
|
||||||
3
shop/config/packages/property_info.yaml
Normal file
3
shop/config/packages/property_info.yaml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
framework:
|
||||||
|
property_info:
|
||||||
|
with_constructor_extractor: true
|
||||||
10
shop/config/packages/routing.yaml
Normal file
10
shop/config/packages/routing.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
framework:
|
||||||
|
router:
|
||||||
|
# Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
|
||||||
|
# See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
|
||||||
|
#default_uri: http://localhost
|
||||||
|
|
||||||
|
when@prod:
|
||||||
|
framework:
|
||||||
|
router:
|
||||||
|
strict_requirements: null
|
||||||
6
shop/config/packages/twig.yaml
Normal file
6
shop/config/packages/twig.yaml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
twig:
|
||||||
|
file_name_pattern: '*.twig'
|
||||||
|
|
||||||
|
when@test:
|
||||||
|
twig:
|
||||||
|
strict_variables: true
|
||||||
5
shop/config/packages/twig_component.yaml
Normal file
5
shop/config/packages/twig_component.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
twig_component:
|
||||||
|
anonymous_template_directory: 'components/'
|
||||||
|
defaults:
|
||||||
|
# Namespace & directory for components
|
||||||
|
App\Twig\Components\: 'components/'
|
||||||
5
shop/config/preload.php
Normal file
5
shop/config/preload.php
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (file_exists(dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php')) {
|
||||||
|
require dirname(__DIR__).'/var/cache/prod/App_KernelProdContainer.preload.php';
|
||||||
|
}
|
||||||
5
shop/config/routes.yaml
Normal file
5
shop/config/routes.yaml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
controllers:
|
||||||
|
resource:
|
||||||
|
path: ../src/Controller/
|
||||||
|
namespace: App\Controller
|
||||||
|
type: attribute
|
||||||
4
shop/config/routes/framework.yaml
Normal file
4
shop/config/routes/framework.yaml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
when@dev:
|
||||||
|
_errors:
|
||||||
|
resource: '@FrameworkBundle/Resources/config/routing/errors.php'
|
||||||
|
prefix: /_error
|
||||||
20
shop/config/services.yaml
Normal file
20
shop/config/services.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# This file is the entry point to configure your own services.
|
||||||
|
# Files in the packages/ subdirectory configure your dependencies.
|
||||||
|
|
||||||
|
# Put parameters here that don't need to change on each machine where the app is deployed
|
||||||
|
# https://symfony.com/doc/current/best_practices.html#use-parameters-for-application-configuration
|
||||||
|
parameters:
|
||||||
|
|
||||||
|
services:
|
||||||
|
# default configuration for services in *this* file
|
||||||
|
_defaults:
|
||||||
|
autowire: true # Automatically injects dependencies in your services.
|
||||||
|
autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
|
||||||
|
|
||||||
|
# makes classes in src/ available to be used as services
|
||||||
|
# this creates a service per class whose id is the fully-qualified class name
|
||||||
|
App\:
|
||||||
|
resource: '../src/'
|
||||||
|
|
||||||
|
# add more service definitions when explicit configuration is needed
|
||||||
|
# please note that last definitions always *replace* previous ones
|
||||||
29
shop/importmap.php
Normal file
29
shop/importmap.php
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the importmap for this application.
|
||||||
|
*
|
||||||
|
* - "path" is a path inside the asset mapper system. Use the
|
||||||
|
* "debug:asset-map" command to see the full list of paths.
|
||||||
|
*
|
||||||
|
* - "entrypoint" (JavaScript only) set to true for any module that will
|
||||||
|
* be used as an "entrypoint" (and passed to the importmap() Twig function).
|
||||||
|
*
|
||||||
|
* The "importmap:require" command can be used to add new entries to this file.
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
'app' => [
|
||||||
|
'path' => './assets/app.js',
|
||||||
|
'entrypoint' => true,
|
||||||
|
],
|
||||||
|
'bootstrap' => [
|
||||||
|
'version' => '5.3.7',
|
||||||
|
],
|
||||||
|
'@popperjs/core' => [
|
||||||
|
'version' => '2.11.8',
|
||||||
|
],
|
||||||
|
'bootstrap/dist/css/bootstrap.min.css' => [
|
||||||
|
'version' => '5.3.7',
|
||||||
|
'type' => 'css',
|
||||||
|
],
|
||||||
|
];
|
||||||
9
shop/public/index.php
Normal file
9
shop/public/index.php
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Kernel;
|
||||||
|
|
||||||
|
require_once dirname(__DIR__).'/vendor/autoload_runtime.php';
|
||||||
|
|
||||||
|
return function (array $context) {
|
||||||
|
return new Kernel($context['APP_ENV'], (bool) $context['APP_DEBUG']);
|
||||||
|
};
|
||||||
0
shop/src/Controller/.gitignore
vendored
Normal file
0
shop/src/Controller/.gitignore
vendored
Normal file
16
shop/src/Controller/HomePageController.php
Normal file
16
shop/src/Controller/HomePageController.php
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
|
|
||||||
|
final class HomePageController extends AbstractController
|
||||||
|
{
|
||||||
|
#[Route('/', name: 'app_home_page')]
|
||||||
|
public function index(): Response
|
||||||
|
{
|
||||||
|
return $this->render("home_page/index.html.twig");
|
||||||
|
}
|
||||||
|
}
|
||||||
11
shop/src/Kernel.php
Normal file
11
shop/src/Kernel.php
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
|
||||||
|
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
|
||||||
|
|
||||||
|
class Kernel extends BaseKernel
|
||||||
|
{
|
||||||
|
use MicroKernelTrait;
|
||||||
|
}
|
||||||
124
shop/symfony.lock
Normal file
124
shop/symfony.lock
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
{
|
||||||
|
"symfony/asset-mapper": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "6.4",
|
||||||
|
"ref": "5ad1308aa756d58f999ffbe1540d1189f5d7d14a"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"assets/app.js",
|
||||||
|
"assets/styles/app.css",
|
||||||
|
"config/packages/asset_mapper.yaml",
|
||||||
|
"importmap.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/console": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "5.3",
|
||||||
|
"ref": "1781ff40d8a17d87cf53f8d4cf0c8346ed2bb461"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"bin/console"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/flex": {
|
||||||
|
"version": "2.8",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "2.4",
|
||||||
|
"ref": "52e9754527a15e2b79d9a610f98185a1fe46622a"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
".env",
|
||||||
|
".env.dev"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/framework-bundle": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "7.3",
|
||||||
|
"ref": "5a1497d539f691b96afd45ae397ce5fe30beb4b9"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/cache.yaml",
|
||||||
|
"config/packages/framework.yaml",
|
||||||
|
"config/preload.php",
|
||||||
|
"config/routes/framework.yaml",
|
||||||
|
"config/services.yaml",
|
||||||
|
"public/index.php",
|
||||||
|
"src/Controller/.gitignore",
|
||||||
|
"src/Kernel.php",
|
||||||
|
".editorconfig"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/maker-bundle": {
|
||||||
|
"version": "1.64",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "1.0",
|
||||||
|
"ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"symfony/property-info": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "7.3",
|
||||||
|
"ref": "dae70df71978ae9226ae915ffd5fad817f5ca1f7"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/property_info.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/routing": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "7.0",
|
||||||
|
"ref": "21b72649d5622d8f7da329ffb5afb232a023619d"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/routing.yaml",
|
||||||
|
"config/routes.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/twig-bundle": {
|
||||||
|
"version": "7.3",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "6.4",
|
||||||
|
"ref": "cab5fd2a13a45c266d45a7d9337e28dee6272877"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/twig.yaml",
|
||||||
|
"templates/base.html.twig"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"symfony/ux-twig-component": {
|
||||||
|
"version": "2.27",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "2.13",
|
||||||
|
"ref": "f367ae2a1faf01c503de2171f1ec22567febeead"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/twig_component.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"twig/extra-bundle": {
|
||||||
|
"version": "v3.21.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
69
shop/templates/base.html.twig
Normal file
69
shop/templates/base.html.twig
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{% block title %}Welcome!{% endblock %}</title>
|
||||||
|
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 128 128%22><text y=%221.2em%22 font-size=%2296%22>⚫️</text><text y=%221.3em%22 x=%220.2em%22 font-size=%2276%22 fill=%22%23fff%22>sf</text></svg>">
|
||||||
|
|
||||||
|
|
||||||
|
{% block stylesheets %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block javascripts %}
|
||||||
|
{% block importmap %}{{ importmap('app') }}{% endblock %}
|
||||||
|
{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{% block header %}
|
||||||
|
<div class="header-wrap container-fluid p-0">
|
||||||
|
<div class="header-top">
|
||||||
|
<div class="container ">
|
||||||
|
<div style="height:100%" class="row d-flex justify-content-between">
|
||||||
|
<div class="col d-flex align-items-center text-start"><p class=" m-0"><span class="text-white-50">Mon-Thu:</span> 9:00 AM - 5:30 PM</p></div>
|
||||||
|
<div class="col-6 d-flex align-items-center justify-content-center text-center">
|
||||||
|
<div>
|
||||||
|
<p class=" m-0 d-inline text-white-50">Visit our showroom in 1234 Street Adress City Address, 1234</p>
|
||||||
|
<a class=" m-0 d-inline ms-2 link-header " href="#">Contact Us </a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col text-end d-flex align-items-center justify-content-end">
|
||||||
|
<p class=" m-0"> Call Us: (00) 1234 5678</p>
|
||||||
|
<a class="ms-2" href="#"><img src="{{ asset('images/ant-design_facebook-filled.png') }}" alt=""></a>
|
||||||
|
<a class="ms-1" href="#"><img src="{{ asset('images/ant-design_instagram-filled.png') }}" alt=""></a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="header-bottom container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-1">
|
||||||
|
<img src="{{ asset('images/Logo.png')}}" alt="" class="header-logo">
|
||||||
|
</div>
|
||||||
|
<div class="col-9 d-flex align-items-center">
|
||||||
|
<nav class="d-flex mw-100 justify-content-between">
|
||||||
|
<a href="">Laptops</a>
|
||||||
|
<a href="">Desktop PCs</a>
|
||||||
|
<a href="">Networking Devices</a>
|
||||||
|
<a href="">Printers & Scanners</a>
|
||||||
|
<a href="">PC Parts</a>
|
||||||
|
<a href="">All Other Products</a>
|
||||||
|
<a href="">Repairs</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
<div class="col-3"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block footer %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
6
shop/templates/home_page/index.html.twig
Normal file
6
shop/templates/home_page/index.html.twig
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{% extends 'base.html.twig' %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<h1>hello World</h1>
|
||||||
|
{% endblock %}
|
||||||
5
shop/updateCSS.sh
Executable file
5
shop/updateCSS.sh
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
rm public/assets -r
|
||||||
|
php bin/console asset-map:compile
|
||||||
|
mv public/proxy/8000/assets/ public/assets
|
||||||
|
rm public/proxy -r
|
||||||
|
php bin/console cache:clear
|
||||||
22
vendor/autoload.php
vendored
Normal file
22
vendor/autoload.php
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload.php @generated by Composer
|
||||||
|
|
||||||
|
if (PHP_VERSION_ID < 50600) {
|
||||||
|
if (!headers_sent()) {
|
||||||
|
header('HTTP/1.1 500 Internal Server Error');
|
||||||
|
}
|
||||||
|
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
|
||||||
|
if (!ini_get('display_errors')) {
|
||||||
|
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||||
|
fwrite(STDERR, $err);
|
||||||
|
} elseif (!headers_sent()) {
|
||||||
|
echo $err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new RuntimeException($err);
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once __DIR__ . '/composer/autoload_real.php';
|
||||||
|
|
||||||
|
return ComposerAutoloaderInit7903f4abe88d48fe2c7b531d200859a8::getLoader();
|
||||||
579
vendor/composer/ClassLoader.php
vendored
Normal file
579
vendor/composer/ClassLoader.php
vendored
Normal file
@@ -0,0 +1,579 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
|
||||||
|
*
|
||||||
|
* $loader = new \Composer\Autoload\ClassLoader();
|
||||||
|
*
|
||||||
|
* // register classes with namespaces
|
||||||
|
* $loader->add('Symfony\Component', __DIR__.'/component');
|
||||||
|
* $loader->add('Symfony', __DIR__.'/framework');
|
||||||
|
*
|
||||||
|
* // activate the autoloader
|
||||||
|
* $loader->register();
|
||||||
|
*
|
||||||
|
* // to enable searching the include path (eg. for PEAR packages)
|
||||||
|
* $loader->setUseIncludePath(true);
|
||||||
|
*
|
||||||
|
* In this example, if you try to use a class in the Symfony\Component
|
||||||
|
* namespace or one of its children (Symfony\Component\Console for instance),
|
||||||
|
* the autoloader will first look for the class under the component/
|
||||||
|
* directory, and it will then fallback to the framework/ directory if not
|
||||||
|
* found before giving up.
|
||||||
|
*
|
||||||
|
* This class is loosely based on the Symfony UniversalClassLoader.
|
||||||
|
*
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
* @see https://www.php-fig.org/psr/psr-0/
|
||||||
|
* @see https://www.php-fig.org/psr/psr-4/
|
||||||
|
*/
|
||||||
|
class ClassLoader
|
||||||
|
{
|
||||||
|
/** @var \Closure(string):void */
|
||||||
|
private static $includeFile;
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
|
private $vendorDir;
|
||||||
|
|
||||||
|
// PSR-4
|
||||||
|
/**
|
||||||
|
* @var array<string, array<string, int>>
|
||||||
|
*/
|
||||||
|
private $prefixLengthsPsr4 = array();
|
||||||
|
/**
|
||||||
|
* @var array<string, list<string>>
|
||||||
|
*/
|
||||||
|
private $prefixDirsPsr4 = array();
|
||||||
|
/**
|
||||||
|
* @var list<string>
|
||||||
|
*/
|
||||||
|
private $fallbackDirsPsr4 = array();
|
||||||
|
|
||||||
|
// PSR-0
|
||||||
|
/**
|
||||||
|
* List of PSR-0 prefixes
|
||||||
|
*
|
||||||
|
* Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2')))
|
||||||
|
*
|
||||||
|
* @var array<string, array<string, list<string>>>
|
||||||
|
*/
|
||||||
|
private $prefixesPsr0 = array();
|
||||||
|
/**
|
||||||
|
* @var list<string>
|
||||||
|
*/
|
||||||
|
private $fallbackDirsPsr0 = array();
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
private $useIncludePath = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, string>
|
||||||
|
*/
|
||||||
|
private $classMap = array();
|
||||||
|
|
||||||
|
/** @var bool */
|
||||||
|
private $classMapAuthoritative = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, bool>
|
||||||
|
*/
|
||||||
|
private $missingClasses = array();
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
|
private $apcuPrefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array<string, self>
|
||||||
|
*/
|
||||||
|
private static $registeredLoaders = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string|null $vendorDir
|
||||||
|
*/
|
||||||
|
public function __construct($vendorDir = null)
|
||||||
|
{
|
||||||
|
$this->vendorDir = $vendorDir;
|
||||||
|
self::initializeIncludeClosure();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, list<string>>
|
||||||
|
*/
|
||||||
|
public function getPrefixes()
|
||||||
|
{
|
||||||
|
if (!empty($this->prefixesPsr0)) {
|
||||||
|
return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
|
||||||
|
}
|
||||||
|
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, list<string>>
|
||||||
|
*/
|
||||||
|
public function getPrefixesPsr4()
|
||||||
|
{
|
||||||
|
return $this->prefixDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string>
|
||||||
|
*/
|
||||||
|
public function getFallbackDirs()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list<string>
|
||||||
|
*/
|
||||||
|
public function getFallbackDirsPsr4()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirsPsr4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array<string, string> Array of classname => path
|
||||||
|
*/
|
||||||
|
public function getClassMap()
|
||||||
|
{
|
||||||
|
return $this->classMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, string> $classMap Class to filename map
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function addClassMap(array $classMap)
|
||||||
|
{
|
||||||
|
if ($this->classMap) {
|
||||||
|
$this->classMap = array_merge($this->classMap, $classMap);
|
||||||
|
} else {
|
||||||
|
$this->classMap = $classMap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix, either
|
||||||
|
* appending or prepending to the ones previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param list<string>|string $paths The PSR-0 root directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function add($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
|
if (!$prefix) {
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->fallbackDirsPsr0
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr0 = array_merge(
|
||||||
|
$this->fallbackDirsPsr0,
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$first = $prefix[0];
|
||||||
|
if (!isset($this->prefixesPsr0[$first][$prefix])) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = $paths;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($prepend) {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->prefixesPsr0[$first][$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$first][$prefix] = array_merge(
|
||||||
|
$this->prefixesPsr0[$first][$prefix],
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace, either
|
||||||
|
* appending or prepending to the ones previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
|
* @param bool $prepend Whether to prepend the directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function addPsr4($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
$paths = (array) $paths;
|
||||||
|
if (!$prefix) {
|
||||||
|
// Register directories for the root namespace.
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->fallbackDirsPsr4
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirsPsr4 = array_merge(
|
||||||
|
$this->fallbackDirsPsr4,
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} elseif (!isset($this->prefixDirsPsr4[$prefix])) {
|
||||||
|
// Register directories for a new namespace.
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = $paths;
|
||||||
|
} elseif ($prepend) {
|
||||||
|
// Prepend directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
$paths,
|
||||||
|
$this->prefixDirsPsr4[$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Append directories for an already registered namespace.
|
||||||
|
$this->prefixDirsPsr4[$prefix] = array_merge(
|
||||||
|
$this->prefixDirsPsr4[$prefix],
|
||||||
|
$paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-0 directories for a given prefix,
|
||||||
|
* replacing any others previously set for this prefix.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix
|
||||||
|
* @param list<string>|string $paths The PSR-0 base directories
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function set($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr0 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of PSR-4 directories for a given namespace,
|
||||||
|
* replacing any others previously set for this namespace.
|
||||||
|
*
|
||||||
|
* @param string $prefix The prefix/namespace, with trailing '\\'
|
||||||
|
* @param list<string>|string $paths The PSR-4 base directories
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setPsr4($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirsPsr4 = (array) $paths;
|
||||||
|
} else {
|
||||||
|
$length = strlen($prefix);
|
||||||
|
if ('\\' !== $prefix[$length - 1]) {
|
||||||
|
throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
|
||||||
|
}
|
||||||
|
$this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
|
||||||
|
$this->prefixDirsPsr4[$prefix] = (array) $paths;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns on searching the include path for class files.
|
||||||
|
*
|
||||||
|
* @param bool $useIncludePath
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setUseIncludePath($useIncludePath)
|
||||||
|
{
|
||||||
|
$this->useIncludePath = $useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Can be used to check if the autoloader uses the include path to check
|
||||||
|
* for classes.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function getUseIncludePath()
|
||||||
|
{
|
||||||
|
return $this->useIncludePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Turns off searching the prefix and fallback directories for classes
|
||||||
|
* that have not been registered with the class map.
|
||||||
|
*
|
||||||
|
* @param bool $classMapAuthoritative
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setClassMapAuthoritative($classMapAuthoritative)
|
||||||
|
{
|
||||||
|
$this->classMapAuthoritative = $classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should class lookup fail if not found in the current class map?
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function isClassMapAuthoritative()
|
||||||
|
{
|
||||||
|
return $this->classMapAuthoritative;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
||||||
|
*
|
||||||
|
* @param string|null $apcuPrefix
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function setApcuPrefix($apcuPrefix)
|
||||||
|
{
|
||||||
|
$this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The APCu prefix in use, or null if APCu caching is not enabled.
|
||||||
|
*
|
||||||
|
* @return string|null
|
||||||
|
*/
|
||||||
|
public function getApcuPrefix()
|
||||||
|
{
|
||||||
|
return $this->apcuPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers this instance as an autoloader.
|
||||||
|
*
|
||||||
|
* @param bool $prepend Whether to prepend the autoloader or not
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function register($prepend = false)
|
||||||
|
{
|
||||||
|
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
||||||
|
|
||||||
|
if (null === $this->vendorDir) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($prepend) {
|
||||||
|
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
||||||
|
} else {
|
||||||
|
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||||
|
self::$registeredLoaders[$this->vendorDir] = $this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregisters this instance as an autoloader.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function unregister()
|
||||||
|
{
|
||||||
|
spl_autoload_unregister(array($this, 'loadClass'));
|
||||||
|
|
||||||
|
if (null !== $this->vendorDir) {
|
||||||
|
unset(self::$registeredLoaders[$this->vendorDir]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the given class or interface.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
* @return true|null True if loaded, null otherwise
|
||||||
|
*/
|
||||||
|
public function loadClass($class)
|
||||||
|
{
|
||||||
|
if ($file = $this->findFile($class)) {
|
||||||
|
$includeFile = self::$includeFile;
|
||||||
|
$includeFile($file);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds the path to the file where the class is defined.
|
||||||
|
*
|
||||||
|
* @param string $class The name of the class
|
||||||
|
*
|
||||||
|
* @return string|false The path if found, false otherwise
|
||||||
|
*/
|
||||||
|
public function findFile($class)
|
||||||
|
{
|
||||||
|
// class map lookup
|
||||||
|
if (isset($this->classMap[$class])) {
|
||||||
|
return $this->classMap[$class];
|
||||||
|
}
|
||||||
|
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (null !== $this->apcuPrefix) {
|
||||||
|
$file = apcu_fetch($this->apcuPrefix.$class, $hit);
|
||||||
|
if ($hit) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$file = $this->findFileWithExtension($class, '.php');
|
||||||
|
|
||||||
|
// Search for Hack files if we are running on HHVM
|
||||||
|
if (false === $file && defined('HHVM_VERSION')) {
|
||||||
|
$file = $this->findFileWithExtension($class, '.hh');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null !== $this->apcuPrefix) {
|
||||||
|
apcu_add($this->apcuPrefix.$class, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false === $file) {
|
||||||
|
// Remember that this class does not exist.
|
||||||
|
$this->missingClasses[$class] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the currently registered loaders keyed by their corresponding vendor directories.
|
||||||
|
*
|
||||||
|
* @return array<string, self>
|
||||||
|
*/
|
||||||
|
public static function getRegisteredLoaders()
|
||||||
|
{
|
||||||
|
return self::$registeredLoaders;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $class
|
||||||
|
* @param string $ext
|
||||||
|
* @return string|false
|
||||||
|
*/
|
||||||
|
private function findFileWithExtension($class, $ext)
|
||||||
|
{
|
||||||
|
// PSR-4 lookup
|
||||||
|
$logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
|
||||||
|
$first = $class[0];
|
||||||
|
if (isset($this->prefixLengthsPsr4[$first])) {
|
||||||
|
$subPath = $class;
|
||||||
|
while (false !== $lastPos = strrpos($subPath, '\\')) {
|
||||||
|
$subPath = substr($subPath, 0, $lastPos);
|
||||||
|
$search = $subPath . '\\';
|
||||||
|
if (isset($this->prefixDirsPsr4[$search])) {
|
||||||
|
$pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
|
||||||
|
foreach ($this->prefixDirsPsr4[$search] as $dir) {
|
||||||
|
if (file_exists($file = $dir . $pathEnd)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-4 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr4 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 lookup
|
||||||
|
if (false !== $pos = strrpos($class, '\\')) {
|
||||||
|
// namespaced class name
|
||||||
|
$logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
|
||||||
|
. strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
|
||||||
|
} else {
|
||||||
|
// PEAR-like class name
|
||||||
|
$logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->prefixesPsr0[$first])) {
|
||||||
|
foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
|
||||||
|
if (0 === strpos($class, $prefix)) {
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 fallback dirs
|
||||||
|
foreach ($this->fallbackDirsPsr0 as $dir) {
|
||||||
|
if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// PSR-0 include paths.
|
||||||
|
if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private static function initializeIncludeClosure()
|
||||||
|
{
|
||||||
|
if (self::$includeFile !== null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scope isolated include.
|
||||||
|
*
|
||||||
|
* Prevents access to $this/self from included files.
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
self::$includeFile = \Closure::bind(static function($file) {
|
||||||
|
include $file;
|
||||||
|
}, null, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
396
vendor/composer/InstalledVersions.php
vendored
Normal file
396
vendor/composer/InstalledVersions.php
vendored
Normal file
@@ -0,0 +1,396 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Composer;
|
||||||
|
|
||||||
|
use Composer\Autoload\ClassLoader;
|
||||||
|
use Composer\Semver\VersionParser;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is copied in every Composer installed project and available to all
|
||||||
|
*
|
||||||
|
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
||||||
|
*
|
||||||
|
* To require its presence, you can require `composer-runtime-api ^2.0`
|
||||||
|
*
|
||||||
|
* @final
|
||||||
|
*/
|
||||||
|
class InstalledVersions
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string|null if set (by reflection by Composer), this should be set to the path where this class is being copied to
|
||||||
|
* @internal
|
||||||
|
*/
|
||||||
|
private static $selfDir = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var mixed[]|null
|
||||||
|
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
|
||||||
|
*/
|
||||||
|
private static $installed;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
private static $installedIsLocalDir;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var bool|null
|
||||||
|
*/
|
||||||
|
private static $canGetVendors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array[]
|
||||||
|
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static $installedByVendor = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
||||||
|
*
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackages()
|
||||||
|
{
|
||||||
|
$packages = array();
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
$packages[] = array_keys($installed['versions']);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (1 === \count($packages)) {
|
||||||
|
return $packages[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of all package names with a specific type e.g. 'library'
|
||||||
|
*
|
||||||
|
* @param string $type
|
||||||
|
* @return string[]
|
||||||
|
* @psalm-return list<string>
|
||||||
|
*/
|
||||||
|
public static function getInstalledPackagesByType($type)
|
||||||
|
{
|
||||||
|
$packagesByType = array();
|
||||||
|
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
foreach ($installed['versions'] as $name => $package) {
|
||||||
|
if (isset($package['type']) && $package['type'] === $type) {
|
||||||
|
$packagesByType[] = $name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $packagesByType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package is installed
|
||||||
|
*
|
||||||
|
* This also returns true if the package name is provided or replaced by another package
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @param bool $includeDevRequirements
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function isInstalled($packageName, $includeDevRequirements = true)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (isset($installed['versions'][$packageName])) {
|
||||||
|
return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given package satisfies a version constraint
|
||||||
|
*
|
||||||
|
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
||||||
|
*
|
||||||
|
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
||||||
|
*
|
||||||
|
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
||||||
|
* @param string $packageName
|
||||||
|
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
||||||
|
{
|
||||||
|
$constraint = $parser->parseConstraints((string) $constraint);
|
||||||
|
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
||||||
|
|
||||||
|
return $provided->matches($constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a version constraint representing all the range(s) which are installed for a given package
|
||||||
|
*
|
||||||
|
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
||||||
|
* whether a given version of a package is installed, and not just whether it exists
|
||||||
|
*
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string Version constraint usable with composer/semver
|
||||||
|
*/
|
||||||
|
public static function getVersionRanges($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$ranges = array();
|
||||||
|
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
||||||
|
}
|
||||||
|
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
||||||
|
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode(' || ', $ranges);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
||||||
|
*/
|
||||||
|
public static function getPrettyVersion($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['pretty_version'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
||||||
|
*/
|
||||||
|
public static function getReference($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isset($installed['versions'][$packageName]['reference'])) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed['versions'][$packageName]['reference'];
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $packageName
|
||||||
|
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
||||||
|
*/
|
||||||
|
public static function getInstallPath($packageName)
|
||||||
|
{
|
||||||
|
foreach (self::getInstalled() as $installed) {
|
||||||
|
if (!isset($installed['versions'][$packageName])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
|
||||||
|
*/
|
||||||
|
public static function getRootPackage()
|
||||||
|
{
|
||||||
|
$installed = self::getInstalled();
|
||||||
|
|
||||||
|
return $installed[0]['root'];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw installed.php data for custom implementations
|
||||||
|
*
|
||||||
|
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
|
||||||
|
*/
|
||||||
|
public static function getRawData()
|
||||||
|
{
|
||||||
|
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
self::$installed = include __DIR__ . '/installed.php';
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
||||||
|
*
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
public static function getAllRawData()
|
||||||
|
{
|
||||||
|
return self::getInstalled();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets you reload the static array from another file
|
||||||
|
*
|
||||||
|
* This is only useful for complex integrations in which a project needs to use
|
||||||
|
* this class but then also needs to execute another project's autoloader in process,
|
||||||
|
* and wants to ensure both projects have access to their version of installed.php.
|
||||||
|
*
|
||||||
|
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
||||||
|
* the data it needs from this class, then call reload() with
|
||||||
|
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
||||||
|
* the project in which it runs can then also use this class safely, without
|
||||||
|
* interference between PHPUnit's dependencies and the project's dependencies.
|
||||||
|
*
|
||||||
|
* @param array[] $data A vendor/composer/installed.php data set
|
||||||
|
* @return void
|
||||||
|
*
|
||||||
|
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
|
||||||
|
*/
|
||||||
|
public static function reload($data)
|
||||||
|
{
|
||||||
|
self::$installed = $data;
|
||||||
|
self::$installedByVendor = array();
|
||||||
|
|
||||||
|
// when using reload, we disable the duplicate protection to ensure that self::$installed data is
|
||||||
|
// always returned, but we cannot know whether it comes from the installed.php in __DIR__ or not,
|
||||||
|
// so we have to assume it does not, and that may result in duplicate data being returned when listing
|
||||||
|
// all installed packages for example
|
||||||
|
self::$installedIsLocalDir = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private static function getSelfDir()
|
||||||
|
{
|
||||||
|
if (self::$selfDir === null) {
|
||||||
|
self::$selfDir = strtr(__DIR__, '\\', '/');
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$selfDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array[]
|
||||||
|
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
|
||||||
|
*/
|
||||||
|
private static function getInstalled()
|
||||||
|
{
|
||||||
|
if (null === self::$canGetVendors) {
|
||||||
|
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
||||||
|
}
|
||||||
|
|
||||||
|
$installed = array();
|
||||||
|
$copiedLocalDir = false;
|
||||||
|
|
||||||
|
if (self::$canGetVendors) {
|
||||||
|
$selfDir = self::getSelfDir();
|
||||||
|
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
||||||
|
$vendorDir = strtr($vendorDir, '\\', '/');
|
||||||
|
if (isset(self::$installedByVendor[$vendorDir])) {
|
||||||
|
$installed[] = self::$installedByVendor[$vendorDir];
|
||||||
|
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require $vendorDir.'/composer/installed.php';
|
||||||
|
self::$installedByVendor[$vendorDir] = $required;
|
||||||
|
$installed[] = $required;
|
||||||
|
if (self::$installed === null && $vendorDir.'/composer' === $selfDir) {
|
||||||
|
self::$installed = $required;
|
||||||
|
self::$installedIsLocalDir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (self::$installedIsLocalDir && $vendorDir.'/composer' === $selfDir) {
|
||||||
|
$copiedLocalDir = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === self::$installed) {
|
||||||
|
// only require the installed.php file if this file is loaded from its dumped location,
|
||||||
|
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
||||||
|
if (substr(__DIR__, -8, 1) !== 'C') {
|
||||||
|
/** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $required */
|
||||||
|
$required = require __DIR__ . '/installed.php';
|
||||||
|
self::$installed = $required;
|
||||||
|
} else {
|
||||||
|
self::$installed = array();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self::$installed !== array() && !$copiedLocalDir) {
|
||||||
|
$installed[] = self::$installed;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $installed;
|
||||||
|
}
|
||||||
|
}
|
||||||
21
vendor/composer/LICENSE
vendored
Normal file
21
vendor/composer/LICENSE
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
Copyright (c) Nils Adermann, Jordi Boggiano
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is furnished
|
||||||
|
to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
10
vendor/composer/autoload_classmap.php
vendored
Normal file
10
vendor/composer/autoload_classmap.php
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_classmap.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
||||||
|
);
|
||||||
11
vendor/composer/autoload_files.php
vendored
Normal file
11
vendor/composer/autoload_files.php
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_files.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||||
|
'56823cacd97af379eceaf82ad00b928f' => $vendorDir . '/phpseclib/bcmath_compat/lib/bcmath.php',
|
||||||
|
);
|
||||||
9
vendor/composer/autoload_namespaces.php
vendored
Normal file
9
vendor/composer/autoload_namespaces.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_namespaces.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
);
|
||||||
12
vendor/composer/autoload_psr4.php
vendored
Normal file
12
vendor/composer/autoload_psr4.php
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_psr4.php @generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'phpseclib3\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'),
|
||||||
|
'bcmath_compat\\' => array($vendorDir . '/phpseclib/bcmath_compat/src'),
|
||||||
|
'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'),
|
||||||
|
);
|
||||||
50
vendor/composer/autoload_real.php
vendored
Normal file
50
vendor/composer/autoload_real.php
vendored
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_real.php @generated by Composer
|
||||||
|
|
||||||
|
class ComposerAutoloaderInit7903f4abe88d48fe2c7b531d200859a8
|
||||||
|
{
|
||||||
|
private static $loader;
|
||||||
|
|
||||||
|
public static function loadClassLoader($class)
|
||||||
|
{
|
||||||
|
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||||
|
require __DIR__ . '/ClassLoader.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return \Composer\Autoload\ClassLoader
|
||||||
|
*/
|
||||||
|
public static function getLoader()
|
||||||
|
{
|
||||||
|
if (null !== self::$loader) {
|
||||||
|
return self::$loader;
|
||||||
|
}
|
||||||
|
|
||||||
|
require __DIR__ . '/platform_check.php';
|
||||||
|
|
||||||
|
spl_autoload_register(array('ComposerAutoloaderInit7903f4abe88d48fe2c7b531d200859a8', 'loadClassLoader'), true, true);
|
||||||
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
|
||||||
|
spl_autoload_unregister(array('ComposerAutoloaderInit7903f4abe88d48fe2c7b531d200859a8', 'loadClassLoader'));
|
||||||
|
|
||||||
|
require __DIR__ . '/autoload_static.php';
|
||||||
|
call_user_func(\Composer\Autoload\ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8::getInitializer($loader));
|
||||||
|
|
||||||
|
$loader->register(true);
|
||||||
|
|
||||||
|
$filesToLoad = \Composer\Autoload\ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8::$files;
|
||||||
|
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
|
||||||
|
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
|
||||||
|
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
|
||||||
|
|
||||||
|
require $file;
|
||||||
|
}
|
||||||
|
}, null, null);
|
||||||
|
foreach ($filesToLoad as $fileIdentifier => $file) {
|
||||||
|
$requireFile($fileIdentifier, $file);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $loader;
|
||||||
|
}
|
||||||
|
}
|
||||||
57
vendor/composer/autoload_static.php
vendored
Normal file
57
vendor/composer/autoload_static.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_static.php @generated by Composer
|
||||||
|
|
||||||
|
namespace Composer\Autoload;
|
||||||
|
|
||||||
|
class ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8
|
||||||
|
{
|
||||||
|
public static $files = array (
|
||||||
|
'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php',
|
||||||
|
'56823cacd97af379eceaf82ad00b928f' => __DIR__ . '/..' . '/phpseclib/bcmath_compat/lib/bcmath.php',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixLengthsPsr4 = array (
|
||||||
|
'p' =>
|
||||||
|
array (
|
||||||
|
'phpseclib3\\' => 11,
|
||||||
|
),
|
||||||
|
'b' =>
|
||||||
|
array (
|
||||||
|
'bcmath_compat\\' => 14,
|
||||||
|
),
|
||||||
|
'P' =>
|
||||||
|
array (
|
||||||
|
'ParagonIE\\ConstantTime\\' => 23,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $prefixDirsPsr4 = array (
|
||||||
|
'phpseclib3\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib',
|
||||||
|
),
|
||||||
|
'bcmath_compat\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/phpseclib/bcmath_compat/src',
|
||||||
|
),
|
||||||
|
'ParagonIE\\ConstantTime\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
public static $classMap = array (
|
||||||
|
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
||||||
|
);
|
||||||
|
|
||||||
|
public static function getInitializer(ClassLoader $loader)
|
||||||
|
{
|
||||||
|
return \Closure::bind(function () use ($loader) {
|
||||||
|
$loader->prefixLengthsPsr4 = ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8::$prefixLengthsPsr4;
|
||||||
|
$loader->prefixDirsPsr4 = ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8::$prefixDirsPsr4;
|
||||||
|
$loader->classMap = ComposerStaticInit7903f4abe88d48fe2c7b531d200859a8::$classMap;
|
||||||
|
|
||||||
|
}, null, ClassLoader::class);
|
||||||
|
}
|
||||||
|
}
|
||||||
307
vendor/composer/installed.json
vendored
Normal file
307
vendor/composer/installed.json
vendored
Normal file
@@ -0,0 +1,307 @@
|
|||||||
|
{
|
||||||
|
"packages": [
|
||||||
|
{
|
||||||
|
"name": "paragonie/constant_time_encoding",
|
||||||
|
"version": "v3.0.0",
|
||||||
|
"version_normalized": "3.0.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/paragonie/constant_time_encoding.git",
|
||||||
|
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512",
|
||||||
|
"reference": "df1e7fde177501eee2037dd159cf04f5f301a512",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9",
|
||||||
|
"vimeo/psalm": "^4|^5"
|
||||||
|
},
|
||||||
|
"time": "2024-05-08T12:36:18+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"ParagonIE\\ConstantTime\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com",
|
||||||
|
"role": "Maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steve 'Sc00bz' Thomas",
|
||||||
|
"email": "steve@tobtu.com",
|
||||||
|
"homepage": "https://www.tobtu.com",
|
||||||
|
"role": "Original Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
|
||||||
|
"keywords": [
|
||||||
|
"base16",
|
||||||
|
"base32",
|
||||||
|
"base32_decode",
|
||||||
|
"base32_encode",
|
||||||
|
"base64",
|
||||||
|
"base64_decode",
|
||||||
|
"base64_encode",
|
||||||
|
"bin2hex",
|
||||||
|
"encoding",
|
||||||
|
"hex",
|
||||||
|
"hex2bin",
|
||||||
|
"rfc4648"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
|
||||||
|
"source": "https://github.com/paragonie/constant_time_encoding"
|
||||||
|
},
|
||||||
|
"install-path": "../paragonie/constant_time_encoding"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "paragonie/random_compat",
|
||||||
|
"version": "v9.99.100",
|
||||||
|
"version_normalized": "9.99.100.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/paragonie/random_compat.git",
|
||||||
|
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a",
|
||||||
|
"reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">= 7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "4.*|5.*",
|
||||||
|
"vimeo/psalm": "^1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||||
|
},
|
||||||
|
"time": "2020-10-15T08:29:30+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||||
|
"keywords": [
|
||||||
|
"csprng",
|
||||||
|
"polyfill",
|
||||||
|
"pseudorandom",
|
||||||
|
"random"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"issues": "https://github.com/paragonie/random_compat/issues",
|
||||||
|
"source": "https://github.com/paragonie/random_compat"
|
||||||
|
},
|
||||||
|
"install-path": "../paragonie/random_compat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpseclib/bcmath_compat",
|
||||||
|
"version": "2.0.3",
|
||||||
|
"version_normalized": "2.0.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpseclib/bcmath_compat.git",
|
||||||
|
"reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpseclib/bcmath_compat/zipball/ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a",
|
||||||
|
"reference": "ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"phpseclib/phpseclib": "^3.0"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"ext-bcmath": "8.1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4",
|
||||||
|
"squizlabs/php_codesniffer": "^3.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-gmp": "Will enable faster math operations"
|
||||||
|
},
|
||||||
|
"time": "2024-06-06T14:17:54+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"lib/bcmath.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"bcmath_compat\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jim Wigginton",
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"homepage": "http://phpseclib.sourceforge.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP 5.x-8.x polyfill for bcmath extension",
|
||||||
|
"keywords": [
|
||||||
|
"BigInteger",
|
||||||
|
"bcmath",
|
||||||
|
"bigdecimal",
|
||||||
|
"math",
|
||||||
|
"polyfill"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"issues": "https://github.com/phpseclib/bcmath_compat/issues",
|
||||||
|
"source": "https://github.com/phpseclib/bcmath_compat"
|
||||||
|
},
|
||||||
|
"install-path": "../phpseclib/bcmath_compat"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "phpseclib/phpseclib",
|
||||||
|
"version": "3.0.46",
|
||||||
|
"version_normalized": "3.0.46.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/phpseclib/phpseclib.git",
|
||||||
|
"reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6",
|
||||||
|
"reference": "56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"paragonie/constant_time_encoding": "^1|^2|^3",
|
||||||
|
"paragonie/random_compat": "^1.4|^2.0|^9.99.99",
|
||||||
|
"php": ">=5.6.1"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "*"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-dom": "Install the DOM extension to load XML formatted public keys.",
|
||||||
|
"ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
|
||||||
|
"ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
|
||||||
|
"ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
|
||||||
|
"ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
|
||||||
|
},
|
||||||
|
"time": "2025-06-26T16:29:55+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"phpseclib/bootstrap.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"phpseclib3\\": "phpseclib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Jim Wigginton",
|
||||||
|
"email": "terrafrost@php.net",
|
||||||
|
"role": "Lead Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Patrick Monnerat",
|
||||||
|
"email": "pm@datasphere.ch",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Andreas Fischer",
|
||||||
|
"email": "bantu@phpbb.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Hans-Jürgen Petrich",
|
||||||
|
"email": "petrich@tronic-media.com",
|
||||||
|
"role": "Developer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Graham Campbell",
|
||||||
|
"email": "graham@alt-three.com",
|
||||||
|
"role": "Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
|
||||||
|
"homepage": "http://phpseclib.sourceforge.net",
|
||||||
|
"keywords": [
|
||||||
|
"BigInteger",
|
||||||
|
"aes",
|
||||||
|
"asn.1",
|
||||||
|
"asn1",
|
||||||
|
"blowfish",
|
||||||
|
"crypto",
|
||||||
|
"cryptography",
|
||||||
|
"encryption",
|
||||||
|
"rsa",
|
||||||
|
"security",
|
||||||
|
"sftp",
|
||||||
|
"signature",
|
||||||
|
"signing",
|
||||||
|
"ssh",
|
||||||
|
"twofish",
|
||||||
|
"x.509",
|
||||||
|
"x509"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/phpseclib/phpseclib/issues",
|
||||||
|
"source": "https://github.com/phpseclib/phpseclib/tree/3.0.46"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/terrafrost",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://www.patreon.com/phpseclib",
|
||||||
|
"type": "patreon"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"install-path": "../phpseclib/phpseclib"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"dev-package-names": []
|
||||||
|
}
|
||||||
59
vendor/composer/installed.php
vendored
Normal file
59
vendor/composer/installed.php
vendored
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
<?php return array(
|
||||||
|
'root' => array(
|
||||||
|
'name' => '__root__',
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev' => true,
|
||||||
|
),
|
||||||
|
'versions' => array(
|
||||||
|
'__root__' => array(
|
||||||
|
'pretty_version' => '1.0.0+no-version-set',
|
||||||
|
'version' => '1.0.0.0',
|
||||||
|
'reference' => null,
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../../',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'paragonie/constant_time_encoding' => array(
|
||||||
|
'pretty_version' => 'v3.0.0',
|
||||||
|
'version' => '3.0.0.0',
|
||||||
|
'reference' => 'df1e7fde177501eee2037dd159cf04f5f301a512',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../paragonie/constant_time_encoding',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'paragonie/random_compat' => array(
|
||||||
|
'pretty_version' => 'v9.99.100',
|
||||||
|
'version' => '9.99.100.0',
|
||||||
|
'reference' => '996434e5492cb4c3edcb9168db6fbb1359ef965a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../paragonie/random_compat',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'phpseclib/bcmath_compat' => array(
|
||||||
|
'pretty_version' => '2.0.3',
|
||||||
|
'version' => '2.0.3.0',
|
||||||
|
'reference' => 'ae8f87ea0c96b2ef08ecf0d291d45372d0f7bc5a',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpseclib/bcmath_compat',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
'phpseclib/phpseclib' => array(
|
||||||
|
'pretty_version' => '3.0.46',
|
||||||
|
'version' => '3.0.46.0',
|
||||||
|
'reference' => '56483a7de62a6c2a6635e42e93b8a9e25d4f0ec6',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../phpseclib/phpseclib',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
25
vendor/composer/platform_check.php
vendored
Normal file
25
vendor/composer/platform_check.php
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// platform_check.php @generated by Composer
|
||||||
|
|
||||||
|
$issues = array();
|
||||||
|
|
||||||
|
if (!(PHP_VERSION_ID >= 80000)) {
|
||||||
|
$issues[] = 'Your Composer dependencies require a PHP version ">= 8.0.0". You are running ' . PHP_VERSION . '.';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($issues) {
|
||||||
|
if (!headers_sent()) {
|
||||||
|
header('HTTP/1.1 500 Internal Server Error');
|
||||||
|
}
|
||||||
|
if (!ini_get('display_errors')) {
|
||||||
|
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
|
||||||
|
fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL);
|
||||||
|
} elseif (!headers_sent()) {
|
||||||
|
echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new \RuntimeException(
|
||||||
|
'Composer detected issues in your platform: ' . implode(' ', $issues)
|
||||||
|
);
|
||||||
|
}
|
||||||
48
vendor/paragonie/constant_time_encoding/LICENSE.txt
vendored
Normal file
48
vendor/paragonie/constant_time_encoding/LICENSE.txt
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 - 2022 Paragon Initiative Enterprises
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
This library was based on the work of Steve "Sc00bz" Thomas.
|
||||||
|
------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Steve Thomas
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
88
vendor/paragonie/constant_time_encoding/README.md
vendored
Normal file
88
vendor/paragonie/constant_time_encoding/README.md
vendored
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Constant-Time Encoding
|
||||||
|
|
||||||
|
[](https://github.com/paragonie/constant_time_encoding/actions)
|
||||||
|
[](https://github.com/paragonie/constant_time_encoding/actions)
|
||||||
|
[](https://packagist.org/packages/paragonie/constant_time_encoding)
|
||||||
|
[](https://packagist.org/packages/paragonie/constant_time_encoding)
|
||||||
|
[](https://packagist.org/packages/paragonie/constant_time_encoding)
|
||||||
|
[](https://packagist.org/packages/paragonie/constant_time_encoding)
|
||||||
|
|
||||||
|
Based on the [constant-time base64 implementation made by Steve "Sc00bz" Thomas](https://github.com/Sc00bz/ConstTimeEncoding),
|
||||||
|
this library aims to offer character encoding functions that do not leak
|
||||||
|
information about what you are encoding/decoding via processor cache
|
||||||
|
misses. Further reading on [cache-timing attacks](http://blog.ircmaxell.com/2014/11/its-all-about-time.html).
|
||||||
|
|
||||||
|
Our fork offers the following enhancements:
|
||||||
|
|
||||||
|
* `mbstring.func_overload` resistance
|
||||||
|
* Unit tests
|
||||||
|
* Composer- and Packagist-ready
|
||||||
|
* Base16 encoding
|
||||||
|
* Base32 encoding
|
||||||
|
* Uses `pack()` and `unpack()` instead of `chr()` and `ord()`
|
||||||
|
|
||||||
|
## PHP Version Requirements
|
||||||
|
|
||||||
|
Version 3 of this library should work on **PHP 8** or newer.
|
||||||
|
|
||||||
|
Version 2 of this library should work on **PHP 7** or newer. See [the v2.x branch](https://github.com/paragonie/constant_time_encoding/tree/v2.x).
|
||||||
|
|
||||||
|
For PHP 5 support, see [the v1.x branch](https://github.com/paragonie/constant_time_encoding/tree/v1.x).
|
||||||
|
|
||||||
|
If you are adding this as a dependency to a project intended to work on PHP 5 through 8.4, please set the required version to `^1|^2|^3`.
|
||||||
|
|
||||||
|
## How to Install
|
||||||
|
|
||||||
|
```sh
|
||||||
|
composer require paragonie/constant_time_encoding
|
||||||
|
```
|
||||||
|
|
||||||
|
## How to Use
|
||||||
|
|
||||||
|
```php
|
||||||
|
use ParagonIE\ConstantTime\Encoding;
|
||||||
|
|
||||||
|
// possibly (if applicable):
|
||||||
|
// require 'vendor/autoload.php';
|
||||||
|
|
||||||
|
$data = random_bytes(32);
|
||||||
|
echo Encoding::base64Encode($data), "\n";
|
||||||
|
echo Encoding::base32EncodeUpper($data), "\n";
|
||||||
|
echo Encoding::base32Encode($data), "\n";
|
||||||
|
echo Encoding::hexEncode($data), "\n";
|
||||||
|
echo Encoding::hexEncodeUpper($data), "\n";
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```
|
||||||
|
1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=
|
||||||
|
2VMKKPSHSWVCVZJ6E7SONRY3ZXCNG3GE6ZZFU7TGJSX7KUKFNLAQ====
|
||||||
|
2vmkkpshswvcvzj6e7sonry3zxcng3ge6zzfu7tgjsx7kukfnlaq====
|
||||||
|
d558a53e4795aa2ae53e27e4e6c71bcdc4d36cc4f6725a7e664caff551456ac1
|
||||||
|
D558A53E4795AA2AE53E27E4E6C71BDCC4D36CC4F6725A7E664CAFF551456AC1
|
||||||
|
```
|
||||||
|
|
||||||
|
If you only need a particular variant, you can just reference the
|
||||||
|
required class like so:
|
||||||
|
|
||||||
|
```php
|
||||||
|
use ParagonIE\ConstantTime\Base64;
|
||||||
|
use ParagonIE\ConstantTime\Base32;
|
||||||
|
|
||||||
|
$data = random_bytes(32);
|
||||||
|
echo Base64::encode($data), "\n";
|
||||||
|
echo Base32::encode($data), "\n";
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```
|
||||||
|
1VilPkeVqirlPifk5scbzcTTbMT2clp+Zkyv9VFFasE=
|
||||||
|
2vmkkpshswvcvzj6e7sonry3zxcng3ge6zzfu7tgjsx7kukfnlaq====
|
||||||
|
```
|
||||||
|
|
||||||
|
## Support Contracts
|
||||||
|
|
||||||
|
If your company uses this library in their products or services, you may be
|
||||||
|
interested in [purchasing a support contract from Paragon Initiative Enterprises](https://paragonie.com/enterprise).
|
||||||
56
vendor/paragonie/constant_time_encoding/composer.json
vendored
Normal file
56
vendor/paragonie/constant_time_encoding/composer.json
vendored
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"name": "paragonie/constant_time_encoding",
|
||||||
|
"description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)",
|
||||||
|
"keywords": [
|
||||||
|
"base64",
|
||||||
|
"encoding",
|
||||||
|
"rfc4648",
|
||||||
|
"base32",
|
||||||
|
"base16",
|
||||||
|
"hex",
|
||||||
|
"bin2hex",
|
||||||
|
"hex2bin",
|
||||||
|
"base64_encode",
|
||||||
|
"base64_decode",
|
||||||
|
"base32_encode",
|
||||||
|
"base32_decode"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"type": "library",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com",
|
||||||
|
"role": "Maintainer"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Steve 'Sc00bz' Thomas",
|
||||||
|
"email": "steve@tobtu.com",
|
||||||
|
"homepage": "https://www.tobtu.com",
|
||||||
|
"role": "Original Developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/paragonie/constant_time_encoding/issues",
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"source": "https://github.com/paragonie/constant_time_encoding"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": "^8"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9",
|
||||||
|
"vimeo/psalm": "^4|^5"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"ParagonIE\\ConstantTime\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload-dev": {
|
||||||
|
"psr-4": {
|
||||||
|
"ParagonIE\\ConstantTime\\Tests\\": "tests/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
541
vendor/paragonie/constant_time_encoding/src/Base32.php
vendored
Normal file
541
vendor/paragonie/constant_time_encoding/src/Base32.php
vendored
Normal file
@@ -0,0 +1,541 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use RangeException;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base32
|
||||||
|
* [A-Z][2-7]
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base32 implements EncoderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Decode a Base32-encoded string into raw binary
|
||||||
|
*
|
||||||
|
* @param string $encodedString
|
||||||
|
* @param bool $strictPadding
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $encodedString,
|
||||||
|
bool $strictPadding = false
|
||||||
|
): string {
|
||||||
|
return static::doDecode($encodedString, false, $strictPadding);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode an uppercase Base32-encoded string into raw binary
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @param bool $strictPadding
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function decodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src,
|
||||||
|
bool $strictPadding = false
|
||||||
|
): string {
|
||||||
|
return static::doDecode($src, true, $strictPadding);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into Base32 (RFC 4648)
|
||||||
|
*
|
||||||
|
* @param string $binString
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $binString
|
||||||
|
): string {
|
||||||
|
return static::doEncode($binString, false, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into Base32 (RFC 4648)
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encodeUnpadded(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src
|
||||||
|
): string {
|
||||||
|
return static::doEncode($src, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into uppercase Base32 (RFC 4648)
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src
|
||||||
|
): string {
|
||||||
|
return static::doEncode($src, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into uppercase Base32 (RFC 4648)
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encodeUpperUnpadded(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src
|
||||||
|
): string {
|
||||||
|
return static::doEncode($src, true, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 5-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode5Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 96 && $src < 123) $ret += $src - 97 + 1; // -64
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 96);
|
||||||
|
|
||||||
|
// if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23
|
||||||
|
$ret += (((0x31 - $src) & ($src - 0x38)) >> 8) & ($src - 23);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 5-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* Uppercase variant.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode5BitsUpper(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 64 && $src < 91) $ret += $src - 65 + 1; // -64
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64);
|
||||||
|
|
||||||
|
// if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23
|
||||||
|
$ret += (((0x31 - $src) & ($src - 0x38)) >> 8) & ($src - 23);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 5-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode5Bits(int $src): string
|
||||||
|
{
|
||||||
|
$diff = 0x61;
|
||||||
|
|
||||||
|
// if ($src > 25) $ret -= 72;
|
||||||
|
$diff -= ((25 - $src) >> 8) & 73;
|
||||||
|
|
||||||
|
return \pack('C', $src + $diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 5-bit integers.
|
||||||
|
*
|
||||||
|
* Uppercase variant.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode5BitsUpper(int $src): string
|
||||||
|
{
|
||||||
|
$diff = 0x41;
|
||||||
|
|
||||||
|
// if ($src > 25) $ret -= 40;
|
||||||
|
$diff -= ((25 - $src) >> 8) & 41;
|
||||||
|
|
||||||
|
return \pack('C', $src + $diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $encodedString
|
||||||
|
* @param bool $upper
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function decodeNoPadding(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $encodedString,
|
||||||
|
bool $upper = false
|
||||||
|
): string {
|
||||||
|
$srcLen = Binary::safeStrlen($encodedString);
|
||||||
|
if ($srcLen === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (($srcLen & 7) === 0) {
|
||||||
|
for ($j = 0; $j < 7 && $j < $srcLen; ++$j) {
|
||||||
|
if ($encodedString[$srcLen - $j - 1] === '=') {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
"decodeNoPadding() doesn't tolerate padding"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return static::doDecode(
|
||||||
|
$encodedString,
|
||||||
|
$upper,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base32 decoding
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @param bool $upper
|
||||||
|
* @param bool $strictPadding
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
protected static function doDecode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src,
|
||||||
|
bool $upper = false,
|
||||||
|
bool $strictPadding = false
|
||||||
|
): string {
|
||||||
|
// We do this to reduce code duplication:
|
||||||
|
$method = $upper
|
||||||
|
? 'decode5BitsUpper'
|
||||||
|
: 'decode5Bits';
|
||||||
|
|
||||||
|
// Remove padding
|
||||||
|
$srcLen = Binary::safeStrlen($src);
|
||||||
|
if ($srcLen === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if ($strictPadding) {
|
||||||
|
if (($srcLen & 7) === 0) {
|
||||||
|
for ($j = 0; $j < 7; ++$j) {
|
||||||
|
if ($src[$srcLen - 1] === '=') {
|
||||||
|
$srcLen--;
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (($srcLen & 7) === 1) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Incorrect padding'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$src = \rtrim($src, '=');
|
||||||
|
$srcLen = Binary::safeStrlen($src);
|
||||||
|
}
|
||||||
|
|
||||||
|
$err = 0;
|
||||||
|
$dest = '';
|
||||||
|
// Main loop (no padding):
|
||||||
|
for ($i = 0; $i + 8 <= $srcLen; $i += 8) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, 8));
|
||||||
|
/** @var int $c0 */
|
||||||
|
$c0 = static::$method($chunk[1]);
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
/** @var int $c3 */
|
||||||
|
$c3 = static::$method($chunk[4]);
|
||||||
|
/** @var int $c4 */
|
||||||
|
$c4 = static::$method($chunk[5]);
|
||||||
|
/** @var int $c5 */
|
||||||
|
$c5 = static::$method($chunk[6]);
|
||||||
|
/** @var int $c6 */
|
||||||
|
$c6 = static::$method($chunk[7]);
|
||||||
|
/** @var int $c7 */
|
||||||
|
$c7 = static::$method($chunk[8]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CCCCC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff,
|
||||||
|
(($c3 << 4) | ($c4 >> 1) ) & 0xff,
|
||||||
|
(($c4 << 7) | ($c5 << 2) | ($c6 >> 3)) & 0xff,
|
||||||
|
(($c6 << 5) | ($c7 ) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6 | $c7) >> 8;
|
||||||
|
}
|
||||||
|
// The last chunk, which may have padding:
|
||||||
|
if ($i < $srcLen) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i));
|
||||||
|
/** @var int $c0 */
|
||||||
|
$c0 = static::$method($chunk[1]);
|
||||||
|
|
||||||
|
if ($i + 6 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
/** @var int $c3 */
|
||||||
|
$c3 = static::$method($chunk[4]);
|
||||||
|
/** @var int $c4 */
|
||||||
|
$c4 = static::$method($chunk[5]);
|
||||||
|
/** @var int $c5 */
|
||||||
|
$c5 = static::$method($chunk[6]);
|
||||||
|
/** @var int $c6 */
|
||||||
|
$c6 = static::$method($chunk[7]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CCCC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff,
|
||||||
|
(($c3 << 4) | ($c4 >> 1) ) & 0xff,
|
||||||
|
(($c4 << 7) | ($c5 << 2) | ($c6 >> 3)) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c6 << 5) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($i + 5 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
/** @var int $c3 */
|
||||||
|
$c3 = static::$method($chunk[4]);
|
||||||
|
/** @var int $c4 */
|
||||||
|
$c4 = static::$method($chunk[5]);
|
||||||
|
/** @var int $c5 */
|
||||||
|
$c5 = static::$method($chunk[6]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CCCC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff,
|
||||||
|
(($c3 << 4) | ($c4 >> 1) ) & 0xff,
|
||||||
|
(($c4 << 7) | ($c5 << 2) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5) >> 8;
|
||||||
|
} elseif ($i + 4 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
/** @var int $c3 */
|
||||||
|
$c3 = static::$method($chunk[4]);
|
||||||
|
/** @var int $c4 */
|
||||||
|
$c4 = static::$method($chunk[5]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CCC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff,
|
||||||
|
(($c3 << 4) | ($c4 >> 1) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3 | $c4) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c4 << 7) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($i + 3 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
/** @var int $c3 */
|
||||||
|
$c3 = static::$method($chunk[4]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) | ($c3 >> 4)) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c3 << 4) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($i + 2 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
/** @var int $c2 */
|
||||||
|
$c2 = static::$method($chunk[3]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CC',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff,
|
||||||
|
(($c1 << 6) | ($c2 << 1) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c2 << 6) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($i + 1 < $srcLen) {
|
||||||
|
/** @var int $c1 */
|
||||||
|
$c1 = static::$method($chunk[2]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'C',
|
||||||
|
(($c0 << 3) | ($c1 >> 2) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c1 << 6) & 0xff;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$dest .= \pack(
|
||||||
|
'C',
|
||||||
|
(($c0 << 3) ) & 0xff
|
||||||
|
);
|
||||||
|
$err |= ($c0) >> 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$check = ($err === 0);
|
||||||
|
if (!$check) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Base32::doDecode() only expects characters in the correct base32 alphabet'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base32 Encoding
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @param bool $upper
|
||||||
|
* @param bool $pad
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
protected static function doEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src,
|
||||||
|
bool $upper = false,
|
||||||
|
$pad = true
|
||||||
|
): string {
|
||||||
|
// We do this to reduce code duplication:
|
||||||
|
$method = $upper
|
||||||
|
? 'encode5BitsUpper'
|
||||||
|
: 'encode5Bits';
|
||||||
|
|
||||||
|
$dest = '';
|
||||||
|
$srcLen = Binary::safeStrlen($src);
|
||||||
|
|
||||||
|
// Main loop (no padding):
|
||||||
|
for ($i = 0; $i + 5 <= $srcLen; $i += 5) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, 5));
|
||||||
|
$b0 = $chunk[1];
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$b2 = $chunk[3];
|
||||||
|
$b3 = $chunk[4];
|
||||||
|
$b4 = $chunk[5];
|
||||||
|
$dest .=
|
||||||
|
static::$method( ($b0 >> 3) & 31) .
|
||||||
|
static::$method((($b0 << 2) | ($b1 >> 6)) & 31) .
|
||||||
|
static::$method((($b1 >> 1) ) & 31) .
|
||||||
|
static::$method((($b1 << 4) | ($b2 >> 4)) & 31) .
|
||||||
|
static::$method((($b2 << 1) | ($b3 >> 7)) & 31) .
|
||||||
|
static::$method((($b3 >> 2) ) & 31) .
|
||||||
|
static::$method((($b3 << 3) | ($b4 >> 5)) & 31) .
|
||||||
|
static::$method( $b4 & 31);
|
||||||
|
}
|
||||||
|
// The last chunk, which may have padding:
|
||||||
|
if ($i < $srcLen) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i));
|
||||||
|
$b0 = $chunk[1];
|
||||||
|
if ($i + 3 < $srcLen) {
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$b2 = $chunk[3];
|
||||||
|
$b3 = $chunk[4];
|
||||||
|
$dest .=
|
||||||
|
static::$method( ($b0 >> 3) & 31) .
|
||||||
|
static::$method((($b0 << 2) | ($b1 >> 6)) & 31) .
|
||||||
|
static::$method((($b1 >> 1) ) & 31) .
|
||||||
|
static::$method((($b1 << 4) | ($b2 >> 4)) & 31) .
|
||||||
|
static::$method((($b2 << 1) | ($b3 >> 7)) & 31) .
|
||||||
|
static::$method((($b3 >> 2) ) & 31) .
|
||||||
|
static::$method((($b3 << 3) ) & 31);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '=';
|
||||||
|
}
|
||||||
|
} elseif ($i + 2 < $srcLen) {
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$b2 = $chunk[3];
|
||||||
|
$dest .=
|
||||||
|
static::$method( ($b0 >> 3) & 31) .
|
||||||
|
static::$method((($b0 << 2) | ($b1 >> 6)) & 31) .
|
||||||
|
static::$method((($b1 >> 1) ) & 31) .
|
||||||
|
static::$method((($b1 << 4) | ($b2 >> 4)) & 31) .
|
||||||
|
static::$method((($b2 << 1) ) & 31);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '===';
|
||||||
|
}
|
||||||
|
} elseif ($i + 1 < $srcLen) {
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$dest .=
|
||||||
|
static::$method( ($b0 >> 3) & 31) .
|
||||||
|
static::$method((($b0 << 2) | ($b1 >> 6)) & 31) .
|
||||||
|
static::$method((($b1 >> 1) ) & 31) .
|
||||||
|
static::$method((($b1 << 4) ) & 31);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '====';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$dest .=
|
||||||
|
static::$method( ($b0 >> 3) & 31) .
|
||||||
|
static::$method( ($b0 << 2) & 31);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '======';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
}
|
||||||
111
vendor/paragonie/constant_time_encoding/src/Base32Hex.php
vendored
Normal file
111
vendor/paragonie/constant_time_encoding/src/Base32Hex.php
vendored
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base32Hex
|
||||||
|
* [0-9][A-V]
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base32Hex extends Base32
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 5-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode5Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47
|
||||||
|
$ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src - 47);
|
||||||
|
|
||||||
|
// if ($src > 0x60 && $src < 0x77) ret += $src - 0x61 + 10 + 1; // -86
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x77)) >> 8) & ($src - 86);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 5-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode5BitsUpper(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47
|
||||||
|
$ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src - 47);
|
||||||
|
|
||||||
|
// if ($src > 0x40 && $src < 0x57) ret += $src - 0x41 + 10 + 1; // -54
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x57)) >> 8) & ($src - 54);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 5-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode5Bits(int $src): string
|
||||||
|
{
|
||||||
|
$src += 0x30;
|
||||||
|
|
||||||
|
// if ($src > 0x39) $src += 0x61 - 0x3a; // 39
|
||||||
|
$src += ((0x39 - $src) >> 8) & 39;
|
||||||
|
|
||||||
|
return \pack('C', $src);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 5-bit integers.
|
||||||
|
*
|
||||||
|
* Uppercase variant.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode5BitsUpper(int $src): string
|
||||||
|
{
|
||||||
|
$src += 0x30;
|
||||||
|
|
||||||
|
// if ($src > 0x39) $src += 0x41 - 0x3a; // 7
|
||||||
|
$src += ((0x39 - $src) >> 8) & 7;
|
||||||
|
|
||||||
|
return \pack('C', $src);
|
||||||
|
}
|
||||||
|
}
|
||||||
319
vendor/paragonie/constant_time_encoding/src/Base64.php
vendored
Normal file
319
vendor/paragonie/constant_time_encoding/src/Base64.php
vendored
Normal file
@@ -0,0 +1,319 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use InvalidArgumentException;
|
||||||
|
use RangeException;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base64
|
||||||
|
* [A-Z][a-z][0-9]+/
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base64 implements EncoderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Encode into Base64
|
||||||
|
*
|
||||||
|
* Base64 character set "[A-Z][a-z][0-9]+/"
|
||||||
|
*
|
||||||
|
* @param string $binString
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $binString
|
||||||
|
): string {
|
||||||
|
return static::doEncode($binString, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into Base64, no = padding
|
||||||
|
*
|
||||||
|
* Base64 character set "[A-Z][a-z][0-9]+/"
|
||||||
|
*
|
||||||
|
* @param string $src
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encodeUnpadded(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src
|
||||||
|
): string {
|
||||||
|
return static::doEncode($src, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $src
|
||||||
|
* @param bool $pad Include = padding?
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
protected static function doEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $src,
|
||||||
|
bool $pad = true
|
||||||
|
): string {
|
||||||
|
$dest = '';
|
||||||
|
$srcLen = Binary::safeStrlen($src);
|
||||||
|
// Main loop (no padding):
|
||||||
|
for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, 3));
|
||||||
|
$b0 = $chunk[1];
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$b2 = $chunk[3];
|
||||||
|
|
||||||
|
$dest .=
|
||||||
|
static::encode6Bits( $b0 >> 2 ) .
|
||||||
|
static::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
|
||||||
|
static::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) .
|
||||||
|
static::encode6Bits( $b2 & 63);
|
||||||
|
}
|
||||||
|
// The last chunk, which may have padding:
|
||||||
|
if ($i < $srcLen) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($src, $i, $srcLen - $i));
|
||||||
|
$b0 = $chunk[1];
|
||||||
|
if ($i + 1 < $srcLen) {
|
||||||
|
$b1 = $chunk[2];
|
||||||
|
$dest .=
|
||||||
|
static::encode6Bits($b0 >> 2) .
|
||||||
|
static::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
|
||||||
|
static::encode6Bits(($b1 << 2) & 63);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '=';
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$dest .=
|
||||||
|
static::encode6Bits( $b0 >> 2) .
|
||||||
|
static::encode6Bits(($b0 << 4) & 63);
|
||||||
|
if ($pad) {
|
||||||
|
$dest .= '==';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* decode from base64 into binary
|
||||||
|
*
|
||||||
|
* Base64 character set "./[A-Z][a-z][0-9]"
|
||||||
|
*
|
||||||
|
* @param string $encodedString
|
||||||
|
* @param bool $strictPadding
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws RangeException
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $encodedString,
|
||||||
|
bool $strictPadding = false
|
||||||
|
): string {
|
||||||
|
// Remove padding
|
||||||
|
$srcLen = Binary::safeStrlen($encodedString);
|
||||||
|
if ($srcLen === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($strictPadding) {
|
||||||
|
if (($srcLen & 3) === 0) {
|
||||||
|
if ($encodedString[$srcLen - 1] === '=') {
|
||||||
|
$srcLen--;
|
||||||
|
if ($encodedString[$srcLen - 1] === '=') {
|
||||||
|
$srcLen--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (($srcLen & 3) === 1) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Incorrect padding'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if ($encodedString[$srcLen - 1] === '=') {
|
||||||
|
throw new RangeException(
|
||||||
|
'Incorrect padding'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$encodedString = \rtrim($encodedString, '=');
|
||||||
|
$srcLen = Binary::safeStrlen($encodedString);
|
||||||
|
}
|
||||||
|
|
||||||
|
$err = 0;
|
||||||
|
$dest = '';
|
||||||
|
// Main loop (no padding):
|
||||||
|
for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($encodedString, $i, 4));
|
||||||
|
$c0 = static::decode6Bits($chunk[1]);
|
||||||
|
$c1 = static::decode6Bits($chunk[2]);
|
||||||
|
$c2 = static::decode6Bits($chunk[3]);
|
||||||
|
$c3 = static::decode6Bits($chunk[4]);
|
||||||
|
|
||||||
|
$dest .= \pack(
|
||||||
|
'CCC',
|
||||||
|
((($c0 << 2) | ($c1 >> 4)) & 0xff),
|
||||||
|
((($c1 << 4) | ($c2 >> 2)) & 0xff),
|
||||||
|
((($c2 << 6) | $c3 ) & 0xff)
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2 | $c3) >> 8;
|
||||||
|
}
|
||||||
|
// The last chunk, which may have padding:
|
||||||
|
if ($i < $srcLen) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', Binary::safeSubstr($encodedString, $i, $srcLen - $i));
|
||||||
|
$c0 = static::decode6Bits($chunk[1]);
|
||||||
|
|
||||||
|
if ($i + 2 < $srcLen) {
|
||||||
|
$c1 = static::decode6Bits($chunk[2]);
|
||||||
|
$c2 = static::decode6Bits($chunk[3]);
|
||||||
|
$dest .= \pack(
|
||||||
|
'CC',
|
||||||
|
((($c0 << 2) | ($c1 >> 4)) & 0xff),
|
||||||
|
((($c1 << 4) | ($c2 >> 2)) & 0xff)
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1 | $c2) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c2 << 6) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($i + 1 < $srcLen) {
|
||||||
|
$c1 = static::decode6Bits($chunk[2]);
|
||||||
|
$dest .= \pack(
|
||||||
|
'C',
|
||||||
|
((($c0 << 2) | ($c1 >> 4)) & 0xff)
|
||||||
|
);
|
||||||
|
$err |= ($c0 | $c1) >> 8;
|
||||||
|
if ($strictPadding) {
|
||||||
|
$err |= ($c1 << 4) & 0xff;
|
||||||
|
}
|
||||||
|
} elseif ($strictPadding) {
|
||||||
|
$err |= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$check = ($err === 0);
|
||||||
|
if (!$check) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Base64::decode() only expects characters in the correct base64 alphabet'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $dest;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $encodedString
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function decodeNoPadding(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $encodedString
|
||||||
|
): string {
|
||||||
|
$srcLen = Binary::safeStrlen($encodedString);
|
||||||
|
if ($srcLen === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (($srcLen & 3) === 0) {
|
||||||
|
// If $strLen is not zero, and it is divisible by 4, then it's at least 4.
|
||||||
|
if ($encodedString[$srcLen - 1] === '=' || $encodedString[$srcLen - 2] === '=') {
|
||||||
|
throw new InvalidArgumentException(
|
||||||
|
"decodeNoPadding() doesn't tolerate padding"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return static::decode(
|
||||||
|
$encodedString,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* Base64 character set:
|
||||||
|
* [A-Z] [a-z] [0-9] + /
|
||||||
|
* 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode6Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64);
|
||||||
|
|
||||||
|
// if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70);
|
||||||
|
|
||||||
|
// if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5
|
||||||
|
$ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5);
|
||||||
|
|
||||||
|
// if ($src == 0x2b) $ret += 62 + 1;
|
||||||
|
$ret += (((0x2a - $src) & ($src - 0x2c)) >> 8) & 63;
|
||||||
|
|
||||||
|
// if ($src == 0x2f) ret += 63 + 1;
|
||||||
|
$ret += (((0x2e - $src) & ($src - 0x30)) >> 8) & 64;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 6-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode6Bits(int $src): string
|
||||||
|
{
|
||||||
|
$diff = 0x41;
|
||||||
|
|
||||||
|
// if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6
|
||||||
|
$diff += ((25 - $src) >> 8) & 6;
|
||||||
|
|
||||||
|
// if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75
|
||||||
|
$diff -= ((51 - $src) >> 8) & 75;
|
||||||
|
|
||||||
|
// if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15
|
||||||
|
$diff -= ((61 - $src) >> 8) & 15;
|
||||||
|
|
||||||
|
// if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3
|
||||||
|
$diff += ((62 - $src) >> 8) & 3;
|
||||||
|
|
||||||
|
return \pack('C', $src + $diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
88
vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
vendored
Normal file
88
vendor/paragonie/constant_time_encoding/src/Base64DotSlash.php
vendored
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base64DotSlash
|
||||||
|
* ./[A-Z][a-z][0-9]
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base64DotSlash extends Base64
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* Base64 character set:
|
||||||
|
* ./ [A-Z] [a-z] [0-9]
|
||||||
|
* 0x2e-0x2f, 0x41-0x5a, 0x61-0x7a, 0x30-0x39
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode6Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x2d && $src < 0x30) ret += $src - 0x2e + 1; // -45
|
||||||
|
$ret += (((0x2d - $src) & ($src - 0x30)) >> 8) & ($src - 45);
|
||||||
|
|
||||||
|
// if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 2 + 1; // -62
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 62);
|
||||||
|
|
||||||
|
// if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 28 + 1; // -68
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 68);
|
||||||
|
|
||||||
|
// if ($src > 0x2f && $src < 0x3a) ret += $src - 0x30 + 54 + 1; // 7
|
||||||
|
$ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 7);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 6-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode6Bits(int $src): string
|
||||||
|
{
|
||||||
|
$src += 0x2e;
|
||||||
|
|
||||||
|
// if ($src > 0x2f) $src += 0x41 - 0x30; // 17
|
||||||
|
$src += ((0x2f - $src) >> 8) & 17;
|
||||||
|
|
||||||
|
// if ($src > 0x5a) $src += 0x61 - 0x5b; // 6
|
||||||
|
$src += ((0x5a - $src) >> 8) & 6;
|
||||||
|
|
||||||
|
// if ($src > 0x7a) $src += 0x30 - 0x7b; // -75
|
||||||
|
$src -= ((0x7a - $src) >> 8) & 75;
|
||||||
|
|
||||||
|
return \pack('C', $src);
|
||||||
|
}
|
||||||
|
}
|
||||||
82
vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
vendored
Normal file
82
vendor/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base64DotSlashOrdered
|
||||||
|
* ./[0-9][A-Z][a-z]
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base64DotSlashOrdered extends Base64
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* Base64 character set:
|
||||||
|
* [.-9] [A-Z] [a-z]
|
||||||
|
* 0x2e-0x39, 0x41-0x5a, 0x61-0x7a
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode6Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x2d && $src < 0x3a) ret += $src - 0x2e + 1; // -45
|
||||||
|
$ret += (((0x2d - $src) & ($src - 0x3a)) >> 8) & ($src - 45);
|
||||||
|
|
||||||
|
// if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 12 + 1; // -52
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 52);
|
||||||
|
|
||||||
|
// if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 38 + 1; // -58
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 58);
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 6-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode6Bits(int $src): string
|
||||||
|
{
|
||||||
|
$src += 0x2e;
|
||||||
|
|
||||||
|
// if ($src > 0x39) $src += 0x41 - 0x3a; // 7
|
||||||
|
$src += ((0x39 - $src) >> 8) & 7;
|
||||||
|
|
||||||
|
// if ($src > 0x5a) $src += 0x61 - 0x5b; // 6
|
||||||
|
$src += ((0x5a - $src) >> 8) & 6;
|
||||||
|
|
||||||
|
return \pack('C', $src);
|
||||||
|
}
|
||||||
|
}
|
||||||
95
vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
vendored
Normal file
95
vendor/paragonie/constant_time_encoding/src/Base64UrlSafe.php
vendored
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Base64UrlSafe
|
||||||
|
* [A-Z][a-z][0-9]\-_
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Base64UrlSafe extends Base64
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
|
||||||
|
* into 8-bit integers.
|
||||||
|
*
|
||||||
|
* Base64 character set:
|
||||||
|
* [A-Z] [a-z] [0-9] - _
|
||||||
|
* 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2d, 0x5f
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function decode6Bits(int $src): int
|
||||||
|
{
|
||||||
|
$ret = -1;
|
||||||
|
|
||||||
|
// if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64
|
||||||
|
$ret += (((0x40 - $src) & ($src - 0x5b)) >> 8) & ($src - 64);
|
||||||
|
|
||||||
|
// if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70
|
||||||
|
$ret += (((0x60 - $src) & ($src - 0x7b)) >> 8) & ($src - 70);
|
||||||
|
|
||||||
|
// if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5
|
||||||
|
$ret += (((0x2f - $src) & ($src - 0x3a)) >> 8) & ($src + 5);
|
||||||
|
|
||||||
|
// if ($src == 0x2c) $ret += 62 + 1;
|
||||||
|
$ret += (((0x2c - $src) & ($src - 0x2e)) >> 8) & 63;
|
||||||
|
|
||||||
|
// if ($src == 0x5f) ret += 63 + 1;
|
||||||
|
$ret += (((0x5e - $src) & ($src - 0x60)) >> 8) & 64;
|
||||||
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||||
|
* into 6-bit integers.
|
||||||
|
*
|
||||||
|
* @param int $src
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function encode6Bits(int $src): string
|
||||||
|
{
|
||||||
|
$diff = 0x41;
|
||||||
|
|
||||||
|
// if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6
|
||||||
|
$diff += ((25 - $src) >> 8) & 6;
|
||||||
|
|
||||||
|
// if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75
|
||||||
|
$diff -= ((51 - $src) >> 8) & 75;
|
||||||
|
|
||||||
|
// if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13
|
||||||
|
$diff -= ((61 - $src) >> 8) & 13;
|
||||||
|
|
||||||
|
// if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3
|
||||||
|
$diff += ((62 - $src) >> 8) & 49;
|
||||||
|
|
||||||
|
return \pack('C', $src + $diff);
|
||||||
|
}
|
||||||
|
}
|
||||||
93
vendor/paragonie/constant_time_encoding/src/Binary.php
vendored
Normal file
93
vendor/paragonie/constant_time_encoding/src/Binary.php
vendored
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Binary
|
||||||
|
*
|
||||||
|
* Binary string operators that don't choke on
|
||||||
|
* mbstring.func_overload
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Binary
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Safe string length
|
||||||
|
*
|
||||||
|
* @ref mbstring.func_overload
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public static function safeStrlen(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): int {
|
||||||
|
if (\function_exists('mb_strlen')) {
|
||||||
|
// mb_strlen in PHP 7.x can return false.
|
||||||
|
/** @psalm-suppress RedundantCast */
|
||||||
|
return (int) \mb_strlen($str, '8bit');
|
||||||
|
} else {
|
||||||
|
return \strlen($str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Safe substring
|
||||||
|
*
|
||||||
|
* @ref mbstring.func_overload
|
||||||
|
*
|
||||||
|
* @staticvar boolean $exists
|
||||||
|
* @param string $str
|
||||||
|
* @param int $start
|
||||||
|
* @param ?int $length
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function safeSubstr(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str,
|
||||||
|
int $start = 0,
|
||||||
|
?int $length = null
|
||||||
|
): string {
|
||||||
|
if ($length === 0) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (\function_exists('mb_substr')) {
|
||||||
|
return \mb_substr($str, $start, $length, '8bit');
|
||||||
|
}
|
||||||
|
// Unlike mb_substr(), substr() doesn't accept NULL for length
|
||||||
|
if ($length !== null) {
|
||||||
|
return \substr($str, $start, $length);
|
||||||
|
} else {
|
||||||
|
return \substr($str, $start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
52
vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
vendored
Normal file
52
vendor/paragonie/constant_time_encoding/src/EncoderInterface.php
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface EncoderInterface
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
interface EncoderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $binString (raw binary)
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function encode(string $binString): string;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $encodedString
|
||||||
|
* @param bool $strictPadding Error on invalid padding
|
||||||
|
* @return string (raw binary)
|
||||||
|
*/
|
||||||
|
public static function decode(string $encodedString, bool $strictPadding = false): string;
|
||||||
|
}
|
||||||
298
vendor/paragonie/constant_time_encoding/src/Encoding.php
vendored
Normal file
298
vendor/paragonie/constant_time_encoding/src/Encoding.php
vendored
Normal file
@@ -0,0 +1,298 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Encoding
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Encoding
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 encoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32Encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 encoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32EncodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::encodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 decoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32Decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::decode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 decoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32DecodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::decodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 encoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32Hex::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32Hex encoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexEncodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32Hex::encodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32Hex decoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexDecode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32Hex::decode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32Hex decoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexDecodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32Hex::decodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 encoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64Encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 decoding
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64Decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64::decode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into Base64
|
||||||
|
*
|
||||||
|
* Base64 character set "./[A-Z][a-z][0-9]"
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64EncodeDotSlash(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64DotSlash::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode from base64 to raw binary
|
||||||
|
*
|
||||||
|
* Base64 character set "./[A-Z][a-z][0-9]"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws \RangeException
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64DecodeDotSlash(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64DotSlash::decode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode into Base64
|
||||||
|
*
|
||||||
|
* Base64 character set "[.-9][A-Z][a-z]" or "./[0-9][A-Z][a-z]"
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64EncodeDotSlashOrdered(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64DotSlashOrdered::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode from base64 to raw binary
|
||||||
|
*
|
||||||
|
* Base64 character set "[.-9][A-Z][a-z]" or "./[0-9][A-Z][a-z]"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
* @throws \RangeException
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64DecodeDotSlashOrdered(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64DotSlashOrdered::decode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $bin_string (raw binary)
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function hexEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $bin_string
|
||||||
|
): string {
|
||||||
|
return Hex::encode($bin_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a hexadecimal string into a binary string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $hex_string
|
||||||
|
* @return string (raw binary)
|
||||||
|
* @throws \RangeException
|
||||||
|
*/
|
||||||
|
public static function hexDecode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $hex_string
|
||||||
|
): string {
|
||||||
|
return Hex::decode($hex_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $bin_string (raw binary)
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function hexEncodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $bin_string
|
||||||
|
): string {
|
||||||
|
return Hex::encodeUpper($bin_string);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $bin_string (raw binary)
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function hexDecodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $bin_string
|
||||||
|
): string {
|
||||||
|
return Hex::decode($bin_string);
|
||||||
|
}
|
||||||
|
}
|
||||||
151
vendor/paragonie/constant_time_encoding/src/Hex.php
vendored
Normal file
151
vendor/paragonie/constant_time_encoding/src/Hex.php
vendored
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use RangeException;
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Hex
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class Hex implements EncoderInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $binString (raw binary)
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $binString
|
||||||
|
): string {
|
||||||
|
$hex = '';
|
||||||
|
$len = Binary::safeStrlen($binString);
|
||||||
|
for ($i = 0; $i < $len; ++$i) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C', $binString[$i]);
|
||||||
|
$c = $chunk[1] & 0xf;
|
||||||
|
$b = $chunk[1] >> 4;
|
||||||
|
|
||||||
|
$hex .= \pack(
|
||||||
|
'CC',
|
||||||
|
(87 + $b + ((($b - 10) >> 8) & ~38)),
|
||||||
|
(87 + $c + ((($c - 10) >> 8) & ~38))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $hex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a binary string into a hexadecimal string without cache-timing
|
||||||
|
* leaks, returning uppercase letters (as per RFC 4648)
|
||||||
|
*
|
||||||
|
* @param string $binString (raw binary)
|
||||||
|
* @return string
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function encodeUpper(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $binString
|
||||||
|
): string {
|
||||||
|
$hex = '';
|
||||||
|
$len = Binary::safeStrlen($binString);
|
||||||
|
|
||||||
|
for ($i = 0; $i < $len; ++$i) {
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C', $binString[$i]);
|
||||||
|
$c = $chunk[1] & 0xf;
|
||||||
|
$b = $chunk[1] >> 4;
|
||||||
|
|
||||||
|
$hex .= \pack(
|
||||||
|
'CC',
|
||||||
|
(55 + $b + ((($b - 10) >> 8) & ~6)),
|
||||||
|
(55 + $c + ((($c - 10) >> 8) & ~6))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return $hex;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a hexadecimal string into a binary string without cache-timing
|
||||||
|
* leaks
|
||||||
|
*
|
||||||
|
* @param string $encodedString
|
||||||
|
* @param bool $strictPadding
|
||||||
|
* @return string (raw binary)
|
||||||
|
* @throws RangeException
|
||||||
|
*/
|
||||||
|
public static function decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $encodedString,
|
||||||
|
bool $strictPadding = false
|
||||||
|
): string {
|
||||||
|
$hex_pos = 0;
|
||||||
|
$bin = '';
|
||||||
|
$c_acc = 0;
|
||||||
|
$hex_len = Binary::safeStrlen($encodedString);
|
||||||
|
$state = 0;
|
||||||
|
if (($hex_len & 1) !== 0) {
|
||||||
|
if ($strictPadding) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Expected an even number of hexadecimal characters'
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$encodedString = '0' . $encodedString;
|
||||||
|
++$hex_len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @var array<int, int> $chunk */
|
||||||
|
$chunk = \unpack('C*', $encodedString);
|
||||||
|
while ($hex_pos < $hex_len) {
|
||||||
|
++$hex_pos;
|
||||||
|
$c = $chunk[$hex_pos];
|
||||||
|
$c_num = $c ^ 48;
|
||||||
|
$c_num0 = ($c_num - 10) >> 8;
|
||||||
|
$c_alpha = ($c & ~32) - 55;
|
||||||
|
$c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
|
||||||
|
|
||||||
|
if (($c_num0 | $c_alpha0) === 0) {
|
||||||
|
throw new RangeException(
|
||||||
|
'Expected hexadecimal character'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
|
||||||
|
if ($state === 0) {
|
||||||
|
$c_acc = $c_val * 16;
|
||||||
|
} else {
|
||||||
|
$bin .= \pack('C', $c_acc | $c_val);
|
||||||
|
}
|
||||||
|
$state ^= 1;
|
||||||
|
}
|
||||||
|
return $bin;
|
||||||
|
}
|
||||||
|
}
|
||||||
206
vendor/paragonie/constant_time_encoding/src/RFC4648.php
vendored
Normal file
206
vendor/paragonie/constant_time_encoding/src/RFC4648.php
vendored
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
namespace ParagonIE\ConstantTime;
|
||||||
|
|
||||||
|
use TypeError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2016 - 2022 Paragon Initiative Enterprises.
|
||||||
|
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in all
|
||||||
|
* copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class RFC4648
|
||||||
|
*
|
||||||
|
* This class conforms strictly to the RFC
|
||||||
|
*
|
||||||
|
* @package ParagonIE\ConstantTime
|
||||||
|
*/
|
||||||
|
abstract class RFC4648
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 encoding
|
||||||
|
*
|
||||||
|
* "foo" -> "Zm9v"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64Encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 decoding
|
||||||
|
*
|
||||||
|
* "Zm9v" -> "foo"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64Decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64::decode($str, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 (URL Safe) encoding
|
||||||
|
*
|
||||||
|
* "foo" -> "Zm9v"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64UrlSafeEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64UrlSafe::encode($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base64 (URL Safe) decoding
|
||||||
|
*
|
||||||
|
* "Zm9v" -> "foo"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base64UrlSafeDecode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base64UrlSafe::decode($str, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 encoding
|
||||||
|
*
|
||||||
|
* "foo" -> "MZXW6==="
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32Encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::encodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32 encoding
|
||||||
|
*
|
||||||
|
* "MZXW6===" -> "foo"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32Decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::decodeUpper($str, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32-Hex encoding
|
||||||
|
*
|
||||||
|
* "foo" -> "CPNMU==="
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexEncode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::encodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base32-Hex decoding
|
||||||
|
*
|
||||||
|
* "CPNMU===" -> "foo"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base32HexDecode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Base32::decodeUpper($str, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base16 decoding
|
||||||
|
*
|
||||||
|
* "foo" -> "666F6F"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @throws TypeError
|
||||||
|
*/
|
||||||
|
public static function base16Encode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Hex::encodeUpper($str);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RFC 4648 Base16 decoding
|
||||||
|
*
|
||||||
|
* "666F6F" -> "foo"
|
||||||
|
*
|
||||||
|
* @param string $str
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public static function base16Decode(
|
||||||
|
#[\SensitiveParameter]
|
||||||
|
string $str
|
||||||
|
): string {
|
||||||
|
return Hex::decode($str, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
22
vendor/paragonie/random_compat/LICENSE
vendored
Normal file
22
vendor/paragonie/random_compat/LICENSE
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Paragon Initiative Enterprises
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
5
vendor/paragonie/random_compat/build-phar.sh
vendored
Executable file
5
vendor/paragonie/random_compat/build-phar.sh
vendored
Executable file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
basedir=$( dirname $( readlink -f ${BASH_SOURCE[0]} ) )
|
||||||
|
|
||||||
|
php -dphar.readonly=0 "$basedir/other/build_phar.php" $*
|
||||||
34
vendor/paragonie/random_compat/composer.json
vendored
Normal file
34
vendor/paragonie/random_compat/composer.json
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
{
|
||||||
|
"name": "paragonie/random_compat",
|
||||||
|
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||||
|
"keywords": [
|
||||||
|
"csprng",
|
||||||
|
"random",
|
||||||
|
"polyfill",
|
||||||
|
"pseudorandom"
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"type": "library",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Paragon Initiative Enterprises",
|
||||||
|
"email": "security@paragonie.com",
|
||||||
|
"homepage": "https://paragonie.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/paragonie/random_compat/issues",
|
||||||
|
"email": "info@paragonie.com",
|
||||||
|
"source": "https://github.com/paragonie/random_compat"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">= 7"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"vimeo/psalm": "^1",
|
||||||
|
"phpunit/phpunit": "4.*|5.*"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||||
|
}
|
||||||
|
}
|
||||||
5
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey
vendored
Normal file
5
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
-----BEGIN PUBLIC KEY-----
|
||||||
|
MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm
|
||||||
|
pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p
|
||||||
|
+h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc
|
||||||
|
-----END PUBLIC KEY-----
|
||||||
11
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc
vendored
Normal file
11
vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Version: GnuPG v2.0.22 (MingW32)
|
||||||
|
|
||||||
|
iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip
|
||||||
|
QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg
|
||||||
|
1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW
|
||||||
|
NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA
|
||||||
|
NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV
|
||||||
|
JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74=
|
||||||
|
=B6+8
|
||||||
|
-----END PGP SIGNATURE-----
|
||||||
32
vendor/paragonie/random_compat/lib/random.php
vendored
Normal file
32
vendor/paragonie/random_compat/lib/random.php
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Random_* Compatibility Library
|
||||||
|
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||||
|
*
|
||||||
|
* @version 2.99.99
|
||||||
|
* @released 2018-06-06
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// NOP
|
||||||
57
vendor/paragonie/random_compat/other/build_phar.php
vendored
Normal file
57
vendor/paragonie/random_compat/other/build_phar.php
vendored
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
<?php
|
||||||
|
$dist = dirname(__DIR__).'/dist';
|
||||||
|
if (!is_dir($dist)) {
|
||||||
|
mkdir($dist, 0755);
|
||||||
|
}
|
||||||
|
if (file_exists($dist.'/random_compat.phar')) {
|
||||||
|
unlink($dist.'/random_compat.phar');
|
||||||
|
}
|
||||||
|
$phar = new Phar(
|
||||||
|
$dist.'/random_compat.phar',
|
||||||
|
FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_FILENAME,
|
||||||
|
'random_compat.phar'
|
||||||
|
);
|
||||||
|
rename(
|
||||||
|
dirname(__DIR__).'/lib/random.php',
|
||||||
|
dirname(__DIR__).'/lib/index.php'
|
||||||
|
);
|
||||||
|
$phar->buildFromDirectory(dirname(__DIR__).'/lib');
|
||||||
|
rename(
|
||||||
|
dirname(__DIR__).'/lib/index.php',
|
||||||
|
dirname(__DIR__).'/lib/random.php'
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If we pass an (optional) path to a private key as a second argument, we will
|
||||||
|
* sign the Phar with OpenSSL.
|
||||||
|
*
|
||||||
|
* If you leave this out, it will produce an unsigned .phar!
|
||||||
|
*/
|
||||||
|
if ($argc > 1) {
|
||||||
|
if (!@is_readable($argv[1])) {
|
||||||
|
echo 'Could not read the private key file:', $argv[1], "\n";
|
||||||
|
exit(255);
|
||||||
|
}
|
||||||
|
$pkeyFile = file_get_contents($argv[1]);
|
||||||
|
|
||||||
|
$private = openssl_get_privatekey($pkeyFile);
|
||||||
|
if ($private !== false) {
|
||||||
|
$pkey = '';
|
||||||
|
openssl_pkey_export($private, $pkey);
|
||||||
|
$phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the corresponding public key to the file
|
||||||
|
*/
|
||||||
|
if (!@is_readable($dist.'/random_compat.phar.pubkey')) {
|
||||||
|
$details = openssl_pkey_get_details($private);
|
||||||
|
file_put_contents(
|
||||||
|
$dist.'/random_compat.phar.pubkey',
|
||||||
|
$details['key']
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
echo 'An error occurred reading the private key from OpenSSL.', "\n";
|
||||||
|
exit(255);
|
||||||
|
}
|
||||||
|
}
|
||||||
9
vendor/paragonie/random_compat/psalm-autoload.php
vendored
Normal file
9
vendor/paragonie/random_compat/psalm-autoload.php
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once 'lib/byte_safe_strings.php';
|
||||||
|
require_once 'lib/cast_to_int.php';
|
||||||
|
require_once 'lib/error_polyfill.php';
|
||||||
|
require_once 'other/ide_stubs/libsodium.php';
|
||||||
|
require_once 'lib/random.php';
|
||||||
|
|
||||||
|
$int = random_int(0, 65536);
|
||||||
19
vendor/paragonie/random_compat/psalm.xml
vendored
Normal file
19
vendor/paragonie/random_compat/psalm.xml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0"?>
|
||||||
|
<psalm
|
||||||
|
autoloader="psalm-autoload.php"
|
||||||
|
stopOnFirstError="false"
|
||||||
|
useDocblockTypes="true"
|
||||||
|
>
|
||||||
|
<projectFiles>
|
||||||
|
<directory name="lib" />
|
||||||
|
</projectFiles>
|
||||||
|
<issueHandlers>
|
||||||
|
<RedundantConditionGivenDocblockType errorLevel="info" />
|
||||||
|
<UnresolvableInclude errorLevel="info" />
|
||||||
|
<DuplicateClass errorLevel="info" />
|
||||||
|
<InvalidOperand errorLevel="info" />
|
||||||
|
<UndefinedConstant errorLevel="info" />
|
||||||
|
<MissingReturnType errorLevel="info" />
|
||||||
|
<InvalidReturnType errorLevel="info" />
|
||||||
|
</issueHandlers>
|
||||||
|
</psalm>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user