Compare commits

...

43 Commits

Author SHA1 Message Date
Clemens Schwaighofer
984dec37e2 Bug fix for Admin\Backend ->action var access 2024-10-16 12:36:38 +09:00
Clemens Schwaighofer
d91fbd5a46 Release: v9.17.1 2024-10-16 12:28:40 +09:00
Clemens Schwaighofer
668954c1c4 Admin\Backend move _POST action read to sub function and trigger not auto loading it 2024-10-16 12:26:33 +09:00
Clemens Schwaighofer
adbae19fca Release: v9.17.0 2024-09-24 15:18:43 +09:00
Clemens Schwaighofer
39de680b66 Extend Error Message collector print warning log 2024-09-24 15:15:23 +09:00
Clemens Schwaighofer
2e81a4da82 Release: v9.16.0 2024-09-20 13:43:20 +09:00
Clemens Schwaighofer
61782be11c Various updates as follows
* commit 5cec54d508fd4a34de509b3ac28d6277b6abc090 (HEAD -> master, all/master, all/development, all/NewFeatures)
| log size 644
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-09-20 13:33:19 +0900
|
|     Add "Success" to message logging levels, fixes for PHP 8.4, other preg_match fixes
|
|     The Logger/MessageLevel gets "success" as level 110 to something a bit
|     heigher than "ok" which is the general "OK" for anything ending without
|     an error. The "success" is currently only used in file uploads with the
|     java script ajax file uploader
|
|     Fix any "type $var = null" with correctly "?type $var = null" for PHP 8.4 (phphan)
|
|     Fix preg match no return catches for DB IO compare version and for language
|     look up.
|
|  4dev/tests/Logging/CoreLibsLoggingErrorMessagesTest.php |  5 +++++
|  www/admin/class_test.html.php                           |  1 +
|  www/admin/class_test.php                                |  2 +-
|  www/admin/layout/javascript/edit.jq.js                  |  2 +-
|  www/lib/CoreLibs/Admin/Backend.php                      |  6 +++---
|  www/lib/CoreLibs/Basic.php                              |  2 +-
|  www/lib/CoreLibs/Convert/Extends/SetVarTypeMain.php     |  6 +++---
|  www/lib/CoreLibs/Convert/SetVarTypeNull.php             |  6 +++---
|  www/lib/CoreLibs/DB/IO.php                              | 24 ++++++++++++++++++------
|  www/lib/CoreLibs/Language/GetLocale.php                 |  4 ++--
|  www/lib/CoreLibs/Logging/Logger/MessageLevel.php        |  2 ++
|  www/lib/CoreLibs/Output/Form/Elements.php               | 12 ++++++------
|  www/lib/CoreLibs/Template/HtmlBuilder/Element.php       |  4 ++--
|  13 files changed, 48 insertions(+), 28 deletions(-)
|
* commit 8e60c992f109993b40d9e5ec9354ffb7d7db9f79
| log size 123
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-09-03 12:06:01 +0900
|
|     Fixes phan/phpstan
|
|  phpstan.neon                                    | 6 +++---
|  www/lib/CoreLibs/Get/System.php                 | 2 +-
|  www/lib/CoreLibs/Template/HtmlBuilder/Block.php | 4 ----
|  3 files changed, 4 insertions(+), 8 deletions(-)
|
* commit 1b5437b675f6ceda4318f19522d47a08f28f95a8
| log size 147
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-09-03 11:58:36 +0900
|
|     Add testing for new added bom utf8 replace
|
|  4dev/tests/Convert/CoreLibsConvertStringsTest.php | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|  4dev/tests/Convert/data/UTF8.csv                  |  1 +
|  4dev/tests/Convert/data/UTF8BOM.csv               |  1 +
|  4dev/tests/Get/CoreLibsGetSystemTest.php          | 23 +++++++++++++++++++++++
|  www/admin/class_test.system.php                   |  4 +++-
|  5 files changed, 76 insertions(+), 1 deletion(-)
|
* commit ef80cba5610b8acae8fc11d3f0a441c1f5a03735
| log size 659
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-09-03 09:49:01 +0900
|
|     Add new functions: get IPs, strip UTF8 BOM from text, text updates
|
|     Add the following new static methods
|
|     Convert\Strings::stripUTF8BomBytes: removes the UTF8 BOM bytes from the beginning of a line
|     Used for CSV files created in Excel for the first header entry (line 0/row 0)
|
|     Get\Systen::getIpAddresses: gets all IP addresses for the the current access user
|     and returns an array
|
|     Moved the frontend folder detection from the first load config to the config.path.php
|
|     Cleaned up the translations JS scripts
|
|  4dev/bin/create_mo.sh                           |  9 +++++----
|  4dev/bin/mo_to_js.sh                            | 63 +++++++++++++++++++++++++++++++++++----------------------------
|  www/configs/config.path.php                     | 16 +++++++++++++++-
|  www/configs/config.php                          | 15 +--------------
|  www/lib/CoreLibs/Convert/Strings.php            | 12 ++++++++++++
|  www/lib/CoreLibs/DB/IO.php                      |  2 +-
|  www/lib/CoreLibs/Get/System.php                 | 23 +++++++++++++++++++++++
|  www/lib/CoreLibs/Template/HtmlBuilder/Block.php | 37 ++++++++++++++++++++++++++-----------
|  8 files changed, 118 insertions(+), 59 deletions(-)
|
* commit 2d71e760e8fb7b4b0a5552a2f62bedffad928f4f
| log size 120
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-08-21 11:45:17 +0900
|
|     Composer update
|
|  www/composer.lock                          | 12 ++++++------
|  www/lib/CoreLibs/Template/SmartyExtend.php |  3 ++-
|  www/vendor/composer/installed.json         | 14 +++++++-------
|  www/vendor/composer/installed.php          |  6 +++---
|  www/vendor/gullevek/dotenv/Readme.md       | 23 +++++++++++++++++++++++
|  www/vendor/gullevek/dotenv/src/DotEnv.php  | 13 ++++++++++---
|  6 files changed, 51 insertions(+), 20 deletions(-)
|
* commit a8d07634ffaf961a37557437aac1f202ae18fa6e
| log size 182
| Author: Clemens Schwaighofer <clemens.schwaighofer@egplusww.com>
| Date:   2024-08-07 13:41:09 +0900
|
|     Add soba.egplusww.jp as local development host, jshint esversion update to 11
|
|  www/admin/layout/javascript/edit.jq.js |  2 +-
|  www/configs/config.host.php            | 28 +++++++++++-----------------
|  2 files changed, 12 insertions(+), 18 deletions(-)
|
2024-09-20 13:40:20 +09:00
Clemens Schwaighofer
e7fe4655d1 Release: v9.15.0 2024-09-03 12:15:49 +09:00
Clemens Schwaighofer
561be4bce6 Update with get address method and utf8 bom replacer 2024-09-03 12:12:11 +09:00
Clemens Schwaighofer
51fef30364 Release: v9.14.0 2024-08-05 13:34:05 +09:00
Clemens Schwaighofer
89a4b4cf3e HTML::htmlent and HTML::checked method updates 2024-08-05 13:28:11 +09:00
Clemens Schwaighofer
3eb1229590 Release: v9.13.2 2024-07-29 16:34:07 +09:00
Clemens Schwaighofer
f174e9ec34 DB-IO fix for JSON/JSONB operators when checking for placeholders 2024-07-29 16:32:45 +09:00
Clemens Schwaighofer
928369cff7 Release: v9.13.1 2024-07-29 16:14:37 +09:00
Clemens Schwaighofer
29f4800e1a DB IO Placeholder regex fix for JSON/JSONB placeholders 2024-07-29 16:13:08 +09:00
Clemens Schwaighofer
e706a67427 Shellcheck updates for publish.sh script 2024-07-19 18:39:30 +09:00
Clemens Schwaighofer
672de694ee Readme file update 2024-06-18 10:00:11 +09:00
Clemens Schwaighofer
c69eac3258 Move temp folder for phpstan to local, update github actions
Note: Github actions are not used right now
2024-05-22 18:53:16 +09:00
Clemens Schwaighofer
eca62e53c9 Disabled workflow
For this to work we have to move the smarty-extended package to an official
composer package
2024-05-22 14:21:00 +09:00
Clemens Schwaighofer
62cd3badfe GitHub action update 2024-05-22 14:18:21 +09:00
Clemens Schwaighofer
4bd2568d94 composer.json file update 2024-05-22 14:15:59 +09:00
Clemens Schwaighofer
b3c7947c67 Github actions wrong folder name 2024-05-22 14:13:46 +09:00
Clemens Schwaighofer
6710f44646 GitHub action for PHPstan CI 2024-05-22 14:11:05 +09:00
Clemens Schwaighofer
f89be6bd19 Update composer publish script
check for GITEA_PUBLISH and GITLAB_PUBLISH to trigger actual publish run
2024-05-22 11:11:18 +09:00
Clemens Schwaighofer
9696336abc Release: v9.13.0 2024-05-22 11:10:30 +09:00
Clemens Schwaighofer
fec1c5ad57 Symmetric Encryption class update to standard class and static call type 2024-05-22 11:03:44 +09:00
Clemens Schwaighofer
a6e5e86c9e Remove tools folder from git 2024-05-22 11:02:42 +09:00
Clemens Schwaighofer
1357b98883 phpcs, phpstan, psalm update 2024-05-15 17:05:52 +09:00
Clemens Schwaighofer
fa18a6f422 Merge branch 'master' into development 2024-04-17 10:22:37 +09:00
Clemens Schwaighofer
ada130329f Publish package script fixes 2024-04-17 10:22:25 +09:00
Clemens Schwaighofer
4c489adf9b Release: v9.12.2 2024-04-17 10:21:56 +09:00
Clemens Schwaighofer
c8a2ad4d48 test scripts update 2024-04-17 10:16:56 +09:00
Clemens Schwaighofer
d54a6cbdf5 Remove mb encode mimeheader special code and replace it with default function call 2024-04-17 10:13:32 +09:00
Clemens Schwaighofer
e8f4c82f59 Publish script update with versio file not existing check 2024-04-16 18:27:43 +09:00
Clemens Schwaighofer
24eb2c2bee Release: v9.12.1 2024-03-21 12:47:14 +09:00
Clemens Schwaighofer
94edb7f556 Add unique page name check for edit pages, bug fixes in Form Template Generate and DB Array IO classes 2024-03-21 12:45:39 +09:00
Clemens Schwaighofer
3f5b3f02ad Update Readme to reflect that current version is v9 2024-03-08 14:41:07 +09:00
Clemens Schwaighofer
a270922b4b Published: v9.12.0 2024-03-07 15:04:18 +09:00
Clemens Schwaighofer
8c607ae610 tools update, bug fix Strings to return path if null, Fix form list loader, fix paths 2024-03-07 15:01:19 +09:00
Clemens Schwaighofer
d3d4cf512f add php code sniffer xml 2023-12-05 17:38:01 +09:00
Clemens Schwaighofer
efae352c35 Published: v9.11.1 2023-11-29 10:51:19 +09:00
Clemens Schwaighofer
a1614bace2 Bug Fix in DB IO with parameter detection with <> 2023-11-29 10:50:25 +09:00
Clemens Schwaighofer
62ce863f2c Release: v9.11.0 2023-11-02 14:08:23 +09:00
54 changed files with 986 additions and 262 deletions

33
.github/workflows-disabled/ci.yml vendored Normal file
View File

@@ -0,0 +1,33 @@
name: CI
run-name: ${{ github.actor}} runs CI
on: [push]
jobs:
phpstan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# - uses: php-actions/composer@v6
# env:
# COMPOSER_ROOT_VERSION: dev-master
- name: "Restore result cache"
uses: actions/cache/restore@v4
with:
path: ./tmp
key: "result-cache-v1-${{ matrix.php-version }}-${{ github.run_id }}"
restore-keys: |
result-cache-v1-${{ matrix.php-version }}-
- name: PHPStan Static Analysis
uses: php-actions/phpstan@v3
with:
path: src/
- name: "Save result cache"
uses: actions/cache/save@v4
if: always()
with:
path: ./tmp
key: "result-cache-v1-${{ matrix.php-version }}-${{ github.run_id }}"
# - name: PHPunit Tests
# run: |
# vendor/bin/phpunit

3
.gitignore vendored
View File

@@ -1,2 +1,3 @@
vendor vendor/
composer.lock composer.lock
tools/

View File

@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phive xmlns="https://phar.io/phive"> <phive xmlns="https://phar.io/phive">
<phar name="phpunit" version="^9.6" installed="9.6.13" location="./tools/phpunit" copy="false"/> <phar name="phpunit" version="^9.6" installed="9.6.19" location="./tools/phpunit" copy="false"/>
<phar name="phpcs" version="^3.7.2" installed="3.7.2" location="./tools/phpcs" copy="false"/> <phar name="phpcs" version="^3.7.2" installed="3.10.0" location="./tools/phpcs" copy="false"/>
<phar name="phpcbf" version="^3.7.2" installed="3.7.2" location="./tools/phpcbf" copy="false"/> <phar name="phpcbf" version="^3.7.2" installed="3.10.0" location="./tools/phpcbf" copy="false"/>
<phar name="psalm" version="^5.15.0" installed="5.15.0" location="./tools/psalm" copy="false"/> <phar name="psalm" version="^5.15.0" installed="5.24.0" location="./tools/psalm" copy="false"/>
<phar name="phpstan" version="^1.10.37" installed="1.10.40" location="./tools/phpstan" copy="false"/> <phar name="phpstan" version="^1.10.37" installed="1.11.1" location="./tools/phpstan" copy="false"/>
<phar name="phan" version="^5.4.2" installed="5.4.2" location="./tools/phan" copy="false"/> <phar name="phan" version="^5.4.2" installed="5.4.3" location="./tools/phan" copy="false"/>
</phive> </phive>

2
.shellcheckrc Normal file
View File

@@ -0,0 +1,2 @@
shell=bash
external-sources=true

View File

@@ -9,20 +9,45 @@ For local install only
- Template\SmartyExtended - Template\SmartyExtended
- Admin\EditBase - Admin\EditBase
## Setup from central composer ## Publish to gitea or gitlab server
Setup from gitea internal servers Currently there are only gitea and gitlab supported, github does not have support for composer packages
```sh `publish\publish.sh go` will run the publish script
composer config repositories.git.egplusww.jp.Composer composer https://git.egplusww.jp/api/packages/Composer/composer
All the configuration is done in the `publish\.env.deploy` file
```ini
# downlaod file name is "Repository name" "-" "version" where
# version is "vN.N.N"
GITEA_PUBLISH=1
GITEA_UPLOAD_FILENAME="Upload-File-Name";
GITEA_USER=gitea-user
GITEA_TOKEN=gitea-tokek
GITEA_URL_DL=https://[gitea.hostname]/[to/package/folder]/archive
GITEA_URL_PUSH=https://[gitea.hostname]/api/packages/[organization]/composer
GITLAB_PUBLISH=1
GITLAB_URL=gitlab URl to repository
GITLAB_DEPLOY_TOKEN=gitlab-token
``` ```
Alternative setup composer local zip file repot: At the moment there is only one gitea or gitlab target setable
`composer config repositories.composer.egplusww.jp composer http://composer.egplusww.jp`
## Setup from central composer
Setup from gitea servers
[hostname] is the hostname for your gitea server (or wherever this is published)
[OrgName] is the organization name where the composer packages are hosted
```sh
composer config repositories.[hostname].Composer composer https://[hostname]/api/packages/[OrgName]/composer
```
## Install package ## Install package
`composer require egrajp/corelibs-composer-all:^8.0` `composer require egrajp/corelibs-composer-all:^9.0`
## Tests ## Tests

View File

@@ -21,7 +21,8 @@
}, },
"require-dev": { "require-dev": {
"egrajp/smarty-extended": "^4.3", "egrajp/smarty-extended": "^4.3",
"gullevek/dotenv": "dev-master" "gullevek/dotenv": "dev-master",
"phpunit/phpunit": "^9"
}, },
"repositories": { "repositories": {
"git.egplusww.jp.Composer": { "git.egplusww.jp.Composer": {

18
phpcs.xml Normal file
View File

@@ -0,0 +1,18 @@
<?xml version="1.0"?>
<ruleset name="MyStandard">
<description>PSR12 override rules (strict, standard). Switch spaces indent to tab.</description>
<arg name="tab-width" value="4"/>
<rule ref="PSR1"/>
<rule ref="PSR12">
<!-- turn off white space check for tab -->
<exclude name="Generic.WhiteSpace.DisallowTabIndent"/>
</rule>
<!-- no space indent, must be tab, 4 is tab iwdth -->
<rule ref="Generic.WhiteSpace.DisallowSpaceIndent"/>
<rule ref="Generic.WhiteSpace.ScopeIndent">
<properties>
<property name="indent" value="4"/>
<property name="tabIndent" value="true"/>
</properties>
</rule>
</ruleset>

View File

@@ -2,7 +2,7 @@
includes: includes:
- phpstan-conditional.php - phpstan-conditional.php
parameters: parameters:
tmpDir: /tmp/phpstan-corelibs-composer tmpDir: %currentWorkingDirectory%/tmp/phpstan-corelibs-composer
level: 8 # max is now 9 level: 8 # max is now 9
checkMissingCallableSignature: true checkMissingCallableSignature: true
treatPhpDocTypesAsCertain: false treatPhpDocTypesAsCertain: false

View File

@@ -1 +1 @@
9.10.1 9.17.1

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
BASE_FOLDER=$(dirname $(readlink -f $0))"/"; BASE_FOLDER=$(dirname "$(readlink -f "$0")")"/";
PACKAGE_DOWNLOAD="${BASE_FOLDER}package-download/"; PACKAGE_DOWNLOAD="${BASE_FOLDER}package-download/";
if [ ! -d "${PACKAGE_DOWNLOAD}" ]; then if [ ! -d "${PACKAGE_DOWNLOAD}" ]; then
mkdir "${PACKAGE_DOWNLOAD}"; mkdir "${PACKAGE_DOWNLOAD}";
@@ -15,30 +15,35 @@ if [ -z "${VERSION}" ]; then
fi; fi;
# compare version, if different or newer, deploy # compare version, if different or newer, deploy
if [ -f "${file_last_published}" ]; then if [ -f "${file_last_published}" ]; then
LAST_PUBLISHED_VERSION=$(cat ${file_last_published}); LAST_PUBLISHED_VERSION=$(cat "${file_last_published}");
if $(dpkg --compare-versions "${VERSION}" le "${LAST_PUBLISHED_VERSION}"); then if dpkg --compare-versions "${VERSION}" le "${LAST_PUBLISHED_VERSION}"; then
echo "git tag version ${VERSION} is not newer than previous published version ${LAST_PUBLISHED_VERSION}"; echo "git tag version ${VERSION} is not newer than previous published version ${LAST_PUBLISHED_VERSION}";
exit; exit;
fi; fi;
fi; fi;
# read in the .env.deploy file and we must have # read in the .env.deploy file and we must have
# for gitea
# GITEA_PUBLISH: must be set with a value to trigger publish run
# GITEA_UPLOAD_FILENAME # GITEA_UPLOAD_FILENAME
# GITLAB_USER
# GITLAB_TOKEN
# GITLAB_URL
# GITEA_USER # GITEA_USER
# GITEA_DEPLOY_TOKEN # GITEA_DEPLOY_TOKEN
# GITEA_URL_DL # GITEA_URL_DL
# GITEA_URL_PUSH # GITEA_URL_PUSH
# for gitlab
# GITLAB_PUBLISH: must be set with a value to trigger publish run
# GITLAB_USER
# GITLAB_TOKEN
# GITLAB_URL
if [ ! -f "${BASE_FOLDER}.env.deploy" ]; then if [ ! -f "${BASE_FOLDER}.env.deploy" ]; then
echo "Deploy enviroment file .env.deploy is missing"; echo "Deploy enviroment file .env.deploy is missing";
exit; exit;
fi; fi;
set -o allexport; set -o allexport;
cd ${BASE_FOLDER}; cd "${BASE_FOLDER}" || exit;
# shellcheck source=.env.deploy
source .env.deploy; source .env.deploy;
cd -; cd - || exit;
set +o allexport; set +o allexport;
if [ "${go_flag}" != "go" ]; then if [ "${go_flag}" != "go" ]; then
@@ -50,31 +55,42 @@ fi;
echo "[START]"; echo "[START]";
# gitea # gitea
if [ ! -z "${GITEA_UPLOAD_FILENAME}" ] && # skip iof
[ ! -z "${GITEA_URL_DL}" ] && [ ! -z "${GITEA_URL_PUSH}" ] && if [ -n "${GITEA_PUBLISH}" ]; then
[ ! -z "${GITEA_USER}" ] && [ ! -z "${GITEA_TOKEN}" ]; then if [ -n "${GITEA_UPLOAD_FILENAME}" ] &&
curl -LJO \ [ -n "${GITEA_URL_DL}" ] && [ -n "${GITEA_URL_PUSH}" ] &&
--output-dir "${PACKAGE_DOWNLOAD}" \ [ -n "${GITEA_USER}" ] && [ -n "${GITEA_TOKEN}" ]; then
${GITEA_URL_DL}/v${VERSION}.zip; if [ ! -f "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" ]; then
curl --user ${GITEA_USER}:${GITEA_TOKEN} \ curl -LJO \
--upload-file "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" \ --output-dir "${PACKAGE_DOWNLOAD}" \
${GITEA_URL_PUSH}?version=${VERSION}; "${GITEA_URL_DL}"/v"${VERSION}".zip;
echo "${VERSION}" > "${file_last_published}"; fi;
else if [ ! -f "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" ]; then
echo "Missing either GITEA_UPLOAD_FILENAME, GITEA_URL_DL, GITEA_URL_PUSH, GITEA_USER or GITEA_TOKEN environment variable"; echo "Version file does not exist for ${VERSION}";
else
curl --user "${GITEA_USER}":"${GITEA_TOKEN}" \
--upload-file "${PACKAGE_DOWNLOAD}${GITEA_UPLOAD_FILENAME}-v${VERSION}.zip" \
"${GITEA_URL_PUSH}"?version="${VERSION}";
echo "${VERSION}" > "${file_last_published}";
fi;
else
echo "Missing either GITEA_UPLOAD_FILENAME, GITEA_URL_DL, GITEA_URL_PUSH, GITEA_USER or GITEA_TOKEN environment variable";
fi;
fi; fi;
# gitlab # gitlab
if [ ! -z "${GITLAB_URL}" ] && [ ! -z "${GITLAB_DEPLOY_TOKEN}" ]; then if [ -n "${GITLAB_PUBLISH}" ]; then
curl --data tag=v${VERSION} \ if [ -n "${GITLAB_URL}" ] && [ -n "${GITLAB_DEPLOY_TOKEN}" ]; then
--header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \ curl --data tag=v"${VERSION}" \
"${GITLAB_URL}"; --header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \
curl --data branch=master \ "${GITLAB_URL}";
--header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \ curl --data branch=master \
"${GITLAB_URL}"; --header "Deploy-Token: ${GITLAB_DEPLOY_TOKEN}" \
echo "${VERSION}" > "${file_last_published}"; "${GITLAB_URL}";
else echo "${VERSION}" > "${file_last_published}";
echo "Missing GITLAB_DEPLOY_TOKEN environment variable"; else
echo "Missing GITLAB_URL or GITLAB_DEPLOY_TOKEN environment variable";
fi;
fi; fi;
echo ""; echo "";
echo "[DONE]"; echo "[DONE]";

View File

@@ -117,18 +117,20 @@ class Backend
/** /**
* main class constructor * main class constructor
* *
* @param \CoreLibs\DB\IO $db Database connection class * @param \CoreLibs\DB\IO $db Database connection class
* @param \CoreLibs\Logging\Logging $log Logging class * @param \CoreLibs\Logging\Logging $log Logging class
* @param \CoreLibs\Create\Session $session Session interface class * @param \CoreLibs\Create\Session $session Session interface class
* @param \CoreLibs\Language\L10n $l10n l10n language class * @param \CoreLibs\Language\L10n $l10n l10n language class
* @param int|null $set_default_acl_level Default ACL level * @param int|null $set_default_acl_level [default=null] Default ACL level
* @param bool $init_action_vars [default=true] If the action vars should be set
*/ */
public function __construct( public function __construct(
\CoreLibs\DB\IO $db, \CoreLibs\DB\IO $db,
\CoreLibs\Logging\Logging $log, \CoreLibs\Logging\Logging $log,
\CoreLibs\Create\Session $session, \CoreLibs\Create\Session $session,
\CoreLibs\Language\L10n $l10n, \CoreLibs\Language\L10n $l10n,
?int $set_default_acl_level = null ?int $set_default_acl_level = null,
bool $init_action_vars = true
) { ) {
// attach db class // attach db class
$this->db = $db; $this->db = $db;
@@ -151,9 +153,9 @@ class Backend
// set the page name // set the page name
$this->page_name = \CoreLibs\Get\System::getPageName(); $this->page_name = \CoreLibs\Get\System::getPageName();
// set the action ids // NOTE: if any of the "action" vars are used somewhere, it is recommended to NOT set them here
foreach ($this->action_list as $_action) { if ($init_action_vars) {
$this->$_action = $_POST[$_action] ?? ''; $this->adbSetActionVars();
} }
if ($set_default_acl_level === null) { if ($set_default_acl_level === null) {
@@ -170,7 +172,7 @@ class Backend
} }
// queue key // queue key
if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action)) { if (preg_match("/^(add|save|delete|remove|move|up|down|push_live)$/", $this->action ?? '')) {
$this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3); $this->queue_key = \CoreLibs\Create\RandomKey::randomKeyGen(3);
} }
} }
@@ -195,6 +197,29 @@ class Backend
$this->acl = $acl; $this->acl = $acl;
} }
/**
* Return current set ACL
*
* @return array<mixed>
*/
public function adbGetAcl(): array
{
return $this->acl;
}
/**
* Set _POST action vars if needed
*
* @return void
*/
public function adbSetActionVars()
{
// set the action ids
foreach ($this->action_list as $_action) {
$this->$_action = $_POST[$_action] ?? '';
}
}
/** /**
* writes all action vars plus other info into edit_log table * writes all action vars plus other info into edit_log table
* *
@@ -257,14 +282,14 @@ class Backend
"NULL" : "NULL" :
"'" . $this->session->getSessionId() . "'") "'" . $this->session->getSessionId() . "'")
. ", " . ", "
. "'" . $this->db->dbEscapeString($this->action) . "', " . "'" . $this->db->dbEscapeString($this->action ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_id) . "', " . "'" . $this->db->dbEscapeString($this->action_id ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_yes) . "', " . "'" . $this->db->dbEscapeString($this->action_yes ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_flag) . "', " . "'" . $this->db->dbEscapeString($this->action_flag ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_menu) . "', " . "'" . $this->db->dbEscapeString($this->action_menu ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_loaded) . "', " . "'" . $this->db->dbEscapeString($this->action_loaded ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_value) . "', " . "'" . $this->db->dbEscapeString($this->action_value ?? '') . "', "
. "'" . $this->db->dbEscapeString($this->action_error) . "')"; . "'" . $this->db->dbEscapeString($this->action_error ?? '') . "')";
$this->db->dbExec($q, 'NULL'); $this->db->dbExec($q, 'NULL');
} }
@@ -504,9 +529,9 @@ class Backend
string $data, string $data,
string $key_name, string $key_name,
string $key_value, string $key_value,
string $associate = null, ?string $associate = null,
string $file = null, ?string $file = null,
string $db_schema = null, ?string $db_schema = null,
): void { ): void {
/** @var string $DB_SCHEMA check schema */ /** @var string $DB_SCHEMA check schema */
$DB_SCHEMA = 'public'; $DB_SCHEMA = 'public';

View File

@@ -90,7 +90,7 @@ class Basic
* @deprecated DO NOT USE Class\Basic anymore. Use dedicated logger and sub classes * @deprecated DO NOT USE Class\Basic anymore. Use dedicated logger and sub classes
*/ */
public function __construct( public function __construct(
\CoreLibs\Logging\Logging $log = null, ?\CoreLibs\Logging\Logging $log = null,
?string $session_name = null ?string $session_name = null
) { ) {
trigger_error('Class \CoreLibs\Basic is deprected', E_USER_DEPRECATED); trigger_error('Class \CoreLibs\Basic is deprected', E_USER_DEPRECATED);

View File

@@ -51,6 +51,23 @@ class File
// return lines in file // return lines in file
return $lines; return $lines;
} }
/**
* get the mime type of a file via finfo
* if file not found, throws exception
* else returns '' for any other finfo read problem
*
* @param string $read_file File to read, relative or absolute path
* @return string
*/
public static function getMimeType(string $read_file): string
{
$finfo = new \finfo(FILEINFO_MIME_TYPE);
if (!is_file($read_file)) {
throw new \UnexpectedValueException('[getMimeType] File not found: ' . $read_file);
}
return $finfo->file($read_file) ?: '';
}
} }
// __END__ // __END__

View File

@@ -385,7 +385,7 @@ class DateTime
} else { } else {
$str = implode(', ', array_slice($formatted, 0, -1)); $str = implode(', ', array_slice($formatted, 0, -1));
if (!empty($formatted[count($formatted) - 1])) { if (!empty($formatted[count($formatted) - 1])) {
$str .= ' and ' . $formatted[count($formatted) - 1]; $str .= ' and ' . (string)array_pop($formatted);
} }
return $negative . $str; return $negative . $str;
} }
@@ -675,9 +675,9 @@ class DateTime
foreach ($period as $dt) { foreach ($period as $dt) {
$curr = $dt->format('D'); $curr = $dt->format('D');
if ($curr == 'Sat' || $curr == 'Sun') { if ($curr == 'Sat' || $curr == 'Sun') {
$days[2] ++; $days[2]++;
} else { } else {
$days[1] ++; $days[1]++;
} }
} }
if ($return_named === true) { if ($return_named === true) {

View File

@@ -52,7 +52,7 @@ class SetVarTypeMain
*/ */
protected static function makeStrMain( protected static function makeStrMain(
mixed $val, mixed $val,
string $default = null, ?string $default = null,
bool $to_null = false bool $to_null = false
): ?string { ): ?string {
// int/float/string/bool/null, everything else is ignored // int/float/string/bool/null, everything else is ignored
@@ -113,7 +113,7 @@ class SetVarTypeMain
*/ */
protected static function makeIntMain( protected static function makeIntMain(
mixed $val, mixed $val,
int $default = null, ?int $default = null,
bool $to_null = false bool $to_null = false
): ?int { ): ?int {
// if we can filter it to a valid int, we can convert it // if we can filter it to a valid int, we can convert it
@@ -167,7 +167,7 @@ class SetVarTypeMain
*/ */
protected static function makeFloatMain( protected static function makeFloatMain(
mixed $val, mixed $val,
float $default = null, ?float $default = null,
bool $to_null = false bool $to_null = false
): ?float { ): ?float {
if ( if (

View File

@@ -16,16 +16,22 @@ class Html
/** /**
* full wrapper for html entities * full wrapper for html entities
* *
* uses default params as: ENT_QUOTES | ENT_HTML5
* switches from ENT_HTML401 to ENT_HTML5 as we assume all our pages have <!DOCTYPE html>
* removed: ENT_SUBSTITUTE -> wrong characters will be replaced with space
* encodes in UTF-8
* does not double encode
*
* @param mixed $string string to html encode * @param mixed $string string to html encode
* @param int $flags [default: ENT_QUOTES | ENT_HTML5]
* @return mixed if string, encoded, else as is (eg null) * @return mixed if string, encoded, else as is (eg null)
*/ */
public static function htmlent(mixed $string): mixed public static function htmlent(mixed $string, int $flags = ENT_QUOTES | ENT_HTML5): mixed
{ {
if (is_string($string)) { if (is_string($string)) {
return htmlentities($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); return htmlentities($string, $flags, 'UTF-8', false);
} else {
return $string;
} }
return $string;
} }
/** /**
@@ -54,14 +60,10 @@ class Html
*/ */
public static function checked(array|string $haystack, string $needle, int $type = 0): ?string public static function checked(array|string $haystack, string $needle, int $type = 0): ?string
{ {
if (is_array($haystack)) { if (is_array($haystack) && in_array($needle, $haystack)) {
if (in_array($needle, $haystack)) { return $type ? 'checked' : 'selected';
return $type ? 'checked' : 'selected'; } elseif (!is_array($haystack) && $haystack == $needle) {
} return $type ? 'checked' : 'selected';
} else {
if ($haystack == $needle) {
return $type ? 'checked' : 'selected';
}
} }
return null; return null;
} }

View File

@@ -15,6 +15,7 @@ class MimeEncode
/** /**
* wrapper function for mb mime convert * wrapper function for mb mime convert
* for correct conversion with long strings * for correct conversion with long strings
* NOTE: This is only a wrapper for mb_encode_mimeheader to stay compatible
* *
* @param string $string string to encode * @param string $string string to encode
* @param string $encoding target encoding * @param string $encoding target encoding
@@ -29,38 +30,9 @@ class MimeEncode
$current_internal_encoding = mb_internal_encoding(); $current_internal_encoding = mb_internal_encoding();
// set internal encoding, so the mimeheader encode works correctly // set internal encoding, so the mimeheader encode works correctly
mb_internal_encoding($encoding); mb_internal_encoding($encoding);
// if a subject, make a work around for the broken mb_mimencode // use the internal convert to mime header
$pos = 0; // it works from PHP 8.2 on
// after 36 single bytes characters, $string = mb_encode_mimeheader($string, $encoding, 'B', $line_break);
// if then comes MB, it is broken
// has to 2 x 36 < 74 so the mb_encode_mimeheader
// 74 hardcoded split does not get triggered
$split = 36;
$_string = '';
while ($pos < mb_strlen($string, $encoding)) {
$output = mb_strimwidth($string, $pos, $split, "", $encoding);
$pos += mb_strlen($output, $encoding);
// if the strinlen is 0 here, get out of the loop
if (!mb_strlen($output, $encoding)) {
$pos += mb_strlen($string, $encoding);
}
$_string_encoded = mb_encode_mimeheader($output, $encoding);
// only make linebreaks if we have mime encoded code inside
// the space only belongs in the second line
if ($_string && preg_match("/^=\?/", $_string_encoded)) {
$_string .= $line_break . " ";
} elseif (
// hack for plain text with space at the end
mb_strlen($output, $encoding) == $split &&
mb_substr($output, -1, 1, $encoding) == " "
) {
// if output ends with space, add one more
$_string_encoded .= " ";
}
$_string .= $_string_encoded;
}
// strip out any spaces BEFORE a line break
$string = str_replace(" " . $line_break, $line_break, $_string);
// before we end, reset internal encoding // before we end, reset internal encoding
mb_internal_encoding($current_internal_encoding); mb_internal_encoding($current_internal_encoding);
// return mime encoded string // return mime encoded string

View File

@@ -35,7 +35,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param string|null $default Default override value * @param string|null $default Default override value
* @return string|null Input value as string or default as string/null * @return string|null Input value as string or default as string/null
*/ */
public static function makeStr(mixed $val, string $default = null): ?string public static function makeStr(mixed $val, ?string $default = null): ?string
{ {
return SetVarTypeMain::makeStrMain($val, $default, true); return SetVarTypeMain::makeStrMain($val, $default, true);
} }
@@ -60,7 +60,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param int|null $default Default override value * @param int|null $default Default override value
* @return int|null Input value as int or default as int/null * @return int|null Input value as int or default as int/null
*/ */
public static function makeInt(mixed $val, int $default = null): ?int public static function makeInt(mixed $val, ?int $default = null): ?int
{ {
return SetVarTypeMain::makeIntMain($val, $default, true); return SetVarTypeMain::makeIntMain($val, $default, true);
} }
@@ -84,7 +84,7 @@ class SetVarTypeNull extends Extends\SetVarTypeMain
* @param float|null $default Default override value * @param float|null $default Default override value
* @return float|null Input value as float or default as float/null * @return float|null Input value as float or default as float/null
*/ */
public static function makeFloat(mixed $val, float $default = null): ?float public static function makeFloat(mixed $val, ?float $default = null): ?float
{ {
return SetVarTypeMain::makeFloatMain($val, $default, true); return SetVarTypeMain::makeFloatMain($val, $default, true);
} }

View File

@@ -118,6 +118,34 @@ class Strings
return $value; return $value;
} }
} }
/**
* Strip any duplicated slahes from a path
* eg: //foo///bar/foo.inc -> /foo/bar/foo.inc
*
* @param string $path Path to strip slashes from
* @return string Clean path, on error returns original path
*/
public static function stripMultiplePathSlashes(string $path): string
{
return preg_replace(
'#/+#',
'/',
$path
) ?? $path;
}
/**
* Remove UTF8 BOM Byte string from line
* Note: this is often found in CSV files exported from Excel at the first row, first element
*
* @param string $text
* @return string
*/
public static function stripUTF8BomBytes(string $text): string
{
return trim($text, pack('H*', 'EFBBBF'));
}
} }
// __END__ // __END__

View File

@@ -236,7 +236,7 @@ class ArrayIO extends \CoreLibs\DB\IO
*/ */
public function getPkId(): int|string|null public function getPkId(): int|string|null
{ {
return $this->pk_id; return $this->pk_id ?? null;
} }
/** /**

View File

@@ -1302,7 +1302,7 @@ class IO
} }
} }
} }
$this->cursor_ext[$query_hash]['pos'] ++; $this->cursor_ext[$query_hash]['pos']++;
return $return; return $return;
} }
@@ -1318,14 +1318,18 @@ class IO
// regex for params: only stand alone $number allowed // regex for params: only stand alone $number allowed
// exclude all '' enclosed strings, ignore all numbers [note must start with digit] // exclude all '' enclosed strings, ignore all numbers [note must start with digit]
// can have space/tab/new line // can have space/tab/new line
// must have = , ( [equal, comma, opening round bracket] // must have <> = , ( [not equal, equal, comma, opening round bracket]
// can have space/tab/new line // can have space/tab/new line
// $ number with 1-9 for first and 0-9 for further digits // $ number with 1-9 for first and 0-9 for further digits
// /s for matching new line in . list // /s for matching new line in . list
// [disabled, we don't used ^ or $] /m for multi line match // [disabled, we don't used ^ or $] /m for multi line match
// Matches in 1:, must be array_filtered to remove empty, count with array_unique // Matches in 1:, must be array_filtered to remove empty, count with array_unique
$query_split = '[(=,?-]|->|->>|#>|#>>|@>|<@|\?\|\?\&|\|\||#-';
preg_match_all( preg_match_all(
'/(?:\'.*?\')?\s*(?:\?\?|[(=,])\s*(?:\d+|(?:\'.*?\')|(\$[1-9]{1}(?:[0-9]{1,})?))/s', '/'
. '(?:\'.*?\')?\s*(?:\?\?|<>|' . $query_split . ')\s*'
. '(?:\d+|(?:\'.*?\')|(\$[1-9]{1}(?:[0-9]{1,})?))'
. '/s',
$query, $query,
$match $match
); );
@@ -1519,7 +1523,7 @@ class IO
]); ]);
return false; return false;
} }
$this->query_called[$query_hash] ++; $this->query_called[$query_hash]++;
// return hash // return hash
return $query_hash; return $query_hash;
} }
@@ -1892,7 +1896,12 @@ class IO
$matches = []; $matches = [];
// compare has =, >, < prefix, and gets stripped // compare has =, >, < prefix, and gets stripped
// if the rest is not X.Y format then error // if the rest is not X.Y format then error
preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches); if (!preg_match("/^([<>=]{1,})(\d{1,})\.(\d{1,})/", $compare, $matches)) {
$this->log->error('Could not regex match compare version string', [
"compare" => $compare
]);
return false;
}
$compare = $matches[1]; $compare = $matches[1];
$to_master = $matches[2]; $to_master = $matches[2];
$to_minor = $matches[3]; $to_minor = $matches[3];
@@ -1904,11 +1913,18 @@ class IO
} }
// db_version can return X.Y.Z // db_version can return X.Y.Z
// we only compare the first two // we only compare the first two
preg_match( if (
"/^(\d{1,})\.(\d{1,})\.?(\d{1,})?/", !preg_match(
$this->dbVersion(), "/^(\d{1,})\.(\d{1,})\.?(\d{1,})?/",
$matches $this->dbVersion(),
); $matches
)
) {
$this->log->error('Could not regex match dbVersion string', [
"dbVersion" => $this->dbVersion()
]);
return false;
}
$master = $matches[1]; $master = $matches[1];
$minor = $matches[2]; $minor = $matches[2];
$version = $master . ($minor < 10 ? '0' : '') . $minor; $version = $master . ($minor < 10 ? '0' : '') . $minor;
@@ -2398,7 +2414,7 @@ class IO
// flag if we have cache data stored at the moment // flag if we have cache data stored at the moment
'cached' => false, 'cached' => false,
// when fetch array or cache read returns false // when fetch array or cache read returns false
// in loop read that means dbReturn retuns false without erro // in loop read that means dbReturn retuns false without error
'finished' => false, 'finished' => false,
// read from cache/db (pos == rows) // read from cache/db (pos == rows)
'read_finished' => false, 'read_finished' => false,
@@ -2469,7 +2485,7 @@ class IO
return false; return false;
} }
} else { } else {
$this->cursor_ext[$query_hash]['log_pos'] ++; $this->cursor_ext[$query_hash]['log_pos']++;
} }
// reset log for each read // reset log for each read
$this->cursor_ext[$query_hash]['log'] = []; $this->cursor_ext[$query_hash]['log'] = [];
@@ -2668,8 +2684,8 @@ class IO
if ($return) { if ($return) {
$this->cursor_ext[$query_hash]['log'][] = 'Return Data'; $this->cursor_ext[$query_hash]['log'][] = 'Return Data';
// internal position counter // internal position counter
$this->cursor_ext[$query_hash]['pos'] ++; $this->cursor_ext[$query_hash]['pos']++;
$this->cursor_ext[$query_hash]['read_rows'] ++; $this->cursor_ext[$query_hash]['read_rows']++;
// read is finished // read is finished
if ( if (
$this->cursor_ext[$query_hash]['read_rows'] == $this->cursor_ext[$query_hash]['read_rows'] ==

View File

@@ -39,9 +39,11 @@ class ConvertPlaceholder
): array { ): array {
$convert_to = strtolower($convert_to); $convert_to = strtolower($convert_to);
$matches = []; $matches = [];
$query_split = '[(=,?-]|->|->>|#>|#>>|@>|<@|\?\|\?\&|\|\||#-';
$pattern = '/' $pattern = '/'
// prefix string part, must match towards // prefix string part, must match towards
. '(?:\'.*?\')?\s*(?:\?\?|[(=,])\s*' // seperator for ( = , ? - [and json/jsonb in pg doc section 9.15]
. '(?:\'.*?\')?\s*(?:\?\?|' . $query_split . ')\s*'
// match for replace part // match for replace part
. '(?:' . '(?:'
// digit -> ignore // digit -> ignore
@@ -96,7 +98,10 @@ class ConvertPlaceholder
$type = 'named'; $type = 'named';
$matches_return = $named_matches; $matches_return = $named_matches;
// only check for :named // only check for :named
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(:\w+))/s'; $pattern_replace = '/'
. '((?:\'.*?\')?\s*(?:\?\?|' . $query_split . ')\s*)'
. '(\d+|(?:\'.*?\')|(:\w+))'
. '/s';
// 0: full // 0: full
// 1: pre part // 1: pre part
// 2: keep part UNLESS '3' is set // 2: keep part UNLESS '3' is set
@@ -134,7 +139,10 @@ class ConvertPlaceholder
// order and data stays the same // order and data stays the same
$params_new = $params; $params_new = $params;
// only check for ? // only check for ?
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(?:(?:\?\?)?\s*(\?{1})))/s'; $pattern_replace = '/'
. '((?:\'.*?\')?\s*(?:\?\?|' . $query_split . ')\s*)'
. '(\d+|(?:\'.*?\')|(?:(?:\?\?)?\s*(\?{1})))'
. '/s';
// 0: full // 0: full
// 1: pre part // 1: pre part
// 2: keep part UNLESS '3' is set // 2: keep part UNLESS '3' is set
@@ -163,7 +171,10 @@ class ConvertPlaceholder
$type = 'numbered'; $type = 'numbered';
$matches_return = $numbered_matches; $matches_return = $numbered_matches;
// only check for $n // only check for $n
$pattern_replace = '/((?:\'.*?\')?\s*(?:\?\?|[(=,])\s*)(\d+|(?:\'.*?\')|(\$[1-9]{1}(?:[0-9]{1,})?))/s'; $pattern_replace = '/'
. '((?:\'.*?\')?\s*(?:\?\?|' . $query_split . ')\s*)'
. '(\d+|(?:\'.*?\')|(\$[1-9]{1}(?:[0-9]{1,})?))'
. '/s';
// 0: full // 0: full
// 1: pre part // 1: pre part
// 2: keep part UNLESS '3' is set // 2: keep part UNLESS '3' is set

View File

@@ -116,6 +116,29 @@ class System
3 3
) === 'cli' ? true : false; ) === 'cli' ? true : false;
} }
/**
* Collect all IP addresses
* REMOTE_ADDR, HTTP_X_FORWARD_FOR, CLIENT_IP
* and retuns them in an array with index of io source
* if address source has addresses with "," will add "-array" with these as array block
*
* @return array<string,string|array<string>>
*/
public static function getIpAddresses(): array
{
$ip_addr = [];
foreach (['REMOTE_ADDR', 'HTTP_X_FORWARDED_FOR', 'CLIENT_IP'] as $_ip_source) {
if (!empty($_SERVER[$_ip_source])) {
$ip_addr[$_ip_source] = $_SERVER[$_ip_source];
// same level as ARRAY IF there is a , inside
if (strstr($_SERVER[$_ip_source], ',') !== false) {
$ip_addr[$_ip_source . '-array'] = explode(',', $_SERVER[$_ip_source]);
}
}
}
return $ip_addr;
}
} }
// __END__ // __END__

View File

@@ -46,7 +46,7 @@ class CachedFileReader extends \CoreLibs\Language\Core\StringReader
if (!is_resource($fd)) { if (!is_resource($fd)) {
$this->error = 3; // Cannot read file, probably permissions $this->error = 3; // Cannot read file, probably permissions
} else { } else {
$this->fd_str = fread($fd, filesize($filename) ?: 0) ?: ''; $this->fd_str = fread($fd, filesize($filename) ?: 1) ?: '';
fclose($fd); fclose($fd);
} }
} else { } else {

View File

@@ -128,7 +128,7 @@ class GetLocale
$matches $matches
) )
) { ) {
$lang = ($matches['lang'] ?? 'en') $lang = $matches['lang']
// add country only if set // add country only if set
. (!empty($matches['country']) ? '_' . $matches['country'] : ''); . (!empty($matches['country']) ? '_' . $matches['country'] : '');
} else { } else {
@@ -235,7 +235,7 @@ class GetLocale
$matches $matches
) )
) { ) {
$lang = ($matches['lang'] ?? 'en') $lang = $matches['lang']
// add country only if set // add country only if set
. (!empty($matches['country']) ? '_' . $matches['country'] : ''); . (!empty($matches['country']) ? '_' . $matches['country'] : '');
} else { } else {

View File

@@ -24,16 +24,20 @@ class ErrorMessage
/** @var bool $log_error global flag to log error level message */ /** @var bool $log_error global flag to log error level message */
private bool $log_error = false; private bool $log_error = false;
/** @var bool $log_warning global flat to log warning level messages */
private bool $log_warning = false;
/** /**
* init ErrorMessage * init ErrorMessage
* *
* @param \CoreLibs\Logging\Logging $log * @param \CoreLibs\Logging\Logging $log
* @param null|bool $log_error [=null], defaults to false if log is not level debug * @param null|bool $log_error [=null], defaults to false if log is not level debug
* @param null|bool $log_warning [=null], defaults to false if log is not level debug
*/ */
public function __construct( public function __construct(
\CoreLibs\Logging\Logging $log, \CoreLibs\Logging\Logging $log,
?bool $log_error = null ?bool $log_error = null,
?bool $log_warning = null
) { ) {
$this->log = $log; $this->log = $log;
// if log default logging is debug then log_error is default set to true // if log default logging is debug then log_error is default set to true
@@ -43,6 +47,13 @@ class ErrorMessage
$log_error = $log_error ?? false; $log_error = $log_error ?? false;
} }
$this->log_error = $log_error; $this->log_error = $log_error;
// if log default logging is debug then log_warning is default set to true
if ($this->log->loggingLevelIsDebug() && $log_warning === null) {
$log_warning = true;
} else {
$log_warning = $log_warning ?? false;
}
$this->log_warning = $log_warning;
} }
/** /**
@@ -81,6 +92,8 @@ class ErrorMessage
* @param array<mixed> $context Additionl info for abort/crash messages * @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global, * @param bool|null $log_error [=null] log level 'error' to error, if null use global,
* else set for this call only * else set for this call only
* @param bool|null $log_warning [=null] log level 'warning' to warning, if null use global,
* else set for this call only
*/ */
public function setErrorMsg( public function setErrorMsg(
string $error_id, string $error_id,
@@ -93,10 +106,14 @@ class ErrorMessage
?string $message = null, ?string $message = null,
array $context = [], array $context = [],
?bool $log_error = null, ?bool $log_error = null,
?bool $log_warning = null,
): void { ): void {
if ($log_error === null) { if ($log_error === null) {
$log_error = $this->log_error; $log_error = $this->log_error;
} }
if ($log_warning === null) {
$log_warning = $this->log_warning;
}
$original_level = $level; $original_level = $level;
$level = MessageLevel::fromName($level)->name; $level = MessageLevel::fromName($level)->name;
// if not string set, write message string if set, else level/error id // if not string set, write message string if set, else level/error id
@@ -121,6 +138,14 @@ class ErrorMessage
'level' => $original_level, 'level' => $original_level,
], $context)); ], $context));
break; break;
case 'warn':
if ($log_warning) {
$this->log->warning($message ?? $str, array_merge([
'id' => $error_id,
'level' => $original_level,
], $context));
}
break;
case 'error': case 'error':
if ($log_error) { if ($log_error) {
$this->log->error($message ?? $str, array_merge([ $this->log->error($message ?? $str, array_merge([
@@ -169,6 +194,8 @@ class ErrorMessage
* @param array<mixed> $context Additionl info for abort/crash messages * @param array<mixed> $context Additionl info for abort/crash messages
* @param bool|null $log_error [=null] log level 'error' to error, if null use global, * @param bool|null $log_error [=null] log level 'error' to error, if null use global,
* else set for this call only * else set for this call only
* @param bool|null $log_warning [=null] log level 'warning' to warning, if null use global,
* else set for this call only
*/ */
public function setMessage( public function setMessage(
string $level, string $level,
@@ -181,6 +208,7 @@ class ErrorMessage
?string $message = null, ?string $message = null,
array $context = [], array $context = [],
?bool $log_error = null, ?bool $log_error = null,
?bool $log_warning = null,
): void { ): void {
$this->setErrorMsg( $this->setErrorMsg(
$error_id ?? '', $error_id ?? '',
@@ -192,7 +220,8 @@ class ErrorMessage
$jump_target, $jump_target,
$message, $message,
$context, $context,
$log_error $log_error,
$log_warning
); );
} }
@@ -314,6 +343,27 @@ class ErrorMessage
{ {
return $this->log_error; return $this->log_error;
} }
/**
* Set the log warning flag
*
* @param bool $flag True to log level warning too, False for do not (Default)
* @return void
*/
public function setFlagLogWarning(bool $flag): void
{
$this->log_warning = $flag;
}
/**
* Get the current log error flag
*
* @return bool
*/
public function getFlagLogWarning(): bool
{
return $this->log_warning;
}
} }
// __END__ // __END__

View File

@@ -14,6 +14,7 @@ namespace CoreLibs\Logging\Logger;
enum MessageLevel: int enum MessageLevel: int
{ {
case ok = 100; case ok = 100;
case success = 150; // special for file uploads
case info = 200; case info = 200;
case notice = 250; case notice = 250;
case warn = 300; case warn = 300;
@@ -30,6 +31,7 @@ enum MessageLevel: int
{ {
return match (strtolower($name)) { return match (strtolower($name)) {
'ok' => self::ok, 'ok' => self::ok,
'success' => self::success,
'info' => self::info, 'info' => self::info,
'notice' => self::notice, 'notice' => self::notice,
'warn', 'warning' => self::warn, 'warn', 'warning' => self::warn,

View File

@@ -194,13 +194,13 @@ class Elements
"/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/", "/(mailto:)?(\>)?\b([\w\.-]+)@([\w\.\-]+)\.([a-zA-Z]{2,4})\b(\|([^\||^#]+)(#([^\|]+))?\|)?/",
function ($matches) { function ($matches) {
return self::createEmail( return self::createEmail(
$matches[1] ?? '', $matches[1],
$matches[2] ?? '', $matches[2],
$matches[3] ?? '', $matches[3],
$matches[4] ?? '', $matches[4],
$matches[5] ?? '', $matches[5],
$matches[7] ?? '', $matches[7] ?? '',
$matches[9] ?? '' $matches[9] ?? '',
); );
}, },
$output $output

View File

@@ -826,27 +826,28 @@ class Generate
$pk_selected = $res[$this->int_pk_name]; $pk_selected = $res[$this->int_pk_name];
} }
$t_string = ''; $t_string = '';
foreach ($this->field_array as $i => $field_array) { foreach ($this->field_array as $field_array) {
if ($t_string) { if ($t_string) {
$t_string .= ', '; $t_string .= ', ';
} }
if (isset($field_array['before_value'])) { if (!empty($field_array['before_value'])) {
$t_string .= $field_array['before_value']; $t_string .= $this->l->__($field_array['before_value']);
} }
// must have res element set // must have res element set
if ( if (
isset($field_array['name']) && !empty($field_array['name']) &&
isset($res[$field_array['name']]) isset($res[$field_array['name']])
) { ) {
if (isset($field_array['binary'])) { $_t_value = '';
if (isset($field_array['binary'][0])) { // if we have a binary set, where 0 = YES and 1 = NO
$t_string .= $field_array['binary'][0]; if (!empty($field_array['binary'])) {
} elseif (isset($field_array['binary'][1])) { $_t_value = !empty($res[$field_array['name']]) ?
$t_string .= $field_array['binary'][1]; ($field_array['binary'][0] ?? 'Yes') :
} ($field_array['binary'][1] ?? 'No');
} else { } else {
$t_string .= $res[$field_array['name']]; $_t_value = $res[$field_array['name']];
} }
$t_string .= $this->l->__($_t_value);
} }
} }
$pk_names[] = $t_string; $pk_names[] = $t_string;
@@ -1506,7 +1507,7 @@ class Generate
} }
if ( if (
!empty($this->reference_array[$key]['mandatory']) && !empty($this->reference_array[$key]['mandatory']) &&
!$this->reference_array[$key]['selected'][0] empty($this->reference_array[$key]['selected'][0])
) { ) {
$this->msg .= sprintf( $this->msg .= sprintf(
$this->l->__('Please select at least one Element from field <b>%s</b>!<br>'), $this->l->__('Please select at least one Element from field <b>%s</b>!<br>'),

View File

@@ -53,6 +53,7 @@ class EditPages implements Interface\TableArraysInterface
'value' => $_POST['name'] ?? '', 'value' => $_POST['name'] ?? '',
'output_name' => 'Page name', 'output_name' => 'Page name',
'mandatory' => 1, 'mandatory' => 1,
'error_check' => 'unique',
'type' => 'text' 'type' => 'text'
], ],
'order_number' => [ 'order_number' => [

View File

@@ -204,11 +204,11 @@ class Image
E_USER_DEPRECATED E_USER_DEPRECATED
); );
// NOTE: we need to depracte this // NOTE: we need to depracte this
$cache_folder = BASE . LAYOUT . CONTENT_PATH . CACHE . IMAGES; $cache_folder = BASE . CONTENT_PATH . LAYOUT . CACHE . IMAGES;
$web_folder = LAYOUT . CACHE . IMAGES; $web_folder = LAYOUT . CACHE . IMAGES;
if (!is_dir($cache_folder)) { if (!is_dir($cache_folder)) {
if (false === mkdir($cache_folder)) { if (false === mkdir($cache_folder)) {
$cache_folder = BASE . LAYOUT . CONTENT_PATH . CACHE; $cache_folder = BASE . CONTENT_PATH . LAYOUT . CACHE;
$web_folder = LAYOUT . CACHE; $web_folder = LAYOUT . CACHE;
} }
} }

View File

@@ -156,7 +156,7 @@ class ProgressBar
{ {
// avoid divison through 0 // avoid divison through 0
if ($this->max - $this->min == 0) { if ($this->max - $this->min == 0) {
$this->max ++; $this->max++;
} }
$percent = round(($step - $this->min) / ($this->max - $this->min) * 100); $percent = round(($step - $this->min) / ($this->max - $this->min) * 100);
if ($percent > 100) { if ($percent > 100) {
@@ -186,7 +186,7 @@ class ProgressBar
} }
// avoid divison through 0 // avoid divison through 0
if ($this->max - $this->min == 0) { if ($this->max - $this->min == 0) {
$this->max ++; $this->max++;
} }
$pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min)); $pixel = round(($step - $this->min) * ($bar - ($this->pedding * 2)) / ($this->max - $this->min));
if ($step <= $this->min) { if ($step <= $this->min) {

View File

@@ -21,58 +21,82 @@ use SodiumException;
class SymmetricEncryption class SymmetricEncryption
{ {
/** @var SymmetricEncryption self instance */
private static SymmetricEncryption $instance;
/** @var string bin hex key */
private string $key = '';
/** /**
* Encrypt a message * init class
* if key not passed, key must be set with createKey
* *
* @param string $message Message to encrypt * @param string|null|null $key
* @param string $key Encryption key (as hex string)
* @return string
* @throws \Exception
* @throws \RangeException
*/ */
public static function encrypt(string $message, string $key): string public function __construct(
string|null $key = null
) {
if ($key != null) {
$this->setKey($key);
}
}
/**
* Returns the singleton self object.
* For function wrapper use
*
* @return SymmetricEncryption object
*/
public static function getInstance(string|null $key = null): self
{
if (empty(self::$instance)) {
self::$instance = new self($key);
}
return self::$instance;
}
/* ************************************************************************
* MARK: PRIVATE
* *************************************************************************/
/**
* create key and check validity
*
* @param string $key The key from which the binary key will be created
* @return string Binary key string
*/
private function createKey(string $key): string
{ {
try { try {
$key = CreateKey::hex2bin($key); $key = CreateKey::hex2bin($key);
} catch (SodiumException $e) { } catch (SodiumException $e) {
throw new \UnexpectedValueException('Invalid hex key'); throw new \UnexpectedValueException('Invalid hex key: ' . $e->getMessage());
} }
if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) { if (mb_strlen($key, '8bit') !== SODIUM_CRYPTO_SECRETBOX_KEYBYTES) {
throw new \RangeException( throw new \RangeException(
'Key is not the correct size (must be ' 'Key is not the correct size (must be '
. 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long).' . SODIUM_CRYPTO_SECRETBOX_KEYBYTES . ' bytes long).'
); );
} }
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); return $key;
$cipher = base64_encode(
$nonce
. sodium_crypto_secretbox(
$message,
$nonce,
$key
)
);
sodium_memzero($message);
sodium_memzero($key);
return $cipher;
} }
/** /**
* Decrypt a message * Decryption call
* *
* @param string $encrypted Message encrypted with safeEncrypt() * @param string $encrypted Text to decrypt
* @param string $key Encryption key (as hex string) * @param ?string $key Mandatory encryption key, will throw exception if empty
* @return string * @return string Plain text
* @throws \Exception * @throws \RangeException
* @throws \UnexpectedValueException
* @throws \UnexpectedValueException
*/ */
public static function decrypt(string $encrypted, string $key): string private function decryptData(string $encrypted, ?string $key): string
{ {
try { if (empty($key)) {
$key = CreateKey::hex2bin($key); throw new \UnexpectedValueException('Key not set');
} catch (SodiumException $e) {
throw new \Exception('Invalid hex key');
} }
$key = $this->createKey($key);
$decoded = base64_decode($encrypted); $decoded = base64_decode($encrypted);
$nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit'); $nonce = mb_substr($decoded, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, '8bit');
$ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit'); $ciphertext = mb_substr($decoded, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit');
@@ -85,7 +109,7 @@ class SymmetricEncryption
$key $key
); );
} catch (SodiumException $e) { } catch (SodiumException $e) {
throw new \UnexpectedValueException('Invalid ciphertext (too short)'); throw new \UnexpectedValueException('Decipher message failed: ' . $e->getMessage());
} }
if (!is_string($plain)) { if (!is_string($plain)) {
throw new \UnexpectedValueException('Invalid Key'); throw new \UnexpectedValueException('Invalid Key');
@@ -94,6 +118,117 @@ class SymmetricEncryption
sodium_memzero($key); sodium_memzero($key);
return $plain; return $plain;
} }
/**
* Encrypt a message
*
* @param string $message Message to encrypt
* @param ?string $key Mandatory encryption key, will throw exception if empty
* @return string
* @throws \Exception
* @throws \RangeException
*/
private function encryptData(string $message, ?string $key): string
{
if (empty($this->key) || $key === null) {
throw new \UnexpectedValueException('Key not set');
}
$key = $this->createKey($key);
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
try {
$cipher = base64_encode(
$nonce
. sodium_crypto_secretbox(
$message,
$nonce,
$key,
)
);
} catch (SodiumException $e) {
throw new \UnexpectedValueException("Create encrypted message failed: " . $e->getMessage());
}
sodium_memzero($message);
sodium_memzero($key);
return $cipher;
}
/* ************************************************************************
* MARK: PUBLIC
* *************************************************************************/
/**
* set a new key for encryption
*
* @param string $key
* @return void
*/
public function setKey(string $key)
{
if (empty($key)) {
throw new \UnexpectedValueException('Key cannot be empty');
}
$this->key = $key;
}
/**
* Decrypt a message
* static version
*
* @param string $encrypted Message encrypted with safeEncrypt()
* @param string $key Encryption key (as hex string)
* @return string
* @throws \Exception
* @throws \RangeException
* @throws \UnexpectedValueException
* @throws \UnexpectedValueException
*/
public static function decryptKey(string $encrypted, string $key): string
{
return self::getInstance()->decryptData($encrypted, $key);
}
/**
* Decrypt a message
*
* @param string $encrypted Message encrypted with safeEncrypt()
* @return string
* @throws \RangeException
* @throws \UnexpectedValueException
* @throws \UnexpectedValueException
*/
public function decrypt(string $encrypted): string
{
return $this->decryptData($encrypted, $this->key);
}
/**
* Encrypt a message
* static version
*
* @param string $message Message to encrypt
* @param string $key Encryption key (as hex string)
* @return string
* @throws \Exception
* @throws \RangeException
*/
public static function encryptKey(string $message, string $key): string
{
return self::getInstance()->encryptData($message, $key);
}
/**
* Encrypt a message
*
* @param string $message Message to encrypt
* @return string
* @throws \Exception
* @throws \RangeException
*/
public function encrypt(string $message): string
{
return $this->encryptData($message, $this->key);
}
} }
// __END__ // __END__

View File

@@ -19,7 +19,7 @@ use CoreLibs\Template\HtmlBuilder\General\HtmlBuilderExcpetion;
class Block class Block
{ {
/** /**
* Undocumented function * Create Element
* *
* @param string $tag * @param string $tag
* @param string $id * @param string $id
@@ -86,7 +86,7 @@ class Block
} }
/** /**
* Undocumented function * Add multiple elements to the base element
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $base * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $base
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} ...$attach * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} ...$attach
@@ -101,7 +101,7 @@ class Block
} }
/** /**
* Undocumented function * Add multiple sub elements to the base element
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $sub * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $sub
@@ -117,7 +117,7 @@ class Block
} }
/** /**
* Undocumented function * Remove all sub element entries
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element
* @return array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} * @return array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>}
@@ -131,7 +131,7 @@ class Block
// CSS Elements // CSS Elements
/** /**
* Undocumented function * Add css entry to the css entries
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element
* @param string ...$css * @param string ...$css
@@ -144,7 +144,7 @@ class Block
} }
/** /**
* Undocumented function * Remove a css entry entry from the css array
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $element
* @param string ...$css * @param string ...$css
@@ -157,7 +157,7 @@ class Block
} }
/** /**
* Undocumented function * Switch CSS entries
* scssel (switch) is not supported * scssel (switch) is not supported
* use rcssel -> acssel * use rcssel -> acssel
* *
@@ -175,7 +175,7 @@ class Block
} }
/** /**
* Undocumented function * Build HTML from the content tree
* alias phfo * alias phfo
* *
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $tree * @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $tree
@@ -231,7 +231,19 @@ class Block
} }
/** /**
* Undocumented function * Alias for phfo
*
* @param array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>} $tree
* @param bool $add_nl [default=false]
* @return string
*/
public static function phfo(array $tree, bool $add_nl = false): string
{
return self::buildHtml($tree, $add_nl);
}
/**
* Build HTML elements from an array of elements
* alias phfa * alias phfa
* *
* @param array<array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>}> $list * @param array<array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>}> $list
@@ -248,8 +260,7 @@ class Block
} }
/** /**
* Undocumented function * alias for buildHtmlFromList
* wrapper for buildHtmlFromList
* *
* @param array<array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>}> $list array of Elements to build string from * @param array<array{tag:string,id:string,name:string,content:string,css:array<string>,options:array<string,string>,sub:array<mixed>}> $list array of Elements to build string from
* @param bool $add_nl [default=false] Optional output string line break * @param bool $add_nl [default=false] Optional output string line break

View File

@@ -401,7 +401,7 @@ class Element
* @param bool $add_nl [default=false] Optional output string line breaks * @param bool $add_nl [default=false] Optional output string line breaks
* @return string HTML as string * @return string HTML as string
*/ */
public function buildHtml(Element $tree = null, bool $add_nl = false): string public function buildHtml(?Element $tree = null, bool $add_nl = false): string
{ {
// print "D01: " . microtime(true) . "<br>"; // print "D01: " . microtime(true) . "<br>";
if ($tree === null) { if ($tree === null) {
@@ -533,7 +533,7 @@ class Element
* @return string build html as string * @return string build html as string
* @deprecated Do not use, use Element->buildHtml() instead * @deprecated Do not use, use Element->buildHtml() instead
*/ */
public static function printHtmlFromObject(Element $tree = null, bool $add_nl = false): string public static function printHtmlFromObject(?Element $tree = null, bool $add_nl = false): string
{ {
// nothing ->bad // nothing ->bad
if ($tree === null) { if ($tree === null) {

View File

@@ -185,7 +185,7 @@ class SmartyExtend extends \Smarty
// call basic smarty // call basic smarty
// or Smarty::__construct(); // or Smarty::__construct();
parent::__construct(); parent::__construct();
// iinit lang // init lang
$this->l10n = $l10n; $this->l10n = $l10n;
// parse and read, legacy stuff // parse and read, legacy stuff
$locale = $this->l10n->getLocaleAsArray(); $locale = $this->l10n->getLocaleAsArray();
@@ -203,7 +203,8 @@ class SmartyExtend extends \Smarty
_bind_textdomain_codeset($this->domain, $this->encoding); _bind_textdomain_codeset($this->domain, $this->encoding);
// register smarty variable // register smarty variable
$this->registerPlugin('modifier', 'getvar', [&$this, 'getTemplateVars']); // $this->registerPlugin(\Smarty\Smarty::PLUGIN_MODIFIER, 'getvar', [&$this, 'getTemplateVars']);
$this->registerPlugin(self::PLUGIN_MODIFIER, 'getvar', [&$this, 'getTemplateVars']);
$this->page_name = \CoreLibs\Get\System::getPageName(); $this->page_name = \CoreLibs\Get\System::getPageName();

View File

@@ -1,2 +1,2 @@
base="/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All/"; base="/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All/";
vendor/bin/phan --progress-bar -C --analyze-twice tools/phan --progress-bar -C --analyze-twice

View File

@@ -1,2 +1,2 @@
base="/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All/"; base="/storage/var/www/html/developers/clemens/core_data/composer-packages/CoreLibs-Composer-All/";
vendor/bin/phpstan tools/phpstan

View File

@@ -15,25 +15,27 @@ php_bin="";
if [ ! -z "${1}" ]; then if [ ! -z "${1}" ]; then
case "${1}" in case "${1}" in
# "7.3") php_bin="/usr/bin/php7.3 "; ;; # "7.3") php_bin="/usr/bin/php7.3 "; ;;
"7.4") php_bin="/usr/bin/php7.4 "; ;; #"7.4") php_bin="/usr/bin/php7.4 "; ;;
"8.0") php_bin="/usr/bin/php8.0 "; ;; #"8.0") php_bin="/usr/bin/php8.0 "; ;;
"8.1") php_bin="/usr/bin/php8.1 "; ;; #"8.1") php_bin="/usr/bin/php8.1 "; ;;
"8.2") php_bin="/usr/bin/php8.2 "; ;; "8.2") php_bin="/usr/bin/php8.2 "; ;;
"8.3") php_bin="/usr/bin/php8.3 "; ;;
*) echo "Not support PHP: ${1}"; exit; ;; *) echo "Not support PHP: ${1}"; exit; ;;
esac; esac;
fi; fi;
if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then if [ ! -z "${2}" ] && [ -z "${php_bin}" ]; then
case "${2}" in case "${2}" in
# "7.3") php_bin="/usr/bin/php7.3 "; ;; # "7.3") php_bin="/usr/bin/php7.3 "; ;;
"7.4") php_bin="/usr/bin/php7.4 "; ;; #"7.4") php_bin="/usr/bin/php7.4 "; ;;
"8.0") php_bin="/usr/bin/php8.0 "; ;; #"8.0") php_bin="/usr/bin/php8.0 "; ;;
"8.1") php_bin="/usr/bin/php8.1 "; ;; #"8.1") php_bin="/usr/bin/php8.1 "; ;;
"8.2") php_bin="/usr/bin/php8.2 "; ;; "8.2") php_bin="/usr/bin/php8.2 "; ;;
"8.3") php_bin="/usr/bin/php8.3 "; ;;
*) echo "Not support PHP: ${1}"; exit; ;; *) echo "Not support PHP: ${1}"; exit; ;;
esac; esac;
fi; fi;
phpunit_call="${php_bin}${base}vendor/bin/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}test/phpunit/"; phpunit_call="${php_bin}${base}tools/phpunit ${opt_testdox} -c ${base}phpunit.xml ${base}test/phpunit/";
${phpunit_call}; ${phpunit_call};

View File

@@ -28,10 +28,10 @@ final class CoreLibsCheckFileTest extends TestCase
public function filesList(): array public function filesList(): array
{ {
return [ return [
['filename.txt', 'txt', 5], ['filename.txt', 'txt', 5, 'text/plain'],
['filename.csv', 'csv', 15], ['filename.csv', 'csv', 15, 'text/csv'],
['filename.tsv', 'tsv', 0], ['filename.tsv', 'tsv', 0, 'text/plain'],
['file_does_not_exits', '', -1], ['file_does_not_exits', '', -1, ''],
]; ];
} }
@@ -63,6 +63,15 @@ final class CoreLibsCheckFileTest extends TestCase
return $list; return $list;
} }
public function mimeTypeProvider(): array
{
$list = [];
foreach ($this->filesList() as $row) {
$list[$row[0] . ' must be mime type ' . $row[3]] = [$row[0], $row[3]];
}
return $list;
}
/** /**
* Tests if file extension matches * Tests if file extension matches
* *
@@ -115,6 +124,51 @@ final class CoreLibsCheckFileTest extends TestCase
unlink($this->base_folder . $input); unlink($this->base_folder . $input);
} }
} }
/**
* Undocumented function
*
* @covers ::getMimeType
* @dataProvider mimeTypeProvider
* @testdox getMimeType $input must be mime type $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testGetMimeType(string $input, string $expected): void
{
if (!empty($expected)) {
$file = $this->base_folder . $input;
$fp = fopen($file, 'w');
switch ($expected) {
case 'text/csv':
for ($i = 1; $i <= 10; $i++) {
fwrite($fp, '"This is row","' . $expected . '",' . $i . PHP_EOL);
}
break;
case 'text/tsv':
for ($i = 1; $i <= 10; $i++) {
fwrite($fp, "\"This is row\"\t\"" . $expected . "\"\t\"" . $i . PHP_EOL);
}
break;
case 'text/plain':
fwrite($fp, 'This is mime type: ' . $expected . PHP_EOL);
break;
}
fclose($fp);
} else {
$this->expectException(\UnexpectedValueException::class);
}
$this->assertEquals(
$expected,
\CoreLibs\Check\File::getMimeType($this->base_folder . $input)
);
// unlink file
if (is_file($this->base_folder . $input)) {
unlink($this->base_folder . $input);
}
}
} }
// __END__ // __END__

View File

@@ -33,15 +33,14 @@ final class CoreLibsConvertMimeEncodeTest extends TestCase
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine ' 'The quick brown fox jumps over the lazy sheep that sleeps in the ravine '
. 'and has no idea what is going on here', . 'and has no idea what is going on here',
'UTF-8', 'UTF-8',
'The quick brown fox jumps over the lazy sheep that sleeps in the ravine ' "The quick brown fox jumps over the lazy sheep that sleeps in the ravine and\r\n"
. 'and has no idea what is going on here' . ' has no idea what is going on here'
], ],
'standard with special chars UTF-8' => [ 'standard with special chars UTF-8' => [
'This is ümläßtと漢字もカタカナ!^$%&', 'This is ümläßtと漢字もカタカナ!^$%&',
'UTF-8', 'UTF-8',
'This is =?UTF-8?B?w7xtbMOkw59044Go5ryi5a2X44KC44Kr44K/44Kr44OK77yBIV4k?=' "This is =?UTF-8?B?w7xtbMOkw59044Go5ryi5a2X44KC44Kr44K/44Kr44OK77yBIV4k?=\r\n"
. "\r\n" . ' =?UTF-8?B?JSY=?='
. ' =?UTF-8?B?JQ==?=&'
], ],
'35 chars and space at the end UTF-8' => [ '35 chars and space at the end UTF-8' => [
'12345678901234567890123456789012345 ' '12345678901234567890123456789012345 '
@@ -62,9 +61,8 @@ final class CoreLibsConvertMimeEncodeTest extends TestCase
. 'is there a space?', . 'is there a space?',
'UTF-8', 'UTF-8',
"=?UTF-8?B?44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr44OK44Kr?=\r\n" "=?UTF-8?B?44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr44OK44Kr?=\r\n"
. " =?UTF-8?B?44K/44Kr44OK?=\r\n" . " =?UTF-8?B?44K/44Kr44OK44GL44Gq44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq?=\r\n"
. " =?UTF-8?B?44GL44Gq44Kr44K/44Kr44OK44Kr44K/44Kr44OK44GL44Gq44Kr44K/44Kr?=\r\n" . " =?UTF-8?B?44Kr44K/44Kr44OK44Kr44K/IGlzIHRoZXJlIGEgc3BhY2U/?="
. " =?UTF-8?B?44OK44Kr44K/?= is there a =?UTF-8?B?c3BhY2U/?="
] ]
]; ];
} }
@@ -85,16 +83,28 @@ final class CoreLibsConvertMimeEncodeTest extends TestCase
// print "MIME: -" . $encoded . "-\n"; // print "MIME: -" . $encoded . "-\n";
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$encoded $encoded,
"__mbMimeEncode"
); );
$decoded = mb_decode_mimeheader($encoded); $decoded = mb_decode_mimeheader($encoded);
// print "INPUT : " . $input . "\n"; // print "ENCODED: " . $encoded . "\n";
// print "DECODED: " . $decoded . "\n"; // print "INPUT : " . $input . " | " . mb_strlen($input) . "\n";
// print "DECODED: " . $decoded . " | " . mb_strlen($decoded) . "\n";
// $test_enc = mb_encode_mimeheader($input, $encoding);
// $test_dec = mb_decode_mimeheader($test_enc);
// print "TEST ENC: " . $test_enc . "\n";
// back compare decoded // back compare decoded
$this->assertEquals( $this->assertEquals(
$input, $input,
$decoded $decoded,
"mb_decode_mimeheader"
); );
// $this->assertEquals(
// $input,
// $test_dec,
// 'mb_encode_to_decode'
// );
} }
} }

View File

@@ -13,6 +13,8 @@ use PHPUnit\Framework\TestCase;
*/ */
final class CoreLibsConvertStringsTest extends TestCase final class CoreLibsConvertStringsTest extends TestCase
{ {
private const DATA_FOLDER = __DIR__ . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR;
/** /**
* Undocumented function * Undocumented function
* *
@@ -256,6 +258,126 @@ final class CoreLibsConvertStringsTest extends TestCase
$output $output
); );
} }
/**
* provider for testStripMultiplePathSlashes
*
* @return array<mixed>
*/
public function stripMultiplePathSlashesProvider(): array
{
return [
'no slahses' => [
'input' => 'string_abc',
'expected' => 'string_abc',
],
'one slash' => [
'input' => 'some/foo',
'expected' => 'some/foo',
],
'two slashes' => [
'input' => 'some//foo',
'expected' => 'some/foo',
],
'three slashes' => [
'input' => 'some///foo',
'expected' => 'some/foo',
],
'slashes in front' => [
'input' => '/foo',
'expected' => '/foo',
],
'two slashes in front' => [
'input' => '//foo',
'expected' => '/foo',
],
'thee slashes in front' => [
'input' => '///foo',
'expected' => '/foo',
],
'slashes in back' => [
'input' => 'foo/',
'expected' => 'foo/',
],
'two slashes in back' => [
'input' => 'foo//',
'expected' => 'foo/',
],
'thee slashes in back' => [
'input' => 'foo///',
'expected' => 'foo/',
],
'multiple slashes' => [
'input' => '/foo//bar///string/end_times',
'expected' => '/foo/bar/string/end_times',
]
];
}
/**
* test multiple slashes clean up
*
* @covers ::stripMultiplePathSlashes
* @dataProvider stripMultiplePathSlashesProvider
* @testdox stripMultiplePathSlashes $input will be $expected [$_dataName]
*
* @param string $input
* @param string $expected
* @return void
*/
public function testStripMultiplePathSlashes(string $input, string $expected): void
{
$this->assertEquals(
$expected,
\CoreLibs\Convert\Strings::stripMultiplePathSlashes($input)
);
}
/**
* Undocumented function
*
* @return array
*/
public function providerStripUTF8BomBytes(): array
{
return [
"utf8-bom" => [
"file" => "UTF8BOM.csv",
"expect" => "Asset Type,Epic,File Name\n",
],
"utf8" => [
"file" => "UTF8.csv",
"expect" => "Asset Type,Epic,File Name\n",
],
];
}
/**
* test utf8 bom remove
*
* @covers ::stripUTF8BomBytes
* @dataProvider providerStripUTF8BomBytes
* @testdox stripUTF8BomBytes $file will be $expected [$_dataName]
*
* @param string $file
* @param string $expected
* @return void
*/
public function testStripUTF8BomBytes(string $file, string $expected): void
{
// load sample file
if (!is_file(self::DATA_FOLDER . $file)) {
$this->markTestSkipped('File: ' . $file . ' could not be opened');
}
$file = file_get_contents(self::DATA_FOLDER . $file);
if ($file === false) {
$this->markTestSkipped('File: ' . $file . ' could not be read');
}
$this->assertEquals(
$expected,
\CoreLibs\Convert\Strings::stripUTF8BomBytes($file)
);
}
} }
// __END__ // __END__

View File

@@ -0,0 +1 @@
Asset Type,Epic,File Name
1 Asset Type Epic File Name

View File

@@ -0,0 +1 @@
Asset Type,Epic,File Name
1 Asset Type Epic File Name

View File

@@ -216,6 +216,29 @@ final class CoreLibsGetSystemTest extends TestCase
); );
} }
} }
/**
* Undocumented function
*
* @covers ::getIpAddresses
* @testdox getIpAddresses check
*
* @return void
*/
public function testGetIpAddresses()
{
// response must have "REMOTE_ADDR" entry, others are optional
// NOTE: we have no IP addresses on command line
$this->assertTrue(
true,
"We do not have REMOTE_ADDR on command line"
);
// $this->assertContains(
// 'REMOTE_ADDR',
// array_keys(\CoreLibs\Get\System::getIpAddresses()),
// 'failed REMOTE_ADDR assert'
// );
}
} }
// __END__ // __END__

View File

@@ -39,6 +39,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'OK', 'str' => 'OK',
'expected' => 'ok', 'expected' => 'ok',
], ],
'success' => [
'level' => 'success',
'str' => 'SUCCESS',
'expected' => 'success',
],
'info' => [ 'info' => [
'level' => 'info', 'level' => 'info',
'str' => 'INFO', 'str' => 'INFO',
@@ -225,6 +230,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ERROR> ERROR MESSAGE', 'expected' => '<ERROR> ERROR MESSAGE',
], ],
'error, logged' => [ 'error, logged' => [
@@ -233,6 +239,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => null, 'message' => null,
'log_error' => true, 'log_error' => true,
'log_warning' => null,
'expected' => '<ERROR> ERROR MESSAGE', 'expected' => '<ERROR> ERROR MESSAGE',
], ],
'error, logged, message' => [ 'error, logged, message' => [
@@ -241,14 +248,43 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ERROR MESSAGE', 'str' => 'ERROR MESSAGE',
'message' => 'OTHER ERROR MESSAGE', 'message' => 'OTHER ERROR MESSAGE',
'log_error' => true, 'log_error' => true,
'log_warning' => null,
'expected' => '<ERROR> OTHER ERROR MESSAGE', 'expected' => '<ERROR> OTHER ERROR MESSAGE',
], ],
'warn, not logged' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => null,
'log_error' => null,
'log_warning' => null,
'expected' => '<WARNING> WARNING MESSAGE',
],
'warn, logged' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => null,
'log_error' => null,
'log_warning' => true,
'expected' => '<WARNING> WARNING MESSAGE',
],
'warn, logged, message' => [
'id' => '300',
'level' => 'warn',
'str' => 'WARNING MESSAGE',
'message' => 'OTHER WARNING MESSAGE',
'log_error' => null,
'log_warning' => true,
'expected' => '<WARNING> OTHER WARNING MESSAGE',
],
'notice' => [ 'notice' => [
'id' => '100', 'id' => '100',
'level' => 'notice', 'level' => 'notice',
'str' => 'NOTICE MESSAGE', 'str' => 'NOTICE MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<NOTICE> NOTICE MESSAGE', 'expected' => '<NOTICE> NOTICE MESSAGE',
], ],
'notice, message' => [ 'notice, message' => [
@@ -257,6 +293,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'NOTICE MESSAGE', 'str' => 'NOTICE MESSAGE',
'message' => 'OTHER NOTICE MESSAGE', 'message' => 'OTHER NOTICE MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<NOTICE> OTHER NOTICE MESSAGE', 'expected' => '<NOTICE> OTHER NOTICE MESSAGE',
], ],
'crash' => [ 'crash' => [
@@ -265,6 +302,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'CRASH MESSAGE', 'str' => 'CRASH MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ALERT> CRASH MESSAGE', 'expected' => '<ALERT> CRASH MESSAGE',
], ],
'crash, message' => [ 'crash, message' => [
@@ -273,6 +311,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'CRASH MESSAGE', 'str' => 'CRASH MESSAGE',
'message' => 'OTHER CRASH MESSAGE', 'message' => 'OTHER CRASH MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<ALERT> OTHER CRASH MESSAGE', 'expected' => '<ALERT> OTHER CRASH MESSAGE',
], ],
'abort' => [ 'abort' => [
@@ -281,6 +320,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ABORT MESSAGE', 'str' => 'ABORT MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<CRITICAL> ABORT MESSAGE', 'expected' => '<CRITICAL> ABORT MESSAGE',
], ],
'abort, message' => [ 'abort, message' => [
@@ -289,6 +329,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'ABORT MESSAGE', 'str' => 'ABORT MESSAGE',
'message' => 'OTHER ABORT MESSAGE', 'message' => 'OTHER ABORT MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<CRITICAL> OTHER ABORT MESSAGE', 'expected' => '<CRITICAL> OTHER ABORT MESSAGE',
], ],
'unknown' => [ 'unknown' => [
@@ -297,6 +338,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'WRONG LEVEL MESSAGE', 'str' => 'WRONG LEVEL MESSAGE',
'message' => null, 'message' => null,
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE', 'expected' => '<EMERGENCY> WRONG LEVEL MESSAGE',
], ],
'unknown, message' => [ 'unknown, message' => [
@@ -305,6 +347,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
'str' => 'WRONG LEVEL MESSAGE', 'str' => 'WRONG LEVEL MESSAGE',
'message' => 'OTHER WRONG LEVEL MESSAGE', 'message' => 'OTHER WRONG LEVEL MESSAGE',
'log_error' => null, 'log_error' => null,
'log_warning' => null,
'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE', 'expected' => '<EMERGENCY> OTHER WRONG LEVEL MESSAGE',
], ],
]; ];
@@ -321,6 +364,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
* @param string $str * @param string $str
* @param string|null $message * @param string|null $message
* @param bool|null $log_error * @param bool|null $log_error
* @param bool|null $log_warning
* @param string $expected * @param string $expected
* @return void * @return void
*/ */
@@ -330,6 +374,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
string $str, string $str,
?string $message, ?string $message,
?bool $log_error, ?bool $log_error,
?bool $log_warning,
string $expected string $expected
): void { ): void {
$log = new \CoreLibs\Logging\Logging([ $log = new \CoreLibs\Logging\Logging([
@@ -344,7 +389,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$level, $level,
$str, $str,
message: $message, message: $message,
log_error: $log_error log_error: $log_error,
log_warning: $log_warning
); );
$file_content = ''; $file_content = '';
if (is_file($log->getLogFolder() . $log->getLogFile())) { if (is_file($log->getLogFolder() . $log->getLogFile())) {
@@ -358,6 +404,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$expected, $expected,
$file_content $file_content
); );
} elseif ($level == 'warn' && ($log_warning === null || $log_warning === false)) {
$this->assertStringNotContainsString(
$expected,
$file_content
);
} else { } else {
$this->assertStringContainsString( $this->assertStringContainsString(
$expected, $expected,
@@ -377,6 +428,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
* @param string $str * @param string $str
* @param string|null $message * @param string|null $message
* @param bool|null $log_error * @param bool|null $log_error
* @param bool|null $log_warning
* @param string $expected * @param string $expected
* @return void * @return void
*/ */
@@ -386,6 +438,7 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
string $str, string $str,
?string $message, ?string $message,
?bool $log_error, ?bool $log_error,
?bool $log_warning,
string $expected string $expected
): void { ): void {
$log = new \CoreLibs\Logging\Logging([ $log = new \CoreLibs\Logging\Logging([
@@ -400,7 +453,8 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$level, $level,
$str, $str,
message: $message, message: $message,
log_error: $log_error log_error: $log_error,
log_warning: $log_warning
); );
$file_content = ''; $file_content = '';
if (is_file($log->getLogFolder() . $log->getLogFile())) { if (is_file($log->getLogFolder() . $log->getLogFile())) {
@@ -414,6 +468,11 @@ final class CoreLibsLoggingErrorMessagesTest extends TestCase
$expected, $expected,
$file_content $file_content
); );
} elseif ($level == 'warn' && $log_warning === false) {
$this->assertStringNotContainsString(
$expected,
$file_content
);
} else { } else {
$this->assertStringContainsString( $this->assertStringContainsString(
$expected, $expected,

View File

@@ -46,12 +46,34 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
public function testEncryptDecryptSuccess(string $input, string $expected): void public function testEncryptDecryptSuccess(string $input, string $expected): void
{ {
$key = CreateKey::generateRandomKey(); $key = CreateKey::generateRandomKey();
$encrypted = SymmetricEncryption::encrypt($input, $key);
$decrypted = SymmetricEncryption::decrypt($encrypted, $key); // test class
$crypt = new SymmetricEncryption($key);
$encrypted = $crypt->encrypt($input);
$decrypted = $crypt->decrypt($encrypted);
$this->assertEquals(
$expected,
$decrypted,
'Class call',
);
// test indirect
$encrypted = SymmetricEncryption::getInstance($key)->encrypt($input);
$decrypted = SymmetricEncryption::getInstance($key)->decrypt($encrypted);
$this->assertEquals(
$expected,
$decrypted,
'Class Instance call',
);
// test static
$encrypted = SymmetricEncryption::encryptKey($input, $key);
$decrypted = SymmetricEncryption::decryptKey($encrypted, $key);
$this->assertEquals( $this->assertEquals(
$expected, $expected,
$decrypted $decrypted,
'Static call',
); );
} }
@@ -86,10 +108,24 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
public function testEncryptFailed(string $input, string $exception_message): void public function testEncryptFailed(string $input, string $exception_message): void
{ {
$key = CreateKey::generateRandomKey(); $key = CreateKey::generateRandomKey();
$encrypted = SymmetricEncryption::encrypt($input, $key);
$wrong_key = CreateKey::generateRandomKey(); $wrong_key = CreateKey::generateRandomKey();
// wrong key in class call
$crypt = new SymmetricEncryption($key);
$encrypted = $crypt->encrypt($input);
$this->expectExceptionMessage($exception_message); $this->expectExceptionMessage($exception_message);
SymmetricEncryption::decrypt($encrypted, $wrong_key); $crypt->setKey($key);
$crypt->decrypt($encrypted);
// class instance
$encrypted = SymmetricEncryption::getInstance($key)->encrypt($input);
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::getInstance($wrong_key)->decrypt($encrypted);
// class static
$encrypted = SymmetricEncryption::encryptKey($input, $key);
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::decryptKey($encrypted, $wrong_key);
} }
/** /**
@@ -107,7 +143,6 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
'too short hex key' => [ 'too short hex key' => [
'key' => '1cabd5cba9e042f12522f4ff2de5c31d233b', 'key' => '1cabd5cba9e042f12522f4ff2de5c31d233b',
'excpetion_message' => 'Key is not the correct size (must be ' 'excpetion_message' => 'Key is not the correct size (must be '
. 'SODIUM_CRYPTO_SECRETBOX_KEYBYTES bytes long).'
], ],
]; ];
} }
@@ -126,13 +161,33 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
*/ */
public function testWrongKey(string $key, string $exception_message): void public function testWrongKey(string $key, string $exception_message): void
{ {
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::encrypt('test', $key);
// we must encrypt valid thing first so we can fail with the wrong kjey
$enc_key = CreateKey::generateRandomKey(); $enc_key = CreateKey::generateRandomKey();
$encrypted = SymmetricEncryption::encrypt('test', $enc_key);
// class
$crypt = new SymmetricEncryption($key);
$this->expectExceptionMessage($exception_message); $this->expectExceptionMessage($exception_message);
SymmetricEncryption::decrypt($encrypted, $key); $crypt->encrypt('test');
$crypt->setKey($enc_key);
$encrypted = $crypt->encrypt('test');
$this->expectExceptionMessage($exception_message);
$crypt->setKey($key);
$crypt->decrypt($encrypted);
// class instance
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::getInstance($key)->encrypt('test');
// we must encrypt valid thing first so we can fail with the wrong key
$encrypted = SymmetricEncryption::getInstance($enc_key)->encrypt('test');
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::getInstance($key)->decrypt($encrypted);
// class static
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::encryptKey('test', $key);
// we must encrypt valid thing first so we can fail with the wrong key
$encrypted = SymmetricEncryption::encryptKey('test', $enc_key);
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::decryptKey($encrypted, $key);
} }
/** /**
@@ -145,7 +200,7 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
return [ return [
'too short ciphertext' => [ 'too short ciphertext' => [
'input' => 'short', 'input' => 'short',
'exception_message' => 'Invalid ciphertext (too short)' 'exception_message' => 'Decipher message failed: '
], ],
]; ];
} }
@@ -164,8 +219,18 @@ final class CoreLibsSecuritySymmetricEncryptionTest extends TestCase
public function testWrongCiphertext(string $input, string $exception_message): void public function testWrongCiphertext(string $input, string $exception_message): void
{ {
$key = CreateKey::generateRandomKey(); $key = CreateKey::generateRandomKey();
// class
$crypt = new SymmetricEncryption($key);
$this->expectExceptionMessage($exception_message); $this->expectExceptionMessage($exception_message);
SymmetricEncryption::decrypt($input, $key); $crypt->decrypt($input);
// class instance
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::getInstance($key)->decrypt($input);
// class static
$this->expectExceptionMessage($exception_message);
SymmetricEncryption::decryptKey($input, $key);
} }
} }

2
tmp/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/phan-5.4.2.phar

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/phpcbf-3.7.2.phar

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/phpcs-3.7.2.phar

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/phpstan-1.10.40.phar

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/phpunit-9.6.13.phar

View File

@@ -1 +0,0 @@
/home/clemens/.phive/phars/psalm-5.15.0.phar