From 73b180a372a9f8e8667cdb53ece29124e8b5479e Mon Sep 17 00:00:00 2001 From: chevereto Date: Tue, 13 May 2025 16:49:51 +0000 Subject: [PATCH] Automatic push 4.3.0 --- .github/FUNDING.yml | 1 - .github/workflows/docker.yml | 3 +- .package/4.2.5.txt | 9 - .package/4.3.0.txt | 50 + README.md | 24 +- .../Workflow/BaseWorkflow.php => bin/cli} | 7 +- app/bin/legacy | 2 + app/composer.json | 16 +- app/composer.lock | 958 +-- app/env-default.php | 18 +- app/legacy/commands/cache-flush.php | 66 + app/legacy/commands/cache-view.php | 79 + app/legacy/commands/cron.php | 50 +- app/legacy/commands/install.php | 1 + app/legacy/commands/js.php | 22 +- app/legacy/commands/update.php | 1 + app/legacy/entrypoints/cli.php | 16 +- app/legacy/install/installer.php | 465 +- app/legacy/load/app.php | 4 +- app/legacy/load/register-handlers.php | 23 +- app/legacy/load/web.php | 242 +- app/legacy/routes/account.php | 2 +- app/legacy/routes/album.php | 2 +- app/legacy/routes/api-v1.php | 2 +- app/legacy/routes/api.php | 6 + app/legacy/routes/dashboard.php | 305 +- app/legacy/routes/image.php | 2 +- app/legacy/routes/json.php | 266 +- app/legacy/routes/page.php | 53 +- app/legacy/routes/settings.php | 2 +- app/legacy/routes/tag.php | 1 + app/legacy/routes/user.php | 21 +- app/routing/admin.api-v4.php | 121 - app/routing/admin.web.php | 39 - app/routing/user.api-v1.php | 21 - app/routing/user.api-v4.php | 127 - app/routing/user.web.php | 127 - app/schemas/mysql-5/albums.sql | 35 +- app/schemas/mysql-5/api_keys.sql | 10 +- app/schemas/mysql-5/assets.sql | 10 +- app/schemas/mysql-5/categories.sql | 9 +- app/schemas/mysql-5/confirmations.sql | 16 +- app/schemas/mysql-5/deletions.sql | 22 +- app/schemas/mysql-5/follows.sql | 12 +- app/schemas/mysql-5/images.sql | 75 +- app/schemas/mysql-5/images_hash.sql | 4 +- app/schemas/mysql-5/importing.sql | 10 +- app/schemas/mysql-5/imports.sql | 24 +- app/schemas/mysql-5/ip_bans.sql | 18 +- app/schemas/mysql-5/likes.sql | 16 +- app/schemas/mysql-5/locks.sql | 8 +- app/schemas/mysql-5/login_connections.sql | 14 +- app/schemas/mysql-5/login_cookies.sql | 17 +- app/schemas/mysql-5/login_passwords.sql | 8 +- app/schemas/mysql-5/login_providers.sql | 15 +- app/schemas/mysql-5/logins.sql | 26 +- app/schemas/mysql-5/notifications.sql | 16 +- app/schemas/mysql-5/pages.sql | 32 +- app/schemas/mysql-5/queues.sql | 14 +- app/schemas/mysql-5/requests.sql | 20 +- app/schemas/mysql-5/settings.sql | 10 +- app/schemas/mysql-5/stats.sql | 29 +- app/schemas/mysql-5/storage_apis.sql | 6 +- app/schemas/mysql-5/storages.sql | 36 +- app/schemas/mysql-5/tags.sql | 17 +- app/schemas/mysql-5/tags_albums.sql | 10 +- app/schemas/mysql-5/tags_files.sql | 4 +- app/schemas/mysql-5/tags_users.sql | 8 +- app/schemas/mysql-5/two_factors.sql | 8 +- app/schemas/mysql-5/uploads.sql | 17 + app/schemas/mysql-5/uploads_chunks.sql | 10 + app/schemas/mysql-5/users.sql | 66 +- app/schemas/mysql-5/variables.sql | 10 +- app/schemas/mysql-8/albums.sql | 35 +- app/schemas/mysql-8/api_keys.sql | 10 +- app/schemas/mysql-8/assets.sql | 10 +- app/schemas/mysql-8/categories.sql | 9 +- app/schemas/mysql-8/confirmations.sql | 16 +- app/schemas/mysql-8/deletions.sql | 22 +- app/schemas/mysql-8/follows.sql | 14 +- app/schemas/mysql-8/images.sql | 75 +- app/schemas/mysql-8/images_hash.sql | 4 +- app/schemas/mysql-8/importing.sql | 10 +- app/schemas/mysql-8/imports.sql | 26 +- app/schemas/mysql-8/ip_bans.sql | 20 +- app/schemas/mysql-8/likes.sql | 16 +- app/schemas/mysql-8/locks.sql | 10 +- app/schemas/mysql-8/login_connections.sql | 14 +- app/schemas/mysql-8/login_cookies.sql | 17 +- app/schemas/mysql-8/login_passwords.sql | 8 +- app/schemas/mysql-8/login_providers.sql | 15 +- app/schemas/mysql-8/logins.sql | 26 +- app/schemas/mysql-8/notifications.sql | 18 +- app/schemas/mysql-8/pages.sql | 32 +- app/schemas/mysql-8/queues.sql | 14 +- app/schemas/mysql-8/requests.sql | 20 +- app/schemas/mysql-8/settings.sql | 10 +- app/schemas/mysql-8/stats.sql | 29 +- app/schemas/mysql-8/storage_apis.sql | 8 +- app/schemas/mysql-8/storages.sql | 36 +- app/schemas/mysql-8/tags.sql | 17 +- app/schemas/mysql-8/tags_albums.sql | 10 +- app/schemas/mysql-8/tags_files.sql | 4 +- app/schemas/mysql-8/tags_users.sql | 8 +- app/schemas/mysql-8/two_factors.sql | 8 +- app/schemas/mysql-8/uploads.sql | 17 + app/schemas/mysql-8/uploads_chunks.sql | 10 + app/schemas/mysql-8/users.sql | 66 +- app/schemas/mysql-8/variables.sql | 10 +- .../Auth/AuthVerifyCSRFTokenAction.php | 34 - .../Auth/AuthVerifyRepositoryAccessAction.php | 47 - .../Auth/AuthVerifyResourceAccessAction.php | 56 - .../Database/DatabaseReserveRowAction.php | 64 - .../Actions/File/FileFetchSourceAction.php | 61 - app/src/Actions/File/FileNamingAction.php | 99 - app/src/Actions/File/FileUploadAction.php | 33 - app/src/Actions/File/FileValidateAction.php | 137 - .../File/FileVerifyNotDuplicateAction.php | 49 - .../Actions/Image/ImageFetchMetaAction.php | 54 - .../Image/ImageFixOrientationAction.php | 28 - app/src/Actions/Image/ImageInsertAction.php | 43 - .../Actions/Image/ImageStripMetaAction.php | 41 - .../Actions/Image/ImageVerifyMediaAction.php | 175 - .../Legacy/Api/V1/ImageInsertAction.php | 36 - .../Legacy/Api/V1/LegacyApiV1OutputAction.php | 39 - .../Api/V1/LegacyApiV1VerifyKeyAction.php | 32 - .../Storage/StorageGetForAssetAction.php | 61 - .../Storage/StorageGetForUserAction.php | 58 - .../Api/V1/Upload/UploadPostController.php | 52 - .../Api/V4/Album/AlbumDeleteController.php | 36 - .../Api/V4/Album/AlbumGetController.php | 36 - .../Api/V4/Album/AlbumPatchController.php | 52 - .../Api/V4/Album/AlbumPostController.php | 48 - .../Album/Like/AlbumLikeDeleteController.php | 36 - .../V4/Album/Like/AlbumLikePostController.php | 36 - .../Api/V4/Ban/Ip/BanIpDeleteController.php | 36 - .../Api/V4/Ban/Ip/BanIpPatchController.php | 52 - .../Api/V4/Ban/Ip/BanIpPostController.php | 47 - .../V4/Category/CategoryPostController.php | 48 - .../Api/V4/File/FilePostController.php | 24 - .../Image/Bulk/ImageBulkPatchController.php | 51 - .../Api/V4/Image/ImageGetController.php | 36 - .../Api/V4/Image/ImagePatchController.php | 56 - .../Api/V4/Image/ImagePostController.php | 63 - .../Image/Like/ImageLikeDeleteController.php | 33 - .../V4/Image/Like/ImageLikePostController.php | 33 - .../Rebuild/StatRebuildPostController.php | 22 - .../Migrate/StorageMigratePostController.php | 27 - .../Regen/StorageStatRegenPostController.php | 39 - .../Api/V4/Storage/StoragePostController.php | 53 - .../Id/Decode/ToolDecodeIdGetController.php | 38 - .../Id/Encode/ToolEncodeIdGetController.php | 38 - .../Email/ToolProbeEmailPostController.php | 27 - .../UserAssetAvatarDeleteController.php | 36 - .../Avatar/UserAssetAvatarPostController.php | 38 - .../UserAssetBackgroundDeleteController.php | 25 - .../UserAssetBackgroundPostController.php | 38 - .../User/Export/UserExportGetController.php | 39 - .../Follow/UserFollowDeleteController.php | 33 - .../User/Follow/UserFollowPostController.php | 33 - .../Setting/UserSettingPatchController.php | 46 - .../Api/V4/User/UserGetController.php | 33 - .../Api/V4/User/UserPostController.php | 60 - app/src/Controllers/LegacyController.php | 27 - app/src/Controllers/WorkflowController.php | 45 - app/src/Controllers/functions.php | 23 - app/src/Database/Database.php | 33 - app/src/Database/EntitiesIo.php | 71 - app/src/Database/EntitiesIoInterface.php | 39 - app/src/Database/EntityIo.php | 102 - app/src/Database/EntityIoInterface.php | 52 - .../Database/Traits/GetWhereEqualsTrait.php | 20 - app/src/Encoding/functions.php | 70 - app/src/File/functions.php | 38 - app/src/HashId/HashId.php | 113 - app/src/Image/ImageHashInstance.php | 40 - app/src/Image/ImageManagerInstance.php | 37 - app/src/Image/functions.php | 63 - app/src/Job/Job.php | 48 - app/src/Legacy/Classes/Album.php | 161 +- app/src/Legacy/Classes/Cache.php | 41 + app/src/Legacy/Classes/Categories.php | 59 + app/src/Legacy/Classes/DB.php | 17 +- app/src/Legacy/Classes/ExifTool.php | 51 + app/src/Legacy/Classes/ExifTran.php | 40 + app/src/Legacy/Classes/Image.php | 400 +- app/src/Legacy/Classes/Import.php | 1 + app/src/Legacy/Classes/KeyValue.php | 102 + app/src/Legacy/Classes/KeyValueInterface.php | 81 + app/src/Legacy/Classes/KeyValueNull.php | 58 + app/src/Legacy/Classes/Listing.php | 574 +- app/src/Legacy/Classes/Login.php | 31 - app/src/Legacy/Classes/Page.php | 41 +- app/src/Legacy/Classes/RequestLog.php | 75 +- app/src/Legacy/Classes/Search.php | 50 +- app/src/Legacy/Classes/Settings.php | 69 +- app/src/Legacy/Classes/Stat.php | 71 +- app/src/Legacy/Classes/Storage.php | 6 +- app/src/Legacy/Classes/Tag.php | 56 +- app/src/Legacy/Classes/Tags.php | 49 + app/src/Legacy/Classes/Traits/BinaryTrait.php | 45 + app/src/Legacy/Classes/Upload.php | 118 +- app/src/Legacy/Classes/Uploads.php | 95 + app/src/Legacy/Classes/User.php | 155 +- app/src/Legacy/Classes/Variable.php | 17 +- app/src/Legacy/G/DB.php | 64 +- app/src/Legacy/G/Handler.php | 24 +- app/src/Legacy/G/functions.php | 11 +- app/src/Legacy/functions-render.php | 25 +- app/src/Legacy/functions.php | 212 +- app/src/Storage/Storage.php | 27 - app/src/Storage/StorageInterface.php | 21 - app/src/Vars/EnvVar.php | 8 - app/src/Vars/RequestHeadersVar.php | 32 + app/src/Vars/Traits/ImmutableMapTrait.php | 10 - app/src/Vars/Traits/MutableMapTrait.php | 9 +- app/src/Vars/functions.php | 98 +- app/src/Workflow/functions.php | 45 - .../Workflows/Album/AlbumDeleteWorkflow.php | 30 - app/src/Workflows/Album/AlbumGetWorkflow.php | 30 - .../Workflows/Album/AlbumPatchWorkflow.php | 31 - app/src/Workflows/Album/AlbumPostWorkflow.php | 31 - .../Album/Like/AlbumLikeDeleteWorkflow.php | 31 - .../Album/Like/AlbumLikePostWorkflow.php | 31 - .../Workflows/Ban/Ip/BanIpDeleteWorkflow.php | 30 - .../Workflows/Ban/Ip/BanIpPatchWorkflow.php | 30 - .../Workflows/Ban/Ip/BanIpPostWorkflow.php | 43 - .../Category/CategoryPostWorkflow.php | 39 - .../Image/Bulk/ImageBulkPatchWorkflow.php | 31 - app/src/Workflows/Image/ImageGetWorkflow.php | 30 - .../Workflows/Image/ImagePatchWorkflow.php | 31 - app/src/Workflows/Image/ImagePostWorkflow.php | 107 - .../Image/Like/ImageLikeDeleteWorkflow.php | 31 - .../Image/Like/ImageLikePostWorkflow.php | 31 - .../Workflows/Legacy/LegacyRouteWorkflow.php | 31 - .../Legacy/LegacyUploadPostWorkflow.php | 115 - .../Stat/Rebuild/StatRebuildPostWorkflow.php | 29 - .../Migrate/StorageMigratePostWorkflow.php | 32 - .../Regen/StorageStatsRegenPostWorkflow.php | 30 - .../Workflows/Storage/StoragePostWorkflow.php | 46 - .../Id/Decode/ToolDecodeIdGetWorkflow.php | 30 - .../Id/Encode/ToolEncodeIdGetWorkflow.php | 30 - .../Email/ToolProbeEmailPostWorkflow.php | 30 - .../Avatar/UserAssetAvatarDeleteWorkflow.php | 40 - .../Avatar/UserAssetAvatarPostWorkflow.php | 82 - .../UserAssetBackgroundDeleteWorkflow.php | 40 - .../UserAssetBackgroundPostWorkflow.php | 81 - .../User/Export/UserExportGetWorkflow.php | 40 - .../User/Follow/UserFollowDeleteWorkflow.php | 41 - .../User/Follow/UserFollowPostWorkflow.php | 41 - app/src/Workflows/User/UserPostWorkflow.php | 62 - app/upgrading.php | 4 +- content/images/system/default/home_cover.avif | Bin 461942 -> 0 bytes content/images/system/default/home_cover.jpg | Bin 646671 -> 355590 bytes content/legacy/themes/Peafowl/footer.php | 2 +- content/legacy/themes/Peafowl/head.php | 22 +- content/legacy/themes/Peafowl/header.php | 4 +- .../themes/Peafowl/lib/chevereto-all.js | 5500 +++++++------ .../themes/Peafowl/lib/chevereto-all.min.js | 17 +- .../legacy/themes/Peafowl/lib/js/chevereto.js | 638 +- .../legacy/themes/Peafowl/lib/js/peafowl.js | 431 +- .../themes/Peafowl/lib/js/re-chevereto.js | 7065 +++++++++++++++++ .../themes/Peafowl/lib/js/xxhash-wasm.js | 1 + content/legacy/themes/Peafowl/lib/peafowl.css | 11 +- .../legacy/themes/Peafowl/lib/peafowl.min.css | 2 +- .../themes/Peafowl/snippets/footer.js.php | 1 + .../Peafowl/snippets/form_advanced_search.php | 7 +- content/legacy/themes/Peafowl/style.css | 122 +- content/legacy/themes/Peafowl/style.min.css | 2 +- .../legacy/themes/Peafowl/views/api-v1.php | 8 +- .../Peafowl/views/dashboard/bulk-importer.php | 4 +- .../Peafowl/views/dashboard/settings/api.php | 59 + .../views/dashboard/settings/email.php | 24 +- .../views/dashboard/settings/file-uploads.php | 27 +- .../views/dashboard/settings/listings.php | 3 +- .../{asset-storage.php => site-storage.php} | 7 +- .../views/dashboard/settings/theme.php | 11 + ...xternal-storage.php => upload-storage.php} | 7 +- .../themes/Peafowl/views/dashboard/stats.php | 3 + .../views/dashboard/top-sub-bar/settings.php | 2 +- content/pages/default/privacy.html | 6 +- content/pages/default/tos.html | 6 +- 282 files changed, 15241 insertions(+), 11049 deletions(-) delete mode 100644 .github/FUNDING.yml delete mode 100644 .package/4.2.5.txt create mode 100644 .package/4.3.0.txt rename app/{src/Workflow/BaseWorkflow.php => bin/cli} (73%) mode change 100644 => 100755 create mode 100644 app/legacy/commands/cache-flush.php create mode 100644 app/legacy/commands/cache-view.php delete mode 100644 app/routing/admin.api-v4.php delete mode 100644 app/routing/admin.web.php delete mode 100644 app/routing/user.api-v1.php delete mode 100644 app/routing/user.api-v4.php delete mode 100644 app/routing/user.web.php create mode 100644 app/schemas/mysql-5/uploads.sql create mode 100644 app/schemas/mysql-5/uploads_chunks.sql create mode 100644 app/schemas/mysql-8/uploads.sql create mode 100644 app/schemas/mysql-8/uploads_chunks.sql delete mode 100644 app/src/Actions/Auth/AuthVerifyCSRFTokenAction.php delete mode 100644 app/src/Actions/Auth/AuthVerifyRepositoryAccessAction.php delete mode 100644 app/src/Actions/Auth/AuthVerifyResourceAccessAction.php delete mode 100644 app/src/Actions/Database/DatabaseReserveRowAction.php delete mode 100644 app/src/Actions/File/FileFetchSourceAction.php delete mode 100644 app/src/Actions/File/FileNamingAction.php delete mode 100644 app/src/Actions/File/FileUploadAction.php delete mode 100644 app/src/Actions/File/FileValidateAction.php delete mode 100644 app/src/Actions/File/FileVerifyNotDuplicateAction.php delete mode 100644 app/src/Actions/Image/ImageFetchMetaAction.php delete mode 100644 app/src/Actions/Image/ImageFixOrientationAction.php delete mode 100644 app/src/Actions/Image/ImageInsertAction.php delete mode 100644 app/src/Actions/Image/ImageStripMetaAction.php delete mode 100644 app/src/Actions/Image/ImageVerifyMediaAction.php delete mode 100644 app/src/Actions/Legacy/Api/V1/ImageInsertAction.php delete mode 100644 app/src/Actions/Legacy/Api/V1/LegacyApiV1OutputAction.php delete mode 100644 app/src/Actions/Legacy/Api/V1/LegacyApiV1VerifyKeyAction.php delete mode 100644 app/src/Actions/Storage/StorageGetForAssetAction.php delete mode 100644 app/src/Actions/Storage/StorageGetForUserAction.php delete mode 100644 app/src/Controllers/Api/V1/Upload/UploadPostController.php delete mode 100644 app/src/Controllers/Api/V4/Album/AlbumDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/Album/AlbumGetController.php delete mode 100644 app/src/Controllers/Api/V4/Album/AlbumPatchController.php delete mode 100644 app/src/Controllers/Api/V4/Album/AlbumPostController.php delete mode 100644 app/src/Controllers/Api/V4/Album/Like/AlbumLikeDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/Album/Like/AlbumLikePostController.php delete mode 100644 app/src/Controllers/Api/V4/Ban/Ip/BanIpDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/Ban/Ip/BanIpPatchController.php delete mode 100644 app/src/Controllers/Api/V4/Ban/Ip/BanIpPostController.php delete mode 100644 app/src/Controllers/Api/V4/Category/CategoryPostController.php delete mode 100644 app/src/Controllers/Api/V4/File/FilePostController.php delete mode 100644 app/src/Controllers/Api/V4/Image/Bulk/ImageBulkPatchController.php delete mode 100644 app/src/Controllers/Api/V4/Image/ImageGetController.php delete mode 100644 app/src/Controllers/Api/V4/Image/ImagePatchController.php delete mode 100644 app/src/Controllers/Api/V4/Image/ImagePostController.php delete mode 100644 app/src/Controllers/Api/V4/Image/Like/ImageLikeDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/Image/Like/ImageLikePostController.php delete mode 100644 app/src/Controllers/Api/V4/Stat/Rebuild/StatRebuildPostController.php delete mode 100644 app/src/Controllers/Api/V4/Storage/Migrate/StorageMigratePostController.php delete mode 100644 app/src/Controllers/Api/V4/Storage/Stat/Regen/StorageStatRegenPostController.php delete mode 100644 app/src/Controllers/Api/V4/Storage/StoragePostController.php delete mode 100644 app/src/Controllers/Api/V4/Tool/Id/Decode/ToolDecodeIdGetController.php delete mode 100644 app/src/Controllers/Api/V4/Tool/Id/Encode/ToolEncodeIdGetController.php delete mode 100644 app/src/Controllers/Api/V4/Tool/Probe/Email/ToolProbeEmailPostController.php delete mode 100644 app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarPostController.php delete mode 100644 app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundPostController.php delete mode 100644 app/src/Controllers/Api/V4/User/Export/UserExportGetController.php delete mode 100644 app/src/Controllers/Api/V4/User/Follow/UserFollowDeleteController.php delete mode 100644 app/src/Controllers/Api/V4/User/Follow/UserFollowPostController.php delete mode 100644 app/src/Controllers/Api/V4/User/Setting/UserSettingPatchController.php delete mode 100644 app/src/Controllers/Api/V4/User/UserGetController.php delete mode 100644 app/src/Controllers/Api/V4/User/UserPostController.php delete mode 100644 app/src/Controllers/LegacyController.php delete mode 100644 app/src/Controllers/WorkflowController.php delete mode 100644 app/src/Controllers/functions.php delete mode 100644 app/src/Database/Database.php delete mode 100644 app/src/Database/EntitiesIo.php delete mode 100644 app/src/Database/EntitiesIoInterface.php delete mode 100644 app/src/Database/EntityIo.php delete mode 100644 app/src/Database/EntityIoInterface.php delete mode 100644 app/src/Database/Traits/GetWhereEqualsTrait.php delete mode 100644 app/src/Encoding/functions.php delete mode 100644 app/src/File/functions.php delete mode 100644 app/src/HashId/HashId.php delete mode 100644 app/src/Image/ImageHashInstance.php delete mode 100644 app/src/Image/ImageManagerInstance.php delete mode 100644 app/src/Image/functions.php delete mode 100644 app/src/Job/Job.php create mode 100644 app/src/Legacy/Classes/Cache.php create mode 100644 app/src/Legacy/Classes/Categories.php create mode 100644 app/src/Legacy/Classes/ExifTool.php create mode 100644 app/src/Legacy/Classes/ExifTran.php create mode 100644 app/src/Legacy/Classes/KeyValue.php create mode 100644 app/src/Legacy/Classes/KeyValueInterface.php create mode 100644 app/src/Legacy/Classes/KeyValueNull.php create mode 100644 app/src/Legacy/Classes/Tags.php create mode 100644 app/src/Legacy/Classes/Traits/BinaryTrait.php create mode 100644 app/src/Legacy/Classes/Uploads.php delete mode 100644 app/src/Storage/Storage.php delete mode 100644 app/src/Storage/StorageInterface.php create mode 100644 app/src/Vars/RequestHeadersVar.php delete mode 100644 app/src/Workflow/functions.php delete mode 100644 app/src/Workflows/Album/AlbumDeleteWorkflow.php delete mode 100644 app/src/Workflows/Album/AlbumGetWorkflow.php delete mode 100644 app/src/Workflows/Album/AlbumPatchWorkflow.php delete mode 100644 app/src/Workflows/Album/AlbumPostWorkflow.php delete mode 100644 app/src/Workflows/Album/Like/AlbumLikeDeleteWorkflow.php delete mode 100644 app/src/Workflows/Album/Like/AlbumLikePostWorkflow.php delete mode 100644 app/src/Workflows/Ban/Ip/BanIpDeleteWorkflow.php delete mode 100644 app/src/Workflows/Ban/Ip/BanIpPatchWorkflow.php delete mode 100644 app/src/Workflows/Ban/Ip/BanIpPostWorkflow.php delete mode 100644 app/src/Workflows/Category/CategoryPostWorkflow.php delete mode 100644 app/src/Workflows/Image/Bulk/ImageBulkPatchWorkflow.php delete mode 100644 app/src/Workflows/Image/ImageGetWorkflow.php delete mode 100644 app/src/Workflows/Image/ImagePatchWorkflow.php delete mode 100644 app/src/Workflows/Image/ImagePostWorkflow.php delete mode 100644 app/src/Workflows/Image/Like/ImageLikeDeleteWorkflow.php delete mode 100644 app/src/Workflows/Image/Like/ImageLikePostWorkflow.php delete mode 100644 app/src/Workflows/Legacy/LegacyRouteWorkflow.php delete mode 100644 app/src/Workflows/Legacy/LegacyUploadPostWorkflow.php delete mode 100644 app/src/Workflows/Stat/Rebuild/StatRebuildPostWorkflow.php delete mode 100644 app/src/Workflows/Storage/Migrate/StorageMigratePostWorkflow.php delete mode 100644 app/src/Workflows/Storage/Stat/Regen/StorageStatsRegenPostWorkflow.php delete mode 100644 app/src/Workflows/Storage/StoragePostWorkflow.php delete mode 100644 app/src/Workflows/Tool/Id/Decode/ToolDecodeIdGetWorkflow.php delete mode 100644 app/src/Workflows/Tool/Id/Encode/ToolEncodeIdGetWorkflow.php delete mode 100644 app/src/Workflows/Tool/Probe/Email/ToolProbeEmailPostWorkflow.php delete mode 100644 app/src/Workflows/User/Asset/Avatar/UserAssetAvatarDeleteWorkflow.php delete mode 100644 app/src/Workflows/User/Asset/Avatar/UserAssetAvatarPostWorkflow.php delete mode 100644 app/src/Workflows/User/Asset/Background/UserAssetBackgroundDeleteWorkflow.php delete mode 100644 app/src/Workflows/User/Asset/Background/UserAssetBackgroundPostWorkflow.php delete mode 100644 app/src/Workflows/User/Export/UserExportGetWorkflow.php delete mode 100644 app/src/Workflows/User/Follow/UserFollowDeleteWorkflow.php delete mode 100644 app/src/Workflows/User/Follow/UserFollowPostWorkflow.php delete mode 100644 app/src/Workflows/User/UserPostWorkflow.php delete mode 100644 content/images/system/default/home_cover.avif create mode 100644 content/legacy/themes/Peafowl/lib/js/re-chevereto.js create mode 100644 content/legacy/themes/Peafowl/lib/js/xxhash-wasm.js create mode 100644 content/legacy/themes/Peafowl/views/dashboard/settings/api.php rename content/legacy/themes/Peafowl/views/dashboard/settings/{asset-storage.php => site-storage.php} (77%) rename content/legacy/themes/Peafowl/views/dashboard/settings/{external-storage.php => upload-storage.php} (95%) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 56d8d7c..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1 +0,0 @@ -custom: ['https://chevereto.com/pricing'] diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 957f0d6..43ed4b7 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -46,8 +46,7 @@ jobs: chevereto/chevereto ${{ env.GHCR_SLUG }} tags: | - type=ref,event=branch - type=ref,event=pr + type=raw,value=latest,enable={{is_default_branch}} type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} diff --git a/.package/4.2.5.txt b/.package/4.2.5.txt deleted file mode 100644 index 982714e..0000000 --- a/.package/4.2.5.txt +++ /dev/null @@ -1,9 +0,0 @@ -Chevereto 4.2.5 (2025-01-31) - -- Added `putenv` to integrity-check -- Fixed "Twitter" branding assets to "X" -- Fixed bug in account confirmation process -- Fixed bug in guest owned content editing -- Fixed bug in search functionality -- Fixed bug in tags per file limitation -- Fixed bug with not working local storage in Chevereto Lite diff --git a/.package/4.3.0.txt b/.package/4.3.0.txt new file mode 100644 index 0000000..cb289b2 --- /dev/null +++ b/.package/4.3.0.txt @@ -0,0 +1,50 @@ +Chevereto 4.3.0 (2025-05-13) + +- Added API dashboard settings page +- Added application-level categories cache +- Added application-level guest listing cache +- Added application-level pages cache +- Added application-level settings cache +- Added application-level top tags cache +- Added application-level user albums cache +- Added application-level variables cache +- Added cache-flush command +- Added cache-view command +- Added CHEVERETO_ENABLE_API_USER +- Added CHEVERETO_MAX_LISTING_ITEMS_PER_PAGE limit +- Added CHEVERETO_MAX_TAGS limit +- Added chunked uploads +- Added circles for user avatars +- Added configurable API availability +- Added connect URL display for each login provider +- Added customizable semantics for file concerns +- Added customizable semantics for tag concerns +- Added customizable semantics for video concerns +- Added explicit instructions to "Something went wrong" message +- Added lossless JPEG auto-orientation using ExifTran +- Added lossless metadata removal using ExifTool +- Added more database composite indexes +- Added option to disable user color palette selection +- Added restricted password reset after repeated failures +- Added restricted two-factor access after repeated failures +- Added support for Cloudflare Turnstile captcha +- Added support for GoPro 360 photos +- Fixed bug affecting EXIF read for Sony cameras +- Fixed bug affecting private sub-albums +- Fixed bug in upload queue handler +- Fixed bug on upgrading.php +- Improved Dashboard settings menu sort display +- Improved database schema integer types +- Improved listing database queries +- Improved search engine (boolean matching) +- Improved stats query handling +- Improved user albums query +- Removed guest upload session binding +- Removed maximum upload limit imposed by php.ini +- Removed sendmail for Docker servicing +- Removed support for ModerateContent +- Removed unused dependencies and files +- Renamed "Asset storage" to "Site storage" +- Renamed "External storage" to "Upload storage" +- Renamed app/bin/legacy to app/bin/cli +- Updated file checksum algo to xxh64 diff --git a/README.md b/README.md index eee2a97..ad15fdf 100644 --- a/README.md +++ b/README.md @@ -9,23 +9,33 @@ [![Chevereto Docs](https://img.shields.io/badge/chevereto-docs-50C878?style=flat-square)](https://v4-docs.chevereto.com/) [![Chevereto Community](https://img.shields.io/badge/chevereto-community-blue?style=flat-square)](https://chevereto.com/community) [![Chevereto Demo](https://img.shields.io/badge/chevereto-demo-d4af37?style=flat-square&color=red)](https://demo.chevereto.com) -[![AGPL-3.0-only](https://img.shields.io/github/license/chevereto/chevereto?style=flat-square)](LICENSE) -[![Legacy stars](https://img.shields.io/github/stars/rodber/chevereto-free?style=flat-square&logo=github&label=Legacy%20stars&color=gold)](https://github.com/rodber/chevereto-free) +[![Chevereto Free](https://img.shields.io/badge/chevereto-editions-gold?style=flat-square)](https://v4-docs.chevereto.com/introduction/editions/compare.html) [![Awesome F/OSS](https://img.shields.io/badge/Awesome_F%2FOSS-Certified-black?colorA=&colorB=874efe&style=flat-square)](https://awsmfoss.com/chevereto/) > 🔔 [Subscribe](https://chevereto.com/go/newsletter) to don't miss any update regarding Chevereto. Chevereto is a robust, self-hosted media-sharing platform that prioritizes flexibility and control. It enables you to build and manage a media-sharing website on your own server, granting you complete autonomy over your hosting environment and policies. With Chevereto, you eliminate the risk of platform restrictions and shutdowns, ensuring your site operates entirely on your terms. -This is the repository for **Chevereto Free** edition. You can [compare editions](https://v4-docs.chevereto.com/introduction/editions/compare.html) to find the Chevereto edition that best suits your needs. - ![screen](.github/screen/user-listing-selected.webp) +## Features + +Chevereto offers a comprehensive suite of features that make it the ultimate image and video sharing software: + +* **Media Management**: Support for images, videos, categories, tags and albums with advanced organization tools +* **User Experience**: Customizable listings, responsive design, and intuitive user interface +* **Privacy Controls**: Granular content privacy settings and user management +* **Performance**: Optimized for speed with CDN support, caching, and image optimization +* **Customization**: Turnkey options, language, and extensive API for integration + +You can check the complete list of features in our [Features page](https://chevereto.com/features) and you can also [compare Chevereto editions](https://v4-docs.chevereto.com/introduction/editions/compare.html). + ## Requirements -* A [webserver](https://v4-docs.chevereto.com/application/stack/web-server.html) (Apache recommended) -* [PHP](https://v4-docs.chevereto.com/application/stack/php.html) 8.1+ with [extensions](https://v4-docs.chevereto.com/application/stack/php.html#extensions) -* [MySQL Server](https://v4-docs.chevereto.com/application/stack/mysql-server.html) 8.0.1+ or MariaDB Server 10.2.2+ +* [Webserver](https://v4-docs.chevereto.com/application/stack/web-server.html) +* [PHP](https://v4-docs.chevereto.com/application/stack/php.html) +* [MySQL Server](https://v4-docs.chevereto.com/application/stack/mysql-server.html) (MariaDB Server) +* [Redis](https://v4-docs.chevereto.com/application/stack/redis.html) (optional) ## Download diff --git a/app/src/Workflow/BaseWorkflow.php b/app/bin/cli old mode 100644 new mode 100755 similarity index 73% rename from app/src/Workflow/BaseWorkflow.php rename to app/bin/cli index 556695f..1e9b2f3 --- a/app/src/Workflow/BaseWorkflow.php +++ b/app/bin/cli @@ -1,3 +1,4 @@ +#!/usr/bin/env php =5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0|^5.0|^6.0|^7.0", - "satooshi/php-coveralls": "^2.0" - }, - "suggest": { - "ext-gmp": "GD or ImageMagick is required", - "ext-imagick": "GD or ImageMagick is required" - }, - "type": "library", - "autoload": { - "psr-4": { - "Jenssegers\\ImageHash\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kenneth Rapp" - }, - { - "name": "Jens Segers", - "homepage": "https://jenssegers.com" - } - ], - "description": "Perceptual image hashing for PHP", - "homepage": "https://github.com/jenssegers/imagehash", - "keywords": [ - "ahash", - "dhash", - "hash", - "image hash", - "imagehash", - "perceptual", - "phash" - ], - "support": { - "issues": "https://github.com/jenssegers/imagehash/issues", - "source": "https://github.com/jenssegers/imagehash/tree/master" - }, - "time": "2018-05-05T15:27:52+00:00" - }, { "name": "jeroendesloovere/xmp-metadata-extractor", "version": "v2.0.0", @@ -2269,173 +2261,31 @@ }, "time": "2018-05-30T08:34:23+00:00" }, - { - "name": "league/flysystem", - "version": "2.5.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/flysystem.git", - "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", - "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", - "shasum": "" - }, - "require": { - "ext-json": "*", - "league/mime-type-detection": "^1.0.0", - "php": "^7.2 || ^8.0" - }, - "conflict": { - "guzzlehttp/ringphp": "<1.1.1" - }, - "require-dev": { - "async-aws/s3": "^1.5", - "async-aws/simple-s3": "^1.0", - "aws/aws-sdk-php": "^3.132.4", - "composer/semver": "^3.0", - "ext-fileinfo": "*", - "ext-ftp": "*", - "friendsofphp/php-cs-fixer": "^3.2", - "google/cloud-storage": "^1.23", - "phpseclib/phpseclib": "^2.0", - "phpstan/phpstan": "^0.12.26", - "phpunit/phpunit": "^8.5 || ^9.4", - "sabre/dav": "^4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\Flysystem\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "File storage abstraction for PHP", - "keywords": [ - "WebDAV", - "aws", - "cloud", - "file", - "files", - "filesystem", - "filesystems", - "ftp", - "s3", - "sftp", - "storage" - ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/2.5.0" - }, - "funding": [ - { - "url": "https://ecologi.com/frankdejonge", - "type": "custom" - }, - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2022-09-17T21:02:32+00:00" - }, - { - "name": "league/mime-type-detection", - "version": "1.16.0", - "source": { - "type": "git", - "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", - "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", - "shasum": "" - }, - "require": { - "ext-fileinfo": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^3.2", - "phpstan/phpstan": "^0.12.68", - "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "League\\MimeTypeDetection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Frank de Jonge", - "email": "info@frankdejonge.nl" - } - ], - "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" - }, - "funding": [ - { - "url": "https://github.com/frankdejonge", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/league/flysystem", - "type": "tidelift" - } - ], - "time": "2024-09-21T08:32:55+00:00" - }, { "name": "lychee-org/php-exif", - "version": "v0.7.14", + "version": "v1.0.2", "source": { "type": "git", "url": "https://github.com/LycheeOrg/php-exif.git", - "reference": "c0d1ce46b1bf55d951f9adcc95b3b417b7f1e76c" + "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/c0d1ce46b1bf55d951f9adcc95b3b417b7f1e76c", - "reference": "c0d1ce46b1bf55d951f9adcc95b3b417b7f1e76c", + "url": "https://api.github.com/repos/LycheeOrg/php-exif/zipball/12c4976d2dea44fc4eb3b9dd33428b95ba7461c0", + "reference": "12c4976d2dea44fc4eb3b9dd33428b95ba7461c0", "shasum": "" }, "require": { "ext-fileinfo": "*", - "neitanod/forceutf8": "^2.0.4", - "php": "^8.0", + "fylax/forceutf8": "^3.0.1", + "php": "^8.1", "php-ffmpeg/php-ffmpeg": "^1.0", "thecodingmachine/safe": "^2.2" }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.3", "infection/infection": "^0.26.13", - "lychee-org/phpstan-lychee": "dev-master", + "lychee-org/phpstan-lychee": "^1.0.1", "php-parallel-lint/php-parallel-lint": "^1.2", "phpmd/phpmd": "^2.9", "phpunit/phpunit": "^9.5.10", @@ -2480,9 +2330,108 @@ ], "support": { "issues": "https://github.com/LycheeOrg/php-exif/issues", - "source": "https://github.com/LycheeOrg/php-exif/tree/v0.7.14" + "source": "https://github.com/LycheeOrg/php-exif/tree/v1.0.2" }, - "time": "2022-10-28T15:10:47+00:00" + "time": "2023-04-11T11:03:27+00:00" + }, + { + "name": "matthiasmullie/scrapbook", + "version": "1.4.9", + "source": { + "type": "git", + "url": "https://github.com/matthiasmullie/scrapbook.git", + "reference": "da4178c1882136a8931ffd791df2b84a5aa74219" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/matthiasmullie/scrapbook/zipball/da4178c1882136a8931ffd791df2b84a5aa74219", + "reference": "da4178c1882136a8931ffd791df2b84a5aa74219", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "psr/cache": "^1.0||~2.0", + "psr/simple-cache": "^1.0||~2.0" + }, + "provide": { + "psr/cache-implementation": "^1.0||~2.0", + "psr/simple-cache-implementation": "^1.0||~2.0" + }, + "require-dev": { + "ext-pcntl": "*", + "friendsofphp/php-cs-fixer": ">=2.0", + "phpunit/phpunit": ">=4.8" + }, + "suggest": { + "couchbase/couchbase": ">=2.0", + "ext-apc": ">=3.1.1", + "ext-couchbase": ">=2.0.0", + "ext-memcached": ">=2.0.0", + "ext-pdo": ">=0.1.0", + "ext-redis": ">=2.2.0 || 0.0.0.0", + "league/flysystem": ">=1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "MatthiasMullie\\Scrapbook\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Matthias Mullie", + "email": "scrapbook@mullie.eu", + "homepage": "https://www.mullie.eu", + "role": "Developer" + } + ], + "description": "Scrapbook is a PHP cache library, with adapters for e.g. Memcached, Redis, Couchbase, APC(u), SQL and additional capabilities (e.g. transactions, stampede protection) built on top.", + "homepage": "https://scrapbook.cash", + "keywords": [ + "Buffer", + "Flysystem", + "apc", + "buffered", + "cache", + "caching", + "commit", + "couchbase", + "filesystem", + "key", + "memcached", + "mitigation", + "mysql", + "postgresql", + "protection", + "psr-16", + "psr-6", + "psr-cache", + "psr-simple-cache", + "redis", + "rollback", + "sql", + "sqlite", + "stampede", + "store", + "transaction", + "transactional", + "value" + ], + "support": { + "issues": "https://github.com/matthiasmullie/scrapbook/issues", + "source": "https://github.com/matthiasmullie/scrapbook/tree/1.4.9" + }, + "funding": [ + { + "url": "https://github.com/matthiasmullie", + "type": "github" + } + ], + "time": "2022-11-10T09:28:49+00:00" }, { "name": "middlewares/utils", @@ -2548,16 +2497,16 @@ }, { "name": "mlocati/ip-lib", - "version": "1.18.1", + "version": "1.20.0", "source": { "type": "git", "url": "https://github.com/mlocati/ip-lib.git", - "reference": "08bb43b4949069c543ebdf099a6b2c322d0172ab" + "reference": "fd45fc3bf08ed6c7e665e2e70562082ac954afd4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/08bb43b4949069c543ebdf099a6b2c322d0172ab", - "reference": "08bb43b4949069c543ebdf099a6b2c322d0172ab", + "url": "https://api.github.com/repos/mlocati/ip-lib/zipball/fd45fc3bf08ed6c7e665e2e70562082ac954afd4", + "reference": "fd45fc3bf08ed6c7e665e2e70562082ac954afd4", "shasum": "" }, "require": { @@ -2603,7 +2552,7 @@ ], "support": { "issues": "https://github.com/mlocati/ip-lib/issues", - "source": "https://github.com/mlocati/ip-lib/tree/1.18.1" + "source": "https://github.com/mlocati/ip-lib/tree/1.20.0" }, "funding": [ { @@ -2615,7 +2564,7 @@ "type": "other" } ], - "time": "2024-10-29T15:44:19+00:00" + "time": "2025-02-04T17:30:58+00:00" }, { "name": "mobiledetect/mobiledetectlib", @@ -2679,47 +2628,6 @@ ], "time": "2023-11-07T21:57:25+00:00" }, - { - "name": "neitanod/forceutf8", - "version": "v2.0.4", - "source": { - "type": "git", - "url": "https://github.com/neitanod/forceutf8.git", - "reference": "c1fbe70bfb5ad41b8ec5785056b0e308b40d4831" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/neitanod/forceutf8/zipball/c1fbe70bfb5ad41b8ec5785056b0e308b40d4831", - "reference": "c1fbe70bfb5ad41b8ec5785056b0e308b40d4831", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "autoload": { - "psr-0": { - "ForceUTF8\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastián Grignoli", - "email": "grignoli@gmail.com" - } - ], - "description": "PHP Class Encoding featuring popular Encoding::toUTF8() function --formerly known as forceUTF8()-- that fixes mixed encoded strings.", - "homepage": "https://github.com/neitanod/forceutf8", - "support": { - "issues": "https://github.com/neitanod/forceutf8/issues", - "source": "https://github.com/neitanod/forceutf8/tree/master" - }, - "time": "2019-12-10T14:09:14+00:00" - }, { "name": "nikic/fast-route", "version": "v1.3.0", @@ -3068,73 +2976,18 @@ }, "time": "2020-10-15T08:29:30+00:00" }, - { - "name": "php-ds/php-ds", - "version": "v1.5.0", - "source": { - "type": "git", - "url": "https://github.com/php-ds/polyfill.git", - "reference": "7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-ds/polyfill/zipball/7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4", - "reference": "7b2c5f1843466d50769a0682ce6fa9ddaaa99cb4", - "shasum": "" - }, - "require": { - "ext-json": "*", - "php": ">=7.0" - }, - "provide": { - "ext-ds": "1.5.0" - }, - "require-dev": { - "php-ds/tests": "^1.5" - }, - "suggest": { - "ext-ds": "to improve performance and reduce memory usage" - }, - "type": "library", - "autoload": { - "psr-4": { - "Ds\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Rudi Theunissen", - "email": "rudolf.theunissen@gmail.com" - } - ], - "keywords": [ - "data structures", - "ds", - "php", - "polyfill" - ], - "support": { - "issues": "https://github.com/php-ds/polyfill/issues", - "source": "https://github.com/php-ds/polyfill/tree/v1.5.0" - }, - "time": "2023-12-19T16:52:21+00:00" - }, { "name": "php-ffmpeg/php-ffmpeg", - "version": "v1.3.1", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/PHP-FFMpeg/PHP-FFMpeg.git", - "reference": "0fbbc4c6a6336155679adc800616001ae3328c7a" + "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/0fbbc4c6a6336155679adc800616001ae3328c7a", - "reference": "0fbbc4c6a6336155679adc800616001ae3328c7a", + "url": "https://api.github.com/repos/PHP-FFMpeg/PHP-FFMpeg/zipball/8e74bdc07ad200da7a6cfb21ec2652875e4368e0", + "reference": "8e74bdc07ad200da7a6cfb21ec2652875e4368e0", "shasum": "" }, "require": { @@ -3208,22 +3061,22 @@ ], "support": { "issues": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/issues", - "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.1" + "source": "https://github.com/PHP-FFMpeg/PHP-FFMpeg/tree/v1.3.2" }, - "time": "2025-01-10T20:23:57+00:00" + "time": "2025-04-01T20:36:46+00:00" }, { "name": "phpmailer/phpmailer", - "version": "v6.9.3", + "version": "v6.10.0", "source": { "type": "git", "url": "https://github.com/PHPMailer/PHPMailer.git", - "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e" + "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2f5c94fe7493efc213f643c23b1b1c249d40f47e", - "reference": "2f5c94fe7493efc213f643c23b1b1c249d40f47e", + "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", + "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144", "shasum": "" }, "require": { @@ -3283,7 +3136,7 @@ "description": "PHPMailer is a full-featured email creation and transfer class for PHP", "support": { "issues": "https://github.com/PHPMailer/PHPMailer/issues", - "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.3" + "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.10.0" }, "funding": [ { @@ -3291,7 +3144,7 @@ "type": "github" } ], - "time": "2024-11-24T18:04:13+00:00" + "time": "2025-04-24T15:19:31+00:00" }, { "name": "phpseclib/bcmath_compat", @@ -3957,6 +3810,57 @@ }, "time": "2021-05-03T11:20:27+00:00" }, + { + "name": "psr/simple-cache", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "reference": "8707bf3cea6f710bf6ef05491234e3ab06f6432a", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/2.0.0" + }, + "time": "2021-10-29T13:22:09+00:00" + }, { "name": "psy/psysh", "version": "v0.11.22", @@ -4083,16 +3987,16 @@ }, { "name": "ramsey/collection", - "version": "2.0.0", + "version": "2.1.1", "source": { "type": "git", "url": "https://github.com/ramsey/collection.git", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", - "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "url": "https://api.github.com/repos/ramsey/collection/zipball/344572933ad0181accbf4ba763e85a0306a8c5e2", + "reference": "344572933ad0181accbf4ba763e85a0306a8c5e2", "shasum": "" }, "require": { @@ -4100,25 +4004,22 @@ }, "require-dev": { "captainhook/plugin-composer": "^5.3", - "ergebnis/composer-normalize": "^2.28.3", - "fakerphp/faker": "^1.21", + "ergebnis/composer-normalize": "^2.45", + "fakerphp/faker": "^1.24", "hamcrest/hamcrest-php": "^2.0", - "jangregor/phpstan-prophecy": "^1.0", - "mockery/mockery": "^1.5", + "jangregor/phpstan-prophecy": "^2.1", + "mockery/mockery": "^1.6", "php-parallel-lint/php-console-highlighter": "^1.0", - "php-parallel-lint/php-parallel-lint": "^1.3", - "phpcsstandards/phpcsutils": "^1.0.0-rc1", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.2", - "phpstan/phpstan": "^1.9", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.3", - "phpunit/phpunit": "^9.5", - "psalm/plugin-mockery": "^1.1", - "psalm/plugin-phpunit": "^0.18.4", - "ramsey/coding-standard": "^2.0.3", - "ramsey/conventional-commits": "^1.3", - "vimeo/psalm": "^5.4" + "php-parallel-lint/php-parallel-lint": "^1.4", + "phpspec/prophecy-phpunit": "^2.3", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^10.5", + "ramsey/coding-standard": "^2.3", + "ramsey/conventional-commits": "^1.6", + "roave/security-advisories": "dev-latest" }, "type": "library", "extra": { @@ -4156,19 +4057,9 @@ ], "support": { "issues": "https://github.com/ramsey/collection/issues", - "source": "https://github.com/ramsey/collection/tree/2.0.0" + "source": "https://github.com/ramsey/collection/tree/2.1.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", - "type": "tidelift" - } - ], - "time": "2022-12-31T21:50:55+00:00" + "time": "2025-03-22T05:38:12+00:00" }, { "name": "ramsey/uuid", @@ -5215,16 +5106,16 @@ }, { "name": "symfony/console", - "version": "v6.4.17", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04" + "reference": "a3011c7b7adb58d89f6c0d822abb641d7a5f9719" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/799445db3f15768ecc382ac5699e6da0520a0a04", - "reference": "799445db3f15768ecc382ac5699e6da0520a0a04", + "url": "https://api.github.com/repos/symfony/console/zipball/a3011c7b7adb58d89f6c0d822abb641d7a5f9719", + "reference": "a3011c7b7adb58d89f6c0d822abb641d7a5f9719", "shasum": "" }, "require": { @@ -5289,7 +5180,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v6.4.17" + "source": "https://github.com/symfony/console/tree/v6.4.21" }, "funding": [ { @@ -5305,7 +5196,7 @@ "type": "tidelift" } ], - "time": "2024-12-07T12:07:30+00:00" + "time": "2025-04-07T15:42:41+00:00" }, { "name": "symfony/deprecation-contracts", @@ -5376,7 +5267,7 @@ }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -5435,7 +5326,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -5455,7 +5346,7 @@ }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -5513,7 +5404,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -5533,7 +5424,7 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -5594,7 +5485,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -5614,19 +5505,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -5674,7 +5566,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -5690,11 +5582,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php73", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", @@ -5750,7 +5642,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.32.0" }, "funding": [ { @@ -5770,16 +5662,16 @@ }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -5830,7 +5722,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -5846,20 +5738,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/process", - "version": "v6.4.15", + "version": "v6.4.20", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", - "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", + "url": "https://api.github.com/repos/symfony/process/zipball/e2a61c16af36c9a07e5c9906498b73e091949a20", + "reference": "e2a61c16af36c9a07e5c9906498b73e091949a20", "shasum": "" }, "require": { @@ -5891,7 +5783,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v6.4.15" + "source": "https://github.com/symfony/process/tree/v6.4.20" }, "funding": [ { @@ -5907,7 +5799,7 @@ "type": "tidelift" } ], - "time": "2024-11-06T14:19:14+00:00" + "time": "2025-03-10T17:11:00+00:00" }, { "name": "symfony/service-contracts", @@ -5994,16 +5886,16 @@ }, { "name": "symfony/string", - "version": "v6.4.15", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + "reference": "73e2c6966a5aef1d4892873ed5322245295370c6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", - "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "url": "https://api.github.com/repos/symfony/string/zipball/73e2c6966a5aef1d4892873ed5322245295370c6", + "reference": "73e2c6966a5aef1d4892873ed5322245295370c6", "shasum": "" }, "require": { @@ -6060,7 +5952,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v6.4.15" + "source": "https://github.com/symfony/string/tree/v6.4.21" }, "funding": [ { @@ -6076,20 +5968,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:12+00:00" + "time": "2025-04-18T15:23:29+00:00" }, { "name": "symfony/var-dumper", - "version": "v6.4.18", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "4ad10cf8b020e77ba665305bb7804389884b4837" + "reference": "22560f80c0c5cd58cc0bcaf73455ffd81eb380d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/4ad10cf8b020e77ba665305bb7804389884b4837", - "reference": "4ad10cf8b020e77ba665305bb7804389884b4837", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/22560f80c0c5cd58cc0bcaf73455ffd81eb380d5", + "reference": "22560f80c0c5cd58cc0bcaf73455ffd81eb380d5", "shasum": "" }, "require": { @@ -6145,7 +6037,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v6.4.18" + "source": "https://github.com/symfony/var-dumper/tree/v6.4.21" }, "funding": [ { @@ -6161,20 +6053,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:26:11+00:00" + "time": "2025-04-09T07:34:50+00:00" }, { "name": "symfony/var-exporter", - "version": "v6.4.13", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51" + "reference": "717e7544aa99752c54ecba5c0e17459c48317472" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", - "reference": "0f605f72a363f8743001038a176eeb2a11223b51", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/717e7544aa99752c54ecba5c0e17459c48317472", + "reference": "717e7544aa99752c54ecba5c0e17459c48317472", "shasum": "" }, "require": { @@ -6222,7 +6114,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" + "source": "https://github.com/symfony/var-exporter/tree/v6.4.21" }, "funding": [ { @@ -6238,20 +6130,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:18:03+00:00" + "time": "2025-04-27T21:06:26+00:00" }, { "name": "symfony/yaml", - "version": "v6.4.18", + "version": "v6.4.21", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5" + "reference": "f01987f45676778b474468aa266fe2eda1f2bc7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", - "reference": "bf598c9d9bb4a22f495a4e26e4c4fce2f8ecefc5", + "url": "https://api.github.com/repos/symfony/yaml/zipball/f01987f45676778b474468aa266fe2eda1f2bc7e", + "reference": "f01987f45676778b474468aa266fe2eda1f2bc7e", "shasum": "" }, "require": { @@ -6294,7 +6186,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v6.4.18" + "source": "https://github.com/symfony/yaml/tree/v6.4.21" }, "funding": [ { @@ -6310,7 +6202,7 @@ "type": "tidelift" } ], - "time": "2025-01-07T09:44:41+00:00" + "time": "2025-04-04T09:48:44+00:00" }, { "name": "thecodingmachine/safe", @@ -6453,16 +6345,16 @@ }, { "name": "xrdebug/php", - "version": "2.0.3", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/xrdebug/php.git", - "reference": "a7dc68d274d585d8506e788eb8b11c07d81b1bd6" + "reference": "83827b79ac9e3ff8a46702c54969d9012e47f472" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/xrdebug/php/zipball/a7dc68d274d585d8506e788eb8b11c07d81b1bd6", - "reference": "a7dc68d274d585d8506e788eb8b11c07d81b1bd6", + "url": "https://api.github.com/repos/xrdebug/php/zipball/83827b79ac9e3ff8a46702c54969d9012e47f472", + "reference": "83827b79ac9e3ff8a46702c54969d9012e47f472", "shasum": "" }, "require": { @@ -6514,9 +6406,9 @@ ], "support": { "issues": "https://github.com/xrdebug/php/issues", - "source": "https://github.com/xrdebug/php/tree/2.0.3" + "source": "https://github.com/xrdebug/php/tree/3.0.0" }, - "time": "2024-12-09T13:25:59+00:00" + "time": "2024-12-25T17:49:34+00:00" }, { "name": "xrdebug/xrdebug", @@ -6660,16 +6552,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.12.1", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", - "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { @@ -6708,7 +6600,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, "funding": [ { @@ -6716,7 +6608,7 @@ "type": "tidelift" } ], - "time": "2024-11-08T17:47:46+00:00" + "time": "2025-04-29T12:36:36+00:00" }, { "name": "phar-io/manifest", @@ -6838,16 +6730,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.12.16", + "version": "1.12.25", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "e0bb5cb78545aae631220735aa706eac633a6be9" + "reference": "e310849a19e02b8bfcbb63147f495d8f872dd96f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e0bb5cb78545aae631220735aa706eac633a6be9", - "reference": "e0bb5cb78545aae631220735aa706eac633a6be9", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/e310849a19e02b8bfcbb63147f495d8f872dd96f", + "reference": "e310849a19e02b8bfcbb63147f495d8f872dd96f", "shasum": "" }, "require": { @@ -6892,7 +6784,7 @@ "type": "github" } ], - "time": "2025-01-21T14:50:05+00:00" + "time": "2025-04-27T12:20:45+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7215,16 +7107,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.22", + "version": "9.6.23", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c" + "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f80235cb4d3caa59ae09be3adf1ded27521d1a9c", - "reference": "f80235cb4d3caa59ae09be3adf1ded27521d1a9c", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", + "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95", "shasum": "" }, "require": { @@ -7235,7 +7127,7 @@ "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.12.1", + "myclabs/deep-copy": "^1.13.1", "phar-io/manifest": "^2.0.4", "phar-io/version": "^3.2.1", "php": ">=7.3", @@ -7298,7 +7190,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.22" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23" }, "funding": [ { @@ -7309,12 +7201,20 @@ "url": "https://github.com/sebastianbergmann", "type": "github" }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, { "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", "type": "tidelift" } ], - "time": "2024-12-05T13:48:26+00:00" + "time": "2025-05-02T06:40:34+00:00" }, { "name": "sebastian/cli-parser", @@ -8281,16 +8181,16 @@ }, { "name": "symplify/easy-coding-standard", - "version": "12.5.8", + "version": "12.5.17", "source": { "type": "git", "url": "https://github.com/easy-coding-standard/easy-coding-standard.git", - "reference": "2bf0e468dc9679f3835c835cd3fd4a25ff6e4e14" + "reference": "9ffb593275f3687a9a7f9b816a67e6a3470e9661" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/2bf0e468dc9679f3835c835cd3fd4a25ff6e4e14", - "reference": "2bf0e468dc9679f3835c835cd3fd4a25ff6e4e14", + "url": "https://api.github.com/repos/easy-coding-standard/easy-coding-standard/zipball/9ffb593275f3687a9a7f9b816a67e6a3470e9661", + "reference": "9ffb593275f3687a9a7f9b816a67e6a3470e9661", "shasum": "" }, "require": { @@ -8326,7 +8226,7 @@ ], "support": { "issues": "https://github.com/easy-coding-standard/easy-coding-standard/issues", - "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.8" + "source": "https://github.com/easy-coding-standard/easy-coding-standard/tree/12.5.17" }, "funding": [ { @@ -8338,7 +8238,7 @@ "type": "github" } ], - "time": "2025-01-31T13:59:38+00:00" + "time": "2025-05-13T13:16:20+00:00" }, { "name": "theseer/tokenizer", diff --git a/app/env-default.php b/app/env-default.php index 96b7540..a90ab67 100644 --- a/app/env-default.php +++ b/app/env-default.php @@ -10,8 +10,17 @@ */ return [ + 'CHEVERETO_BINARY_EXIFTOOL' => 'exiftool', + 'CHEVERETO_BINARY_EXIFTRAN' => 'exiftran', 'CHEVERETO_BINARY_FFMPEG' => 'ffmpeg', 'CHEVERETO_BINARY_FFPROBE' => 'ffprobe', + 'CHEVERETO_CACHE_DRIVER' => 'redis', + 'CHEVERETO_CACHE_HOST' => '', + 'CHEVERETO_CACHE_KEY_PREFIX' => 'chv:', + 'CHEVERETO_CACHE_PASSWORD' => '', + 'CHEVERETO_CACHE_PORT' => '', + 'CHEVERETO_CACHE_TIME_MICRO' => '60', + 'CHEVERETO_CACHE_USER' => '', 'CHEVERETO_CONTEXT' => '', 'CHEVERETO_DB_DRIVER' => 'mysql', 'CHEVERETO_DB_HOST' => 'localhost', @@ -24,6 +33,7 @@ return [ 'CHEVERETO_DEBUG_LEVEL' => '1', 'CHEVERETO_EDITION' => 'pro', 'CHEVERETO_ENABLE_API_GUEST' => '1', + 'CHEVERETO_ENABLE_API_USER' => '1', 'CHEVERETO_ENABLE_BANNERS' => '1', 'CHEVERETO_ENABLE_BULK_IMPORTER' => '1', 'CHEVERETO_ENABLE_CAPTCHA' => '1', @@ -55,7 +65,7 @@ return [ 'CHEVERETO_ENABLE_SEO_ALBUM_URL' => '1', 'CHEVERETO_ENABLE_SEO_IMAGE_URL' => '1', 'CHEVERETO_ENABLE_SERVICE_AKISMET' => '1', - 'CHEVERETO_ENABLE_SERVICE_MODERATECONTENT' => '1', + 'CHEVERETO_ENABLE_SERVICE_MODERATECONTENT' => '0', 'CHEVERETO_ENABLE_SERVICE_PROJECTARACHNID' => '1', 'CHEVERETO_ENABLE_SERVICE_STOPFORUMSPAM' => '1', 'CHEVERETO_ENABLE_STOPWORDS' => '1', @@ -80,18 +90,22 @@ return [ 'CHEVERETO_IMAGE_LIBRARY' => 'imagick', 'CHEVERETO_MAX_ADMINS' => '0', 'CHEVERETO_MAX_ALBUMS' => '0', + 'CHEVERETO_MAX_CACHE_TTL' => '86400', 'CHEVERETO_MAX_CATEGORIES' => '0', + 'CHEVERETO_MAX_CHUNK_UPLOAD_SIZE' => '16M', 'CHEVERETO_MAX_EXECUTION_TIME_SECONDS' => '30', 'CHEVERETO_MAX_FILES' => '0', + 'CHEVERETO_MAX_LISTING_ITEMS_PER_PAGE' => '0', 'CHEVERETO_MAX_LOGIN_PROVIDERS' => '0', 'CHEVERETO_MAX_MANAGERS' => '0', 'CHEVERETO_MAX_MEMORY_SIZE' => '512M', 'CHEVERETO_MAX_PAGES' => '0', - 'CHEVERETO_MAX_POST_SIZE' => '100M', + 'CHEVERETO_MAX_POST_SIZE' => '64M', 'CHEVERETO_MAX_STORAGES' => '0', 'CHEVERETO_MAX_TAGS_PER_FILE' => '0', 'CHEVERETO_MAX_TAGS_PER_LISTING' => '0', 'CHEVERETO_MAX_TAGS' => '0', + 'CHEVERETO_MAX_UPLOAD_FILE_SIZE' => '64M', 'CHEVERETO_MAX_UPLOAD_SIZE' => '100M', 'CHEVERETO_MAX_USER_ALBUMS_LIST' => '500', 'CHEVERETO_MAX_USERS' => '0', diff --git a/app/legacy/commands/cache-flush.php b/app/legacy/commands/cache-flush.php new file mode 100644 index 0000000..87ba9b3 --- /dev/null +++ b/app/legacy/commands/cache-flush.php @@ -0,0 +1,66 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Chevereto\Legacy\Classes\Cache; +use Chevereto\Legacy\Classes\Categories; +use Chevereto\Legacy\Classes\Tags; + +if (! Cache::isEnabled()) { + echo "[ERROR] Cache is not enabled\n"; + exit(255); +} +$keyValue = Cache::instance(); +$redis = $keyValue->redis(); +$prefix = $keyValue->getKey(''); +$topLevel = [ + 'pages_visible', + 'settings', + 'variables', + Categories::CACHE_KEY, + Tags::CACHE_KEY, +]; +$nested = [ + 'ip', + 'l', + 'rl', + 'u', +]; +foreach ($topLevel as $topKey) { + deleteCache($redis, "{$prefix}{$topKey}"); +} +foreach ($nested as $nestedKey) { + iterateCache($redis, "{$prefix}{$nestedKey}:"); +} +iterateCache($redis, $prefix); +function iterateCache(Redis $redis, string $prefix): void +{ + $iterator = null; + while ($iterator !== 0) { + $scan = $redis->scan($iterator, "{$prefix}*"); + foreach ($scan as $key) { + if (str_starts_with($key, "{$prefix}SESSION") + || str_ends_with($key, '.stampede') + ) { + continue; + } + deleteCache($redis, $key); + } + } +} +function deleteCache(Redis $redis, string $key): void +{ + $result = (bool) $redis->del($key); + $status = 'DELETE'; + if ($result === false && ! $redis->get($key)) { + $status = ' 404'; + } + echo "* {$status} > {$key}\n"; +} diff --git a/app/legacy/commands/cache-view.php b/app/legacy/commands/cache-view.php new file mode 100644 index 0000000..11254a0 --- /dev/null +++ b/app/legacy/commands/cache-view.php @@ -0,0 +1,79 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Chevereto\Legacy\Classes\Cache; +use Chevereto\Legacy\Classes\Categories; +use Chevereto\Legacy\Classes\Tags; +use function Chevereto\Legacy\G\format_bytes; + +if (! Cache::isEnabled()) { + echo "[ERROR] Cache is not enabled\n"; + exit(255); +} +$keyValue = Cache::instance(); +$redis = $keyValue->redis(); +$prefix = $keyValue->getKey(''); +$topLevel = [ + 'pages_visible', + 'settings', + 'variables', + Categories::CACHE_KEY, + Tags::CACHE_KEY, +]; +foreach ($topLevel as $topKey) { + $cacheKey = $prefix . $topKey; + deleteCache($redis, $cacheKey); +} +$nested = [ + 'ip', + 'l', + 'rl', + 'u', +]; +foreach ($nested as $nestedKey) { + $iterator = null; + while ($iterator !== 0) { + $scanKeys = $keyValue->redis()->scan($iterator, "{$prefix}{$nestedKey}:*"); + foreach ($scanKeys as $scanKey) { + deleteCache($redis, $scanKey); + } + } +} +function deleteCache(Redis $redis, string $key): void +{ + $exists = $redis->exists($key); + if (! $exists) { + printf( + "| %-60s | %-12s | %-8s |\n", + $key, + '--', + '--' + ); + + return; + } + $ttl = $redis->ttl($key); + if ($ttl === -1) { + $ttlStr = 'no-expire'; + } elseif ($ttl === -2) { + $ttlStr = 'expired'; + } else { + $ttlStr = $ttl; + } + $bytes = $redis->rawCommand('MEMORY', 'USAGE', $key); + $sizeReadable = format_bytes($bytes); + printf( + "| %-60s | %-12s | %-8s |\n", + $key, + $ttlStr, + $sizeReadable + ); +} diff --git a/app/legacy/commands/cron.php b/app/legacy/commands/cron.php index 748345b..efd73b0 100644 --- a/app/legacy/commands/cron.php +++ b/app/legacy/commands/cron.php @@ -40,10 +40,11 @@ if (getSetting('maintenance')) { exit(255); } $jobs = [ - 'deleteExpiredImages', + 'deleteExpiredFiles', 'cleanUnconfirmedUsers', 'removeDeleteLog', 'storageDelete', + 'deleteExpiredUploads', ]; if ((bool) env()['CHEVERETO_ENABLE_UPDATE_CHECK']) { $jobs[] = 'checkForUpdates'; @@ -152,9 +153,9 @@ function storageDelete(): void } echoLocked($job); } -function deleteExpiredImages(): void +function deleteExpiredFiles(): void { - $job = 'delete-expired-images'; + $job = 'delete-expired-files'; $lock = new Lock($job); if ($lock->create()) { Image::deleteExpired(50); @@ -241,3 +242,46 @@ function checkHtaccess() { include __DIR__ . '/htaccess-enforce.php'; } +function deleteExpiredUploads(): void +{ + $job = 'delete-expired-uploads'; + $lock = new Lock($job); + if ($lock->create()) { + $uploadsTable = DB::getTable('uploads'); + $uploadsChunksTable = DB::getTable('uploads_chunks'); + $db = DB::getInstance(); + $db->query( + <<bind(':time', datetime_sub(datetimegmt(), 'P1D')); + $chunks = $db->fetchAll(); + if (! $chunks) { + $lock->destroy(); + + return; + } + $ids = []; + foreach ($chunks as $chunk) { + $ids[] = (int) $chunk['id']; + $chunkPath = $chunk['path']; + if (file_exists($chunkPath)) { + unlink($chunkPath); + } + } + $ids = array_unique($ids); + $idsString = implode(',', $ids); + $db->query( + <<exec(); + $lock->destroy(); + + return; + } + echoLocked($job); +} diff --git a/app/legacy/commands/install.php b/app/legacy/commands/install.php index b9e196b..fd6856c 100644 --- a/app/legacy/commands/install.php +++ b/app/legacy/commands/install.php @@ -15,4 +15,5 @@ if (cheveretoVersionInstalled() !== '') { echo "[ERROR] Chevereto is already installed, try with the update command\n"; exit(255); } + require_once PATH_APP_LEGACY_INSTALL . 'installer.php'; diff --git a/app/legacy/commands/js.php b/app/legacy/commands/js.php index a9e1b88..dac8591 100644 --- a/app/legacy/commands/js.php +++ b/app/legacy/commands/js.php @@ -9,9 +9,14 @@ * file that was distributed with this source code. */ +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; +use function Chevereto\Legacy\G\str_replace_last; + $workingDir = PATH_PUBLIC_CONTENT_LEGACY_THEMES_PEAFOWL_LIB; $target = 'chevereto-all.js'; $outputFile = $workingDir . $target; +$outputMinifiedFile = $workingDir . str_replace_last('.js', '.min.js', $target); echo "* Compile JavaScript\n"; echo "---\n"; $fh = fopen($outputFile, 'w'); @@ -23,6 +28,7 @@ $files = [ 'js/peafowl.js', 'js/images-loaded.js', 'js/load-image.js', + 'js/xxhash-wasm.js', 'js/clipboard.js', 'js/chevereto.js', ]; @@ -37,5 +43,19 @@ foreach ($files as $file) { } fclose($fh); echo "---\n"; -echo "💯 [OK] {$outputFile}\n"; +echo "[OK] {$outputFile}\n"; +$process = new Process([ + 'uglifyjs', + $outputFile, + '-o', + $outputMinifiedFile, + '-c', + '-m', +]); +$process->run(); +if (! $process->isSuccessful()) { + throw new ProcessFailedException($process); +} +echo "[OK] {$outputMinifiedFile}\n"; + exit(0); diff --git a/app/legacy/commands/update.php b/app/legacy/commands/update.php index bb7bf64..8a291e4 100644 --- a/app/legacy/commands/update.php +++ b/app/legacy/commands/update.php @@ -15,4 +15,5 @@ if (cheveretoVersionInstalled() === '') { echo "[ERROR] Chevereto is not installed, try with the install command.\n"; exit(255); } + require_once PATH_APP_LEGACY_INSTALL . 'installer.php'; diff --git a/app/legacy/entrypoints/cli.php b/app/legacy/entrypoints/cli.php index e6397b3..dcc6cbf 100644 --- a/app/legacy/entrypoints/cli.php +++ b/app/legacy/entrypoints/cli.php @@ -9,6 +9,7 @@ * file that was distributed with this source code. */ +use Chevere\ThrowableHandler\ThrowableHandler; use function Chevereto\Legacy\getCheveretoEnv; use function Chevereto\Legacy\loaderHandler; @@ -24,27 +25,34 @@ if ($opts === []) { } $access = $opts['C']; $options = [ + 'bulk-importer', + 'cache-view', + 'cache-flush', 'cron', - 'update', - 'encrypt-secrets', 'decrypt-secrets', + 'encrypt-secrets', 'htaccess-checksum', 'htaccess-enforce', - 'bulk-importer', 'install', - 'langs', 'js', + 'langs', 'password-reset', 'setting-get', 'setting-update', + 'update', 'version', ]; if (! in_array($access, $options, true)) { echo 'Invalid command' . PHP_EOL; exit(255); } +if (defined('APP_BIN_LEGACY')) { + echo 'Note: This CLI is migrating to app/bin/cli' . PHP_EOL . PHP_EOL; +} define('ACCESS', $access); require_once __DIR__ . '/../load/php-boot.php'; +set_error_handler(ThrowableHandler::ERROR_AS_EXCEPTION); +set_exception_handler(ThrowableHandler::CONSOLE); require_once loaderHandler( $_COOKIE, getCheveretoEnv(), diff --git a/app/legacy/install/installer.php b/app/legacy/install/installer.php index 489cea4..f97b68d 100644 --- a/app/legacy/install/installer.php +++ b/app/legacy/install/installer.php @@ -40,7 +40,7 @@ use function Chevereto\Vars\post; if (PHP_SAPI !== 'cli') { /** @var Handler $handler */ - $context = $handler->request_array()[0] ?? false; + $context = $handler->requestArray()[0] ?? false; if (! $context) { throw new LogicException( message('Missing context') @@ -99,7 +99,7 @@ $settings_updates = [ 'email_from_email' => 'from@chevereto.internal', 'email_from_name' => 'Chevereto', 'email_incoming_email' => 'incoming@chevereto.internal', - 'email_mode' => 'mail', + 'email_mode' => env()['CHEVERETO_SERVICING'] === 'server' ? 'mail' : 'smtp', 'email_smtp_server' => '', 'email_smtp_server_password' => '', 'email_smtp_server_port' => '', @@ -626,7 +626,6 @@ $settings_updates = [ 'route_video' => 'video', 'route_audio' => 'audio', 'cache_ttl' => '0', - 'upload_max_filesize_mb' => (string) min(100, bytes_to_mb(get_ini_bytes(ini_get('upload_max_filesize')))), 'image_load_max_filesize_mb' => '5', 'upload_max_filesize_mb_guest' => '10', 'arachnid_api_username' => '', @@ -637,6 +636,18 @@ $settings_updates = [ '4.2.3' => null, '4.2.4' => null, '4.2.5' => null, + '4.3.0' => [ + 'semantics_video' => '', + 'semantics_videos' => '', + 'semantics_tag' => '', + 'semantics_tags' => '', + 'semantics_file' => '', + 'semantics_files' => '', + 'theme_palette_user_select' => 1, + 'upload_max_filesize_mb' => (string) bytes_to_mb(get_ini_bytes(env()['CHEVERETO_MAX_UPLOAD_SIZE'])), + 'enable_api_user' => 1, + 'enable_api_guest' => 0, + ], ]; /** @@ -1031,12 +1042,33 @@ if ($installed_version !== '' && empty($paramsCheck)) { } $isUtf8mb4 = $installed_version === '' || version_compare($installed_version, '3.12.10', '>'); + $modifyIntUnsignedNotNullAutoIncrement = [ + 'op' => 'MODIFY', + 'type' => 'INT UNSIGNED', + 'prop' => 'NOT NULL AUTO_INCREMENT', + ]; + $modifyIntUnsignedNotNull = [ + 'op' => 'MODIFY', + 'type' => 'INT UNSIGNED', + 'prop' => 'NOT NULL', + ]; + $modifyBigIntUnsignedNotNull = array_merge( + $modifyIntUnsignedNotNull, + [ + 'type' => 'BIGINT UNSIGNED', + ] + ); + $modifyIntUnsignedDefaultNull = [ + 'op' => 'MODIFY', + 'type' => 'INT UNSIGNED', + 'prop' => 'DEFAULT NULL', + ]; $update_table = [ '3.1.0' => [ 'logins' => [ 'login_resource_id' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], 'login_secret' => [ @@ -1048,7 +1080,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_name' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1069,7 +1101,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'albums' => [ 'album_privacy' => [ 'op' => 'MODIFY', - 'type' => "enum('public','password','private','private_but_link','custom')", + 'type' => "ENUM('public','password','private','private_but_link','custom')", 'prop' => "DEFAULT 'public'", ], ], @@ -1078,7 +1110,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_category_id' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => 'DEFAULT NULL', ], ], @@ -1101,12 +1133,12 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'image_storage' => [ 'op' => 'CHANGE', 'to' => 'image_storage_mode', - 'type' => "enum('datefolder','direct','old')", + 'type' => "ENUM('datefolder','direct','old')", 'prop' => "NOT NULL DEFAULT 'datefolder'", ], 'image_chain' => [ 'op' => 'ADD', - 'type' => 'tinyint(128)', + 'type' => 'TINYINT', 'prop' => 'NOT NULL', 'tail' => << [ 'storage_region' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1130,17 +1162,17 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'storages' => [ 'storage_server' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], 'storage_capacity' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'BIGINT UNSIGNED', 'prop' => 'DEFAULT NULL', ], 'storage_space_used' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'BIGINT UNSIGNED', 'prop' => "DEFAULT '0'", 'tail' => << [ 'image_thumb_size' => [ 'op' => 'ADD', - 'type' => 'int(11)', + 'type' => 'INT UNSIGNED', 'prop' => 'NOT NULL', ], 'image_medium_size' => [ 'op' => 'ADD', - 'type' => 'int(11)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1166,7 +1198,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'queues' => [ 'queue_type' => [ 'op' => 'MODIFY', - 'type' => "enum('storage-delete')", + 'type' => "ENUM('storage-delete')", 'prop' => 'NOT NULL', 'tail' => << [ 'storage_server' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1199,7 +1231,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_title' => [ 'op' => 'ADD', - 'type' => 'varchar(100)', // 3.6.5 + 'type' => 'VARCHAR(100)', // 3.6.5 'prop' => 'DEFAULT NULL', 'tail' => << [ 'album_name' => [ 'op' => 'MODIFY', - 'type' => 'varchar(100)', // 3.6.5 + 'type' => 'VARCHAR(100)', // 3.6.5 'prop' => 'NOT NULL', ], ], @@ -1221,12 +1253,12 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'queues' => [ 'queue_attempts' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT 0', ], 'queue_status' => [ 'op' => 'ADD', - 'type' => "enum('pending','failed')", + 'type' => "ENUM('pending','failed')", 'prop' => "NOT NULL DEFAULT 'pending'", ], ], @@ -1244,17 +1276,17 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_newsletter_subscribe' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '1'", ], 'user_show_nsfw_listings' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], 'user_bio' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1277,12 +1309,12 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'storages' => [ 'storage_account_id' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], 'storage_account_name' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1303,14 +1335,14 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_title' => [ 'op' => 'MODIFY', - 'type' => 'varchar(100)', + 'type' => 'VARCHAR(100)', 'prop' => 'DEFAULT NULL', ], ], 'albums' => [ 'album_name' => [ 'op' => 'MODIFY', - 'type' => 'varchar(100)', + 'type' => 'VARCHAR(100)', 'prop' => 'NOT NULL', ], ], @@ -1322,12 +1354,12 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_image_keep_exif' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '1'", ], 'user_image_expiration' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1348,56 +1380,56 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'albums' => [ 'album_creation_ip' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], 'album_likes' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], 'images' => [ 'image_likes' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], 'users' => [ 'user_registration_ip' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], 'user_likes' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0' COMMENT 'Likes made to content owned by this user'", ], 'user_liked' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0' COMMENT 'Likes made by this user'", ], 'user_following' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'user_followers' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'user_content_views' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'user_notifications_unread' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1407,14 +1439,14 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_is_private' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], 'storages' => [ 'storage_service' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1423,7 +1455,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_is_animated' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1438,7 +1470,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { //'request_type' => [], void in 4.0.0-beta.10 'request_content_id' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => 'DEFAULT NULL', ], ], @@ -1447,39 +1479,39 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'albums' => [ 'album_views' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], 'likes' => [ 'like_content_type' => [ 'op' => 'MODIFY', - 'type' => "enum('image','album')", + 'type' => "ENUM('image','album')", 'prop' => 'DEFAULT NULL', ], ], 'notifications' => [ 'notification_content_type' => [ 'op' => 'MODIFY', - 'type' => "enum('user','image','album')", + 'type' => "ENUM('user','image','album')", 'prop' => 'NOT NULL', ], ], 'stats' => [ 'stat_album_views' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'stat_album_likes' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'stat_likes' => [ 'op' => 'CHANGE', 'to' => 'stat_image_likes', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1488,7 +1520,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_source_md5' => [ 'op' => 'ADD', - 'type' => 'varchar(32)', + 'type' => 'VARCHAR(32)', 'prop' => 'DEFAULT NULL', ], ], @@ -1504,26 +1536,27 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_storage_mode' => [ 'op' => 'MODIFY', - 'type' => "enum('datefolder','direct','old','path')", + 'type' => "ENUM('datefolder','direct','old','path')", 'prop' => "NOT NULL DEFAULT 'datefolder'", ], 'image_path' => [ 'op' => 'ADD', - 'type' => 'varchar(4096)', - 'prop' => 'DEFAULT NULL', - ], - ], - 'albums' => [ - 'album_user_id' => [ - 'op' => 'MODIFY', - 'type' => 'bigint(32)', + 'type' => 'VARCHAR(4096)', 'prop' => 'DEFAULT NULL', ], ], + // 4.3.0 + // 'albums' => [ + // 'album_user_id' => [ + // 'op' => 'MODIFY', + // 'type' => 'INT UNSIGNED', + // 'prop' => 'DEFAULT NULL', + // ], + // ], 'users' => [ 'user_is_manager' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1541,7 +1574,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'pages' => [ 'page_internal' => [ 'op' => 'ADD', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], @@ -1555,21 +1588,21 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'settings' => [ 'setting_name' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'CHARACTER SET utf8 COLLATE utf8_bin NOT NULL', ], ], 'deletions' => [ 'deleted_content_ip' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], ], 'ip_bans' => [ 'ip_ban_ip' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], 'ip_ban_message' => [ @@ -1581,29 +1614,29 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'pages' => [ 'page_internal' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], 'users' => [ 'user_username' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], 'user_email' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], 'user_image_expiration' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], 'user_registration_ip' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'NOT NULL', ], ], @@ -1693,14 +1726,14 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'deletions' => [ 'deleted_content_original_filename' => [ 'op' => 'MODIFY', - 'type' => 'varchar(255)', + 'type' => 'VARCHAR(255)', 'prop' => 'DEFAULT NULL', ], ], 'logins' => [ 'login_type' => [ 'op' => 'MODIFY', - 'type' => "enum('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk')", + 'type' => "ENUM('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk')", 'prop' => 'NOT NULL', ], ], @@ -1709,7 +1742,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'imports' => [ 'import_continuous' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1730,7 +1763,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_is_approved' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '1'", ], ], @@ -1739,19 +1772,19 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'albums' => [ 'album_cover_id' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => 'DEFAULT NULL', ], 'album_parent_id' => [ 'op' => 'ADD', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => 'DEFAULT NULL', ], ], 'images' => [ 'image_is_360' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1810,7 +1843,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_palette_id' => [ 'op' => 'ADD', - 'type' => 'int(11)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -1827,7 +1860,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'requests' => [ 'request_type' => [ 'op' => 'MODIFY', - 'type' => "enum('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login','content-password','account-two-factor')", + 'type' => "ENUM('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login','content-password','account-two-factor')", 'prop' => 'NOT NULL', ], ], @@ -1885,7 +1918,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'albums' => [ 'album_cta_enable' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], 'album_cta' => [ @@ -1899,29 +1932,25 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'storages' => [ 'storage_type_chain' => [ 'op' => 'ADD', - 'type' => 'tinyint(3) UNSIGNED', + 'type' => 'TINYINT UNSIGNED', 'prop' => 'NOT NULL DEFAULT "1"', ], ], 'images' => [ - 'image_size' => [ - 'op' => 'MODIFY', - 'type' => 'bigint(11) UNSIGNED', - 'prop' => 'NOT NULL', - ], + 'image_size' => $modifyBigIntUnsignedNotNull, 'image_frame_size' => [ 'op' => 'ADD', - 'type' => 'int(11)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'image_duration' => [ 'op' => 'ADD', - 'type' => 'int(11)', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'image_type' => [ 'op' => 'ADD', - 'type' => 'tinyint(3) UNSIGNED', + 'type' => 'TINYINT UNSIGNED', 'prop' => "as (case when `image_extension` in ('pdf','doc','md') then 4 when `image_extension` in ('mp3','m4a','wav') then 3 @@ -1935,14 +1964,14 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'users' => [ 'user_file_meta_tag_camera_model' => [ 'op' => 'ADD', - 'type' => 'tinyint(1)', + 'type' => 'TINYINT', 'prop' => "NOT NULL DEFAULT '0'", ], ], 'categories' => [ 'category_url_key' => [ 'op' => 'MODIFY', - 'type' => 'varchar(32)', + 'type' => 'VARCHAR(32)', 'collation' => 'utf8mb4_bin', 'prop' => 'NOT NULL', ], @@ -1950,7 +1979,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'storages' => [ 'storage_use_path_style_endpoint' => [ 'op' => 'ADD', - 'type' => 'tinyint(1) UNSIGNED', + 'type' => 'TINYINT UNSIGNED', 'prop' => 'NOT NULL DEFAULT "0"', ], 'storage_deleted_at' => [ @@ -1962,7 +1991,7 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'images' => [ 'image_type' => [ 'op' => 'MODIFY', - 'type' => 'tinyint(3) UNSIGNED', + 'type' => 'TINYINT UNSIGNED', 'prop' => "as (case when `image_extension` in ('pdf','doc','md') then 4 when `image_extension` in ('mp3','m4a','wav') then 3 @@ -1974,17 +2003,17 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'stats' => [ 'stat_tags' => [ 'op' => 'ADD', - 'type' => 'bigint(32) UNSIGNED', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'stat_cron_runs' => [ 'op' => 'ADD', - 'type' => 'bigint(32) UNSIGNED', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], 'stat_cron_time' => [ 'op' => 'ADD', - 'type' => 'bigint(32) UNSIGNED', + 'type' => 'INT UNSIGNED', 'prop' => "NOT NULL DEFAULT '0'", ], ], @@ -2025,11 +2054,159 @@ if ($installed_version !== '' && empty($paramsCheck)) { 'importing' => [ 'importing_content_id' => [ 'op' => 'MODIFY', - 'type' => 'bigint(32)', + 'type' => 'INT UNSIGNED', 'prop' => 'DEFAULT NULL', ], ], ], + '4.3.0' => [ + 'query.1' => $db->getSqlDropForeignKey('tags_albums', 'tags_albums_ibfk_1') + . $db->getSqlDropForeignKey('tags_albums', 'tags_albums_ibfk_2') + . $db->getSqlDropForeignKey('tags_albums', 'tags_albums_ibfk_3') + . $db->getSqlDropForeignKey('tags_users', 'tags_users_ibfk_1') + . $db->getSqlDropForeignKey('tags_users', 'tags_users_ibfk_2') + . $db->getSqlDropForeignKey('tags_files', 'tags_files_ibfk_1') + . $db->getSqlDropForeignKey('tags_files', 'tags_files_ibfk_2') + . $db->getSqlDropIndex('images', 'image_md5') + . $db->getSqlDropIndex('images', 'image_source_md5') + . $db->getSqlDropIndex('deletions', 'deleted_content_md5'), + 'assets' => [ + 'asset_md5' => [ + 'op' => 'CHANGE', + 'to' => 'asset_checksum', + 'type' => 'VARCHAR(32)', + 'prop' => 'NOT NULL', + ], + ], + 'albums' => [ + 'album_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'album_user_id' => $modifyIntUnsignedDefaultNull, + 'album_cover_id' => $modifyIntUnsignedDefaultNull, + 'album_parent_id' => $modifyIntUnsignedDefaultNull, + ], + 'api_keys' => [ + 'api_key_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'api_key_user_id' => $modifyIntUnsignedDefaultNull, + ], + 'confirmations' => [ + 'confirmation_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'confirmation_user_id' => $modifyIntUnsignedNotNull, + ], + 'deletions' => [ + 'deleted_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'deleted_content_id' => $modifyIntUnsignedNotNull, + 'deleted_content_user_id' => $modifyIntUnsignedDefaultNull, + 'deleted_content_md5' => [ + 'op' => 'CHANGE', + 'to' => 'deleted_content_checksum', + 'type' => 'VARCHAR(32)', + 'prop' => 'DEFAULT NULL', + ], + ], + 'follows' => [ + 'follow_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'follow_user_id' => $modifyIntUnsignedNotNull, + 'follow_followed_user_id' => $modifyIntUnsignedNotNull, + ], + 'images' => [ + 'image_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'image_user_id' => $modifyIntUnsignedDefaultNull, + 'image_album_id' => $modifyIntUnsignedDefaultNull, + 'image_storage_id' => $modifyIntUnsignedDefaultNull, + 'image_category_id' => $modifyIntUnsignedDefaultNull, + 'image_md5' => [ + 'op' => 'CHANGE', + 'to' => 'image_checksum', + 'type' => 'VARCHAR(32)', + 'prop' => 'NOT NULL', + ], + 'image_source_md5' => [ + 'op' => 'CHANGE', + 'to' => 'image_source_checksum', + 'type' => 'VARCHAR(32)', + 'prop' => 'DEFAULT NULL', + ], + ], + 'logins' => [ + 'login_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'login_user_id' => $modifyIntUnsignedNotNull, + ], + 'login_passwords' => [ + 'login_password_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'login_password_user_id' => $modifyIntUnsignedNotNull, + ], + 'login_cookies' => [ + 'login_cookie_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'login_cookie_user_id' => $modifyIntUnsignedNotNull, + 'login_cookie_connection_id' => [ + 'op' => 'MODIFY', + 'type' => 'INT UNSIGNED', + 'prop' => 'DEFAULT 0', + ], + ], + 'login_connections' => [ + 'login_connection_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'login_connection_user_id' => $modifyIntUnsignedNotNull, + 'login_connection_provider_id' => $modifyIntUnsignedNotNull, + ], + 'likes' => [ + 'like_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'like_user_id' => $modifyIntUnsignedDefaultNull, + 'like_content_id' => $modifyIntUnsignedNotNull, + 'like_content_user_id' => $modifyIntUnsignedDefaultNull, + ], + 'notifications' => [ + 'notification_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'notification_user_id' => $modifyIntUnsignedNotNull, + 'notification_trigger_user_id' => $modifyIntUnsignedDefaultNull, + 'notification_type_id' => $modifyIntUnsignedNotNull, + ], + 'tags_albums' => [ + 'tag_album_tag_id' => $modifyIntUnsignedNotNull, + 'tag_album_user_id' => $modifyIntUnsignedNotNull, + 'tag_album_album_id' => $modifyIntUnsignedNotNull, + ], + 'tags_files' => [ + 'tag_file_tag_id' => $modifyIntUnsignedNotNull, + 'tag_file_file_id' => $modifyIntUnsignedNotNull, + ], + 'tags_users' => [ + 'tag_user_tag_id' => $modifyIntUnsignedNotNull, + 'tag_user_user_id' => $modifyIntUnsignedNotNull, + ], + 'tags' => [ + 'tag_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'tag_user_id' => $modifyIntUnsignedNotNull, + ], + 'two_factors' => [ + 'two_factor_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'two_factor_user_id' => $modifyIntUnsignedDefaultNull, + ], + 'requests' => [ + 'request_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'request_user_id' => $modifyIntUnsignedDefaultNull, + 'request_content_id' => $modifyIntUnsignedDefaultNull, + ], + 'users' => [ + 'user_id' => $modifyIntUnsignedNotNullAutoIncrement, + 'user_palette_id' => [ + 'op' => 'MODIFY', + 'type' => 'INT UNSIGNED', + 'prop' => "NOT NULL DEFAULT '0'", + ], + ], + 'uploads' => [], + 'uploads_chunks' => [], + 'query.2' => << $changes) { + if (version_compare($version, $installed_version, '<=')) { + continue; + } foreach ($changes as $table => $columns) { - if ($table === 'query') { + if ($table === 'query' || str_starts_with($table, 'query.')) { + if (version_compare($version, $installed_version, '>')) { + $sql_update[] = (string) $columns; + } + continue; } $schema_table = $schema[$table] ?? []; @@ -2101,11 +2285,16 @@ if ($installed_version !== '' && empty($paramsCheck)) { $columnCollation = mb_strtolower($column_meta['collation'] ?? ''); $collationUpdated = $columnCollation !== '' && $schemaCollation !== $columnCollation; + $dataType = mb_strtoupper($schema_column['DATA_TYPE']); + $columnMetaType = mb_strtoupper($column_meta['type']); + $schemaColumn = mb_strtoupper($schema_column['COLUMN_TYPE']); + if (in_array($dataType, ['INT', 'TINYINT', 'BIGINT'])) { + $schemaColumn = preg_replace('/\(\d+\)/', '', $schemaColumn); + } if ( array_key_exists($column, $schema[$table]) && ( - mb_strtolower($schema_column['COLUMN_TYPE']) !== mb_strtolower($column_meta['type']) - || ($isGenerated && $schemaExpression !== $columnExpression) + $schemaColumn !== $columnMetaType || $collationUpdated || preg_match('/DEFAULT NULL/i', $column_meta['prop'] ?? '') && $schema_column['IS_NULLABLE'] === 'NO' @@ -2119,7 +2308,9 @@ if ($installed_version !== '' && empty($paramsCheck)) { break; case 'CHANGE': - if (array_key_exists($column, $schema[$table])) { + if (array_key_exists($column, $schema[$table]) + && ! array_key_exists($column_meta['to'], $schema[$table]) + ) { $query = '`%column` `%to` %type'; } @@ -2146,9 +2337,6 @@ if ($installed_version !== '' && empty($paramsCheck)) { } } } - if (isset($changes['query']) && version_compare($version, $installed_version, '>')) { - $sql_update[] = (string) $changes['query']; - } } foreach ($CHV_indexes as $table => $indexes) { $field_prefix = DB::getFieldPrefix($table); @@ -2210,11 +2398,11 @@ if ($installed_version !== '' && empty($paramsCheck)) { } } $APP_VERSION = APP_VERSION; - $sql_update[] = <<query($sql_update); xr($sql_update); + $updated = false; try { logger("[STATUS] Updating Chevereto database (this may take a while)...\n"); logger("[SQL]\n{$sql_update}\n"); $updated = $db->exec(); + $versionDatabase = $db::get( + table: 'variables', + where: [ + 'variable_name' => 'chevereto_version_installed', + ], + limit: 1, + )['variable_value'] ?? ''; + if ($versionDatabase !== APP_VERSION) { + throw new LogicException(); + } } catch (Throwable $e) { throw new LogicException( (string) message( @@ -2283,6 +2482,8 @@ if ($installed_version !== '' && empty($paramsCheck)) { ); } if ($updated) { + new Settings(reCache: true); + new Variable(reCache: true); $itWasUpdated = true; } $doing = 'updated'; @@ -2412,32 +2613,32 @@ EOT; <<withIsDebug($doDebug); $internalHandler = $publicHandler->withIsDebug(true); + $doDebug = in_array($debugLevel, [2, 3], true) || isDebug(); + if ($doDebug === false) { + $publicHandler = $publicHandler + ->withIsDebug($doDebug) + ->withPutExtra( + 'Why am I seeing this?', + <<withPutExtra( + 'Administrator guide', + << +
  • Refer to the Chevereto documentation to understand how to debug this error.
  • +
  • Need help? Visit Chevereto support to open a ticket.
  • + + + HTML + ); + } $method = server()['REQUEST_METHOD'] ?? ''; $uri = server()['REQUEST_URI'] ?? ''; $uri = strtok($uri, '?'); diff --git a/app/legacy/load/web.php b/app/legacy/load/web.php index ce7773b..1ebe9e6 100644 --- a/app/legacy/load/web.php +++ b/app/legacy/load/web.php @@ -10,7 +10,8 @@ */ use Chevereto\Config\Config; -use Chevereto\Legacy\Classes\DB; +use Chevereto\Legacy\Classes\Cache; +use Chevereto\Legacy\Classes\Categories; use Chevereto\Legacy\Classes\Fonts; use Chevereto\Legacy\Classes\IpBan; use Chevereto\Legacy\Classes\L10n; @@ -19,7 +20,7 @@ use Chevereto\Legacy\Classes\Page; use Chevereto\Legacy\Classes\Palettes; use Chevereto\Legacy\Classes\RequestLog; use Chevereto\Legacy\Classes\Settings; -use Chevereto\Legacy\Classes\Tag; +use Chevereto\Legacy\Classes\Tags; use Chevereto\Legacy\Classes\User; use Chevereto\Legacy\G\Handler; use function Chevereto\Legacy\badgePaid; @@ -52,31 +53,19 @@ if (cheveretoVersionInstalled() === '') { loadTemplate: ! REPL, // @phpstan-ignore-line before: function ($handler) { headersNoCache(); - if ($handler->request_array()[0] !== 'install') { + if ($handler->requestArray()[0] !== 'install') { redirect('install', 302); } }, ); } -$bannedIp = IpBan::getSingle(); -if ($bannedIp !== []) { - headersNoCache(); - // TODO: Cache until ban expires - if (is_url($bannedIp['message'] ?? false)) { - redirect($bannedIp['message'], 301); - } else { - $exitMessage = $bannedIp['message'] ?? ''; - $exitMessage = match ($exitMessage) { - '' => _s('You have been forbidden to use this website.'), - default => $bannedIp['message'], - }; - exit($exitMessage); - } -} $hook_before = function (Handler $handler) { header('Permissions-Policy: unload=()'); header('Permissions-Policy: interest-cohort=()'); header("Content-Security-Policy: frame-ancestors 'none'"); + $dayCacheRoutes = [ + 'webmanifest', + ]; $exitEarlyRoutes = [ 'webmanifest', ]; @@ -96,17 +85,46 @@ $hook_before = function (Handler $handler) { 'settings', 'redirect', ]; + $doNotCheckBanRoutes = [ + 'webmanifest', + ]; + if (! in_array($handler->requestArray()[0], $doNotCheckBanRoutes, true)) { + $bannedIp = IpBan::getSingle(); + if ($bannedIp !== []) { + headersNoCache(); + // TODO: Cache until ban expires + if (is_url($bannedIp['message'] ?? false)) { + redirect($bannedIp['message'], 301); + } else { + $exitMessage = $bannedIp['message'] ?? ''; + $exitMessage = match ($exitMessage) { + '' => _s('You have been forbidden to use this website.'), + default => $bannedIp['message'], + }; + exit($exitMessage); + } + } + } $cache_ttl = (int) max(0, getSetting('cache_ttl') ?? 0); - if (in_array($handler->request_array()[0], $doNotCacheRoutes, true)) { + if (in_array($handler->requestArray()[0], $dayCacheRoutes, true)) { + $cache_ttl = 86400; // 1 day + } + if (in_array($handler->requestArray()[0], $doNotCacheRoutes, true)) { headersNoCache(); } elseif ($cache_ttl > 0) { headersResetCache(); header("Cache-Control: private, max-age={$cache_ttl}"); } - if (in_array($handler->request_array()[0], $exitEarlyRoutes, true)) { + if (in_array($handler->requestArray()[0], $exitEarlyRoutes, true)) { return; } - $failed_access_requests = RequestLog::getCounts(['login', 'signup'], 'fail'); + $failTriggers = [ + 'account-password-forgot', + 'account-two-factor', + 'login', + 'signup', + ]; + $failed_access_requests = RequestLog::getCounts($failTriggers, 'fail'); if (is_max_invalid_request($failed_access_requests['day'])) { set_status_header(403); } else { @@ -119,9 +137,9 @@ $hook_before = function (Handler $handler) { if (Login::getUser()['status'] === 'banned') { set_status_header(403); } - if (sessionVar()->hasKey('challenge_two_factor') + if (sessionVar()->has('challenge_two_factor') && ! in_array($handler->getRoutePath(), ['account/two-factor', 'captcha-verify', 'logout'], true) - && $handler->request_array()[0] !== 'page' + && $handler->requestArray()[0] !== 'page' ) { headersNoCache(); redirect('account/two-factor', 302); @@ -138,9 +156,10 @@ $hook_before = function (Handler $handler) { ); if (http_response_code() === 403) { headersNoCache(); + echo '403 Forbidden'; exit(); } - if ($handler->request_array()[0] !== 'api' + if ($handler->requestArray()[0] !== 'api' && Settings::get('enable_uploads_url') && ! Login::isAdmin()) { Settings::setValue('enable_uploads_url', 0); } @@ -212,10 +231,10 @@ $hook_before = function (Handler $handler) { $handler::setVar('fonts', $fonts); $fontId = intval(getSetting('theme_font') ?? 0); $handler::setVar('theme_font', $fontId); - if (in_array($handler->request_array()[0], ['login', 'signup', 'account'], true)) { + if (in_array($handler->requestArray()[0], ['login', 'signup', 'account'], true)) { $paletteId = 0; } else { - $paletteId = Login::isLoggedUser() + $paletteId = Login::isLoggedUser() & Settings::get('theme_palette_user_select') ? Login::getUser()['palette_id'] : Settings::get('theme_palette'); } @@ -227,7 +246,7 @@ $hook_before = function (Handler $handler) { $handler::setVar('theme_palette', $paletteId); $handler::setVar('theme_palette_handle', $theme_palette_handle); if ($handler::cond('maintenance') - && $handler->request_array()[0] === 'dashboard') { + && $handler->requestArray()[0] === 'dashboard') { headersNoCache(); redirect('login', 302); } @@ -273,24 +292,24 @@ $hook_before = function (Handler $handler) { $userMapPaths[] = getSetting('user_profile_view') === 'files' ? 'albums' : 'files'; - if ($handler->request_array()[0] === '/' + if ($handler->requestArray()[0] === '/' && getSetting('website_mode_personal_routing') === '/' && in_array(key($querystr), ['random'], true) ) { $handler->mapRoute('index'); - } elseif ($handler->request_array()[0] === 'search' - && in_array($handler->request_array()[1] ?? [], ['images', 'albums', 'users'], true) + } elseif ($handler->requestArray()[0] === 'search' + && in_array($handler->requestArray()[1] ?? [], ['images', 'albums', 'users'], true) ) { $handler->mapRoute('search'); - } elseif ($handler->request_array()[0] === getSetting('website_mode_personal_routing') + } elseif ($handler->requestArray()[0] === getSetting('website_mode_personal_routing') || (getSetting('website_mode_personal_routing') === '/' - && in_array($handler->request_array()[0], $userMapPaths, true)) + && in_array($handler->requestArray()[0], $userMapPaths, true)) ) { $handler->mapRoute('user', [ 'id' => getSetting('website_mode_personal_uid'), ]); } - if ($handler->request_array()[0] === '/' + if ($handler->requestArray()[0] === '/' && ! in_array(key($querystr), ['random', 'lang'], true) && ! $handler::cond('mapped_route') ) { @@ -315,17 +334,17 @@ $hook_before = function (Handler $handler) { } } } else { - if ($base !== 'index' and ! is_route_available($handler->request_array()[0])) { + if ($base !== 'index' and ! is_route_available($handler->requestArray()[0])) { $mapTo = getSetting('root_route'); $handler->mapRoute($mapTo); } } $virtual_routes = ['image', 'album', 'user', 'video', 'audio']; - if (in_array($handler->request_array()[0], $virtual_routes, true)) { - $virtual_route = getSetting('route_' . $handler->request_array()[0]); - if ($handler->request_array()[0] !== $virtual_route) { + if (in_array($handler->requestArray()[0], $virtual_routes, true)) { + $virtual_route = getSetting('route_' . $handler->requestArray()[0]); + if ($handler->requestArray()[0] !== $virtual_route) { $virtualized_url = str_replace( - get_base_url($handler->request_array()[0]), + get_base_url($handler->requestArray()[0]), get_base_url($virtual_route), get_current_url() ); @@ -334,9 +353,9 @@ $hook_before = function (Handler $handler) { return; } } - if ($base !== 'index' && ! is_route_available($handler->request_array()[0])) { + if ($base !== 'index' && ! is_route_available($handler->requestArray()[0])) { foreach ($virtual_routes as $k) { - if ($handler->request_array()[0] === getSetting('route_' . $k)) { + if ($handler->requestArray()[0] === getSetting('route_' . $k)) { $handler->mapRoute($k); } } @@ -352,7 +371,7 @@ $hook_before = function (Handler $handler) { if (getSetting('enable_signups')) { $allowed_requests[] = 'signup'; } - if (! in_array($handler->request_array()[0], $allowed_requests, true)) { + if (! in_array($handler->requestArray()[0], $allowed_requests, true)) { headersNoCache(); redirect('login', 302); } @@ -400,43 +419,13 @@ $hook_before = function (Handler $handler) { } $handler::setCond('moderate_uploads', $moderate_uploads); $categories = []; - $tags_top = []; + $tagsTop = []; if ($handler::cond('explore_enabled') || $base === 'dashboard') { - try { - $categories_db = DB::queryFetchAll( - 'SELECT * FROM ' - . DB::getTable('categories') - . ' ORDER BY category_name ASC;' - ); - foreach ($categories_db as $k => $v) { - $key = $v['category_id']; - $categories[$key] = $v; - $categories[$key]['category_url'] = get_base_url('category/' . $v['category_url_key']); - $categories[$key] = DB::formatRow($categories[$key]); - } - } catch (Throwable) { - } - - try { - $tagsTable = DB::getTable('tags'); - $tags_db = DB::queryFetchAll( - << $v) { - $tag = array_merge($v, Tag::row($v['name'])); - $tags_top[] = $tag; - } - } catch (Throwable) { - } + $categories = Categories::get(); + $tagsTop = Tags::top(); } $handler::setVar('categories', $categories); - $handler::setVar('tags_top', $tags_top); + $handler::setVar('tags_top', $tagsTop); $explore_discovery = [ 'recent' => [ 'label' => _s('Recent'), @@ -497,49 +486,66 @@ $hook_before = function (Handler $handler) { $handler::setVar('explore_discovery', $explore_discovery); $handler::setVar('explore_content', $explore_content); $versionInstalled = cheveretoVersionInstalled(); - $pages_visible = []; + $pages_link_visible = []; if (version_compare($versionInstalled, '3.6.7', '>=')) { - $pages_visible_db = Page::getAll( - args: [ - 'is_active' => '1', - 'is_link_visible' => '1', - ], - sort: [ - 'field' => 'sort_display', - 'order' => 'ASC', - ] - ); - $pos_page_tos = array_search('tos', array_column($pages_visible_db, 'internal')); - $pos_page_privacy = array_search('privacy', array_column($pages_visible_db, 'internal')); - $page_tos = $pos_page_tos === false - ? null - : $pages_visible_db[$pos_page_tos]; - $page_privacy = $pos_page_privacy === false - ? null - : $pages_visible_db[$pos_page_privacy]; - $handler::setVar('page_tos', $page_tos); - $handler::setVar('page_privacy', $page_privacy); + $cachedPagesVisibleRows = Cache::instance()->get('pages_visible'); + if ($cachedPagesVisibleRows === false) { + $pagesVisibleRows = Page::getAll( + args: [ + 'is_active' => '1', + 'is_link_visible' => '1', + ], + sort: [ + 'field' => 'sort_display', + 'order' => 'ASC', + ] + ); + $posPageTos = array_search('tos', array_column($pagesVisibleRows, 'internal')); + $posPagePrivacy = array_search('privacy', array_column($pagesVisibleRows, 'internal')); + Cache::instance()->set( + 'pages_visible', + [ + 'rows' => $pagesVisibleRows, + 'pos_page_tos' => $posPageTos, + 'pos_page_privacy' => $posPagePrivacy, + ], + 3600 + ); + } else { + $pagesVisibleRows = $cachedPagesVisibleRows['rows'] ?? []; + $posPageTos = $cachedPagesVisibleRows['pos_page_tos'] ?? false; + $posPagePrivacy = $cachedPagesVisibleRows['pos_page_privacy'] ?? false; + } + $pageTos = $posPageTos === false ? null : $pagesVisibleRows[$posPageTos]; + $pagePrivacy = $posPagePrivacy === false ? null : $pagesVisibleRows[$posPagePrivacy]; + $handler::setVar('page_tos', $pageTos); + $handler::setVar('page_privacy', $pagePrivacy); } if ((bool) env()['CHEVERETO_ENABLE_PAGES']) { - foreach ($pages_visible_db ?? [] as $k => $v) { + foreach ($pagesVisibleRows ?? [] as $k => $v) { if (! ($v['is_active'] ?? false) && ! ($v['is_link_visible'] ?? false)) { continue; } - $pages_visible[$v['id']] = $v; + $pages_link_visible[$v['id']] = $v; } } - $api_page = [ - 'type' => 'link', - 'link_url' => get_base_url('api-v1'), - 'icon' => 'fas fa-project-diagram', - 'title' => 'API', - 'is_active' => 1, - 'is_link_visible' => 1, - 'attr_target' => '_self', - 'sort_display' => -2, - ]; - Page::fill($api_page); - $pages_visible[] = $api_page; + $apiEnabled = ((bool) env()['CHEVERETO_ENABLE_API_USER'] || (bool) env()['CHEVERETO_ENABLE_API_GUEST']) + && (getSetting('enable_api_user') || getSetting('enable_api_guest')); + $handler::setCond('api_enabled', $apiEnabled); + if ($apiEnabled) { + $api_page = [ + 'type' => 'link', + 'link_url' => get_base_url('api-v1'), + 'icon' => 'fas fa-project-diagram', + 'title' => 'API', + 'is_active' => 1, + 'is_link_visible' => 1, + 'attr_target' => '_self', + 'sort_display' => -2, + ]; + Page::fill($api_page); + $pages_link_visible[] = $api_page; + } if (getSetting('enable_plugin_route')) { $plugin_page = [ 'type' => 'link', @@ -552,12 +558,12 @@ $hook_before = function (Handler $handler) { 'sort_display' => -1, ]; Page::fill($plugin_page); - $pages_visible[] = $plugin_page; + $pages_link_visible[] = $plugin_page; } - uasort($pages_visible, function ($a, $b) { + uasort($pages_link_visible, function ($a, $b) { return $a['sort_display'] - $b['sort_display']; }); - $handler::setVar('pages_link_visible', $pages_visible); + $handler::setVar('pages_link_visible', $pages_link_visible); $upload_enabled = Login::isAdmin() ?: getSetting('enable_uploads'); $upload_allowed = $upload_enabled; if (! Login::getUser()) { @@ -576,7 +582,7 @@ $hook_before = function (Handler $handler) { Settings::setValue('upload_max_filesize_mb', getSetting('upload_max_filesize_mb_guest')); } if ($upload_allowed - && in_array($handler->request_array()[0], ['login', 'signup', 'account'], true) + && in_array($handler->requestArray()[0], ['login', 'signup', 'account'], true) ) { $upload_allowed = false; } @@ -585,7 +591,7 @@ $hook_before = function (Handler $handler) { if ($handler::cond('maintenance') || $handler::cond('show_consent_screen')) { $handler::setCond('private_gate', true); $allowed_requests = ['login', 'account', 'connect', 'captcha-verify', 'oembed']; - if (! in_array($handler->request_array()[0], $allowed_requests, true)) { + if (! in_array($handler->requestArray()[0], $allowed_requests, true)) { $handler->preventRoute($handler::cond('show_consent_screen') ? 'consent-screen' : 'maintenance'); } } @@ -602,7 +608,7 @@ $hook_before = function (Handler $handler) { 'webmanifest', 'tag-autocomplete', ]; - if (! in_array($handler->request_array()[0], $excludeLastUrl, true)) { + if (! in_array($handler->requestArray()[0], $excludeLastUrl, true)) { sessionVar()->put('last_url', get_current_url()); } $detect = new Mobile_Detect(); @@ -627,12 +633,12 @@ $hook_before = function (Handler $handler) { }; $hook_after = function (Handler $handler) { if (array_key_exists('deleted', get()) - && in_array($handler->template(), ['user', 'album'], true) + && in_array($handler->template(), ['user', 'album'], true) ) { set_status_header(303); } if ($handler->template() === '404') { - if (sessionVar()->hasKey('last_url')) { + if (sessionVar()->has('last_url')) { sessionVar()->remove('last_url'); } $handler::setVar('doctitle', _s("That page doesn't exist") . ' (404) - ' . getSetting('website_name')); diff --git a/app/legacy/routes/account.php b/app/legacy/routes/account.php index f0a2e99..c47cf30 100644 --- a/app/legacy/routes/account.php +++ b/app/legacy/routes/account.php @@ -89,7 +89,7 @@ return function (Handler $handler) { if (! TwoFactor::hasFor($logged_user['id'])) { redirect('settings/security', 302); } - if (! sessionVar()->hasKey('challenge_two_factor')) { + if (! sessionVar()->has('challenge_two_factor')) { redirect($logged_user['url'] ?? '', 302); } diff --git a/app/legacy/routes/album.php b/app/legacy/routes/album.php index f6f99fd..2388497 100644 --- a/app/legacy/routes/album.php +++ b/app/legacy/routes/album.php @@ -368,7 +368,7 @@ return function (Handler $handler) { $handler::setVar('meta_description', $meta_description); if ($handler::cond('content_manager') || $is_owner) { $handler::setVar('user_items_editor', [ - 'user_albums' => User::getAlbums((int) $album['user']['id']), + 'user_albums' => User::getAlbums($album['user']), 'type' => $type, ]); } diff --git a/app/legacy/routes/api-v1.php b/app/legacy/routes/api-v1.php index 9a5ae70..63146c1 100644 --- a/app/legacy/routes/api-v1.php +++ b/app/legacy/routes/api-v1.php @@ -12,7 +12,7 @@ use Chevereto\Legacy\G\Handler; return function (Handler $handler) { - if ($handler->isRequestLevel(2)) { + if (! $handler::cond('api_enabled') || $handler->isRequestLevel(2)) { $handler->issueError(404); return; diff --git a/app/legacy/routes/api.php b/app/legacy/routes/api.php index 3261991..3b74b73 100644 --- a/app/legacy/routes/api.php +++ b/app/legacy/routes/api.php @@ -44,6 +44,12 @@ use function Chevereto\Vars\request; use function Chevereto\Vars\server; return function (Handler $handler) { + if (! $handler::cond('api_enabled')) { + $handler->issueError(404); + + return; + } + try { $user = []; $REQUEST = request(); diff --git a/app/legacy/routes/dashboard.php b/app/legacy/routes/dashboard.php index 336ea81..457e238 100644 --- a/app/legacy/routes/dashboard.php +++ b/app/legacy/routes/dashboard.php @@ -12,7 +12,10 @@ use Chevereto\Config\Config; use Chevereto\Legacy\Classes\Akismet; use Chevereto\Legacy\Classes\AssetStorage; +use Chevereto\Legacy\Classes\Cache; use Chevereto\Legacy\Classes\DB; +use Chevereto\Legacy\Classes\ExifTool; +use Chevereto\Legacy\Classes\ExifTran; use Chevereto\Legacy\Classes\Image; use Chevereto\Legacy\Classes\L10n; use Chevereto\Legacy\Classes\Listing; @@ -45,7 +48,6 @@ use function Chevereto\Legacy\G\fetch_url; use function Chevereto\Legacy\G\format_bytes; use function Chevereto\Legacy\G\get_app_version; use function Chevereto\Legacy\G\get_base_url; -use function Chevereto\Legacy\G\get_bytes; use function Chevereto\Legacy\G\get_client_ip; use function Chevereto\Legacy\G\get_ffmpeg_error; use function Chevereto\Legacy\G\get_ini_bytes; @@ -133,6 +135,18 @@ return function (Handler $handler) { return; } + $request = implode('/', $handler->request()); + $redirects = [ + 'settings/external-storage' => 'dashboard/settings/upload-storage', + 'settings/asset-storage' => 'dashboard/settings/site-storage', + 'settings/guest-api' => 'dashboard/settings/api', + ]; + $redirectTo = $redirects[$request] ?? null; + if ($redirectTo) { + redirect($redirectTo); + + return; + } $route_prefix = 'dashboard'; $routes = [ 'stats' => _s('Home'), @@ -178,6 +192,7 @@ return function (Handler $handler) { 'tags' => 'fas fa-tags', ]; $settings_sections = [ + 'api' => 'API', 'website' => _s('Website'), 'content' => _s('Content'), 'listings' => _s('Listings'), @@ -190,14 +205,13 @@ return function (Handler $handler) { 'email' => _s('Email'), 'tools' => _s('Tools'), 'logo' => _s('Logo'), - 'asset-storage' => _s('Asset storage'), - 'external-storage' => _s('External storage'), + 'site-storage' => _s('Site storage'), + 'upload-storage' => _s('Upload storage'), 'upload-plugin' => _s('Upload plugin'), 'homepage' => _s('Homepage'), 'pages' => _s('Pages'), 'consent-screen' => _s('Consent screen'), 'users' => _n('User', 'Users', 20), - 'guest-api' => _s('Guests %s', 'API'), 'login-providers' => _s('Login providers'), 'routing' => _s('Routing'), 'external-services' => _s('External services'), @@ -218,11 +232,11 @@ return function (Handler $handler) { 'cookie-compliance' => 'fas fa-cookie-bite', 'email' => 'fas fa-at', 'external-services' => 'fas fa-concierge-bell', - 'asset-storage' => 'fas fa-warehouse', - 'external-storage' => 'fas fa-hdd', + 'site-storage' => 'fas fa-warehouse', + 'upload-storage' => 'fas fa-hdd', 'file-uploads' => 'fas fa-cloud-upload-alt', 'flood-protection' => 'fas fa-faucet', - 'guest-api' => 'fas fa-project-diagram', + 'api' => 'fas fa-project-diagram', 'homepage' => 'fas fa-home', 'ip-bans' => 'fas fa-ban', 'languages' => 'fas fa-language', @@ -246,7 +260,6 @@ return function (Handler $handler) { 'cookie-compliance' => ['pro', 'CHEVERETO_ENABLE_COOKIE_COMPLIANCE'], 'external-services' => ['pro', 'CHEVERETO_ENABLE_EXTERNAL_SERVICES'], 'flood-protection' => ['pro', 'CHEVERETO_ENABLE_UPLOAD_FLOOD_PROTECTION'], - 'guest-api' => ['lite', 'CHEVERETO_ENABLE_API_GUEST'], 'homepage' => ['lite', 'CHEVERETO_ENABLE_USERS'], 'ip-bans' => ['pro', 'CHEVERETO_ENABLE_IP_BANS'], 'login-providers' => ['lite', 'CHEVERETO_ENABLE_LOGIN_PROVIDERS'], @@ -425,68 +438,10 @@ return function (Handler $handler) { $cronRemark .= ' — ' . _s('not running') . ''; } if ((env()['CHEVERETO_SERVICING'] ?? null) === 'docker') { - $cronRemark .= '
    docker exec -it --user www-data ' . (gethostname() ?: 'chv-container') . ' app/bin/legacy -C cron
    '; + $cronRemark .= '
    docker exec -it --user www-data ' . (gethostname() ?: 'chv-container') . ' app/bin/cli -C cron
    '; $errorLogRemark .= '
    docker logs ' . (gethostname() ?: 'chv-container') . ' -f 1>/dev/null
    '; } } - $ffmpegContent = ' '; - - try { - $missing = [ - 'proc_open' => ! function_exists('proc_open'), - 'proc_close' => ! function_exists('proc_close'), - ]; - $missing = array_filter($missing); - if ($missing) { - throw new Exception( - _s( - 'PHP function [%s] not available in this PHP installation', - implode(', ', array_keys($missing)) - ) - ); - } - $ffmpegErrors = []; - - try { - $ffmpeg = FFMpeg::create( - [ - 'ffmpeg.binaries' => env()['CHEVERETO_BINARY_FFMPEG'], - 'ffprobe.binaries' => env()['CHEVERETO_BINARY_FFPROBE'], - ] - ); - } catch (Throwable $e) { - $ffmpegErrors[] = get_ffmpeg_error($e); - } - - try { - $ffprobe = FFProbe::create( - [ - 'ffprobe.binaries' => env()['CHEVERETO_BINARY_FFPROBE'], - ] - ); - $ffprobe->getFFProbeDriver()->getName(); - } catch (Throwable $e) { - $ffmpegErrors[] = get_ffmpeg_error($e); - } - if ($ffmpegErrors !== []) { - throw new Exception(implode(', ', $ffmpegErrors)); - } - $ffmpegContent .= 'FFmpeg'; - if (isset($ffmpeg) && env()['CHEVERETO_CONTEXT'] !== 'saas') { - $ffmpegContent .= ' bin: ' - . env()['CHEVERETO_BINARY_FFMPEG'] - . ' version ' - . $ffmpeg->getFFMpegDriver()->getVersion() - . '
    ' - . ' FFprobe bin:' - . env()['CHEVERETO_BINARY_FFPROBE']; - } - } catch (Throwable $e) { - $ffmpegContent = ' Error: ' - . get_ffmpeg_error($e) - . ''; - } - $chv_versioning = explode('.', APP_VERSION); $chv_version_major = $chv_versioning[0] . '.X'; $chv_version_minor = $chv_versioning[0] . '.' . $chv_versioning[1]; @@ -501,17 +456,10 @@ return function (Handler $handler) { . '
    ' . $version_check . $linksButtons . '
    ', ], - 'max_upload_size' => [ + 'upload_max_filesize' => [ 'label' => _s('Max. upload file size'), 'content' => ' ' . format_bytes(get_ini_bytes(ini_get('upload_max_filesize'))), ], - 'graphics' => [ - 'label' => _s('Graphics library'), - ], - 'video' => [ - 'label' => _s('Video processing'), - 'content' => $ffmpegContent, - ], 'rebuild_stats' => [ 'label' => _s('Stats'), 'content' => '' . _s('Rebuild stats') . '', @@ -572,11 +520,113 @@ return function (Handler $handler) { '%label%' => $link['label'], ]); } - if (env()['CHEVERETO_CONTEXT'] !== 'saas') { + $ffmpegContent = ' '; + + try { + $missing = [ + 'proc_open' => ! function_exists('proc_open'), + 'proc_close' => ! function_exists('proc_close'), + ]; + $missing = array_filter($missing); + if ($missing) { + throw new Exception( + _s( + 'PHP function [%s] not available in this PHP installation', + implode(', ', array_keys($missing)) + ) + ); + } + $ffmpegErrors = []; + + try { + $ffmpeg = FFMpeg::create( + [ + 'ffmpeg.binaries' => env()['CHEVERETO_BINARY_FFMPEG'], + // 'ffprobe.binaries' => env()['CHEVERETO_BINARY_FFPROBE'], + ] + ); + } catch (Throwable $e) { + $ffmpegErrors[] = get_ffmpeg_error($e); + } + + try { + $ffprobe = FFProbe::create( + [ + 'ffprobe.binaries' => env()['CHEVERETO_BINARY_FFPROBE'], + ] + ); + $ffprobe->getFFProbeDriver()->getName(); + } catch (Throwable $e) { + $ffmpegErrors[] = get_ffmpeg_error($e); + } + if ($ffmpegErrors !== []) { + throw new Exception(implode('
    ', $ffmpegErrors)); + } + $ffmpegContent .= 'FFmpeg'; + if (isset($ffmpeg) && env()['CHEVERETO_CONTEXT'] !== 'saas') { + $ffmpegContent .= ' bin: ' + . env()['CHEVERETO_BINARY_FFMPEG'] + . ' version ' + . $ffmpeg->getFFMpegDriver()->getVersion() + . '
    ' + . ' FFprobe bin: ' + . env()['CHEVERETO_BINARY_FFPROBE']; + } + } catch (Throwable $e) { + $ffmpegContent = ' Error: ' + . get_ffmpeg_error($e) + . ''; + } + $graphicsLibraryContent = ' '; + if (ImageManagerStatic::getManager()->config['driver'] === 'imagick') { + $graphicVersion = Imagick::getVersion()['versionString']; + $graphicsLibraryContent .= $graphicVersion; + } else { + $graphicVersion = 'GD Version ' . gd_info()['GD Version']; + $graphicsLibraryContent .= $graphicVersion + . ' JPEG:' . gd_info()['JPEG Support'] + . ' GIF:' . gd_info()['GIF Read Support'] . '/' . gd_info()['GIF Create Support'] + . ' PNG:' . gd_info()['PNG Support'] + . ' WEBP:' . (gd_info()['WebP Support'] ?? 0) + . ' WBMP:' . gd_info()['WBMP Support'] + . ' XBM:' . gd_info()['XBM Support']; + } + $exifToolBinary = env()['CHEVERETO_BINARY_EXIFTOOL'] ?? ''; + $exifToolContent = ' ExifTool'; + if ($exifToolBinary !== '') { + $exifToolContent .= ' bin: ' . $exifToolBinary; + + try { + $exifTool = new ExifTool(env()['CHEVERETO_BINARY_EXIFTOOL']); + $exifToolContent .= ' version ' . $exifTool->version(); + } catch (RuntimeException $e) { + $exifToolContent .= ' ' . $e->getMessage() . ''; + } + } else { + $exifToolContent .= ' ' . _s('Not available') . ''; + } + $exifTranBinary = env()['CHEVERETO_BINARY_EXIFTRAN'] ?? ''; + $exifTranContent = ' ExifTran'; + if ($exifTranBinary !== '') { + $exifTranContent .= ' bin: ' . $exifTranBinary; + + try { + new ExifTran($exifTranBinary); + } catch (RuntimeException $e) { + $exifTranContent .= ' ' . $e->getMessage() . ''; + } + } else { + $exifTranContent .= ' ' . _s('Not available') . ''; + } $mysqlVersion = $db->getAttr(PDO::ATTR_SERVER_VERSION); $db->closeCursor(); $mysqlServerInfo = $db->getAttr(PDO::ATTR_SERVER_INFO); + $redisVersion = _s('Disabled'); + if (Cache::isEnabled()) { + $redisInfo = Cache::instance()->redis()->info(); + $redisVersion = 'Redis v' . $redisInfo['redis_version']; + } $phpIniLoaded = php_ini_loaded_file(); $phpIniFiles = php_ini_scanned_files() ?: 'N/A'; $phpIniFiles = explode(',', $phpIniFiles); @@ -594,7 +644,7 @@ return function (Handler $handler) { ], 'cli' => [ 'label' => 'CLI', - 'content' => ' ' . PATH_PUBLIC . 'app/bin/legacy', + 'content' => ' ' . PATH_PUBLIC . 'app/bin/cli', ], 'cron' => [ 'label' => _s('Cron last ran'), @@ -626,6 +676,11 @@ return function (Handler $handler) { . '
    ' . $mysqlServerInfo, ], + 'cache' => [ + 'label' => 'Cache', + 'content' => ' ' + . $redisVersion, + ], 'php_version' => [ 'label' => _s('PHP version'), 'content' => ' ' @@ -648,29 +703,26 @@ return function (Handler $handler) { 'label' => _s('Memory limit'), 'content' => ' ' . format_bytes(get_ini_bytes(ini_get('memory_limit'))), ], + 'graphics' => [ + 'label' => _s('Graphics library'), + 'content' => $graphicsLibraryContent, + ], + 'exiftool' => [ + 'label' => 'ExifTool', + 'content' => $exifToolContent, + ], + 'exiftran' => [ + 'label' => 'ExifTran', + 'content' => $exifTranContent, + ], + 'video' => [ + 'label' => _s('Video processing'), + 'content' => $ffmpegContent, + ], ]; - $pos = array_search('max_upload_size', array_keys($system_values), true); + $pos = array_search('upload_max_filesize', array_keys($system_values), true); array_splice($system_values, $pos, 0, $system_values_more); } - - $graphicsLibraryContent = ' '; - if (ImageManagerStatic::getManager()->config['driver'] === 'imagick') { - $graphicVersion = env()['CHEVERETO_CONTEXT'] === 'saas' - ? 'ImageMagick' - : Imagick::getVersion()['versionString']; - $system_values['graphics']['content'] = $graphicsLibraryContent . $graphicVersion; - } else { - $graphicVersion = env()['CHEVERETO_CONTEXT'] === 'saas' - ? 'GD ' - : ('GD Version ' . gd_info()['GD Version']); - $system_values['graphics']['content'] = $graphicsLibraryContent . $graphicVersion - . ' JPEG:' . gd_info()['JPEG Support'] - . ' GIF:' . gd_info()['GIF Read Support'] . '/' . gd_info()['GIF Create Support'] - . ' PNG:' . gd_info()['PNG Support'] - . ' WEBP:' . (gd_info()['WebP Support'] ?? 0) - . ' WBMP:' . gd_info()['WBMP Support'] - . ' XBM:' . gd_info()['XBM Support']; - } $handler::setVar('system_values', $system_values); $handler::setVar('totals', $totals); $handler::setVar('totals_display', $totals_display); @@ -717,7 +769,7 @@ return function (Handler $handler) { ]; if ($current) { $handler::setVar('settings', $settings_sections[$k]); - if (in_array($k, ['categories', 'ip-bans', 'external-storage'], true)) { + if (in_array($k, ['categories', 'ip-bans', 'upload-storage'], true)) { $handler::setCond('show_submit', false); } } @@ -727,6 +779,9 @@ return function (Handler $handler) { return; } + uasort($settings_sections, function ($a, $b) { + return strcoll($a['label'], $b['label']); + }); $handler::setVar('settings_menu', $settings_sections); if (isset($handler->request()[1])) { $requestSetting = $handler->request()[1]; @@ -791,7 +846,7 @@ return function (Handler $handler) { break; - case 'external-storage': + case 'upload-storage': $disk_used_all = Stat::getTotals()['disk_used']; $disk_used_external = DB::queryFetchSingle('SELECT SUM(storage_space_used) space_used FROM ' . DB::getTable('storages') . ';')['space_used']; $storage_usage = [ @@ -857,7 +912,7 @@ return function (Handler $handler) { $page = Page::getSingle($handler->request()[3], 'id'); if ($page) { // Workaround for default pages - if (starts_with('default/', $page['file_path'])) { + if (starts_with('default/', $page['file_path'] ?? '')) { $page['file_path'] = null; } } else { @@ -1060,9 +1115,11 @@ return function (Handler $handler) { } } if (($handler->request()[1] ?? null) === 'pages') { - $page_file_path_clean = trim(sanitize_relative_path($POST['page_file_path']), '/'); - $POST['page_file_path'] = str_replace('default/', '', $page_file_path_clean); - $POST['page_file_path_absolute'] = Page::getPath($POST['page_file_path']); + if (Config::enabled()->phpPages()) { + $page_file_path_clean = trim(sanitize_relative_path($POST['page_file_path']), '/'); + $POST['page_file_path'] = str_replace('default/', '', $page_file_path_clean); + $POST['page_file_path_absolute'] = Page::getPath($POST['page_file_path']); + } if (! filter_var($POST['page_sort_display'], FILTER_VALIDATE_INT)) { $POST['page_sort_display'] = null; } @@ -1076,9 +1133,13 @@ return function (Handler $handler) { $handler::updateVar('safe_post', [ 'page_is_active' => $POST['page_is_active'], 'page_is_link_visible' => $POST['page_is_link_visible'], - 'page_file_path_absolute' => $POST['page_file_path_absolute'], + // 'page_file_path_absolute' => $POST['page_file_path_absolute'], ]); } + $mailApis = ['smtp']; + if (env()['CHEVERETO_SERVICING'] !== 'docker') { + $mailApis[] = 'mail'; + } $validations = [ 'website_name' => [ 'validate' => isset($POST['website_name']), @@ -1166,7 +1227,7 @@ return function (Handler $handler) { 'error_msg' => _s('Invalid user id'), ], 'email_mode' => [ - 'validate' => isset($POST['email_mode']) && in_array($POST['email_mode'], ['smtp', 'mail'], true), + 'validate' => isset($POST['email_mode']) && in_array($POST['email_mode'], $mailApis, true), 'error_msg' => _s('Invalid email mode'), ], 'email_smtp_server_port' => [ @@ -1249,10 +1310,6 @@ return function (Handler $handler) { 'validate' => isset($POST['page_type'], $POST['page_url_key']) && $POST['page_type'] === 'internal' ? preg_match('/^[\w\-\_\/]+$/', $POST['page_url_key']) : true, 'error_msg' => _s('Invalid URL key'), ], - 'page_file_path' => [ - 'validate' => isset($POST['page_type'], $POST['page_file_path']) && $POST['page_type'] === 'internal' ? preg_match('/^[\w\-\_\/]+\.' . (Config::enabled()->phpPages() ? 'html|php' : 'html') . '$/', $POST['page_file_path']) : true, - 'error_msg' => _s('Invalid file path'), - ], 'page_link_url' => [ 'validate' => isset($POST['page_type'], $POST['page_link_url']) && $POST['page_type'] === 'link' ? is_url_web($POST['page_link_url']) : true, 'error_msg' => _s('Invalid link URL'), @@ -1308,6 +1365,12 @@ return function (Handler $handler) { 'error_msg' => _s('Invalid key'), ], ]; + if (Config::enabled()->phpPages()) { + $validations['page_file_path'] = [ + 'validate' => isset($POST['page_type'], $POST['page_file_path']) && $POST['page_type'] === 'internal' ? preg_match('/^[\w\-\_\/]+\.html|php$/', $POST['page_file_path']) : true, + 'error_msg' => _s('Invalid file path'), + ]; + } $customRoutes = []; foreach (['image', 'album', 'user'] as $test) { $tryValue = $POST['route_' . $test] ?? null; @@ -1389,8 +1452,6 @@ return function (Handler $handler) { if (isset($POST[$k])) { if (! is_numeric($POST[$k]) || $POST[$k] == 0) { $error_max_filesize = _s('Invalid value'); - } elseif (get_bytes($POST[$k] . 'MB') > Settings::get('true_upload_max_filesize')) { - $error_max_filesize = _s('Max. allowed %s', format_bytes(Settings::get('true_upload_max_filesize'))); } $validations[$k] = [ 'validate' => ! isset($error_max_filesize), @@ -1736,15 +1797,17 @@ return function (Handler $handler) { : null; try { - Page::writePage([ - 'file_path' => $POST['page_file_path'], - 'code' => $page_write_code, - ]); - if ($handler->request()[2] === 'edit' - && isset($page['file_path']) - && ! hash_equals((string) $page['file_path'], (string) $POST['page_file_path']) - ) { - unlinkIfExists(Page::getPath($page['file_path'])); + if (Config::enabled()->phpPages()) { + Page::writePage([ + 'file_path' => $POST['page_file_path'], + 'code' => $page_write_code, + ]); + if ($handler->request()[2] === 'edit' + && isset($page['file_path']) + && ! hash_equals((string) $page['file_path'], (string) $POST['page_file_path']) + ) { + unlinkIfExists(Page::getPath($page['file_path'])); + } } if (isset($page['id'])) { Page::update((int) $page['id'], [ @@ -1841,7 +1904,7 @@ return function (Handler $handler) { } $oldSettings = Settings::get(); if ($update_settings !== [] && Settings::update($update_settings)) { - new Settings(); + new Settings(reCache: true); $diffSettings = array_diff_key($oldSettings, Settings::get()); foreach ($diffSettings as $k => $v) { Settings::setValue($k, $v); diff --git a/app/legacy/routes/image.php b/app/legacy/routes/image.php index 3a82c33..a30b184 100644 --- a/app/legacy/routes/image.php +++ b/app/legacy/routes/image.php @@ -150,7 +150,7 @@ return function (Handler $handler) { } if (isset($image['user']['id']) && ($handler::cond('content_manager') || $is_owner)) { - $image['user']['albums'] = User::getAlbums((int) $image['user']['id']); + $image['user']['albums'] = User::getAlbums($image['user']); } $is_album_cover = false; if (isset($image['album']['id'])) { diff --git a/app/legacy/routes/json.php b/app/legacy/routes/json.php index 02b160b..86e94f9 100644 --- a/app/legacy/routes/json.php +++ b/app/legacy/routes/json.php @@ -14,6 +14,7 @@ use Chevereto\Config\Config; use Chevereto\Legacy\Classes\Akismet; use Chevereto\Legacy\Classes\Album; use Chevereto\Legacy\Classes\ApiKey; +use Chevereto\Legacy\Classes\Categories; use Chevereto\Legacy\Classes\Category; use Chevereto\Legacy\Classes\DB; use Chevereto\Legacy\Classes\Follow; @@ -31,10 +32,12 @@ use Chevereto\Legacy\Classes\Stat; use Chevereto\Legacy\Classes\Storage; use Chevereto\Legacy\Classes\Tag; use Chevereto\Legacy\Classes\TwoFactor; +use Chevereto\Legacy\Classes\Upload; use Chevereto\Legacy\Classes\User; use Chevereto\Legacy\G\Handler; use Hybridauth\Hybridauth; use function Chevere\Message\message; +use function Chevere\Standard\randomString; use function Chevere\ThrowableHandler\throwableHandler; use function Chevere\Writer\writers; use function Chevere\xrDebug\PHP\throwableHandler as XrThrowableHandler; @@ -47,6 +50,8 @@ use function Chevereto\Legacy\G\datetime; use function Chevereto\Legacy\G\datetimegmt; use function Chevereto\Legacy\G\fetch_url; use function Chevereto\Legacy\G\get_base_url; +use function Chevereto\Legacy\G\get_bytes; +use function Chevereto\Legacy\G\get_client_ip; use function Chevereto\Legacy\G\get_current_url; use function Chevereto\Legacy\G\get_public_url; use function Chevereto\Legacy\G\json_document_output; @@ -54,6 +59,7 @@ use function Chevereto\Legacy\G\nullify_string; use function Chevereto\Legacy\G\require_theme_file; use function Chevereto\Legacy\G\starts_with; use function Chevereto\Legacy\getSetting; +use function Chevereto\Legacy\getVariable; use function Chevereto\Legacy\isDebug; use function Chevereto\Legacy\isShowEmbedContent; use function Chevereto\Legacy\send_mail; @@ -62,14 +68,17 @@ use function Chevereto\Vars\env; use function Chevereto\Vars\files; use function Chevereto\Vars\post; use function Chevereto\Vars\request; +use function Chevereto\Vars\requestHeaders; use function Chevereto\Vars\session; return function (Handler $handler) { try { - $REQUEST = request(); - $FILES = files(); $POST = post(); - if (! $handler::checkAuthToken(request()['auth_token'] ?? '')) { + $REQUEST = request(); + $HEADERS = requestHeaders(); + $REQUEST['auth_token'] ??= $HEADERS['X-Auth-Token'] ?? ''; + $REQUEST['action'] ??= $HEADERS['X-Action'] ?? ''; + if (! $handler::checkAuthToken($REQUEST['auth_token'] ?? '')) { throw new Exception(_s('Request denied'), 401); } $logged_user = Login::getUser(); @@ -88,32 +97,188 @@ return function (Handler $handler) { } $import = new Import(); } + if (in_array($doing, ['chunked-upload', 'upload-chunk', 'upload'], true)) { + if (! $handler::cond('upload_allowed')) { + throw new Exception(_s('Request denied'), 403); + } + $REQUEST['type'] ??= $HEADERS['X-Type'] ?? ''; + if ($doing !== 'upload-chunk') { + $source = $REQUEST['type'] === 'file' + ? files()['source'] + : $REQUEST['source']; + } + /** @var ?int $ownerId */ + $ownerId = $logged_user['id'] ?? null; + $REQUEST['owner'] ??= $HEADERS['X-Owner'] ?? null; + if ((Login::isAdmin() || Login::isManager()) && ! empty($REQUEST['owner'])) { + $ownerId = decodeID($REQUEST['owner']); + } + } + $chunkUploadSize = getSetting('chunk_upload_size'); switch ($doing) { + case 'chunked-upload': + $maxSize = get_bytes(getSetting('upload_max_filesize_mb') . ' MB'); + $checksum = $REQUEST['checksum'] ?? ''; + $size = (int) ($REQUEST['size'] ?? 0); + if (! preg_match('/^[a-f0-9]{16,}$/', $checksum)) { + throw new Exception('Invalid file checksum', 100); + } + if ($size === 0) { + throw new Exception('Invalid file size', 100); + } + if ($source === '') { + throw new Exception('Invalid file name', 100); + } + $extension = strtolower(pathinfo($source, PATHINFO_EXTENSION)); + if ($extension === '') { + throw new Exception('Missing file extension', 100); + } + if (! in_array($extension, Image::getEnabledImageExtensions(), true)) { + throw new Exception('Unsupported file extension', 100); + } + if ($size > $maxSize) { + throw new Exception('File size exceeds maximum', 101); + } + $do_dupe_check = ! getSetting('enable_duplicate_uploads') && ! Login::isAdmin(); + if ($do_dupe_check && (Image::isDuplicatedChunkUpload($checksum) || Image::isDuplicatedUpload($checksum))) { + throw new Exception(_s('Duplicated upload'), 101); + } + $token = randomString(64); + $uploadId = DB::insert('uploads', [ + 'user_id' => $ownerId, + 'uploader_ip' => get_client_ip(), + 'token' => $token, + 'checksum' => $checksum, + 'params' => json_encode([ + 'source' => $REQUEST['source'], + ]), + 'chunks' => ceil($size / $chunkUploadSize), + ]); + $json_array['status_code'] = 200; + $json_array['success'] = [ + 'message' => 'chunked upload', + 'code' => 200, + 'upload_id' => encodeID($uploadId), + 'token' => $token, + 'hash' => hash_hmac( + 'sha256', + $uploadId . $token, + getVariable('crypt_salt')->string() + ), + ]; + + break; + case 'upload-chunk': + if ($logged_user !== []) { + session_write_close(); + } + $uploadId = decodeID($HEADERS['X-Upload-Id']); + $index = (int) ($HEADERS['X-Index'] ?? 0); + $token = $HEADERS['X-Token'] ?? ''; + $hash = $HEADERS['X-Hash'] ?? ''; + if ($index === 0) { + throw new Exception('Invalid chunk index', 100); + } + if ($token === '') { + throw new Exception('Invalid token', 100); + } + if ($hash === '') { + throw new Exception('Invalid hash', 100); + } + $calcHash = hash_hmac( + 'sha256', + $uploadId . $token, + getVariable('crypt_salt')->string() + ); + if (! hash_equals($calcHash, $hash)) { + throw new Exception('Invalid hash', 100); + } + $uploadWhere = [ + 'id' => $uploadId, + 'token' => $token, + ]; + if ($logged_user !== []) { + $uploadWhere['user_id'] = $logged_user['id']; + } + $uploadRow = DB::get( + table: 'uploads', + where: $uploadWhere, + limit: 1, + ); + if (! $uploadRow) { + throw new Exception('Missing upload id', 100); + } + if ($index > $uploadRow['upload_chunks']) { + throw new Exception('Invalid chunk index', 100); + } + $db = DB::getInstance(); + $db->query( + 'SELECT COUNT(*) c FROM ' + . DB::getTable('uploads_chunks') + . ' WHERE upload_chunk_upload_id=:upload_id AND upload_chunk_index=:chunk_index;' + ); + $db->bind(':upload_id', $uploadId); + $db->bind(':chunk_index', $index); + if ($db->fetchSingle()['c'] > 0) { + throw new Exception('Chunk already uploaded', 100); + } + // $chunkFile = $source['tmp_name']; + // if (! file_exists($chunkFile)) { + // throw new Exception('Missing chunk file', 100); + // } + // $chunkFilesize = filesize($chunkFile); + // if ($chunkFilesize === 0) { + // throw new Exception('Empty chunk file', 100); + // } + // if ($chunkFilesize > $chunkUploadSize) { + // throw new Exception('Chunk file size exceeds maximum', 101); + // } + // Handle chunk upload as a stream (for "source" stream input) + $chunkFile = Upload::getTempNam(suffix: "{$uploadId}_{$index}"); + $inputStream = fopen('php://input', 'rb'); + if ($inputStream === false) { + throw new Exception('Failed to open input stream', 100); + } + $outputStream = fopen($chunkFile, 'wb'); + if ($outputStream === false) { + fclose($inputStream); + + throw new Exception('Failed to open chunk file for writing', 100); + } + stream_copy_to_stream($inputStream, $outputStream); + fclose($inputStream); + fclose($outputStream); + if (! file_exists($chunkFile) || filesize($chunkFile) === 0) { + throw new Exception('Failed to write chunk file', 100); + } + DB::insert('uploads_chunks', [ + 'upload_id' => $uploadId, + 'index' => $index, + 'path' => $chunkFile, + ]); + $json_array['status_code'] = 200; + $json_array['success'] = [ + 'message' => 'chunk uploaded', + 'code' => 200, + ]; + + break; case 'upload': // EX 100 // NOTE: This is considering assets and user uploads as the same "upload" action - - $source = $REQUEST['type'] === 'file' - ? $FILES['source'] - : $REQUEST['source']; $type = $REQUEST['type']; - /** @var ?int $owner_id */ - $owner_id = ! empty($REQUEST['owner']) - ? decodeID($REQUEST['owner']) - : ($logged_user['id'] ?? null); - if (isset($REQUEST['what']) && in_array($REQUEST['what'], ['avatar', 'background'], true) ) { if ($logged_user === []) { throw new Exception(_s('Login needed'), 403); } - if (! $handler::cond('content_manager') && $owner_id !== $logged_user['id']) { + if (! $handler::cond('content_manager') && $ownerId !== $logged_user['id']) { throw new Exception('Invalid content owner request', 115); } $user_picture_upload = User::uploadPicture( - $owner_id === $logged_user['id'] + $ownerId === $logged_user['id'] ? $logged_user - : $owner_id, + : $ownerId, $REQUEST['what'], $source ); @@ -125,15 +290,13 @@ return function (Handler $handler) { break; } - if (! $handler::cond('upload_allowed')) { - throw new Exception(_s('Request denied'), 403); - } if ($handler::cond('forced_private_mode')) { $REQUEST['privacy'] = getSetting('website_content_privacy_mode'); } if (! empty($REQUEST['album_id'])) { $REQUEST['album_id'] = decodeID($REQUEST['album_id']); } + // TODO: Unify this check if (! $handler::cond('content_manager') && getSetting('akismet')) { Akismet::checkImage( title: $REQUEST['title'] ?? null, @@ -144,7 +307,7 @@ return function (Handler $handler) { } $uploadToWebsite = Image::uploadToWebsite($source, $logged_user, $REQUEST); if ($logged_user !== []) { - session_write_close(); // guest session uploads + session_write_close(); } $uploaded_id = intval($uploadToWebsite[0]); $json_array['status_code'] = 200; @@ -198,7 +361,7 @@ return function (Handler $handler) { if (! empty($REQUEST['albumid'])) { $album_id = decodeID($REQUEST['albumid']); } - $owner_id = null; + $ownerId = null; $where = ''; switch ($list_request) { case 'images': @@ -219,11 +382,11 @@ return function (Handler $handler) { ]; } if (! empty($REQUEST['userid'])) { - $owner_id = decodeID($REQUEST['userid']); + $ownerId = decodeID($REQUEST['userid']); $where .= ($where === '' ? 'WHERE' : ' AND') . ' image_user_id=:image_user_id'; $binds[] = [ 'param' => ':image_user_id', - 'value' => $owner_id, + 'value' => $ownerId, ]; } if (isset($album_id)) { @@ -234,12 +397,12 @@ return function (Handler $handler) { ]; $album = Album::getSingle($album_id); if ($album['user']['id'] ?? false) { - $owner_id = $album['user']['id']; + $ownerId = $album['user']['id']; } if ($album['privacy'] === 'password' && ( ! $handler::cond('content_manager') - && $owner_id !== ($logged_user['id'] ?? 0) + && $ownerId !== ($logged_user['id'] ?? 0) && ! Album::checkSessionPassword($album) ) ) { @@ -267,11 +430,11 @@ return function (Handler $handler) { $binds = []; $where = ''; if (! empty($REQUEST['userid'])) { - $owner_id = decodeID($REQUEST['userid']); + $ownerId = decodeID($REQUEST['userid']); $where .= 'WHERE album_user_id=:album_user_id'; $binds[] = [ 'param' => ':album_user_id', - 'value' => $owner_id, + 'value' => $ownerId, ]; } if (isset($REQUEST['from'])) { @@ -404,14 +567,14 @@ return function (Handler $handler) { } } $listing->setWhere($where); - if (isset($owner_id)) { - $listing->setOwner((int) $owner_id); + if (isset($ownerId)) { + $listing->setOwner((int) $ownerId); } $listing->setRequester($logged_user); if (in_array($list_request, ['images', 'albums'], true) && ( $handler::cond('content_manager') - || ($logged_user !== [] && $owner_id === $logged_user['id']) + || ($logged_user !== [] && $ownerId === $logged_user['id']) ) ) { $listing->setTools(true); @@ -432,6 +595,7 @@ return function (Handler $handler) { $listing->bind($bind['param'], $bind['value']); } } + $listing->setOutputAssoc(true); $listing->exec(); $json_array['status_code'] = 200; if ($doing === 'get-album-contents' @@ -456,7 +620,7 @@ return function (Handler $handler) { $editing_request = $REQUEST['editing']; $editing = $editing_request; $type = $REQUEST['edit']; - $owner_id = ! empty($REQUEST['owner']) ? decodeID($REQUEST['owner']) : $logged_user['id']; + $ownerId = ! empty($REQUEST['owner']) ? decodeID($REQUEST['owner']) : $logged_user['id']; if (! in_array($type, ['image', 'album', 'images', 'albums', 'category', 'tag', 'storage', 'ip_ban'], true)) { throw new Exception('Invalid edit request', 100); } @@ -702,6 +866,7 @@ return function (Handler $handler) { 'code' => 200, ]; $json_array['category'] = $category; + Categories::deleteCache(); break; case 'tag': @@ -891,6 +1056,7 @@ return function (Handler $handler) { 'code' => 200, ]; $json_array['category'] = $category; + Categories::deleteCache(); break; case 'add-ip_ban': @@ -965,12 +1131,7 @@ return function (Handler $handler) { throw new Exception(_s('Login needed'), 403); } $editing = $REQUEST['editing']; - $owner_id = $logged_user['id']; - if (! $handler::cond('content_manager') - && $owner_id !== $logged_user['id'] - ) { - throw new Exception('Invalid content owner request', 110); - } + $ownerId = $logged_user['id']; $ids = []; foreach ($editing['ids'] as $id) { $ids[] = decodeID($id); @@ -1039,23 +1200,23 @@ return function (Handler $handler) { if ($logged_user === [] && $album['new'] === false) { throw new Exception('Invalid request', 403); } - $owner_id = ! empty($REQUEST['owner']) + $ownerId = ! empty($REQUEST['owner']) ? decodeID($REQUEST['owner']) : ($logged_user['id'] ?? null); - if (! $handler::cond('content_manager') && $owner_id !== ($logged_user['id'] ?? null)) { - throw new Exception('Invalid content owner request' . var_export($owner_id, true), 112); + if (! $handler::cond('content_manager') && $ownerId !== ($logged_user['id'] ?? null)) { + throw new Exception('Invalid content owner request', 112); } if ($handler::cond('forced_private_mode')) { $album['privacy'] = getSetting('website_content_privacy_mode'); } if (! $handler::cond('content_manager') && getSetting('akismet') && $album['new']) { - Akismet::checkAlbum($album['name'], $album['description'], $owner_id === $logged_user['id'] ? $logged_user_source_db : null); + Akismet::checkAlbum($album['name'], $album['description'], $ownerId === $logged_user['id'] ? $logged_user_source_db : null); } $album_id = $album['new'] ? Album::insert([ 'name' => $album['name'], - 'user_id' => $owner_id, + 'user_id' => $ownerId, 'privacy' => $album['privacy'], 'description' => $album['description'], 'password' => $album['password'] ?? null, @@ -1116,7 +1277,7 @@ return function (Handler $handler) { } $album_move_db = isset($album_db['album_id']) ? Album::getSingle(id: (int) $album_db['album_id'], pretty: false) - : User::getStreamAlbum($owner_id); + : User::getStreamAlbum($ownerId); $json_array['status_code'] = 200; $json_array['success'] = [ 'message' => 'Content added to album', @@ -1155,7 +1316,7 @@ return function (Handler $handler) { ) { throw new Exception('Forbidden action', 403); } - $owner_id = isset($REQUEST['owner']) + $ownerId = isset($REQUEST['owner']) ? decodeID($REQUEST['owner']) : $logged_user['id']; $multiple = ($REQUEST['multiple'] ?? null) == 'true'; @@ -1165,7 +1326,7 @@ return function (Handler $handler) { } if ( in_array($type, ['avatar', 'background', 'user', 'ip_ban', 'api_key', 'two_factor'], true) - && ! $handler::cond('content_manager') && $owner_id !== $logged_user['id'] + && ! $handler::cond('content_manager') && $ownerId !== $logged_user['id'] ) { throw new Exception('Invalid content owner request', 113); } @@ -1182,7 +1343,7 @@ return function (Handler $handler) { throw new Exception('Invalid content manager request', 115); } if (in_array($type, ['avatar', 'background'], true)) { - User::deletePicture($owner_id === $logged_user['id'] ? $logged_user : $owner_id, $type); + User::deletePicture($ownerId === $logged_user['id'] ? $logged_user : $ownerId, $type); $json_array['status_code'] = 200; $json_array['success'] = [ 'message' => 'Profile background deleted', @@ -1193,9 +1354,9 @@ return function (Handler $handler) { } if ($type === 'two_factor') { $userTarget = intval( - $owner_id === $logged_user['id'] + $ownerId === $logged_user['id'] ? $logged_user['id'] - : $owner_id + : $ownerId ); if (! TwoFactor::hasFor($userTarget)) { $status_code = 403; @@ -1215,9 +1376,9 @@ return function (Handler $handler) { } if ($type === 'api_key') { $userTarget = intval( - $owner_id === $logged_user['id'] + $ownerId === $logged_user['id'] ? $logged_user['id'] - : $owner_id + : $ownerId ); $apiKey = ApiKey::getUserKey($userTarget); if ($apiKey !== []) { @@ -1232,7 +1393,9 @@ return function (Handler $handler) { break; } if ($type === 'user') { - $delete_user_id = $owner_id === $logged_user['id'] ? $logged_user : $owner_id; + $delete_user_id = $ownerId === $logged_user['id'] + ? $logged_user + : $ownerId; $delete_user = User::getSingle($delete_user_id, 'id'); if ($delete_user === []) { throw new Exception(_s('%s not found', _n('User', 'Users', 1)), 100); @@ -1266,6 +1429,7 @@ return function (Handler $handler) { ], [ 'category_id' => $deleting['id'], ]); + Categories::deleteCache(); } else { throw new Exception('Error deleting category', 400); } @@ -1738,7 +1902,7 @@ return function (Handler $handler) { break; case 'paletteSet': - if ($logged_user === []) { + if ($logged_user === [] || ! getSetting('theme_palette_user_select')) { throw new Exception('Invalid request', 403); } $palette_id = (int) $REQUEST['palette_id']; diff --git a/app/legacy/routes/page.php b/app/legacy/routes/page.php index d6993e7..ff8182d 100644 --- a/app/legacy/routes/page.php +++ b/app/legacy/routes/page.php @@ -9,9 +9,11 @@ * file that was distributed with this source code. */ +use Chevereto\Legacy\Classes\Cache; use Chevereto\Legacy\Classes\Page; use Chevereto\Legacy\G\Handler; use function Chevereto\Legacy\G\add_ending_slash; +use function Chevereto\Legacy\G\str_replace_last; use function Chevereto\Vars\env; return function (Handler $handler) { @@ -20,26 +22,42 @@ return function (Handler $handler) { return; } - $request_url_key = implode('/', $handler->request()); - $page = Page::getSingle($request_url_key); + $urlKey = implode('/', $handler->request()); + $cacheKey = Page::getCacheKey($urlKey); + $page = Cache::instance()->get($cacheKey); + if ($page === false) { + $page = Page::getSingle($urlKey); + if ($page !== []) { + Cache::instance()->set($cacheKey, $page, 3600); + } + } if (! $page || ! $page['is_active'] || $page['type'] !== 'internal') { $handler->issueError(404); return; } - if (! $page['file_path_absolute']) { - $handler->issueError(404); + if ((bool) env()['CHEVERETO_ENABLE_PHP_PAGES']) { + if (! fileExists($page['file_path_absolute'] ?? null)) { + $handler->issueError(404); - return; + return; + } + $pathinfo = pathinfo($page['file_path_absolute']); + $handler->setPathTheme(add_ending_slash($pathinfo['dirname'])); + } else { + if ($page['code'] === null) { + $file = str_replace_last('.php', '.html', $page['file_path_absolute']); + if (fileExists($file)) { + $page['code'] = file_get_contents($file); + } + if ($page['code'] !== null) { + Page::update($page['id'], [ + 'code' => $page['code'], + ]); + } + } + $handler->setContent($page['code'] ?? ''); } - if (! file_exists($page['file_path_absolute'])) { - $handler->issueError(404); - - return; - } - $pathinfo = pathinfo($page['file_path_absolute']); - $handler->setPathTheme(add_ending_slash($pathinfo['dirname'])); - $handler->setTemplate($pathinfo['filename']); $page_metas = [ 'pre_doctitle' => $page['title'], 'meta_description' => htmlspecialchars($page['description'] ?? ''), @@ -52,3 +70,12 @@ return function (Handler $handler) { $handler->setVar($k, $v); } }; + +function fileExists(?string $file): bool +{ + if ($file === null || $file === '') { + return false; + } + + return file_exists($file); +} diff --git a/app/legacy/routes/settings.php b/app/legacy/routes/settings.php index 2a1d2af..054886d 100644 --- a/app/legacy/routes/settings.php +++ b/app/legacy/routes/settings.php @@ -396,7 +396,7 @@ return function (Handler $handler) { break; case 'security': - if (! TwoFactor::hasFor($user['id']) && sessionVar()->hasKey('two_factor_secret')) { + if (! TwoFactor::hasFor($user['id']) && sessionVar()->has('two_factor_secret')) { $twoFactor = new TwoFactor(); $twoFactor = $twoFactor->withSecret(session()['two_factor_secret']); sessionVar()->remove('two_factor_secret'); diff --git a/app/legacy/routes/tag.php b/app/legacy/routes/tag.php index 52b7c32..2222242 100644 --- a/app/legacy/routes/tag.php +++ b/app/legacy/routes/tag.php @@ -85,6 +85,7 @@ return function (Handler $handler) { $sumViews[] = $tag['id']; } } + $sumViews = array_unique($sumViews); $tags_names = array_column($tags, 'name'); $tag_string = implode(', ', $tags_names); $tag_string_no_spaces = implode(',', $tags_names); diff --git a/app/legacy/routes/user.php b/app/legacy/routes/user.php index ed1e039..7c4c2fa 100644 --- a/app/legacy/routes/user.php +++ b/app/legacy/routes/user.php @@ -410,15 +410,18 @@ return function (Handler $handler) { } } if (! isset($tabs)) { - $tabs = Listing::getTabs([ - 'listing' => $type, - 'basename' => $base_user_url, - 'tools' => $tools, - 'tools_available' => $tools_available ?? [], - 'params_hidden' => $params_hidden, - 'params_remove_keys' => $params_remove_keys ?? null, - 'tag' => rawurldecode($tag_string_no_spaces), - ], [], true); + $tabs = Listing::getTabs( + args: [ + 'listing' => $type, + 'basename' => $base_user_url, + 'tools' => $tools, + 'tools_available' => $tools_available ?? [], + 'params_hidden' => $params_hidden, + 'params_remove_keys' => $params_remove_keys ?? null, + 'tag' => rawurldecode($tag_string_no_spaces), + ], + expanded: true + ); $currentKey = $tabs['currentKey']; $tabs = $tabs['tabs']; } diff --git a/app/routing/admin.api-v4.php b/app/routing/admin.api-v4.php deleted file mode 100644 index 092d468..0000000 --- a/app/routing/admin.api-v4.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use function Chevere\Router\route; -use function Chevere\Router\routes; -use Chevereto\Controllers\Api\V4\Ban\Ip\BanIpDeleteController; -use Chevereto\Controllers\Api\V4\Ban\Ip\BanIpPatchController; -use Chevereto\Controllers\Api\V4\Ban\Ip\BanIpPostController; -use Chevereto\Controllers\Api\V4\Category\CategoryPostController; -use Chevereto\Controllers\Api\V4\Image\Bulk\ImageBulkPatchController; -use Chevereto\Controllers\Api\V4\Stat\Rebuild\StatRebuildPostController; -use Chevereto\Controllers\Api\V4\Storage\Migrate\StorageMigratePostController; -use Chevereto\Controllers\Api\V4\Storage\Stat\Regen\StorageStatRegenPostController; -use Chevereto\Controllers\Api\V4\Storage\StoragePostController; -use Chevereto\Controllers\Api\V4\Tool\Id\Decode\ToolDecodeIdGetController; -use Chevereto\Controllers\Api\V4\Tool\Id\Encode\ToolEncodeIdGetController; -use Chevereto\Controllers\Api\V4\Tool\Probe\Email\ToolProbeEmailPostController; -use Chevereto\Controllers\Api\V4\User\Export\UserExportGetController; -use Chevereto\Controllers\Api\V4\User\UserGetController; -use Chevereto\Controllers\Api\V4\User\UserPostController; - -$prefix = '/api/4/admin/'; - -return routes( - route( - path: $prefix . 'bans/ip/', - POST: new BanIpPostController(), - ), - route( - path: $prefix . 'bans/ip/{ip}/', - DELETE: new BanIpDeleteController(), - PATCH: new BanIpPatchController(), - ), - route( - path: $prefix . 'categories/', - POST: new CategoryPostController(), - ), - route( - path: $prefix . 'categories/{id}/', - // DELETE: , - // PATCH: , - ), - route( - path: $prefix . 'images/bulk/approve/', - PATCH: new ImageBulkPatchController(), - ), - route( - path: $prefix . 'imports/', - // POST: , - ), - route( - path: $prefix . 'imports/{id}/', - // DELETE: , - // GET: , - // PATCH: , - ), - route( - path: $prefix . 'imports/{id}/process/', - // POST: , - ), - route( - path: $prefix . 'imports/{id}/reset/', - // POST: , - ), - route( - path: $prefix . 'imports/{id}/resume/', - // POST: , - ), - route( - path: $prefix . 'stats/rebuild/', - POST: new StatRebuildPostController(), - ), - route( - path: $prefix . 'storages/', - POST: new StoragePostController(), - ), - route( - path: $prefix . 'storages/{id}/', - // PATCH: , - ), - route( - path: $prefix . 'storages/{id}/migrate/', - POST: new StorageMigratePostController(), - ), - route( - path: $prefix . 'storages/{id}/stats/regen/', - POST: new StorageStatRegenPostController(), - ), - route( - path: $prefix . 'tools/id/{id}/decode/', - GET: new ToolDecodeIdGetController(), - ), - route( - path: $prefix . 'tools/id/{id}/encode/', - GET: new ToolEncodeIdGetController(), - ), - route( - path: $prefix . 'tools/probe/email/', - POST: new ToolProbeEmailPostController(), - ), - route( - path: $prefix . 'users/', - POST: new UserPostController(), - ), - route( - path: $prefix . 'users/{id}/', - GET: new UserGetController(), - ), - route( - path: $prefix . 'users/{id}/export/', - GET: new UserExportGetController(), - ), -); diff --git a/app/routing/admin.web.php b/app/routing/admin.web.php deleted file mode 100644 index a8335de..0000000 --- a/app/routing/admin.web.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use function App\Controllers\legacyController; -use function Chevere\Router\route; -use function Chevere\Router\routes; - -return routes( - route( - name: 'dashboard', - path: '/dashboard/', - GET: legacyController('route.dashboard.php'), - POST: legacyController('route.dashboard.php'), - ), - route( - name: 'importer-jobs', - path: '/importer-jobs/', - GET: legacyController('route.importer-jobs.php'), - ), - route( - name: 'install', - path: '/install/', - GET: legacyController('route.install.php'), - POST: legacyController('route.install.php'), - ), - route( - name: 'update', - path: '/update/', - POST: legacyController('route.update.php'), - ), -); diff --git a/app/routing/user.api-v1.php b/app/routing/user.api-v1.php deleted file mode 100644 index 42fcae6..0000000 --- a/app/routing/user.api-v1.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use function Chevere\Router\route; -use function Chevere\Router\routes; -use Chevereto\Controllers\Api\V1\Upload\UploadPostController; - -return routes( - route( - path: '/api/1/upload/', - POST: new UploadPostController() - ), -); diff --git a/app/routing/user.api-v4.php b/app/routing/user.api-v4.php deleted file mode 100644 index 9d481ae..0000000 --- a/app/routing/user.api-v4.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - - -use function Chevere\Router\route; -use function Chevere\Router\routes; -use Chevereto\Controllers\Api\V4\Album\AlbumDeleteController; -use Chevereto\Controllers\Api\V4\Album\AlbumGetController; -use Chevereto\Controllers\Api\V4\Album\AlbumPatchController; -use Chevereto\Controllers\Api\V4\Album\AlbumPostController; -use Chevereto\Controllers\Api\V4\Album\Like\AlbumLikeDeleteController; -use Chevereto\Controllers\Api\V4\Album\Like\AlbumLikePostController; -use Chevereto\Controllers\Api\V4\Image\Bulk\ImageBulkPatchController; -use Chevereto\Controllers\Api\V4\Image\ImageGetController; -use Chevereto\Controllers\Api\V4\Image\ImagePatchController; -use Chevereto\Controllers\Api\V4\Image\ImagePostController; -use Chevereto\Controllers\Api\V4\Image\Like\ImageLikeDeleteController; -use Chevereto\Controllers\Api\V4\Image\Like\ImageLikePostController; -use Chevereto\Controllers\Api\V4\User\Asset\Avatar\UserAssetAvatarDeleteController; -use Chevereto\Controllers\Api\V4\User\Asset\Avatar\UserAssetAvatarPostController; -use Chevereto\Controllers\Api\V4\User\Asset\Background\UserAssetBackgroundDeleteController; -use Chevereto\Controllers\Api\V4\User\Asset\Background\UserAssetBackgroundPostController; -use Chevereto\Controllers\Api\V4\User\Follow\UserFollowDeleteController; -use Chevereto\Controllers\Api\V4\User\Follow\UserFollowPostController; -use Chevereto\Controllers\Api\V4\User\Setting\UserSettingPatchController; - -$prefix = '/api/4/user/'; - -return routes( - route( - path: $prefix . 'account/notifications/social/', - // GET: , - ), - route( - path: $prefix . 'account/notifications/social/{id}/', - // PATCH: , - ), - route( - path: $prefix . 'account/settings/', - PATCH: new UserSettingPatchController(), - ), - route( - path: $prefix . 'account/login/{service}/', - // DELETE: , - ), - route( - path: $prefix . 'albums/', - POST: new AlbumPostController(), - ), - route( - path: $prefix . 'albums/{id}/', - DELETE: new AlbumDeleteController(), - GET: new AlbumGetController(), - PATCH: new AlbumPatchController(), - ), - route( - path: $prefix . 'albums/{id}/contents/', - // GET: , - ), - route( - path: $prefix . 'albums/{id}/like/', - DELETE: new AlbumLikeDeleteController(), - POST: new AlbumLikePostController(), - ), - route( - path: $prefix . 'albums/bulk/', - // DELETE: , - ), - route( - path: $prefix . 'albums/bulk/parent/', - // PATCH: , - ), - route( - path: $prefix . 'albums/list/', - // GET: - ), - route( - path: $prefix . 'images/', - POST: new ImagePostController(), - ), - route( - path: $prefix . 'images/{id}/', - // DELETE: , - GET: new ImageGetController(), - PATCH: new ImagePatchController(), - ), - route( - path: $prefix . 'images/{id}/like/', - DELETE: new ImageLikeDeleteController(), - POST: new ImageLikePostController(), - ), - route( - path: $prefix . 'images/bulk/', - PATCH: new ImageBulkPatchController(), - ), - route( - path: $prefix . 'images/list/', - // GET: - ), - route( - path: $prefix . 'user/{username}/assets/avatar/', - DELETE: new UserAssetAvatarDeleteController(), - POST: new UserAssetAvatarPostController() - ), - route( - path: $prefix . 'user/{username}/assets/background/', - DELETE: new UserAssetBackgroundDeleteController(), - POST: new UserAssetBackgroundPostController() - ), - route( - path: $prefix . 'users/{username}/follow/', - DELETE: new UserFollowDeleteController(), - POST: new UserFollowPostController(), - ), - route( - path: $prefix . 'users/list/', - // GET:, - ), -); diff --git a/app/routing/user.web.php b/app/routing/user.web.php deleted file mode 100644 index 46dce2e..0000000 --- a/app/routing/user.web.php +++ /dev/null @@ -1,127 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -use function App\Controllers\legacyController; -use function Chevere\Router\route; -use function Chevere\Router\routes; - -return routes( - route( - name: 'index', - path: '/', - ), - route( - name: 'account', - path: '/account/', - GET: legacyController('account.php'), - POST: legacyController('account.php'), - ), - route( - name: 'album', - path: '/album/', - GET: legacyController('album.php'), - POST: legacyController('album.php'), - ), - route( - name: 'category', - path: '/category/', - GET: legacyController('category.php'), - ), - route( - name: 'connect', - path: '/connect/', - GET: legacyController('connect.php'), - ), - route( - name: 'explore', - path: '/explore/', - GET: legacyController('explore.php'), - ), - route( - name: 'following', - path: '/following/', - GET: legacyController('following.php'), - ), - route( - name: 'image', - path: '/image/', - GET: legacyController('image.php'), - ), - route( - name: 'login', - path: '/login/', - GET: legacyController('login.php'), - POST: legacyController('login.php'), - ), - route( - name: 'logout', - path: '/logout/', - GET: legacyController('logout.php'), - ), - route( - name: 'moderate', - path: '/moderate/', - GET: legacyController('moderate.php'), - ), - route( - name: 'oembed', - path: '/oembed/', - GET: legacyController('oembed.php'), - ), - route( - name: 'page', - path: '/page/', - GET: legacyController('page.php'), - ), - route( - name: 'plugin', - path: '/plugin/', - GET: legacyController('plugin.php'), - ), - route( - name: 'captcha-verify', - path: '/captcha-verify/', - GET: legacyController('captcha-verify.php'), - ), - route( - name: 'redirect', - path: '/redirect/', - GET: legacyController('redirect.php'), - ), - route( - name: 'search', - path: '/search/', - GET: legacyController('search.php'), - POST: legacyController('search.php'), - ), - route( - name: 'settings', - path: '/settings/', - GET: legacyController('settings.php'), - POST: legacyController('settings.php'), - ), - route( - name: 'signup', - path: '/signup/', - GET: legacyController('signup.php'), - POST: legacyController('signup.php'), - ), - route( - name: 'upload', - path: '/upload/', - GET: legacyController('upload.php'), - ), - route( - name: 'user', - path: '/user/', - GET: legacyController('user.php'), - ), -); diff --git a/app/schemas/mysql-5/albums.sql b/app/schemas/mysql-5/albums.sql index e8c8e53..7518220 100644 --- a/app/schemas/mysql-5/albums.sql +++ b/app/schemas/mysql-5/albums.sql @@ -1,22 +1,22 @@ DROP TABLE IF EXISTS `%table_prefix%albums`; CREATE TABLE `%table_prefix%albums` ( - `album_id` bigint(32) NOT NULL AUTO_INCREMENT, - `album_name` varchar(100) NOT NULL, - `album_user_id` bigint(32) DEFAULT NULL, - `album_date` datetime NOT NULL, - `album_date_gmt` datetime NOT NULL, - `album_creation_ip` varchar(255) NOT NULL, - `album_privacy` enum('public','password','private','private_but_link','custom') DEFAULT 'public', - `album_privacy_extra` text, - `album_password` text, - `album_image_count` bigint(32) NOT NULL DEFAULT '0', - `album_description` text, - `album_likes` bigint(32) NOT NULL DEFAULT '0', - `album_views` bigint(32) NOT NULL DEFAULT '0', - `album_cover_id` bigint(32) DEFAULT NULL, - `album_parent_id` bigint(32) DEFAULT NULL, - `album_cta_enable` tinyint(1) NOT NULL DEFAULT '0', - `album_cta` text, + `album_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `album_name` VARCHAR(100) NOT NULL, + `album_user_id` INT UNSIGNED DEFAULT NULL, + `album_date` DATETIME NOT NULL, + `album_date_gmt` DATETIME NOT NULL, + `album_creation_ip` VARCHAR(255) NOT NULL, + `album_privacy` ENUM('public','password','private','private_but_link','custom') DEFAULT 'public', + `album_privacy_extra` TEXT, + `album_password` TEXT, + `album_image_count` INT UNSIGNED NOT NULL DEFAULT '0', + `album_description` TEXT, + `album_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `album_views` INT UNSIGNED NOT NULL DEFAULT '0', + `album_cover_id` INT UNSIGNED DEFAULT NULL, + `album_parent_id` INT UNSIGNED DEFAULT NULL, + `album_cta_enable` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `album_cta` TEXT, PRIMARY KEY (`album_id`), KEY `album_name` (`album_name`), KEY `album_user_id` (`album_user_id`), @@ -27,5 +27,6 @@ CREATE TABLE `%table_prefix%albums` ( KEY `album_likes` (`album_likes`), KEY `album_views` (`album_views`), KEY `album_parent_id` (`album_parent_id`), + KEY `album_user_id_parent_id_name` (`album_user_id`, `album_parent_id`, `album_name`), FULLTEXT KEY `searchindex` (`album_name`,`album_description`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/api_keys.sql b/app/schemas/mysql-5/api_keys.sql index 70e0478..e7632a6 100644 --- a/app/schemas/mysql-5/api_keys.sql +++ b/app/schemas/mysql-5/api_keys.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%api_keys`; CREATE TABLE `%table_prefix%api_keys` ( - `api_key_id` bigint(32) NOT NULL AUTO_INCREMENT, - `api_key_user_id` bigint(32) DEFAULT NULL, - `api_key_name` varchar(100) DEFAULT NULL, - `api_key_date_gmt` datetime NOT NULL, - `api_key_hash` text NOT NULL, + `api_key_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `api_key_user_id` INT UNSIGNED DEFAULT NULL, + `api_key_name` VARCHAR(100) DEFAULT NULL, + `api_key_date_gmt` DATETIME NOT NULL, + `api_key_hash` TEXT NOT NULL, PRIMARY KEY (`api_key_id`), KEY `api_key_user_id` (`api_key_user_id`), KEY `api_key_name` (`api_key_name`), diff --git a/app/schemas/mysql-5/assets.sql b/app/schemas/mysql-5/assets.sql index 79c32bf..b89834d 100644 --- a/app/schemas/mysql-5/assets.sql +++ b/app/schemas/mysql-5/assets.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%assets`; CREATE TABLE `%table_prefix%assets` ( - `asset_id` bigint(32) NOT NULL AUTO_INCREMENT, - `asset_key` varchar(255) NOT NULL, - `asset_md5` varchar(32) NOT NULL, - `asset_filename` varchar(255) NOT NULL, - `asset_file_path` varchar(255) NOT NULL, + `asset_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `asset_key` VARCHAR(255) NOT NULL, + `asset_checksum` VARCHAR(32) NOT NULL, + `asset_filename` VARCHAR(255) NOT NULL, + `asset_file_path` VARCHAR(255) NOT NULL, `asset_blob` blob, PRIMARY KEY (`asset_id`), UNIQUE KEY `key` (`asset_key`(191)) USING BTREE, diff --git a/app/schemas/mysql-5/categories.sql b/app/schemas/mysql-5/categories.sql index c25baa0..17c3eef 100644 --- a/app/schemas/mysql-5/categories.sql +++ b/app/schemas/mysql-5/categories.sql @@ -1,9 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%categories`; CREATE TABLE `%table_prefix%categories` ( - `category_id` bigint(32) NOT NULL AUTO_INCREMENT, - `category_name` varchar(32) NOT NULL, - `category_url_key` varchar(32) COLLATE utf8mb4_bin NOT NULL, - `category_description` text, + `category_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `category_name` VARCHAR(32) NOT NULL, + `category_url_key` VARCHAR(32) COLLATE utf8mb4_bin NOT NULL, + `category_description` TEXT, PRIMARY KEY (`category_id`), + KEY `category_name` (`category_name`), UNIQUE KEY `url_key` (`category_url_key`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/confirmations.sql b/app/schemas/mysql-5/confirmations.sql index 57dd9d1..21570f9 100644 --- a/app/schemas/mysql-5/confirmations.sql +++ b/app/schemas/mysql-5/confirmations.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%confirmations`; CREATE TABLE `%table_prefix%confirmations` ( - `confirmation_id` bigint(32) NOT NULL AUTO_INCREMENT, - `confirmation_user_id` bigint(32) NOT NULL, - `confirmation_type` enum('account-activate','account-change-email','account-password-forgot') NOT NULL, - `confirmation_date` datetime NOT NULL, - `confirmation_date_gmt` datetime NOT NULL, - `confirmation_token_hash` varchar(255) NOT NULL, - `confirmation_status` enum('active','valid','invalid') NOT NULL, - `confirmation_extra` mediumtext, + `confirmation_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `confirmation_user_id` INT UNSIGNED NOT NULL, + `confirmation_type` ENUM('account-activate','account-change-email','account-password-forgot') NOT NULL, + `confirmation_date` DATETIME NOT NULL, + `confirmation_date_gmt` DATETIME NOT NULL, + `confirmation_token_hash` VARCHAR(255) NOT NULL, + `confirmation_status` ENUM('active','valid','invalid') NOT NULL, + `confirmation_extra` TEXT, PRIMARY KEY (`confirmation_id`), KEY `confirmation_user` (`confirmation_user_id`), KEY `confirmation_user_type` (`confirmation_user_id`, `confirmation_type`), diff --git a/app/schemas/mysql-5/deletions.sql b/app/schemas/mysql-5/deletions.sql index 1aca667..48ebf54 100644 --- a/app/schemas/mysql-5/deletions.sql +++ b/app/schemas/mysql-5/deletions.sql @@ -1,20 +1,20 @@ DROP TABLE IF EXISTS `%table_prefix%deletions`; CREATE TABLE `%table_prefix%deletions` ( - `deleted_id` bigint(32) NOT NULL AUTO_INCREMENT, - `deleted_date_gmt` datetime NOT NULL, - `deleted_content_id` bigint(32) NOT NULL, - `deleted_content_date_gmt` datetime NOT NULL, - `deleted_content_user_id` bigint(32) DEFAULT NULL, - `deleted_content_ip` varchar(255) NOT NULL, - `deleted_content_md5` varchar(32) DEFAULT NULL, - `deleted_content_original_filename` varchar(255) DEFAULT NULL, - `deleted_content_views` bigint(32) NOT NULL DEFAULT '0', - `deleted_content_likes` bigint(32) NOT NULL DEFAULT '0', + `deleted_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `deleted_date_gmt` DATETIME NOT NULL, + `deleted_content_id` INT UNSIGNED NOT NULL, + `deleted_content_date_gmt` DATETIME NOT NULL, + `deleted_content_user_id` INT UNSIGNED DEFAULT NULL, + `deleted_content_ip` VARCHAR(255) NOT NULL, + `deleted_content_checksum` VARCHAR(32) DEFAULT NULL, + `deleted_content_original_filename` VARCHAR(255) DEFAULT NULL, + `deleted_content_views` INT UNSIGNED NOT NULL DEFAULT '0', + `deleted_content_likes` INT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`deleted_id`), KEY `deleted_content_id` (`deleted_content_id`), KEY `deleted_content_user_id` (`deleted_content_user_id`), KEY `deleted_content_ip` (`deleted_content_ip`), - KEY `deleted_content_md5` (`deleted_content_md5`), + KEY `deleted_content_checksum` (`deleted_content_checksum`), KEY `deleted_content_views` (`deleted_content_views`), KEY `deleted_content_likes` (`deleted_content_likes`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/follows.sql b/app/schemas/mysql-5/follows.sql index 5e51ed9..60a6f5e 100644 --- a/app/schemas/mysql-5/follows.sql +++ b/app/schemas/mysql-5/follows.sql @@ -1,11 +1,11 @@ DROP TABLE IF EXISTS `%table_prefix%follows`; CREATE TABLE `%table_prefix%follows` ( - `follow_id` bigint(32) NOT NULL AUTO_INCREMENT, - `follow_date` datetime NOT NULL, - `follow_date_gmt` datetime NOT NULL, - `follow_user_id` bigint(32) NOT NULL, - `follow_followed_user_id` bigint(32) NOT NULL, - `follow_ip` varchar(255) NOT NULL, + `follow_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `follow_date` DATETIME NOT NULL, + `follow_date_gmt` DATETIME NOT NULL, + `follow_user_id` INT UNSIGNED NOT NULL, + `follow_followed_user_id` INT UNSIGNED NOT NULL, + `follow_ip` VARCHAR(255) NOT NULL, PRIMARY KEY (`follow_id`), KEY `follow_user_id` (`follow_user_id`), KEY `follow_followed_user_id` (`follow_followed_user_id`) diff --git a/app/schemas/mysql-5/images.sql b/app/schemas/mysql-5/images.sql index 5e091e9..866c37f 100644 --- a/app/schemas/mysql-5/images.sql +++ b/app/schemas/mysql-5/images.sql @@ -1,39 +1,39 @@ DROP TABLE IF EXISTS `%table_prefix%images`; CREATE TABLE `%table_prefix%images` ( - `image_id` bigint(32) NOT NULL AUTO_INCREMENT, - `image_name` varchar(255) NOT NULL, - `image_extension` varchar(255) NOT NULL, - `image_size` bigint(11) UNSIGNED NOT NULL, - `image_width` int(11) NOT NULL, - `image_height` int(11) NOT NULL, - `image_date` datetime NOT NULL, - `image_date_gmt` datetime NOT NULL, - `image_title` varchar(100) DEFAULT NULL, - `image_description` text, - `image_nsfw` tinyint(1) NOT NULL DEFAULT '0', - `image_user_id` bigint(32) DEFAULT NULL, - `image_album_id` bigint(32) DEFAULT NULL, - `image_uploader_ip` varchar(255) NOT NULL, - `image_storage_mode` enum('datefolder','direct','old','path') NOT NULL DEFAULT 'datefolder', - `image_path` varchar(4096) DEFAULT NULL, - `image_storage_id` bigint(32) DEFAULT NULL, - `image_md5` varchar(32) NOT NULL, - `image_source_md5` varchar(32) DEFAULT NULL, - `image_original_filename` varchar(255) NOT NULL, - `image_original_exifdata` mediumtext, - `image_views` bigint(32) NOT NULL DEFAULT '0', - `image_category_id` bigint(32) DEFAULT NULL, - `image_chain` tinyint(3) NOT NULL, - `image_thumb_size` int(11) NOT NULL, - `image_medium_size` int(11) NOT NULL DEFAULT '0', - `image_frame_size` int(11) NOT NULL DEFAULT '0', - `image_expiration_date_gmt` datetime DEFAULT NULL, - `image_likes` bigint(32) NOT NULL DEFAULT '0', - `image_is_animated` tinyint(1) NOT NULL DEFAULT '0', - `image_is_approved` tinyint(1) NOT NULL DEFAULT '1', - `image_is_360` tinyint(1) NOT NULL DEFAULT '0', - `image_duration` int(11) NOT NULL DEFAULT '0', - `image_type` tinyint(3) UNSIGNED as (case + `image_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `image_name` VARCHAR(255) NOT NULL, + `image_extension` VARCHAR(255) NOT NULL, + `image_size` BIGINT UNSIGNED NOT NULL, + `image_width` INT UNSIGNED NOT NULL, + `image_height` INT UNSIGNED NOT NULL, + `image_date` DATETIME NOT NULL, + `image_date_gmt` DATETIME NOT NULL, + `image_title` VARCHAR(100) DEFAULT NULL, + `image_description` TEXT, + `image_nsfw` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_user_id` INT UNSIGNED DEFAULT NULL, + `image_album_id` INT UNSIGNED DEFAULT NULL, + `image_uploader_ip` VARCHAR(255) NOT NULL, + `image_storage_mode` ENUM('datefolder','direct','old','path') NOT NULL DEFAULT 'datefolder', + `image_path` VARCHAR(4096) DEFAULT NULL, + `image_storage_id` INT UNSIGNED DEFAULT NULL, + `image_checksum` VARCHAR(32) NOT NULL, + `image_source_checksum` VARCHAR(32) DEFAULT NULL, + `image_original_filename` VARCHAR(255) NOT NULL, + `image_original_exifdata` MEDIUMTEXT, + `image_views` INT UNSIGNED NOT NULL DEFAULT '0', + `image_category_id` INT UNSIGNED DEFAULT NULL, + `image_chain` TINYINT UNSIGNED NOT NULL, + `image_thumb_size` INT UNSIGNED NOT NULL, + `image_medium_size` INT UNSIGNED NOT NULL DEFAULT '0', + `image_frame_size` INT UNSIGNED NOT NULL DEFAULT '0', + `image_expiration_date_gmt` DATETIME DEFAULT NULL, + `image_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `image_is_animated` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_is_approved` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `image_is_360` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_duration` INT UNSIGNED NOT NULL DEFAULT '0', + `image_type` TINYINT UNSIGNED as (case when `image_extension` in ('pdf','doc','md') then 4 when `image_extension` in ('mp3','m4a','wav') then 3 when `image_extension` in ('mp4','webm','mov') then 2 @@ -53,8 +53,8 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_storage_mode` (`image_storage_mode`), KEY `image_path` (`image_path`(255)), KEY `image_storage_id` (`image_storage_id`), - KEY `image_md5` (`image_md5`), - KEY `image_source_md5` (`image_source_md5`), + KEY `image_checksum` (`image_checksum`), + KEY `image_source_checksum` (`image_source_checksum`), KEY `image_views` (`image_views`), KEY `image_category_id` (`image_category_id`), KEY `image_chain` (`image_chain`), @@ -66,5 +66,6 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_album_id_image_id` (`image_album_id`, `image_id`), KEY `image_duration` (`image_duration`), KEY `image_type` (`image_type`), - FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`) + FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`), + KEY `image_uploader_ip_date_gmt_checksum_source_checksum` (`image_uploader_ip`, `image_date_gmt`, `image_checksum`, `image_source_checksum`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/images_hash.sql b/app/schemas/mysql-5/images_hash.sql index d5e819e..76f0d77 100644 --- a/app/schemas/mysql-5/images_hash.sql +++ b/app/schemas/mysql-5/images_hash.sql @@ -1,6 +1,6 @@ DROP TABLE IF EXISTS `%table_prefix%images_hash`; CREATE TABLE `%table_prefix%images_hash` ( - `image_hash_image_id` bigint(32) NOT NULL, - `image_hash_hash` mediumtext NOT NULL, + `image_hash_image_id` INT UNSIGNED NOT NULL, + `image_hash_hash` TEXT NOT NULL, PRIMARY KEY (`image_hash_image_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/importing.sql b/app/schemas/mysql-5/importing.sql index dee032b..c896189 100644 --- a/app/schemas/mysql-5/importing.sql +++ b/app/schemas/mysql-5/importing.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%importing`; CREATE TABLE `%table_prefix%importing` ( - `importing_id` bigint(32) NOT NULL AUTO_INCREMENT, - `importing_import_id` bigint(32) NOT NULL, - `importing_path` varchar(4096) NOT NULL, - `importing_content_type` enum('user','album','image') NOT NULL, - `importing_content_id` bigint(32) DEFAULT NULL, + `importing_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `importing_import_id` INT UNSIGNED NOT NULL, + `importing_path` VARCHAR(4096) NOT NULL, + `importing_content_type` ENUM('user','album','image') NOT NULL, + `importing_content_id` INT UNSIGNED DEFAULT NULL, PRIMARY KEY (`importing_id`), UNIQUE KEY `importing_path` (`importing_path`(191)) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/imports.sql b/app/schemas/mysql-5/imports.sql index af44023..860f358 100644 --- a/app/schemas/mysql-5/imports.sql +++ b/app/schemas/mysql-5/imports.sql @@ -1,17 +1,17 @@ DROP TABLE IF EXISTS `%table_prefix%imports`; CREATE TABLE `%table_prefix%imports` ( - `import_id` bigint(32) NOT NULL AUTO_INCREMENT, - `import_path` varchar(4096) NOT NULL, - `import_options` varchar(255) DEFAULT NULL, - `import_status` enum('queued','working','paused','canceled','completed') NOT NULL, - `import_users` bigint(32) NOT NULL DEFAULT '0', - `import_images` bigint(32) NOT NULL DEFAULT '0', - `import_albums` bigint(32) NOT NULL DEFAULT '0', - `import_time_created` datetime DEFAULT NULL, - `import_time_updated` datetime DEFAULT NULL, - `import_errors` tinyint(1) NOT NULL DEFAULT '0', - `import_started` tinyint(1) NOT NULL DEFAULT '0', - `import_continuous` tinyint(1) NOT NULL DEFAULT '0', + `import_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `import_path` VARCHAR(4096) NOT NULL, + `import_options` VARCHAR(255) DEFAULT NULL, + `import_status` ENUM('queued','working','paused','canceled','completed') NOT NULL, + `import_users` INT UNSIGNED NOT NULL DEFAULT '0', + `import_images` INT UNSIGNED NOT NULL DEFAULT '0', + `import_albums` INT UNSIGNED NOT NULL DEFAULT '0', + `import_time_created` DATETIME DEFAULT NULL, + `import_time_updated` DATETIME DEFAULT NULL, + `import_errors` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `import_started` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `import_continuous` TINYINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`import_id`), KEY `import_path` (`import_path`(191)) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/ip_bans.sql b/app/schemas/mysql-5/ip_bans.sql index 72f2c1c..7ca6d17 100644 --- a/app/schemas/mysql-5/ip_bans.sql +++ b/app/schemas/mysql-5/ip_bans.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%ip_bans`; CREATE TABLE `%table_prefix%ip_bans` ( - `ip_ban_id` bigint(20) NOT NULL AUTO_INCREMENT, - `ip_ban_date` datetime NOT NULL, - `ip_ban_date_gmt` datetime NOT NULL, - `ip_ban_expires` datetime DEFAULT NULL, - `ip_ban_expires_gmt` datetime DEFAULT NULL, - `ip_ban_ip` varchar(255) NOT NULL, - `ip_ban_message` text, + `ip_ban_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `ip_ban_date` DATETIME NOT NULL, + `ip_ban_date_gmt` DATETIME NOT NULL, + `ip_ban_expires` DATETIME DEFAULT NULL, + `ip_ban_expires_gmt` DATETIME DEFAULT NULL, + `ip_ban_ip` VARCHAR(255) NOT NULL, + `ip_ban_message` TEXT, PRIMARY KEY (`ip_ban_id`), - KEY `ip_ban_date_gmt` (`ip_ban_date_gmt`), - UNIQUE KEY `ip_ban_ip` (`ip_ban_ip`(191)) USING BTREE + UNIQUE KEY `ip_ban_ip` (`ip_ban_ip`(191)) USING BTREE, + KEY `ip_ban_ip_expires_gmt_id` (`ip_ban_ip`, `ip_ban_expires_gmt`, `ip_ban_id` DESC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/likes.sql b/app/schemas/mysql-5/likes.sql index 4e92ad0..629b2c6 100644 --- a/app/schemas/mysql-5/likes.sql +++ b/app/schemas/mysql-5/likes.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%likes`; CREATE TABLE `%table_prefix%likes` ( - `like_id` bigint(32) NOT NULL AUTO_INCREMENT, - `like_date` datetime NOT NULL, - `like_date_gmt` datetime NOT NULL, - `like_user_id` bigint(32) DEFAULT NULL, - `like_content_type` enum('image','album') DEFAULT NULL, - `like_content_id` bigint(32) NOT NULL, - `like_content_user_id` bigint(32) DEFAULT NULL, - `like_ip` varchar(255) NOT NULL, + `like_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `like_date` DATETIME NOT NULL, + `like_date_gmt` DATETIME NOT NULL, + `like_user_id` INT UNSIGNED DEFAULT NULL, + `like_content_type` ENUM('image','album') DEFAULT NULL, + `like_content_id` INT UNSIGNED NOT NULL, + `like_content_user_id` INT UNSIGNED DEFAULT NULL, + `like_ip` VARCHAR(255) NOT NULL, PRIMARY KEY (`like_id`), KEY `like_date_gmt` (`like_date_gmt`), KEY `like_user_id` (`like_user_id`), diff --git a/app/schemas/mysql-5/locks.sql b/app/schemas/mysql-5/locks.sql index db3b44a..6c66763 100644 --- a/app/schemas/mysql-5/locks.sql +++ b/app/schemas/mysql-5/locks.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%locks`; CREATE TABLE `%table_prefix%locks` ( - `lock_id` bigint(20) NOT NULL AUTO_INCREMENT, - `lock_name` varchar(255) NOT NULL, - `lock_date_gmt` datetime NOT NULL, - `lock_expires_gmt` datetime DEFAULT NULL, + `lock_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `lock_name` VARCHAR(255) NOT NULL, + `lock_date_gmt` DATETIME NOT NULL, + `lock_expires_gmt` DATETIME DEFAULT NULL, PRIMARY KEY (`lock_id`), KEY `lock_date_gmt` (`lock_date_gmt`), KEY `lock_expires_gmt` (`lock_expires_gmt`), diff --git a/app/schemas/mysql-5/login_connections.sql b/app/schemas/mysql-5/login_connections.sql index ff13bb5..4bf5617 100644 --- a/app/schemas/mysql-5/login_connections.sql +++ b/app/schemas/mysql-5/login_connections.sql @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS `%table_prefix%login_connections`; CREATE TABLE `%table_prefix%login_connections` ( - `login_connection_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_connection_user_id` bigint(32) NOT NULL, - `login_connection_provider_id` bigint(32) NOT NULL, - `login_connection_date_gmt` datetime NOT NULL, - `login_connection_resource_id` varchar(255) NOT NULL, - `login_connection_resource_name` text, - `login_connection_token` text NOT NULL COMMENT 'Ciphertext', + `login_connection_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_connection_user_id` INT UNSIGNED NOT NULL, + `login_connection_provider_id` INT UNSIGNED NOT NULL, + `login_connection_date_gmt` DATETIME NOT NULL, + `login_connection_resource_id` VARCHAR(255) NOT NULL, + `login_connection_resource_name` TEXT, + `login_connection_token` TEXT NOT NULL COMMENT 'Ciphertext', PRIMARY KEY (`login_connection_id`), UNIQUE KEY `login_connection_unique` (`login_connection_user_id`,`login_connection_provider_id`), KEY `login_connection_user_id` (`login_connection_user_id`), diff --git a/app/schemas/mysql-5/login_cookies.sql b/app/schemas/mysql-5/login_cookies.sql index d32453c..6a99dd4 100644 --- a/app/schemas/mysql-5/login_cookies.sql +++ b/app/schemas/mysql-5/login_cookies.sql @@ -1,16 +1,17 @@ DROP TABLE IF EXISTS `%table_prefix%login_cookies`; CREATE TABLE `%table_prefix%login_cookies` ( - `login_cookie_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_cookie_user_id` bigint(32) NOT NULL, - `login_cookie_connection_id` bigint(32) DEFAULT 0, - `login_cookie_date_gmt` datetime NOT NULL, - `login_cookie_ip` varchar(255) DEFAULT NULL, - `login_cookie_user_agent` text NOT NULL, - `login_cookie_hash` text NOT NULL, + `login_cookie_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_cookie_user_id` INT UNSIGNED NOT NULL, + `login_cookie_connection_id` INT UNSIGNED DEFAULT 0, + `login_cookie_date_gmt` DATETIME NOT NULL, + `login_cookie_ip` VARCHAR(255) DEFAULT NULL, + `login_cookie_user_agent` TEXT NOT NULL, + `login_cookie_hash` TEXT NOT NULL, PRIMARY KEY (`login_cookie_id`), UNIQUE KEY `login_cookie_unique` (`login_cookie_user_id`,`login_cookie_connection_id`,`login_cookie_date_gmt`), KEY `login_cookie_user_id_date_gmt` (`login_cookie_user_id`, `login_cookie_date_gmt`), KEY `login_cookie_user_id` (`login_cookie_user_id`), KEY `login_cookie_ip` (`login_cookie_ip`), - KEY `login_cookie_connection_id` (`login_cookie_connection_id`) + KEY `login_cookie_connection_id` (`login_cookie_connection_id`), + KEY `login_cookie_user_id_date_gmt_connection_id` (`login_cookie_user_id`, `login_cookie_date_gmt`, `login_cookie_connection_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/login_passwords.sql b/app/schemas/mysql-5/login_passwords.sql index b1f7385..6202a05 100644 --- a/app/schemas/mysql-5/login_passwords.sql +++ b/app/schemas/mysql-5/login_passwords.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%login_passwords`; CREATE TABLE `%table_prefix%login_passwords` ( - `login_password_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_password_user_id` bigint(32) NOT NULL, - `login_password_date_gmt` datetime NOT NULL, - `login_password_hash` text NOT NULL, + `login_password_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_password_user_id` INT UNSIGNED NOT NULL, + `login_password_date_gmt` DATETIME NOT NULL, + `login_password_hash` TEXT NOT NULL, PRIMARY KEY (`login_password_id`), UNIQUE KEY `login_password_user_id` (`login_password_user_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/login_providers.sql b/app/schemas/mysql-5/login_providers.sql index 595bae2..1a004d1 100644 --- a/app/schemas/mysql-5/login_providers.sql +++ b/app/schemas/mysql-5/login_providers.sql @@ -1,14 +1,15 @@ DROP TABLE IF EXISTS `%table_prefix%login_providers`; CREATE TABLE `%table_prefix%login_providers` ( - `login_provider_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_provider_name` varchar(255) DEFAULT NULL, - `login_provider_label` varchar(255) DEFAULT NULL, - `login_provider_key_id` text DEFAULT NULL, - `login_provider_key_secret` text DEFAULT NULL, - `login_provider_is_enabled` tinyint(1) NOT NULL DEFAULT '1', + `login_provider_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_provider_name` VARCHAR(255) DEFAULT NULL, + `login_provider_label` VARCHAR(255) DEFAULT NULL, + `login_provider_key_id` TEXT DEFAULT NULL, + `login_provider_key_secret` TEXT DEFAULT NULL, + `login_provider_is_enabled` TINYINT UNSIGNED NOT NULL DEFAULT '1', PRIMARY KEY (`login_provider_id`), UNIQUE KEY `login_provider_name` (`login_provider_name`(191)), - KEY `login_provider_is_enabled` (`login_provider_is_enabled`) + KEY `login_provider_is_enabled` (`login_provider_is_enabled`), + KEY `login_provider_id_is_enabled_name` (`login_provider_id`, `login_provider_is_enabled`, `login_provider_name` DESC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; INSERT INTO `%table_prefix%login_providers` VALUES ('1', 'facebook', 'Facebook', null, null, '0'); INSERT INTO `%table_prefix%login_providers` VALUES ('2', 'twitter', 'Twitter', null, null, '0'); diff --git a/app/schemas/mysql-5/logins.sql b/app/schemas/mysql-5/logins.sql index 9ebe4f6..1af57eb 100644 --- a/app/schemas/mysql-5/logins.sql +++ b/app/schemas/mysql-5/logins.sql @@ -1,18 +1,18 @@ DROP TABLE IF EXISTS `%table_prefix%logins`; CREATE TABLE `%table_prefix%logins` ( - `login_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_user_id` bigint(32) NOT NULL, - `login_type` enum('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk') NOT NULL, - `login_ip` varchar(255) DEFAULT NULL, - `login_hostname` text, - `login_date` datetime NOT NULL, - `login_date_gmt` datetime NOT NULL, - `login_resource_id` varchar(255) DEFAULT NULL, - `login_resource_name` text, - `login_resource_avatar` text, - `login_resource_url` text, - `login_secret` text DEFAULT NULL COMMENT 'The secret part', - `login_token_hash` text COMMENT 'Hashed complement to secret if needed', + `login_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_user_id` INT UNSIGNED NOT NULL, + `login_type` ENUM('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk') NOT NULL, + `login_ip` VARCHAR(255) DEFAULT NULL, + `login_hostname` TEXT, + `login_date` DATETIME NOT NULL, + `login_date_gmt` DATETIME NOT NULL, + `login_resource_id` VARCHAR(255) DEFAULT NULL, + `login_resource_name` TEXT, + `login_resource_avatar` TEXT, + `login_resource_url` TEXT, + `login_secret` TEXT DEFAULT NULL COMMENT 'The secret part', + `login_token_hash` TEXT COMMENT 'Hashed complement to secret if needed', PRIMARY KEY (`login_id`), KEY `login_user_id` (`login_user_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/notifications.sql b/app/schemas/mysql-5/notifications.sql index 51044c3..9408cba 100644 --- a/app/schemas/mysql-5/notifications.sql +++ b/app/schemas/mysql-5/notifications.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%notifications`; CREATE TABLE `%table_prefix%notifications` ( - `notification_id` bigint(32) NOT NULL AUTO_INCREMENT, - `notification_date_gmt` datetime NOT NULL, - `notification_user_id` bigint(32) NOT NULL, - `notification_trigger_user_id` bigint(32) DEFAULT NULL, - `notification_type` enum('follow','like') NOT NULL, - `notification_content_type` enum('user','image','album') NOT NULL, - `notification_type_id` bigint(32) NOT NULL COMMENT 'type_id based on action (type) table', - `notification_is_read` tinyint(1) NOT NULL DEFAULT '0', + `notification_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `notification_date_gmt` DATETIME NOT NULL, + `notification_user_id` INT UNSIGNED NOT NULL, + `notification_trigger_user_id` INT UNSIGNED DEFAULT NULL, + `notification_type` ENUM('follow','like') NOT NULL, + `notification_content_type` ENUM('user','image','album') NOT NULL, + `notification_type_id` INT UNSIGNED NOT NULL COMMENT 'type_id based on action (type) table', + `notification_is_read` TINYINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`notification_id`), KEY `notification_date_gmt` (`notification_date_gmt`), KEY `notification_user_id` (`notification_user_id`), diff --git a/app/schemas/mysql-5/pages.sql b/app/schemas/mysql-5/pages.sql index 3ef4aa9..7ec4e28 100644 --- a/app/schemas/mysql-5/pages.sql +++ b/app/schemas/mysql-5/pages.sql @@ -1,21 +1,21 @@ DROP TABLE IF EXISTS `%table_prefix%pages`; CREATE TABLE `%table_prefix%pages` ( - `page_id` bigint(32) NOT NULL AUTO_INCREMENT, - `page_url_key` varchar(32) DEFAULT NULL, - `page_type` enum('internal','link') NOT NULL DEFAULT 'internal', - `page_file_path` varchar(255) DEFAULT NULL, - `page_link_url` text, - `page_icon` varchar(255) DEFAULT NULL, - `page_title` varchar(255) NOT NULL, - `page_description` text, - `page_keywords` text, - `page_is_active` tinyint(1) NOT NULL DEFAULT '1', - `page_is_link_visible` tinyint(1) NOT NULL DEFAULT '1', - `page_attr_target` enum('_self','_blank') DEFAULT '_self', - `page_attr_rel` varchar(255) DEFAULT NULL, - `page_sort_display` int(11) DEFAULT NULL, - `page_internal` varchar(255) DEFAULT NULL, - `page_code` text, + `page_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `page_url_key` VARCHAR(32) DEFAULT NULL, + `page_type` ENUM('internal','link') NOT NULL DEFAULT 'internal', + `page_file_path` VARCHAR(255) DEFAULT NULL, + `page_link_url` TEXT, + `page_icon` VARCHAR(255) DEFAULT NULL, + `page_title` VARCHAR(255) NOT NULL, + `page_description` TEXT, + `page_keywords` TEXT, + `page_is_active` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `page_is_link_visible` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `page_attr_target` ENUM('_self','_blank') DEFAULT '_self', + `page_attr_rel` VARCHAR(255) DEFAULT NULL, + `page_sort_display` INT UNSIGNED DEFAULT NULL, + `page_internal` VARCHAR(255) DEFAULT NULL, + `page_code` TEXT, PRIMARY KEY (`page_id`), UNIQUE KEY `page_internal` (`page_internal`(191)), KEY `page_url_key` (`page_url_key`), diff --git a/app/schemas/mysql-5/queues.sql b/app/schemas/mysql-5/queues.sql index c263a09..b47c439 100644 --- a/app/schemas/mysql-5/queues.sql +++ b/app/schemas/mysql-5/queues.sql @@ -1,11 +1,11 @@ DROP TABLE IF EXISTS `%table_prefix%queues`; CREATE TABLE `%table_prefix%queues` ( - `queue_id` bigint(32) NOT NULL AUTO_INCREMENT, - `queue_type` enum('storage-delete') NOT NULL, - `queue_date_gmt` datetime NOT NULL, - `queue_args` text NOT NULL, - `queue_join` bigint(32) NOT NULL, - `queue_attempts` varchar(255) DEFAULT '0', - `queue_status` enum('pending','failed') NOT NULL DEFAULT 'pending', + `queue_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `queue_type` ENUM('storage-delete') NOT NULL, + `queue_date_gmt` DATETIME NOT NULL, + `queue_args` TEXT NOT NULL, + `queue_join` INT UNSIGNED NOT NULL, + `queue_attempts` VARCHAR(255) DEFAULT '0', + `queue_status` ENUM('pending','failed') NOT NULL DEFAULT 'pending', PRIMARY KEY (`queue_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/requests.sql b/app/schemas/mysql-5/requests.sql index 3814600..83c3579 100644 --- a/app/schemas/mysql-5/requests.sql +++ b/app/schemas/mysql-5/requests.sql @@ -1,18 +1,20 @@ DROP TABLE IF EXISTS `%table_prefix%requests`; CREATE TABLE `%table_prefix%requests` ( - `request_id` bigint(32) NOT NULL AUTO_INCREMENT, - `request_type` enum('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login', 'content-password', 'account-two-factor') NOT NULL, - `request_user_id` bigint(32) DEFAULT NULL, - `request_content_id` bigint(32) DEFAULT NULL, - `request_ip` varchar(255) NOT NULL, - `request_date` datetime NOT NULL, - `request_date_gmt` datetime NOT NULL, - `request_result` enum('success','fail') NOT NULL, + `request_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `request_type` ENUM('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login', 'content-password', 'account-two-factor') NOT NULL, + `request_user_id` INT UNSIGNED DEFAULT NULL, + `request_content_id` INT UNSIGNED DEFAULT NULL, + `request_ip` VARCHAR(255) NOT NULL, + `request_date` DATETIME NOT NULL, + `request_date_gmt` DATETIME NOT NULL, + `request_result` ENUM('success','fail') NOT NULL, PRIMARY KEY (`request_id`), KEY `request_type` (`request_type`), KEY `request_user_id` (`request_user_id`), KEY `request_content_id` (`request_content_id`), KEY `request_ip` (`request_ip`), KEY `request_date_gmt` (`request_date_gmt`), - KEY `request_result` (`request_result`) + KEY `request_result` (`request_result`), + KEY `request_result_ip_type_date_gmt` (`request_result`, `request_type`, `request_ip`,`request_date_gmt`), + KEY `request_user_id_result_type_ip` (`request_user_id`, `request_result`, `request_type`, `request_ip`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/settings.sql b/app/schemas/mysql-5/settings.sql index e5ba0bb..17f17f6 100644 --- a/app/schemas/mysql-5/settings.sql +++ b/app/schemas/mysql-5/settings.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%settings`; CREATE TABLE `%table_prefix%settings` ( - `setting_id` int(11) NOT NULL AUTO_INCREMENT, - `setting_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `setting_value` text, - `setting_default` text, - `setting_typeset` enum('string','bool') DEFAULT 'string', + `setting_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `setting_name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `setting_value` TEXT, + `setting_default` TEXT, + `setting_typeset` ENUM('string','bool') DEFAULT 'string', PRIMARY KEY (`setting_id`), UNIQUE KEY `setting_name` (`setting_name`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/stats.sql b/app/schemas/mysql-5/stats.sql index fca14da..1c14c91 100644 --- a/app/schemas/mysql-5/stats.sql +++ b/app/schemas/mysql-5/stats.sql @@ -1,21 +1,22 @@ DROP TABLE IF EXISTS `%table_prefix%stats`; CREATE TABLE `%table_prefix%stats` ( - `stat_id` bigint(32) NOT NULL AUTO_INCREMENT, - `stat_type` enum('total','date') NOT NULL, + `stat_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `stat_type` ENUM('total','date') NOT NULL, `stat_date_gmt` date DEFAULT NULL, - `stat_users` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_images` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_albums` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_tags` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_cron_runs` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_cron_time` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_image_views` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_album_views` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_image_likes` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_album_likes` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_disk_used` bigint(32) UNSIGNED NOT NULL DEFAULT '0', + `stat_users` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_images` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_albums` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_tags` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_cron_runs` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_cron_time` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_image_views` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_album_views` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_image_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_album_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_disk_used` BIGINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`stat_id`), UNIQUE KEY `stat_date_gmt` (`stat_date_gmt`) USING BTREE, - KEY `stat_type` (`stat_type`) + KEY `stat_type` (`stat_type`), + KEY `stat_type_date_gmt` (`stat_type`, `stat_date_gmt` DESC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; INSERT INTO `%table_prefix%stats` (stat_id, stat_type) VALUES (1, 'total'); diff --git a/app/schemas/mysql-5/storage_apis.sql b/app/schemas/mysql-5/storage_apis.sql index b917bd4..7541310 100644 --- a/app/schemas/mysql-5/storage_apis.sql +++ b/app/schemas/mysql-5/storage_apis.sql @@ -1,8 +1,8 @@ DROP TABLE IF EXISTS `%table_prefix%storage_apis`; CREATE TABLE `%table_prefix%storage_apis` ( - `storage_api_id` bigint(32) NOT NULL AUTO_INCREMENT, - `storage_api_name` varchar(255) NOT NULL, - `storage_api_type` varchar(255) NOT NULL, + `storage_api_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `storage_api_name` VARCHAR(255) NOT NULL, + `storage_api_type` VARCHAR(255) NOT NULL, PRIMARY KEY (`storage_api_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; INSERT INTO `%table_prefix%storage_apis` VALUES ('1', 'Amazon S3', 's3'); diff --git a/app/schemas/mysql-5/storages.sql b/app/schemas/mysql-5/storages.sql index 5e0c32a..ed22227 100644 --- a/app/schemas/mysql-5/storages.sql +++ b/app/schemas/mysql-5/storages.sql @@ -1,23 +1,23 @@ DROP TABLE IF EXISTS `%table_prefix%storages`; CREATE TABLE `%table_prefix%storages` ( - `storage_id` bigint(32) NOT NULL AUTO_INCREMENT, - `storage_api_id` bigint(32) NOT NULL, - `storage_name` varchar(255) NOT NULL, - `storage_service` varchar(255) DEFAULT NULL, - `storage_url` varchar(255) NOT NULL, - `storage_bucket` varchar(255) DEFAULT NULL, - `storage_region` varchar(255) DEFAULT NULL, - `storage_server` varchar(255) DEFAULT NULL, - `storage_account_id` varchar(255) DEFAULT NULL, - `storage_account_name` varchar(255) DEFAULT NULL, - `storage_key` text, - `storage_secret` text, - `storage_is_https` tinyint(1) NOT NULL DEFAULT '0', - `storage_is_active` tinyint(1) NOT NULL DEFAULT '0', - `storage_capacity` bigint(32) DEFAULT NULL, - `storage_space_used` bigint(32) DEFAULT '0', - `storage_type_chain` tinyint(3) NOT NULL DEFAULT '1', - `storage_use_path_style_endpoint` tinyint(1) NOT NULL DEFAULT '0', + `storage_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `storage_api_id` INT UNSIGNED NOT NULL, + `storage_name` VARCHAR(255) NOT NULL, + `storage_service` VARCHAR(255) DEFAULT NULL, + `storage_url` VARCHAR(255) NOT NULL, + `storage_bucket` VARCHAR(255) DEFAULT NULL, + `storage_region` VARCHAR(255) DEFAULT NULL, + `storage_server` VARCHAR(255) DEFAULT NULL, + `storage_account_id` VARCHAR(255) DEFAULT NULL, + `storage_account_name` VARCHAR(255) DEFAULT NULL, + `storage_key` TEXT, + `storage_secret` TEXT, + `storage_is_https` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `storage_is_active` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `storage_capacity` BIGINT UNSIGNED DEFAULT NULL, + `storage_space_used` BIGINT UNSIGNED DEFAULT '0', + `storage_type_chain` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `storage_use_path_style_endpoint` TINYINT UNSIGNED NOT NULL DEFAULT '0', `storage_deleted_at` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`storage_id`), KEY `storage_api_id` (`storage_api_id`), diff --git a/app/schemas/mysql-5/tags.sql b/app/schemas/mysql-5/tags.sql index de2c74f..72ed46a 100644 --- a/app/schemas/mysql-5/tags.sql +++ b/app/schemas/mysql-5/tags.sql @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS `%table_prefix%tags`; CREATE TABLE `%table_prefix%tags` ( - `tag_id` bigint(32) NOT NULL AUTO_INCREMENT, - `tag_name` varchar(32) COLLATE utf8mb4_bin NOT NULL, - `tag_description` text, - `tag_user_id` bigint(32) NOT NULL, - `tag_date_gmt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `tag_files` bigint(32) NOT NULL DEFAULT 0, - `tag_views` bigint(32) NOT NULL DEFAULT 0, + `tag_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `tag_name` VARCHAR(32) COLLATE utf8mb4_bin NOT NULL, + `tag_description` TEXT, + `tag_user_id` INT UNSIGNED NOT NULL, + `tag_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_files` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_views` INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`tag_id`), UNIQUE KEY `tag_name` (`tag_name`) USING BTREE, KEY `tag_user_id` (`tag_user_id`), @@ -15,5 +15,6 @@ CREATE TABLE `%table_prefix%tags` ( KEY `tag_views` (`tag_views`), KEY `tag_user_id_date_gmt` (`tag_user_id`,`tag_date_gmt`), KEY `tag_user_id_files` (`tag_user_id`,`tag_files`), - KEY `tag_user_id_views` (`tag_user_id`,`tag_views`) + KEY `tag_user_id_views` (`tag_user_id`,`tag_views`), + KEY `tag_files_name` (`tag_files` DESC, `tag_name` ASC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/tags_albums.sql b/app/schemas/mysql-5/tags_albums.sql index 4e88991..66222ea 100644 --- a/app/schemas/mysql-5/tags_albums.sql +++ b/app/schemas/mysql-5/tags_albums.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%tags_albums`; CREATE TABLE `%table_prefix%tags_albums` ( - `tag_album_tag_id` bigint(32) NOT NULL, - `tag_album_album_id` bigint(32) NOT NULL, - `tag_album_user_id` bigint(32) NOT NULL, - `tag_album_count` int(11) NOT NULL DEFAULT 0, - `tag_album_last_used_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_album_tag_id` INT UNSIGNED NOT NULL, + `tag_album_album_id` INT UNSIGNED NOT NULL, + `tag_album_user_id` INT UNSIGNED NOT NULL, + `tag_album_count` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_album_last_used_datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tag_album_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_album_album_id) REFERENCES `%table_prefix%albums` (album_id) ON DELETE CASCADE, FOREIGN KEY (tag_album_user_id) REFERENCES `%table_prefix%users` (user_id) ON DELETE CASCADE, diff --git a/app/schemas/mysql-5/tags_files.sql b/app/schemas/mysql-5/tags_files.sql index aff4f11..d3755ae 100644 --- a/app/schemas/mysql-5/tags_files.sql +++ b/app/schemas/mysql-5/tags_files.sql @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS `%table_prefix%tags_files`; CREATE TABLE `%table_prefix%tags_files` ( - `tag_file_tag_id` bigint(32) NOT NULL, - `tag_file_file_id` bigint(32) NOT NULL, + `tag_file_tag_id` INT UNSIGNED NOT NULL, + `tag_file_file_id` INT UNSIGNED NOT NULL, FOREIGN KEY (tag_file_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_file_file_id) REFERENCES `%table_prefix%images` (image_id) ON DELETE CASCADE, UNIQUE INDEX `tag_file_UNIQUE` (`tag_file_tag_id` ASC, `tag_file_file_id` ASC) diff --git a/app/schemas/mysql-5/tags_users.sql b/app/schemas/mysql-5/tags_users.sql index 3e431a4..db0bb84 100644 --- a/app/schemas/mysql-5/tags_users.sql +++ b/app/schemas/mysql-5/tags_users.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%tags_users`; CREATE TABLE `%table_prefix%tags_users` ( - `tag_user_tag_id` bigint(32) NOT NULL, - `tag_user_user_id` bigint(32) NOT NULL, - `tag_user_count` int(11) NOT NULL DEFAULT 0, - `tag_user_last_used_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_user_tag_id` INT UNSIGNED NOT NULL, + `tag_user_user_id` INT UNSIGNED NOT NULL, + `tag_user_count` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_user_last_used_datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tag_user_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_user_user_id) REFERENCES `%table_prefix%users` (user_id) ON DELETE CASCADE, UNIQUE INDEX `tag_user_UNIQUE` (`tag_user_tag_id` ASC, `tag_user_user_id` ASC), diff --git a/app/schemas/mysql-5/two_factors.sql b/app/schemas/mysql-5/two_factors.sql index 4fad5f5..2f98a88 100644 --- a/app/schemas/mysql-5/two_factors.sql +++ b/app/schemas/mysql-5/two_factors.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%two_factors`; CREATE TABLE `%table_prefix%two_factors` ( - `two_factor_id` bigint(32) NOT NULL AUTO_INCREMENT, - `two_factor_user_id` bigint(32) DEFAULT NULL, - `two_factor_date_gmt` datetime NOT NULL, - `two_factor_secret` text NOT NULL, + `two_factor_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `two_factor_user_id` INT UNSIGNED DEFAULT NULL, + `two_factor_date_gmt` DATETIME NOT NULL, + `two_factor_secret` TEXT NOT NULL, PRIMARY KEY (`two_factor_id`), KEY `two_factor_user_id` (`two_factor_user_id`), KEY `two_factor_date_gmt` (`two_factor_date_gmt`) diff --git a/app/schemas/mysql-5/uploads.sql b/app/schemas/mysql-5/uploads.sql new file mode 100644 index 0000000..f307cfc --- /dev/null +++ b/app/schemas/mysql-5/uploads.sql @@ -0,0 +1,17 @@ +DROP TABLE IF EXISTS `%table_prefix%uploads`; +CREATE TABLE `%table_prefix%uploads` ( + `upload_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `upload_user_id` INT UNSIGNED DEFAULT NULL, + `upload_uploader_ip` VARCHAR(255) NOT NULL, + `upload_token` VARCHAR(64) NOT NULL, + `upload_checksum` VARCHAR(32) NOT NULL, + `upload_params` JSON NOT NULL, + `upload_chunks` INT UNSIGNED NOT NULL, + `upload_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `upload_completed` TINYINT UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`upload_id`), + KEY `upload_id_token` (`upload_id`, `upload_token`), + KEY `upload_id_token_user_id` (`upload_id`, `upload_token`, `upload_user_id`), + KEY `upload_date_gmt` (`upload_date_gmt`), + KEY `upload_uploader_ip_date_gmt_checksum` (`upload_uploader_ip`, `upload_date_gmt`, `upload_checksum`) +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/uploads_chunks.sql b/app/schemas/mysql-5/uploads_chunks.sql new file mode 100644 index 0000000..77e7f37 --- /dev/null +++ b/app/schemas/mysql-5/uploads_chunks.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `%table_prefix%uploads_chunks`; +CREATE TABLE `%table_prefix%uploads_chunks` ( + `upload_chunk_upload_id` INT UNSIGNED NOT NULL, + `upload_chunk_index` INT UNSIGNED NOT NULL, + `upload_chunk_path` VARCHAR(4096) DEFAULT NULL, + `upload_chunk_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`upload_chunk_upload_id`, `upload_chunk_index`), + FOREIGN KEY (upload_chunk_upload_id) REFERENCES `%table_prefix%uploads` (upload_id) ON DELETE CASCADE, + KEY `upload_chunk_date_gmt` (`upload_chunk_date_gmt`) +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-5/users.sql b/app/schemas/mysql-5/users.sql index 4709894..75ac6ae 100644 --- a/app/schemas/mysql-5/users.sql +++ b/app/schemas/mysql-5/users.sql @@ -1,38 +1,38 @@ DROP TABLE IF EXISTS `%table_prefix%users`; CREATE TABLE `%table_prefix%users` ( - `user_id` bigint(32) NOT NULL AUTO_INCREMENT, - `user_name` varchar(255) DEFAULT NULL, - `user_username` varchar(255) NOT NULL, - `user_date` datetime NOT NULL, - `user_date_gmt` datetime NOT NULL, - `user_email` varchar(255) DEFAULT NULL, - `user_avatar_filename` varchar(255) DEFAULT NULL, - `user_facebook_username` varchar(255) DEFAULT NULL, - `user_twitter_username` varchar(255) DEFAULT NULL, - `user_website` varchar(255) DEFAULT NULL, - `user_background_filename` varchar(255) DEFAULT NULL, - `user_bio` varchar(255) DEFAULT NULL, - `user_timezone` varchar(255) NOT NULL, - `user_language` varchar(255) DEFAULT NULL, - `user_status` enum('valid','awaiting-confirmation','awaiting-email','banned') NOT NULL, - `user_is_admin` tinyint(1) NOT NULL DEFAULT '0', - `user_is_manager` tinyint(1) NOT NULL DEFAULT '0', - `user_is_private` tinyint(1) NOT NULL DEFAULT '0', - `user_palette_id` int(11) NOT NULL DEFAULT '0', - `user_newsletter_subscribe` tinyint(1) NOT NULL DEFAULT '1', - `user_show_nsfw_listings` tinyint(1) NOT NULL DEFAULT '0', - `user_image_count` bigint(32) NOT NULL DEFAULT '0', - `user_album_count` bigint(32) NOT NULL DEFAULT '0', - `user_image_keep_exif` tinyint(1) NOT NULL DEFAULT '1', - `user_file_meta_tag_camera_model` tinyint(1) NOT NULL DEFAULT '1', - `user_image_expiration` varchar(255) DEFAULT NULL, - `user_registration_ip` varchar(255) NOT NULL, - `user_likes` bigint(32) NOT NULL DEFAULT '0' COMMENT 'Likes made to content owned by this user', - `user_liked` bigint(32) NOT NULL DEFAULT '0' COMMENT 'Likes made by this user', - `user_following` bigint(32) NOT NULL DEFAULT '0', - `user_followers` bigint(32) NOT NULL DEFAULT '0', - `user_content_views` bigint(32) NOT NULL DEFAULT '0', - `user_notifications_unread` bigint(32) NOT NULL DEFAULT '0', + `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `user_name` VARCHAR(255) DEFAULT NULL, + `user_username` VARCHAR(255) NOT NULL, + `user_date` DATETIME NOT NULL, + `user_date_gmt` DATETIME NOT NULL, + `user_email` VARCHAR(255) DEFAULT NULL, + `user_avatar_filename` VARCHAR(255) DEFAULT NULL, + `user_facebook_username` VARCHAR(255) DEFAULT NULL, + `user_twitter_username` VARCHAR(255) DEFAULT NULL, + `user_website` VARCHAR(255) DEFAULT NULL, + `user_background_filename` VARCHAR(255) DEFAULT NULL, + `user_bio` VARCHAR(255) DEFAULT NULL, + `user_timezone` VARCHAR(255) NOT NULL, + `user_language` VARCHAR(255) DEFAULT NULL, + `user_status` ENUM('valid','awaiting-confirmation','awaiting-email','banned') NOT NULL, + `user_is_admin` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_is_manager` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_is_private` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_palette_id` INT UNSIGNED NOT NULL DEFAULT '0', + `user_newsletter_subscribe` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_show_nsfw_listings` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_image_count` INT UNSIGNED NOT NULL DEFAULT '0', + `user_album_count` INT UNSIGNED NOT NULL DEFAULT '0', + `user_image_keep_exif` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_file_meta_tag_camera_model` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_image_expiration` VARCHAR(255) DEFAULT NULL, + `user_registration_ip` VARCHAR(255) NOT NULL, + `user_likes` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Likes made to content owned by this user', + `user_liked` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Likes made by this user', + `user_following` INT UNSIGNED NOT NULL DEFAULT '0', + `user_followers` INT UNSIGNED NOT NULL DEFAULT '0', + `user_content_views` INT UNSIGNED NOT NULL DEFAULT '0', + `user_notifications_unread` INT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`user_id`), UNIQUE KEY `username` (`user_username`(191)) USING BTREE, UNIQUE KEY `email` (`user_email`(191)) USING BTREE, diff --git a/app/schemas/mysql-5/variables.sql b/app/schemas/mysql-5/variables.sql index c150d39..4c68a06 100644 --- a/app/schemas/mysql-5/variables.sql +++ b/app/schemas/mysql-5/variables.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%variables`; CREATE TABLE `%table_prefix%variables` ( - `variable_id` int(11) NOT NULL AUTO_INCREMENT, - `variable_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `variable_datetime_utc` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `variable_value` text, - `variable_type` enum('string','bool','int','float','array','object') DEFAULT 'string', + `variable_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `variable_name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `variable_datetime_utc` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `variable_value` TEXT, + `variable_type` ENUM('string','bool','int','float','array','object') DEFAULT 'string', PRIMARY KEY (`variable_id`), UNIQUE KEY `variable_name` (`variable_name`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; diff --git a/app/schemas/mysql-8/albums.sql b/app/schemas/mysql-8/albums.sql index d6e9f5c..fc9acd4 100644 --- a/app/schemas/mysql-8/albums.sql +++ b/app/schemas/mysql-8/albums.sql @@ -1,22 +1,22 @@ DROP TABLE IF EXISTS `%table_prefix%albums`; CREATE TABLE `%table_prefix%albums` ( - `album_id` bigint(32) NOT NULL AUTO_INCREMENT, - `album_name` varchar(100) NOT NULL, - `album_user_id` bigint(32) DEFAULT NULL, - `album_date` datetime NOT NULL, - `album_date_gmt` datetime NOT NULL, - `album_creation_ip` varchar(255) NOT NULL, - `album_privacy` enum('public','password','private','private_but_link','custom') DEFAULT 'public', - `album_privacy_extra` text, - `album_password` text, - `album_image_count` bigint(32) NOT NULL DEFAULT '0', - `album_description` text, - `album_likes` bigint(32) NOT NULL DEFAULT '0', - `album_views` bigint(32) NOT NULL DEFAULT '0', - `album_cover_id` bigint(32) DEFAULT NULL, - `album_parent_id` bigint(32) DEFAULT NULL, - `album_cta_enable` tinyint(1) NOT NULL DEFAULT '0', - `album_cta` text, + `album_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `album_name` VARCHAR(100) NOT NULL, + `album_user_id` INT UNSIGNED DEFAULT NULL, + `album_date` DATETIME NOT NULL, + `album_date_gmt` DATETIME NOT NULL, + `album_creation_ip` VARCHAR(255) NOT NULL, + `album_privacy` ENUM('public','password','private','private_but_link','custom') DEFAULT 'public', + `album_privacy_extra` TEXT, + `album_password` TEXT, + `album_image_count` INT UNSIGNED NOT NULL DEFAULT '0', + `album_description` TEXT, + `album_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `album_views` INT UNSIGNED NOT NULL DEFAULT '0', + `album_cover_id` INT UNSIGNED DEFAULT NULL, + `album_parent_id` INT UNSIGNED DEFAULT NULL, + `album_cta_enable` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `album_cta` TEXT, PRIMARY KEY (`album_id`), KEY `album_name` (`album_name`), KEY `album_user_id` (`album_user_id`), @@ -27,5 +27,6 @@ CREATE TABLE `%table_prefix%albums` ( KEY `album_likes` (`album_likes`), KEY `album_views` (`album_views`), KEY `album_parent_id` (`album_parent_id`), + KEY `album_user_id_parent_id_name` (`album_user_id`, `album_parent_id`, `album_name`), FULLTEXT KEY `searchindex` (`album_name`,`album_description`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/api_keys.sql b/app/schemas/mysql-8/api_keys.sql index 717a879..638671f 100644 --- a/app/schemas/mysql-8/api_keys.sql +++ b/app/schemas/mysql-8/api_keys.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%api_keys`; CREATE TABLE `%table_prefix%api_keys` ( - `api_key_id` bigint(32) NOT NULL AUTO_INCREMENT, - `api_key_user_id` bigint(32) DEFAULT NULL, - `api_key_name` varchar(100) DEFAULT NULL, - `api_key_date_gmt` datetime NOT NULL, - `api_key_hash` text NOT NULL, + `api_key_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `api_key_user_id` INT UNSIGNED DEFAULT NULL, + `api_key_name` VARCHAR(100) DEFAULT NULL, + `api_key_date_gmt` DATETIME NOT NULL, + `api_key_hash` TEXT NOT NULL, PRIMARY KEY (`api_key_id`), KEY `api_key_user_id` (`api_key_user_id`), KEY `api_key_name` (`api_key_name`), diff --git a/app/schemas/mysql-8/assets.sql b/app/schemas/mysql-8/assets.sql index 0072565..c3e8348 100644 --- a/app/schemas/mysql-8/assets.sql +++ b/app/schemas/mysql-8/assets.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%assets`; CREATE TABLE `%table_prefix%assets` ( - `asset_id` bigint(32) NOT NULL AUTO_INCREMENT, - `asset_key` varchar(255) NOT NULL, - `asset_md5` varchar(32) NOT NULL, - `asset_filename` varchar(255) NOT NULL, - `asset_file_path` varchar(255) NOT NULL, + `asset_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `asset_key` VARCHAR(255) NOT NULL, + `asset_checksum` VARCHAR(32) NOT NULL, + `asset_filename` VARCHAR(255) NOT NULL, + `asset_file_path` VARCHAR(255) NOT NULL, `asset_blob` blob, PRIMARY KEY (`asset_id`), UNIQUE KEY `key` (`asset_key`) USING BTREE, diff --git a/app/schemas/mysql-8/categories.sql b/app/schemas/mysql-8/categories.sql index 323b3ad..320d431 100644 --- a/app/schemas/mysql-8/categories.sql +++ b/app/schemas/mysql-8/categories.sql @@ -1,9 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%categories`; CREATE TABLE `%table_prefix%categories` ( - `category_id` bigint(32) NOT NULL AUTO_INCREMENT, - `category_name` varchar(32) NOT NULL, - `category_url_key` varchar(32) COLLATE utf8mb4_bin NOT NULL, - `category_description` text, + `category_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `category_name` VARCHAR(32) NOT NULL, + `category_url_key` VARCHAR(32) COLLATE utf8mb4_bin NOT NULL, + `category_description` TEXT, PRIMARY KEY (`category_id`), + KEY `category_name` (`category_name`), UNIQUE KEY `url_key` (`category_url_key`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/confirmations.sql b/app/schemas/mysql-8/confirmations.sql index 10d481c..ded8766 100644 --- a/app/schemas/mysql-8/confirmations.sql +++ b/app/schemas/mysql-8/confirmations.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%confirmations`; CREATE TABLE `%table_prefix%confirmations` ( - `confirmation_id` bigint(32) NOT NULL AUTO_INCREMENT, - `confirmation_user_id` bigint(32) NOT NULL, - `confirmation_type` enum('account-activate','account-change-email','account-password-forgot') NOT NULL, - `confirmation_date` datetime NOT NULL, - `confirmation_date_gmt` datetime NOT NULL, - `confirmation_token_hash` varchar(255) NOT NULL, - `confirmation_status` enum('active','valid','invalid') NOT NULL, - `confirmation_extra` text, + `confirmation_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `confirmation_user_id` INT UNSIGNED NOT NULL, + `confirmation_type` ENUM('account-activate','account-change-email','account-password-forgot') NOT NULL, + `confirmation_date` DATETIME NOT NULL, + `confirmation_date_gmt` DATETIME NOT NULL, + `confirmation_token_hash` VARCHAR(255) NOT NULL, + `confirmation_status` ENUM('active','valid','invalid') NOT NULL, + `confirmation_extra` TEXT, PRIMARY KEY (`confirmation_id`), KEY `confirmation_user` (`confirmation_user_id`), KEY `confirmation_user_type` (`confirmation_user_id`, `confirmation_type`), diff --git a/app/schemas/mysql-8/deletions.sql b/app/schemas/mysql-8/deletions.sql index b5b732a..e74f09b 100644 --- a/app/schemas/mysql-8/deletions.sql +++ b/app/schemas/mysql-8/deletions.sql @@ -1,20 +1,20 @@ DROP TABLE IF EXISTS `%table_prefix%deletions`; CREATE TABLE `%table_prefix%deletions` ( - `deleted_id` bigint(32) NOT NULL AUTO_INCREMENT, - `deleted_date_gmt` datetime NOT NULL, - `deleted_content_id` bigint(32) NOT NULL, - `deleted_content_date_gmt` datetime NOT NULL, - `deleted_content_user_id` bigint(32) DEFAULT NULL, - `deleted_content_ip` varchar(255) NOT NULL, - `deleted_content_md5` varchar(32) DEFAULT NULL, - `deleted_content_original_filename` varchar(255) DEFAULT NULL, - `deleted_content_views` bigint(32) NOT NULL DEFAULT '0', - `deleted_content_likes` bigint(32) NOT NULL DEFAULT '0', + `deleted_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `deleted_date_gmt` DATETIME NOT NULL, + `deleted_content_id` INT UNSIGNED NOT NULL, + `deleted_content_date_gmt` DATETIME NOT NULL, + `deleted_content_user_id` INT UNSIGNED DEFAULT NULL, + `deleted_content_ip` VARCHAR(255) NOT NULL, + `deleted_content_checksum` VARCHAR(32) DEFAULT NULL, + `deleted_content_original_filename` VARCHAR(255) DEFAULT NULL, + `deleted_content_views` INT UNSIGNED NOT NULL DEFAULT '0', + `deleted_content_likes` INT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`deleted_id`), KEY `deleted_content_id` (`deleted_content_id`), KEY `deleted_content_user_id` (`deleted_content_user_id`), KEY `deleted_content_ip` (`deleted_content_ip`), - KEY `deleted_content_md5` (`deleted_content_md5`), + KEY `deleted_content_checksum` (`deleted_content_checksum`), KEY `deleted_content_views` (`deleted_content_views`), KEY `deleted_content_likes` (`deleted_content_likes`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/follows.sql b/app/schemas/mysql-8/follows.sql index 211af22..bfa7172 100644 --- a/app/schemas/mysql-8/follows.sql +++ b/app/schemas/mysql-8/follows.sql @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS `%table_prefix%follows`; CREATE TABLE `%table_prefix%follows` ( - `follow_id` bigint(32) NOT NULL AUTO_INCREMENT, - `follow_date` datetime NOT NULL, - `follow_date_gmt` datetime NOT NULL, - `follow_user_id` bigint(32) NOT NULL, - `follow_followed_user_id` bigint(32) NOT NULL, - `follow_ip` varchar(255) NOT NULL, + `follow_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `follow_date` DATETIME NOT NULL, + `follow_date_gmt` DATETIME NOT NULL, + `follow_user_id` INT UNSIGNED NOT NULL, + `follow_followed_user_id` INT UNSIGNED NOT NULL, + `follow_ip` VARCHAR(255) NOT NULL, PRIMARY KEY (`follow_id`), KEY `follow_user_id` (`follow_user_id`), KEY `follow_followed_user_id` (`follow_followed_user_id`) -) ENGINE=%table_engine% DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=%table_engine% DEFAULT CHARSET=utf8; diff --git a/app/schemas/mysql-8/images.sql b/app/schemas/mysql-8/images.sql index 40573b4..6edc1a4 100644 --- a/app/schemas/mysql-8/images.sql +++ b/app/schemas/mysql-8/images.sql @@ -1,39 +1,39 @@ DROP TABLE IF EXISTS `%table_prefix%images`; CREATE TABLE `%table_prefix%images` ( - `image_id` bigint(32) NOT NULL AUTO_INCREMENT, - `image_name` varchar(255) NOT NULL, - `image_extension` varchar(255) NOT NULL, - `image_size` bigint(11) UNSIGNED NOT NULL, - `image_width` int(11) NOT NULL, - `image_height` int(11) NOT NULL, - `image_date` datetime NOT NULL, - `image_date_gmt` datetime NOT NULL, - `image_title` varchar(100) DEFAULT NULL, - `image_description` text, - `image_nsfw` tinyint(1) NOT NULL DEFAULT '0', - `image_user_id` bigint(32) DEFAULT NULL, - `image_album_id` bigint(32) DEFAULT NULL, - `image_uploader_ip` varchar(255) NOT NULL, - `image_storage_mode` enum('datefolder','direct','old','path') NOT NULL DEFAULT 'datefolder', - `image_path` varchar(4096) DEFAULT NULL, - `image_storage_id` bigint(32) DEFAULT NULL, - `image_md5` varchar(32) NOT NULL, - `image_source_md5` varchar(32) DEFAULT NULL, - `image_original_filename` varchar(255) NOT NULL, - `image_original_exifdata` mediumtext, - `image_views` bigint(32) NOT NULL DEFAULT '0', - `image_category_id` bigint(32) DEFAULT NULL, - `image_chain` tinyint(3) NOT NULL, - `image_thumb_size` int(11) NOT NULL, - `image_medium_size` int(11) NOT NULL DEFAULT '0', - `image_frame_size` int(11) NOT NULL DEFAULT '0', - `image_expiration_date_gmt` datetime DEFAULT NULL, - `image_likes` bigint(32) NOT NULL DEFAULT '0', - `image_is_animated` tinyint(1) NOT NULL DEFAULT '0', - `image_is_approved` tinyint(1) NOT NULL DEFAULT '1', - `image_is_360` tinyint(1) NOT NULL DEFAULT '0', - `image_duration` int(11) NOT NULL DEFAULT '0', - `image_type` tinyint(3) UNSIGNED as (case + `image_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `image_name` VARCHAR(255) NOT NULL, + `image_extension` VARCHAR(255) NOT NULL, + `image_size` BIGINT UNSIGNED NOT NULL, + `image_width` INT UNSIGNED NOT NULL, + `image_height` INT UNSIGNED NOT NULL, + `image_date` DATETIME NOT NULL, + `image_date_gmt` DATETIME NOT NULL, + `image_title` VARCHAR(100) DEFAULT NULL, + `image_description` TEXT, + `image_nsfw` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_user_id` INT UNSIGNED DEFAULT NULL, + `image_album_id` INT UNSIGNED DEFAULT NULL, + `image_uploader_ip` VARCHAR(255) NOT NULL, + `image_storage_mode` ENUM('datefolder','direct','old','path') NOT NULL DEFAULT 'datefolder', + `image_path` VARCHAR(4096) DEFAULT NULL, + `image_storage_id` INT UNSIGNED DEFAULT NULL, + `image_checksum` VARCHAR(32) NOT NULL, + `image_source_checksum` VARCHAR(32) DEFAULT NULL, + `image_original_filename` VARCHAR(255) NOT NULL, + `image_original_exifdata` MEDIUMTEXT, + `image_views` INT UNSIGNED NOT NULL DEFAULT '0', + `image_category_id` INT UNSIGNED DEFAULT NULL, + `image_chain` TINYINT UNSIGNED NOT NULL, + `image_thumb_size` INT UNSIGNED NOT NULL, + `image_medium_size` INT UNSIGNED NOT NULL DEFAULT '0', + `image_frame_size` INT UNSIGNED NOT NULL DEFAULT '0', + `image_expiration_date_gmt` DATETIME DEFAULT NULL, + `image_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `image_is_animated` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_is_approved` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `image_is_360` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `image_duration` INT UNSIGNED NOT NULL DEFAULT '0', + `image_type` TINYINT UNSIGNED as (case when `image_extension` in ('pdf','doc','md') then 4 when `image_extension` in ('mp3','m4a','wav') then 3 when `image_extension` in ('mp4','webm','mov') then 2 @@ -53,8 +53,8 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_storage_mode` (`image_storage_mode`), KEY `image_path` (`image_path`(255)), KEY `image_storage_id` (`image_storage_id`), - KEY `image_md5` (`image_md5`), - KEY `image_source_md5` (`image_source_md5`), + KEY `image_checksum` (`image_checksum`), + KEY `image_source_checksum` (`image_source_checksum`), KEY `image_views` (`image_views`), KEY `image_category_id` (`image_category_id`), KEY `image_chain` (`image_chain`), @@ -66,5 +66,6 @@ CREATE TABLE `%table_prefix%images` ( KEY `image_album_id_image_id` (`image_album_id`, `image_id`), KEY `image_duration` (`image_duration`), KEY `image_type` (`image_type`), - FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`) + FULLTEXT KEY `searchindex` (`image_name`,`image_title`,`image_description`,`image_original_filename`), + KEY `image_uploader_ip_date_gmt_checksum_source_checksum` (`image_uploader_ip`, `image_date_gmt`, `image_checksum`, `image_source_checksum`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/images_hash.sql b/app/schemas/mysql-8/images_hash.sql index 19e1d89..e4e00ca 100644 --- a/app/schemas/mysql-8/images_hash.sql +++ b/app/schemas/mysql-8/images_hash.sql @@ -1,6 +1,6 @@ DROP TABLE IF EXISTS `%table_prefix%images_hash`; CREATE TABLE `%table_prefix%images_hash` ( - `image_hash_image_id` bigint(32) NOT NULL, - `image_hash_hash` text NOT NULL, + `image_hash_image_id` INT UNSIGNED NOT NULL, + `image_hash_hash` TEXT NOT NULL, PRIMARY KEY (`image_hash_image_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/importing.sql b/app/schemas/mysql-8/importing.sql index 7b901bc..68a82a5 100644 --- a/app/schemas/mysql-8/importing.sql +++ b/app/schemas/mysql-8/importing.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%importing`; CREATE TABLE `%table_prefix%importing` ( - `importing_id` bigint(32) NOT NULL AUTO_INCREMENT, - `importing_import_id` bigint(32) NOT NULL, - `importing_path` varchar(4096) NOT NULL, - `importing_content_type` enum('user','album','image') NOT NULL, - `importing_content_id` bigint(32) DEFAULT NULL, + `importing_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `importing_import_id` INT UNSIGNED NOT NULL, + `importing_path` VARCHAR(4096) NOT NULL, + `importing_content_type` ENUM('user','album','image') NOT NULL, + `importing_content_id` INT UNSIGNED DEFAULT NULL, PRIMARY KEY (`importing_id`), UNIQUE KEY `importing_path` (`importing_path`(767)) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/imports.sql b/app/schemas/mysql-8/imports.sql index 5745158..c6f3666 100644 --- a/app/schemas/mysql-8/imports.sql +++ b/app/schemas/mysql-8/imports.sql @@ -1,21 +1,21 @@ DROP TABLE IF EXISTS `%table_prefix%imports`; CREATE TABLE `%table_prefix%imports` ( - `import_id` bigint(32) NOT NULL AUTO_INCREMENT, - `import_path` varchar(4096) NOT NULL, - `import_options` varchar(255) DEFAULT NULL, - `import_status` enum('queued','working','paused','canceled','completed') NOT NULL, - `import_users` bigint(32) NOT NULL DEFAULT '0', - `import_images` bigint(32) NOT NULL DEFAULT '0', - `import_albums` bigint(32) NOT NULL DEFAULT '0', - `import_time_created` datetime DEFAULT NULL, - `import_time_updated` datetime DEFAULT NULL, - `import_errors` tinyint(1) NOT NULL DEFAULT '0', - `import_started` tinyint(1) NOT NULL DEFAULT '0', - `import_continuous` tinyint(1) NOT NULL DEFAULT '0', + `import_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `import_path` VARCHAR(4096) NOT NULL, + `import_options` VARCHAR(255) DEFAULT NULL, + `import_status` ENUM('queued','working','paused','canceled','completed') NOT NULL, + `import_users` INT UNSIGNED NOT NULL DEFAULT '0', + `import_images` INT UNSIGNED NOT NULL DEFAULT '0', + `import_albums` INT UNSIGNED NOT NULL DEFAULT '0', + `import_time_created` DATETIME DEFAULT NULL, + `import_time_updated` DATETIME DEFAULT NULL, + `import_errors` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `import_started` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `import_continuous` TINYINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`import_id`), KEY `import_path` (`import_path`(767)) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; INSERT INTO `%table_prefix%imports` VALUES ('1', '%rootPath%importing/no-parse', 'a:1:{s:4:"root";s:5:"plain";}', 'working', '0', '0', '0', NOW(), NOW(), '0', '1', '1'); INSERT INTO `%table_prefix%imports` VALUES ('2', '%rootPath%importing/parse-users', 'a:1:{s:4:"root";s:5:"users";}', 'working', '0', '0', '0', NOW(), NOW(), '0', '1', '1'); -INSERT INTO `%table_prefix%imports` VALUES ('3', '%rootPath%importing/parse-albums', 'a:1:{s:4:"root";s:6:"albums";}', 'working', '0', '0', '0', NOW(), NOW(), '0', '1', '1'); \ No newline at end of file +INSERT INTO `%table_prefix%imports` VALUES ('3', '%rootPath%importing/parse-albums', 'a:1:{s:4:"root";s:6:"albums";}', 'working', '0', '0', '0', NOW(), NOW(), '0', '1', '1'); diff --git a/app/schemas/mysql-8/ip_bans.sql b/app/schemas/mysql-8/ip_bans.sql index dd5bf2b..f9d94c9 100644 --- a/app/schemas/mysql-8/ip_bans.sql +++ b/app/schemas/mysql-8/ip_bans.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%ip_bans`; CREATE TABLE `%table_prefix%ip_bans` ( - `ip_ban_id` bigint(20) NOT NULL AUTO_INCREMENT, - `ip_ban_date` datetime NOT NULL, - `ip_ban_date_gmt` datetime NOT NULL, - `ip_ban_expires` datetime DEFAULT NULL, - `ip_ban_expires_gmt` datetime DEFAULT NULL, - `ip_ban_ip` varchar(255) NOT NULL, - `ip_ban_message` text, + `ip_ban_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `ip_ban_date` DATETIME NOT NULL, + `ip_ban_date_gmt` DATETIME NOT NULL, + `ip_ban_expires` DATETIME DEFAULT NULL, + `ip_ban_expires_gmt` DATETIME DEFAULT NULL, + `ip_ban_ip` VARCHAR(255) NOT NULL, + `ip_ban_message` TEXT, PRIMARY KEY (`ip_ban_id`), - KEY `ip_ban_date_gmt` (`ip_ban_date_gmt`), - UNIQUE KEY `ip_ban_ip` (`ip_ban_ip`) USING BTREE -) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; \ No newline at end of file + UNIQUE KEY `ip_ban_ip` (`ip_ban_ip`) USING BTREE, + KEY `ip_ban_ip_expires_gmt_id` (`ip_ban_ip`, `ip_ban_expires_gmt`, `ip_ban_id` DESC) +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/likes.sql b/app/schemas/mysql-8/likes.sql index 8d9d4b1..651bbeb 100644 --- a/app/schemas/mysql-8/likes.sql +++ b/app/schemas/mysql-8/likes.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%likes`; CREATE TABLE `%table_prefix%likes` ( - `like_id` bigint(32) NOT NULL AUTO_INCREMENT, - `like_date` datetime NOT NULL, - `like_date_gmt` datetime NOT NULL, - `like_user_id` bigint(32) DEFAULT NULL, - `like_content_type` enum('image','album') DEFAULT NULL, - `like_content_id` bigint(32) NOT NULL, - `like_content_user_id` bigint(32) DEFAULT NULL, - `like_ip` varchar(255) NOT NULL, + `like_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `like_date` DATETIME NOT NULL, + `like_date_gmt` DATETIME NOT NULL, + `like_user_id` INT UNSIGNED DEFAULT NULL, + `like_content_type` ENUM('image','album') DEFAULT NULL, + `like_content_id` INT UNSIGNED NOT NULL, + `like_content_user_id` INT UNSIGNED DEFAULT NULL, + `like_ip` VARCHAR(255) NOT NULL, PRIMARY KEY (`like_id`), KEY `like_date_gmt` (`like_date_gmt`), KEY `like_user_id` (`like_user_id`), diff --git a/app/schemas/mysql-8/locks.sql b/app/schemas/mysql-8/locks.sql index d9ba8e2..3fe6b70 100644 --- a/app/schemas/mysql-8/locks.sql +++ b/app/schemas/mysql-8/locks.sql @@ -1,11 +1,11 @@ DROP TABLE IF EXISTS `%table_prefix%locks`; CREATE TABLE `%table_prefix%locks` ( - `lock_id` bigint(20) NOT NULL AUTO_INCREMENT, - `lock_name` varchar(255) NOT NULL, - `lock_date_gmt` datetime NOT NULL, - `lock_expires_gmt` datetime DEFAULT NULL, + `lock_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `lock_name` VARCHAR(255) NOT NULL, + `lock_date_gmt` DATETIME NOT NULL, + `lock_expires_gmt` DATETIME DEFAULT NULL, PRIMARY KEY (`lock_id`), KEY `lock_date_gmt` (`lock_date_gmt`), KEY `lock_expires_gmt` (`lock_expires_gmt`), UNIQUE KEY `lock_name` (`lock_name`) USING BTREE -) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; \ No newline at end of file +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/login_connections.sql b/app/schemas/mysql-8/login_connections.sql index 09e2e78..755ebff 100644 --- a/app/schemas/mysql-8/login_connections.sql +++ b/app/schemas/mysql-8/login_connections.sql @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS `%table_prefix%login_connections`; CREATE TABLE `%table_prefix%login_connections` ( - `login_connection_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_connection_user_id` bigint(32) NOT NULL, - `login_connection_provider_id` bigint(32) NOT NULL, - `login_connection_date_gmt` datetime NOT NULL, - `login_connection_resource_id` varchar(255) NOT NULL, - `login_connection_resource_name` text, - `login_connection_token` text NOT NULL COMMENT 'Ciphertext', + `login_connection_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_connection_user_id` INT UNSIGNED NOT NULL, + `login_connection_provider_id` INT UNSIGNED NOT NULL, + `login_connection_date_gmt` DATETIME NOT NULL, + `login_connection_resource_id` VARCHAR(255) NOT NULL, + `login_connection_resource_name` TEXT, + `login_connection_token` TEXT NOT NULL COMMENT 'Ciphertext', PRIMARY KEY (`login_connection_id`), UNIQUE KEY `login_connection_unique` (`login_connection_user_id`,`login_connection_provider_id`), KEY `login_connection_user_id` (`login_connection_user_id`), diff --git a/app/schemas/mysql-8/login_cookies.sql b/app/schemas/mysql-8/login_cookies.sql index 10371c4..45fbc17 100644 --- a/app/schemas/mysql-8/login_cookies.sql +++ b/app/schemas/mysql-8/login_cookies.sql @@ -1,16 +1,17 @@ DROP TABLE IF EXISTS `%table_prefix%login_cookies`; CREATE TABLE `%table_prefix%login_cookies` ( - `login_cookie_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_cookie_user_id` bigint(32) NOT NULL, - `login_cookie_connection_id` bigint(32) DEFAULT 0, - `login_cookie_date_gmt` datetime NOT NULL, - `login_cookie_ip` varchar(255) DEFAULT NULL, - `login_cookie_user_agent` text NOT NULL, - `login_cookie_hash` text NOT NULL, + `login_cookie_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_cookie_user_id` INT UNSIGNED NOT NULL, + `login_cookie_connection_id` INT UNSIGNED DEFAULT 0, + `login_cookie_date_gmt` DATETIME NOT NULL, + `login_cookie_ip` VARCHAR(255) DEFAULT NULL, + `login_cookie_user_agent` TEXT NOT NULL, + `login_cookie_hash` TEXT NOT NULL, PRIMARY KEY (`login_cookie_id`), UNIQUE KEY `login_cookie_unique` (`login_cookie_user_id`,`login_cookie_connection_id`,`login_cookie_date_gmt`), KEY `login_cookie_user_id_date_gmt` (`login_cookie_user_id`, `login_cookie_date_gmt`), KEY `login_cookie_user_id` (`login_cookie_user_id`), KEY `login_cookie_ip` (`login_cookie_ip`), - KEY `login_cookie_connection_id` (`login_cookie_connection_id`) + KEY `login_cookie_connection_id` (`login_cookie_connection_id`), + KEY `login_cookie_user_id_date_gmt_connection_id` (`login_cookie_user_id`, `login_cookie_date_gmt`, `login_cookie_connection_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/login_passwords.sql b/app/schemas/mysql-8/login_passwords.sql index a353c3f..82a1ad2 100644 --- a/app/schemas/mysql-8/login_passwords.sql +++ b/app/schemas/mysql-8/login_passwords.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%login_passwords`; CREATE TABLE `%table_prefix%login_passwords` ( - `login_password_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_password_user_id` bigint(32) NOT NULL, - `login_password_date_gmt` datetime NOT NULL, - `login_password_hash` text NOT NULL, + `login_password_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_password_user_id` INT UNSIGNED NOT NULL, + `login_password_date_gmt` DATETIME NOT NULL, + `login_password_hash` TEXT NOT NULL, PRIMARY KEY (`login_password_id`), UNIQUE KEY `login_password_user_id` (`login_password_user_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/login_providers.sql b/app/schemas/mysql-8/login_providers.sql index 965c2c0..44b8b35 100644 --- a/app/schemas/mysql-8/login_providers.sql +++ b/app/schemas/mysql-8/login_providers.sql @@ -1,14 +1,15 @@ DROP TABLE IF EXISTS `%table_prefix%login_providers`; CREATE TABLE `%table_prefix%login_providers` ( - `login_provider_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_provider_name` varchar(255) DEFAULT NULL, - `login_provider_label` varchar(255) DEFAULT NULL, - `login_provider_key_id` text DEFAULT NULL, - `login_provider_key_secret` text DEFAULT NULL, - `login_provider_is_enabled` tinyint(1) NOT NULL DEFAULT '1', + `login_provider_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_provider_name` VARCHAR(255) DEFAULT NULL, + `login_provider_label` VARCHAR(255) DEFAULT NULL, + `login_provider_key_id` TEXT DEFAULT NULL, + `login_provider_key_secret` TEXT DEFAULT NULL, + `login_provider_is_enabled` TINYINT UNSIGNED NOT NULL DEFAULT '1', PRIMARY KEY (`login_provider_id`), UNIQUE KEY `login_provider_name` (`login_provider_name`), - KEY `login_provider_is_enabled` (`login_provider_is_enabled`) + KEY `login_provider_is_enabled` (`login_provider_is_enabled`), + KEY `login_provider_id_is_enabled_name` (`login_provider_id`, `login_provider_is_enabled`, `login_provider_name` DESC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; INSERT INTO `%table_prefix%login_providers` VALUES ('1', 'facebook', 'Facebook', null, null, '0'); INSERT INTO `%table_prefix%login_providers` VALUES ('2', 'twitter', 'X', null, null, '0'); diff --git a/app/schemas/mysql-8/logins.sql b/app/schemas/mysql-8/logins.sql index b03ce7d..b7cf588 100644 --- a/app/schemas/mysql-8/logins.sql +++ b/app/schemas/mysql-8/logins.sql @@ -1,18 +1,18 @@ DROP TABLE IF EXISTS `%table_prefix%logins`; CREATE TABLE `%table_prefix%logins` ( - `login_id` bigint(32) NOT NULL AUTO_INCREMENT, - `login_user_id` bigint(32) NOT NULL, - `login_type` enum('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk') NOT NULL, - `login_ip` varchar(255) DEFAULT NULL, - `login_hostname` text, - `login_date` datetime NOT NULL, - `login_date_gmt` datetime NOT NULL, - `login_resource_id` varchar(255) DEFAULT NULL, - `login_resource_name` text, - `login_resource_avatar` text, - `login_resource_url` text, - `login_secret` text DEFAULT NULL COMMENT 'The secret part', - `login_token_hash` text COMMENT 'Hashed complement to secret if needed', + `login_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `login_user_id` INT UNSIGNED NOT NULL, + `login_type` ENUM('password','session','cookie','facebook','twitter','google','vk','cookie_facebook','cookie_twitter','cookie_google','cookie_vk') NOT NULL, + `login_ip` VARCHAR(255) DEFAULT NULL, + `login_hostname` TEXT, + `login_date` DATETIME NOT NULL, + `login_date_gmt` DATETIME NOT NULL, + `login_resource_id` VARCHAR(255) DEFAULT NULL, + `login_resource_name` TEXT, + `login_resource_avatar` TEXT, + `login_resource_url` TEXT, + `login_secret` TEXT DEFAULT NULL COMMENT 'The secret part', + `login_token_hash` TEXT COMMENT 'Hashed complement to secret if needed', PRIMARY KEY (`login_id`), KEY `login_user_id` (`login_user_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/notifications.sql b/app/schemas/mysql-8/notifications.sql index a5880c9..c035d8b 100644 --- a/app/schemas/mysql-8/notifications.sql +++ b/app/schemas/mysql-8/notifications.sql @@ -1,13 +1,13 @@ DROP TABLE IF EXISTS `%table_prefix%notifications`; CREATE TABLE `%table_prefix%notifications` ( - `notification_id` bigint(32) NOT NULL AUTO_INCREMENT, - `notification_date_gmt` datetime NOT NULL, - `notification_user_id` bigint(32) NOT NULL, - `notification_trigger_user_id` bigint(32) DEFAULT NULL, - `notification_type` enum('follow','like') NOT NULL, - `notification_content_type` enum('user','image','album') NOT NULL, - `notification_type_id` bigint(32) NOT NULL COMMENT 'type_id based on action (type) table', - `notification_is_read` tinyint(1) NOT NULL DEFAULT '0', + `notification_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `notification_date_gmt` DATETIME NOT NULL, + `notification_user_id` INT UNSIGNED NOT NULL, + `notification_trigger_user_id` INT UNSIGNED DEFAULT NULL, + `notification_type` ENUM('follow','like') NOT NULL, + `notification_content_type` ENUM('user','image','album') NOT NULL, + `notification_type_id` INT UNSIGNED NOT NULL COMMENT 'type_id based on action (type) table', + `notification_is_read` TINYINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`notification_id`), KEY `notification_date_gmt` (`notification_date_gmt`), KEY `notification_user_id` (`notification_user_id`), @@ -16,4 +16,4 @@ CREATE TABLE `%table_prefix%notifications` ( KEY `notification_content_type` (`notification_content_type`), KEY `notification_type_id` (`notification_type_id`), KEY `notification_is_read` (`notification_is_read`) -) ENGINE=%table_engine% DEFAULT CHARSET=utf8; \ No newline at end of file +) ENGINE=%table_engine% DEFAULT CHARSET=utf8; diff --git a/app/schemas/mysql-8/pages.sql b/app/schemas/mysql-8/pages.sql index 178a54a..124cdbd 100644 --- a/app/schemas/mysql-8/pages.sql +++ b/app/schemas/mysql-8/pages.sql @@ -1,21 +1,21 @@ DROP TABLE IF EXISTS `%table_prefix%pages`; CREATE TABLE `%table_prefix%pages` ( - `page_id` bigint(32) NOT NULL AUTO_INCREMENT, - `page_url_key` varchar(32) DEFAULT NULL, - `page_type` enum('internal','link') NOT NULL DEFAULT 'internal', - `page_file_path` varchar(255) DEFAULT NULL, - `page_link_url` text, - `page_icon` varchar(255) DEFAULT NULL, - `page_title` varchar(255) NOT NULL, - `page_description` text, - `page_keywords` text, - `page_is_active` tinyint(1) NOT NULL DEFAULT '1', - `page_is_link_visible` tinyint(1) NOT NULL DEFAULT '1', - `page_attr_target` enum('_self','_blank') DEFAULT '_self', - `page_attr_rel` varchar(255) DEFAULT NULL, - `page_sort_display` int(11) DEFAULT NULL, - `page_internal` varchar(255) DEFAULT NULL, - `page_code` text, + `page_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `page_url_key` VARCHAR(32) DEFAULT NULL, + `page_type` ENUM('internal','link') NOT NULL DEFAULT 'internal', + `page_file_path` VARCHAR(255) DEFAULT NULL, + `page_link_url` TEXT, + `page_icon` VARCHAR(255) DEFAULT NULL, + `page_title` VARCHAR(255) NOT NULL, + `page_description` TEXT, + `page_keywords` TEXT, + `page_is_active` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `page_is_link_visible` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `page_attr_target` ENUM('_self','_blank') DEFAULT '_self', + `page_attr_rel` VARCHAR(255) DEFAULT NULL, + `page_sort_display` INT UNSIGNED DEFAULT NULL, + `page_internal` VARCHAR(255) DEFAULT NULL, + `page_code` TEXT, PRIMARY KEY (`page_id`), UNIQUE KEY `page_internal` (`page_internal`), KEY `page_url_key` (`page_url_key`), diff --git a/app/schemas/mysql-8/queues.sql b/app/schemas/mysql-8/queues.sql index d55544e..75b48f5 100644 --- a/app/schemas/mysql-8/queues.sql +++ b/app/schemas/mysql-8/queues.sql @@ -1,11 +1,11 @@ DROP TABLE IF EXISTS `%table_prefix%queues`; CREATE TABLE `%table_prefix%queues` ( - `queue_id` bigint(32) NOT NULL AUTO_INCREMENT, - `queue_type` enum('storage-delete') NOT NULL, - `queue_date_gmt` datetime NOT NULL, - `queue_args` text NOT NULL, - `queue_join` bigint(32) NOT NULL, - `queue_attempts` varchar(255) DEFAULT '0', - `queue_status` enum('pending','failed') NOT NULL DEFAULT 'pending', + `queue_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `queue_type` ENUM('storage-delete') NOT NULL, + `queue_date_gmt` DATETIME NOT NULL, + `queue_args` TEXT NOT NULL, + `queue_join` INT UNSIGNED NOT NULL, + `queue_attempts` VARCHAR(255) DEFAULT '0', + `queue_status` ENUM('pending','failed') NOT NULL DEFAULT 'pending', PRIMARY KEY (`queue_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8; diff --git a/app/schemas/mysql-8/requests.sql b/app/schemas/mysql-8/requests.sql index f55e6e9..7e3f5a7 100644 --- a/app/schemas/mysql-8/requests.sql +++ b/app/schemas/mysql-8/requests.sql @@ -1,18 +1,20 @@ DROP TABLE IF EXISTS `%table_prefix%requests`; CREATE TABLE `%table_prefix%requests` ( - `request_id` bigint(32) NOT NULL AUTO_INCREMENT, - `request_type` enum('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login', 'content-password', 'account-two-factor') NOT NULL, - `request_user_id` bigint(32) DEFAULT NULL, - `request_content_id` bigint(32) DEFAULT NULL, - `request_ip` varchar(255) NOT NULL, - `request_date` datetime NOT NULL, - `request_date_gmt` datetime NOT NULL, - `request_result` enum('success','fail') NOT NULL, + `request_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `request_type` ENUM('upload','signup','account-edit','account-password-forgot','account-password-reset','account-resend-activation','account-email-needed','account-change-email','account-activate','login', 'content-password', 'account-two-factor') NOT NULL, + `request_user_id` INT UNSIGNED DEFAULT NULL, + `request_content_id` INT UNSIGNED DEFAULT NULL, + `request_ip` VARCHAR(255) NOT NULL, + `request_date` DATETIME NOT NULL, + `request_date_gmt` DATETIME NOT NULL, + `request_result` ENUM('success','fail') NOT NULL, PRIMARY KEY (`request_id`), KEY `request_type` (`request_type`), KEY `request_user_id` (`request_user_id`), KEY `request_content_id` (`request_content_id`), KEY `request_ip` (`request_ip`), KEY `request_date_gmt` (`request_date_gmt`), - KEY `request_result` (`request_result`) + KEY `request_result` (`request_result`), + KEY `request_result_ip_type_date_gmt` (`request_result`, `request_type`, `request_ip`,`request_date_gmt`), + KEY `request_user_id_result_type_ip` (`request_user_id`, `request_result`, `request_type`, `request_ip`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8; diff --git a/app/schemas/mysql-8/settings.sql b/app/schemas/mysql-8/settings.sql index 9f9c37a..aaf5f68 100644 --- a/app/schemas/mysql-8/settings.sql +++ b/app/schemas/mysql-8/settings.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%settings`; CREATE TABLE `%table_prefix%settings` ( - `setting_id` int(11) NOT NULL AUTO_INCREMENT, - `setting_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `setting_value` text, - `setting_default` text, - `setting_typeset` enum('string','bool') DEFAULT 'string', + `setting_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `setting_name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `setting_value` TEXT, + `setting_default` TEXT, + `setting_typeset` ENUM('string','bool') DEFAULT 'string', PRIMARY KEY (`setting_id`), UNIQUE KEY `setting_name` (`setting_name`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/stats.sql b/app/schemas/mysql-8/stats.sql index e7127b9..09c1d25 100644 --- a/app/schemas/mysql-8/stats.sql +++ b/app/schemas/mysql-8/stats.sql @@ -1,21 +1,22 @@ DROP TABLE IF EXISTS `%table_prefix%stats`; CREATE TABLE `%table_prefix%stats` ( - `stat_id` bigint(32) NOT NULL AUTO_INCREMENT, - `stat_type` enum('total','date') NOT NULL, + `stat_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `stat_type` ENUM('total','date') NOT NULL, `stat_date_gmt` date DEFAULT NULL, - `stat_users` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_images` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_albums` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_tags` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_cron_runs` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_cron_time` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_image_views` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_album_views` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_image_likes` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_album_likes` bigint(32) UNSIGNED NOT NULL DEFAULT '0', - `stat_disk_used` bigint(32) UNSIGNED NOT NULL DEFAULT '0', + `stat_users` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_images` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_albums` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_tags` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_cron_runs` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_cron_time` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_image_views` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_album_views` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_image_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_album_likes` INT UNSIGNED NOT NULL DEFAULT '0', + `stat_disk_used` BIGINT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`stat_id`), UNIQUE KEY `stat_date_gmt` (`stat_date_gmt`) USING BTREE, - KEY `stat_type` (`stat_type`) + KEY `stat_type` (`stat_type`), + KEY `stat_type_date_gmt` (`stat_type`, `stat_date_gmt` DESC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8; INSERT INTO `%table_prefix%stats` (stat_id, stat_type) VALUES (1, 'total'); diff --git a/app/schemas/mysql-8/storage_apis.sql b/app/schemas/mysql-8/storage_apis.sql index 886244c..612abd5 100644 --- a/app/schemas/mysql-8/storage_apis.sql +++ b/app/schemas/mysql-8/storage_apis.sql @@ -1,8 +1,8 @@ DROP TABLE IF EXISTS `%table_prefix%storage_apis`; CREATE TABLE `%table_prefix%storage_apis` ( - `storage_api_id` bigint(32) NOT NULL AUTO_INCREMENT, - `storage_api_name` varchar(255) NOT NULL, - `storage_api_type` varchar(255) NOT NULL, + `storage_api_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `storage_api_name` VARCHAR(255) NOT NULL, + `storage_api_type` VARCHAR(255) NOT NULL, PRIMARY KEY (`storage_api_id`) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8; INSERT INTO `%table_prefix%storage_apis` VALUES ('1', 'Amazon S3', 's3'); @@ -15,4 +15,4 @@ INSERT INTO `%table_prefix%storage_apis` VALUES ('7', 'OpenStack', 'openstack'); INSERT INTO `%table_prefix%storage_apis` VALUES ('8', 'Local', 'local'); INSERT INTO `%table_prefix%storage_apis` VALUES ('9', 'S3 compatible', 's3compatible'); INSERT INTO `%table_prefix%storage_apis` VALUES ('10', 'Alibaba Cloud OSS', 'oss'); -INSERT INTO `%table_prefix%storage_apis` VALUES ('11', 'Backblaze B2', 'b2'); \ No newline at end of file +INSERT INTO `%table_prefix%storage_apis` VALUES ('11', 'Backblaze B2', 'b2'); diff --git a/app/schemas/mysql-8/storages.sql b/app/schemas/mysql-8/storages.sql index 7fb4ef9..1970462 100644 --- a/app/schemas/mysql-8/storages.sql +++ b/app/schemas/mysql-8/storages.sql @@ -1,23 +1,23 @@ DROP TABLE IF EXISTS `%table_prefix%storages`; CREATE TABLE `%table_prefix%storages` ( - `storage_id` bigint(32) NOT NULL AUTO_INCREMENT, - `storage_api_id` bigint(32) NOT NULL, - `storage_name` varchar(255) NOT NULL, - `storage_service` varchar(255) DEFAULT NULL, - `storage_url` varchar(255) NOT NULL, - `storage_bucket` varchar(255) DEFAULT NULL, - `storage_region` varchar(255) DEFAULT NULL, - `storage_server` varchar(255) DEFAULT NULL, - `storage_account_id` varchar(255) DEFAULT NULL, - `storage_account_name` varchar(255) DEFAULT NULL, - `storage_key` text, - `storage_secret` text, - `storage_is_https` tinyint(1) NOT NULL DEFAULT '0', - `storage_is_active` tinyint(1) NOT NULL DEFAULT '0', - `storage_capacity` bigint(32) DEFAULT NULL, - `storage_space_used` bigint(32) DEFAULT '0', - `storage_type_chain` tinyint(3) NOT NULL DEFAULT '1', - `storage_use_path_style_endpoint` tinyint(1) NOT NULL DEFAULT '0', + `storage_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `storage_api_id` INT UNSIGNED NOT NULL, + `storage_name` VARCHAR(255) NOT NULL, + `storage_service` VARCHAR(255) DEFAULT NULL, + `storage_url` VARCHAR(255) NOT NULL, + `storage_bucket` VARCHAR(255) DEFAULT NULL, + `storage_region` VARCHAR(255) DEFAULT NULL, + `storage_server` VARCHAR(255) DEFAULT NULL, + `storage_account_id` VARCHAR(255) DEFAULT NULL, + `storage_account_name` VARCHAR(255) DEFAULT NULL, + `storage_key` TEXT, + `storage_secret` TEXT, + `storage_is_https` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `storage_is_active` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `storage_capacity` BIGINT UNSIGNED DEFAULT NULL, + `storage_space_used` BIGINT UNSIGNED DEFAULT '0', + `storage_type_chain` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `storage_use_path_style_endpoint` TINYINT UNSIGNED NOT NULL DEFAULT '0', `storage_deleted_at` DATETIME NULL DEFAULT NULL, PRIMARY KEY (`storage_id`), KEY `storage_api_id` (`storage_api_id`), diff --git a/app/schemas/mysql-8/tags.sql b/app/schemas/mysql-8/tags.sql index 898ed76..4119b6c 100644 --- a/app/schemas/mysql-8/tags.sql +++ b/app/schemas/mysql-8/tags.sql @@ -1,12 +1,12 @@ DROP TABLE IF EXISTS `%table_prefix%tags`; CREATE TABLE `%table_prefix%tags` ( - `tag_id` bigint(32) NOT NULL AUTO_INCREMENT, - `tag_name` varchar(32) COLLATE utf8mb4_bin NOT NULL, - `tag_description` text, - `tag_user_id` bigint(32) NOT NULL, - `tag_date_gmt` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - `tag_files` bigint(32) NOT NULL DEFAULT 0, - `tag_views` bigint(32) NOT NULL DEFAULT 0, + `tag_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `tag_name` VARCHAR(32) COLLATE utf8mb4_bin NOT NULL, + `tag_description` TEXT, + `tag_user_id` INT UNSIGNED NOT NULL, + `tag_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_files` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_views` INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`tag_id`), UNIQUE KEY `tag_name` (`tag_name`) USING BTREE, KEY `tag_user_id` (`tag_user_id`), @@ -15,5 +15,6 @@ CREATE TABLE `%table_prefix%tags` ( KEY `tag_views` (`tag_views`), KEY `tag_user_id_date_gmt` (`tag_user_id`,`tag_date_gmt`), KEY `tag_user_id_files` (`tag_user_id`,`tag_files`), - KEY `tag_user_id_views` (`tag_user_id`,`tag_views`) + KEY `tag_user_id_views` (`tag_user_id`,`tag_views`), + KEY `tag_files_name` (`tag_files` DESC, `tag_name` ASC) ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/tags_albums.sql b/app/schemas/mysql-8/tags_albums.sql index b115eed..744857b 100644 --- a/app/schemas/mysql-8/tags_albums.sql +++ b/app/schemas/mysql-8/tags_albums.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%tags_albums`; CREATE TABLE `%table_prefix%tags_albums` ( - `tag_album_tag_id` bigint(32) NOT NULL, - `tag_album_album_id` bigint(32) NOT NULL, - `tag_album_user_id` bigint(32) NOT NULL, - `tag_album_count` int(11) NOT NULL DEFAULT 0, - `tag_album_last_used_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_album_tag_id` INT UNSIGNED NOT NULL, + `tag_album_album_id` INT UNSIGNED NOT NULL, + `tag_album_user_id` INT UNSIGNED NOT NULL, + `tag_album_count` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_album_last_used_datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tag_album_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_album_album_id) REFERENCES `%table_prefix%albums` (album_id) ON DELETE CASCADE, FOREIGN KEY (tag_album_user_id) REFERENCES `%table_prefix%users` (user_id) ON DELETE CASCADE, diff --git a/app/schemas/mysql-8/tags_files.sql b/app/schemas/mysql-8/tags_files.sql index 863cdff..40c1e85 100644 --- a/app/schemas/mysql-8/tags_files.sql +++ b/app/schemas/mysql-8/tags_files.sql @@ -1,7 +1,7 @@ DROP TABLE IF EXISTS `%table_prefix%tags_files`; CREATE TABLE `%table_prefix%tags_files` ( - `tag_file_tag_id` bigint(32) NOT NULL, - `tag_file_file_id` bigint(32) NOT NULL, + `tag_file_tag_id` INT UNSIGNED NOT NULL, + `tag_file_file_id` INT UNSIGNED NOT NULL, FOREIGN KEY (tag_file_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_file_file_id) REFERENCES `%table_prefix%images` (image_id) ON DELETE CASCADE, UNIQUE INDEX `tag_file_UNIQUE` (`tag_file_tag_id` ASC, `tag_file_file_id` ASC) diff --git a/app/schemas/mysql-8/tags_users.sql b/app/schemas/mysql-8/tags_users.sql index 8ee43fa..3fc3410 100644 --- a/app/schemas/mysql-8/tags_users.sql +++ b/app/schemas/mysql-8/tags_users.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%tags_users`; CREATE TABLE `%table_prefix%tags_users` ( - `tag_user_tag_id` bigint(32) NOT NULL, - `tag_user_user_id` bigint(32) NOT NULL, - `tag_user_count` int(11) NOT NULL DEFAULT 0, - `tag_user_last_used_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, + `tag_user_tag_id` INT UNSIGNED NOT NULL, + `tag_user_user_id` INT UNSIGNED NOT NULL, + `tag_user_count` INT UNSIGNED NOT NULL DEFAULT 0, + `tag_user_last_used_datetime` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (tag_user_tag_id) REFERENCES `%table_prefix%tags` (tag_id) ON DELETE CASCADE, FOREIGN KEY (tag_user_user_id) REFERENCES `%table_prefix%users` (user_id) ON DELETE CASCADE, UNIQUE INDEX `tag_user_UNIQUE` (`tag_user_tag_id` ASC, `tag_user_user_id` ASC), diff --git a/app/schemas/mysql-8/two_factors.sql b/app/schemas/mysql-8/two_factors.sql index 9e49a98..d264c41 100644 --- a/app/schemas/mysql-8/two_factors.sql +++ b/app/schemas/mysql-8/two_factors.sql @@ -1,9 +1,9 @@ DROP TABLE IF EXISTS `%table_prefix%two_factors`; CREATE TABLE `%table_prefix%two_factors` ( - `two_factor_id` bigint(32) NOT NULL AUTO_INCREMENT, - `two_factor_user_id` bigint(32) DEFAULT NULL, - `two_factor_date_gmt` datetime NOT NULL, - `two_factor_secret` text NOT NULL, + `two_factor_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `two_factor_user_id` INT UNSIGNED DEFAULT NULL, + `two_factor_date_gmt` DATETIME NOT NULL, + `two_factor_secret` TEXT NOT NULL, PRIMARY KEY (`two_factor_id`), KEY `two_factor_user_id` (`two_factor_user_id`), KEY `two_factor_date_gmt` (`two_factor_date_gmt`) diff --git a/app/schemas/mysql-8/uploads.sql b/app/schemas/mysql-8/uploads.sql new file mode 100644 index 0000000..9536044 --- /dev/null +++ b/app/schemas/mysql-8/uploads.sql @@ -0,0 +1,17 @@ +DROP TABLE IF EXISTS `%table_prefix%uploads`; +CREATE TABLE `%table_prefix%uploads` ( + `upload_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `upload_user_id` INT UNSIGNED DEFAULT NULL, + `upload_uploader_ip` VARCHAR(255) NOT NULL, + `upload_token` VARCHAR(64) NOT NULL, + `upload_checksum` VARCHAR(32) NOT NULL, + `upload_params` JSON NOT NULL, + `upload_chunks` INT UNSIGNED NOT NULL, + `upload_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + `upload_completed` TINYINT UNSIGNED NOT NULL DEFAULT 0, + PRIMARY KEY (`upload_id`), + KEY `upload_id_token` (`upload_id`, `upload_token`), + KEY `upload_id_token_user_id` (`upload_id`, `upload_token`, `upload_user_id`), + KEY `upload_date_gmt` (`upload_date_gmt`), + KEY `upload_checksum_uploader_ip_date_gmt` (`upload_checksum`, `upload_uploader_ip`, `upload_date_gmt`) +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/uploads_chunks.sql b/app/schemas/mysql-8/uploads_chunks.sql new file mode 100644 index 0000000..f114b62 --- /dev/null +++ b/app/schemas/mysql-8/uploads_chunks.sql @@ -0,0 +1,10 @@ +DROP TABLE IF EXISTS `%table_prefix%uploads_chunks`; +CREATE TABLE `%table_prefix%uploads_chunks` ( + `upload_chunk_upload_id` INT UNSIGNED NOT NULL, + `upload_chunk_index` INT UNSIGNED NOT NULL, + `upload_chunk_path` VARCHAR(4096) DEFAULT NULL, + `upload_chunk_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`upload_chunk_upload_id`, `upload_chunk_index`), + FOREIGN KEY (upload_chunk_upload_id) REFERENCES `%table_prefix%uploads` (upload_id) ON DELETE CASCADE, + KEY `upload_chunk_date_gmt` (`upload_chunk_date_gmt`) +) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/schemas/mysql-8/users.sql b/app/schemas/mysql-8/users.sql index 9a0f9c0..cbaaf16 100644 --- a/app/schemas/mysql-8/users.sql +++ b/app/schemas/mysql-8/users.sql @@ -1,38 +1,38 @@ DROP TABLE IF EXISTS `%table_prefix%users`; CREATE TABLE `%table_prefix%users` ( - `user_id` bigint(32) NOT NULL AUTO_INCREMENT, - `user_name` varchar(255) DEFAULT NULL, - `user_username` varchar(255) NOT NULL, - `user_date` datetime NOT NULL, - `user_date_gmt` datetime NOT NULL, - `user_email` varchar(255) DEFAULT NULL, - `user_avatar_filename` varchar(255) DEFAULT NULL, - `user_facebook_username` varchar(255) DEFAULT NULL, - `user_twitter_username` varchar(255) DEFAULT NULL, - `user_website` varchar(255) DEFAULT NULL, - `user_background_filename` varchar(255) DEFAULT NULL, - `user_bio` varchar(255) DEFAULT NULL, - `user_timezone` varchar(255) NOT NULL, - `user_language` varchar(255) DEFAULT NULL, - `user_status` enum('valid','awaiting-confirmation','awaiting-email','banned') NOT NULL, - `user_is_admin` tinyint(1) NOT NULL DEFAULT '0', - `user_is_manager` tinyint(1) NOT NULL DEFAULT '0', - `user_is_private` tinyint(1) NOT NULL DEFAULT '0', - `user_palette_id` int(11) NOT NULL DEFAULT '0', - `user_newsletter_subscribe` tinyint(1) NOT NULL DEFAULT '1', - `user_show_nsfw_listings` tinyint(1) NOT NULL DEFAULT '0', - `user_image_count` bigint(32) NOT NULL DEFAULT '0', - `user_album_count` bigint(32) NOT NULL DEFAULT '0', - `user_image_keep_exif` tinyint(1) NOT NULL DEFAULT '1', - `user_file_meta_tag_camera_model` tinyint(1) NOT NULL DEFAULT '1', - `user_image_expiration` varchar(255) DEFAULT NULL, - `user_registration_ip` varchar(255) NOT NULL, - `user_likes` bigint(32) NOT NULL DEFAULT '0' COMMENT 'Likes made to content owned by this user', - `user_liked` bigint(32) NOT NULL DEFAULT '0' COMMENT 'Likes made by this user', - `user_following` bigint(32) NOT NULL DEFAULT '0', - `user_followers` bigint(32) NOT NULL DEFAULT '0', - `user_content_views` bigint(32) NOT NULL DEFAULT '0', - `user_notifications_unread` bigint(32) NOT NULL DEFAULT '0', + `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `user_name` VARCHAR(255) DEFAULT NULL, + `user_username` VARCHAR(255) NOT NULL, + `user_date` DATETIME NOT NULL, + `user_date_gmt` DATETIME NOT NULL, + `user_email` VARCHAR(255) DEFAULT NULL, + `user_avatar_filename` VARCHAR(255) DEFAULT NULL, + `user_facebook_username` VARCHAR(255) DEFAULT NULL, + `user_twitter_username` VARCHAR(255) DEFAULT NULL, + `user_website` VARCHAR(255) DEFAULT NULL, + `user_background_filename` VARCHAR(255) DEFAULT NULL, + `user_bio` VARCHAR(255) DEFAULT NULL, + `user_timezone` VARCHAR(255) NOT NULL, + `user_language` VARCHAR(255) DEFAULT NULL, + `user_status` ENUM('valid','awaiting-confirmation','awaiting-email','banned') NOT NULL, + `user_is_admin` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_is_manager` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_is_private` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_palette_id` INT UNSIGNED NOT NULL DEFAULT '0', + `user_newsletter_subscribe` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_show_nsfw_listings` TINYINT UNSIGNED NOT NULL DEFAULT '0', + `user_image_count` INT UNSIGNED NOT NULL DEFAULT '0', + `user_album_count` INT UNSIGNED NOT NULL DEFAULT '0', + `user_image_keep_exif` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_file_meta_tag_camera_model` TINYINT UNSIGNED NOT NULL DEFAULT '1', + `user_image_expiration` VARCHAR(255) DEFAULT NULL, + `user_registration_ip` VARCHAR(255) NOT NULL, + `user_likes` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Likes made to content owned by this user', + `user_liked` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Likes made by this user', + `user_following` INT UNSIGNED NOT NULL DEFAULT '0', + `user_followers` INT UNSIGNED NOT NULL DEFAULT '0', + `user_content_views` INT UNSIGNED NOT NULL DEFAULT '0', + `user_notifications_unread` INT UNSIGNED NOT NULL DEFAULT '0', PRIMARY KEY (`user_id`), UNIQUE KEY `username` (`user_username`) USING BTREE, UNIQUE KEY `email` (`user_email`) USING BTREE, diff --git a/app/schemas/mysql-8/variables.sql b/app/schemas/mysql-8/variables.sql index f6254c2..5b0f8ae 100644 --- a/app/schemas/mysql-8/variables.sql +++ b/app/schemas/mysql-8/variables.sql @@ -1,10 +1,10 @@ DROP TABLE IF EXISTS `%table_prefix%variables`; CREATE TABLE `%table_prefix%variables` ( - `variable_id` int(11) NOT NULL AUTO_INCREMENT, - `variable_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, - `variable_datetime_utc` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `variable_value` text, - `variable_type` enum('string','bool','int','float','array','object') DEFAULT 'string', + `variable_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `variable_name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, + `variable_datetime_utc` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `variable_value` TEXT, + `variable_type` ENUM('string','bool','int','float','array','object') DEFAULT 'string', PRIMARY KEY (`variable_id`), UNIQUE KEY `variable_name` (`variable_name`) USING BTREE ) ENGINE=%table_engine% DEFAULT CHARSET=utf8mb4; diff --git a/app/src/Actions/Auth/AuthVerifyCSRFTokenAction.php b/app/src/Actions/Auth/AuthVerifyCSRFTokenAction.php deleted file mode 100644 index f650fa3..0000000 --- a/app/src/Actions/Auth/AuthVerifyCSRFTokenAction.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Auth; - -use Chevere\Action\Action; -use Chevere\Parameter\Attributes\StringAttr; -use InvalidArgumentException; - -final class AuthVerifyCSRFTokenAction extends Action -{ - public function run( - #[StringAttr(description: 'Token granted to the user session.')] - string $sessionValue, - #[StringAttr(description: 'Token provided by the user.')] - string $userInput - ): array { - if (! hash_equals($sessionValue, $userInput)) { - throw new InvalidArgumentException( - 'Invalid CSRF token' - ); - } - - return []; - } -} diff --git a/app/src/Actions/Auth/AuthVerifyRepositoryAccessAction.php b/app/src/Actions/Auth/AuthVerifyRepositoryAccessAction.php deleted file mode 100644 index 0ed0599..0000000 --- a/app/src/Actions/Auth/AuthVerifyRepositoryAccessAction.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Auth; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; - -class AuthVerifyRepositoryAccessAction extends Action -{ - public function getResponseParameters(): ParametersInterface - { - return parameters( - grant: stringParameter( - description: 'Describes the permission grantee.', - ) - ); - } - - public function run( - #[ParameterAttribute(description: 'User id for the user requesting this resource.')] - string $requesterUserId, - #[ParameterAttribute(description: 'Repository name to check access.')] - string $repository, - #[ParameterAttribute( - description: 'Permission level to check.', - regex: '/^(read|write|execute)$/' - )] - string $level - ): array { - return data( - grant: 'isAdmin' - ); - } -} diff --git a/app/src/Actions/Auth/AuthVerifyResourceAccessAction.php b/app/src/Actions/Auth/AuthVerifyResourceAccessAction.php deleted file mode 100644 index 4f11771..0000000 --- a/app/src/Actions/Auth/AuthVerifyResourceAccessAction.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Auth; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; - -class AuthVerifyResourceAccessAction extends Action -{ - public function run( - #[ParameterAttribute( - description: 'User id for the user requesting this resource.' - )] - int $requesterUserId, - #[ParameterAttribute( - description: 'User id for the owner of the resource.' - )] - int $ownerUserId, - #[ParameterAttribute( - description: 'Resource name to check access.' - )] - string $resource, - #[ - ParameterAttribute( - description: 'Permission level to check.', - regex: '/^(read|write|execute)$/' - )] - string $level - ): array { - return data( - grant: 'isAdmin' - ); - } - - public function getResponseParameters(): ParametersInterface - { - return parameters( - grant: stringParameter( - description: 'Describes the permission grantee.', - ) - ); - } -} diff --git a/app/src/Actions/Database/DatabaseReserveRowAction.php b/app/src/Actions/Database/DatabaseReserveRowAction.php deleted file mode 100644 index d442a49..0000000 --- a/app/src/Actions/Database/DatabaseReserveRowAction.php +++ /dev/null @@ -1,64 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Database; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use function Chevere\Parameter\integerParameter; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use function Chevere\Parameter\parameters; -use Chevereto\Database\Database; - -/** - * Reserves a row in the database. - * - * Arguments: - * - * ```php - * table: string, - * ``` - * - * Response: - * - * ```php - * id: int, - * ``` - */ -class DatabaseReserveRowAction extends Action -{ - private Database $database; - - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - id: integerParameter() - ); - } - - public function run(string $table): array - { - // $db->insert row - return data( - id: 123 - ); - } -} diff --git a/app/src/Actions/File/FileFetchSourceAction.php b/app/src/Actions/File/FileFetchSourceAction.php deleted file mode 100644 index b566ed9..0000000 --- a/app/src/Actions/File/FileFetchSourceAction.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\File; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; -use Chevere\Serialize\Deserialize; -use function Chevereto\Encoding\assertBase64; -use function Chevereto\Encoding\storeDecodedBase64; -use function Chevereto\File\storeDownloadedUrl; -use Laminas\Uri\UriFactory; -use Throwable; - -final class FileFetchSourceAction extends Action -{ - public function getResponseParameters(): ParametersInterface - { - return - parameters( - filepath: stringParameter(), - ); - } - - public function run( - #[ParameterAttribute( - description: 'A binary file, base64 data, or an URL for a file.', - )] - string $source - ): array { - try { - $deserialize = new Deserialize($source); - $filepath = $deserialize->var()['tmp_name']; - } catch (Throwable) { - $filepath = tempnam(sys_get_temp_dir(), 'chv.temp'); - $uri = UriFactory::factory($source); - if ($uri->isValid()) { - storeDownloadedUrl($source, $filepath); - } else { - assertBase64($source); - storeDecodedBase64($source, $filepath); - } - } - - return data( - filepath: $filepath - ); - } -} diff --git a/app/src/Actions/File/FileNamingAction.php b/app/src/Actions/File/FileNamingAction.php deleted file mode 100644 index 8aa142a..0000000 --- a/app/src/Actions/File/FileNamingAction.php +++ /dev/null @@ -1,99 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\File; - -use Chevere\Action\Action; -use Chevere\Filesystem\Filename; -use Chevere\Filesystem\Interfaces\FilenameInterface; -use Chevere\Filesystem\Interfaces\PathInterface; -use Chevere\Parameter\Attributes\StringAttr; -use Chevere\Parameter\Interfaces\ParametersInterface; -use Chevereto\Storage\Storage; -use function Chevere\DataStructure\data; -use function Chevere\Parameter\object; -use function Chevere\Parameter\parameters; -use function Chevere\Standard\randomString; - -/** - * Determines the best available target filename for the given storage, path and naming. - */ -class FileNamingAction extends Action -{ - public function run( - int $id, - #[StringAttr('/^.+\.[a-zA-Z]+$/')] - string $name, - Storage $storage, - PathInterface $path, - #[StringAttr('/^original|random|mixed|id$/')] - string $naming = 'original', - ): array { - $encodedId = 'encoded'; - $file = new Filename($name); - if ($naming === 'id') { - return [ - 'filename' => new Filename($encodedId . '.' . $file->extension()), - ]; - } - $name = $this->getName($naming, $file); - // USE OWN INDEX, REQUIRE STORAGE ID PARAM - while ($storage->adapter()->fileExists($path->getChild($name)->__toString())) { - if ($naming === 'original') { - $naming = 'mixed'; - } - $name = $this->getName($naming, $file); - } - - return data( - filename: new Filename($name) - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - filename: object( - className: Filename::class - ), - ); - } - - public function getName(string $naming, FilenameInterface $filename): string - { - return match ($naming) { - 'original' => $filename->__toString(), - 'random' => $this->getRandomName($filename), - 'mixed' => $this->getMixedName($filename), - }; - } - - private function getRandomName(FilenameInterface $filename): string - { - return randomString(32) . '.' . $filename->extension(); - } - - private function getMixedName(FilenameInterface $filename): string - { - $charsLength = 16; - $chars = randomString($charsLength); - $name = $filename->name(); - $nameLength = mb_strlen($name); - $withExtensionLength = mb_strlen($filename->extension()) + 1; - if ($nameLength + $charsLength > Filename::MAX_LENGTH_BYTES) { - $chop = Filename::MAX_LENGTH_BYTES - $charsLength - $nameLength - $withExtensionLength; - $name = mb_substr($name, 0, $chop); - } - - return $name . $chars . '.' . $filename->extension(); - } -} diff --git a/app/src/Actions/File/FileUploadAction.php b/app/src/Actions/File/FileUploadAction.php deleted file mode 100644 index 2249335..0000000 --- a/app/src/Actions/File/FileUploadAction.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\File; - -use Chevere\Action\Action; -use Chevere\Filesystem\Interfaces\FilenameInterface; -use Chevere\Filesystem\Interfaces\PathInterface; -use Chevereto\Storage\Storage; - -/** - * Upload the filename to the target storage. - * @TODO If this does storage, it should be under /Storage - */ -class FileUploadAction extends Action -{ - public function run( - string $filepath, - FilenameInterface $targetFilename, - Storage $storage, - PathInterface $path - ): array { - return []; - } -} diff --git a/app/src/Actions/File/FileValidateAction.php b/app/src/Actions/File/FileValidateAction.php deleted file mode 100644 index 4b1d57e..0000000 --- a/app/src/Actions/File/FileValidateAction.php +++ /dev/null @@ -1,137 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\File; - -use Chevere\Action\Action; -use Chevere\Parameter\Attributes\StringAttr; -use Chevere\Parameter\Interfaces\ParametersInterface; -use InvalidArgumentException; -use Throwable; -use function Chevere\DataStructure\data; -use function Chevere\Message\message; -use function Chevere\Parameter\int; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\string; -use function Safe\filesize; -use function Safe\md5_file; -use function Safe\mime_content_type; - -/** - * Validate file type and its size. - */ -class FileValidateAction extends Action -{ - private array $mimes = []; - - private int $maxBytes = 0; - - private int $minBytes = 0; - - public function run( - #[StringAttr( - '/^([\w]+\/[\w\-\+\.]+)+(,([\w]+\/[\w\-\+\.]+))*$/', - 'Comma-separated list of allowed mime-types.' - )] - string $mimes, - string $filepath, - int $maxBytes = 0, - int $minBytes = 0, - ): array { - $this->mimes = explode(',', $mimes); - $this->minBytes = $minBytes; - $this->maxBytes = $maxBytes; - $bytes = $this->assertGetFileBytes($filepath); - $this->assertMaxBytes($bytes); - $this->assertMinBytes($bytes); - $mime = mime_content_type($filepath); - $this->assertMime($mime); - - return data( - bytes: $bytes, - mime: $mime, - md5: md5_file($filepath), - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - bytes : int(), - mime : string(), - md5 : string(), - ); - } - - /** - * @codeCoverageIgnore - */ - private function assertGetFileBytes(string $filepath): int - { - try { - return filesize($filepath); - } catch (Throwable $e) { - throw new InvalidArgumentException( - message($e->getMessage()), - 1000 - ); - } - } - - private function assertMinBytes(int $bytes): void - { - if ($this->minBytes === 0) { - return; - } - if ($bytes < $this->minBytes) { - throw new InvalidArgumentException( - message( - "Filesize (`%fileSize%`) doesn't meet the minimum bytes required (`%required%`)", - fileSize: (string) ($bytes . ' B'), - required: (string) ($this->minBytes . ' B'), - ), - 1001 - ); - } - } - - private function assertMaxBytes(int $bytes): void - { - if ($this->maxBytes === 0) { - return; - } - if ($bytes > $this->maxBytes) { - throw new InvalidArgumentException( - message( - 'Filesize (`%fileSize%`) exceeds the maximum bytes allowed (`%allowed%`)', - fileSize: (string) ($bytes . ' B'), - allowed: (string) ($this->maxBytes . ' B'), - ), - 1002 - ); - } - } - - private function assertMime(string $mime): void - { - if (! in_array($mime, $this->mimes, true)) { - throw new InvalidArgumentException( - message( - 'File mime-type `%type%` is not allowed (allows `%allowed%`)', - type: $mime, - allowed: implode(', ', $this->mimes), - ), - 1004 - ); - } - } -} diff --git a/app/src/Actions/File/FileVerifyNotDuplicateAction.php b/app/src/Actions/File/FileVerifyNotDuplicateAction.php deleted file mode 100644 index 5fe7348..0000000 --- a/app/src/Actions/File/FileVerifyNotDuplicateAction.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\File; - -use Chevere\Action\Action; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use Chevereto\Database\Database; - -/** - * Detects file duplication based in both perceptual and file hashing, against the uploading frequency. - */ -class FileVerifyNotDuplicateAction extends Action -{ - private Database $database; - - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function run( - #[ParameterAttribute(regex: '/^[a-f0-9]{32}$/')] - string $md5, - #[ParameterAttribute(regex: '/^[0-9A-F]+$/i')] - string $perceptual, - #[ParameterAttribute(regex: '/((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/')] - string $ip, - #[ParameterAttribute(regex: '/^[4|6]$/')] - string $ipVersion - ): array { - // $db->query hash, rate, HALT if dupe - - return []; - } -} diff --git a/app/src/Actions/Image/ImageFetchMetaAction.php b/app/src/Actions/Image/ImageFetchMetaAction.php deleted file mode 100644 index a85e2ed..0000000 --- a/app/src/Actions/Image/ImageFetchMetaAction.php +++ /dev/null @@ -1,54 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Image; - -use Chevere\Action\Action; -use Chevere\Parameter\ArrayParameter; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use Intervention\Image\Image; -use JeroenDesloovere\XmpMetadataExtractor\XmpMetadataExtractor; - -/** - * Fetch image metadata. - * - * Response parameters: - * - * ```php - * exif: array, - * iptc: array, - * xmp: array, - * ``` - */ -class ImageFetchMetaAction extends Action -{ - public function run(Image $image): array - { - $data = array_fill_keys(['exif', 'iptc', 'xmp'], []); - $data['exif'] = $image->exif() ?? []; - $data['iptc'] = $image->iptc() ?? []; - $xmpDataExtractor = new XmpMetadataExtractor(); - $data['xmp'] = $xmpDataExtractor->extractFromFile($image->basePath()); - - return $data; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - exif: new ArrayParameter(), - iptc: new ArrayParameter(), - xmp: new ArrayParameter(), - ); - } -} diff --git a/app/src/Actions/Image/ImageFixOrientationAction.php b/app/src/Actions/Image/ImageFixOrientationAction.php deleted file mode 100644 index 029cd63..0000000 --- a/app/src/Actions/Image/ImageFixOrientationAction.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Image; - -use Chevere\Action\Action; -use Intervention\Image\Image; - -/** - * Fix the image orientation based on Exif Orientation (if any, if needed). - */ -class ImageFixOrientationAction extends Action -{ - public function run(Image $image): array - { - $image->orientate()->save(); - - return []; - } -} diff --git a/app/src/Actions/Image/ImageInsertAction.php b/app/src/Actions/Image/ImageInsertAction.php deleted file mode 100644 index 95bad4e..0000000 --- a/app/src/Actions/Image/ImageInsertAction.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Image; - -use Chevere\Action\Action; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use Chevereto\Database\Database; - -/** - * Insert the image in the database. - */ -class ImageInsertAction extends Action -{ - private Database $database; - - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function run( - int $id, - int $expires, - int $userId, - int $albumId, - ): array { - // TODO: DB inserting - return []; - } -} diff --git a/app/src/Actions/Image/ImageStripMetaAction.php b/app/src/Actions/Image/ImageStripMetaAction.php deleted file mode 100644 index 6c6def4..0000000 --- a/app/src/Actions/Image/ImageStripMetaAction.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Image; - -use Chevere\Action\Action; -use Imagick; -use Intervention\Image\Image; - -/** - * Strip image metadata. - */ -class ImageStripMetaAction extends Action -{ - public function run(Image $image): array - { - /** @var Imagick $imagick */ - $imagick = $image->getCore(); - if (!($imagick instanceof Imagick)) { - return []; - } - $profiles = $imagick->getImageProfiles('icc', true); - $imagick->stripImage(); - // @codeCoverageIgnoreStart - if (!empty($profiles)) { - $imagick->profileImage('icc', $profiles['icc']); - } - // @codeCoverageIgnoreEnd - $image->save(); - - return []; - } -} diff --git a/app/src/Actions/Image/ImageVerifyMediaAction.php b/app/src/Actions/Image/ImageVerifyMediaAction.php deleted file mode 100644 index dcd3979..0000000 --- a/app/src/Actions/Image/ImageVerifyMediaAction.php +++ /dev/null @@ -1,175 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Image; - -use Chevere\Action\Action; -use Chevere\Message\Interfaces\MessageInterface; -use Chevere\Parameter\Interfaces\ParametersInterface; -use Intervention\Image\Image; -use Intervention\Image\ImageManager; -use InvalidArgumentException; -use Throwable; -use function Chevere\DataStructure\data; -use function Chevere\Message\message; -use function Chevere\Parameter\object; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\string; -use function Chevereto\Image\imageHash; -use function Chevereto\Image\imageManager; - -/** - * Validates an image against the image processing and image dimensions. - * - * Response parameters: - * - * ```php - * image: \Intervention\Image\Image, - * perceptual: string, - * ``` - */ -class ImageVerifyMediaAction extends Action -{ - private int $width = 0; - - private int $height = 0; - - private int $maxWidth = 0; - - private int $maxHeight = 0; - - private int $minWidth = 0; - - private int $minHeight = 0; - - public function run( - string $filepath, - int $maxHeight, - int $maxWidth, - int $minHeight, - int $minWidth, - ): array { - $image = $this->assertGetImage($filepath); - $this->width = $image->width(); - $this->height = $image->height(); - $this->maxWidth = $maxWidth; - $this->maxHeight = $maxHeight; - $this->minWidth = $minWidth; - $this->minHeight = $minHeight; - $this->assertMinHeight(); - $this->assertMaxHeight(); - $this->assertMinWidth(); - $this->assertMaxWidth(); - - return data( - image: $image, - perceptual: imageHash()->hash($filepath) - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - image: object( - className: Image::class - ), - perceptual: string(), - ); - } - - private function assertGetImage(string $filepath): Image - { - try { - return imageManager()->make($filepath); - } catch (Throwable $e) { - throw new InvalidArgumentException( - previous: $e, - code: 1000, - message: message( - "Filepath `%filepath%` provided can't be handled by `%manager%`", - filepath: $filepath, - manager: ImageManager::class - ) - ); - } - } - - private function assertMinHeight(): void - { - if ($this->height < $this->minHeight) { - throw new InvalidArgumentException( - $this->getMinExceptionMessage('height', $this->height), - 1001 - ); - } - } - - private function assertMaxHeight(): void - { - if ($this->height > $this->maxHeight) { - throw new InvalidArgumentException( - $this->getMaxExceptionMessage('height', $this->height), - 1002 - ); - } - } - - private function assertMinWidth(): void - { - if ($this->width < $this->minWidth) { - throw new InvalidArgumentException( - $this->getMinExceptionMessage('width', $this->width), - 1003 - ); - } - } - - private function assertMaxWidth(): void - { - if ($this->width > $this->maxWidth) { - throw new InvalidArgumentException( - $this->getMaxExceptionMessage('width', $this->width), - 1004 - ); - } - } - - private function getMinExceptionMessage(string $dimension, int $provided): MessageInterface - { - return message( - "Image `%dimension%` `%provided%` doesn't meet the the minimum required (`%required%`)", - dimension: $dimension, - provided: (string) $provided, - required: $this->getMinRequired(), - ); - } - - private function getMinRequired(): string - { - return (string) $this->minWidth . 'x' . (string) $this->minHeight; - } - - private function getMaxExceptionMessage(string $dimension, int $provided): MessageInterface - { - return message( - 'Image `%dimension%` `%provided%` exceeds the maximum allowed (`%allowed%`)', - dimension: $dimension, - provided: (string) $provided, - allowed: $this->getMaxAllowed(), - ); - } - - private function getMaxAllowed(): string - { - return (string) $this->maxWidth . 'x' . (string) $this->maxHeight; - } -} diff --git a/app/src/Actions/Legacy/Api/V1/ImageInsertAction.php b/app/src/Actions/Legacy/Api/V1/ImageInsertAction.php deleted file mode 100644 index b26d561..0000000 --- a/app/src/Actions/Legacy/Api/V1/ImageInsertAction.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Legacy\Api\V1; - -use Chevere\Action\Action; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use Chevereto\Database\Database; - -class ImageInsertAction extends Action -{ - private Database $database; - - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function run(int $id): array - { - // TODO: DB inserting - return []; - } -} diff --git a/app/src/Actions/Legacy/Api/V1/LegacyApiV1OutputAction.php b/app/src/Actions/Legacy/Api/V1/LegacyApiV1OutputAction.php deleted file mode 100644 index 4511488..0000000 --- a/app/src/Actions/Legacy/Api/V1/LegacyApiV1OutputAction.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Legacy\Api\V1; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; - -class LegacyApiV1OutputAction extends Action -{ - public function run( - #[ParameterAttribute(regex: '/^(json|txt|redirect)$/')] - string $format - ): array { - return data( - document: 'formatted_document' - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - document: stringParameter() - ); - } -} diff --git a/app/src/Actions/Legacy/Api/V1/LegacyApiV1VerifyKeyAction.php b/app/src/Actions/Legacy/Api/V1/LegacyApiV1VerifyKeyAction.php deleted file mode 100644 index 09ea214..0000000 --- a/app/src/Actions/Legacy/Api/V1/LegacyApiV1VerifyKeyAction.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Legacy\Api\V1; - -use Chevere\Action\Action; -use InvalidArgumentException; - -class LegacyApiV1VerifyKeyAction extends Action -{ - public function run( - string $key, - string $apiV1Key - ): array { - if ($key !== $apiV1Key) { - throw new InvalidArgumentException( - 'Invalid API V1 key provided', - 100 - ); - } - - return []; - } -} diff --git a/app/src/Actions/Storage/StorageGetForAssetAction.php b/app/src/Actions/Storage/StorageGetForAssetAction.php deleted file mode 100644 index 446d19f..0000000 --- a/app/src/Actions/Storage/StorageGetForAssetAction.php +++ /dev/null @@ -1,61 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Storage; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use function Chevere\Parameter\parameters; -use Chevereto\Database\Database; -use Chevereto\Storage\Storage; -use League\Flysystem\Local\LocalFilesystemAdapter; - -/** - * Finds a valid storage to allocate the bytes required. - * - * Response parameters: - * - * ```php - * storage: \Chevereto\Interfaces\Storage\StorageInterface, - * ``` - */ -class StorageGetForAssetAction extends Action -{ - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function run(int $userId, int $bytesRequired): array - { - // $adapter = db->query storage for user assert; - $adapter = new LocalFilesystemAdapter(__DIR__); - - return data( - storage: new Storage(__DIR__) - ); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - storage: objectParameter( - className: Storage::class - ) - ); - } -} diff --git a/app/src/Actions/Storage/StorageGetForUserAction.php b/app/src/Actions/Storage/StorageGetForUserAction.php deleted file mode 100644 index ddaba37..0000000 --- a/app/src/Actions/Storage/StorageGetForUserAction.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Actions\Storage; - -use Chevere\Action\Action; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use Chevere\Parameter\Parameters; -use function Chevere\Parameter\parameters; -use Chevereto\Database\Database; -use Chevereto\Storage\Storage; - -/** - * Finds a valid storage to allocate the bytes required. - * - * Response parameters: - * - * ```php - * storage: \Chevereto\Interfaces\Storage\StorageInterface, - * ``` - */ -class StorageGetForUserAction extends Action -{ - public function getContainerParameters(): ParametersInterface - { - return new Parameters( - database: objectParameter(Database::class) - ); - } - - public function run(int $userId, int $bytesRequired): array - { - // $adapter = db->query storage for user; - - return data( - storage: new Storage(__DIR__) - ); - } - - public function getResponseParameters(): ParametersInterface - { - return parameters( - storage: objectParameter( - className: Storage::class - ) - ); - } -} diff --git a/app/src/Controllers/Api/V1/Upload/UploadPostController.php b/app/src/Controllers/Api/V1/Upload/UploadPostController.php deleted file mode 100644 index b1313b2..0000000 --- a/app/src/Controllers/Api/V1/Upload/UploadPostController.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V1\Upload; - -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; -use Chevere\Workflow\Attributes\Provider; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Legacy\LegacyUploadPostWorkflow; - -#[Provider(LegacyUploadPostWorkflow::class)] -final class UploadPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Uploads an image resource.'; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - document: stringParameter() - ); - } - - public function run( - #[ParameterAttribute(description: 'A binary file, base64 data, or an URL for an image.')] - string $source, // try: files - #[ParameterAttribute(description: 'API V1 key.')] - string $key, - #[ParameterAttribute( - description: 'Response document output format.', - regex: '/^(json|txt|redirect)$/' - )] - string $format = 'json' - ): array { - return data(); - } -} diff --git a/app/src/Controllers/Api/V4/Album/AlbumDeleteController.php b/app/src/Controllers/Api/V4/Album/AlbumDeleteController.php deleted file mode 100644 index 786b37e..0000000 --- a/app/src/Controllers/Api/V4/Album/AlbumDeleteController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\AlbumDeleteWorkflow; - -#[RelationWorkflow(AlbumDeleteWorkflow::class)] -final class AlbumDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete an album identified by its id.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Album/AlbumGetController.php b/app/src/Controllers/Api/V4/Album/AlbumGetController.php deleted file mode 100644 index 1b540e2..0000000 --- a/app/src/Controllers/Api/V4/Album/AlbumGetController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\AlbumGetWorkflow; - -#[RelationWorkflow(AlbumGetWorkflow::class)] -final class AlbumGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Get an album identified by its id.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Album/AlbumPatchController.php b/app/src/Controllers/Api/V4/Album/AlbumPatchController.php deleted file mode 100644 index 62d6704..0000000 --- a/app/src/Controllers/Api/V4/Album/AlbumPatchController.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\AlbumPatchWorkflow; - -#[RelationWorkflow(AlbumPatchWorkflow::class)] -final class AlbumPatchController extends WorkflowController -{ - public function getDescription(): string - { - return 'Updates the album.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id, - #[ParameterAttribute( - description: 'The image identifier.', - regex: '/\w+/' - )] - string $cover_id - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - image: objectParameter(Image::class) - ); - } -} diff --git a/app/src/Controllers/Api/V4/Album/AlbumPostController.php b/app/src/Controllers/Api/V4/Album/AlbumPostController.php deleted file mode 100644 index 9287ced..0000000 --- a/app/src/Controllers/Api/V4/Album/AlbumPostController.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\AlbumPostWorkflow; - -#[RelationWorkflow(AlbumPostWorkflow::class)] -final class AlbumPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Creates an album.'; - } - - public function run( - string $description, - string $name, - string $parent_id, - string $password, - string $privacy, - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - album: objectParameter( - className: Album::class - ), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Album/Like/AlbumLikeDeleteController.php b/app/src/Controllers/Api/V4/Album/Like/AlbumLikeDeleteController.php deleted file mode 100644 index 985467d..0000000 --- a/app/src/Controllers/Api/V4/Album/Like/AlbumLikeDeleteController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album\Like; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\Like\AlbumLikeDeleteWorkflow; - -#[RelationWorkflow(AlbumLikeDeleteWorkflow::class)] -final class AlbumLikeDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete album like.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Album/Like/AlbumLikePostController.php b/app/src/Controllers/Api/V4/Album/Like/AlbumLikePostController.php deleted file mode 100644 index 440a1d7..0000000 --- a/app/src/Controllers/Api/V4/Album/Like/AlbumLikePostController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Album\Like; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Album\Like\AlbumLikePostWorkflow; - -#[RelationWorkflow(AlbumLikePostWorkflow::class)] -final class AlbumLikePostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Like the album.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Ban/Ip/BanIpDeleteController.php b/app/src/Controllers/Api/V4/Ban/Ip/BanIpDeleteController.php deleted file mode 100644 index 1857ad9..0000000 --- a/app/src/Controllers/Api/V4/Ban/Ip/BanIpDeleteController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Ban\Ip; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Ban\Ip\BanIpDeleteWorkflow; - -#[RelationWorkflow(BanIpDeleteWorkflow::class)] -final class BanIpDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete an IP ban identified by its id.'; - } - - public function run( - #[ParameterAttribute( - description: 'The identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Ban/Ip/BanIpPatchController.php b/app/src/Controllers/Api/V4/Ban/Ip/BanIpPatchController.php deleted file mode 100644 index 3567677..0000000 --- a/app/src/Controllers/Api/V4/Ban/Ip/BanIpPatchController.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Ban\Ip; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Ban\Ip\BanIpPatchWorkflow; - -#[RelationWorkflow(BanIpPatchWorkflow::class)] -final class BanIpPatchController extends WorkflowController -{ - public function getDescription(): string - { - return 'Updates the album.'; - } - - public function run( - #[ParameterAttribute( - description: 'The album identifier.', - regex: '/\w+/' - )] - string $id, - #[ParameterAttribute( - description: 'The image identifier.', - regex: '/\w+/' - )] - string $cover_id = '' - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - image: objectParameter(Image::class) - ); - } -} diff --git a/app/src/Controllers/Api/V4/Ban/Ip/BanIpPostController.php b/app/src/Controllers/Api/V4/Ban/Ip/BanIpPostController.php deleted file mode 100644 index 0f15b02..0000000 --- a/app/src/Controllers/Api/V4/Ban/Ip/BanIpPostController.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Ban\Ip; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; - -final class BanIpPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Creates a IP ban.'; - } - - public function run( - string $ip, - #[ParameterAttribute( - regex: '/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/' - )] - string $expires, - string $message - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - ban_ip: objectParameter( - className: BanIp::class - ), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Category/CategoryPostController.php b/app/src/Controllers/Api/V4/Category/CategoryPostController.php deleted file mode 100644 index 4a66c46..0000000 --- a/app/src/Controllers/Api/V4/Category/CategoryPostController.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Category; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; - -final class CategoryPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Creates a category.'; - } - - public function run( - string $name, - #[ParameterAttribute( - description: 'Category URL key (slug)', - regex: '/^[-\w]+$/', - )] - string $url_key, - string $description - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - category: objectParameter( - className: Category::class - ), - ); - } -} diff --git a/app/src/Controllers/Api/V4/File/FilePostController.php b/app/src/Controllers/Api/V4/File/FilePostController.php deleted file mode 100644 index 23e82fb..0000000 --- a/app/src/Controllers/Api/V4/File/FilePostController.php +++ /dev/null @@ -1,24 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\File; - -use Chevere\Controller\Controller; -use function Chevere\DataStructure\data; - -abstract class FilePostController extends Controller -{ - public function run( - string $source - ): array { - return data(); - } -} diff --git a/app/src/Controllers/Api/V4/Image/Bulk/ImageBulkPatchController.php b/app/src/Controllers/Api/V4/Image/Bulk/ImageBulkPatchController.php deleted file mode 100644 index 240461a..0000000 --- a/app/src/Controllers/Api/V4/Image/Bulk/ImageBulkPatchController.php +++ /dev/null @@ -1,51 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image\Bulk; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\ArrayParameter; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Image\Bulk\ImageBulkPatchWorkflow; - -#[RelationWorkflow(ImageBulkPatchWorkflow::class)] -class ImageBulkPatchController extends WorkflowController -{ - public function getDescription(): string - { - return 'Bulk image edit.'; - } - - public function run( - #[ParameterAttribute( - description: 'Comma-separated list of images to edit.', - regex: '/^\w+(,+\w+)*$/' - )] - string $image_ids, - string $category_id = '', - string $is_approved = '', - string $is_nsfw = '', - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - edited: new ArrayParameter(), - failed: new ArrayParameter(), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Image/ImageGetController.php b/app/src/Controllers/Api/V4/Image/ImageGetController.php deleted file mode 100644 index fd57f3a..0000000 --- a/app/src/Controllers/Api/V4/Image/ImageGetController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Image\ImageGetWorkflow; - -#[RelationWorkflow(ImageGetWorkflow::class)] -final class ImageGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Get the image identified by its id.'; - } - - public function run( - #[ParameterAttribute( - description: 'The image identifier.', - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Image/ImagePatchController.php b/app/src/Controllers/Api/V4/Image/ImagePatchController.php deleted file mode 100644 index 37ee74a..0000000 --- a/app/src/Controllers/Api/V4/Image/ImagePatchController.php +++ /dev/null @@ -1,56 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\Image\ImagePatchWorkflow; - -#[RelationWorkflow(ImagePatchWorkflow::class)] -class ImagePatchController extends WorkflowController -{ - public function getDescription(): string - { - return 'Edit the image resource.'; - } - - public function run( - #[ParameterAttribute( - description: 'The image identifier.', - regex: '/\w+/' - )] - string $id, - string $category_id, - #[ParameterAttribute( - regex: '/^(0|1)$/' - )] - string $is_approved, - #[ParameterAttribute( - regex: '/^(0|1)$/' - )] - string $is_nsfw - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - image: objectParameter(stdClass::class, Image::class), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Image/ImagePostController.php b/app/src/Controllers/Api/V4/Image/ImagePostController.php deleted file mode 100644 index 508af7b..0000000 --- a/app/src/Controllers/Api/V4/Image/ImagePostController.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image; - -use Chevere\Controller\Controller; -use function Chevere\DataStructure\data; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Workflows\Image\ImagePostWorkflow; - -final class ImagePostController extends Controller -{ - public function run( - #[ParameterAttribute( - description: 'A binary file, base64 data, or an URL for an image.', - // try: 'files' - )] - string $image, - string $album_id = '', - ): array { - $workflow = (new ImagePostWorkflow())->getWorkflow(); - // $source - // $mimes - // $max_bytes - // $min_bytes - // $max_width - // $max_height - // $min_width - // $min_height - // $ip - // $ip_version - // $user_id - // $table - // $name - // $naming - // $path - // $upload_filepath - // $expires - // $album_id - return data(); - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - image: objectParameter( - className: Image::class - ) - ); - } -} diff --git a/app/src/Controllers/Api/V4/Image/Like/ImageLikeDeleteController.php b/app/src/Controllers/Api/V4/Image/Like/ImageLikeDeleteController.php deleted file mode 100644 index 10c5ef8..0000000 --- a/app/src/Controllers/Api/V4/Image/Like/ImageLikeDeleteController.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image\Like; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; - -class ImageLikeDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete image like.'; - } - - public function run( - #[ParameterAttribute( - description: 'The image identifier.', - regex: '/\w+/' - )] - string $id, - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Image/Like/ImageLikePostController.php b/app/src/Controllers/Api/V4/Image/Like/ImageLikePostController.php deleted file mode 100644 index 3a3c7c6..0000000 --- a/app/src/Controllers/Api/V4/Image/Like/ImageLikePostController.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Image\Like; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; - -class ImageLikePostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Like the image.'; - } - - public function run( - #[ParameterAttribute( - description: ('The image identifier.'), - regex: '/\w+/' - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Stat/Rebuild/StatRebuildPostController.php b/app/src/Controllers/Api/V4/Stat/Rebuild/StatRebuildPostController.php deleted file mode 100644 index 22aae27..0000000 --- a/app/src/Controllers/Api/V4/Stat/Rebuild/StatRebuildPostController.php +++ /dev/null @@ -1,22 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Stat\Rebuild; - -use Chevereto\Controllers\WorkflowController; - -class StatRebuildPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Rebuild stats.'; - } -} diff --git a/app/src/Controllers/Api/V4/Storage/Migrate/StorageMigratePostController.php b/app/src/Controllers/Api/V4/Storage/Migrate/StorageMigratePostController.php deleted file mode 100644 index 209b34c..0000000 --- a/app/src/Controllers/Api/V4/Storage/Migrate/StorageMigratePostController.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Storage\Migrate; - -use Chevereto\Controllers\WorkflowController; - -class StorageMigratePostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Migrate all stored content to another storage.'; - } - - public function run(string $storage_id): array - { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/Storage/Stat/Regen/StorageStatRegenPostController.php b/app/src/Controllers/Api/V4/Storage/Stat/Regen/StorageStatRegenPostController.php deleted file mode 100644 index 56dc12d..0000000 --- a/app/src/Controllers/Api/V4/Storage/Stat/Regen/StorageStatRegenPostController.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Storage\Stat\Regen; - -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use stdClass; - -class StorageStatRegenPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Regenerate storage stats.'; - } - - public function run(string $storage_id): array - { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - storage: objectParameter(stdClass::class, Storage::class), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Storage/StoragePostController.php b/app/src/Controllers/Api/V4/Storage/StoragePostController.php deleted file mode 100644 index d5468bb..0000000 --- a/app/src/Controllers/Api/V4/Storage/StoragePostController.php +++ /dev/null @@ -1,53 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Storage; - -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; - -class StoragePostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Creates a storage.'; - } - - public function run( - string $account_id, - string $account_name, - string $api_id, - string $bucket, - string $capacity, - string $id, - string $key, - string $name, - string $region, - string $secret, - string $server, - string $service, - string $url, - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - storage: objectParameter( - className: Storage::class - ), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Tool/Id/Decode/ToolDecodeIdGetController.php b/app/src/Controllers/Api/V4/Tool/Id/Decode/ToolDecodeIdGetController.php deleted file mode 100644 index f4de8e3..0000000 --- a/app/src/Controllers/Api/V4/Tool/Id/Decode/ToolDecodeIdGetController.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Tool\Id\Decode; - -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; -use Chevereto\Controllers\WorkflowController; - -class ToolDecodeIdGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Retrieve a decoded representation of the Id.'; - } - - public function run(string $id): array - { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - data: stringParameter(), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Tool/Id/Encode/ToolEncodeIdGetController.php b/app/src/Controllers/Api/V4/Tool/Id/Encode/ToolEncodeIdGetController.php deleted file mode 100644 index 1a7e66a..0000000 --- a/app/src/Controllers/Api/V4/Tool/Id/Encode/ToolEncodeIdGetController.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Tool\Id\Encode; - -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\parameters; -use function Chevere\Parameter\stringParameter; -use Chevereto\Controllers\WorkflowController; - -class ToolEncodeIdGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Retrieve an encoded representation of the Id.'; - } - - public function run(string $id): array - { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - data: stringParameter(), - ); - } -} diff --git a/app/src/Controllers/Api/V4/Tool/Probe/Email/ToolProbeEmailPostController.php b/app/src/Controllers/Api/V4/Tool/Probe/Email/ToolProbeEmailPostController.php deleted file mode 100644 index b81569f..0000000 --- a/app/src/Controllers/Api/V4/Tool/Probe/Email/ToolProbeEmailPostController.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\Tool\Probe\Email; - -use Chevereto\Controllers\WorkflowController; - -class ToolProbeEmailPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Probe email delivery.'; - } - - public function run(string $email): array - { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarDeleteController.php b/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarDeleteController.php deleted file mode 100644 index a8fa2b8..0000000 --- a/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarDeleteController.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Asset\Avatar; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\User\Asset\Avatar\UserAssetAvatarDeleteWorkflow; - -#[RelationWorkflow(UserAssetAvatarDeleteWorkflow::class)] -final class UserAssetAvatarDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete the user avatar image resource.'; - } - - public function run( - #[ParameterAttribute( - description: 'The username.', - regex: '/\w+/' - )] - string $username - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarPostController.php b/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarPostController.php deleted file mode 100644 index 5229cc2..0000000 --- a/app/src/Controllers/Api/V4/User/Asset/Avatar/UserAssetAvatarPostController.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Asset\Avatar; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\Api\V4\File\FilePostController; -use Chevereto\Workflows\User\Asset\Avatar\UserAssetAvatarPostWorkflow; - -#[RelationWorkflow(UserAssetAvatarPostWorkflow::class)] -final class UserAssetAvatarPostController extends FilePostController -{ - public function getDescription(): string - { - return 'Uploads an image resource to be used as user avatar'; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - file_info: objectParameter( - className: FileInfo::class - ) - ); - } -} diff --git a/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundDeleteController.php b/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundDeleteController.php deleted file mode 100644 index f592ce7..0000000 --- a/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundDeleteController.php +++ /dev/null @@ -1,25 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Asset\Background; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\User\Asset\Background\UserAssetBackgroundDeleteWorkflow; - -#[RelationWorkflow(UserAssetBackgroundDeleteWorkflow::class)] -final class UserAssetBackgroundDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Delete the user background image resource.'; - } -} diff --git a/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundPostController.php b/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundPostController.php deleted file mode 100644 index ba7f5ae..0000000 --- a/app/src/Controllers/Api/V4/User/Asset/Background/UserAssetBackgroundPostController.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Asset\Background; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\Api\V4\File\FilePostController; -use Chevereto\Workflows\User\Asset\Background\UserAssetBackgroundPostWorkflow; - -#[RelationWorkflow(UserAssetBackgroundPostWorkflow::class)] -final class UserAssetBackgroundPostController extends FilePostController -{ - public function getDescription(): string - { - return 'Uploads an image resource to be used as user background.'; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - file_info: objectParameter( - className: FileInfo::class - ) - ); - } -} diff --git a/app/src/Controllers/Api/V4/User/Export/UserExportGetController.php b/app/src/Controllers/Api/V4/User/Export/UserExportGetController.php deleted file mode 100644 index 59516fa..0000000 --- a/app/src/Controllers/Api/V4/User/Export/UserExportGetController.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Export; - -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use stdClass; - -class UserExportGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Exports the user.'; - } - - public function run(string $username): array - { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - key: objectParameter(stdClass::class, 'className'), - ); - } -} diff --git a/app/src/Controllers/Api/V4/User/Follow/UserFollowDeleteController.php b/app/src/Controllers/Api/V4/User/Follow/UserFollowDeleteController.php deleted file mode 100644 index 4042a73..0000000 --- a/app/src/Controllers/Api/V4/User/Follow/UserFollowDeleteController.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Follow; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; - -class UserFollowDeleteController extends WorkflowController -{ - public function getDescription(): string - { - return 'Unfollow the user.'; - } - - public function run( - #[ParameterAttribute( - description: 'The username.', - regex: '/\w+/' - )] - string $username - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/User/Follow/UserFollowPostController.php b/app/src/Controllers/Api/V4/User/Follow/UserFollowPostController.php deleted file mode 100644 index 7514dcb..0000000 --- a/app/src/Controllers/Api/V4/User/Follow/UserFollowPostController.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Follow; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; - -class UserFollowPostController extends WorkflowController -{ - public function getDescription(): string - { - return 'Follows the user.'; - } - - public function run( - #[ParameterAttribute( - description: 'The username.', - regex: '/\w+/' - )] - string $username - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/User/Setting/UserSettingPatchController.php b/app/src/Controllers/Api/V4/User/Setting/UserSettingPatchController.php deleted file mode 100644 index 873075a..0000000 --- a/app/src/Controllers/Api/V4/User/Setting/UserSettingPatchController.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User\Setting; - -use Chevere\Controller\Attributes\RelationWorkflow; -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use stdClass; - -#[RelationWorkflow('')] -class UserSettingPatchController extends WorkflowController -{ - public function getDescription(): string - { - return 'Updates user settings.'; - } - - public function run( - #[ParameterAttribute( - description: 'The user identifier.' - )] - string $userId - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - key: objectParameter(stdClass::class, 'className'), - ); - } -} diff --git a/app/src/Controllers/Api/V4/User/UserGetController.php b/app/src/Controllers/Api/V4/User/UserGetController.php deleted file mode 100644 index 47cb91b..0000000 --- a/app/src/Controllers/Api/V4/User/UserGetController.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevereto\Controllers\WorkflowController; - -final class UserGetController extends WorkflowController -{ - public function getDescription(): string - { - return 'Get an user identified by its id.'; - } - - public function run( - #[ParameterAttribute( - description: 'The user identifier.', - regex: '/\w+/', - )] - string $id - ): array { - return []; - } -} diff --git a/app/src/Controllers/Api/V4/User/UserPostController.php b/app/src/Controllers/Api/V4/User/UserPostController.php deleted file mode 100644 index df86346..0000000 --- a/app/src/Controllers/Api/V4/User/UserPostController.php +++ /dev/null @@ -1,60 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers\Api\V4\User; - -use Chevere\Parameter\Attributes\ParameterAttribute; -use Chevere\Parameter\Interfaces\ParametersInterface; -use function Chevere\Parameter\objectParameter; -use function Chevere\Parameter\parameters; -use Chevereto\Controllers\WorkflowController; -use Chevereto\Workflows\User\UserPostWorkflow; - -final class UserPostController extends WorkflowController -{ - public function getWorkflowName(): string - { - return UserPostWorkflow::class; - } - - public function getDescription(): string - { - return 'Creates an user.'; - } - - public function run( - #[ParameterAttribute( - regex: '/^[\w]{3,16}$/' - )] - string $username, - string $email, - #[ParameterAttribute( - regex: '/^.{6,128}$/' - )] - string $password, - #[ParameterAttribute( - regex: '/^(user|manager|admin)$/', - )] - string $role = 'user' - ): array { - return []; - } - - public function getResponseParameters(): ParametersInterface - { - return - parameters( - user: objectParameter( - className: User::class - ) - ); - } -} diff --git a/app/src/Controllers/LegacyController.php b/app/src/Controllers/LegacyController.php deleted file mode 100644 index b9fbc1b..0000000 --- a/app/src/Controllers/LegacyController.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers; - -use Chevere\Controller\Controller; -use Chevere\Parameter\Interfaces\ArgumentsInterface; -use Chevere\Response\Interfaces\ResponseInterface; - -final class LegacyController extends Controller -{ - final public function run(ArgumentsInterface $arguments): ResponseInterface - { - return $this - ->getResponse( - document: $arguments->getString('document'), - ); - } -} diff --git a/app/src/Controllers/WorkflowController.php b/app/src/Controllers/WorkflowController.php deleted file mode 100644 index bbb315e..0000000 --- a/app/src/Controllers/WorkflowController.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Controllers; - -use Chevere\Controller\Controller; -use Chevere\Workflow\Interfaces\WorkflowInterface; -use Chevere\Workflow\Interfaces\WorkflowProviderInterface; -use LogicException; -use function Chevere\Message\message; - -abstract class WorkflowController extends Controller -{ - final public function getWorkflow(): WorkflowInterface - { - $relation = $this->relation(); - if ($relation === '') { - throw new LogicException( - message: message('Missing workflow provider relationship') - ); - } - if (! is_subclass_of($relation, WorkflowProviderInterface::class, true)) { - throw new LogicException( - message: message( - 'Relation` %relation%` is not of type `%type%`', - relation: $relation, - type: WorkflowProviderInterface::class, - ) - ); - } - /** @var WorkflowProviderInterface $workflowProvider */ - $workflowProvider = new $relation(); - - return $workflowProvider->getWorkflow(); - // $this->hook('getWorkflow:after', $workflow); - } -} diff --git a/app/src/Controllers/functions.php b/app/src/Controllers/functions.php deleted file mode 100644 index 97831c6..0000000 --- a/app/src/Controllers/functions.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - - -namespace App\Controllers; - -use Chevereto\Controllers\LegacyController; - -/** - * @var String $route `name.php` file. - */ -function legacyController(string $route) -{ - return new LegacyController(dispatch: $route); -} diff --git a/app/src/Database/Database.php b/app/src/Database/Database.php deleted file mode 100644 index b7ef8f1..0000000 --- a/app/src/Database/Database.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - - -namespace Chevereto\Database; - -use Doctrine\DBAL\Connection; -use Doctrine\DBAL\Query\QueryBuilder; - -final class Database -{ - private Connection $connection; - - private QueryBuilder $queryBuilder; - - public function __construct(Connection $connection) - { - $this->connection = $connection; - } - - public function getQueryBuilder(): QueryBuilder - { - return new QueryBuilder($this->connection); - } -} diff --git a/app/src/Database/EntitiesIo.php b/app/src/Database/EntitiesIo.php deleted file mode 100644 index bdececd..0000000 --- a/app/src/Database/EntitiesIo.php +++ /dev/null @@ -1,71 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Database; - -use Chevereto\Database\Traits\GetWhereEqualsTrait; -use Doctrine\DBAL\Result; -use OutOfBoundsException; - -/** - * Provides database I/O for the X entities. - */ -abstract class EntitiesIo implements EntitiesIoInterface -{ - use GetWhereEqualsTrait; - - protected Database $database; - - public function __construct(Database $database) - { - $this->database = $database; - } - - abstract public function table(): string; - - public function selectWhereAllValues(array $columns = ['*'], string ...$values): array - { - return $this->selectWhereValues($columns, ...$values); - } - - public function selectWhereAnyValues(array $columns = ['*'], string ...$values): array - { - return $this->selectWhereValues($columns, ...$values); - } - - protected function selectWhereValues(array $columns = ['*'], string ...$values): array - { - $all = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1]['function'] === 'selectWhereAllValues'; - $queryBuilder = $this->database->getQueryBuilder() - ->select(...$columns) - ->from($this->table()); - foreach ($values as $column => $value) { - $column = (string) $column; - $where = $this->getWhereEquals($column); - if ($all) { - $queryBuilder->andWhere($where); - } else { - $queryBuilder->orWhere($where); - } - $queryBuilder->setParameter($column, $value); - } - /** @var Result $result */ - $result = $queryBuilder->execute(); - $fetch = $result->fetchAllAssociative(); - if ($fetch === false) { - throw new OutOfBoundsException( - 'No record exists for values provided' - ); - } - - return $fetch; - } -} diff --git a/app/src/Database/EntitiesIoInterface.php b/app/src/Database/EntitiesIoInterface.php deleted file mode 100644 index bb46d98..0000000 --- a/app/src/Database/EntitiesIoInterface.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Database; - -/** - * Describes the component in charge of providing multiple entity I/O interaction. - */ -interface EntitiesIoInterface -{ - public function __construct(Database $database); - - /** - * Defines the table name. - */ - public function table(): string; - - /** - * Select the entities for the given values (all). - * - * @return array Raw associative result. - */ - public function selectWhereAllValues(array $columns = ['*'], string ...$values): array; - - /** - * Select the entities for the given values (any). - * - * @return array Raw associative result. - */ - public function selectWhereAnyValues(array $columns = ['*'], string ...$values): array; -} diff --git a/app/src/Database/EntityIo.php b/app/src/Database/EntityIo.php deleted file mode 100644 index 871b4aa..0000000 --- a/app/src/Database/EntityIo.php +++ /dev/null @@ -1,102 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Database; - -use Chevereto\Database\Traits\GetWhereEqualsTrait; -use Doctrine\DBAL\ParameterType; -use Doctrine\DBAL\Result; -use OutOfBoundsException; -use function Chevere\Message\message; - -/** - * Provides database I/O for the X entity. - */ -abstract class EntityIo implements EntityIoInterface -{ - use GetWhereEqualsTrait; - - protected string $whereIdClause; - - public function __construct( - protected Database $database - ) { - $this->whereIdClause = $this->getWhereEquals($this->id()); - } - - abstract public function table(): string; - - abstract public function id(): string; - - public function select(int $id, string ...$columns): array - { - $args = empty($columns) ? ['*'] : $columns; - $queryBuilder = $this->database->getQueryBuilder() - ->select(...$args) - ->from($this->table()) - ->where($this->whereIdClause) - ->setParameter($this->id(), $id, ParameterType::INTEGER); - /** @var Result $result */ - $result = $queryBuilder->execute(); - $fetch = $result->fetchAssociative(); - if ($fetch === false) { - throw new OutOfBoundsException( - message('No record exists for id `%id%`', (string) $id) - ); - } - - return $fetch; - } - - public function delete(int $id): int - { - return $this->database->getQueryBuilder() - ->delete($this->table()) - ->where($this->whereIdClause) - ->setParameter($this->id(), $id, ParameterType::INTEGER) - ->execute(); - } - - public function update(int $id, string ...$values): int - { - $queryBuilder = $this->database->getQueryBuilder() - ->update($this->table()); - foreach ($values as $column => $value) { - $column = (string) $column; - $queryBuilder - ->set($column, ":{$column}") - ->setParameter($column, $value); - } - - return $queryBuilder - ->where($this->whereIdClause) - ->setParameter($this->id(), $id, ParameterType::INTEGER) - ->execute(); - } - - public function insert(string ...$values): int - { - $queryBuilder = $this->database->getQueryBuilder() - ->insert($this->table()); - foreach ($values as $column => $value) { - $column = (string) $column; - $queryBuilder - ->setValue($column, ":{$column}") - ->setParameter($column, $value); - } - $result = $queryBuilder->execute(); - if ($result === 1) { - return (int) $queryBuilder->getConnection()->lastInsertId(); - } - - return 0; - } -} diff --git a/app/src/Database/EntityIoInterface.php b/app/src/Database/EntityIoInterface.php deleted file mode 100644 index a4646d2..0000000 --- a/app/src/Database/EntityIoInterface.php +++ /dev/null @@ -1,52 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Database; - -/** - * Describes the component in charge of providing entity I/O interaction. - */ -interface EntityIoInterface -{ - public function __construct(Database $database); - - /** - * Defines the table name. - */ - public function table(): string; - - /** - * Defines the column id name. - */ - public function id(): string; - - /** - * Select the entity columns identified by its id. - * - * @return array Raw associative result. - */ - public function select(int $id, string ...$columns): array; - - /** - * @return int Number of deleted rows `0`, `1`. - */ - public function delete(int $id): int; - - /** - * @return int Number of updated rows. - */ - public function update(int $id, string ...$values): int; - - /** - * @return int Last inserted Id. - */ - public function insert(string ...$values): int; -} diff --git a/app/src/Database/Traits/GetWhereEqualsTrait.php b/app/src/Database/Traits/GetWhereEqualsTrait.php deleted file mode 100644 index 13f5ec2..0000000 --- a/app/src/Database/Traits/GetWhereEqualsTrait.php +++ /dev/null @@ -1,20 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Database\Traits; - -trait GetWhereEqualsTrait -{ - private function getWhereEquals(string $column): string - { - return str_replace('%s', $column, '%s = :%s'); - } -} diff --git a/app/src/Encoding/functions.php b/app/src/Encoding/functions.php deleted file mode 100644 index a156bdf..0000000 --- a/app/src/Encoding/functions.php +++ /dev/null @@ -1,70 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Encoding; - -use Chevere\Regex\Interfaces\RegexInterface; -use Chevere\Regex\Regex; -use InvalidArgumentException; -use RuntimeException; -use Safe\Exceptions\FilesystemException; -use Safe\Exceptions\StreamException; -use function Chevere\Message\message; -use function Safe\fclose; -use function Safe\fopen; -use function Safe\fwrite; -use function Safe\stream_filter_append; - -/** - * @throws InvalidArgumentException - */ -function assertBase64(string $string): void -{ - $double = base64_encode(base64_decode($string, true)); - if ($string !== $double) { - // @codeCoverageIgnoreStart - throw new InvalidArgumentException( - message('Invalid base64 formatting'), - 600 - ); - // @codeCoverageIgnoreEnd - } - unset($double); -} - -/** - * @param string $base64 A base64 encoded string - * @param string $filepath Filename or stream to store decoded base64 - * - * @throws FilesystemException - * @throws StreamException - * @throws RuntimeException - */ -function storeDecodedBase64(string $base64, string $filepath): void -{ - $filter = 'convert.base64-decode'; - $fh = fopen($filepath, 'w'); - stream_filter_append($fh, $filter, STREAM_FILTER_WRITE); - if (fwrite($fh, $base64) === 0) { - // @codeCoverageIgnoreStart - throw new RuntimeException( - (string) message('Unable to write `%filter%` provided string', filter: $filter), - 1200 - ); - // @codeCoverageIgnoreEnd - } - fclose($fh); -} - -function getBase64Regex(): RegexInterface -{ - return new Regex('/^[a-zA-Z0-9\/\r\n+]*={0,2}$/'); -} diff --git a/app/src/File/functions.php b/app/src/File/functions.php deleted file mode 100644 index 89f7547..0000000 --- a/app/src/File/functions.php +++ /dev/null @@ -1,38 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\File; - -use GuzzleHttp\Client; -use LogicException; -use Throwable; -use function Safe\file_put_contents; - -function storeDownloadedUrl(string $url, string $filepath) -{ - $clientArgs = [ - 'base_uri' => $url, - // 'timeout' => $_ENV['CHEVERETO_HTTP_TIMEOUT'] ?? 30, - ]; - - // @codeCoverageIgnoreStart - // if (isset($_ENV['CHEVERETO_HTTP_PROXY'])) { - // $clientArgs['proxy'] = $_ENV['CHEVERETO_HTTP_PROXY']; - // } - // @codeCoverageIgnoreEnd - try { - $httpClient = new Client($clientArgs); - $response = $httpClient->request('GET'); - } catch (Throwable $e) { - throw new LogicException(previous: $e); - } - file_put_contents($filepath, $response->getBody()); -} diff --git a/app/src/HashId/HashId.php b/app/src/HashId/HashId.php deleted file mode 100644 index e131f05..0000000 --- a/app/src/HashId/HashId.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\HashId; - -use InvalidArgumentException; -use function Chevere\Message\message; - -/** - * Provides encoding/decoding for integer IDs. - */ -final class HashId -{ - private string $alphabet; - - private string $salt; - - private int $padding; - - private string $hash; - - private string $index; - - private array $table; - - private int $base; - - private string $baseString; - - public function __construct(string $salt) - { - $this->assertSalt($salt); - $this->salt = $salt; - $this->padding = 0; - $this->alphabet = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - $index = str_split($this->alphabet, 1); - $this->hash = hash('sha256', $this->salt); - $this->table = []; - for ($n = 0; $n < strlen($this->alphabet); ++$n) { - $this->table[] = substr($this->hash, $n, 1); - } - array_multisort($this->table, SORT_DESC, $index); - $this->index = implode('', $index); - $this->base = strlen($this->index); - $this->baseString = (string) $this->base; - } - - public function withPadding(int $padding): self - { - $new = clone $this; - $this->assertPadding($padding); - $new->padding = $padding; - - return $new; - } - - public function decode(string $alpha): int - { - $out = 0; - $len = strlen($alpha) - 1; - for ($i = 0; $i <= $len; ++$i) { - $bcpow = bcpow($this->baseString, (string) ($len - $i)); - $out = $out + strpos($this->index, substr($alpha, $i, 1)) * $bcpow; - } - if ($this->padding > 0) { - $out = $out / $this->padding; - } - - return (int) $out; - } - - public function encode(int $id): string - { - if ($this->padding > 0) { - $id = $id * $this->padding; - } - $out = ''; - for ($i = floor(log((float) $id, $this->base)); $i >= 0; --$i) { - $bcpow = bcpow($this->baseString, (string) $i); - $start = floor($id / $bcpow) % $this->base; - $out = $out . substr($this->index, $start, 1); - $id = $id - ($start * $bcpow); - } - - return $out; - } - - private function assertSalt(string $salt): void - { - if (empty($salt) || ctype_space($salt)) { - throw new InvalidArgumentException( - message('Invalid salt provided'), - ); - } - } - - private function assertPadding(int $padding): void - { - if ($padding < 0) { - throw new InvalidArgumentException( - message('Padding must be greater than zero'), - ); - } - } -} diff --git a/app/src/Image/ImageHashInstance.php b/app/src/Image/ImageHashInstance.php deleted file mode 100644 index 518f344..0000000 --- a/app/src/Image/ImageHashInstance.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Image; - -use Jenssegers\ImageHash\ImageHash; -use LogicException; -use function Chevere\Message\message; - -/** - * @codeCoverageIgnore - */ -final class ImageHashInstance -{ - private static ?ImageHash $instance; - - public function __construct(ImageHash $imageHash) - { - self::$instance = $imageHash; - } - - public static function get(): ImageHash - { - if (! isset(self::$instance)) { - throw new LogicException( - message('No `%instance%` instance present', s: ImageHash::class) - ); - } - - return self::$instance; - } -} diff --git a/app/src/Image/ImageManagerInstance.php b/app/src/Image/ImageManagerInstance.php deleted file mode 100644 index 00a4cce..0000000 --- a/app/src/Image/ImageManagerInstance.php +++ /dev/null @@ -1,37 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Image; - -use Intervention\Image\ImageManager; -use LogicException; - -/** - * @codeCoverageIgnore - */ -final class ImageManagerInstance -{ - private static ?ImageManager $instance; - - public function __construct(ImageManager $imageManager) - { - self::$instance = $imageManager; - } - - public static function get(): ImageManager - { - if (! isset(self::$instance)) { - throw new LogicException('No ImageManager instance present'); - } - - return self::$instance; - } -} diff --git a/app/src/Image/functions.php b/app/src/Image/functions.php deleted file mode 100644 index f11df93..0000000 --- a/app/src/Image/functions.php +++ /dev/null @@ -1,63 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Image; - -use Intervention\Image\ImageManager; -use Jenssegers\ImageHash\ImageHash; -use Jenssegers\ImageHash\Implementations\DifferenceHash; -use RuntimeException; -use Throwable; - -function hasExtGd(): bool -{ - return extension_loaded('gd') && function_exists('gd_info'); -} - -function hasExtImagick(): bool -{ - return extension_loaded('imagick') && class_exists('Imagick'); -} - -function imageManager(): ImageManager -{ - try { - return ImageManagerInstance::get(); - } catch (Throwable) { - $driver = match (true) { - hasExtImagick() => 'Imagick', - hasExtGd() => 'Gd', - default => '', - }; - if ($driver === '') { - throw new RuntimeException('No image driver available'); - } - $manager = new ImageManager([ - 'driver' => $driver, - ]); - new ImageManagerInstance($manager); - - return ImageManagerInstance::get(); - } -} - -function imageHash(): ImageHash -{ - try { - return ImageHashInstance::get(); - } catch (Throwable) { - new ImageHashInstance( - new ImageHash(new DifferenceHash(16)) - ); - - return ImageHashInstance::get(); - } -} diff --git a/app/src/Job/Job.php b/app/src/Job/Job.php deleted file mode 100644 index 4191aee..0000000 --- a/app/src/Job/Job.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Job; - -use Chevere\Parameter\Interfaces\ArgumentsInterface; -use Chevereto\Controllers\WorkflowController; -use Ramsey\Uuid\Uuid; - -final class Job -{ - private string $id; - - private string $document; - - public function __construct( - private WorkflowController $controller, - private ArgumentsInterface $arguments - ) { - $this->id = Uuid::uuid4()->toString(); - } - - public function withDocument(string $document): self - { - $new = clone $this; - $new->document = $document; - - return $new; - } - - public function id(): string - { - return $this->id; - } - - public function document(): string - { - return $this->document ??= 'document'; - } -} diff --git a/app/src/Legacy/Classes/Album.php b/app/src/Legacy/Classes/Album.php index 69c91f4..3a993f3 100644 --- a/app/src/Legacy/Classes/Album.php +++ b/app/src/Legacy/Classes/Album.php @@ -40,6 +40,59 @@ use function Emoji\detect_emoji; class Album { + public const COLUMNS = [ + 'album_id', + 'album_name', + 'album_user_id', + 'album_date', + 'album_date_gmt', + 'album_creation_ip', + 'album_privacy', + 'album_privacy_extra', + 'album_password', + 'album_image_count', + 'album_description', + 'album_likes', + 'album_views', + 'album_cover_id', + 'album_parent_id', + 'album_cta_enable', + 'album_cta', + 'user_id', + 'user_name', + 'user_username', + // 'user_date', + // 'user_date_gmt', + // 'user_email', + 'user_avatar_filename', + 'user_facebook_username', + 'user_twitter_username', + 'user_website', + 'user_background_filename', + // 'user_bio', + // 'user_timezone', + // 'user_language', + 'user_status', + 'user_is_admin', + 'user_is_manager', + 'user_is_private', + // 'user_palette_id', + // 'user_newsletter_subscribe', + // 'user_show_nsfw_listings', + // 'user_image_count', + // 'user_album_count', + // 'user_image_keep_exif', + // 'user_file_meta_tag_camera_model', + // 'user_image_expiration', + // 'user_registration_ip', + 'user_likes', + 'user_liked', + 'user_following', + 'user_followers', + 'user_content_views', + // 'user_notifications_unread', + ]; + public const ENCRYPTED_NAMES = [ 'password', ]; @@ -50,8 +103,8 @@ class Album bool $pretty = true, array $requester = [] ): array { + $columns = self::COLUMNS; $tables = DB::getTables(); - $query = 'SELECT * FROM ' . $tables['albums'] . "\n"; $joins = [ 'LEFT JOIN ' . $tables['users'] . ' ON ' . $tables['albums'] . '.album_user_id = ' . $tables['users'] . '.user_id', ]; @@ -59,7 +112,24 @@ class Album if (version_compare(cheveretoVersionInstalled(), '3.9.0', '>=')) { $joins[] = 'LEFT JOIN ' . $tables['likes'] . ' ON ' . $tables['likes'] . '.like_content_type = "album" AND ' . $tables['albums'] . '.album_id = ' . $tables['likes'] . '.like_content_id AND ' . $tables['likes'] . '.like_user_id = ' . $requester['id']; } + array_push( + $columns, + ...[ + // 'like_id', + // 'like_date', + // 'like_date_gmt', + 'like_user_id', + // 'like_content_type', + // 'like_content_id', + // 'like_content_user_id', + // 'like_ip', + ] + ); } + $columnsString = implode(', ', $columns); + $query = "SELECT {$columnsString} FROM " + . $tables['albums'] + . "\n"; $query .= implode("\n", $joins) . "\n"; $query .= 'WHERE album_id=:album_id;' . "\n"; if ($sumView) { @@ -89,7 +159,7 @@ class Album } return $pretty - ? self::formatArray($album_db) + ? self::formatArray($album_db, fillCover: false) : self::cipherAwareDbRow($album_db); } @@ -99,7 +169,10 @@ class Album throw new Exception('Empty ids provided', 600); } $tables = DB::getTables(); - $query = 'SELECT * FROM ' . $tables['albums'] . "\n"; + $columnsString = implode(', ', self::COLUMNS); + $query = "SELECT {$columnsString} FROM " + . $tables['albums'] + . "\n"; $joins = [ 'LEFT JOIN ' . $tables['users'] . ' ON ' . $tables['albums'] . '.album_user_id = ' . $tables['users'] . '.user_id', ]; @@ -243,17 +316,15 @@ class Album } } $insert = DB::insert('albums', $album_array); - if (Login::isLoggedUser()) { + if ($values['user_id'] ?? false) { DB::increment('users', [ 'album_count' => '+1', ], [ 'id' => $values['user_id'], ]); - } else { - $addValue = session()['guest_albums'] ?? []; - $addValue[] = $insert; - sessionVar()->put('guest_albums', $addValue); + User::deleteAlbumsCache($values['user_id']); } + Stat::track([ 'action' => 'insert', 'table' => 'albums', @@ -278,7 +349,7 @@ class Album } $children = implode(',', $children); $tableAlbums = DB::getTable('albums'); - $query = << $id, ]); + if ($return) { + $db = DB::getInstance(); + $tableAlbums = DB::getTable('albums'); + $db->query( + <<bind(':album_id', $id); + $fetchSingle = $db->fetchSingle(); + if ($fetchSingle) { + $userId = $fetchSingle['album_user_id']; + User::deleteAlbumsCache($userId); + } + } + + return $return; } public static function populateCover(int $id) @@ -429,7 +519,7 @@ class Album public static function delete(int $id): int { $images_deleted = 0; - $user_id = DB::get('albums', [ + $userId = DB::get('albums', [ 'id' => $id, ])[0]['album_user_id'] ?? null; $album = self::getSingle($id); @@ -460,13 +550,13 @@ class Album $images_deleted++; } } - if (isset($user_id)) { + if (isset($userId)) { $user_updated_counts = [ 'album_count' => '-1', 'image_count' => '-' . $images_deleted, ]; DB::increment('users', $user_updated_counts, [ - 'id' => $user_id, + 'id' => $userId, ]); } DB::delete('notifications', [ @@ -479,6 +569,8 @@ class Album 'value' => '-1', 'date_gmt' => $album['date_gmt'], ]); + Listing::deleteTypeIdCache('a', $id); + User::deleteAlbumsCache($userId); return $images_deleted; } @@ -509,25 +601,16 @@ class Album return $db->exec(); } - public static function fill(array &$album, array &$user = []) + public static function fill(array &$album, array &$user = [], bool $fillCover = true) { static::fillEssential($album, $user); if (! empty($user)) { User::fill($user); } - $display_url = ''; - $display_width = ''; - $display_height = ''; + $display_url = $album['display_url'] ?? ''; + $display_width = $album['display_width'] ?? ''; + $display_height = $album['display_height'] ?? ''; if (! empty($album['cover_id'])) { - $image = Image::getSingle((int) $album['cover_id']); - if ($image !== []) { - $image = DB::formatRow($image); - unset($image['album']); - Image::fill($image); - $display_url = $image['display_url']; - $display_width = $image['display_width']; - $display_height = $image['display_height']; - } $album['cover_id_encoded'] = encodeID((int) $album['cover_id']); } if (! empty($album['parent_id'])) { @@ -627,27 +710,27 @@ class Album $album['name_truncated_html'] = safe_html($album['name_truncated']); } - public static function cipherAwareDbRow(array &$dbrow): array + public static function cipherAwareDbRow(array &$row): array { - if (isset($dbrow['album_password']) && hasEncryption()) { + if (isset($row['album_password']) && hasEncryption()) { try { - $dbrow['album_password'] = decrypt($dbrow['album_password']); + $row['album_password'] = decrypt($row['album_password']); } catch (Throwable) { - $dbrow['album_password'] = $dbrow['album_password']; + $row['album_password'] = $row['album_password']; } } - return $dbrow; + return $row; } - public static function formatArray(array $dbrow, bool $safe = false): array + public static function formatArray(array $row, bool $safe = false, bool $fillCover = true): array { - self::cipherAwareDbRow($dbrow); - $output = DB::formatRow($dbrow); + self::cipherAwareDbRow($row); + $output = DB::formatRow($row); if (! isset($output['user'])) { $output['user'] = []; } - self::fill($output, $output['user']); + self::fill($output, $output['user'], $fillCover); $output['views_label'] = _n('view', 'views', $output['views'] ?? 0); $output['how_long_ago'] = time_elapsed_string($output['date_gmt'] ?? ''); if (isset($output['images_slice'])) { @@ -705,7 +788,7 @@ class Album int $limit = 5, ): array { $tableAlbums = DB::getTable('albums'); - $query = << + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +final class Cache +{ + private static KeyValueInterface $instance; + + public function __construct(KeyValueInterface $keyValue) + { + self::$instance = $keyValue; + } + + public static function isEnabled(): bool + { + return ! (self::$instance instanceof KeyValueNull); + } + + public static function instance(): KeyValueInterface + { + return self::$instance; + } + + public static function hash(string $message): string + { + if (function_exists('sodium_crypto_generichash')) { + return bin2hex(sodium_crypto_generichash($message, '', 20)); + } + + return sha1($message); + } +} diff --git a/app/src/Legacy/Classes/Categories.php b/app/src/Legacy/Classes/Categories.php new file mode 100644 index 0000000..b8c4dff --- /dev/null +++ b/app/src/Legacy/Classes/Categories.php @@ -0,0 +1,59 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Throwable; +use function Chevereto\Legacy\G\get_base_url; + +final class Categories +{ + public const CACHE_KEY = 'categories'; + + public static function get(): array + { + $categories = []; + $cached = Cache::instance()->get(self::CACHE_KEY); + if ($cached) { + return $cached; + } + + try { + $columns = [ + 'category_id', + 'category_name', + 'category_url_key', + 'category_description', + ]; + $columnsString = implode(', ', $columns); + $rows = DB::queryFetchAll( + "SELECT {$columnsString} FROM " + . DB::getTable('categories') + . ' ORDER BY category_name ASC;' + ); + foreach ($rows as $v) { + $key = $v['category_id']; + $v['category_url'] = get_base_url('category/' . $v['category_url_key']); + $categories[$key] = DB::formatRow($v); + } + } catch (Throwable) { + } + + Cache::instance()->set(self::CACHE_KEY, $categories, 3600); + + return $categories; + } + + public static function deleteCache(): void + { + Cache::instance()->delete(self::CACHE_KEY); + } +} diff --git a/app/src/Legacy/Classes/DB.php b/app/src/Legacy/Classes/DB.php index 7e7ca68..64b4354 100644 --- a/app/src/Legacy/Classes/DB.php +++ b/app/src/Legacy/Classes/DB.php @@ -13,6 +13,7 @@ namespace Chevereto\Legacy\Classes; use Chevereto\Legacy\G\DB as GDB; use PDO; +use function Chevere\Message\message; use function Chevereto\Legacy\G\starts_with; use function Chevereto\Vars\env; @@ -52,6 +53,8 @@ class DB extends GDB 'two_factors', 'users', 'variables', + 'uploads', + 'uploads_chunks', ]; public const PREFIX_TO_TABLE = [ @@ -61,6 +64,7 @@ class DB extends GDB 'tag_file' => 'tags_files', 'tag_user' => 'tags_users', 'tag_album' => 'tags_albums', + 'upload_chunk' => 'uploads_chunks', ]; public const TABLES_TO_PREFIX = [ @@ -70,6 +74,7 @@ class DB extends GDB 'tags_files' => 'tag_file', 'tags_users' => 'tag_user', 'tags_albums' => 'tag_album', + 'uploads_chunks' => 'upload_chunk', ]; public static function getTable(string $table): string @@ -94,14 +99,15 @@ class DB extends GDB array $sort = [], ?int $limit = null, int $fetch_style = PDO::FETCH_ASSOC, - array $valuesOperators = [] + array $valuesOperators = [], + array $columns = [], ): mixed { $prefix = self::getFieldPrefix($table); $where = self::getPrefixedValues($prefix, $where); $valuesOperators = self::getPrefixedValues($prefix, $valuesOperators); $sort = self::getPrefixedSort($prefix, $sort); - return GDB::get($table, $where, $clause, $sort, $limit, $fetch_style, $valuesOperators); + return GDB::get($table, $where, $clause, $sort, $limit, $fetch_style, $valuesOperators, $columns); } public static function update( @@ -219,6 +225,13 @@ class DB extends GDB return rtrim($table, 's'); } + public static function translate(string $query, string|int|float ...$pair) + { + $pair['table_prefix'] = env()['CHEVERETO_DB_TABLE_PREFIX']; + + return message($query, ...$pair)->__toString(); + } + protected static function getPrefixedValues(string $prefix, array|string $values): array|string { if (! is_array($values)) { diff --git a/app/src/Legacy/Classes/ExifTool.php b/app/src/Legacy/Classes/ExifTool.php new file mode 100644 index 0000000..c3dc5d6 --- /dev/null +++ b/app/src/Legacy/Classes/ExifTool.php @@ -0,0 +1,51 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Chevereto\Legacy\Classes\Traits\BinaryTrait; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; + +final class ExifTool +{ + use BinaryTrait; + + public function name(): string + { + return 'ExifTool'; + } + + public function version(): string + { + $process = new Process([$this->path, '-ver']); + $process->run(); + if (! $process->isSuccessful()) { + throw new ProcessFailedException($process); + } + + return trim($process->getOutput()); + } + + public function strip(string $path): void + { + $process = new Process([ + $this->path, + '-all=', + '-overwrite_original', + $path, + ]); + $process->run(); + if (! $process->isSuccessful()) { + throw new ProcessFailedException($process); + } + } +} diff --git a/app/src/Legacy/Classes/ExifTran.php b/app/src/Legacy/Classes/ExifTran.php new file mode 100644 index 0000000..84c7354 --- /dev/null +++ b/app/src/Legacy/Classes/ExifTran.php @@ -0,0 +1,40 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Chevereto\Legacy\Classes\Traits\BinaryTrait; +use Symfony\Component\Process\Exception\ProcessFailedException; +use Symfony\Component\Process\Process; + +final class ExifTran +{ + use BinaryTrait; + + public function name(): string + { + return 'ExifTran'; + } + + public function orientate(string $path): void + { + $process = new Process([ + $this->path, + '-a', + '-i', + $path, + ]); + $process->run(); + if (! $process->isSuccessful()) { + throw new ProcessFailedException($process); + } + } +} diff --git a/app/src/Legacy/Classes/Image.php b/app/src/Legacy/Classes/Image.php index 322c553..31f09d2 100644 --- a/app/src/Legacy/Classes/Image.php +++ b/app/src/Legacy/Classes/Image.php @@ -45,7 +45,7 @@ use function Chevereto\Legacy\G\format_bytes; use function Chevereto\Legacy\G\get_bytes; use function Chevereto\Legacy\G\get_client_ip; use function Chevereto\Legacy\G\get_ffmpeg_error; -use function Chevereto\Legacy\G\get_image_fileinfo as GGet_image_fileinfo; +use function Chevereto\Legacy\G\get_image_fileinfo; use function Chevereto\Legacy\G\get_mimetype; use function Chevereto\Legacy\G\get_public_url; use function Chevereto\Legacy\G\is_animated_image; @@ -58,6 +58,7 @@ use function Chevereto\Legacy\G\unlinkIfExists; use function Chevereto\Legacy\G\url_to_relative; use function Chevereto\Legacy\get_fileinfo; use function Chevereto\Legacy\getSetting; +use function Chevereto\Legacy\hashFile; use function Chevereto\Legacy\time_elapsed_string; use function Chevereto\Vars\env; use function Chevereto\Vars\session; @@ -66,6 +67,144 @@ use function Safe\password_hash; class Image { + public const COLUMNS = [ + 'images' => [ + 'image_id', + 'image_name', + 'image_extension', + 'image_size', + 'image_width', + 'image_height', + 'image_date', + 'image_date_gmt', + 'image_title', + 'image_description', + 'image_nsfw', + 'image_user_id', + 'image_album_id', + 'image_uploader_ip', + 'image_storage_mode', + 'image_path', + 'image_storage_id', + 'image_checksum', + 'image_source_checksum', + 'image_original_filename', + 'image_original_exifdata', + 'image_views', + 'image_category_id', + 'image_chain', + 'image_thumb_size', + 'image_medium_size', + 'image_frame_size', + 'image_expiration_date_gmt', + 'image_likes', + 'image_is_animated', + 'image_is_approved', + 'image_is_360', + 'image_duration', + 'image_type', + ], + 'users' => [ + 'user_id', + 'user_name', + 'user_username', + 'user_date', + 'user_date_gmt', + 'user_email', + 'user_avatar_filename', + 'user_facebook_username', + 'user_twitter_username', + 'user_website', + 'user_background_filename', + 'user_bio', + 'user_timezone', + 'user_language', + 'user_status', + 'user_is_admin', + 'user_is_manager', + 'user_is_private', + 'user_palette_id', + 'user_newsletter_subscribe', + 'user_show_nsfw_listings', + 'user_image_count', + 'user_album_count', + 'user_image_keep_exif', + 'user_file_meta_tag_camera_model', + 'user_image_expiration', + 'user_registration_ip', + 'user_likes', + 'user_liked', + 'user_following', + 'user_followers', + 'user_content_views', + // 'user_notifications_unread', + ], + 'albums' => [ + 'album_id', + 'album_name', + 'album_user_id', + 'album_date', + 'album_date_gmt', + 'album_creation_ip', + 'album_privacy', + 'album_privacy_extra', + 'album_password', + 'album_image_count', + 'album_description', + 'album_likes', + 'album_views', + 'album_cover_id', + 'album_parent_id', + 'album_cta_enable', + 'album_cta', + ], + 'tags' => [ + 'tag_id', + 'tag_name', + 'tag_description', + 'tag_user_id', + 'tag_date_gmt', + 'tag_files', + 'tag_views', + ], + 'likes' => [ + 'like_id', + 'like_date', + 'like_date_gmt', + 'like_user_id', + 'like_content_type', + 'like_content_id', + 'like_content_user_id', + 'like_ip', + ], + 'storages' => [ + 'storage_id', + // 'storage_api_id', + 'storage_name', + // 'storage_service', + 'storage_url', + // 'storage_bucket', + // 'storage_region', + // 'storage_server', + // 'storage_account_id', + // 'storage_account_name', + // 'storage_key', + // 'storage_secret', + // 'storage_is_https', + 'storage_is_active', + 'storage_capacity', + // 'storage_space_used', + 'storage_type_chain', + // 'storage_use_path_style_endpoint', + // 'storage_deleted_at', + ], + 'storage_apis' => [ + 'storage_api_id', + 'storage_api_name', + 'storage_api_type', + ], + ]; + public static array $table_chv_image = [ 'name', 'extension', @@ -80,8 +219,8 @@ class Image 'uploader_ip', 'storage_mode', 'storage_id', - 'md5', - 'source_md5', + 'checksum', + 'source_checksum', 'original_filename', 'original_exifdata', 'category_id', @@ -148,9 +287,6 @@ class Image array $requester = [] ): array { $tables = DB::getTables(); - $query = 'SELECT * FROM ' - . $tables['images'] - . "\n"; $joins = [ 'LEFT JOIN ' . $tables['storages'] @@ -181,6 +317,17 @@ class Image . $tables['albums'] . '.album_id', ]; + $storageApiColumns = self::COLUMNS['storage_apis']; + $find = array_search('storage_api_id', $storageApiColumns); + unset($storageApiColumns[$find]); + $storageApiColumns[] = DB::getTable('storages') . '.' . 'storage_api_id'; + $columns = array_merge( + self::COLUMNS['images'], + self::COLUMNS['storages'], + $storageApiColumns, + self::COLUMNS['users'], + self::COLUMNS['albums'] + ); if ($requester !== []) { if (version_compare(cheveretoVersionInstalled(), '3.7.0', '>=')) { $joins[] = 'LEFT JOIN ' @@ -195,8 +342,14 @@ class Image . $tables['likes'] . '.like_user_id = ' . $requester['id']; + $columns = array_merge($columns, self::COLUMNS['likes']); } } + $columnsString = implode(', ', $columns); + $query = "SELECT {$columnsString} FROM " + . $tables['images'] + . "\n"; + $query .= implode("\n", $joins) . "\n"; $query .= 'WHERE image_id=:image_id;' . "\n"; if ($sumView) { @@ -248,7 +401,7 @@ class Image $image_db['image_tags'] = $image_tags; $image_db['image_tags_string'] = $image_tags_string; $return = $image_db; - $return = $pretty ? self::formatArray($return) : $return; + $return = $pretty ? self::formatArray($return, fillAlbumCover: false) : $return; if (! isset($return['file_resource'])) { $return['file_resource'] = self::getSrcTargetSingle($image_db); } @@ -262,7 +415,15 @@ class Image throw new Exception('Null $ids provided in Image::get_multiple', 600); } $tables = DB::getTables(); - $query = 'SELECT * FROM ' . $tables['images'] . "\n"; + $columns = array_merge( + self::COLUMNS['images'], + self::COLUMNS['users'], + self::COLUMNS['albums'] + ); + $columnsString = implode(', ', $columns); + $query = "SELECT {$columnsString} FROM " + . $tables['images'] + . "\n"; $joins = [ 'LEFT JOIN ' . $tables['users'] . ' ON ' . $tables['images'] . '.image_user_id = ' . $tables['users'] . '.user_id', 'LEFT JOIN ' . $tables['albums'] . ' ON ' . $tables['images'] . '.image_album_id = ' . $tables['albums'] . '.album_id', @@ -355,7 +516,7 @@ class Image } $images = []; foreach ($list as $v) { - $format = self::formatArray($v); + $format = self::formatArray($v, fillAlbumCover: false); $images[$format['id']] = $format; } if ($prevListing->output !== [] && $prevListing->count > 1) { @@ -496,24 +657,34 @@ class Image return $return; } - public static function watermarkFromDb(): void + public static function watermarkTempFile(): string + { + return + sys_get_temp_dir() + . '/chv' + . env()['CHEVERETO_ID'] + . '_image_' + . getSetting('watermark_image'); + } + + public static function watermarkFromDb(): string { - $file = PATH_PUBLIC_CONTENT_IMAGES_SYSTEM . getSetting('watermark_image'); $assetsDb = DB::get('assets', [ 'key' => 'watermark_image', ], 'AND', [], 1); if ($assetsDb === false) { - return; + return PATH_PUBLIC_CONTENT_IMAGES_SYSTEM . getSetting('watermark_image'); } + $file = static::watermarkTempFile(); if (file_exists($file) - && md5_file($file) !== $assetsDb['asset_md5'] + && hashFile($file) !== $assetsDb['asset_checksum'] && ! starts_with('default/', getSetting('watermark_image')) ) { unlinkIfExists($file); } if (! file_exists($file)) { $fh = fopen($file, 'w'); - $st = ! $fh || fwrite($fh, $assetsDb['asset_blob']) === false ? false : true; + $st = $fh && fwrite($fh, $assetsDb['asset_blob']) !== false; fclose($fh); if (! $st) { throw new LogicException( @@ -522,6 +693,11 @@ class Image ); } } + if (! is_readable($file)) { + throw new Exception("Can't read watermark file at " . $file, 600); + } + + return $file; } public static function watermark(string $image_path, array $options = []): bool @@ -529,12 +705,8 @@ class Image $options = array_merge([ 'ratio' => getSetting('watermark_percentage') / 100, 'position' => explode(' ', getSetting('watermark_position')), - 'file' => PATH_PUBLIC_CONTENT_IMAGES_SYSTEM . getSetting('watermark_image'), + 'file' => self::watermarkFromDb(), ], $options); - self::watermarkFromDb(); - if (! is_readable($options['file'])) { - throw new Exception("Can't read watermark file at " . $options['file'], 600); - } $image = ImageManagerStatic::make($image_path); $options['ratio'] = min(1, (is_numeric($options['ratio']) ? max(0.01, $options['ratio']) : 0.01)); if (! in_array($options['position'][0], ['left', 'center', 'right'], true)) { @@ -604,7 +776,8 @@ class Image string|null $filename = null, array $options = [], int|null $storage_id = null, - bool $guestSessionHandle = true + bool $guestSessionHandle = true, + string $checksum = null ): array { if ((! (bool) env()['CHEVERETO_ENABLE_LOCAL_STORAGE'])) { if ($storage_id === null) { @@ -631,6 +804,9 @@ class Image if ($guestSessionHandle === false) { $upload->detectFlood = false; } + if ($checksum != null) { + $upload->setChecksum($checksum); + } $upload->exec(); return [ @@ -640,30 +816,19 @@ class Image ]; } - // Mostly for people uploading two times the same image to test or just bug you - // $mixed => $_FILES or md5 string - public static function isDuplicatedUpload(array|string $source, string $timePeriod = 'P1D'): bool + public static function isDuplicatedChunkUpload(string $checksum, string $timePeriod = 'P1D'): bool { - if (is_array($source) && isset($source['tmp_name'])) { - $filename = $source['tmp_name']; - if (stream_resolve_include_path($filename) === false) { - throw new Exception("Concurrency: {$filename} is gone", 666); - } - $md5_file = md5_file($filename); - } else { - $filename = $source; - $md5_file = $filename; - } - if ($md5_file === false) { - throw new Exception('Unable to process md5_file', 600); - } $db = DB::getInstance(); + $tableUploads = DB::getTable('uploads'); $db->query( - 'SELECT * FROM ' - . DB::getTable('images') . - ' WHERE (image_md5=:md5 OR image_source_md5=:md5) AND image_uploader_ip=:ip AND image_date_gmt > :date_gmt' + << :date_gmt; + MySQL ); - $db->bind(':md5', $md5_file); + $db->bind(':checksum', $checksum); $db->bind(':ip', get_client_ip()); $db->bind(':date_gmt', datetime_sub(datetimegmt(), $timePeriod)); $db->exec(); @@ -671,6 +836,82 @@ class Image return (bool) $db->fetchColumn(); } + // Mostly for people uploading two times the same image to test or just bug you + // $mixed => $_FILES or checksum string + public static function isDuplicatedUpload(array|string $source, string $timePeriod = 'P1D'): bool + { + if (is_string($source)) { + $checksum = $source; + } else { + if ($source['tmp_name'] ?? false) { + $filename = $source['tmp_name']; + if (stream_resolve_include_path($filename) === false) { + throw new Exception("Concurrency: {$filename} is gone", 666); + } + } + $checksum = $source['checksum'] + ?? hashFile($filename); + } + if ($checksum === false) { + throw new Exception('Unable to process checksum', 600); + } + $db = DB::getInstance(); + $tableImages = DB::getTable('images'); + $db->query( + << :date_gmt; + MySQL + ); + $db->bind(':checksum', $checksum); + $db->bind(':ip', get_client_ip()); + $db->bind(':date_gmt', datetime_sub(datetimegmt(), $timePeriod)); + $db->exec(); + + return (bool) $db->fetchColumn(); + } + + public static function validateParamsUploadToWebsite(array &$params = [], array $user = []): void + { + // Validate user_id existence + // Validate category_id existence + // Validate album_id ownership + // params: + // {"type":"chunked","privacy":"","timestamp":"1744383904543","expiration":"","category_id":"","nsfw":"0","album_id":"","tags":"","mimetype":"image\/jpeg","source":"Sony HV-30 DSC00271.JPG","size":"23122540"} + $params['use_file_date'] = $params['use_file_date'] ?? false; + nullify_string($params['album_id']); + } + + /** + * Uploads an image to the Chevereto website. + * + * Handles the entire image upload process including storage selection, + * file validation, image processing, watermarking, and database insertion. + * + * @param array|string $source Either an array with file data or a URL string to fetch + * @param array $user User array data, empty for guest uploads + * @param array $params Upload parameters that may include: + * - album_id: ID of target album + * - title: Image title + * - description: Image description + * - category_id: Image category ID + * - nsfw: NSFW flag (0 or 1) + * - expiration: Expiration time (seconds) + * - expiration_date_gmt: Direct expiration date in UTC format + * - width: Target width for resizing + * - height: Target height for resizing + * - use_file_date: Use file's EXIF date instead of current date + * - privacy: public, password, private, private_but_link + * - mimetype: Force specific mimetype for the upload + * - tags: Comma-separated tags + * - timestamp: Upload timestamp + * @param bool $guestSessionHandle Whether to handle guest session tracking + * @param string|null $ip Override for uploader IP address + * @return array Array containing [inserted_id, delete_password] + * @throws Exception For various error conditions including duplicates, storage issues, moderation rejection + */ public static function uploadToWebsite( array|string $source, array $user = [], @@ -678,16 +919,15 @@ class Image bool $guestSessionHandle = true, string|null $ip = null ): array { - $params['use_file_date'] = $params['use_file_date'] ?? false; - nullify_string($params['album_id']); + self::validateParamsUploadToWebsite($params); $dateFolder = ''; try { $storage_mode = getSetting('upload_storage_mode'); - $upload_path = ''; + $uploadPath = ''; switch ($storage_mode) { case 'direct': - $upload_path = CHV_PATH_IMAGES; + $uploadPath = CHV_PATH_IMAGES; break; case 'datefolder': @@ -709,26 +949,34 @@ class Image 'date_gmt' => $stockDateGmt, ]; $dateFolder = date('Y/m/d/', strtotime($datefolder_stock['date'])); - $upload_path = CHV_PATH_IMAGES . $dateFolder; + $uploadPath = CHV_PATH_IMAGES . $dateFolder; break; } if (is_string($source)) { - if (! getSetting('enable_uploads_url')) { + if (preg_match('/^CHUNKED_([^_]+)_([a-zA-Z0-9]{64})_([a-zA-Z0-9]{64})$/', $source, $matches)) { + [$tempName, $uploadParams] = Uploads::join( + uploadPath: $uploadPath, + uploadId: decodeID($matches[1]), + token: $matches[2], + hash: $matches[3], + ); + $source = $uploadParams['source']; + } elseif (! getSetting('enable_uploads_url')) { throw new Exception( message('URL uploading is disabled'), 403 ); + $tempName = Upload::getTempNam($uploadPath); + fetch_url($source, $tempName); } - $temp_name = Upload::getTempNam($upload_path); - fetch_url($source, $temp_name); - $mimetype = get_mimetype($temp_name); + $mimetype = get_mimetype($tempName); $source = [ 'name' => basename($source), 'type' => $mimetype, - 'tmp_name' => $temp_name, + 'tmp_name' => $tempName, 'error' => 'UPLOAD_ERR_OK', - 'size' => filesize($temp_name), + 'size' => filesize($tempName), ]; } if ($user !== [] @@ -738,6 +986,7 @@ class Image Settings::setValue('upload_max_filesize_mb', getSetting('upload_max_filesize_mb_bak')); } $do_dupe_check = ! getSetting('enable_duplicate_uploads') && ! ($user['is_admin'] ?? false); + $source['checksum'] = hashFile($source['tmp_name']); if ($do_dupe_check && self::isDuplicatedUpload($source)) { throw new Exception(_s('Duplicated upload'), 101); } @@ -749,6 +998,7 @@ class Image // 'document' => 8, // 'other' => 16, ]; + // @deprecate $params['mimetype'] $mimetype = strtok($params['mimetype'] ?? 'image', '/'); $type_chain = $upload_types[$mimetype] ?? 1; $get_active_storages = Storage::get([ @@ -790,7 +1040,6 @@ class Image if ($storage_id === null && (! (bool) env()['CHEVERETO_ENABLE_LOCAL_STORAGE'])) { throw new LogicException('No storage available', 900); } - $fileNaming = getSetting('upload_filenaming'); if ($fileNaming !== 'id' && in_array($params['privacy'] ?? '', ['password', 'private', 'private_but_link'], true) @@ -815,7 +1064,7 @@ class Image 'date_gmt' => '0000-01-01 00:00:00', 'nsfw' => 0, 'uploader_ip' => '', - 'md5' => '', + 'checksum' => '', 'original_filename' => '', 'chain' => 0, 'thumb_size' => 0, @@ -836,18 +1085,18 @@ class Image $upload_options['allowed_formats'] = self::getEnabledImageExtensions(); $image_upload = self::upload( $source, - $upload_path, + $uploadPath, ($fileNaming === 'id' && isset($target_id)) ? encodeID((int) $target_id) : null, $upload_options, $storage_id, $guestSessionHandle - ); + ); // slow: 6s $chain_mask = [0, 0, 1, 0, 1]; // frame, original, image, medium, thumb - if ($do_dupe_check && self::isDuplicatedUpload($image_upload['uploaded']['fileinfo']['md5'])) { - throw new Exception(_s('Duplicated upload'), 102); - } + // if ($do_dupe_check && self::isDuplicatedUpload($image_upload['uploaded']['fileinfo']['checksum'])) { + // throw new Exception(_s('Duplicated upload'), 102); + // } $image_ratio = $image_upload['uploaded']['fileinfo']['ratio']; $must_resize = false; $image_max_size_cfg = [ @@ -907,8 +1156,8 @@ class Image $chain_mask[0] = 1; } if ($must_resize) { - $source_md5 = $image_upload['uploaded']['fileinfo']['md5']; - if ($do_dupe_check && self::isDuplicatedUpload($source_md5)) { + $sourceChecksum = $image_upload['uploaded']['fileinfo']['checksum']; + if ($do_dupe_check && self::isDuplicatedUpload($sourceChecksum)) { throw new Exception(_s('Duplicated upload'), 103); } $image_ratio = $image_upload['uploaded']['fileinfo']['ratio']; @@ -950,7 +1199,7 @@ class Image filename: $image_upload['uploaded']['name'] . '.th', options: $image_thumb_options ); - $original_md5 = $image_upload['source']['fileinfo']['md5']; + $originalChecksum = $image_upload['source']['fileinfo']['checksum']; $watermark_enable = getSetting('watermark_enable'); if ($watermark_enable) { $watermark_user = $user !== [] @@ -979,8 +1228,8 @@ class Image } } if ($apply_watermark && self::watermark($resizeSourceImage)) { - $image_upload['uploaded']['fileinfo'] = GGet_image_fileinfo($resizeSourceImage); - $image_upload['uploaded']['fileinfo']['md5'] = $original_md5; + $image_upload['uploaded']['fileinfo'] = get_image_fileinfo($resizeSourceImage); + $image_upload['uploaded']['fileinfo']['checksum'] = $originalChecksum; } if ($image_upload['uploaded']['fileinfo'][$medium_fixed_dimension] > $medium_size || $is_animated_image @@ -1050,7 +1299,7 @@ class Image 'medium_size' => $image_medium['fileinfo']['size'] ?? 0, 'frame_size' => $image_upload['uploaded']['frameinfo']['size'] ?? 0, 'is_animated' => $is_animated_image, - 'source_md5' => $source_md5 ?? null, + 'source_checksum' => $sourceChecksum ?? null, 'is_360' => $is_360, 'duration' => $image_upload['uploaded']['fileinfo']['duration'] ?? 0, ]; @@ -1171,6 +1420,7 @@ class Image $image_insert_values['id'] = $target_id; } $image_insert_values['title'] = mb_substr($image_insert_values['title'] ?? '', 0, 100, 'UTF-8'); + // Validate user_id album ownership if ($user !== [] && isset($image_insert_values['album_id'])) { $album = Album::getSingle((int) $image_insert_values['album_id']); if (($album['user']['id'] ?? 0) !== $user['id']) { @@ -1216,6 +1466,7 @@ class Image $image_insert_values['album_id'] = $album['id']; } } + if (isset($image_insert_values['album_id'])) { Album::addImage($image_insert_values['album_id'], $uploaded_id); } @@ -1424,7 +1675,6 @@ class Image $binds[':tag_name_' . $pos] = $name; } } - xr(sql: $sql, binds: $binds); $db = DB::getInstance(); $db->query($sql); foreach ($binds as $key => $value) { @@ -1454,7 +1704,7 @@ class Image 'size' => $image[$k]['size'], ]; } - Storage::deleteFiles($targets, $image['storage']); + Storage::deleteFiles($targets, $image['storage']['id']); } if ($update_user && isset($image['user']['id'])) { DB::increment('users', [ @@ -1526,16 +1776,19 @@ class Image 'content_user_id' => $image['user']['id'] ?? null, 'content_ip' => $image['uploader_ip'], 'content_views' => $image['views'], - 'content_md5' => $image['md5'], + 'content_checksum' => $image['checksum'], 'content_likes' => $image['likes'], 'content_original_filename' => $image['original_filename'], ]); $result = DB::delete('images', [ 'id' => $id, ]); - DB::delete('images_hash', [ - 'image_id' => $id, - ]); + if ($result) { + DB::delete('images_hash', [ + 'image_id' => $id, + ]); + Listing::deleteTypeIdCache('i', $id); + } return $result; } @@ -1701,7 +1954,7 @@ class Image ?? ($image['name'] . '.' . $image['extension']); } - public static function formatArray(array $dbRow, bool $safe = false): array + public static function formatArray(array $dbRow, bool $safe = false, bool $fillAlbumCover = true): array { $output = DB::formatRow($dbRow); if (isset($output['user']['id'])) { @@ -1718,7 +1971,8 @@ class Image $output['album']['password'] = $output['album']['password']; } } - Album::fill($output['album'], $output['user']); + $output['album'] ??= []; + Album::fill($output['album'], $output['user'], $fillAlbumCover); } else { unset($output['album']); } @@ -1833,7 +2087,7 @@ class Image } $populate_values = [ 'uploader_ip' => $values['uploader_ip'], - 'md5' => $image_upload['uploaded']['fileinfo']['md5'], + 'checksum' => $image_upload['uploaded']['fileinfo']['checksum'], 'original_filename' => $image_upload['source']['filename'], 'original_exifdata' => $original_exifdata, 'is_360' => $is360, diff --git a/app/src/Legacy/Classes/Import.php b/app/src/Legacy/Classes/Import.php index 93cd7c2..8036b0b 100644 --- a/app/src/Legacy/Classes/Import.php +++ b/app/src/Legacy/Classes/Import.php @@ -757,6 +757,7 @@ class Import try { $params['use_file_date'] = true; + // @deprecate $params['mimetype'] $params['mimetype'] = $mimetype; $user = User::getSingle($user_id, 'id'); $metaFile = $pathName . '.json'; diff --git a/app/src/Legacy/Classes/KeyValue.php b/app/src/Legacy/Classes/KeyValue.php new file mode 100644 index 0000000..5f1b514 --- /dev/null +++ b/app/src/Legacy/Classes/KeyValue.php @@ -0,0 +1,102 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use MatthiasMullie\Scrapbook\Adapters\Redis as RedisAdapter; +use MatthiasMullie\Scrapbook\KeyValueStore; +use MatthiasMullie\Scrapbook\Scale\StampedeProtector; +use Redis; + +class KeyValue implements KeyValueInterface +{ + private KeyValueStore $keyValueStore; + + public function __construct( + private Redis $redis, + private string $prefix = '', + private int $maxTtl = 0, + ) { + $this->keyValueStore = new StampedeProtector( + new RedisAdapter($redis) + ); + } + + public function redis(): Redis + { + return $this->redis; + } + + public function set(string $key, mixed $value, int $ttl = 0): bool + { + if ($ttl === 0) { + $ttl = $this->maxTtl; + } + $ttl = min($ttl, $this->maxTtl); + + return $this->keyValueStore->set( + $this->getKey($key), + $value, + $ttl + ); + } + + public function setMulti(array $items, int $expire = 0): array + { + if ($expire === 0) { + $expire = $this->maxTtl; + } + $expire = min($expire, $this->maxTtl); + + return $this->keyValueStore->setMulti( + array_combine( + $this->getKeys(array_keys($items)), + array_values($items) + ), + $expire + ); + } + + public function get(string $key, &$token = null): mixed + { + return $this->keyValueStore->get( + $this->getKey($key), + $token + ); + } + + public function delete(string $key): bool + { + return $this->keyValueStore->delete( + $this->getKey($key) + ); + } + + public function deleteMulti(string ...$key): array + { + return $this->keyValueStore->deleteMulti( + $this->getKeys($key) + ); + } + + public function getKey(string $key): string + { + return $this->prefix . $key; + } + + private function getKeys(array $keys): array + { + return array_map( + fn ($key) => $this->getKey($key), + $keys + ); + } +} diff --git a/app/src/Legacy/Classes/KeyValueInterface.php b/app/src/Legacy/Classes/KeyValueInterface.php new file mode 100644 index 0000000..cc89e40 --- /dev/null +++ b/app/src/Legacy/Classes/KeyValueInterface.php @@ -0,0 +1,81 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Redis; + +interface KeyValueInterface +{ + public function redis(): Redis; + + /** + * Stores a value, regardless of whether or not the key already exists (in + * which case it will overwrite the existing value for that key). + * + * Return value is a boolean true when the operation succeeds, or false on + * failure. + */ + public function set(string $key, mixed $value, int $ttl = 0): bool; + + /** + * Store multiple values at once. + * + * Return value will be an associative array in [key => status] form, where + * status is a boolean true for success, or false for failure. + * + * setMulti is preferred over multiple individual set operations as you'll + * set them all in 1 request. + * + * @param int $expire Time when item falls out of the cache: + * 0 = permanent (doesn't expires); + * under 2592000 (30 days) = relative time, in seconds from now; + * over 2592000 = absolute time, unix timestamp + * + * @return bool[] + */ + public function setMulti(array $values, int $expire = 0): array; + + /** + * Retrieves an item from the cache. + * + * Optionally, an 2nd variable can be passed to this function. It will be + * filled with a value that can be used for cas() + * + * @return mixed|bool Value, or false on failure + */ + public function get(string $key): mixed; + + /** + * Retrieves the cache key. + */ + public function getKey(string $key): string; + + /** + * Deletes an item from the cache. + * Returns true if item existed & was successfully deleted, false otherwise. + * + * Return value is a boolean true when the operation succeeds, or false on + * failure. + */ + public function delete(string $key): bool; + + /** + * Deletes multiple items at once (reduced network traffic compared to + * individual operations). + * + * Return value will be an associative array in [key => status] form, where + * status is a boolean true for success, or false for failure. + * + * @return bool[] + */ + public function deleteMulti(string ...$key): array; +} diff --git a/app/src/Legacy/Classes/KeyValueNull.php b/app/src/Legacy/Classes/KeyValueNull.php new file mode 100644 index 0000000..8704e7b --- /dev/null +++ b/app/src/Legacy/Classes/KeyValueNull.php @@ -0,0 +1,58 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use BadMethodCallException; +use Redis; + +class KeyValueNull implements KeyValueInterface +{ + public function __construct( + private string $prefix = '', + ) { + } + + public function redis(): Redis + { + throw new BadMethodCallException('Redis is not available'); + } + + public function set(string $key, mixed $value, int $ttl = 0): bool + { + return false; + } + + public function setMulti(array $values, int $ttl = 0): array + { + return []; + } + + public function get(string $key, &$token = null): mixed + { + return null; + } + + public function delete(string $key): bool + { + return true; + } + + public function deleteMulti(string ...$key): array + { + return []; + } + + public function getKey(string $key): string + { + return $this->prefix . $key; + } +} diff --git a/app/src/Legacy/Classes/Listing.php b/app/src/Legacy/Classes/Listing.php index 020abc0..981b853 100644 --- a/app/src/Legacy/Classes/Listing.php +++ b/app/src/Legacy/Classes/Listing.php @@ -15,6 +15,7 @@ use BadMethodCallException; use Chevereto\Legacy\G\Handler; use DateTime; use Exception; +use LogicException; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use RecursiveRegexIterator; @@ -36,9 +37,303 @@ use function Chevereto\Vars\request; class Listing { + public const COLUMNS = [ + 'images' => [ + 'image_id', + 'image_name', + 'image_extension', + 'image_size', + 'image_width', + 'image_height', + 'image_date', + 'image_date_gmt', + 'image_title', + 'image_description', + 'image_nsfw', + 'image_user_id', + 'image_album_id', + 'image_uploader_ip', + 'image_storage_mode', + 'image_path', + 'image_storage_id', + 'image_checksum', + 'image_source_checksum', + 'image_original_filename', + // 'image_original_exifdata', + 'image_views', + 'image_category_id', + 'image_chain', + 'image_thumb_size', + 'image_medium_size', + 'image_frame_size', + 'image_expiration_date_gmt', + 'image_likes', + 'image_is_animated', + 'image_is_approved', + 'image_is_360', + 'image_duration', + 'image_type', + ], + 'users' => [ + 'user_id', + 'user_name', + 'user_username', + 'user_date', + 'user_date_gmt', + 'user_email', + 'user_avatar_filename', + 'user_facebook_username', + 'user_twitter_username', + 'user_website', + 'user_background_filename', + 'user_bio', + 'user_timezone', + 'user_language', + 'user_status', + 'user_is_admin', + 'user_is_manager', + 'user_is_private', + 'user_palette_id', + 'user_newsletter_subscribe', + 'user_show_nsfw_listings', + 'user_image_count', + 'user_album_count', + 'user_image_keep_exif', + 'user_file_meta_tag_camera_model', + 'user_image_expiration', + 'user_registration_ip', + 'user_likes', + 'user_liked', + 'user_following', + 'user_followers', + 'user_content_views', + // 'user_notifications_unread', + ], + 'albums' => [ + 'album_id', + 'album_name', + 'album_user_id', + 'album_date', + 'album_date_gmt', + 'album_creation_ip', + 'album_privacy', + 'album_privacy_extra', + 'album_password', + 'album_image_count', + 'album_description', + 'album_likes', + 'album_views', + 'album_cover_id', + 'album_parent_id', + 'album_cta_enable', + 'album_cta', + ], + 'tags' => [ + 'tag_id', + 'tag_name', + 'tag_description', + 'tag_user_id', + 'tag_date_gmt', + 'tag_files', + 'tag_views', + ], + 'likes' => [ + 'like_id', + 'like_date', + 'like_date_gmt', + 'like_user_id', + 'like_content_type', + 'like_content_id', + 'like_content_user_id', + 'like_ip', + ], + 'follows' => [ + 'follow_id', + 'follow_date', + 'follow_date_gmt', + 'follow_user_id', + 'follow_followed_user_id', + 'follow_ip', + ], + 'storages' => [ + 'storage_id', + 'storage_api_id', + 'storage_name', + // 'storage_service', + 'storage_url', + // 'storage_bucket', + // 'storage_region', + // 'storage_server', + // 'storage_account_id', + // 'storage_account_name', + // 'storage_key', + // 'storage_secret', + // 'storage_is_https', + 'storage_is_active', + 'storage_capacity', + // 'storage_space_used', + 'storage_type_chain', + // 'storage_use_path_style_endpoint', + // 'storage_deleted_at', + ], + 'categories' => [ + 'category_id', + 'category_name', + 'category_url_key', + 'category_description', + ], + ]; + + public const COLUMNS_JOIN = [ + 'images' => [ + 'image_id', + 'image_name', + 'image_extension', + 'image_size', + 'image_width', + 'image_height', + 'image_date', + 'image_date_gmt', + 'image_title', + 'image_description', + 'image_nsfw', + 'image_user_id', + 'image_album_id', + 'image_uploader_ip', + 'image_storage_mode', + 'image_path', + 'image_storage_id', + 'image_checksum', + 'image_source_checksum', + 'image_original_filename', + // 'image_original_exifdata', + 'image_views', + 'image_category_id', + 'image_chain', + 'image_thumb_size', + 'image_medium_size', + 'image_frame_size', + 'image_expiration_date_gmt', + 'image_likes', + 'image_is_animated', + 'image_is_approved', + 'image_is_360', + 'image_duration', + 'image_type', + ], + 'users' => [ + 'user_id', + 'user_name', + 'user_username', + // 'user_date', + // 'user_date_gmt', + // 'user_email', + 'user_avatar_filename', + 'user_facebook_username', + 'user_twitter_username', + 'user_website', + 'user_background_filename', + // 'user_bio', + // 'user_timezone', + 'user_language', + 'user_status', + 'user_is_admin', + 'user_is_manager', + 'user_is_private', + // 'user_palette_id', + // 'user_newsletter_subscribe', + // 'user_show_nsfw_listings', + // 'user_image_count', + // 'user_album_count', + // 'user_image_keep_exif', + // 'user_file_meta_tag_camera_model', + // 'user_image_expiration', + // 'user_registration_ip', + 'user_likes', + 'user_liked', + 'user_following', + 'user_followers', + 'user_content_views', + // 'user_notifications_unread', + ], + 'albums' => [ + 'album_id', + 'album_name', + // 'album_user_id', + 'album_date', + 'album_date_gmt', + 'album_creation_ip', + 'album_privacy', + // 'album_privacy_extra', + // 'album_password', + 'album_image_count', + // 'album_description', + 'album_likes', + 'album_views', + 'album_cover_id', + 'album_parent_id', + // 'album_cta_enable', + // 'album_cta', + ], + 'tags' => [ + 'tag_id', + 'tag_name', + // 'tag_description', + // 'tag_user_id', + // 'tag_date_gmt', + // 'tag_files', + // 'tag_views', + ], + 'likes' => [ + 'like_id', + 'like_date', + 'like_date_gmt', + 'like_user_id', + 'like_content_type', + 'like_content_id', + 'like_content_user_id', + 'like_ip', + ], + 'follows' => [ + 'follow_id', + 'follow_date', + 'follow_date_gmt', + 'follow_user_id', + 'follow_followed_user_id', + 'follow_ip', + ], + 'storages' => [ + 'storage_id', + 'storage_api_id', + 'storage_name', + // 'storage_service', + 'storage_url', + // 'storage_bucket', + // 'storage_region', + // 'storage_server', + // 'storage_account_id', + // 'storage_account_name', + // 'storage_key', + // 'storage_secret', + // 'storage_is_https', + 'storage_is_active', + 'storage_capacity', + // 'storage_space_used', + 'storage_type_chain', + // 'storage_use_path_style_endpoint', + // 'storage_deleted_at', + ], + 'categories' => [ + 'category_id', + 'category_name', + 'category_url_key', + // 'category_description', + ], + ]; + public string $query; - public array $seek; + public array $seek = []; public string $seekEnd = ''; @@ -108,6 +403,15 @@ class Listing private ?string $outputTpl; + private array $first = []; + + private bool $isOutputAssoc = false; + + public function first(): array + { + return $this->first; + } + public function outputCount(): int { return $this->output_count; @@ -296,8 +600,7 @@ class Listing } /** - * Do the thing - * @Exeption 4xx + * @Exception 4xx */ public function exec() { @@ -588,7 +891,7 @@ class Listing } $sort_field = $type_singular . '_' . $this->sort_type; $key_field = $type_singular . '_id'; - if (isset($this->seek)) { + if ($this->seek !== []) { if (ends_with('date_gmt', $this->sort_type)) { $d = DateTime::createFromFormat('Y-m-d H:i:s', $this->seek[0]); if (! $d || $d->format('Y-m-d H:i:s') !== $this->seek[0]) { @@ -633,12 +936,15 @@ class Listing $limit = "\n" . 'LIMIT ' . ($this->limit + 1); // +1 allows to fetch "one extra" to detect prev/next pages } $base_table = $tables[$this->type]; + $joins = array_filter($joins); // Normal query if (empty($joins[$this->type])) { - $query = 'SELECT * FROM ' . $base_table; + $query = 'SELECT ' + . implode(', ', self::COLUMNS[$this->type]) + . ' FROM ' . $base_table; $query .= $this->where . $order_by . $limit; - // Alternative query } else { + // Alternative query if ($this->where !== '') { preg_match_all('/' . env()['CHEVERETO_DB_TABLE_PREFIX'] . '([\w_]+)\./', $this->where, $where_tables); $where_tables = array_values(array_diff(array_unique($where_tables[1]), [$this->type])); @@ -651,34 +957,113 @@ class Listing reset($joins); $join_tables = [key($joins)]; } + $joinSelect = [$this->type]; + $subSelectColumns = self::COLUMNS[$this->type]; $join = ''; if (is_iterable($join_tables)) { foreach ($join_tables as $join_table) { if (! empty($joins[$this->type][$join_table])) { $join .= "\n" . $joins[$this->type][$join_table]; unset($joins[$this->type][$join_table]); + $joinSelect[] = $join_table; + $subSelectColumns = array_merge( + $subSelectColumns, + self::COLUMNS_JOIN[$join_table] + ); } } } - // Get rid of the original Exif data (for listings) - $null_db = $this->type === 'images' - ? ', NULL as image_original_exifdata ' - : null; - $query = 'SELECT * ' - . $null_db - . 'FROM (SELECT * FROM ' + $outerColumns = [$this->type]; + $typeJoins = array_keys($joins[$this->type]); + foreach ($typeJoins as $joinKey) { + if (isset($joins[$joinKey])) { + array_push($outerColumns, ...array_keys($joins[$joinKey])); + } + array_push($outerColumns, $joinKey); + } + $outerColumns = array_unique($outerColumns); + $selectColumns = []; + foreach ($outerColumns as $columnName) { + $selectColumns = array_merge($selectColumns, self::COLUMNS_JOIN[$columnName]); + } + $selectColumns = array_merge($selectColumns, $subSelectColumns); + $selectColumns = array_unique($selectColumns); + $columns = implode(', ', $selectColumns); + $subColumns = implode(', ', $subSelectColumns); + $query = 'SELECT ' + . $columns + . ' FROM (SELECT ' + . $subColumns + . ' FROM ' . $base_table . $join . $this->where . $order_by . $limit - . ') ' - . $base_table; - if (! empty($joins[$this->type])) { - $query .= "\n" - . implode("\n", $joins[$this->type]); + . ') AS subquery '; + $topJoins = implode("\n", $joins[$this->type]); + $topJoins = str_replace( + "{$base_table}.", + 'subquery.', + $topJoins + ); + $query .= "\n" + . $topJoins; + $topOrder = str_replace( + "{$base_table}.", + 'subquery.', + $order_by + ); + $query .= $topOrder; + } + usort($this->binds, function ($a, $b) { + return strcmp($a['param'], $b['param']); + }); + $cacheable = Cache::isEnabled() + && $this->requester === []; + if ($cacheable) { + $listingPageBinds = []; + foreach ($this->binds as $k => $v) { + $listingPageBinds[$v['param']] = $v['value']; + } + // $rootBinds = $listingPageBinds; + // unset($rootBinds[':seekSort'], $rootBinds[':seekKey']); + // $listingHash = Cache::hash($query . serialize($rootBinds)); + $listingPageHash = Cache::hash($query . serialize($listingPageBinds)); + $cacheKeyListingPage = "l:{$listingPageHash}"; + $cached = Cache::instance()->get($cacheKeyListingPage); + if ($cached) { + $this->count = $cached['count']; + $this->has_page_next = $cached['has_page_next']; + $this->has_page_prev = $cached['has_page_prev']; + $this->nsfw = $cached['nsfw']; + $this->output = unserialize(gzuncompress($cached['output'])); + $filler = []; + foreach ($cached['joinSelect'] as $joinSelect) { + $filler = array_merge($filler, array_fill_keys(static::COLUMNS[$joinSelect], null)); + } + foreach ($this->output as $k => $v) { + $this->output[$k] = array_merge($filler, $v); + } + $this->output_count = $cached['output_count']; + $this->seek = $cached['seek']; + $this->seekEnd = $cached['seekEnd']; + $this->seekStart = $cached['seekStart']; + $this->sfw = $cached['sfw']; + $this->output_assoc = []; + $this->first = $cached['first']; + if (! $this->isOutputAssoc()) { + return; + } + $formatFunction = 'Chevereto\Legacy\Classes\\' . ucfirst(substr($this->type, 0, -1)); + foreach ($this->output as $k => $v) { + $this->output_assoc[] = $this->type === 'images' + ? $formatFunction::formatArray($v, fillAlbumCover: false) + : $formatFunction::formatArray($v); + } + + return; } - $query .= $order_by; } $db = DB::getInstance(); $this->query = $query; @@ -723,32 +1108,48 @@ class Listing $this->count = count($this->output); $this->nsfw = false; $this->output_assoc = []; - $formatfn = 'Chevereto\Legacy\Classes\\' . ucfirst(substr($this->type, 0, -1)); + $formatFunction = 'Chevereto\Legacy\Classes\\' . ucfirst(substr($this->type, 0, -1)); + $prefix = DB::getFieldPrefix($this->type) . '_'; + $ids = []; foreach ($this->output as $k => $v) { - $val = $formatfn::formatArray($v); - $this->output_assoc[] = $val; - if (! $this->nsfw && isset($val['nsfw']) && $val['nsfw']) { + if ($this->isOutputAssoc()) { + $this->output_assoc[] = $this->type === 'images' + ? $formatFunction::formatArray($v, fillAlbumCover: false) + : $formatFunction::formatArray($v); + } + $ids[] = $v[$prefix . 'id']; + if (! $this->nsfw && isset($v[$prefix . 'nsfw']) && $v[$prefix . 'nsfw']) { $this->nsfw = true; } } + if (in_array($this->type, ['images', 'albums'])) { + $this->first = $this->output_assoc[0] ?? $this->output[0] ?? []; + if ($this->first !== [] && $this->output_assoc === []) { + $this->first = $this->type === 'images' + ? $formatFunction::formatArray($this->first, fillAlbumCover: false) + : $formatFunction::formatArray($this->first); + } + } if ($this->type === 'albums') { $this->nsfw = false; } $this->sfw = ! $this->nsfw; Handler::setCond('show_viewer_zero', isset(request()['viewer']) && $this->count > 0); if ($this->type === 'albums' && $this->output !== []) { - $coverTpl = '(SELECT * - FROM %tImages% - LEFT JOIN %tStorages% ON %tImages%.image_storage_id = %tStorages%.storage_id - WHERE image_id = (SELECT album_cover_id FROM %tAlbums% WHERE album_id = %ALBUM_ID%) - AND %tImages%.image_is_approved = 1 - LIMIT 1)'; - $album_cover_qry_tpl = strtr($coverTpl, [ - '%tImages%' => $tables['images'], - '%tStorages%' => $tables['storages'], - '%tAlbums%' => $tables['albums'], - ]); - $albums_cover_qry_arr = []; + $selectColumns = array_merge( + self::COLUMNS['images'], + self::COLUMNS['storages'] + ); + $selectColumns = implode(', ', $selectColumns); + $inIds = implode(',', $ids); + $coverSQL = <<output as $k => &$album) { $album['album_id'] ??= ''; @@ -757,15 +1158,9 @@ class Listing $album['album_image_count'] = 0; } $album['album_image_count_label'] = _n('image', 'images', $album['album_image_count']); - $albums_cover_qry_arr[] = str_replace( - '%ALBUM_ID%', - $album['album_id'], - $album_cover_qry_tpl - ); $albums_mapping[$album['album_id']] = $k; } - $albums_slice_qry = implode("\n" . 'UNION ALL ' . "\n", $albums_cover_qry_arr); - $db->query($albums_slice_qry); + $db->query($coverSQL); $albums_slice = $db->fetchAll(); if (! empty($albums_slice)) { foreach ($albums_slice as $slice) { @@ -776,13 +1171,79 @@ class Listing if (! isset($this->output[$album_key]['album_images_slice'])) { $this->output[$album_key]['album_images_slice'] = []; } + foreach ($slice as $key => $value) { + if ($value === null) { + unset($slice[$key]); + } + } $this->output[$album_key]['album_images_slice'][] = $slice; } } } + if (! $cacheable) { + return; + } + $output = $this->output; + foreach ($output as $pos => $array) { + foreach ($array as $key => $value) { + if ($value === null) { + unset($output[$pos][$key]); + } + } + } + Cache::instance()->set( + $cacheKeyListingPage, + [ + 'first' => $this->first, + 'joinSelect' => $joinSelect ?? [], + 'count' => $this->count, + 'has_page_next' => $this->has_page_next, + 'has_page_prev' => $this->has_page_prev, + 'nsfw' => $this->nsfw, + 'output_count' => $this->output_count, + 'output' => gzcompress(serialize($output)), + 'seek' => $this->seek, + 'seekEnd' => $this->seekEnd, + 'seekStart' => $this->seekStart, + 'sfw' => $this->sfw, + ], + 300 + ); + $cacheType = match ($type_singular) { + 'image' => 'i', + 'album' => 'a', + 'user' => 'u', + 'tag' => 't', + default => throw new LogicException('Invalid cache type::' . $type_singular), + }; + $cache = Cache::instance(); + foreach ($ids as $id) { + $cacheKeyTypeIdListing = $cache->getKey("{$cacheType}:{$id}:l"); + $cacheValue = "{$listingPageHash}"; + $cache->redis()->sAdd($cacheKeyTypeIdListing, $cacheValue); + $cache->redis()->expire($cacheKeyTypeIdListing, 300); + } } - public static function getTabs($args = [], $autoParams = [], $expanded = false) + public static function deleteTypeIdCache(string $type, int ...$id): void + { + if (! Cache::isEnabled()) { + return; + } + $cache = Cache::instance(); + $redis = $cache->redis(); + foreach ($id as $item) { + $key = $cache->getKey("{$type}:{$item}:l"); + $set = $redis->sMembers($key) ?: []; + foreach ($set as $hash) { + $cacheKeyListing = $cache->getKey("l:{$hash}"); + $redis->del($cacheKeyListing); + $redis->sRem($key, $hash); + } + } + } + + public static function getTabs($args = [], &$autoParams = [], $expanded = false) { $default = [ 'list' => true, @@ -1037,6 +1498,7 @@ class Listing 'label' => $v['label'], 'id' => $id, 'params' => $http_build_query, + 'sort' => $params['sort'] ?? null, 'current' => false, 'type' => $content, 'url' => $url, @@ -1071,6 +1533,13 @@ class Listing } $tabs[$currentKey]['current'] = 1; self::fillCurrentTabPeekSeek($tabs, $currentKey, $autoParams); + $currentSort = explode('_', $tabs[$currentKey]['sort'] ?? ''); + if (count($currentSort) > 2) { + $autoParams['sort'] = [ + implode('_', array_slice($currentSort, 0, -1)), + end($currentSort), + ]; + } if ($expanded) { return [ 'tabs' => $tabs, @@ -1174,6 +1643,9 @@ class Listing /** @var callable $tagFn */ $tagFn = require_theme_file_return('snippets/tag'); $items = []; + // if (str_ends_with($tpl_list, 'album')) { + // $ids = array_column($this->output, 'album_id'); + // } foreach ($this->output as $pos => &$row) { switch ($tpl_list) { case 'image': @@ -1206,7 +1678,11 @@ class Listing break; } - $item = $Class::formatArray($row); + if ($Class === Image::class) { + $item = $Class::formatArray($row, fillAlbumCover: false); + } else { + $item = $Class::formatArray($row); + } if (str_ends_with($tpl_list, 'album') && $this->tagsString !== '') { $item['url'] .= '/?tag=' . rawurlencode($this->tagsString); } @@ -1310,6 +1786,11 @@ class Listing return $params; } + public function setOutputAssoc(bool $isOutputAssoc): void + { + $this->isOutputAssoc = $isOutputAssoc; + } + /** * validate_input aka "first stage validation" * This checks for valid input source data before exec @@ -1348,4 +1829,9 @@ class Listing { return ($this->where === '' ? 'WHERE ' : ($this->where . ' AND ')) . $where; } + + private function isOutputAssoc(): bool + { + return $this->isOutputAssoc; + } } diff --git a/app/src/Legacy/Classes/Login.php b/app/src/Legacy/Classes/Login.php index bcc8f3e..e6701ff 100644 --- a/app/src/Legacy/Classes/Login.php +++ b/app/src/Legacy/Classes/Login.php @@ -157,36 +157,6 @@ class Login } } - public static function addGuestContentToUser(array $user, int $id): void - { - if ($user === []) { - return; - } - foreach (['albums', 'images'] as $table) { - $sessionKey = 'guest_' . $table; - if (! is_array(session()[$sessionKey] ?? null)) { - continue; - } - - try { - $db = DB::getInstance(); - $getTable = DB::getTable($table); - $fieldPrefix = DB::getFieldPrefix($table); - $db->query('UPDATE ' . $getTable . ' SET ' . $fieldPrefix . '_user_id=' . $id . ' WHERE ' . $fieldPrefix . '_id IN (' . implode(',', session()[$sessionKey]) . ')'); - $db->exec(); - if ($db->rowCount() !== 0) { - DB::increment('users', [ - $fieldPrefix . '_count' => '+' . $db->rowCount(), - ], [ - 'id' => $id, - ]); - } - } catch (Exception) { - } // Silence - sessionVar()->remove($sessionKey); - } - } - public static function login(string|int $id, string $cookieType = 'cookie'): array { $id = (int) $id; @@ -195,7 +165,6 @@ class Login throw new Exception(sprintf('Invalid login $by %s', $cookieType), 600); } $user = User::getSingle($id, 'id'); - self::addGuestContentToUser($user, $id); RequestLog::delete([ 'user_id' => $id, 'result' => 'fail', diff --git a/app/src/Legacy/Classes/Page.php b/app/src/Legacy/Classes/Page.php index acd9888..1650ee0 100644 --- a/app/src/Legacy/Classes/Page.php +++ b/app/src/Legacy/Classes/Page.php @@ -13,10 +13,8 @@ namespace Chevereto\Legacy\Classes; use Chevereto\Config\Config; use function Chevereto\Legacy\G\get_base_url; -use function Chevereto\Legacy\G\get_file_extension; use function Chevereto\Legacy\G\is_url; use function Chevereto\Legacy\G\safe_html; -use function Chevereto\Legacy\G\str_replace_last; use function Chevereto\Vars\get; use function Chevereto\Vars\post; @@ -25,7 +23,6 @@ class Page public static array $table_fields = [ 'url_key', 'type', - 'file_path', 'link_url', 'icon', 'title', @@ -40,17 +37,17 @@ class Page 'code', ]; - public static function getSingle(string $var, $by = 'url_key'): array + public static function getSingle(string $var, string $by = 'url_key', bool $withCode = true): array { return []; } - public static function getAll(array $args = [], array $sort = []): array + public static function getAll(array $args = [], array $sort = [], bool $withCode = false): array { return []; } - public static function get(array $values, array $sort = [], ?int $limit = null): array + public static function get(array $values, array $sort = [], ?int $limit = null, bool $withCode = false): array { return []; } @@ -62,7 +59,12 @@ class Page public static function getFields(): array { - return self::$table_fields; + $fields = self::$table_fields; + if (Config::enabled()->phpPages()) { + $fields[] = 'file_path'; + } + + return $fields; } public static function update(int $id, array $values): int @@ -83,7 +85,6 @@ class Page 'link' => _s('Link'), ]; $page['type_tr'] = $type_tr[$page['type']]; - switch ($page['type']) { case 'internal': $page['url'] = get_base_url('page/' . $page['url_key']); @@ -93,28 +94,26 @@ class Page 'user' => null, // base ]; $file_basename = $page['url_key'] . '.php'; - foreach ($filepaths as $k => $v) { + foreach ($filepaths as $v) { if (is_readable(self::getPath($v) . $file_basename)) { $page['file_path'] = $v . $file_basename; } } - } else { - $page_extension = get_file_extension($page['file_path']); - if (! Config::enabled()->phpPages() && $page_extension == 'php') { - $page['file_path'] = str_replace_last($page_extension, 'html', $page['file_path']); - } + } elseif (Config::enabled()->phpPages()) { if ($page['internal'] === 'contact' - && (post() !== [] || (get()['sent'] ?? '0' == '1'))) { - $page_extension = 'php'; + && (post() !== [] || (get()['sent'] ?? '0' == '1')) + ) { $page['file_path'] = 'default/contact.php'; } } $page['file_path_absolute'] = self::getPath($page['file_path']); - if (! file_exists($page['file_path_absolute'])) { - self::writePage([ - 'file_path' => $page['file_path'], - 'code' => $page['code'] ?? '', - ]); + if (Config::enabled()->phpPages()) { + if (! file_exists($page['file_path_absolute'])) { + self::writePage([ + 'file_path' => $page['file_path'], + 'code' => $page['code'] ?? '', + ]); + } } break; diff --git a/app/src/Legacy/Classes/RequestLog.php b/app/src/Legacy/Classes/RequestLog.php index 7094a74..eda242c 100644 --- a/app/src/Legacy/Classes/RequestLog.php +++ b/app/src/Legacy/Classes/RequestLog.php @@ -14,6 +14,7 @@ namespace Chevereto\Legacy\Classes; use function Chevereto\Legacy\G\datetime; use function Chevereto\Legacy\G\datetimegmt; use function Chevereto\Legacy\G\get_client_ip; +use function Chevereto\Vars\env; class RequestLog { @@ -27,47 +28,85 @@ class RequestLog if (defined('PHPUNIT_CHEVERETO_TESTSUITE')) { return 0; } - if (!isset($values['ip'])) { + if (! isset($values['ip'])) { $values['ip'] = get_client_ip(); } $values['date'] = datetime(); $values['date_gmt'] = datetimegmt(); + $rows = DB::insert('requests', $values); + if ($rows && Cache::isEnabled()) { + $cache = Cache::instance(); + $redis = $cache->redis(); + $ip = inet_ntop(inet_pton($values['ip'])); + $key = Cache::instance()->getKey("ip:{$ip}:rl"); + $set = $redis->sMembers($key) ?: []; + foreach ($set as $hash) { + $cacheKeyLog = $cache->getKey("rl:{$hash}"); + $redis->del($cacheKeyLog); + $redis->sRem($key, $hash); + } + } - return DB::insert('requests', $values); + return $rows; } public static function getCounts(array|string $type, string $result, ?string $ip = null): array { + $ip ??= get_client_ip(); + if (Cache::isEnabled()) { + $hash = Cache::hash(serialize($type) . $result . $ip); + $cacheKey = "rl:{$hash}"; + $cached = Cache::instance()->get($cacheKey); + if ($cached) { + return $cached; + } + } if (is_array($type)) { - $type_qry = 'request_type IN('; + $whereType = 'request_type IN('; $binds = []; foreach ($type as $i => $singleType) { - $type_qry .= ':rt' . $i . ','; + $whereType .= ':rt' . $i . ','; $binds[':rt' . $i] = $singleType; } - $type_qry = rtrim($type_qry, ',') . ')'; + $whereType = rtrim($whereType, ',') . ')'; } else { - $type_qry = 'request_type=:request_type'; + $whereType = 'request_type=:request_type'; $binds = [ - ':request_type' => $type + ':request_type' => $type, ]; } - + $binds[':request_result'] = $result; + $binds[':request_ip'] = $ip; $db = DB::getInstance(); - $db->query('SELECT - COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MINUTE), 1, NULL)) AS minute, - COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR), 1, NULL)) AS hour, - COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 DAY), 1, NULL)) AS day, - COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 WEEK), 1, NULL)) AS week, - COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MONTH), 1, NULL)) AS month - FROM ' . DB::getTable('requests') . ' WHERE ' . $type_qry . ' AND request_result=:request_result AND request_ip=:request_ip AND request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MONTH)'); + $tableRequest = DB::getTable('requests'); + $sql = <<= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MINUTE), 1, NULL)) AS minute, + COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR), 1, NULL)) AS hour, + COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 DAY), 1, NULL)) AS day, + COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 WEEK), 1, NULL)) AS week, + COUNT(IF(request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MONTH), 1, NULL)) AS month + FROM `{$tableRequest}` WHERE request_result=:request_result + AND {$whereType} + AND request_ip=:request_ip + AND request_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 MONTH) + SQL; + $db->query($sql); foreach ($binds as $k => $v) { $db->bind($k, $v); } - $db->bind(':request_result', $result); - $db->bind(':request_ip', $ip ?: get_client_ip()); + $row = $db->fetchSingle(); + $ttl = (int) (env()['CHEVERETO_CACHE_TIME_MICRO'] ?? 60); + if (Cache::isEnabled()) { + Cache::instance()->set($cacheKey, $row, $ttl); + $redis = Cache::instance()->redis(); + $ip = inet_ntop(inet_pton($ip)); + $inverseKey = Cache::instance()->getKey("ip:{$ip}:rl"); + $redis->sAdd($inverseKey, $hash); + $redis->expire($inverseKey, $ttl); + } - return $db->fetchSingle(); + return $row; } public static function delete($values, $clause = 'AND'): int diff --git a/app/src/Legacy/Classes/Search.php b/app/src/Legacy/Classes/Search.php index ef6ec87..ab542c4 100644 --- a/app/src/Legacy/Classes/Search.php +++ b/app/src/Legacy/Classes/Search.php @@ -20,7 +20,7 @@ class Search public static array $excluded = ['storage', 'ip']; - public string $DBEngine; + public string $DBEngine = 'InnoDB'; public string $wheres; @@ -36,11 +36,6 @@ class Search public array $op; - public function __construct() - { - $this->DBEngine = DB::queryFetchSingle("SHOW TABLE STATUS WHERE Name = '" . DB::getTable('images') . "';")['Engine']; - } - public function build(): void { if (! in_array($this->type, ['images', 'albums', 'users'], true)) { @@ -171,6 +166,11 @@ class Search 'param' => ':q', 'value' => $q_value, ]; + $q_strip = preg_replace('/(-[\S]+|".+?")/u', '', $q_match); + $search_binds[] = [ + 'param' => ':like_q', + 'value' => '%' . $q_strip . '%', + ]; } $this->binds = $search_binds; $this->op = $search_op; @@ -178,7 +178,15 @@ class Search switch ($this->type) { case 'images': if ($q_match !== '') { - $wheres = 'WHERE MATCH(`image_name`,`image_title`,`image_description`,`image_original_filename`) AGAINST (:q IN BOOLEAN MODE)'; + $wheres = << 'WHERE MATCH(`user_name`,`user_username`) AGAINST (:q)', - 'email' => '`user_email` LIKE CONCAT("%", :q, "%")', + 'name_username' => << <<requester['is_content_manager'] ?? false) { $pos = strpos($this->q, '@'); diff --git a/app/src/Legacy/Classes/Settings.php b/app/src/Legacy/Classes/Settings.php index f4622f9..a2ddfbe 100644 --- a/app/src/Legacy/Classes/Settings.php +++ b/app/src/Legacy/Classes/Settings.php @@ -102,6 +102,18 @@ class Settings 'semantics_image' => 'Image', 'semantics_images' => 'Images', ], + [ + 'semantics_video' => 'Video', + 'semantics_videos' => 'Videos', + ], + [ + 'semantics_file' => 'File', + 'semantics_files' => 'Files', + ], + [ + 'semantics_tag' => 'Tag', + 'semantics_tags' => 'Tags', + ], [ 'semantics_user' => 'User', 'semantics_users' => 'Users', @@ -285,6 +297,16 @@ class Settings 'sdk_pup_url' => '', ], ], + 'CHEVERETO_ENABLE_API_USER' => ['0', + [ + 'enable_api_user' => false, + ], + ], + 'CHEVERETO_ENABLE_API_GUEST' => ['0', + [ + 'enable_api_guest' => false, + ], + ], ]; public const STOCK = [ @@ -391,6 +413,9 @@ class Settings 'website_search' => true, 'arachnid_api_username' => '', 'arachnid_api_password' => '', + 'theme_palette_user_select' => true, + 'enable_api_user' => true, + 'enable_api_guest' => false, ]; public const USERNAME_MIN_LENGTH = 3; @@ -438,10 +463,21 @@ class Settings protected static array $typeset = []; - protected static array $decrypted = []; - - public function __construct() + public function __construct(bool $reCache = false) { + if ($reCache === true) { + $cached = false; + } else { + $cached = Cache::instance()->get('settings'); + } + if ($cached) { + self::$settings = $cached['settings']; + self::$defaults = $cached['defaults']; + self::$typeset = $cached['typeset']; + self::$instance = $this; + + return; + } $settings = []; $defaults = []; $typeset = []; @@ -585,6 +621,7 @@ class Settings self::$typeset = $typeset; self::$instance = $this; self::update($db_settings_fix); + self::cache(); } public static function getInstance(): self @@ -655,11 +692,6 @@ class Settings return self::getDefaults($key); } - public static function setValues(array $values): void - { - self::$settings = $values; - } - public static function setValue(string $key, mixed $value): void { self::$settings[$key] = $value ?? null; @@ -674,6 +706,7 @@ class Settings <<bind($bindK, $bindV); } $db->exec(); + new self(reCache: true); return true; } @@ -766,7 +800,12 @@ class Settings $db->bind($bindK, $bindV); } - return $db->exec(); + $return = $db->exec(); + if ($return) { + self::cache(); + } + + return $return; } /** @@ -797,4 +836,16 @@ class Settings { return in_array($key, self::$envRestricted, true); } + + private static function cache(): void + { + Cache::instance()->set( + 'settings', + [ + 'settings' => self::$settings, + 'defaults' => self::$defaults, + 'typeset' => self::$typeset, + ] + ); + } } diff --git a/app/src/Legacy/Classes/Stat.php b/app/src/Legacy/Classes/Stat.php index a23d559..ec0a62c 100644 --- a/app/src/Legacy/Classes/Stat.php +++ b/app/src/Legacy/Classes/Stat.php @@ -23,9 +23,29 @@ class Stat { public static function getTotals(): array { - $res = DB::queryFetchSingle('SELECT * FROM ' . DB::getTable('stats') . ' WHERE stat_type = "total"'); + $columns = implode(', ', [ + 'stat_users', + 'stat_images', + 'stat_albums', + 'stat_tags', + 'stat_cron_runs', + 'stat_cron_time', + 'stat_image_views', + 'stat_album_views', + 'stat_image_likes', + 'stat_album_likes', + 'stat_disk_used', + ]); + $tableStats = DB::getTable('stats'); + $res = DB::queryFetchSingle( + << 'images', @@ -107,7 +132,7 @@ class Stat return; } $count = self::getTotals()[$envToStat[$env]] ?? 0; - if (($count + 1) > $maxLimit) { + if (($count + $add) > $maxLimit) { throw new OverflowException( message( 'Maximum %t% reached (limit %s%).', @@ -121,7 +146,7 @@ class Stat public static function rebuildTotals(): void { - $query = << env()['CHEVERETO_DB_TABLE_PREFIX'], ]); @@ -230,7 +255,7 @@ class Stat if (! isset($args['disk_sum'])) { throw new Exception('Missing disk_sum value', 603); } - $sql_tpl = << DB::getFieldPrefix($args['table']), @@ -292,7 +317,7 @@ class Stat case 'delete': switch ($args['table']) { case 'images': - $sql_tpl = <<query($query); if ($storageId !== 0) { diff --git a/app/src/Legacy/Classes/Tag.php b/app/src/Legacy/Classes/Tag.php index 2f38e8c..5c45de5 100644 --- a/app/src/Legacy/Classes/Tag.php +++ b/app/src/Legacy/Classes/Tag.php @@ -86,7 +86,6 @@ final class Tag $array = explode(',', $tags); $array = array_map(function (string $value) { return trim($value); - // return strip_tags_content($value); }, $array); $array = array_unique($array); $array = array_filter($array); @@ -139,16 +138,12 @@ final class Tag ]); } $select = implode(',', $select); - $query = << $select, - ]); + SQL; $db->query($query); foreach ($binds as $pos => $v) { $db->bind($pos, $v); @@ -162,14 +157,14 @@ final class Tag $limit = max(1, $limit); $db = DB::getInstance(); $tagsTable = DB::getTable('tags'); - $query = <<query($query); $db->bind(':try', $try . '%'); @@ -178,6 +173,24 @@ final class Tag public static function insert(int $user_id, string ...$tag): void { + if ($tag === []) { + return; + } + $maxTags = (int) env()['CHEVERETO_MAX_TAGS']; + if ($maxTags > 0) { + $currentTotalTags = Stat::getTotals()['tags'] ?? 0; + if ($currentTotalTags >= $maxTags) { + return; + } + $count = count($tag); + $newTotalTags = $currentTotalTags + $count; + if ($newTotalTags > $maxTags) { + $excessTags = $newTotalTags - $maxTags; + if ($excessTags > 0) { + $tag = array_slice($tag, 0, $count - $excessTags); + } + } + } if ($tag === []) { return; } @@ -187,7 +200,7 @@ final class Tag $binds = [ ':tag_user_id' => $user_id, ]; - $template = << $name) { static::assert($name); $sql .= str_replace('%', $pos, $template); @@ -294,12 +307,12 @@ final class Tag $tagsTable = DB::getTable('tags'); $statsTable = DB::getTable('stats'); $db = DB::getInstance(); - $sql = <<query($sql); - return $db->exec(); + $return = $db->exec(); + if ($return) { + Listing::deleteTypeIdCache('t', ...$id); + } + + return $return; } public static function formatArray(array $object): array diff --git a/app/src/Legacy/Classes/Tags.php b/app/src/Legacy/Classes/Tags.php new file mode 100644 index 0000000..25a48d3 --- /dev/null +++ b/app/src/Legacy/Classes/Tags.php @@ -0,0 +1,49 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Throwable; + +final class Tags +{ + public const CACHE_KEY = 'tags_top'; + + public static function top(): array + { + $tagsTop = []; + $cached = Cache::instance()->get(self::CACHE_KEY); + if ($cached) { + return $cached; + } + + try { + $tagsTable = DB::getTable('tags'); + $rows = DB::queryFetchAll( + << $v) { + $tag = array_merge($v, Tag::row($v['name'])); + $tagsTop[] = $tag; + } + } catch (Throwable) { + } + + Cache::instance()->set(self::CACHE_KEY, $tagsTop, 1800); + + return $tagsTop; + } +} diff --git a/app/src/Legacy/Classes/Traits/BinaryTrait.php b/app/src/Legacy/Classes/Traits/BinaryTrait.php new file mode 100644 index 0000000..7020d09 --- /dev/null +++ b/app/src/Legacy/Classes/Traits/BinaryTrait.php @@ -0,0 +1,45 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes\Traits; + +use RuntimeException; +use Symfony\Component\Process\ExecutableFinder; + +trait BinaryTrait +{ + private string $path; + + public function __construct( + string $binary + ) { + $name = $this->name(); + if ($binary === '') { + throw new RuntimeException("{$name} binary not provided", 1); + } + $finder = new ExecutableFinder(); + $binary = $finder->find($binary); + if ($binary === null) { + throw new RuntimeException("{$name} binary not found", 2); + } + if (! is_executable($binary)) { + throw new RuntimeException("{$name} binary is not executable", 3); + } + $this->path = $binary; + } + + abstract public function name(): string; + + public function path(): string + { + return $this->path; + } +} diff --git a/app/src/Legacy/Classes/Upload.php b/app/src/Legacy/Classes/Upload.php index 97460cd..b7e5e54 100644 --- a/app/src/Legacy/Classes/Upload.php +++ b/app/src/Legacy/Classes/Upload.php @@ -15,9 +15,14 @@ use Chevereto\Config\Config; use Exception; use Intervention\Image\ImageManagerStatic; use LogicException; +use PHPExif\Adapter\Exiftool as ExifToolAdapter; +use PHPExif\Enum\ReaderType as ExifReaderType; use PHPExif\Exif; +use PHPExif\Reader\Reader as ExifReader; +use RuntimeException; use Throwable; use function Chevere\Message\message; +use function Chevereto\Legacy\G\absolute_to_url; use function Chevereto\Legacy\G\add_ending_slash; use function Chevereto\Legacy\G\ends_with; use function Chevereto\Legacy\G\fetch_url; @@ -96,6 +101,8 @@ class Upload private string $source_filename; + private ?string $checksum = null; + public function uploaded(): array { return $this->uploaded; @@ -183,6 +190,11 @@ class Upload $this->name = $name; } + public function setChecksum(string $checksum): void + { + $this->checksum = $checksum; + } + public function setOptions(array $options): void { $this->options = $options; @@ -212,7 +224,11 @@ class Upload if (! is_array($this->options['allowed_formats'])) { $this->options['allowed_formats'] = explode(',', $this->options['allowed_formats']); } - $this->source_name = get_basename_without_extension($this->type === 'url' ? $this->source : $this->source['name']); + $this->source_name = get_basename_without_extension( + $this->type === 'url' + ? $this->source + : $this->source['name'] + ); $this->extension = $this->source_image_fileinfo['extension']; if ($this->extension === 'jpeg' && $this->source_extension === 'jpg') { $this->extension = 'jpg'; @@ -224,15 +240,45 @@ class Upload if (get_file_extension($this->name) === $this->extension) { $this->name = get_basename_without_extension($this->name); } - $this->fixed_filename = preg_replace('/(.*)\.(th|md|original|lg)\.([\w]+)$/', '$1.$3', $this->name . '.' . $this->extension); + $this->fixed_filename = preg_replace( + '/(.*)\.(th|md|original|lg)\.([\w]+)$/', + '$1.$3', + $this->name . '.' . $this->extension + ); $is_360 = false; if (in_array($this->extension, ['jpg', 'jpeg'], true)) { + $exifToolBinary = env()['CHEVERETO_BINARY_EXIFTOOL'] ?? ''; + if ($exifToolBinary !== '') { + try { + $exifTool = new ExifTool($exifToolBinary); + } catch (RuntimeException) { + } + // ExifTool adapter doesn't work with SONY exif + // Mind to check in the future? + // $adapter = new ExifToolAdapter([ + // 'toolPath' => $exifTool->binary(), + // ]); + // $reader = new ExifReader($adapter); + } + $exifTranBinary = env()['CHEVERETO_BINARY_EXIFTRAN'] ?? ''; + if ($exifTranBinary !== '') { + try { + $exifTran = new ExifTran($exifTranBinary); + } catch (RuntimeException) { + } + } + $reader = ExifReader::factory(ExifReaderType::NATIVE); $xmpDataExtractor = new XmpMetadataExtractor(); $xmpData = $xmpDataExtractor->extractFromFile($this->downstream); - $reader = \PHPExif\Reader\Reader::factory(\PHPExif\Reader\Reader::TYPE_NATIVE); $is_360 = false; - if (isset($xmpData['rdf:RDF']['rdf:Description']['@attributes']['ProjectionType'])) { - $is_360 = $xmpData['rdf:RDF']['rdf:Description']['@attributes']['ProjectionType'] === 'equirectangular'; + if ($xmpData['rdf:RDF']['rdf:Description'] ?? false) { + $projectionType = $xmpData['rdf:RDF']['rdf:Description']['@attributes']['ProjectionType'] + ?? $xmpData['rdf:RDF']['rdf:Description'][0]['GPano:ProjectionType'] + ?? ''; + $usePanoramaViewer = $xmpData['rdf:RDF']['rdf:Description'][0]['GPano:UsePanoramaViewer'] + ?? ''; + $is_360 = strtolower($projectionType) === 'equirectangular' + || strtolower($usePanoramaViewer) === 'true'; } if (array_key_exists('exif', $this->options)) { try { @@ -247,22 +293,30 @@ class Upload $orientation = false; } if ($orientation !== false) { - ImageManagerStatic::make($this->downstream)->orientate()->save(); + if (isset($exifTran)) { + $exifTran->orientate($this->downstream); + } else { + ImageManagerStatic::make($this->downstream)->orientate()->save(); + } } } if (! $this->options['exif']) { $this->source_image_exif = null; - if (ImageManagerStatic::getManager()->config['driver'] === 'imagick') { - $img = ImageManagerStatic::make($this->downstream); - $img->getCore()->stripImage(); - $img->save(); + if (isset($exifTool)) { + $exifTool->strip($this->downstream); } else { - $img = @imagecreatefromjpeg($this->downstream); - if ($img) { - imagejpeg($img, $this->downstream, 90); - imagedestroy($img); + if (ImageManagerStatic::getManager()->config['driver'] === 'imagick') { + $img = ImageManagerStatic::make($this->downstream); + $img->getCore()->stripImage(); + $img->save(); } else { - throw new Exception('Unable to create a new JPEG without Exif data', 644); + $img = @imagecreatefromjpeg($this->downstream); + if ($img) { + imagejpeg($img, $this->downstream, 90); + imagedestroy($img); + } else { + throw new Exception('Unable to create a new JPEG without Exif data', 644); + } } } } @@ -296,7 +350,7 @@ class Upload } try { - $uploaded = rename($this->downstream, $this->uploaded_file); + $uploaded = rename($this->downstream, $this->uploaded_file); // slow: 6s } catch (Throwable) { $uploaded = file_exists($this->uploaded_file); } @@ -312,12 +366,10 @@ class Upload } catch (Throwable) { } } - $fileInfo = $this->mediaType === 'video' - ? get_video_fileinfo($this->uploaded_file) - : get_image_fileinfo($this->uploaded_file); - if ($fileInfo === []) { - throw new Exception("Can't get uploaded info", 610); - } + $fileInfo = $this->source_image_fileinfo; + $fileInfo['filename'] = basename($this->uploaded_file); + $fileInfo['name'] = get_basename_without_extension($this->uploaded_file); + $fileInfo['url'] = absolute_to_url($this->uploaded_file); $fileInfo['is_360'] = $is_360; $frameFile = null; if ($this->mediaType === 'video') { @@ -355,15 +407,18 @@ class Upload ]; } - public static function getTempNam(string $failoverDirectory = ''): string + public static function getTempNam(string $failoverDir = '', string $suffix = ''): string { - if ($failoverDirectory === '') { - $failoverDirectory = sys_get_temp_dir(); + if ($failoverDir === '') { + $failoverDir = sys_get_temp_dir(); } - $prefix = env()['CHEVERETO_ID_HANDLE'] . 'chvtemp_'; - $tempNam = @tempnam(sys_get_temp_dir(), $prefix); + $chvIdPrefix = 'chv' + . env()['CHEVERETO_ID'] + . '_upload_' + . $suffix; + $tempNam = @tempnam(sys_get_temp_dir(), $chvIdPrefix); if (! $tempNam || ! @is_writable($tempNam)) { - $tempNam = @tempnam($failoverDirectory, $prefix); + $tempNam = @tempnam($failoverDir, $chvIdPrefix); if (! $tempNam) { throw new Exception("Can't get a tempnam", 600); } @@ -519,8 +574,8 @@ class Upload ? 'video' : 'image'; $this->source_image_fileinfo = $this->mediaType === 'video' - ? get_video_fileinfo($this->downstream) - : get_image_fileinfo($this->downstream); + ? get_video_fileinfo($this->downstream, $this->checksum) + : get_image_fileinfo($this->downstream, $this->checksum); if ($this->source_image_fileinfo === []) { throw new Exception("Can't get target upload source info", 610); } @@ -547,7 +602,7 @@ class Upload if ($this->source_image_fileinfo['extension'] === 'bmp') { $this->ImageConvert = new ImageConvert($this->downstream, 'png', $this->downstream); $this->downstream = $this->ImageConvert->out(); - $this->source_image_fileinfo = get_image_fileinfo($this->downstream); + $this->source_image_fileinfo = get_image_fileinfo($this->downstream, $this->checksum); } if ($this->source_image_fileinfo['extension'] === 'webp' && is_animated_webp($this->downstream) @@ -555,7 +610,6 @@ class Upload ) { throw new Exception('Animated WebP is not supported', 400); } - if ($this->mediaType === 'video') { return; } diff --git a/app/src/Legacy/Classes/Uploads.php b/app/src/Legacy/Classes/Uploads.php new file mode 100644 index 0000000..14d568c --- /dev/null +++ b/app/src/Legacy/Classes/Uploads.php @@ -0,0 +1,95 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Legacy\Classes; + +use Exception; +use PDO; +use function Chevereto\Legacy\getVariable; + +final class Uploads +{ + /** + * @return array The file path, and the upload params + */ + public static function join( + string $uploadPath, + int $uploadId, + string $token, + string $hash + ): array { + $calcHash = hash_hmac( + 'sha256', + $uploadId . $token, + getVariable('crypt_salt')->string() + ); + if (! hash_equals($calcHash, $hash)) { + throw new Exception('Invalid hash', 100); + } + $uploadsTable = DB::getTable('uploads'); + $uploadChunksTable = DB::getTable('uploads_chunks'); + $uploadSQL = <<query($uploadSQL); + $db->bind(':upload_id', $uploadId); + $db->bind(':token', $token); + $upload = $db->fetchSingle(); + if ($upload === false) { + throw new Exception('Invalid upload', 403); + } + $params = json_decode($upload['params'], true); + $chunks = $db->query($chunksSQL); + $db->bind(':upload_id', $uploadId); + $chunks = $db->fetchAll(PDO::FETCH_KEY_PAIR); + if ($chunks === false) { + throw new Exception('Missing chunked map', 403); + } + $tempName = Upload::getTempNam($uploadPath); + $chunkedFile = fopen($tempName, 'w'); + if ($chunkedFile === false) { + throw new Exception('Unable to open chunked file', 600); + } + foreach ($chunks as $chunkPath) { + if (! is_file($chunkPath)) { + throw new Exception('Missing chunk', 403); + } + $chunkFile = fopen($chunkPath, 'rb'); + if (! $chunkFile) { + throw new Exception('Unable to open chunk', 600); + } + if (stream_copy_to_stream($chunkFile, $chunkedFile) === false) { + fclose($chunkFile); + + throw new Exception('Failed copying chunk', 600); + } + fclose($chunkFile); + unlink($chunkPath); + } // slow: 4s + fclose($chunkedFile); + DB::delete('uploads', [ + 'id' => $uploadId, + ]); + + return [$tempName, $params]; + } +} diff --git a/app/src/Legacy/Classes/User.php b/app/src/Legacy/Classes/User.php index cf4ada5..99e6054 100644 --- a/app/src/Legacy/Classes/User.php +++ b/app/src/Legacy/Classes/User.php @@ -100,48 +100,81 @@ class User ]; } + public static function getCacheKey(int $id, string ...$locator): string + { + $components = ['u', (string) $id]; + array_push($components, ...$locator); + + return implode(':', $components); + } + + public static function deleteAlbumsCache(int $userId): void + { + $cacheKey = static::getCacheKey($userId, 'albums'); + Cache::instance()->delete($cacheKey); + } + public static function getAlbums(int|array $var): array { $id = is_array($var) ? $var['id'] : $var; - $user_albums = []; - $user_stream = self::getStreamAlbum($var); - if (is_array($user_stream)) { - $user_albums['stream'] = $user_stream; - } - $map = []; - $children = []; - $db = DB::getInstance(); - $db->query( - 'SELECT * FROM ' - . DB::getTable('albums') - . ' WHERE album_user_id=:image_user_id ORDER BY album_parent_id ASC, album_name ASC LIMIT :limit' - ); - $db->bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST'] ?? 500)); - $db->bind(':image_user_id', $id); - $user_albums_db = $db->fetchAll(); - if ($user_albums_db) { - $user_albums += $user_albums_db; - } - foreach ($user_albums as $k => &$v) { - $album_id = isset($v['album_id']) - ? $v['album_id'] - : 'stream'; - $map[$album_id] = $k; - $parent_id = $v['album_parent_id'] ?? null; - if (isset($v['album_image_count']) && $v['album_image_count'] < 0) { - $v['album_image_count'] = 0; + $cacheKey = static::getCacheKey($id, 'albums'); + $cached = Cache::instance()->get($cacheKey) ?: []; + if ($cached) { + [$userAlbums, $children, $map] = $cached; + } else { + $userAlbums = []; + $user_stream = self::getStreamAlbum($var); + if ($user_stream === null || $user_stream['user_album_count'] === 0) { + return []; } - $children[$parent_id][$album_id] = $v['album_name']; - if (isset($parent_id)) { - asort($children[$parent_id]); + unset($user_stream['user_album_count']); + $userAlbums['stream'] = $user_stream; + $map = []; + $children = []; + $columns = [ + 'album_id', + 'album_name', + 'album_privacy', + 'album_parent_id', + 'album_image_count', + 'album_cover_id', + ]; + $columnsString = implode(', ', $columns); + $tableAlbums = DB::getTable('albums'); + $db = DB::getInstance(); + $db->query( + <<bind(':limit', intval(env()['CHEVERETO_MAX_USER_ALBUMS_LIST'])); + $db->bind(':image_user_id', $id); + $user_albums_db = $db->fetchAll(); + if ($user_albums_db) { + $userAlbums += $user_albums_db; } - } - if (count($children[''] ?? []) === 0) { - return []; + foreach ($userAlbums as $k => &$v) { + $album_id = isset($v['album_id']) + ? $v['album_id'] + : 'stream'; + $map[$album_id] = $k; + $parent_id = $v['album_parent_id'] ?? null; + if (isset($v['album_image_count']) && $v['album_image_count'] < 0) { + $v['album_image_count'] = 0; + } + $children[$parent_id][$album_id] = $v['album_name']; + if (isset($parent_id)) { + asort($children[$parent_id]); + } + } + Cache::instance()->set($cacheKey, [$userAlbums, $children, $map], 3600); } $list = []; - foreach (array_keys($children['']) as $key) { - self::iterate((string) $key, $children, $list, $user_albums, $map, 0); + foreach (array_keys($children[''] ?? []) as $key) { + self::iterate((string) $key, $children, $list, $userAlbums, $map, 0); } return $list; @@ -160,6 +193,7 @@ class User 'album_user_id' => $user['id'], 'album_privacy' => 'public', 'album_url' => $user['url'], + 'user_album_count' => (int) ($user['album_count'] ?? 0), ]; } @@ -237,7 +271,11 @@ class User ); if (! Login::isAdmin()) { $db = DB::getInstance(); - $db->query('SELECT COUNT(*) c FROM ' . DB::getTable('users') . ' WHERE user_registration_ip=:ip AND user_status != "valid" AND user_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 2 DAY)'); + $db->query( + 'SELECT COUNT(*) c FROM ' + . DB::getTable('users') + . ' WHERE user_registration_ip=:ip AND user_status != "valid" AND user_date_gmt >= DATE_SUB(UTC_TIMESTAMP(), INTERVAL 2 DAY)' + ); $db->bind(':ip', $values['registration_ip']); if ($db->fetchSingle()['c'] > 5) { throw new Exception('Flood detected', 666); @@ -546,31 +584,22 @@ class User '%user_id' => $user['id'], ]); DB::queryExecute($sql); - DB::delete('albums', [ - 'user_id' => $user['id'], - ]); - DB::delete('images', [ - 'user_id' => $user['id'], - ]); - DB::delete('login_connections', [ - 'user_id' => $user['id'], - ]); - DB::delete('login_cookies', [ - 'user_id' => $user['id'], - ]); - DB::delete('login_passwords', [ - 'user_id' => $user['id'], - ]); - DB::delete('likes', [ - 'user_id' => $user['id'], - ]); - DB::delete('follows', [ - 'user_id' => $user['id'], - 'followed_user_id' => $user['id'], - ], 'OR'); - DB::delete('users', [ - 'id' => $user['id'], - ]); + $deleteTemplate = <<get('variables'); + } + if ($cached) { + static::$variables = $cached; + static::$instance = $this; + + return; + } + try { $rows = DB::get( table: 'variables', @@ -78,6 +90,7 @@ class Variable ); } static::$instance = $this; + Cache::instance()->set('variables', static::$variables); } public static function getAll(): array @@ -130,6 +143,7 @@ class Variable value: $value, type: $type, ); + Cache::instance()->set('variables', static::$variables); } return $return; @@ -165,6 +179,7 @@ class Variable ] ); unset(static::$variables[$name]); + Cache::instance()->set('variables', static::$variables); return $return; } diff --git a/app/src/Legacy/G/DB.php b/app/src/Legacy/G/DB.php index 91cdd0f..73375d2 100644 --- a/app/src/Legacy/G/DB.php +++ b/app/src/Legacy/G/DB.php @@ -261,7 +261,8 @@ class DB array $sort = [], ?int $limit = null, int $fetch_style = PDO::FETCH_ASSOC, - array $valuesOperators = [] + array $valuesOperators = [], + array $columns = [], ): mixed { if (! is_array($where) && $where !== 'all') { throw new Exception('Expecting array values, ' . gettype($where) . ' given'); @@ -272,7 +273,13 @@ class DB $table = $table['table']; } $table = self::getTable($table); - $query = 'SELECT * FROM ' . $table; + $selectColumns = implode(', ', $columns); + if (empty($selectColumns)) { + $selectColumns = '*'; + } + $query = <<fetchAll($mode) ?: []; } + /** + * @param string $table Table name (no prefix). + * @param string $constraint Foreign key name (no prefix). + */ + public function getSqlDropForeignKey(string $table, string $constraint): string + { + $table = self::getTable($table); + $constraint = self::getTable($constraint); + $stmt = static::$dbh->prepare( + <<execute([$table, $constraint]); + if ($stmt->fetchColumn() > 0) { + return <<prepare( + <<execute([$table, $index]); + if ($stmt->fetchColumn() > 0) { + return <<handled_request; } - public function request_array(): array - { - return $this->request_array; - } - public function template(): string { return $this->template; @@ -209,6 +206,11 @@ class Handler $this->template = $template; } + public function setContent(string $content): void + { + $this->content = $content; + } + public function setPathTheme(string $path): void { $this->path_theme = $path; @@ -477,10 +479,14 @@ class Handler return (bool) preg_match('{index\.php$}', ltrim($this->script_name, '/')); } - private function loadTemplate(?string $template = null): void + private function loadTemplate(): void { - if ($template !== null) { - $this->template = $template; + if (isset($this->content)) { + require_theme_header(); + echo $this->content; + require_theme_footer(); + + return; } $functions_basename = 'functions.php'; $template_functions = [ diff --git a/app/src/Legacy/G/functions.php b/app/src/Legacy/G/functions.php index 2e16987..a2295a6 100644 --- a/app/src/Legacy/G/functions.php +++ b/app/src/Legacy/G/functions.php @@ -23,6 +23,7 @@ use GdImage; use LogicException; use Throwable; use function Chevereto\Legacy\getCheveretoEnv; +use function Chevereto\Legacy\hashFile; use function Chevereto\Vars\env; use function Chevereto\Vars\server; use function Safe\curl_exec; @@ -2453,13 +2454,13 @@ function extension_to_mime(string $ext): string function get_ffmpeg_error(Throwable $e): string { $previous = $e->getPrevious() ? - (': ' . $e->getPrevious()->getMessage()) : + (' [' . $e->getPrevious()->getMessage() . ']') : ''; return $e->getMessage() . $previous; } -function get_video_fileinfo(string $file): array +function get_video_fileinfo(string $file, ?string $checksum = null): array { clearstatcache(true, $file); @@ -2504,12 +2505,12 @@ function get_video_fileinfo(string $file): array 'bits' => $all['bits_per_raw_sample'] ?? 0, 'channels' => '', 'url' => absolute_to_url($file), - 'md5' => md5_file($file), + 'checksum' => $checksum ?? hashFile($file), 'duration' => (int) $duration, ]; } -function get_image_fileinfo(string $file): array +function get_image_fileinfo(string $file, ?string $checksum = null): array { clearstatcache(true, $file); $info = getimagesize($file); @@ -2533,7 +2534,7 @@ function get_image_fileinfo(string $file): array 'bits' => $info['bits'] ?? '', 'channels' => $info['channels'] ?? '', 'url' => absolute_to_url($file), - 'md5' => md5_file($file), + 'checksum' => $checksum ?? hashFile($file), ]; } diff --git a/app/src/Legacy/functions-render.php b/app/src/Legacy/functions-render.php index 922e54c..a6cbbfd 100644 --- a/app/src/Legacy/functions-render.php +++ b/app/src/Legacy/functions-render.php @@ -161,13 +161,14 @@ function get_checkbox_html($options = []) ' ' . "\n" . ''; } -function get_captcha_component($id = 'g-recaptcha') +function get_captcha_component() { return match (getSetting('captcha_api')) { - '2', 'hcaptcha' => [ - 'captcha_html', strtr('
    ', [ - '%id' => $id, - ])], + '2', 'hcaptcha', 'turnstile' => [ + 'captcha_html', strtr('
    ', [ + '%api' => getSetting('captcha_api'), + ]), + ], '3' => ['recaptcha_invisible_html', get_captcha_invisible_html()], default => throw new LogicException(message('Invalid captcha API')), }; @@ -367,7 +368,7 @@ function include_peafowl_foot() { display_cookie_law_banner(); $resources = [ - // 'chevereto' => PATH_PUBLIC_CONTENT_LEGACY_THEMES_PEAFOWL_LIB . 'chevereto-all.js', + 'chevereto' => PATH_PUBLIC_CONTENT_LEGACY_THEMES_PEAFOWL_LIB . 'chevereto-all.js', 'chevereto' => PATH_PUBLIC_CONTENT_LEGACY_THEMES_PEAFOWL_LIB . 'chevereto-all.min.js', ]; foreach ($resources as $k => &$v) { @@ -385,6 +386,13 @@ function include_peafowl_foot() theme: "%t" }); JS, + 'turnstile' => << << '', 'hcaptcha' => '', '3' => '', + 'turnstile' => '', default => throw new LogicException(message('Invalid captcha API')), }; } @@ -1051,7 +1060,9 @@ function arr_printer($arr, $tpl = '', $wrap = []) } function versionize_src($src) { - return $src . '?' . md5(get_chevereto_version()); + return $src + . '?' + . hashString(get_chevereto_version()); } function show_banner($banner, $sfw = true) { diff --git a/app/src/Legacy/functions.php b/app/src/Legacy/functions.php index 68ef509..b54ac52 100644 --- a/app/src/Legacy/functions.php +++ b/app/src/Legacy/functions.php @@ -20,7 +20,10 @@ use Chevere\xrDebug\PHP\Xr; use Chevere\xrDebug\PHP\XrInstance; use Chevereto\Config\Config; use Chevereto\Legacy\Classes\AssetStorage; +use Chevereto\Legacy\Classes\Cache; use Chevereto\Legacy\Classes\DB; +use Chevereto\Legacy\Classes\KeyValue; +use Chevereto\Legacy\Classes\KeyValueNull; use Chevereto\Legacy\Classes\L10n; use Chevereto\Legacy\Classes\Login; use Chevereto\Legacy\Classes\Mailer; @@ -34,6 +37,7 @@ use Chevereto\Vars\EnvVar; use Chevereto\Vars\FilesVar; use Chevereto\Vars\GetVar; use Chevereto\Vars\PostVar; +use Chevereto\Vars\RequestHeadersVar; use Chevereto\Vars\RequestVar; use Chevereto\Vars\ServerVar; use Chevereto\Vars\SessionVar; @@ -45,6 +49,7 @@ use OutOfBoundsException; use OverflowException; use PDO; use PHPMailer\PHPMailer\SMTP; +use Redis; use RuntimeException; use Throwable; use function Chevere\Filesystem\filePhpForPath; @@ -64,7 +69,7 @@ use function Chevereto\Legacy\G\get_bytes; use function Chevereto\Legacy\G\get_client_ip; use function Chevereto\Legacy\G\get_current_url; use function Chevereto\Legacy\G\get_file_extension; -use function Chevereto\Legacy\G\get_image_fileinfo as GGet_image_fileinfo; +use function Chevereto\Legacy\G\get_image_fileinfo; use function Chevereto\Legacy\G\get_ini_bytes; use function Chevereto\Legacy\G\get_public_url; use function Chevereto\Legacy\G\hasEnvDbInfo; @@ -264,28 +269,28 @@ function get_chv_default_setting(string $value = '', bool $safe = false): mixed return $safe ? safe_html($return) : $return; } -function getStorages(): array|bool +function getStoragesFormList(): array { - $where = []; if (version_compare(cheveretoVersionInstalled(), '4.2.0', '>=')) { - $where = [ - 'deleted_at' => null, - ]; - } - $storages = DB::get( - table: 'storages', - where: $where, - ); - if ($storages) { - foreach ($storages as $k => $v) { - $storages[$k] = DB::formatRow($v); - } - $return = $storages; + $where = 'WHERE storage_deleted_at IS NULL'; } else { - $return = false; + $where = ''; + } + $db = DB::getInstance(); + $tableStorages = DB::getTable('storages'); + $db->query( + <<fetchAll() ?: []; + foreach ($rows as &$v) { + $v = DB::formatRow($v); } - return $return; + return $rows; } function get_banner_code(string $banner, bool $safe_html = true): string @@ -376,6 +381,10 @@ function getSystemNotices(): array } if (preg_match('/@chevereto\.example/', getSetting('email_from_email')) || preg_match('/@chevereto\.example/', getSetting('email_incoming_email')) + || ( + env()['CHEVERETO_SERVICING'] !== 'server' + && empty(getSetting('email_smtp_server')) + ) ) { $system_notices[] = _s( "You haven't changed the default email settings. Go to %emailSettings% to fix this.", @@ -395,9 +404,9 @@ function getSystemNotices(): array [ // '%c' => $minActiveStorages, '%s' => '' - . _s('External storage') + . _s('Upload storage') . '', ] ); @@ -413,9 +422,9 @@ function getSystemNotices(): array $system_notices[] = _s( 'You need to configure %s to upload website assets.', '' - . _s('Asset storage') + . _s('Site storage') . '' ); } @@ -457,21 +466,33 @@ function captcha_check(): object { if (getSetting('captcha_api') == '3') { return (object) [ - 'is_valid' => sessionVar()->hasKey('isHuman') + 'is_valid' => sessionVar()->has('isHuman') ? (bool) session()['isHuman'] : false, ]; } - $endpoint = match (getSetting('captcha_api')) { - '2' => 'https://www.recaptcha.net/recaptcha/api/siteverify', - 'hcaptcha' => 'https://hcaptcha.com/siteverify', - default => throw new LogicException(message('Invalid captcha API')), - }; + switch (getSetting('captcha_api')) { + case '2': + $endpoint = 'https://www.recaptcha.net/recaptcha/api/siteverify'; + $response = post()['g-recaptcha-response'] ?? ''; + + break; + case 'hcaptcha': + $endpoint = 'https://hcaptcha.com/siteverify'; + $response = post()['h-captcha-response'] ?? ''; + + break; + case 'turnstile': + $endpoint = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'; + $response = post()['cf-turnstile-response'] ?? ''; + + break; + default: + throw new LogicException(message('Invalid captcha API')); + } $params = [ 'secret' => getSetting('captcha_secret'), - 'response' => post()['g-recaptcha-response'] - ?? post()['h-captcha-response'] - ?? '', + 'response' => $response, 'remoteip' => get_client_ip(), ]; $fetch = fetch_url( @@ -674,7 +695,7 @@ function sessionCrypt(string $string, bool $encrypt = true): string|bool * @var string $iv */ $fn = 'openssl_' . ($encrypt ? 'encrypt' : 'decrypt'); - $secret = md5( + $secret = hashString( getVariable('crypt_salt')->nullString() ?? '' ); @@ -798,7 +819,7 @@ function upload_to_content_images(array $source, string $what): void } $name = $typeArr[$what]['name']; if ($typeArr[$what]['type'] === 'image') { - $fileinfo = GGet_image_fileinfo($source['tmp_name']); + $fileinfo = get_image_fileinfo($source['tmp_name']); switch ($what) { case 'favicon_image': if (! $fileinfo['ratio']) { @@ -920,7 +941,7 @@ function upload_to_content_images(array $source, string $what): void 'key' => $what, ]); $dbArray = [ - 'md5' => md5_file($uploaded['file']), + 'checksum' => hashFile($uploaded['file']), 'filename' => $filename, 'file_path' => $storagePath, 'blob' => $fp, @@ -1091,7 +1112,6 @@ function loaderHandler( $envVar['CHEVERETO_ID_HANDLE'] = ''; $envVar = array_merge($envVar, array ( 'CHEVERETO_EDITION' => 'free', - 'CHEVERETO_ENABLE_API_GUEST' => '0', 'CHEVERETO_ENABLE_BANNERS' => '0', 'CHEVERETO_ENABLE_CAPTCHA' => '0', 'CHEVERETO_ENABLE_CONSENT_SCREEN' => '0', @@ -1135,10 +1155,13 @@ function loaderHandler( 'post_max_size' => 'CHEVERETO_MAX_POST_SIZE', 'session.save_handler' => 'CHEVERETO_SESSION_SAVE_HANDLER', 'session.save_path' => 'CHEVERETO_SESSION_SAVE_PATH', - // 'upload_max_filesize' => 'CHEVERETO_MAX_UPLOAD_SIZE', // INI_PERDIR + // 'upload_max_filesize' => 'CHEVERETO_MAX_UPLOAD_FILE_SIZE', // INI_PERDIR ]; + $isCLI = PHP_SAPI === 'cli'; $iniToSkip = [ - 'max_execution_time' => PHP_SAPI === 'cli', + 'max_execution_time' => $isCLI, + 'session.save_handler' => $isCLI, + 'session.save_path' => $isCLI, ]; foreach ($iniToChevereto as $iniOption => $envName) { if (($iniToSkip[$iniOption] ?? false) === true) { @@ -1185,6 +1208,9 @@ function loaderHandler( $envVar['CHEVERETO_XRDEBUG_HOST'] = 'host.docker.internal'; } } + if ($envVar['CHEVERETO_MAX_LISTING_ITEMS_PER_PAGE'] === '0') { + $envVar['CHEVERETO_MAX_LISTING_ITEMS_PER_PAGE'] = ''; + } foreach ($envVar as $envName => &$envValue) { if (! is_string($envValue)) { try { @@ -1205,8 +1231,35 @@ function loaderHandler( new PostVar($_post); new GetVar($_get); new FilesVar($_files); + new RequestHeadersVar($_server); require_once PATH_APP . 'configurator.php'; - if ($_session === []) { + if (env()['CHEVERETO_CACHE_DRIVER'] === 'redis' + && env()['CHEVERETO_CACHE_HOST'] !== '' + && env()['CHEVERETO_CACHE_PORT'] !== '' + ) { + if (! class_exists('Redis')) { + throw new RuntimeException('Redis extension not loaded', 600); + } + $redis = new Redis(); + $redis->connect(env()['CHEVERETO_CACHE_HOST'], (int) env()['CHEVERETO_CACHE_PORT']); + if (env()['CHEVERETO_CACHE_PASSWORD'] !== '') { + $redis->auth(env()['CHEVERETO_CACHE_PASSWORD']); + } + $keyValue = new KeyValue( + $redis, + env()['CHEVERETO_CACHE_KEY_PREFIX'], + (int) env()['CHEVERETO_MAX_CACHE_TTL'], + ); + } else { + $keyValue = new KeyValueNull( + env()['CHEVERETO_CACHE_KEY_PREFIX'] + ); + } + new Cache($keyValue); + if ($_session === [] + && session_status() === PHP_SESSION_NONE + && ACCESS === 'web' + ) { $session_start = false; $session_options = [ 'save_handler' => Config::system()->sessionSaveHandler(), @@ -1262,6 +1315,20 @@ function loaderHandler( : ''; define('URL_APP_PUBLIC', HTTP_APP_PROTOCOL . '://' . Config::host()->hostname() . $httpPort . Config::host()->hostnamePath()); phpCheck(Config::system()); + + try { + $xrArguments = [ + 'isEnabled' => (bool) (env()['CHEVERETO_ENABLE_XRDEBUG']), + 'isHttps' => (bool) (env()['CHEVERETO_XRDEBUG_HTTPS']), + 'host' => (string) (env()['CHEVERETO_XRDEBUG_HOST']), + 'port' => (int) (env()['CHEVERETO_XRDEBUG_PORT']), + 'key' => (string) (env()['CHEVERETO_XRDEBUG_KEY']), + ]; + + new XrInstance(new Xr(...$xrArguments)); + } catch (Throwable) { + // Silent failover + } if (hasEnvDbInfo()) { DB::fromEnv(); } @@ -1290,20 +1357,6 @@ function loaderHandler( } } } - - try { - $xrArguments = [ - 'isEnabled' => (bool) (env()['CHEVERETO_ENABLE_XRDEBUG']), - 'isHttps' => (bool) (env()['CHEVERETO_XRDEBUG_HTTPS']), - 'host' => (string) (env()['CHEVERETO_XRDEBUG_HOST']), - 'port' => (int) (env()['CHEVERETO_XRDEBUG_PORT']), - 'key' => (string) (env()['CHEVERETO_XRDEBUG_KEY']), - ]; - - new XrInstance(new Xr(...$xrArguments)); - } catch (Throwable) { - // Silent failover - } $uploadImageFolder = cheveretoVersionInstalled() !== '' ? Settings::get('upload_image_path') : 'images'; @@ -1325,22 +1378,38 @@ function loaderHandler( if (is_valid_timezone(Settings::get('default_timezone'))) { date_default_timezone_set(Settings::get('default_timezone')); } - if (ACCESS === 'web') { - $upload_max_filesize_mb_db = Settings::get('upload_max_filesize_mb'); - $upload_max_filesize_mb_bytes = get_bytes($upload_max_filesize_mb_db . 'MB'); - $ini_upload_max_filesize = get_ini_bytes(ini_get('upload_max_filesize')); - $ini_post_max_size = ((int) ini_get('post_max_size')) === 0 - ? $ini_upload_max_filesize - : get_ini_bytes( - ini_get('post_max_size') - ); - Settings::setValue( - 'true_upload_max_filesize', - min($ini_upload_max_filesize, $ini_post_max_size) + $ini_upload_max_filesize = get_ini_bytes(ini_get('upload_max_filesize')); + $ini_post_max_size = ((int) ini_get('post_max_size')) === 0 + ? $ini_upload_max_filesize + : get_ini_bytes( + ini_get('post_max_size') ); - if (Settings::get('true_upload_max_filesize') < $upload_max_filesize_mb_bytes) { + Settings::setValue( + 'true_upload_max_filesize', + min($ini_upload_max_filesize, $ini_post_max_size) + ); + $chunk_size = get_ini_bytes(env()['CHEVERETO_MAX_CHUNK_UPLOAD_SIZE']); + Settings::setValue( + 'chunk_upload_size', + min($chunk_size, Settings::get('true_upload_max_filesize')) + ); + $maxUploadSize = get_ini_bytes(env()['CHEVERETO_MAX_UPLOAD_SIZE']); + if ($maxUploadSize > 0) { + $maxUploadSizeMb = bytes_to_mb($maxUploadSize); + $upload_max_filesize_mb = (float) Settings::get('upload_max_filesize_mb'); + if ($upload_max_filesize_mb == 0 + || $upload_max_filesize_mb > $maxUploadSizeMb + ) { Settings::update([ - 'upload_max_filesize_mb' => bytes_to_mb((int) Settings::get('true_upload_max_filesize')), + 'upload_max_filesize_mb' => $maxUploadSizeMb, + ]); + } + $upload_max_filesize_mb_guest = (float) Settings::get('upload_max_filesize_mb_guest'); + if ($upload_max_filesize_mb_guest == 0 + || $upload_max_filesize_mb_guest > $maxUploadSizeMb + ) { + Settings::update([ + 'upload_max_filesize_mb_guest' => $maxUploadSizeMb, ]); } } @@ -1670,3 +1739,14 @@ function isPublicHost(string $host): bool return $typeName === $typePub; } + +function hashFile(string $file): string +{ + // We use xxh64 as xxh128 is not available (web browser) @ 2025-04-28 + return hash_file('xxh64', $file); +} + +function hashString(string $string): string +{ + return hash('xxh128', $string); +} diff --git a/app/src/Storage/Storage.php b/app/src/Storage/Storage.php deleted file mode 100644 index 8f888eb..0000000 --- a/app/src/Storage/Storage.php +++ /dev/null @@ -1,27 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Storage; - -use League\Flysystem\FilesystemAdapter; -use League\Flysystem\Local\LocalFilesystemAdapter; - -final class Storage implements StorageInterface -{ - public function __construct(private string $location) - { - } - - final public function adapter(): FilesystemAdapter - { - return new LocalFilesystemAdapter($this->location); - } -} diff --git a/app/src/Storage/StorageInterface.php b/app/src/Storage/StorageInterface.php deleted file mode 100644 index cb94e64..0000000 --- a/app/src/Storage/StorageInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Storage; - -use League\Flysystem\FilesystemAdapter; - -interface StorageInterface -{ - public function __construct(string $location); - - public function adapter(): FilesystemAdapter; -} diff --git a/app/src/Vars/EnvVar.php b/app/src/Vars/EnvVar.php index 3f9a857..5152853 100644 --- a/app/src/Vars/EnvVar.php +++ b/app/src/Vars/EnvVar.php @@ -12,9 +12,6 @@ namespace Chevereto\Vars; use Chevereto\Vars\Traits\ImmutableMapTrait; -use Ds\Map; -use function Chevere\Parameter\iterable; -use function Chevere\Parameter\string; final class EnvVar { @@ -40,10 +37,6 @@ final class EnvVar } unset($array[$key]); } - iterable( - V: string(), - K: string(self::REGEX_KEY) - )($array); $this->assertNoInstance(); foreach (self::PUTENV as $putenv) { if (array_key_exists($putenv, $array)) { @@ -51,6 +44,5 @@ final class EnvVar } } static::$array = $array; - static::$map = new Map($array); } } diff --git a/app/src/Vars/RequestHeadersVar.php b/app/src/Vars/RequestHeadersVar.php new file mode 100644 index 0000000..243ed07 --- /dev/null +++ b/app/src/Vars/RequestHeadersVar.php @@ -0,0 +1,32 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Chevereto\Vars; + +use Chevereto\Vars\Traits\ImmutableMapTrait; + +final class RequestHeadersVar +{ + use ImmutableMapTrait; + + public function __construct(array $array) + { + $this->assertNoInstance(); + $headers = []; + foreach ($array as $key => $value) { + if (str_starts_with($key, 'HTTP_')) { + $header = str_replace('_', '-', ucwords(strtolower(substr($key, 5)), '_')); + $headers[$header] = $value; + } + } + static::$array = $headers; + } +} diff --git a/app/src/Vars/Traits/ImmutableMapTrait.php b/app/src/Vars/Traits/ImmutableMapTrait.php index 2099c6d..dbe62fd 100644 --- a/app/src/Vars/Traits/ImmutableMapTrait.php +++ b/app/src/Vars/Traits/ImmutableMapTrait.php @@ -12,8 +12,6 @@ namespace Chevereto\Vars\Traits; use Chevereto\Traits\Instance\AssertNoInstanceTrait; -use function DeepCopy\deep_copy; -use Ds\Map; trait ImmutableMapTrait { @@ -21,18 +19,10 @@ trait ImmutableMapTrait private static array $array = []; - private static Map $map; - public function __construct(array $array) { $this->assertNoInstance(); static::$array = $array; - static::$map = new Map($array); - } - - public static function map(): Map - { - return deep_copy(static::$map); } public static function toArray(): array diff --git a/app/src/Vars/Traits/MutableMapTrait.php b/app/src/Vars/Traits/MutableMapTrait.php index 5be2f6d..0eaca4f 100644 --- a/app/src/Vars/Traits/MutableMapTrait.php +++ b/app/src/Vars/Traits/MutableMapTrait.php @@ -11,9 +11,10 @@ namespace Chevereto\Vars\Traits; +use Chevere\DataStructure\Interfaces\MapMutableInterface; +use Chevere\DataStructure\MapMutable; use Chevereto\Traits\Instance\AssertNoInstanceTrait; use Chevereto\Traits\Instance\AssertStaticInstanceTrait; -use Ds\Map; trait MutableMapTrait { @@ -21,15 +22,15 @@ trait MutableMapTrait use AssertNoInstanceTrait; - private static Map $map; + private static MapMutableInterface $map; public function __construct(array $array) { $this->assertNoInstance(); - static::$map = new Map($array); + static::$map = new MapMutable(...$array); } - public static function map(): Map + public static function map(): MapMutableInterface { return static::$map; } diff --git a/app/src/Vars/functions.php b/app/src/Vars/functions.php index f452383..393733f 100644 --- a/app/src/Vars/functions.php +++ b/app/src/Vars/functions.php @@ -11,61 +11,91 @@ namespace Chevereto\Vars; -use Ds\Map; +use Chevere\DataStructure\Interfaces\MapMutableInterface; use LogicException; function env(): array { - try { - return EnvVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = EnvVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function request(): array { - try { - return RequestVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = RequestVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function get(): array { - try { - return GetVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = GetVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function post(): array { - try { - return PostVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = PostVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function server(): array { - try { - return ServerVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = ServerVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function files(): array { - try { - return FilesVar::toArray(); - } catch (LogicException) { - return []; + static $cache; + if (! isset($cache)) { + try { + $cache = FilesVar::toArray(); + } catch (LogicException) { + $cache = []; + } } + + return $cache; } function cookie(): array @@ -77,7 +107,7 @@ function cookie(): array } } -function cookieVar(): Map +function cookieVar(): MapMutableInterface { return CookieVar::map(); } @@ -91,7 +121,21 @@ function session(): array } } -function sessionVar(): Map +function sessionVar(): MapMutableInterface { return SessionVar::map(); } + +function requestHeaders(): array +{ + static $cache; + if (! isset($cache)) { + try { + $cache = RequestHeadersVar::toArray(); + } catch (LogicException) { + $cache = []; + } + } + + return $cache; +} diff --git a/app/src/Workflow/functions.php b/app/src/Workflow/functions.php deleted file mode 100644 index 3618fbe..0000000 --- a/app/src/Workflow/functions.php +++ /dev/null @@ -1,45 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflow; - -use Chevere\Workflow\Interfaces\JobInterface; -use function Chevere\Workflow\job; -use Chevereto\Actions\Auth\AuthVerifyRepositoryAccessAction; -use Chevereto\Actions\Auth\AuthVerifyResourceAccessAction; - -function stepVerifyResourceAccess( - string $resource, - string $level, - string $ownerUserId = '', - string $requesterUserId = '${REQUESTER_USER_ID}' -): JobInterface { - return job( - AuthVerifyResourceAccessAction::class, - requesterUserId: $requesterUserId, - resource: $resource, - level: $level, - ownerUserId: $ownerUserId - ); -} - -function stepVerifyRepositoryAccess( - string $repository, - string $level, - string $requesterUserId = '${REQUESTER_USER_ID}' -): JobInterface { - return job( - AuthVerifyRepositoryAccessAction::class, - requesterUserId: $requesterUserId, - repository: $repository, - level: $level, - ); -} diff --git a/app/src/Workflows/Album/AlbumDeleteWorkflow.php b/app/src/Workflows/Album/AlbumDeleteWorkflow.php deleted file mode 100644 index f9af5b9..0000000 --- a/app/src/Workflows/Album/AlbumDeleteWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - get: job( - 'AlbumDeleteAction', - id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Album/AlbumGetWorkflow.php b/app/src/Workflows/Album/AlbumGetWorkflow.php deleted file mode 100644 index ddf133d..0000000 --- a/app/src/Workflows/Album/AlbumGetWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumGetWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - get: job( - 'AlbumGetAction', - id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Album/AlbumPatchWorkflow.php b/app/src/Workflows/Album/AlbumPatchWorkflow.php deleted file mode 100644 index c362ca6..0000000 --- a/app/src/Workflows/Album/AlbumPatchWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumPatchWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - edit: job( - 'AlbumEditAction', - albumId: '${album_id}', - cover_id: '${cover_id}', - ) - ); - } -} diff --git a/app/src/Workflows/Album/AlbumPostWorkflow.php b/app/src/Workflows/Album/AlbumPostWorkflow.php deleted file mode 100644 index 1f1e9c2..0000000 --- a/app/src/Workflows/Album/AlbumPostWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album; - -use Chevere\Action\Action; -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - step: job( - Action::class, - parameter: '${variable}', - ) - ); - } -} diff --git a/app/src/Workflows/Album/Like/AlbumLikeDeleteWorkflow.php b/app/src/Workflows/Album/Like/AlbumLikeDeleteWorkflow.php deleted file mode 100644 index 84fad74..0000000 --- a/app/src/Workflows/Album/Like/AlbumLikeDeleteWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album\Like; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumLikeDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - delete: job( - 'DeleteAlbumLike', - id: '${id}', - userId: '${user_id}', - ) - ); - } -} diff --git a/app/src/Workflows/Album/Like/AlbumLikePostWorkflow.php b/app/src/Workflows/Album/Like/AlbumLikePostWorkflow.php deleted file mode 100644 index f954436..0000000 --- a/app/src/Workflows/Album/Like/AlbumLikePostWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Album\Like; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class AlbumLikePostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - insert: job( - 'InsertAlbumLike', - id: '${id}', - userId: '${user_id}' - ) - ); - } -} diff --git a/app/src/Workflows/Ban/Ip/BanIpDeleteWorkflow.php b/app/src/Workflows/Ban/Ip/BanIpDeleteWorkflow.php deleted file mode 100644 index a5d1428..0000000 --- a/app/src/Workflows/Ban/Ip/BanIpDeleteWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Ban\Ip; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class BanIpDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - step: job( - 'ActionName', - parameter: '${variable}', - ) - ); - } -} diff --git a/app/src/Workflows/Ban/Ip/BanIpPatchWorkflow.php b/app/src/Workflows/Ban/Ip/BanIpPatchWorkflow.php deleted file mode 100644 index 857dc9d..0000000 --- a/app/src/Workflows/Ban/Ip/BanIpPatchWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Ban\Ip; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class BanIpPatchWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - step: job( - 'ActionName', - parameter: '${variable}', - ) - ); - } -} diff --git a/app/src/Workflows/Ban/Ip/BanIpPostWorkflow.php b/app/src/Workflows/Ban/Ip/BanIpPostWorkflow.php deleted file mode 100644 index 5b36b34..0000000 --- a/app/src/Workflows/Ban/Ip/BanIpPostWorkflow.php +++ /dev/null @@ -1,43 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Ban\Ip; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class BanIpPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - checkManager: job( - 'CheckManagerAction', - ), - validateIp: job( - 'ValidateIpAction', - ip: '${ip}', - ), - validateIpNotBanned: job( - 'ValidateIpNotBannedAction', - ip: '${ip}', - ), - insert: job( - 'InsertBanIpAction', - ip: '${ip}', - expires: '${expires}', - message: '${message}', - ), - ); - } -} diff --git a/app/src/Workflows/Category/CategoryPostWorkflow.php b/app/src/Workflows/Category/CategoryPostWorkflow.php deleted file mode 100644 index f9d2564..0000000 --- a/app/src/Workflows/Category/CategoryPostWorkflow.php +++ /dev/null @@ -1,39 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Category; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class CategoryPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - checkAdmin: job( - 'CheckAdminAction', - ), - checkAvailableUrlKey: job( - 'CheckAvailableUrlKey', - urlKey: '${url_key}', - ), - insert: job( - 'InsertCategoryAction', - name: '${name}', - urlKey: '${url_key}', - description: '${description}', - ) - ); - } -} diff --git a/app/src/Workflows/Image/Bulk/ImageBulkPatchWorkflow.php b/app/src/Workflows/Image/Bulk/ImageBulkPatchWorkflow.php deleted file mode 100644 index 36aaf6f..0000000 --- a/app/src/Workflows/Image/Bulk/ImageBulkPatchWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image\Bulk; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ImageBulkPatchWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - edit: job( - 'ImageBulkPatch', - image_ids: '${image_ids}', - payload: '${payload}', - ) - ); - } -} diff --git a/app/src/Workflows/Image/ImageGetWorkflow.php b/app/src/Workflows/Image/ImageGetWorkflow.php deleted file mode 100644 index d15bb22..0000000 --- a/app/src/Workflows/Image/ImageGetWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ImageGetWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - get: job( - 'ImageGetAction', - id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Image/ImagePatchWorkflow.php b/app/src/Workflows/Image/ImagePatchWorkflow.php deleted file mode 100644 index 582aa06..0000000 --- a/app/src/Workflows/Image/ImagePatchWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ImagePatchWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - edit: job( - 'ImageEditAction', - id: '${id}', - payload: '${payload}' - ) - ); - } -} diff --git a/app/src/Workflows/Image/ImagePostWorkflow.php b/app/src/Workflows/Image/ImagePostWorkflow.php deleted file mode 100644 index 698b0ce..0000000 --- a/app/src/Workflows/Image/ImagePostWorkflow.php +++ /dev/null @@ -1,107 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Actions\Database\DatabaseReserveRowAction; -use Chevereto\Actions\File\FileFetchSourceAction; -use Chevereto\Actions\File\FileNamingAction; -use Chevereto\Actions\File\FileUploadAction; -use Chevereto\Actions\File\FileValidateAction; -use Chevereto\Actions\File\FileVerifyNotDuplicateAction; -use Chevereto\Actions\Image\ImageFetchMetaAction; -use Chevereto\Actions\Image\ImageFixOrientationAction; -use Chevereto\Actions\Image\ImageInsertAction; -use Chevereto\Actions\Image\ImageStripMetaAction; -use Chevereto\Actions\Image\ImageVerifyMediaAction; -use Chevereto\Actions\Storage\StorageGetForUserAction; -use Chevereto\Workflow\BaseWorkflow; - -final class ImagePostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - fetchSource: job( - FileFetchSourceAction::class, - source: '${source}', - ), - validateFile: job( - FileValidateAction::class, - mimes: '${mimes}', - filepath: '${fetchSource:filepath}', - maxBytes: '${max_bytes}', - minBytes: '${min_bytes}', - ), - validateMedia: job( - ImageVerifyMediaAction::class, - filepath: '${fetchSource:filepath}', - maxHeight: '${max_height}', - maxWidth: '${max_width}', - minHeight: '${min_height}', - minWidth: '${min_width}', - ), - assertNotDuplicate: job( - FileVerifyNotDuplicateAction::class, - md5: '${validateFile:md5}', - perceptual: '${validateMedia:perceptual}', - ip: '${ip}', - ipVersion: '${ip_version}', - ), - fixOrientation: job( - ImageFixOrientationAction::class, - image: '${validateMedia:image}' - ), - fetchMeta: job( - ImageFetchMetaAction::class, - image: '${validateMedia:image}' - ), - stripMeta: job( - ImageStripMetaAction::class, - image: '${validateMedia:image}' - ), - storageForUser: job( - StorageGetForUserAction::class, - userId: '${user_id}', - bytesRequired: '${validateFile:bytes}', - ), - reserveId: job( - DatabaseReserveRowAction::class, - table: '${table}', - ), - targetFilename: job( - FileNamingAction::class, - id: '${reserveId:id}', - name: '${name}', - naming: '${naming}', - storage: '${storageForUser:storage}', - path: '${path}' - ), - upload: job( - FileUploadAction::class, - filepath: '${upload_filepath}', - targetFilename: '${targetFilename:name}', - storage: '${storageForUser:storage}', - path: '${path}', - ), - insert: job( - ImageInsertAction::class, - id: '${reserveId:id}', - albumId: '${album_id}', - expires: '${expires}', - userId: '${user_id}', - ), - ); - } -} diff --git a/app/src/Workflows/Image/Like/ImageLikeDeleteWorkflow.php b/app/src/Workflows/Image/Like/ImageLikeDeleteWorkflow.php deleted file mode 100644 index 1263970..0000000 --- a/app/src/Workflows/Image/Like/ImageLikeDeleteWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image\Like; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ImageLikeDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - delete: job( - 'DeleteImageLike', - id: '${id}', - userId: '${user_id}', - ) - ); - } -} diff --git a/app/src/Workflows/Image/Like/ImageLikePostWorkflow.php b/app/src/Workflows/Image/Like/ImageLikePostWorkflow.php deleted file mode 100644 index 3fd359f..0000000 --- a/app/src/Workflows/Image/Like/ImageLikePostWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Image\Like; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ImageLikePostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - insert: job( - 'InsertImageLike', - id: '${id}', - userId: '${user_id}' - ) - ); - } -} diff --git a/app/src/Workflows/Legacy/LegacyRouteWorkflow.php b/app/src/Workflows/Legacy/LegacyRouteWorkflow.php deleted file mode 100644 index db91f2d..0000000 --- a/app/src/Workflows/Legacy/LegacyRouteWorkflow.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Legacy; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class LegacyRouteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - handler: job( - 'LegacyHandlerAction', - request: '${REQUEST}', - routeBasename: '${LEGACY_ROUTE_DISPATCH}' - ), - ); - } -} diff --git a/app/src/Workflows/Legacy/LegacyUploadPostWorkflow.php b/app/src/Workflows/Legacy/LegacyUploadPostWorkflow.php deleted file mode 100644 index 5c0cf4f..0000000 --- a/app/src/Workflows/Legacy/LegacyUploadPostWorkflow.php +++ /dev/null @@ -1,115 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Legacy; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Actions\Database\DatabaseReserveRowAction; -use Chevereto\Actions\File\FileFetchSourceAction; -use Chevereto\Actions\File\FileNamingAction; -use Chevereto\Actions\File\FileUploadAction; -use Chevereto\Actions\File\FileValidateAction; -use Chevereto\Actions\File\FileVerifyNotDuplicateAction; -use Chevereto\Actions\Image\ImageFetchMetaAction; -use Chevereto\Actions\Image\ImageFixOrientationAction; -use Chevereto\Actions\Image\ImageStripMetaAction; -use Chevereto\Actions\Image\ImageVerifyMediaAction; -use Chevereto\Actions\Legacy\Api\V1\ImageInsertAction; -use Chevereto\Actions\Legacy\Api\V1\LegacyApiV1OutputAction; -use Chevereto\Actions\Legacy\Api\V1\LegacyApiV1VerifyKeyAction; -use Chevereto\Actions\Storage\StorageGetForUserAction; -use Chevereto\Workflow\BaseWorkflow; - -final class LegacyUploadPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - validateApiV1Key: job( - LegacyApiV1VerifyKeyAction::class, - key: '${key}', - apiV1Key: '${api_v1_key}', - ), - fetchSource: job( - FileFetchSourceAction::class, - source: '${source}', - ), - validateFile: job( - FileValidateAction::class, - mimes: '${api_v1_upload_mimes}', - filepath: '${fetchSource:filepath}', - maxBytes: '${api_v1_upload_max_bytes}', - minBytes: '${api_v1_upload_min_bytes}', - ), - validateMedia: job( - ImageVerifyMediaAction::class, - filepath: '${fetchSource:filepath}', - maxHeight: '${api_v1_upload_max_height}', - maxWidth: '${api_v1_upload_max_width}', - minHeight: '${api_v1_upload_min_height}', - minWidth: '${api_v1_upload_min_width}', - ), - assertNotDuplicate: job( - FileVerifyNotDuplicateAction::class, - md5: '${validateFile:md5}', - perceptual: '${validateMedia:perceptual}', - ip: '${requester_ip}', - ipVersion: '${requester_ip_version}', - ), - fixOrientation: job( - ImageFixOrientationAction::class, - image: '${validateMedia:image}' - ), - fetchMeta: job( - ImageFetchMetaAction::class, - image: '${validateMedia:image}' - ), - stripMeta: job( - ImageStripMetaAction::class, - image: '${validateMedia:image}' - ), - storageForUser: job( - StorageGetForUserAction::class, - userId: '${user_id}', - bytesRequired: '${validateFile:bytes}', - ), - reserveId: job( - DatabaseReserveRowAction::class, - table: '${table_image}', - ), - targetFilename: job( - FileNamingAction::class, - id: '${reserveId:id}', - name: '${name}', - naming: '${naming}', - storage: '${storageForUser:storage}', - path: '${api_v1_upload_path}' - ), - upload: job( - FileUploadAction::class, - filepath: '${fetchSource:filepath}', - targetFilename: '${targetFilename:filename}', - storage: '${storageForUser:storage}', - path: '${api_v1_upload_path}', - ), - insert: job( - ImageInsertAction::class, - id: '${reserveId:id}', - ), - output: job( - LegacyApiV1OutputAction::class, - format: '${format}', - ) - ); - } -} diff --git a/app/src/Workflows/Stat/Rebuild/StatRebuildPostWorkflow.php b/app/src/Workflows/Stat/Rebuild/StatRebuildPostWorkflow.php deleted file mode 100644 index 3d113d9..0000000 --- a/app/src/Workflows/Stat/Rebuild/StatRebuildPostWorkflow.php +++ /dev/null @@ -1,29 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Stat\Rebuild; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class StatRebuildPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - action: job( - 'StatRebuildAction', - ) - ); - } -} diff --git a/app/src/Workflows/Storage/Migrate/StorageMigratePostWorkflow.php b/app/src/Workflows/Storage/Migrate/StorageMigratePostWorkflow.php deleted file mode 100644 index 19c8460..0000000 --- a/app/src/Workflows/Storage/Migrate/StorageMigratePostWorkflow.php +++ /dev/null @@ -1,32 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Storage\Migrate; - -use Chevere\Action\Action; -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class StorageMigratePostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - migrate: job( - Action::class, - storageIdFrom: '${id}', - storageIdTo: '${target_storage_id}', - ) - ); - } -} diff --git a/app/src/Workflows/Storage/Stat/Regen/StorageStatsRegenPostWorkflow.php b/app/src/Workflows/Storage/Stat/Regen/StorageStatsRegenPostWorkflow.php deleted file mode 100644 index 65c4e4a..0000000 --- a/app/src/Workflows/Storage/Stat/Regen/StorageStatsRegenPostWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Storage\Stat\Regen; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class StorageStatsRegenPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - regen: job( - 'StorageRegenStatsAction', - storage_id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Storage/StoragePostWorkflow.php b/app/src/Workflows/Storage/StoragePostWorkflow.php deleted file mode 100644 index 954cf3b..0000000 --- a/app/src/Workflows/Storage/StoragePostWorkflow.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Storage; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use Chevereto\Workflow\BaseWorkflow; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; - -final class StoragePostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - checkAdmin: job( - 'CheckAdminAction', - parameter: '${variable}', - ), - insert: job( - 'StorageInsertAction', - account_id: '${account_id}', - account_name: '${account_name}', - apiId: '${api_id}', - bucket: '${bucket}', - capacity: '${capacity}', - id: '${id}', - key: '${key}', - name: '${name}', - region: '${region}', - secret: '${secret}', - server: '${server}', - service: '${service}', - url: '${url}', - ), - ); - } -} diff --git a/app/src/Workflows/Tool/Id/Decode/ToolDecodeIdGetWorkflow.php b/app/src/Workflows/Tool/Id/Decode/ToolDecodeIdGetWorkflow.php deleted file mode 100644 index 1335e35..0000000 --- a/app/src/Workflows/Tool/Id/Decode/ToolDecodeIdGetWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Tool\Id\Decode; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ToolDecodeIdGetWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - output: job( - 'ToolEncodeIdAction', - id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Tool/Id/Encode/ToolEncodeIdGetWorkflow.php b/app/src/Workflows/Tool/Id/Encode/ToolEncodeIdGetWorkflow.php deleted file mode 100644 index 426b059..0000000 --- a/app/src/Workflows/Tool/Id/Encode/ToolEncodeIdGetWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Tool\Id\Encode; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ToolEncodeIdGetWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - output: job( - 'ToolEncodeIdAction', - id: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/Tool/Probe/Email/ToolProbeEmailPostWorkflow.php b/app/src/Workflows/Tool/Probe/Email/ToolProbeEmailPostWorkflow.php deleted file mode 100644 index ebf430f..0000000 --- a/app/src/Workflows/Tool/Probe/Email/ToolProbeEmailPostWorkflow.php +++ /dev/null @@ -1,30 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\Tool\Probe\Email; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; - -final class ToolProbeEmailPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - probe: job( - 'ToolProbeEmailAction', - email: '${email}', - ) - ); - } -} diff --git a/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarDeleteWorkflow.php b/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarDeleteWorkflow.php deleted file mode 100644 index 3d0ce1a..0000000 --- a/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarDeleteWorkflow.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Asset\Avatar; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserAssetAvatarDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_avatar', - level: 'write', - ownerUserId: '${user:id}' - ), - delete: job( - 'DeleteUserAssetAvatarAction', - id: '${user:id}', - ), - ); - } -} diff --git a/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarPostWorkflow.php b/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarPostWorkflow.php deleted file mode 100644 index 5c87efd..0000000 --- a/app/src/Workflows/User/Asset/Avatar/UserAssetAvatarPostWorkflow.php +++ /dev/null @@ -1,82 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Asset\Avatar; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Actions\File\FileFetchSourceAction; -use Chevereto\Actions\File\FileUploadAction; -use Chevereto\Actions\File\FileValidateAction; -use Chevereto\Actions\Image\ImageFixOrientationAction; -use Chevereto\Actions\Image\ImageStripMetaAction; -use Chevereto\Actions\Image\ImageVerifyMediaAction; -use Chevereto\Actions\Storage\StorageGetForAssetAction; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserAssetAvatarPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_avatar', - level: 'write', - ownerUserId: '${user:id}' - ), - fetchSource: job( - FileFetchSourceAction::class, - source: '${source}', - ), - validateFile: job( - FileValidateAction::class, - mimes: '${user_avatar_mimes}', - filepath: '${fetch_source:filepath}', - maxBytes: '${user_avatar_max_bytes}', - minBytes: '${user_avatar_min_bytes}', - ), - validateMedia: job( - ImageVerifyMediaAction::class, - filepath: '${fetch_source:filepath}', - maxHeight: '${user_avatar_max_height}', - maxWidth: '${user_avatar_max_width}', - minHeight: '${user_avatar_min_height}', - minWidth: '${user_avatar_min_width}', - ), - fixOrientation: job( - ImageFixOrientationAction::class, - image: '${validateMedia:image}' - ), - stripMeta: job( - ImageStripMetaAction::class, - image: '${validateMedia:image}' - ), - storageForAsset: job( - StorageGetForAssetAction::class, - userId: '${user_id}', - bytesRequired: '${validate_file:bytes}', - ), - upload: job( - FileUploadAction::class, - filepath: '${upload_filepath}', - targetFilename: '${asset:filename}', - storage: '${storage_for_asset:storage}', - path: '${asset:path}', - ) - ); - } -} diff --git a/app/src/Workflows/User/Asset/Background/UserAssetBackgroundDeleteWorkflow.php b/app/src/Workflows/User/Asset/Background/UserAssetBackgroundDeleteWorkflow.php deleted file mode 100644 index f633a6c..0000000 --- a/app/src/Workflows/User/Asset/Background/UserAssetBackgroundDeleteWorkflow.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Asset\Background; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserAssetBackgroundDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_background', - level: 'write', - ownerUserId: '${user:id}' - ), - delete: job( - 'DeleteUserAssetBackgroundAction', - id: '${user:id}', - ), - ); - } -} diff --git a/app/src/Workflows/User/Asset/Background/UserAssetBackgroundPostWorkflow.php b/app/src/Workflows/User/Asset/Background/UserAssetBackgroundPostWorkflow.php deleted file mode 100644 index 4ba61af..0000000 --- a/app/src/Workflows/User/Asset/Background/UserAssetBackgroundPostWorkflow.php +++ /dev/null @@ -1,81 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Asset\Background; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Actions\File\FileUploadAction; -use Chevereto\Actions\File\FileValidateAction; -use Chevereto\Actions\Image\ImageFixOrientationAction; -use Chevereto\Actions\Image\ImageStripMetaAction; -use Chevereto\Actions\Image\ImageVerifyMediaAction; -use Chevereto\Actions\Storage\StorageGetForAssetAction; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserAssetBackgroundPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_background', - level: 'write', - ownerUserId: '${user:id}' - ), - fetchSource: job( - FileFetchBinaryAction::class, - source: '${source}', - ), - validateFile: job( - FileValidateAction::class, - filepath: '${fetchSource:uploadFilepath}', - maxBytes: '${user_background_max_bytes}', - mimes: '${user_background_mimes}', - minBytes: '${user_background_min_bytes}', - ), - validateMedia: job( - ImageVerifyMediaAction::class, - filepath: '${fetchSource:uploadFilepath}', - maxHeight: '${user_background_max_height}', - maxWidth: '${user_background_max_width}', - minHeight: '${user_background_min_height}', - minWidth: '${user_background_min_width}', - ), - fixOrientation: job( - ImageFixOrientationAction::class, - image: '${validateMedia:image}' - ), - stripMeta: job( - ImageStripMetaAction::class, - image: '${validateMedia:image}' - ), - storageForAsset: job( - StorageGetForAssetAction::class, - bytesRequired: '${validateFile:bytes}', - userId: '${user_id}', - ), - upload: job( - FileUploadAction::class, - filepath: '${upload_filepath}', - path: '${asset:path}', - storage: '${storageForAsset:storage}', - targetFilename: '${asset:filename}', - ) - ); - } -} diff --git a/app/src/Workflows/User/Export/UserExportGetWorkflow.php b/app/src/Workflows/User/Export/UserExportGetWorkflow.php deleted file mode 100644 index 4156e4f..0000000 --- a/app/src/Workflows/User/Export/UserExportGetWorkflow.php +++ /dev/null @@ -1,40 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Export; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserExportGetWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_export', - level: 'read', - ownerUserId: '${user:id}' - ), - export: job( - 'UserExportAction', - userId: '${id}', - ) - ); - } -} diff --git a/app/src/Workflows/User/Follow/UserFollowDeleteWorkflow.php b/app/src/Workflows/User/Follow/UserFollowDeleteWorkflow.php deleted file mode 100644 index c30e359..0000000 --- a/app/src/Workflows/User/Follow/UserFollowDeleteWorkflow.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Follow; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserFollowDeleteWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_follow', - level: 'write', - ownerUserId: '${user:id}' - ), - step: job( - 'UserFollowDeleteAction', - userId: '${user_id}', - userIdToFollow: '${user_id_to_follow}', - ) - ); - } -} diff --git a/app/src/Workflows/User/Follow/UserFollowPostWorkflow.php b/app/src/Workflows/User/Follow/UserFollowPostWorkflow.php deleted file mode 100644 index b278f1c..0000000 --- a/app/src/Workflows/User/Follow/UserFollowPostWorkflow.php +++ /dev/null @@ -1,41 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User\Follow; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyResourceAccess; - -final class UserFollowPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - user: job( - 'UserGetByUsernameAction', - username: '${username}', - ), - checkout: stepVerifyResourceAccess( - resource: 'user_follow', - level: 'write', - ownerUserId: '${user:id}' - ), - step: job( - 'UserFollowInsertAction', - userId: '${user_id}', - userIdToFollow: '${user_id_to_follow}', - ) - ); - } -} diff --git a/app/src/Workflows/User/UserPostWorkflow.php b/app/src/Workflows/User/UserPostWorkflow.php deleted file mode 100644 index 7d2f651..0000000 --- a/app/src/Workflows/User/UserPostWorkflow.php +++ /dev/null @@ -1,62 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Chevereto\Workflows\User; - -use Chevere\Workflow\Interfaces\WorkflowInterface; -use function Chevere\Workflow\job; -use function Chevere\Workflow\workflow; -use Chevereto\Workflow\BaseWorkflow; -use function Chevereto\Workflow\stepVerifyRepositoryAccess; - -final class UserPostWorkflow extends BaseWorkflow -{ - public function getWorkflow(): WorkflowInterface - { - return workflow( - checkout: stepVerifyRepositoryAccess( - repository: 'users', - level: 'write', - ), - validateUsername: job( - 'ValidateUsernameAction', - username: '${username}', - ), - validateEmail: job( - 'ValidateEmailAction', - email: '${email}', - ), - validatePassword: job( - 'ValidatePasswordAction', - password: '${password}', - ), - validateRole: job( - 'ValidateRoleAction', - role: '${role}', - ), - validateAvailableUsername: job( - 'ValidateAvailableUsernameAction', - username: '${username}', - ), - validateAvailableEmail: job( - 'ValidateAvailableEmailAction', - email: '${email}' - ), - insert: job( - 'InsertUserAction', - username: '${username}', - email: '${email}', - password: '${password}', - role: '${role}', - ) - ); - } -} diff --git a/app/upgrading.php b/app/upgrading.php index 3739f22..c094257 100644 --- a/app/upgrading.php +++ b/app/upgrading.php @@ -45,7 +45,7 @@ if (! file_exists(LOGGER)) { directoryForPath($loggerDir)->createIfNotExists(); touch(LOGGER); } -ob_start('ob_gzhandler'); +ob_start(); ob_implicit_flush(true); $rootDir = __DIR__ . '/..'; $workingDir = __DIR__ . '/.upgrading'; @@ -213,7 +213,7 @@ if ($singleStep || $action === 'extract') { $safeResult = false; if (passthruEnabled()) { logger('Update command passthru'); - $command = $rootDir . '/app/bin/legacy -C update'; + $command = $rootDir . '/app/bin/cli -C update'; $safeResult = passthru($command); } if ($safeResult === false) { diff --git a/content/images/system/default/home_cover.avif b/content/images/system/default/home_cover.avif deleted file mode 100644 index 52c1d74a03752631114e2313e9f2e3a2a494a7e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461942 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%0Dq#d2_? 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

    Un3bP_IG+NL3ET@uZuL~ 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

    _Rj5A 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

    4{ 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 z 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

    -FskEBvU-> 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

    diff --git a/content/legacy/themes/Peafowl/head.php b/content/legacy/themes/Peafowl/head.php index 898f7b4..9727430 100644 --- a/content/legacy/themes/Peafowl/head.php +++ b/content/legacy/themes/Peafowl/head.php @@ -125,13 +125,14 @@ foreach ($links as $rel => $href) { if (in_array(Handler::var('album')['privacy'], ['public', 'private_but_link']) && Handler::var('listing')->outputCount() ) { - $open_graph_extend = array_merge($open_graph_extend, [ - 'image' => Handler::var('listing')->outputAssoc()[0]['display_url'], - 'image:width' => Handler::var('listing')->outputAssoc()[0]['display_width'], - 'image:height' => Handler::var('listing')->outputAssoc()[0]['display_height'], - ]); + if(Handler::var('listing') && Handler::var('listing')->first()) { + $open_graph_extend = array_merge($open_graph_extend, [ + 'image' => Handler::var('listing')->first()['display_url'], + 'image:width' => Handler::var('listing')->first()['display_width'], + 'image:height' => Handler::var('listing')->first()['display_height'], + ]); + } } - break; case Handler::var('user') !== null && is_route('user'): $open_graph_extend = [ @@ -183,12 +184,9 @@ foreach ($links as $rel => $href) { } else { $twitter_card['creator'] = isset(Handler::var('user')['twitter']) ? Handler::var('user')['twitter']['username'] : ''; } - $list_output = Handler::var('listing') !== null ? (Handler::var('listing')->outputAssoc() ?? null) : null; - if (is_array($list_output) && count($list_output) > 0) { - for ($i = 0; $i < 4; ++$i) { - $twitter_card['image' . $i] = $list_output[$i]['display_url'] ?? ''; - } - } + $twitter_card['image'] = Handler::var('listing') && Handler::var('listing')->first() + ? Handler::var('listing')->first()['display_url'] + : ''; break; } diff --git a/content/legacy/themes/Peafowl/header.php b/content/legacy/themes/Peafowl/header.php index 543d5be..f703dbd 100644 --- a/content/legacy/themes/Peafowl/header.php +++ b/content/legacy/themes/Peafowl/header.php @@ -215,7 +215,7 @@ foreach($tags_top as $k => $v) {
  • - +
  • @@ -304,6 +304,7 @@ foreach($tags_top as $k => $v) { } ?>
  • +
    @@ -321,6 +322,7 @@ foreach($tags_top as $k => $v) { } ?>
    +
    diff --git a/content/legacy/themes/Peafowl/lib/chevereto-all.js b/content/legacy/themes/Peafowl/lib/chevereto-all.js index 705b61a..3fb20dd 100644 --- a/content/legacy/themes/Peafowl/lib/chevereto-all.js +++ b/content/legacy/themes/Peafowl/lib/chevereto-all.js @@ -140,26 +140,26 @@ for(var i=0; ia?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(!l.ownFirst)for(b in a)return k.call(a,b);for(b in a);return void 0===b||k.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(h)return h.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=e.call(arguments,2),d=function(){return a.apply(b||this,c.concat(e.call(arguments)))},d.guid=a.guid=a.guid||n.guid++,d):void 0},now:function(){return+new Date},support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}if(f=d.getElementById(e[2]),f&&f.parentNode){if(f.id!==e[2])return A.find(a);this.length=1,this[0]=f}return this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||(e=n.uniqueSort(e)),D.test(a)&&(e=e.reverse())),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=!0,c||j.disable(),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.addEventListener?(d.removeEventListener("DOMContentLoaded",K),a.removeEventListener("load",K)):(d.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(d.addEventListener||"load"===a.event.type||"complete"===d.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll)a.setTimeout(n.ready);else if(d.addEventListener)d.addEventListener("DOMContentLoaded",K),a.addEventListener("load",K);else{d.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&d.documentElement}catch(e){}c&&c.doScroll&&!function f(){if(!n.isReady){try{c.doScroll("left")}catch(b){return a.setTimeout(f,50)}J(),n.ready()}}()}return I.promise(b)},n.ready.promise();var L;for(L in n(l))break;l.ownFirst="0"===L,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c,e;c=d.getElementsByTagName("body")[0],c&&c.style&&(b=d.createElement("div"),e=d.createElement("div"),e.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(e).appendChild(b),"undefined"!=typeof b.style.zoom&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",l.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(e))}),function(){var a=d.createElement("div");l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}a=null}();var M=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b},N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0; }return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(M(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),"object"!=typeof b&&"function"!=typeof b||(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f}}function S(a,b,c){if(M(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=void 0)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},Z=/^(?:checkbox|radio)$/i,$=/<([\w:-]+)/,_=/^$|\/(?:java|ecma)script/i,aa=/^\s+/,ba="abbr|article|aside|audio|bdi|canvas|data|datalist|details|dialog|figcaption|figure|footer|header|hgroup|main|mark|meter|nav|output|picture|progress|section|summary|template|time|video";function ca(a){var b=ba.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}!function(){var a=d.createElement("div"),b=d.createDocumentFragment(),c=d.createElement("input");a.innerHTML="
    a",l.leadingWhitespace=3===a.firstChild.nodeType,l.tbody=!a.getElementsByTagName("tbody").length,l.htmlSerialize=!!a.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==d.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,b.appendChild(c),l.appendChecked=c.checked,a.innerHTML="",l.noCloneChecked=!!a.cloneNode(!0).lastChild.defaultValue,b.appendChild(a),c=d.createElement("input"),c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),a.appendChild(c),l.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!!a.addEventListener,a[n.expando]=1,l.attributes=!a.getAttribute(n.expando)}();var da={option:[1,""],legend:[1,"
    ","
    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
    "],tr:[2,"","
    "],col:[2,"","
    "],td:[3,"","
    "],_default:l.htmlSerialize?[0,"",""]:[1,"X
    ","
    "]};da.optgroup=da.option,da.tbody=da.tfoot=da.colgroup=da.caption=da.thead,da.th=da.td;function ea(a,b){var c,d,e=0,f="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,ea(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function fa(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}var ga=/<|&#?\w+;/,ha=/r;r++)if(g=a[r],g||0===g)if("object"===n.type(g))n.merge(q,g.nodeType?[g]:g);else if(ga.test(g)){i=i||p.appendChild(b.createElement("div")),j=($.exec(g)||["",""])[1].toLowerCase(),m=da[j]||da._default,i.innerHTML=m[1]+n.htmlPrefilter(g)+m[2],f=m[0];while(f--)i=i.lastChild;if(!l.leadingWhitespace&&aa.test(g)&&q.push(b.createTextNode(aa.exec(g)[0])),!l.tbody){g="table"!==j||ha.test(g)?""!==m[1]||ha.test(g)?0:i:i.firstChild,f=g&&g.childNodes.length;while(f--)n.nodeName(k=g.childNodes[f],"tbody")&&!k.childNodes.length&&g.removeChild(k)}n.merge(q,i.childNodes),i.textContent="";while(i.firstChild)i.removeChild(i.firstChild);i=p.lastChild}else q.push(b.createTextNode(g));i&&p.removeChild(i),l.appendChecked||n.grep(ea(q,"input"),ia),r=0;while(g=q[r++])if(d&&n.inArray(g,d)>-1)e&&e.push(g);else if(h=n.contains(g.ownerDocument,g),i=ea(p.appendChild(g),"script"),h&&fa(i),c){f=0;while(g=i[f++])_.test(g.type||"")&&c.push(g)}return i=null,p}!function(){var b,c,e=d.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b]=c in a)||(e.setAttribute(c,"t"),l[b]=e.attributes[c].expando===!1);e=null}();var ka=/^(?:input|select|textarea)$/i,la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^(?:focusinfocus|focusoutblur)$/,oa=/^([^.]*)(?:\.(.+)|)/;function pa(){return!0}function qa(){return!1}function ra(){try{return d.activeElement}catch(a){}}function sa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)sa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=qa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return"undefined"==typeof n||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(G)||[""],h=b.length;while(h--)f=oa.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=oa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,e,f){var g,h,i,j,l,m,o,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(i=m=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!na.test(q+n.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),h=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:n.makeArray(c,[b]),l=n.event.special[q]||{},f||!l.trigger||l.trigger.apply(e,c)!==!1)){if(!f&&!l.noBubble&&!n.isWindow(e)){for(j=l.delegateType||q,na.test(j+q)||(i=i.parentNode);i;i=i.parentNode)p.push(i),m=i;m===(e.ownerDocument||d)&&p.push(m.defaultView||m.parentWindow||a)}o=0;while((i=p[o++])&&!b.isPropagationStopped())b.type=o>1?j:l.bindType||q,g=(n._data(i,"events")||{})[b.type]&&n._data(i,"handle"),g&&g.apply(i,c),g=h&&i[h],g&&g.apply&&M(i)&&(b.result=g.apply(i,c),b.result===!1&&b.preventDefault());if(b.type=q,!f&&!b.isDefaultPrevented()&&(!l._default||l._default.apply(p.pop(),c)===!1)&&M(e)&&h&&e[q]&&!n.isWindow(e)){m=e[h],m&&(e[h]=null),n.event.triggered=q;try{e[q]()}catch(s){}n.event.triggered=void 0,m&&(e[h]=m)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]","i"),va=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,wa=/\s*$/g,Aa=ca(d),Ba=Aa.appendChild(d.createElement("div"));function Ca(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function Da(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function Ea(a){var b=ya.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Fa(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Ga(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(Da(b).text=a.text,Ea(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&Z.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}}function Ha(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&xa.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),Ha(f,b,c,d)});if(o&&(k=ja(b,a[0].ownerDocument,!1,a,d),e=k.firstChild,1===k.childNodes.length&&(k=e),e||d)){for(i=n.map(ea(k,"script"),Da),h=i.length;o>m;m++)g=k,m!==p&&(g=n.clone(g,!0,!0),h&&n.merge(i,ea(g,"script"))),c.call(a[m],g,m);if(h)for(j=i[i.length-1].ownerDocument,n.map(i,Ea),m=0;h>m;m++)g=i[m],_.test(g.type||"")&&!n._data(g,"globalEval")&&n.contains(j,g)&&(g.src?n._evalUrl&&n._evalUrl(g.src):n.globalEval((g.text||g.textContent||g.innerHTML||"").replace(za,"")));k=e=null}return a}function Ia(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(ea(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&fa(ea(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(va,"<$1>")},clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!ua.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(Ba.innerHTML=a.outerHTML,Ba.removeChild(f=Ba.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=ea(f),h=ea(a),g=0;null!=(e=h[g]);++g)d[g]&&Ga(e,d[g]);if(b)if(c)for(h=h||ea(a),d=d||ea(f),g=0;null!=(e=h[g]);g++)Fa(e,d[g]);else Fa(a,f);return d=ea(f,"script"),d.length>0&&fa(d,!i&&ea(a,"script")),d=h=e=null,f},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.attributes,m=n.event.special;null!=(d=a[h]);h++)if((b||M(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k||"undefined"==typeof d.removeAttribute?d[i]=void 0:d.removeAttribute(i),c.push(f))}}}),n.fn.extend({domManip:Ha,detach:function(a){return Ia(this,a,!0)},remove:function(a){return Ia(this,a)},text:function(a){return Y(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||d).createTextNode(a))},null,a,arguments.length)},append:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.appendChild(a)}})},prepend:function(){return Ha(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ca(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ha(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(ea(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return Y(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(ta,""):void 0;if("string"==typeof a&&!wa.test(a)&&(l.htmlSerialize||!ua.test(a))&&(l.leadingWhitespace||!aa.test(a))&&!da[($.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(ea(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ha(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(ea(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],f=n(a),h=f.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(f[d])[b](c),g.apply(e,c.get());return this.pushStack(e)}});var Ja,Ka={HTML:"block",BODY:"block"};function La(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function Ma(a){var b=d,c=Ka[a];return c||(c=La(a,b),"none"!==c&&c||(Ja=(Ja||n("