From 63fa499a192ebf2aad5ca4b7543c825ad8c18328 Mon Sep 17 00:00:00 2001
From: Ryan Rathsam
Date: Thu, 18 Sep 2025 14:31:43 -0400
Subject: [PATCH 01/83] Initial Symfony Migration changes
These changes provide the initial migration of XDMoD's rest framework to Symfony
---
.circleci/config.yml | 11 +-
.env | 8 +
bin/acl-config | 1 +
bin/console | 17 +
.../SAML/XDSamlAuthentication.php | 19 +-
classes/CCR/CCRDBHandler.php | 21 +-
classes/CCR/CCRLineFormatter.php | 5 +
classes/CCR/Log.php | 40 +-
classes/CCR/Logger.php | 71 -
classes/Configuration/Configuration.php | 14 +-
classes/DB/ArrayIngestor.php | 6 +-
classes/DB/FilterListHelper.php | 2 +-
classes/DataWarehouse/Access/Usage.php | 16 +-
classes/DataWarehouse/Data/BatchDataset.php | 10 +-
.../DataWarehouse/Data/TimeseriesDataset.php | 4 +-
classes/DataWarehouse/Export/RealmManager.php | 7 +-
classes/DataWarehouse/ExportBuilder.php | 25 +
.../Query/TimeAggregationUnit.php | 11 +
classes/DataWarehouse/Visualization.php | 8 +-
.../Visualization/AggregateChart.php | 3 +
.../Visualization/TimeseriesChart.php | 9 +-
classes/ETL/Aggregator/JobsAggregator.php | 24 +-
classes/ETL/Aggregator/pdoAggregator.php | 18 +-
.../ETL/Configuration/EtlConfiguration.php | 14 +-
classes/ETL/DataEndpoint/DirectoryScanner.php | 12 +-
.../DataEndpoint/Filter/ExternalProcess.php | 10 +-
classes/ETL/DataEndpoint/aStructuredFile.php | 12 +-
classes/ETL/DbModel/Column.php | 14 +-
classes/ETL/DbModel/Entity.php | 5 +-
classes/ETL/Ingestor/RestIngestor.php | 2 +-
classes/ETL/aOptions.php | 10 +-
classes/Models/DBObject.php | 1 +
classes/Models/Services/Tokens.php | 4 +-
classes/OpenXdmod/Build/Packager.php | 18 +
classes/Realm/Realm.php | 22 +-
.../Controllers/AdminControllerProvider.php | 57 -
.../AuthenticationControllerProvider.php | 155 -
.../Controllers/BaseControllerProvider.php | 790 --
.../DashboardControllerProvider.php | 430 -
.../Controllers/LegacyControllerProvider.php | 129 -
.../MetricExplorerControllerProvider.php | 405 -
.../Controllers/PersonControllerProvider.php | 55 -
.../WarehouseExportControllerProvider.php | 416 -
classes/Rest/RestFacade.php | 138 -
classes/Rest/Utilities/Authentication.php | 275 -
classes/Rest/Utilities/Conversions.php | 57 -
classes/Rest/XdmodApplicationFactory.php | 266 -
classes/UserStorage.php | 2 +-
classes/XDChartPool.php | 75 +-
classes/XDReportManager.php | 29 +-
classes/XDSessionManager.php | 22 +-
classes/XDUser.php | 220 +-
classes/Xdmod/NodeSet.php | 10 +-
composer.json | 116 +-
composer.lock | 9229 +++++++++++++----
config/bundles.php | 12 +
config/packages/cache.yaml | 19 +
config/packages/dev/monolog.yaml | 17 +
config/packages/doctrine.yaml | 50 +
config/packages/doctrine_migrations.yaml | 6 +
config/packages/framework.yaml | 26 +
config/packages/google_recaptcha.yaml | 21 +
config/packages/maker.yaml | 5 +
config/packages/monolog.yaml | 61 +
config/packages/nyholm_psr7.yaml | 11 +
config/packages/property_info.yaml | 3 +
config/packages/routing.yaml | 12 +
config/packages/security.yaml | 60 +
config/packages/twig.yaml | 7 +
config/packages/twig_extensions.yaml | 11 +
config/packages/web_profiler.yaml | 21 +
config/preload.php | 5 +
config/routes.yaml | 5 +
config/routes/framework.yaml | 4 +
config/routes/routes.yaml | 18 +
config/routes/security.yaml | 3 +
config/routes/web_profiler.yaml | 8 +
config/services.yaml | 71 +
configuration/constants.php | 4 +-
configuration/linker.php | 2 +-
configuration/portal_settings.ini | 2 +-
html/about/federated.php | 113 -
html/about/images/Case_Western_logo.png | Bin 81675 -> 0 bytes
html/about/images/SDSC_logo.jpg | Bin 9464 -> 0 bytes
html/about/images/Tufts_logo.png | Bin 6887 -> 0 bytes
html/about/images/access_logo.png | Bin 10078 -> 0 bytes
html/about/links.html | 20 -
html/about/openxd.html | 39 -
html/about/presentations.html | 148 -
html/about/roadmap.php | 60 -
html/about/supremm.html | 30 -
html/about/team.html | 28 -
html/about/xdmod.php | 35 -
html/auth_error.php | 51 -
html/controllers/chart_pool.php | 25 -
html/controllers/chart_pool/add_to_queue.php | 41 -
.../chart_pool/remove_from_queue.php | 40 -
html/controllers/common_params.php | 206 -
html/controllers/dashboard.php | 31 -
html/controllers/dashboard_launch.php | 43 -
html/controllers/mailer.php | 18 -
html/controllers/mailer/contact.php | 119 -
html/controllers/mailer/sign_up.php | 106 -
html/controllers/metric_explorer.php | 35 -
html/controllers/metric_explorer/common.php | 255 -
html/controllers/metric_explorer/get_data.php | 33 -
.../metric_explorer/get_dimension.php | 35 -
.../metric_explorer/get_dw_descripter.php | 166 -
.../metric_explorer/get_filters.php | 47 -
.../metric_explorer/get_rawdata.php | 189 -
.../metric_explorer/set_filters.php | 28 -
html/controllers/public_interface.php | 24 -
.../public_interface/get_public.php | 50 -
html/controllers/report_builder.php | 49 -
.../report_builder/build_from_template.php | 30 -
.../report_builder/download_report.php | 96 -
.../report_builder/enum_available_charts.php | 26 -
.../report_builder/enum_reports.php | 25 -
.../report_builder/enum_templates.php | 30 -
.../report_builder/fetch_report_data.php | 57 -
.../report_builder/get_new_report_name.php | 26 -
.../report_builder/get_preview_data.php | 35 -
.../report_builder/remove_chart_from_pool.php | 45 -
.../report_builder/remove_report_by_id.php | 31 -
.../report_builder/save_report.php | 159 -
.../report_builder/send_report.php | 113 -
html/controllers/role_manager.php | 27 -
.../role_manager/downgrade_member.php | 38 -
.../enum_center_staff_members.php | 27 -
.../role_manager/get_member_status.php | 58 -
.../role_manager/upgrade_member.php | 65 -
html/controllers/sab_user.php | 27 -
.../sab_user/assign_assumed_person.php | 38 -
html/controllers/sab_user/enum_tg_users.php | 105 -
html/controllers/sab_user/get_mapping.php | 36 -
html/controllers/ui_data/summary3.php | 161 -
html/controllers/user_admin.php | 36 -
html/controllers/user_admin/create_user.php | 150 -
html/controllers/user_admin/delete_user.php | 42 -
.../user_admin/empty_report_image_cache.php | 35 -
.../enum_exception_email_addresses.php | 15 -
.../user_admin/enum_institutions.php | 25 -
.../user_admin/enum_resource_providers.php | 29 -
html/controllers/user_admin/enum_roles.php | 30 -
.../user_admin/enum_user_types.php | 23 -
.../user_admin/get_user_details.php | 81 -
html/controllers/user_admin/list_users.php | 48 -
html/controllers/user_admin/pass_reset.php | 65 -
html/controllers/user_admin/search_users.php | 23 -
html/controllers/user_admin/update_user.php | 229 -
html/controllers/user_auth.php | 30 -
html/controllers/user_auth/login.php | 31 -
html/controllers/user_auth/logout.php | 9 -
html/controllers/user_auth/pass_reset.php | 65 -
html/controllers/user_auth/session_check.php | 21 -
html/controllers/user_auth/update_pass.php | 52 -
html/controllers/user_interface.php | 43 -
.../controllers/user_interface/get_charts.php | 34 -
html/controllers/user_interface/get_data.php | 4 -
html/controllers/user_interface/get_menus.php | 260 -
.../user_interface/get_param_descriptions.php | 41 -
html/controllers/user_interface/get_tabs.php | 58 -
html/gaq.php | 3 -
html/gaq/xdmod.php | 10 -
.../css => gui/css/dashboard}/AdminPanel.css | 14 +-
.../css => gui/css/dashboard}/dashboard.css | 0
html/gui/css/dashboard/management.css | 72 +
.../css => gui/css/dashboard}/menu.css | 0
.../css => gui/css/dashboard}/splash.css | 0
.../images/about}/Ccr_ub_logo.jpg | Bin
.../images/about}/OpenXDMOD20.png | Bin
.../images/about}/OpenXDMoDUsage.png | Bin
.../images => gui/images/about}/SUPPReM.png | Bin
.../images/about}/Supremm_drop_off.png | Bin
.../images => gui/images/about}/TACC_logo.png | Bin
.../images/about}/XDMoDsummary.png | Bin
.../images/about}/federated-diagram-1.gif | Bin
.../images/about/indianauniversity_logo.jpg | Bin 0 -> 24178 bytes
.../images => gui/images/about}/nsf_logo.png | Bin
.../images/about}/xdmod_logo.png | Bin
html/gui/images/about/xsede_logo.jpg | Bin 0 -> 25306 bytes
.../images/dashboard}/arrow_left.png | Bin
.../images/dashboard}/center_edit.png | Bin
.../images/dashboard}/icon_delete.png | Bin
.../images/dashboard}/icon_dialog.png | Bin
.../images/dashboard}/icon_edit.png | Bin
.../images/dashboard}/icon_email.png | Bin
.../images/dashboard}/icon_email_cancel.png | Bin
.../images/dashboard}/icon_email_send.png | Bin
.../images/dashboard}/icon_exception.png | Bin
.../images/dashboard}/icon_group.png | Bin
.../images/dashboard}/icon_ldif.png | Bin
.../images/dashboard}/icon_login.png | Bin
.../images/dashboard}/icon_refresh.png | Bin
.../images/dashboard}/icon_reset.png | Bin
.../images/dashboard}/icon_role.png | Bin
.../images/dashboard}/icon_save.png | Bin
.../images/dashboard}/masthead.png | Bin
.../images/dashboard}/masthead_splash.png | Bin
html/gui/js/CCR.js | 39 +-
html/gui/js/Viewer.js | 3 +-
.../js/dashboard}/AccountRequests.js | 8 +-
.../js/dashboard}/BatchMailClient.js | 8 +-
.../js => gui/js/dashboard}/CommentEditor.js | 170 +-
.../js => gui/js/dashboard}/CurrentUsers.js | 8 +-
.../js/dashboard}/Dashboard/Factory.js | 0
.../js/dashboard}/Dashboard/FramePanel.js | 0
.../js/dashboard}/Dashboard/MenuStore.js | 2 +-
.../js/dashboard}/Dashboard/Viewport.js | 10 +-
.../js => gui/js/dashboard}/DashboardStore.js | 0
.../js => gui/js/dashboard}/DashboardTools.js | 0
.../js/dashboard}/ExceptionLister.js | 0
.../js => gui/js/dashboard}/Log/GridPanel.js | 0
.../js/dashboard}/Log/LevelsStore.js | 2 +-
.../js => gui/js/dashboard}/Log/Store.js | 2 +-
.../js/dashboard}/Log/SummaryPortlet.js | 0
.../js/dashboard}/Log/SummaryStore.js | 2 +-
.../js => gui/js/dashboard}/Log/TabPanel.js | 0
.../dashboard}/RecipientVerificationPrompt.js | 0
.../js/dashboard}/Summary/ConfigStore.js | 2 +-
.../js => gui/js/dashboard}/Summary/Portal.js | 0
.../js/dashboard}/Summary/Portlet.js | 0
.../js/dashboard}/Summary/PortletsStore.js | 2 +-
.../js/dashboard}/Summary/TabPanel.js | 0
.../js/dashboard}/UserManagement/Panel.js | 0
.../js => gui/js/dashboard}/UserStats.js | 6 +-
.../js/dashboard}/UsersSummary/Portlet.js | 0
.../js/dashboard}/UsersSummary/Store.js | 2 +-
.../js/dashboard}/admin_panel/AclGrid.js | 8 +-
.../js/dashboard}/admin_panel/AdminPanel.js | 0
.../js/dashboard}/admin_panel/RoleGrid.js | 10 +-
.../admin_panel/SectionExistingUsers.js | 16 +-
.../dashboard}/admin_panel/SectionNewUser.js | 6 +-
.../js => gui/js/dashboard}/common.js | 0
.../js => gui/js/dashboard}/dashboard.js | 4 +-
.../js => gui/js/dashboard}/messaging.js | 0
html/gui/js/dashboard/test-failed-1.png | Bin 0 -> 108428 bytes
html/img_placeholder.php | 11 -
html/index.php | 660 +-
html/internal_dashboard/analytics/index.php | 9 -
.../controllers/controller.php | 213 -
.../controllers/dashboard.php | 10 -
.../controllers/dashboard/get_menu.php | 29 -
html/internal_dashboard/controllers/log.php | 12 -
.../controllers/log/get_levels.php | 34 -
.../controllers/log/get_messages.php | 98 -
.../controllers/log/get_summary.php | 26 -
.../internal_dashboard/controllers/mailer.php | 106 -
.../controllers/pseudo_login.php | 105 -
.../controllers/summary.php | 12 -
.../controllers/summary/get_config.php | 64 -
.../controllers/summary/get_portlets.php | 62 -
html/internal_dashboard/controllers/user.php | 10 -
.../controllers/user/get_summary.php | 52 -
html/internal_dashboard/css/management.css | 72 -
html/internal_dashboard/index.php | 224 -
html/internal_dashboard/splash.php | 75 -
html/internal_dashboard/user_check.php | 63 -
html/password_reset.php | 185 -
html/report_image_renderer.php | 164 -
html/rest/index.php | 25 -
html/rest/maintenance.php | 9 -
html/unit_tests/.eslintrc.json | 9 -
html/unit_tests/Array.prototype.includes.js | 37 -
html/unit_tests/coverage.html | 91 -
html/unit_tests/index.html | 79 -
html/unit_tests/phantom.js | 35 -
html/unit_tests/spec/.eslintrc.json | 12 -
html/unit_tests/spec/CCRTokenizeSpec.js | 71 -
html/unit_tests/spec/ChangeStackSpec.js | 141 -
html/unit_tests/spec/JobViewerSpec.js | 91 -
html/unit_tests/spec/XDMoDFormatSpec.js | 89 -
libraries/security.php | 236 +-
libraries/utilities.php | 19 +-
.../build_scripts/templates/install.template | 6 +-
open_xdmod/modules/xdmod/build.json | 18 +-
open_xdmod/modules/xdmod/xdmod.spec.in | 10 +-
src/Controller/.gitignore | 0
src/Controller/AboutController.php | 178 +
src/Controller/AccountController.php | 97 +
src/Controller/AdminController.php | 78 +
src/Controller/AuthenticationController.php | 248 +
src/Controller/BaseController.php | 695 ++
src/Controller/ChartPoolController.php | 107 +
src/Controller/DashboardController.php | 519 +
src/Controller/HomeController.php | 363 +
.../InternalDashboardController.php | 469 +
.../InternalDashboard/LogController.php | 184 +
.../InternalDashboard/MailerController.php | 114 +
.../InternalDashboard/SABUserController.php | 112 +
.../InternalDashboard/SummaryController.php | 307 +
.../InternalDashboard/UserAdminController.php | 981 ++
.../InternalDashboard/UserVisitController.php | 83 +
src/Controller/MailController.php | 225 +
src/Controller/MetricExplorerController.php | 1017 ++
src/Controller/OrganizationController.php | 277 +
src/Controller/PasswordResetController.php | 63 +
src/Controller/PersonController.php | 37 +
src/Controller/ReportBuilderController.php | 703 ++
src/Controller/ResourceController.php | 9 +
.../Controller/UserController.php | 300 +-
src/Controller/UserInterfaceController.php | 459 +
.../Controller/WarehouseController.php | 2156 ++--
src/Controller/WarehouseExportController.php | 391 +
src/Entity/.gitignore | 0
src/Entity/User.php | 183 +
src/Errors/ErrorController.php | 51 +
src/EventListeners/LogoutListener.php | 29 +
src/Kernel.php | 26 +
src/Repository/.gitignore | 0
src/Security/AccessDeniedHandler.php | 22 +
.../Authenticators/FormLoginAuthenticator.php | 241 +
.../SimpleSamlPhpAuthenticator.php | 174 +
src/Security/Helpers/Tokens.php | 170 +
.../PasswordHashers/DefaultPasswordHasher.php | 28 +
src/Security/TokenUserProvider.php | 80 +
src/Security/UsernameUserProvider.php | 146 +
symfony.lock | 202 +
templates/about/federated.html.twig | 65 +
templates/about/links.html.twig | 40 +
templates/about/open_xdmod.html.twig | 44 +
templates/about/presentations.html.twig | 148 +
.../about/publications.html.twig | 0
templates/about/roadmap.html.twig | 17 +
templates/about/supremm.html.twig | 24 +
templates/about/team.html.twig | 27 +
templates/about/xdmod.html.twig | 47 +
.../about/xdmod_release_notes.html.twig | 0
templates/apache.conf | 65 +-
templates/base.html.twig | 18 +
templates/emails/new_user.html.twig | 12 +
templates/emails/password_reset.html.twig | 15 +
templates/index.html.twig | 390 +
templates/internal_dashboard.html.twig | 200 +
templates/internal_dashboard_login.html.twig | 135 +
templates/password_reset.html.twig | 108 +
templates/password_reset_expired.html.twig | 35 +
...sses-update_enum_user_types_and_roles.json | 4 +-
...es__-update_enum_user_types_and_roles.json | 6 +-
.../user_admin/input/get_user_visits.json | 62 +-
tests/ci/samlSetup.sh | 501 +-
tests/component/lib/BaseTest.php | 35 +
tests/component/lib/ETL/IngestorTest.php | 9 +-
.../component/lib/Export/FileManagerTest.php | 2 -
.../component/lib/Export/RealmManagerTest.php | 12 +-
tests/component/lib/XDUserTest.php | 2 +-
tests/integration/lib/BaseTest.php | 10 +
.../lib/Controllers/BaseUserAdminTest.php | 125 +-
.../lib/Controllers/ControllerTest.php | 14 +-
.../lib/Controllers/MetricExplorerTest.php | 16 +-
.../lib/Controllers/ReportBuilderTest.php | 79 +-
.../lib/Controllers/RoleDelegationTest.php | 12 +-
.../lib/Controllers/SSOLoginTest.php | 4 +-
.../lib/Controllers/UsageExplorerTest.php | 47 +-
.../lib/Controllers/UserAdminTest.php | 30 +-
.../lib/Logging/CCRDBHandlerTest.php | 45 +-
tests/integration/lib/Rest/JobViewerTest.php | 8 +-
.../Rest/WarehouseControllerProviderTest.php | 2 +-
.../WarehouseExportControllerProviderTest.php | 32 +-
.../lib/TestHarness/XdmodTestHelper.php | 11 +-
.../lib/internal_dashboard.selectors.ts | 17 +-
tests/playwright/lib/usageTab.page.ts | 13 +-
.../internal_dashboard.spec.ts | 28 +-
.../Controllers/MetricExplorerChartsTest.php | 22 +-
.../lib/Controllers/UsageChartsTest.php | 4 +-
.../lib/Controllers/UsageExplorerJobsTest.php | 2 +-
.../lib/TestHarness/RegressionTestHelper.php | 2 +-
.../lib/DataWarehouse/VisualizationTest.php | 10 +-
.../JsonReferenceWithFallbackTest.php | 4 +-
.../ETL/DataEndpoint/WebServerLogFileTest.php | 26 +-
tests/unit/lib/LogTest.php | 2 +-
371 files changed, 21140 insertions(+), 15267 deletions(-)
create mode 100644 .env
create mode 100755 bin/console
delete mode 100644 classes/Rest/Controllers/AdminControllerProvider.php
delete mode 100644 classes/Rest/Controllers/AuthenticationControllerProvider.php
delete mode 100644 classes/Rest/Controllers/DashboardControllerProvider.php
delete mode 100644 classes/Rest/Controllers/LegacyControllerProvider.php
delete mode 100644 classes/Rest/Controllers/MetricExplorerControllerProvider.php
delete mode 100644 classes/Rest/Controllers/PersonControllerProvider.php
delete mode 100644 classes/Rest/RestFacade.php
delete mode 100644 classes/Rest/Utilities/Authentication.php
delete mode 100644 classes/Rest/Utilities/Conversions.php
create mode 100644 config/bundles.php
create mode 100644 config/packages/cache.yaml
create mode 100644 config/packages/dev/monolog.yaml
create mode 100644 config/packages/doctrine.yaml
create mode 100644 config/packages/doctrine_migrations.yaml
create mode 100644 config/packages/framework.yaml
create mode 100644 config/packages/google_recaptcha.yaml
create mode 100644 config/packages/maker.yaml
create mode 100644 config/packages/monolog.yaml
create mode 100644 config/packages/nyholm_psr7.yaml
create mode 100644 config/packages/property_info.yaml
create mode 100644 config/packages/routing.yaml
create mode 100644 config/packages/security.yaml
create mode 100644 config/packages/twig.yaml
create mode 100644 config/packages/twig_extensions.yaml
create mode 100644 config/packages/web_profiler.yaml
create mode 100644 config/preload.php
create mode 100644 config/routes.yaml
create mode 100644 config/routes/framework.yaml
create mode 100644 config/routes/routes.yaml
create mode 100644 config/routes/security.yaml
create mode 100644 config/routes/web_profiler.yaml
create mode 100644 config/services.yaml
delete mode 100644 html/about/federated.php
delete mode 100644 html/about/images/Case_Western_logo.png
delete mode 100644 html/about/images/SDSC_logo.jpg
delete mode 100644 html/about/images/Tufts_logo.png
delete mode 100644 html/about/images/access_logo.png
delete mode 100644 html/about/links.html
delete mode 100644 html/about/openxd.html
delete mode 100644 html/about/presentations.html
delete mode 100644 html/about/supremm.html
delete mode 100644 html/about/team.html
delete mode 100644 html/about/xdmod.php
delete mode 100644 html/auth_error.php
delete mode 100644 html/controllers/chart_pool.php
delete mode 100644 html/controllers/chart_pool/add_to_queue.php
delete mode 100644 html/controllers/chart_pool/remove_from_queue.php
delete mode 100644 html/controllers/common_params.php
delete mode 100644 html/controllers/dashboard.php
delete mode 100644 html/controllers/dashboard_launch.php
delete mode 100644 html/controllers/mailer.php
delete mode 100644 html/controllers/mailer/contact.php
delete mode 100644 html/controllers/mailer/sign_up.php
delete mode 100644 html/controllers/metric_explorer.php
delete mode 100644 html/controllers/metric_explorer/common.php
delete mode 100644 html/controllers/metric_explorer/get_data.php
delete mode 100644 html/controllers/metric_explorer/get_dimension.php
delete mode 100644 html/controllers/metric_explorer/get_dw_descripter.php
delete mode 100644 html/controllers/metric_explorer/get_filters.php
delete mode 100644 html/controllers/metric_explorer/get_rawdata.php
delete mode 100644 html/controllers/metric_explorer/set_filters.php
delete mode 100644 html/controllers/public_interface.php
delete mode 100644 html/controllers/public_interface/get_public.php
delete mode 100644 html/controllers/report_builder.php
delete mode 100644 html/controllers/report_builder/build_from_template.php
delete mode 100644 html/controllers/report_builder/download_report.php
delete mode 100644 html/controllers/report_builder/enum_available_charts.php
delete mode 100644 html/controllers/report_builder/enum_reports.php
delete mode 100644 html/controllers/report_builder/enum_templates.php
delete mode 100644 html/controllers/report_builder/fetch_report_data.php
delete mode 100644 html/controllers/report_builder/get_new_report_name.php
delete mode 100644 html/controllers/report_builder/get_preview_data.php
delete mode 100644 html/controllers/report_builder/remove_chart_from_pool.php
delete mode 100644 html/controllers/report_builder/remove_report_by_id.php
delete mode 100644 html/controllers/report_builder/save_report.php
delete mode 100644 html/controllers/report_builder/send_report.php
delete mode 100644 html/controllers/role_manager.php
delete mode 100644 html/controllers/role_manager/downgrade_member.php
delete mode 100644 html/controllers/role_manager/enum_center_staff_members.php
delete mode 100644 html/controllers/role_manager/get_member_status.php
delete mode 100644 html/controllers/role_manager/upgrade_member.php
delete mode 100644 html/controllers/sab_user.php
delete mode 100644 html/controllers/sab_user/assign_assumed_person.php
delete mode 100644 html/controllers/sab_user/enum_tg_users.php
delete mode 100644 html/controllers/sab_user/get_mapping.php
delete mode 100644 html/controllers/ui_data/summary3.php
delete mode 100644 html/controllers/user_admin.php
delete mode 100644 html/controllers/user_admin/create_user.php
delete mode 100644 html/controllers/user_admin/delete_user.php
delete mode 100644 html/controllers/user_admin/empty_report_image_cache.php
delete mode 100644 html/controllers/user_admin/enum_exception_email_addresses.php
delete mode 100644 html/controllers/user_admin/enum_institutions.php
delete mode 100644 html/controllers/user_admin/enum_resource_providers.php
delete mode 100644 html/controllers/user_admin/enum_roles.php
delete mode 100644 html/controllers/user_admin/enum_user_types.php
delete mode 100644 html/controllers/user_admin/get_user_details.php
delete mode 100644 html/controllers/user_admin/list_users.php
delete mode 100644 html/controllers/user_admin/pass_reset.php
delete mode 100644 html/controllers/user_admin/search_users.php
delete mode 100644 html/controllers/user_admin/update_user.php
delete mode 100644 html/controllers/user_auth.php
delete mode 100644 html/controllers/user_auth/login.php
delete mode 100644 html/controllers/user_auth/logout.php
delete mode 100644 html/controllers/user_auth/pass_reset.php
delete mode 100644 html/controllers/user_auth/session_check.php
delete mode 100644 html/controllers/user_auth/update_pass.php
delete mode 100644 html/controllers/user_interface.php
delete mode 100644 html/controllers/user_interface/get_charts.php
delete mode 100644 html/controllers/user_interface/get_data.php
delete mode 100644 html/controllers/user_interface/get_menus.php
delete mode 100644 html/controllers/user_interface/get_param_descriptions.php
delete mode 100644 html/controllers/user_interface/get_tabs.php
delete mode 100644 html/gaq.php
delete mode 100644 html/gaq/xdmod.php
rename html/{internal_dashboard/css => gui/css/dashboard}/AdminPanel.css (87%)
rename html/{internal_dashboard/css => gui/css/dashboard}/dashboard.css (100%)
create mode 100644 html/gui/css/dashboard/management.css
rename html/{internal_dashboard/css => gui/css/dashboard}/menu.css (100%)
rename html/{internal_dashboard/css => gui/css/dashboard}/splash.css (100%)
rename html/{about/images => gui/images/about}/Ccr_ub_logo.jpg (100%)
rename html/{about/images => gui/images/about}/OpenXDMOD20.png (100%)
rename html/{about/images => gui/images/about}/OpenXDMoDUsage.png (100%)
rename html/{about/images => gui/images/about}/SUPPReM.png (100%)
rename html/{about/images => gui/images/about}/Supremm_drop_off.png (100%)
rename html/{about/images => gui/images/about}/TACC_logo.png (100%)
rename html/{about/images => gui/images/about}/XDMoDsummary.png (100%)
rename html/{about/images => gui/images/about}/federated-diagram-1.gif (100%)
create mode 100644 html/gui/images/about/indianauniversity_logo.jpg
rename html/{about/images => gui/images/about}/nsf_logo.png (100%)
rename html/{about/images => gui/images/about}/xdmod_logo.png (100%)
create mode 100644 html/gui/images/about/xsede_logo.jpg
rename html/{internal_dashboard/images => gui/images/dashboard}/arrow_left.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/center_edit.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_delete.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_dialog.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_edit.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_email.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_email_cancel.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_email_send.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_exception.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_group.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_ldif.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_login.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_refresh.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_reset.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_role.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/icon_save.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/masthead.png (100%)
rename html/{internal_dashboard/images => gui/images/dashboard}/masthead_splash.png (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/AccountRequests.js (98%)
rename html/{internal_dashboard/js => gui/js/dashboard}/BatchMailClient.js (97%)
rename html/{internal_dashboard/js => gui/js/dashboard}/CommentEditor.js (76%)
rename html/{internal_dashboard/js => gui/js/dashboard}/CurrentUsers.js (97%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Dashboard/Factory.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Dashboard/FramePanel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Dashboard/MenuStore.js (97%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Dashboard/Viewport.js (97%)
rename html/{internal_dashboard/js => gui/js/dashboard}/DashboardStore.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/DashboardTools.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/ExceptionLister.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/GridPanel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/LevelsStore.js (96%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/Store.js (99%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/SummaryPortlet.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/SummaryStore.js (98%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Log/TabPanel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/RecipientVerificationPrompt.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Summary/ConfigStore.js (96%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Summary/Portal.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Summary/Portlet.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Summary/PortletsStore.js (96%)
rename html/{internal_dashboard/js => gui/js/dashboard}/Summary/TabPanel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/UserManagement/Panel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/UserStats.js (98%)
rename html/{internal_dashboard/js => gui/js/dashboard}/UsersSummary/Portlet.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/UsersSummary/Store.js (95%)
rename html/{internal_dashboard/js => gui/js/dashboard}/admin_panel/AclGrid.js (98%)
rename html/{internal_dashboard/js => gui/js/dashboard}/admin_panel/AdminPanel.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/admin_panel/RoleGrid.js (98%)
rename html/{internal_dashboard/js => gui/js/dashboard}/admin_panel/SectionExistingUsers.js (99%)
rename html/{internal_dashboard/js => gui/js/dashboard}/admin_panel/SectionNewUser.js (99%)
rename html/{internal_dashboard/js => gui/js/dashboard}/common.js (100%)
rename html/{internal_dashboard/js => gui/js/dashboard}/dashboard.js (93%)
rename html/{internal_dashboard/js => gui/js/dashboard}/messaging.js (100%)
create mode 100644 html/gui/js/dashboard/test-failed-1.png
delete mode 100644 html/img_placeholder.php
delete mode 100644 html/internal_dashboard/analytics/index.php
delete mode 100644 html/internal_dashboard/controllers/controller.php
delete mode 100644 html/internal_dashboard/controllers/dashboard.php
delete mode 100644 html/internal_dashboard/controllers/dashboard/get_menu.php
delete mode 100644 html/internal_dashboard/controllers/log.php
delete mode 100644 html/internal_dashboard/controllers/log/get_levels.php
delete mode 100644 html/internal_dashboard/controllers/log/get_messages.php
delete mode 100644 html/internal_dashboard/controllers/log/get_summary.php
delete mode 100644 html/internal_dashboard/controllers/mailer.php
delete mode 100644 html/internal_dashboard/controllers/pseudo_login.php
delete mode 100644 html/internal_dashboard/controllers/summary.php
delete mode 100644 html/internal_dashboard/controllers/summary/get_config.php
delete mode 100644 html/internal_dashboard/controllers/summary/get_portlets.php
delete mode 100644 html/internal_dashboard/controllers/user.php
delete mode 100644 html/internal_dashboard/controllers/user/get_summary.php
delete mode 100644 html/internal_dashboard/css/management.css
delete mode 100644 html/internal_dashboard/index.php
delete mode 100644 html/internal_dashboard/splash.php
delete mode 100644 html/internal_dashboard/user_check.php
delete mode 100644 html/password_reset.php
delete mode 100644 html/report_image_renderer.php
delete mode 100644 html/rest/index.php
delete mode 100644 html/rest/maintenance.php
delete mode 100644 html/unit_tests/.eslintrc.json
delete mode 100644 html/unit_tests/Array.prototype.includes.js
delete mode 100644 html/unit_tests/coverage.html
delete mode 100644 html/unit_tests/index.html
delete mode 100644 html/unit_tests/phantom.js
delete mode 100644 html/unit_tests/spec/.eslintrc.json
delete mode 100644 html/unit_tests/spec/CCRTokenizeSpec.js
delete mode 100644 html/unit_tests/spec/ChangeStackSpec.js
delete mode 100644 html/unit_tests/spec/JobViewerSpec.js
delete mode 100644 html/unit_tests/spec/XDMoDFormatSpec.js
create mode 100644 src/Controller/.gitignore
create mode 100644 src/Controller/AboutController.php
create mode 100644 src/Controller/AccountController.php
create mode 100644 src/Controller/AdminController.php
create mode 100644 src/Controller/AuthenticationController.php
create mode 100644 src/Controller/BaseController.php
create mode 100644 src/Controller/ChartPoolController.php
create mode 100644 src/Controller/DashboardController.php
create mode 100644 src/Controller/HomeController.php
create mode 100644 src/Controller/InternalDashboard/InternalDashboardController.php
create mode 100644 src/Controller/InternalDashboard/LogController.php
create mode 100644 src/Controller/InternalDashboard/MailerController.php
create mode 100644 src/Controller/InternalDashboard/SABUserController.php
create mode 100644 src/Controller/InternalDashboard/SummaryController.php
create mode 100644 src/Controller/InternalDashboard/UserAdminController.php
create mode 100644 src/Controller/InternalDashboard/UserVisitController.php
create mode 100644 src/Controller/MailController.php
create mode 100644 src/Controller/MetricExplorerController.php
create mode 100644 src/Controller/OrganizationController.php
create mode 100644 src/Controller/PasswordResetController.php
create mode 100644 src/Controller/PersonController.php
create mode 100644 src/Controller/ReportBuilderController.php
create mode 100644 src/Controller/ResourceController.php
rename classes/Rest/Controllers/UserControllerProvider.php => src/Controller/UserController.php (57%)
create mode 100644 src/Controller/UserInterfaceController.php
rename classes/Rest/Controllers/WarehouseControllerProvider.php => src/Controller/WarehouseController.php (55%)
create mode 100644 src/Controller/WarehouseExportController.php
create mode 100644 src/Entity/.gitignore
create mode 100644 src/Entity/User.php
create mode 100644 src/Errors/ErrorController.php
create mode 100644 src/EventListeners/LogoutListener.php
create mode 100644 src/Kernel.php
create mode 100644 src/Repository/.gitignore
create mode 100644 src/Security/AccessDeniedHandler.php
create mode 100644 src/Security/Authenticators/FormLoginAuthenticator.php
create mode 100644 src/Security/Authenticators/SimpleSamlPhpAuthenticator.php
create mode 100644 src/Security/Helpers/Tokens.php
create mode 100644 src/Security/PasswordHashers/DefaultPasswordHasher.php
create mode 100644 src/Security/TokenUserProvider.php
create mode 100644 src/Security/UsernameUserProvider.php
create mode 100644 symfony.lock
create mode 100644 templates/about/federated.html.twig
create mode 100644 templates/about/links.html.twig
create mode 100644 templates/about/open_xdmod.html.twig
create mode 100644 templates/about/presentations.html.twig
rename html/about/publications.html => templates/about/publications.html.twig (100%)
create mode 100644 templates/about/roadmap.html.twig
create mode 100644 templates/about/supremm.html.twig
create mode 100644 templates/about/team.html.twig
create mode 100644 templates/about/xdmod.html.twig
rename html/about/release_notes/xdmod.html => templates/about/xdmod_release_notes.html.twig (100%)
create mode 100644 templates/base.html.twig
create mode 100644 templates/emails/new_user.html.twig
create mode 100644 templates/emails/password_reset.html.twig
create mode 100644 templates/index.html.twig
create mode 100644 templates/internal_dashboard.html.twig
create mode 100644 templates/internal_dashboard_login.html.twig
create mode 100644 templates/password_reset.html.twig
create mode 100644 templates/password_reset_expired.html.twig
diff --git a/.circleci/config.yml b/.circleci/config.yml
index efa6c98678..e5a5c100d2 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -27,7 +27,7 @@ jobs:
- setup_remote_docker
- run:
name: Docker Compose corresponding OS file
- command: docker compose -f ~/project/tests/playwright/Docker/docker-compose.yml up -d
+ command: pushd ~/project/tests/playwright/Docker && docker compose up -d; popd
- run:
name: Generate Key for XDMoD
command: docker exec xdmod openssl genrsa -out /etc/pki/tls/private/localhost.key -rand /proc/cpuinfo:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/uptime 2048
@@ -56,6 +56,13 @@ jobs:
- run:
name: Install XDMoD Composer Dependencies
command: docker exec -w /root/xdmod xdmod composer install
+ - run:
+ name: Fixup php.ini for debugging
+ command: |
+ docker exec xdmod bash -c "sed -i 's|error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT|error_reporting = E_ALL|g' /etc/php.ini"
+ docker exec xdmod bash -c "sed -i 's|display_errors = Off|display_errors = On|g' /etc/php.ini"
+ docker exec xdmod bash -c "sed -i 's|display_startup_errors = Off|display_startup_errors = On|g' /etc/php.ini"
+ docker exec xdmod bash -c "sed -i 's|;error_log = php_errors.log|error_log = php_errors.log|g' /etc/php.ini"
- run:
name: Build XDMoD RPM
command: docker exec -w /root/xdmod xdmod /root/bin/buildrpm xdmod
@@ -78,7 +85,7 @@ jobs:
command: docker exec -w /root/xdmod xdmod composer install
- run:
name: Setup the SimpleSAML server etc. so we can test SSO
- command: docker exec xdmod /root/xdmod/tests/ci/samlSetup.sh
+ command: docker exec xdmod /root/xdmod/tests/ci/samlSetup.sh -t local -h xdmod
- run:
name: Make sure that the Test Dependencies are installed
command: docker exec -w /root/xdmod xdmod composer install --no-progress
diff --git a/.env b/.env
new file mode 100644
index 0000000000..50e3ef8974
--- /dev/null
+++ b/.env
@@ -0,0 +1,8 @@
+# Default ENV file
+DATABASE_URL=
+###> google/recaptcha ###
+# To use Google Recaptcha, you must register a site on Recaptcha's admin panel:
+# https://www.google.com/recaptcha/admin
+GOOGLE_RECAPTCHA_SITE_KEY=
+GOOGLE_RECAPTCHA_SECRET=
+###< google/recaptcha ###
diff --git a/bin/acl-config b/bin/acl-config
index 644f832775..c7987f850d 100755
--- a/bin/acl-config
+++ b/bin/acl-config
@@ -1625,6 +1625,7 @@ SQL;
$log->debug($query);
$log->debug('', $params);
+ $log->debug('Params', $params);
if ($dryRun) {
$log->info($successMsg);
diff --git a/bin/console b/bin/console
new file mode 100755
index 0000000000..30269605c7
--- /dev/null
+++ b/bin/console
@@ -0,0 +1,17 @@
+#!/usr/bin/env php
+_sources = \SimpleSAML_Auth_Source::getSources();
+ $this->_sources = Source::getSources();
if ($this->isSamlConfigured()) {
try {
$authSource = \xd_utilities\getConfiguration('authentication', 'source');
@@ -97,7 +102,7 @@ public function isSamlConfigured()
*/
public function logout(){
if ($this->isSamlConfigured()) {
- \SimpleSAML_Session::getSessionFromRequest()->doLogout($this->authSourceName);
+ Session::getSessionFromRequest()->doLogout($this->authSourceName);
}
}
/**
@@ -112,7 +117,7 @@ public function getXdmodAccount()
/*
* SimpleSAMLphp uses its own session, this sets it back.
*/
- \SimpleSAML_Session::getSessionFromRequest()->cleanup();
+ Session::getSessionFromRequest()->cleanup();
if ($this->_as->isAuthenticated()) {
$userName = $samlAttrs['username'][0];
@@ -205,7 +210,7 @@ public function getOrganizationId($samlAttrs, $personId)
*
* @param string $returnTo the URI to redirect to after auth.
*
- * @return the login URL or false if no provider is configured
+ * @return string|bool login URL or false if no provider is configured
*/
public function getLoginURL($returnTo)
{
@@ -226,8 +231,8 @@ public function getLoginLink()
if (!$this->isSamlConfigured()) {
return false;
}
- $idp = \SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler()->getMetadata(
- \SimpleSAML_Auth_Source::getById($this->authSourceName)->getMetadata()->toArray()['idp'],
+ $idp = MetaDataStorageHandler::getMetadataHandler()->getMetaData(
+ Source::getById($this->authSourceName)->getMetadata()->toArray()['idp'],
'saml20-idp-remote'
);
if (!empty($idp['OrganizationDisplayName'])) {
diff --git a/classes/CCR/CCRDBHandler.php b/classes/CCR/CCRDBHandler.php
index b56bbc5adf..88c2c366cf 100644
--- a/classes/CCR/CCRDBHandler.php
+++ b/classes/CCR/CCRDBHandler.php
@@ -5,6 +5,8 @@
use CCR\DB\iDatabase;
use Exception;
use Monolog\Handler\AbstractProcessingHandler;
+use Monolog\Level;
+use Monolog\LogRecord;
/**
* This class is meant to provide a means of writing log entries to a database within the Monolog framework.
@@ -49,7 +51,7 @@ class CCRDBHandler extends AbstractProcessingHandler
*/
public function __construct(iDatabase $db = null, $schema = null, $table = null, $level = Log::DEBUG, $bubble = true)
{
- parent::__construct($level, $bubble);
+ parent::__construct(Level::fromValue(Log::convertToMonologLevel($level)), $bubble);
if (!isset($db)) {
$db = DB::factory('logger');
@@ -71,16 +73,23 @@ public function __construct(iDatabase $db = null, $schema = null, $table = null,
/**
* @see AbstractProcessingHandler::write()
*/
- protected function write(array $record)
+ protected function write(LogRecord $record): void
{
- $sql = sprintf("INSERT INTO %s.%s (id, logtime, ident, priority, message) VALUES(:id, NOW(), :ident, :priority, :message)", $this->schema, $this->table);
+ $message = array_merge(
+ [
+ 'message' => $record->message
+ ],
+ $record->context
+ );
- $this->db->execute($sql, array(
+ $sql = sprintf("INSERT INTO %s.%s (id, logtime, ident, priority, message) VALUES(:id, NOW(), :ident, :priority, :message)", $this->schema, $this->table);
+ $params = [
':id' => $this->getNextId(),
':ident' => $record['channel'],
':priority' => Log::convertToCCRLevel($record['level']),
- ':message' => $record['formatted']
- ));
+ ':message' => json_encode($message, JSON_NUMERIC_CHECK | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
+ ];
+ $this->db->execute($sql, $params);
}
/**
diff --git a/classes/CCR/CCRLineFormatter.php b/classes/CCR/CCRLineFormatter.php
index 897f7d2941..ff9dcc162e 100644
--- a/classes/CCR/CCRLineFormatter.php
+++ b/classes/CCR/CCRLineFormatter.php
@@ -98,6 +98,11 @@ public function format(array $record)
// remove leftover %extra.xxx% and %context.xxx% if any
if (false !== strpos($output, '%')) {
$output = preg_replace('/%(?:extra|context)\..+?%/', '', $output);
+ if (null === $output) {
+ $pcreErrorCode = preg_last_error();
+
+ throw new \RuntimeException('Failed to run preg_replace: ' . $pcreErrorCode . ' / ' . preg_last_error_msg());
+ }
}
return $output;
diff --git a/classes/CCR/Log.php b/classes/CCR/Log.php
index 8f56dd3c28..d30a9d8065 100644
--- a/classes/CCR/Log.php
+++ b/classes/CCR/Log.php
@@ -8,7 +8,9 @@
use Monolog\Handler\NativeMailerHandler;
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
+use Monolog\Level;
use Psr\Log\LoggerInterface;
+
use xd_utilities;
/**
@@ -32,25 +34,25 @@ class Log
const DEBUG = 7;
private static $logLevels = array(
- self::EMERG => \Monolog\Logger::EMERGENCY,
- self::ALERT => \Monolog\Logger::ALERT,
- self::CRIT => \Monolog\Logger::CRITICAL,
- self::ERR => \Monolog\Logger::ERROR,
- self::WARNING => \Monolog\Logger::WARNING,
- self::NOTICE => \Monolog\Logger::NOTICE,
- self::INFO => \Monolog\Logger::INFO,
- self::DEBUG => \Monolog\Logger::DEBUG
+ self::EMERG => \Monolog\Level::Emergency->value,
+ self::ALERT => \Monolog\Level::Alert->value,
+ self::CRIT => \Monolog\Level::Critical->value,
+ self::ERR => \Monolog\Level::Error->value,
+ self::WARNING => \Monolog\Level::Warning->value,
+ self::NOTICE => \Monolog\Level::Notice->value,
+ self::INFO => \Monolog\Level::Info->value,
+ self::DEBUG => \Monolog\Level::Debug->value
);
private static $flippedLogLevels = array(
- \Monolog\Logger::EMERGENCY => self::EMERG,
- \Monolog\Logger::ALERT => self::ALERT,
- \Monolog\Logger::CRITICAL => self::CRIT,
- \Monolog\Logger::ERROR => self::ERR,
- \Monolog\Logger::WARNING => self::WARNING,
- \Monolog\Logger::NOTICE => self::NOTICE,
- \Monolog\Logger::INFO => self::INFO,
- \Monolog\Logger::DEBUG => self::DEBUG
+ \Monolog\Level::Emergency->value => self::EMERG,
+ \Monolog\Level::Alert->value => self::ALERT,
+ \Monolog\Level::Critical->value => self::CRIT,
+ \Monolog\Level::Error->value => self::ERR,
+ \Monolog\Level::Warning->value => self::WARNING,
+ \Monolog\Level::Notice->value => self::NOTICE,
+ \Monolog\Level::Info->value => self::INFO,
+ \Monolog\Level::Debug->value => self::DEBUG
);
/**
@@ -165,7 +167,7 @@ protected static function getLogger($ident, array $conf)
'mail'
);
- $logger = new Logger($ident);
+ $logger = new \Monolog\Logger($ident);
// Short circuit the function if 'null' was asked for since this will be the only handler for the logger.
if ($ident === 'null') {
@@ -341,7 +343,7 @@ public static function convertToCCRLevel($monologLevel)
if (array_key_exists($monologLevel, self::$flippedLogLevels)) {
return self::$flippedLogLevels[$monologLevel];
}
- throw new Exception('Unknown Log Level');
+ throw new Exception(sprintf('Unknown Monolog Log Level %s', $monologLevel));
}
/**
@@ -356,7 +358,7 @@ public static function convertToMonologLevel($ccrLevel)
if (array_key_exists($ccrLevel, self::$logLevels)) {
return self::$logLevels[$ccrLevel];
}
- throw new Exception('Unknown Log Level');
+ throw new Exception(sprintf('Unknown CCR Log Level %s', $ccrLevel));
}
/**
diff --git a/classes/CCR/Logger.php b/classes/CCR/Logger.php
index a936141499..4d56db0d54 100644
--- a/classes/CCR/Logger.php
+++ b/classes/CCR/Logger.php
@@ -19,75 +19,4 @@
*/
class Logger extends MLogger implements LoggerInterface
{
- /**
- * @param $level
- * @param $message
- * @param array $context
- * @return bool
- * @throws \DateInvalidTimeZoneException
- */
- public function addRecord($level, $message, array $context = array())
- {
- if (!$this->handlers) {
- $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG));
- }
-
- $levelName = static::getLevelName($level);
-
- // check if any handler will handle this message so we can return early and save cycles
- $handlerKey = null;
- reset($this->handlers);
- while ($handler = current($this->handlers)) {
- if ($handler->isHandling(array('level' => $level))) {
- $handlerKey = key($this->handlers);
- break;
- }
-
- next($this->handlers);
- }
-
- if (null === $handlerKey) {
- return false;
- }
-
- if (!static::$timezone) {
- static::$timezone = new \DateTimeZone(date_default_timezone_get() ?: 'UTC');
- }
-
- // php7.1+ always has microseconds enabled, so we do not need this hack
- if ($this->microsecondTimestamps && PHP_VERSION_ID < 70100) {
- $ts = \DateTime::createFromFormat('U.u', sprintf('%.6F', microtime(true)), static::$timezone);
- } else {
- $ts = new \DateTime('now', static::$timezone);
- }
- $ts->setTimezone(static::$timezone);
-
- $record = array(
- 'message' => (string) $message,
- 'context' => $context,
- 'level' => $level,
- 'level_name' => strtolower($levelName),
- 'channel' => $this->name,
- 'datetime' => $ts,
- 'extra' => array('message' => $message),
- );
-
- try {
- foreach ($this->processors as $processor) {
- $record = call_user_func($processor, $record);
- }
-
- while ($handler = current($this->handlers)) {
- if (true === $handler->handle($record)) {
- break;
- }
-
- next($this->handlers);
- }
- } catch (Exception $e) {
- $this->handleException($e, $record);
- }
-
- return true;
- }
}
diff --git a/classes/Configuration/Configuration.php b/classes/Configuration/Configuration.php
index 9422da03f9..d551ca847c 100644
--- a/classes/Configuration/Configuration.php
+++ b/classes/Configuration/Configuration.php
@@ -1144,27 +1144,27 @@ protected function deleteSection($name)
* ==========================================================================================
*/
- public function current()
+ public function current(): mixed
{
return current($this->sectionData);
}
- public function key()
+ public function key(): mixed
{
return key($this->sectionData);
}
- public function next()
+ public function next(): void
{
- return next($this->sectionData);
+ next($this->sectionData);
}
- public function rewind()
+ public function rewind(): void
{
- return reset($this->sectionData);
+ reset($this->sectionData);
}
- public function valid()
+ public function valid(): bool
{
return false !== current($this->sectionData);
}
diff --git a/classes/DB/ArrayIngestor.php b/classes/DB/ArrayIngestor.php
index 50350c515a..214fe824e8 100644
--- a/classes/DB/ArrayIngestor.php
+++ b/classes/DB/ArrayIngestor.php
@@ -23,12 +23,12 @@ class ArrayIngestor implements Ingestor
function __construct(
iDatabase $dest_db,
+ $insert_table,
array $source_data = array(),
- $insert_table,
array $insert_fields = array(),
array $post_ingest_update_statements = array(),
- $delete_statement = null,
- $count_statement = null
+ $delete_statement = null,
+ $count_statement = null
) {
$this->_dest_db = $dest_db;
diff --git a/classes/DB/FilterListHelper.php b/classes/DB/FilterListHelper.php
index a9ca288f78..4a6e46cebb 100644
--- a/classes/DB/FilterListHelper.php
+++ b/classes/DB/FilterListHelper.php
@@ -65,7 +65,7 @@ public static function getTableName(Query $realmQuery, GroupBy $groupBy1, GroupB
$firstId = $groupBy2Id;
$secondId = $groupBy1Id;
}
- $tableName .= "${firstId}___{$secondId}";
+ $tableName .= "{$firstId}___{$secondId}";
}
return $tableName;
diff --git a/classes/DataWarehouse/Access/Usage.php b/classes/DataWarehouse/Access/Usage.php
index 1c95a6c317..0d12dbdd8c 100644
--- a/classes/DataWarehouse/Access/Usage.php
+++ b/classes/DataWarehouse/Access/Usage.php
@@ -115,7 +115,7 @@ private function getSummaryCharts(XDUser $user) {
$usageChart = array(
'hc_jsonstore' => array('title' => array('text' => '')),
- 'id' => "node=statistic&realm=${usageRealm}&group_by=${usageGroupBy}&statistic=${userStatistic}",
+ 'id' => "node=statistic&realm={$usageRealm}&group_by={$usageGroupBy}&statistic={$userStatistic}",
'short_title' => $statsClass->getName(),
'random_id' => 'chart_' . mt_rand(),
'subnotes' => $usageSubnotes,
@@ -468,7 +468,7 @@ public function getCharts(XDUser $user, $chartsKey = 'data') {
$nextFieldNameIndex++;
$timeseriesColumn = $timeseriesTemplateColumn;
- $timeseriesColumn['header'] = "[${resultRecordDimension}] " . $timeseriesColumn['header'];
+ $timeseriesColumn['header'] = "[{$resultRecordDimension}] " . $timeseriesColumn['header'];
$timeseriesColumn['dataIndex'] = $timeseriesDimensionColumnName;
$timeseriesColumns[$resultRecordDimension] = $timeseriesColumn;
@@ -616,7 +616,7 @@ public function getCharts(XDUser $user, $chartsKey = 'data') {
$usageTitleFontSizeInPixels = 16 + $usageFontSize;
$usageTitleStyle = array(
'color' => '#000000',
- 'size' => "${usageTitleFontSizeInPixels}",
+ 'size' => "{$usageTitleFontSizeInPixels}",
);
// Get the user's report generator chart pool.
@@ -714,8 +714,8 @@ public function getCharts(XDUser $user, $chartsKey = 'data') {
// Generate the expected IDs for the chart.
$usageMetric = $meRequest['data_series_unencoded'][0]['metric'];
- $usageChartId = "node=statistic&realm=${usageRealm}&group_by=${usageGroupBy}&statistic=${usageMetric}";
- $usageChartMenuId = "node=group_by&realm=${usageRealm}&group_by=${usageGroupBy}";
+ $usageChartId = "node=statistic&realm={$usageRealm}&group_by={$usageGroupBy}&statistic={$usageMetric}";
+ $usageChartMenuId = "node=group_by&realm={$usageRealm}&group_by={$usageGroupBy}";
// Remove extraneous x-axis properties.
if ($meRequestIsTimeseries) {
@@ -768,7 +768,7 @@ public function getCharts(XDUser $user, $chartsKey = 'data') {
$currentCategoryRank = $usageOffset + 1;
foreach ($meChartCategories as $meChartCategory) {
if (!empty($meChartCategory)) {
- $usageChartCategories[] = "${currentCategoryRank}. ${meChartCategory}";
+ $usageChartCategories[] = "{$currentCategoryRank}. {$meChartCategory}";
}
else {
$usageChartCategories[] = '';
@@ -847,7 +847,7 @@ function ($drillTarget) {
&& $usageGroupBy !== 'none'
) {
$rank = $meDataSeries['legendrank'] / 3;
- $meDataSeries['name'] = "${rank}. " . $meDataSeries['name'];
+ $meDataSeries['name'] = "{$rank}. " . $meDataSeries['name'];
}
}
@@ -1166,7 +1166,7 @@ private function convertChartRequest(array $usageRequest, $useGivenFormat) {
$unencodedMeRequestParams[$meRequestKey] = $meRequestValue;
}
foreach ($unencodedMeRequestParams as $meRequestKey => $meRequestValue) {
- $meRequest["${meRequestKey}_unencoded"] = $meRequestValue;
+ $meRequest["{$meRequestKey}_unencoded"] = $meRequestValue;
$meRequest[$meRequestKey] = urlencode(json_encode($meRequestValue));
}
diff --git a/classes/DataWarehouse/Data/BatchDataset.php b/classes/DataWarehouse/Data/BatchDataset.php
index 94bc0df45d..62b6a6ce67 100644
--- a/classes/DataWarehouse/Data/BatchDataset.php
+++ b/classes/DataWarehouse/Data/BatchDataset.php
@@ -173,7 +173,7 @@ function ($field) {
*
* @return mixed[]
*/
- public function current()
+ public function current(): mixed
{
return $this->currentRow;
}
@@ -183,7 +183,7 @@ public function current()
*
* @return int
*/
- public function key()
+ public function key(): mixed
{
return $this->currentRowIndex;
}
@@ -193,7 +193,7 @@ public function key()
*
* Fetches the next row.
*/
- public function next()
+ public function next(): void
{
$this->currentRowIndex++;
$this->currentRow = $this->getNextRow();
@@ -204,7 +204,7 @@ public function next()
*
* Executes the underlying raw query.
*/
- public function rewind()
+ public function rewind(): void
{
$this->originalBufferedQuerySetting = $this->dbh->handle()->getAttribute(
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY
@@ -225,7 +225,7 @@ public function rewind()
*
* @return bool
*/
- public function valid()
+ public function valid(): bool
{
return $this->currentRow !== false;
}
diff --git a/classes/DataWarehouse/Data/TimeseriesDataset.php b/classes/DataWarehouse/Data/TimeseriesDataset.php
index b507a0ff73..170e6b8832 100644
--- a/classes/DataWarehouse/Data/TimeseriesDataset.php
+++ b/classes/DataWarehouse/Data/TimeseriesDataset.php
@@ -72,7 +72,7 @@ protected function getSeriesIds($limit, $offset)
$seriesIds = array();
while($row = $statement->fetch(\PDO::FETCH_ASSOC, \PDO::FETCH_ORI_NEXT)) {
- $seriesIds[] = "${row[$groupIdColumn]}";
+ $seriesIds[] = "{$row[$groupIdColumn]}";
}
return $seriesIds;
@@ -205,7 +205,7 @@ public function getDatasets($limit, $offset, $summarize)
* @param integer $normalizeBy The total number of series to be summarized.
* @return array the sql fragment, series name and summariation algorthm type.
*/
- protected function getSummaryOp($column_name, $normalizeBy)
+ protected function getSummaryOp(string $column_name, $normalizeBy)
{
$series_name = "All $normalizeBy Others";
$sql = "SUM(t.$column_name)";
diff --git a/classes/DataWarehouse/Export/RealmManager.php b/classes/DataWarehouse/Export/RealmManager.php
index 29a9c0c220..1e044f671d 100644
--- a/classes/DataWarehouse/Export/RealmManager.php
+++ b/classes/DataWarehouse/Export/RealmManager.php
@@ -50,7 +50,12 @@ function ($realm) use ($exportable) {
// Use array_values to remove gaps in keys that may have been
// introduced by the use of array_filter.
- return array_values($realms);
+ $values = array_values($realms);
+
+ // We force sorting in descending order due to the differences in sorting from PHP7.2 to PHP8.0
+ usort($values, fn($left, $right) => strcmp($left->getName(), $right->getName()) * -1);
+
+ return $values;
}
/**
diff --git a/classes/DataWarehouse/ExportBuilder.php b/classes/DataWarehouse/ExportBuilder.php
index b3b97bc7d3..ff21c45412 100644
--- a/classes/DataWarehouse/ExportBuilder.php
+++ b/classes/DataWarehouse/ExportBuilder.php
@@ -262,6 +262,31 @@ public static function getFormat(
return $format;
}
+ /**
+ * Validates that the format requested by the user is located in the set of formats that are supported and either
+ * all formats are allowed ( signified by there being no $allowedFormats ) or the requested format was found in the
+ * set of allowed formats. If valid the requested format is returned. If no requested format is provided then the
+ * default value will be returned.
+ *
+ * @param string $requestedFormat
+ * @param string $default
+ * @param array $allowedFormats
+ * @return string
+ */
+ public static function validateFormat(string $requestedFormat, string $default = 'jsonstore', array $allowedFormats = []): string
+ {
+ if (!isset($requestedFormat)) {
+ return $default;
+ }
+ $requestedFormat = strtolower($requestedFormat);
+ $formatSupported = isset(self::$supported_formats[$requestedFormat]);
+ $noFormatSubset = count($allowedFormats) === 0;
+ $requestedFormatInSubset = in_array($requestedFormat, $allowedFormats);
+
+
+ return $formatSupported && ($noFormatSubset || $requestedFormatInSubset) ? $requestedFormat : $default;
+ }
+
/**
* Export data.
*
diff --git a/classes/DataWarehouse/Query/TimeAggregationUnit.php b/classes/DataWarehouse/Query/TimeAggregationUnit.php
index f373088e2d..c273a7a472 100644
--- a/classes/DataWarehouse/Query/TimeAggregationUnit.php
+++ b/classes/DataWarehouse/Query/TimeAggregationUnit.php
@@ -219,6 +219,11 @@ public static function getRegsiteredAggregationUnits()
*/
public static function deriveAggregationUnitName($time_period, $start_date, $end_date, $min_aggregation_unit = null)
{
+ // This has been added because `strtolower` no longer supports null values.
+ if (empty($time_period)) {
+ $time_period = 'auto';
+ }
+
$time_period = strtolower($time_period);
if ($time_period === 'auto') {
@@ -264,6 +269,12 @@ public static function deriveAggregationUnitName($time_period, $start_date, $end
*/
public static function getMaxUnit($unit_1, $unit_2)
{
+ if (is_null($unit_1)) {
+ $unit_1 = 'null';
+ }
+ if (is_null($unit_2)) {
+ $unit_2 = 'null';
+ }
// Convert input units to the expected unit name format.
$unit_1_name = strtolower($unit_1);
$unit_2_name = strtolower($unit_2);
diff --git a/classes/DataWarehouse/Visualization.php b/classes/DataWarehouse/Visualization.php
index 61d511f874..e3cdf5ae2c 100644
--- a/classes/DataWarehouse/Visualization.php
+++ b/classes/DataWarehouse/Visualization.php
@@ -23,7 +23,7 @@ public static function alterBrightness($color, $steps)
return ($a << 24) + ($r << 16) + ($g << 8) + $b;
}
//http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
- public static function getColors($count = NULL, $palleteIndex = 0, $includeWhite = true)
+ public static function getColors($count = null, $palleteIndex = 0, $includeWhite = true)
{
$ret = array();
$colors = json_decode(COLORS);
@@ -39,7 +39,11 @@ public static function getColors($count = NULL, $palleteIndex = 0, $includeWhite
}
}
$ret_count = count($ret);
- srand($count);
+ if ($count === null) {
+ srand();
+ } else {
+ srand($count);
+ }
if ($count != NULL && $ret_count < $count)
{
$value = 15;
diff --git a/classes/DataWarehouse/Visualization/AggregateChart.php b/classes/DataWarehouse/Visualization/AggregateChart.php
index 15215ea334..6b3ac30d4c 100644
--- a/classes/DataWarehouse/Visualization/AggregateChart.php
+++ b/classes/DataWarehouse/Visualization/AggregateChart.php
@@ -1017,6 +1017,9 @@ public function configure(
$labelsAllocated = 0;
$pieSum = array_sum($yValues);
for ($i = 0; $i < count($xValues); $i++) {
+ if (is_null($yValues[$i])) {
+ $yValues[$i] = 0.0;
+ }
if ($isThumbnail || ($labelsAllocated < $labelLimit && (($yValues[$i] / $pieSum) * 100) >= 2.0)) {
$label = $xValues[$i];
// Truncate long data labels to improve visibility.
diff --git a/classes/DataWarehouse/Visualization/TimeseriesChart.php b/classes/DataWarehouse/Visualization/TimeseriesChart.php
index 67a7b982c0..f241524e2a 100644
--- a/classes/DataWarehouse/Visualization/TimeseriesChart.php
+++ b/classes/DataWarehouse/Visualization/TimeseriesChart.php
@@ -508,7 +508,14 @@ public function configure(
$xValues[] = $start_ts_array[$i]*1000;
$dates[] = $start_ts_array[$i]*1000;
$yValues[] = $v;
- $text[] = number_format($v, $decimals, '.', ',');
+
+ // This bit has been added due to `number_format` no longer supporting passing nulls.
+ if (is_null($v)) {
+ $formatted = number_format(0.0, $decimals, '.', ',');
+ } else {
+ $formatted = number_format($v, $decimals, '.', ',');
+ }
+ $text[] = $formatted;
$seriesValue = array(
'x' => $start_ts_array[$i]*1000,
'y' => $v,
diff --git a/classes/ETL/Aggregator/JobsAggregator.php b/classes/ETL/Aggregator/JobsAggregator.php
index c6357173af..88dd6b40c7 100644
--- a/classes/ETL/Aggregator/JobsAggregator.php
+++ b/classes/ETL/Aggregator/JobsAggregator.php
@@ -252,12 +252,12 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
if ( null !== $this->currentStartDate ) {
$startDate = $this->sourceHandle->quote($this->currentStartDate);
- $ranges[] = "d.${aggregationUnit}_end_ts >= UNIX_TIMESTAMP($startDate)";
+ $ranges[] = "d.{$aggregationUnit}_end_ts >= UNIX_TIMESTAMP($startDate)";
}
if ( null !== $this->currentEndDate ) {
$endDate = $this->sourceHandle->quote($this->currentEndDate);
- $ranges[] = "d.${aggregationUnit}_start_ts <= UNIX_TIMESTAMP($endDate)";
+ $ranges[] = "d.{$aggregationUnit}_start_ts <= UNIX_TIMESTAMP($endDate)";
}
$dateRangeSql = implode(" AND ", $ranges);
@@ -306,7 +306,7 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
* --------------------------------------------------------------------------------
*/
- $whereClauses = array("aggregated_${aggregationUnit} = 0");
+ $whereClauses = array("aggregated_{$aggregationUnit} = 0");
if ( null !== $this->resourceIdListString ) {
$whereClauses[] = "resource_id IN (" . $this->resourceIdListString . ")";
}
@@ -317,8 +317,8 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
$minMaxJoin = "(\n $minMaxSql\n) js_limits";
- $dateRangeSql = "d.${aggregationUnit}_end_ts >= js_limits.min_start " .
- "AND d.${aggregationUnit}_start_ts <= js_limits.max_end";
+ $dateRangeSql = "d.{$aggregationUnit}_end_ts >= js_limits.min_start " .
+ "AND d.{$aggregationUnit}_start_ts <= js_limits.max_end";
} // else ( $this->getEtlOverseerOptions()->isForce() )
@@ -331,16 +331,16 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
"SELECT distinct
d.id as period_id,
d.`year` as year_value,
- d.`${aggregationUnit}` as period_value,
- d.${aggregationUnit}_start as period_start,
- d.${aggregationUnit}_end as period_end,
- d.${aggregationUnit}_start_ts as period_start_ts,
- d.${aggregationUnit}_end_ts as period_end_ts,
+ d.`{$aggregationUnit}` as period_value,
+ d.{$aggregationUnit}_start as period_start,
+ d.{$aggregationUnit}_end as period_end,
+ d.{$aggregationUnit}_start_ts as period_start_ts,
+ d.{$aggregationUnit}_end_ts as period_end_ts,
d.hours as period_hours,
d.seconds as period_seconds,
0 as period_start_day_id,
0 as period_end_day_id
- FROM {$utilitySchema}.${aggregationUnit}s d" . (null !== $minMaxJoin ? ",\n$minMaxJoin" : "" ) . "
+ FROM {$utilitySchema}.{$aggregationUnit}s d" . (null !== $minMaxJoin ? ",\n$minMaxJoin" : "" ) . "
WHERE $dateRangeSql
ORDER BY 2 DESC, 3 DESC";
@@ -391,7 +391,7 @@ protected function checkResourceSpecs()
from {$sourceSchema}.jobfact
where
start_time_ts between unix_timestamp(:startDate) and unix_timestamp(:endDate)
- and resource_id not in (select distinct resource_id from ${utilitySchema}.resourcespecs where processors is not null)" .
+ and resource_id not in (select distinct resource_id from {$utilitySchema}.resourcespecs where processors is not null)" .
( null !== $this->resourceIdListString ? " and resource_id IN (" . $this->resourceIdListString . ")" : "");
$params = array(
diff --git a/classes/ETL/Aggregator/pdoAggregator.php b/classes/ETL/Aggregator/pdoAggregator.php
index bfba88f09a..db2113d718 100644
--- a/classes/ETL/Aggregator/pdoAggregator.php
+++ b/classes/ETL/Aggregator/pdoAggregator.php
@@ -603,12 +603,12 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
if ( null !== $this->currentStartDate ) {
$startDate = $this->sourceHandle->quote($this->currentStartDate);
- $ranges[] = "$startDate <= d.${aggregationUnit}_end";
+ $ranges[] = "$startDate <= d.{$aggregationUnit}_end";
}
if ( null !== $this->currentEndDate ) {
$endDate = $this->sourceHandle->quote($this->currentEndDate);
- $ranges[] = "$endDate >= d.${aggregationUnit}_start";
+ $ranges[] = "$endDate >= d.{$aggregationUnit}_start";
}
if ( 0 != count($ranges) ) {
@@ -667,16 +667,16 @@ protected function getDirtyAggregationPeriods($aggregationUnit)
"SELECT distinct
d.id as period_id,
d.`year` as year_value,
- d.`${aggregationUnit}` as period_value,
- d.${aggregationUnit}_start as period_start,
- d.${aggregationUnit}_end as period_end,
- d.${aggregationUnit}_start_ts as period_start_ts,
- d.${aggregationUnit}_end_ts as period_end_ts,
+ d.`{$aggregationUnit}` as period_value,
+ d.{$aggregationUnit}_start as period_start,
+ d.{$aggregationUnit}_end as period_end,
+ d.{$aggregationUnit}_start_ts as period_start_ts,
+ d.{$aggregationUnit}_end_ts as period_end_ts,
d.hours as period_hours,
d.seconds as period_seconds,
$unitIdToStartDayId as period_start_day_id,
$unitIdToEndDayId as period_end_day_id
- FROM {$utilitySchema}.${aggregationUnit}s d"
+ FROM {$utilitySchema}.{$aggregationUnit}s d"
. (null !== $minMaxJoin ? ",\n$minMaxJoin" : "" )
. (null !== $dateRangeRestrictionSql ? "\nWHERE $dateRangeRestrictionSql" : "" ) . "
ORDER BY 2 DESC, 3 DESC";
@@ -883,7 +883,7 @@ protected function _execute($aggregationUnit)
//
// NOTE: The ETL date range is supported when querying for dirty aggregation periods
- $this->logger->info("Aggregate over $numAggregationPeriods ${aggregationUnit}s");
+ $this->logger->info("Aggregate over $numAggregationPeriods {$aggregationUnit}s");
if ( ! $enableBatchAggregation ) {
diff --git a/classes/ETL/Configuration/EtlConfiguration.php b/classes/ETL/Configuration/EtlConfiguration.php
index b909affb21..c82604e8c3 100644
--- a/classes/ETL/Configuration/EtlConfiguration.php
+++ b/classes/ETL/Configuration/EtlConfiguration.php
@@ -596,27 +596,27 @@ protected function addBaseDirToPaths()
* ==========================================================================================
*/
- public function current()
+ public function current(): mixed
{
return current($this->actionOptions);
} // current()
- public function key()
+ public function key(): mixed
{
return key($this->actionOptions);
} // key()
- public function next()
+ public function next(): void
{
- return next($this->actionOptions);
+ next($this->actionOptions);
} // next()
- public function rewind()
+ public function rewind(): void
{
- return reset($this->actionOptions);
+ reset($this->actionOptions);
} // rewind()
- public function valid()
+ public function valid(): bool
{
return false !== current($this->actionOptions);
} // valid()
diff --git a/classes/ETL/DataEndpoint/DirectoryScanner.php b/classes/ETL/DataEndpoint/DirectoryScanner.php
index 779342e0a3..b42f62211f 100644
--- a/classes/ETL/DataEndpoint/DirectoryScanner.php
+++ b/classes/ETL/DataEndpoint/DirectoryScanner.php
@@ -914,7 +914,7 @@ public function verify($dryrun = false, $leaveConnected = false)
* @see current()
*/
- public function current()
+ public function current(): mixed
{
if ( null === $this->currentFileIterator ) {
return false;
@@ -931,7 +931,7 @@ public function current()
* @see key()
*/
- public function key()
+ public function key(): mixed
{
if ( null === $this->currentFileIterator ) {
return null;
@@ -947,7 +947,7 @@ public function key()
* @see Iterator::next()
*/
- public function next()
+ public function next(): void
{
if ( null !== $this->currentFileIterator ) {
$this->currentFileIterator->next();
@@ -963,7 +963,7 @@ public function next()
* @see Iterator::rewind()
*/
- public function rewind()
+ public function rewind(): void
{
$this->handle->rewind();
$this->numFilesScanned = 0;
@@ -1004,7 +1004,7 @@ public function rewind()
* @see Iterator::valid()
*/
- public function valid()
+ public function valid(): bool
{
// Ensure the handle is valid since there may be no files matching the specified criteria or
// we could be at the end of the file list.
@@ -1062,7 +1062,7 @@ public function valid()
* @see Countable::count()
*/
- public function count()
+ public function count(): int
{
return $this->numRecordsParsed;
}
diff --git a/classes/ETL/DataEndpoint/Filter/ExternalProcess.php b/classes/ETL/DataEndpoint/Filter/ExternalProcess.php
index c9be2ebc24..fa88fc5e69 100644
--- a/classes/ETL/DataEndpoint/Filter/ExternalProcess.php
+++ b/classes/ETL/DataEndpoint/Filter/ExternalProcess.php
@@ -36,7 +36,7 @@ class ExternalProcess extends \php_user_filter
* @var string The name of the filter, populated by PHP
*/
- public $filtername = null;
+ public string $filtername = '';
/**
* @var object The parameters passed to this filter by stream_filter_prepend() or
@@ -49,7 +49,7 @@ class ExternalProcess extends \php_user_filter
* logger: Optional logger for displying error messages
*/
- public $params = null;
+ public mixed $params;
/**
* @var array An array containing file descriptors connected to the application. The following
@@ -98,7 +98,7 @@ class ExternalProcess extends \php_user_filter
* @return PSFS_ERR_FATAL On error.
*/
- public function filter($in, $out, &$consumed, $closing)
+ public function filter($in, $out, &$consumed, $closing): int
{
$retval = PSFS_FEED_ME;
@@ -146,7 +146,7 @@ public function filter($in, $out, &$consumed, $closing)
* application and opening read and write pipes to the application.
*/
- public function onCreate()
+ public function onCreate(): bool
{
// Verify parameters
@@ -219,7 +219,7 @@ public function onCreate()
* Cleanup after the filter is closed.
*/
- public function onClose()
+ public function onClose(): void
{
if ($this->pipes[0]) {
fclose($this->pipes[0]);
diff --git a/classes/ETL/DataEndpoint/aStructuredFile.php b/classes/ETL/DataEndpoint/aStructuredFile.php
index f9a4bb3368..0f84567a56 100644
--- a/classes/ETL/DataEndpoint/aStructuredFile.php
+++ b/classes/ETL/DataEndpoint/aStructuredFile.php
@@ -490,7 +490,7 @@ public function supportsComplexDataRecords()
* @see Iterator::current()
*/
- public function current()
+ public function current(): mixed
{
if ( ! $this->valid() ) {
return false;
@@ -508,7 +508,7 @@ public function current()
* @see Iterator::key()
*/
- public function key()
+ public function key(): mixed
{
return key($this->recordList);
}
@@ -517,7 +517,7 @@ public function key()
* @see Iterator::next()
*/
- public function next()
+ public function next(): void
{
next($this->recordList);
}
@@ -526,7 +526,7 @@ public function next()
* @see Iterator::rewind()
*/
- public function rewind()
+ public function rewind(): void
{
reset($this->recordList);
}
@@ -535,7 +535,7 @@ public function rewind()
* @see Iterator::valid()
*/
- public function valid()
+ public function valid(): bool
{
// return isset($this->recordList[$this->recordListPosition]);
// Note that we can't check for values that are FALSE because that is a valid
@@ -547,7 +547,7 @@ public function valid()
* @see Countable::count()
*/
- public function count()
+ public function count(): int
{
return count($this->recordList);
}
diff --git a/classes/ETL/DbModel/Column.php b/classes/ETL/DbModel/Column.php
index 7d44748bb4..fbb548ec99 100644
--- a/classes/ETL/DbModel/Column.php
+++ b/classes/ETL/DbModel/Column.php
@@ -201,10 +201,18 @@ public function compare(iEntity $cmp)
if (
(
- (null === $srcDefault && null === $srcExtra)
- || ('current_timestamp' === strtolower($srcDefault) && 'on update current_timestamp' === strtolower($srcExtra))
+ (
+ null === $srcDefault &&
+ null === $srcExtra
+ )
+ ||
+ (
+ !is_null($srcDefault) && !is_null($srcExtra) &&
+ 'current_timestamp' === strtolower($srcDefault) &&
+ 'on update current_timestamp' === strtolower($srcExtra)
+ )
)
- && ('current_timestamp' != strtolower($destDefault) || null === $destExtra)
+ && ((!is_null($destDefault) && 'current_timestamp' != strtolower($destDefault)) || null === $destExtra)
) {
$this->logCompareFailure('timestamp', "$srcDefault $srcExtra", "$destDefault $destExtra", $this->name);
return -1;
diff --git a/classes/ETL/DbModel/Entity.php b/classes/ETL/DbModel/Entity.php
index dc2212cd08..a7d57dda48 100644
--- a/classes/ETL/DbModel/Entity.php
+++ b/classes/ETL/DbModel/Entity.php
@@ -82,9 +82,12 @@ class Entity extends Loggable
* ------------------------------------------------------------------------------------------
*/
- public function __construct($config, $systemQuoteChar = null, LoggerInterface $logger = null)
+ public function __construct($config, $systemQuoteChar = '`', LoggerInterface $logger = null)
{
parent::__construct($logger);
+ if ($systemQuoteChar === null) {
+ $systemQuoteChar = '';
+ }
$this->setSystemQuoteChar($systemQuoteChar);
// The configuration can be NULL (nothing is initialized), a string assumed to be
diff --git a/classes/ETL/Ingestor/RestIngestor.php b/classes/ETL/Ingestor/RestIngestor.php
index 367f2ff9eb..9543d912d9 100644
--- a/classes/ETL/Ingestor/RestIngestor.php
+++ b/classes/ETL/Ingestor/RestIngestor.php
@@ -342,7 +342,7 @@ function ($value) {
while ( false !== ( $retval = curl_exec($this->sourceHandle) ) ) {
if ( 0 !== curl_errno($this->sourceHandle) ) {
- $this->logger->error("${this} Error during REST call: " . curl_error($this->sourceHandle));
+ $this->logger->error("{$this} Error during REST call: " . curl_error($this->sourceHandle));
break;
}
diff --git a/classes/ETL/aOptions.php b/classes/ETL/aOptions.php
index f50543bb7d..4822981b8b 100644
--- a/classes/ETL/aOptions.php
+++ b/classes/ETL/aOptions.php
@@ -268,7 +268,7 @@ public function __isset($property)
* ------------------------------------------------------------------------------------------
*/
- public function current()
+ public function current(): mixed
{
if ( ! $this->valid() ) {
return false;
@@ -281,7 +281,7 @@ public function current()
* ------------------------------------------------------------------------------------------
*/
- public function key()
+ public function key(): mixed
{
return key($this->options);
} // key()
@@ -291,7 +291,7 @@ public function key()
* ------------------------------------------------------------------------------------------
*/
- public function next()
+ public function next(): void
{
next($this->options);
} // next()
@@ -301,7 +301,7 @@ public function next()
* ------------------------------------------------------------------------------------------
*/
- public function rewind()
+ public function rewind(): void
{
reset($this->options);
} // rewind()
@@ -311,7 +311,7 @@ public function rewind()
* ------------------------------------------------------------------------------------------
*/
- public function valid()
+ public function valid(): bool
{
// Note that we can't check for values that are FALSE because that is a valid
// data value.
diff --git a/classes/Models/DBObject.php b/classes/Models/DBObject.php
index a515089a7d..65dc4c5cb2 100644
--- a/classes/Models/DBObject.php
+++ b/classes/Models/DBObject.php
@@ -27,6 +27,7 @@
*
* @author Ryan Rathsam
*/
+#[\AllowDynamicProperties]
class DBObject
{
diff --git a/classes/Models/Services/Tokens.php b/classes/Models/Services/Tokens.php
index 290d456680..b3c2d97e83 100644
--- a/classes/Models/Services/Tokens.php
+++ b/classes/Models/Services/Tokens.php
@@ -96,7 +96,7 @@ public static function authenticateController()
* @throws \Exception if unable to retrieve a database connection.
* @throws UnauthorizedHttpException if the token is missing, malformed, invalid, or expired.
*/
- private static function authenticateToken($rawToken, $endpoint = null)
+ private static function authenticateToken(string $rawToken, string $endpoint = null)
{
// Determine token type
$tokenParts = explode('.', $rawToken);
@@ -227,7 +227,7 @@ private static function authenticateJSONWebToken($jwt)
* @param string $header
* @return string | null the token if the header has the 'Bearer' key, null otherwise.
*/
- public static function getTokenFromHeader($header)
+ public static function getTokenFromHeader(string $header)
{
if (0 !== strpos($header, 'Bearer ')) {
return null;
diff --git a/classes/OpenXdmod/Build/Packager.php b/classes/OpenXdmod/Build/Packager.php
index f758e900c4..f86b2e9626 100644
--- a/classes/OpenXdmod/Build/Packager.php
+++ b/classes/OpenXdmod/Build/Packager.php
@@ -296,10 +296,28 @@ public function createPackage()
$this->copyModuleFiles();
$this->createModuleFile();
$this->createInstallScript();
+ $this->addEnvFile();
$this->createTarFile();
$this->cleanUp();
}
+ /**
+ * Since we're using Symfony we need a .env file now. This function copies it into place.
+ *
+ * @return void
+ * @throws Exception
+ */
+ private function addEnvFile()
+ {
+ $fileName = '.env';
+ $srcFile = implode(DIRECTORY_SEPARATOR, array($this->srcDir, $fileName));
+ $destFile = implode(DIRECTORY_SEPARATOR, array($this->getPackageDir(),$fileName));
+
+ $this->logger->info(sprintf('Copying %s to %s', $srcFile, $destFile));
+
+ $this->copyFile($srcFile, $destFile);
+ }
+
/**
* Create a clone of the source repository.
*
diff --git a/classes/Realm/Realm.php b/classes/Realm/Realm.php
index 40d9001887..aba378d976 100644
--- a/classes/Realm/Realm.php
+++ b/classes/Realm/Realm.php
@@ -366,7 +366,7 @@ private static function getSortedObjectList(
// Skip disabled configs
- if ( isset($config->disabled) && $config->disabled ) {
+ if (isset($config->disabled) && $config->disabled) {
continue;
}
@@ -374,29 +374,29 @@ private static function getSortedObjectList(
// use late static binding. For other classes use the class name specified unless the
// configuration explicitly provides a class name.
- $factoryClassName = ('Realm' == $className ? 'static' : $className);
- if ( 'Realm' != $className && isset($configObj->class) ) {
- if ( ! class_exists($configObj->class) ) {
+ $factoryClassName = ('Realm' == $className ? Realm::class : $className);
+ if ('Realm' != $className && isset($configObj->class)) {
+ if (!class_exists($configObj->class)) {
$msg = sprintf("Attempt to instantiate undefined %s class %s", $className, $configObj->class);
- if ( null !== $logger ) {
+ if (null !== $logger) {
$logger->error($msg);
}
throw new \Exception($msg);
}
$factoryClassName = $configObj->class;
- } elseif ( false === strpos($factoryClassName, '\\') && 'static' != $factoryClassName ) {
+ } elseif (false === strpos($factoryClassName, '\\') && 'static' != $factoryClassName) {
$factoryClassName = sprintf('\\%s\\%s', __NAMESPACE__, $factoryClassName);
}
- $factory = sprintf('%s::factory', $factoryClassName);
-
- if ( 'Realm' == $className ) {
+ $factoryCallable = [$factoryClassName, 'factory'];
+ if ('Realm' == $className) {
// The Realm class already has the configuration and does not need it to be passed
// to factory().
- $list[$shortName] = forward_static_call($factory, $shortName, $logger);
+ $list[$shortName] = forward_static_call($factoryCallable, $shortName, null, null, $logger);
} else {
+
// Entities encapsulated by the realm need their config objects
- $list[$shortName] = forward_static_call($factory, $shortName, $config, $realmObj, $logger);
+ $list[$shortName] = forward_static_call($factoryCallable, $shortName, $config, $realmObj, $logger);
}
}
diff --git a/classes/Rest/Controllers/AdminControllerProvider.php b/classes/Rest/Controllers/AdminControllerProvider.php
deleted file mode 100644
index f0f562b0c6..0000000000
--- a/classes/Rest/Controllers/AdminControllerProvider.php
+++ /dev/null
@@ -1,57 +0,0 @@
-
- */
-class AdminControllerProvider extends BaseControllerProvider
-{
- public function setupRoutes(Application $app, ControllerCollection $controller)
- {
- $root = $this->prefix;
- $class = get_class($this);
-
- $controller->post("$root/reset_user_tour_viewed", "$class::resetUserTourViewed");
- }
-
- /**
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Exception
- */
- public function resetUserTourViewed(Request $request, Application $app)
- {
- $this->authorize($request, array('mgr'));
- $viewedTour = $this->getIntParam($request, 'viewedTour', true);
- $selected_user = XDUser::getUserByID($this->getIntParam($request, 'uid', true));
-
- if ($selected_user === null) {
- throw new BadRequestHttpException('User not found');
- }
-
- if (!in_array($viewedTour, [0,1])) {
- throw new BadRequestHttpException('Invalid data parameter');
- }
-
- $storage = new \UserStorage($selected_user, 'viewed_user_tour');
- $storage->upsert(0, ['viewedTour' => $viewedTour]);
-
- return $app->json(
- array(
- 'success' => true,
- 'total' => 1,
- 'message' => 'This user will be now be prompted to view the New User Tour the next time they visit XDMoD'
- )
- );
- }
-}
diff --git a/classes/Rest/Controllers/AuthenticationControllerProvider.php b/classes/Rest/Controllers/AuthenticationControllerProvider.php
deleted file mode 100644
index 99db7693dc..0000000000
--- a/classes/Rest/Controllers/AuthenticationControllerProvider.php
+++ /dev/null
@@ -1,155 +0,0 @@
-
- */
-class AuthenticationControllerProvider extends BaseControllerProvider
-{
-
- /**
- * AuthenticationControllerProvider constructor.
- *
- * @param array $params
- *
- * @throws \Exception if there is a problem retrieving email addresses from configuration files.
- */
- public function __construct(array $params = array())
- {
- parent::__construct($params);
- }
-
-
- /**
- * @see aBaseControllerProvider::setupRoutes
- */
- public function setupRoutes(Application $app, \Silex\ControllerCollection $controller)
- {
- $root = $this->prefix;
- $controller->post("$root/login", '\Rest\Controllers\AuthenticationControllerProvider::login');
- $controller->post("$root/logout", '\Rest\Controllers\AuthenticationControllerProvider::logout');
- $controller->get("$root/idpredirect", '\Rest\Controllers\AuthenticationControllerProvider::getIdpRedirect');
- $controller->get("$root/jwt-redirect", '\Rest\Controllers\AuthenticationControllerProvider::redirectWithJwt');
- }
-
- /**
- * Provide the user with an authentication token.
- *
- * The authentication check has already occurred in middleware when this
- * function is called, so it does not perform any authentication work.
- *
- * @param Request $request that will be used to retrieve the user
- * @param Application $app used to facilitate json encoding the response.
- * @return \Symfony\Component\HttpFoundation\JsonResponse which contains a
- * token and the users full name if the login
- * attempt is successful.
- * @throws \Exception if the user could not be found or if their account
- * is disabled.
- */
- public function login(Request $request, Application $app)
- {
- $user = $this->authorize($request);
-
- $user->postLogin();
-
- return $app->json(array(
- 'success' => true,
- 'results' => array('token' => $user->getSessionToken(), 'name' => $user->getFormalName())
- ));
- }
-
- /**
- * Attempt to log out the user identified by the provided token.
- *
- * @param Request $request that will be used to retrieve the token.
- * @param Application $app that will be used to facilitate the json
- * encoding of the response.
- * @return \Symfony\Component\HttpFoundation\JsonResponse indicating
- * that the user has been successfully logged
- * out.
- */
- public function logout(Request $request, Application $app)
- {
- $authInfo = Authentication::getAuthenticationInfo($request);
- \XDSessionManager::logoutUser($authInfo['token']);
-
- return $app->json(array(
- 'success' => true,
- 'message' => 'User logged out successfully'
- ));
- }
-
- /**
- * Return an IDP redirect URL for SSO login
- */
- public function getIdpRedirect(Request $request, Application $app)
- {
- $auth = new \Authentication\SAML\XDSamlAuthentication();
-
- $redirectUrl = $auth->getLoginURL($this->getStringParam($request, 'returnTo', true));
-
- if ($redirectUrl === false ) {
- throw new \Exception('SSO not configured.');
- }
-
- return $app->json($redirectUrl);
- }
-
- /**
- * If a JupyterHub is configured, redirect to it with a new JSON Web Token in a cookie.
- *
- * @param Request $request
- * @param Application $app
- * @return RedirectResponse to the configured JupyterHub root if the user is
- * authenticated, otherwise to the sign-in
- * screen.
- * @throws HttpException if a JupyterHub is not configured.
- */
- public function redirectWithJwt(Request $request, Application $app)
- {
- try {
- $jupyterhub_url = xd_utilities\getConfiguration('jupyterhub', 'url');
- } catch (Exception $e) {
- throw new HttpException(501, 'JupyterHub not configured.');
- }
- try {
- $user = $this->authorize($request);
- } catch (UnauthorizedHttpException $e) {
- return new RedirectResponse('/#jwt-redirect');
- }
- list($jwt, $expiration) = JsonWebToken::encode($user->getUsername());
- $cookie = new Cookie(
- 'xdmod_jwt',
- $jwt,
- $expiration,
- '/', // path
- null, // domain
- true, // secure
- true // httpOnly
- );
- $response = new RedirectResponse($jupyterhub_url);
- $response->headers->setCookie($cookie);
- return $response;
- }
-}
diff --git a/classes/Rest/Controllers/BaseControllerProvider.php b/classes/Rest/Controllers/BaseControllerProvider.php
index 338cf5837a..e69de29bb2 100644
--- a/classes/Rest/Controllers/BaseControllerProvider.php
+++ b/classes/Rest/Controllers/BaseControllerProvider.php
@@ -1,790 +0,0 @@
-
- */
-abstract class BaseControllerProvider implements ControllerProviderInterface
-{
-
- const _USER = '_request_user';
- const _REQUIREMENTS = 'requirements';
- const _URL_GENERATOR = 'url_generator';
-
- const KEY_PREFIX = 'prefix';
-
- const EXCEPTION_MESSAGE = 'An error was encountered while attempting to process the requested authorization procedure.';
-
- protected $prefix;
-
- /**
- * BaseControllerProvider constructor.
- * @param array $params
- */
- public function __construct(array $params = array())
- {
- if (isset($params[self::KEY_PREFIX])) {
- $this->prefix = $params[self::KEY_PREFIX];
- }
- }
-
-
- /**
- * This function is called when the ControllerProvider is 'mount'ed.
- * It is also the main entry point for a ControllerProvider and is
- * where the 'setupXXX' functions are called from. All of these methods
- * default to a no-op except for 'setupRoutes' which must be implemented
- * by all child classes. As this is what is at the heart of a
- * ControllerProviders' functionality.
- *
- * @param Application $app
- * @return mixed an instance of the controller collection for this application.
- */
- public function connect(Application $app)
- {
- $controller = $app['controllers_factory'];
-
- $this->setupDefaultValues($app, $controller);
- $this->setupConversions($app, $controller);
- $this->setupMiddleware($app, $controller);
- $this->setupAssertions($app, $controller);
- $this->setupRoutes($app, $controller);
-
- return $controller;
- } // connect
-
- /**
- * This function is responsible for the setting up of any routes that this
- * ControllerProvider is going to be managing. It *must* be overridden by
- * a child class.
- *
- * @param Application $app
- * @param ControllerCollection $controller
- * @return null
- */
- abstract public function setupRoutes(Application $app, ControllerCollection $controller);
-
- /**
- * This function is responsible for setting any global default values that this
- * ControllerProvider may require or provide. It defaults to a no-op
- * function if not overridden by a child class.
- *
- * @param Application $app
- * @param ControllerCollection $controller
- * @return null
- */
- public function setupDefaultValues(Application $app, ControllerCollection $controller)
- {
- // NO-OP UNLESS OVERRIDDEN
- } // setupDefaultValues
-
- /**
- * This function is responsible for setting up any global conversions that may be
- * required by this ControllerProvider to function. A conversion
- * takes in a user provided value and emits a value of a different type.
- *
- * For example:
- * $app->get('/users/{id}', function($id) {
- * // do something with int $id here....
- * })->convert('id', function($id) { return (int) $id; });
- *
- * @param Application $app
- * @param ControllerCollection $controller
- * @return null
- */
- public function setupConversions(Application $app, ControllerCollection $controller)
- {
- // NO-OP UNLESS OVERRIDDEN
- } //setupConversions
-
- /**
- * This function is responsible for setting up any global middleware that is particular
- * to this ControllerProvider. Middleware can be thought of as functions that
- * execute either before, after, or weighted before or weighted after ( dependant
- * on how they are set up ). They can be used to provide such functionality as
- * logging, authentication or authorization. Middleware can also "short circuit" the
- * normal execution of a route by returning a 'Response' object. In this case, the
- * next Middleware will not be run nor will the route callback.
- *
- * @param Application $app
- * @param ControllerCollection $controller
- * @return null
- */
- public function setupMiddleware(Application $app, ControllerCollection $controller)
- {
- // NO-OP UNLESS OVERRIDDEN
- } // setupMiddleware
-
- /**
- * This function is responsible for setting up any global assertions that
- * this ControllerProvider will need during it's lifecycle. An assertion
- * allows for the use of regex expressions to restrict the matching of
- * specific route parameters.
- *
- * Example:
- * $app->get('/blog/{id}', function ($id) {
- * // ...
- * })->assert('id', '\d+');
- *
- * Here we see that the 'id' route parameter must be one or more digits
- * ( 0-9 ). If the route does not conform to this regex then it does not
- * match.
- *
- * @param Application $app
- * @param ControllerCollection $controller
- * @return null
- */
- public function setupAssertions(Application $app, ControllerCollection $controller)
- {
- // NO-OP UNLESS OVERRIDDEN
- } // setupAssertions
-
- /**
- * A simple piece of Middleware that ensures that the user making the current
- * request is both authenticated and authorized to do so.
- *
- * @param Request $request that will be used to identify and authorize
- * the current user.
- * @param Application $app that will be used to facilitate returning a
- * json response if information is found to be
- * missing.
- * @return \Symfony\Component\HttpFoundation\JsonResponse if and only if
- * the user is missing a token or an ip.
- *
- * @throws Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- */
- public static function authenticate(Request $request, Application $app)
- {
- // If the user has already been found, skip this search.
- if ($request->attributes->has(BaseControllerProvider::_USER)) {
- return;
- }
-
- $user = Authentication::authenticateUser($request);
- if ($user === null) {
- throw new UnauthorizedHttpException('xdmod', 'You must be logged in to access this endpoint.'); // 401 from framework
- } else {
- $request->attributes->set(BaseControllerProvider::_USER, $user);
- }
- }
-
- /**
- * Will attempt to authorize the provided users' roles against the
- * provided array of role requirements.
- *
- * If the user is not authorized, an exception will be thrown.
- * Otherwise, the function will simply return the authorized user.
- *
- * @param Request $request A request containing user information
- * that is to be considered for authorization.
- * @param array $requirements that a users' roles must satisfy to be
- * 'authorized'. If not specified, then only
- * whether or not the user is logged in will
- * be checked.
- * @return \XDUser The user that was checked and is authorized according to
- * the given parameters.
- *
- * @throws Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- * Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
- */
- public function authorize(Request $request, array $requirements = array())
- {
-
- $user = $this->getUserFromRequest($request);
-
- // If role requirements were not given, then the only check to perform
- // is that the user is not a public user.
- $isPublicUser = $user->isPublicUser();
- if (empty($requirements) && $isPublicUser) {
- throw new UnauthorizedHttpException('xdmod', self::EXCEPTION_MESSAGE);
- }
-
- $authorized = $user->hasAcls($requirements);
- if (!$authorized && !$isPublicUser) {
- throw new AccessDeniedHttpException(self::EXCEPTION_MESSAGE);
- } elseif (!$authorized && $isPublicUser) {
- throw new UnauthorizedHttpException('xdmod', self::EXCEPTION_MESSAGE);
- }
-
- // Return the successfully-authorized user.
- return $user;
- }
-
- /**
- * Retrieve the XDMoD user from a request object.
- *
- * @param Request $request The request to retrieve a user from.
- * @return \XDUser The user who made the request.
- */
- protected function getUserFromRequest(Request $request)
- {
- return $request->attributes->get(BaseControllerProvider::_USER);
- }
-
- /**
- * Attempt to get a parameter value from a request and filter it.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory If true, an exception will be thrown if
- * the parameter is missing from the request.
- * @param mixed $default The value to return if the parameter was not
- * specified and the parameter is not mandatory.
- * @param int $filterId The ID of the filter to use. See filter_var.
- * @param mixed $filterOptions The options to use with the filter.
- * The filter should be configured so that
- * it returns null if conversion is not
- * successful. See filter_var.
- * @param string $expectedValueType The expected type for the value.
- * This is used purely for errors thrown
- * when the parameter value is invalid.
- * @return mixed If available and valid, the parameter value.
- * Otherwise, if it is missing and not mandatory,
- * the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value is not valid
- * according to the given filter.
- */
- private function getParam(Request $request, $name, $mandatory, $default, $filterId, $filterOptions, $expectedValueType)
- {
- // Attempt to extract the parameter value from the request.
- $value = $request->get($name, null);
-
- // If the parameter was not present, throw an exception if it was
- // mandatory and return the default if it was not.
- if ($value === null) {
- if ($mandatory) {
- throw new BadRequestHttpException("$name is a required parameter.");
- } else {
- return $default;
- }
- }
-
- // If the parameter is an array, throw an exception.
- $invalidMessage = (
- "Invalid value for $name. Must be a(n) $expectedValueType."
- );
- if (is_array($value)) {
- throw new BadRequestHttpException($invalidMessage);
- }
-
- // Run the found parameter value through the given filter.
- if (array_key_exists('flags', $filterOptions)) {
- $filterOptions['flags'] |= FILTER_NULL_ON_FAILURE;
- } else {
- $filterOptions['flags'] = FILTER_NULL_ON_FAILURE;
- }
- $value = filter_var($value, $filterId, $filterOptions);
-
- // If the value is invalid, throw an exception.
- if ($value === null) {
- throw new BadRequestHttpException($invalidMessage);
- }
-
- // Return the filtered value.
- return $value;
- }
-
- /**
- * Attempt to get an integer parameter value from a request.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as an integer. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value could not be
- * converted to an integer.
- */
- protected function getIntParam(Request $request, $name, $mandatory = false, $default = null)
- {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_VALIDATE_INT,
- array(
- "options" => array(
- "default" => null,
- ),
- ),
- "integer"
- );
- }
-
- /**
- * Attempt to get a float parameter value from a request.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as a float. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value could not be
- * converted to a float.
- */
- protected function getFloatParam(Request $request, $name, $mandatory = false, $default = null)
- {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_VALIDATE_FLOAT,
- array(
- "options" => array(
- "default" => null,
- ),
- ),
- "float"
- );
- }
-
- /**
- * Attempt to get a string parameter value from a request.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as a string. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory.
- */
- protected function getStringParam(Request $request, $name, $mandatory = false, $default = null)
- {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_DEFAULT,
- array(),
- "string"
- );
- }
-
- /**
- * Attempt to get a boolean parameter value from a request.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as a boolean. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value could not be
- * converted to a boolean.
- */
- protected function getBooleanParam(Request $request, $name, $mandatory = false, $default = null)
- {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_CALLBACK,
- array(
- "options" => function ($value) {
- // Run the found parameter value through a boolean filter.
- $filteredValue = filter_var(
- $value,
- FILTER_VALIDATE_BOOLEAN,
- array(
- "flags" => FILTER_NULL_ON_FAILURE,
- )
- );
-
- // If the filter converted the string, return the boolean.
- if ($filteredValue !== null) {
- return $filteredValue;
- }
-
- // Check the value against 'y' for true and 'n' for false.
- $lowercaseValue = strtolower($value);
- if ($lowercaseValue === 'y') {
- return true;
- }
- if ($lowercaseValue === 'n') {
- return false;
- }
-
- // Return null if all conversion attempts failed.
- return null;
- },
- ),
- "boolean"
- );
- }
-
- /**
- * Attempt to get a date parameter value from a request where it is
- * submitted as a Unix timestamp.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as a DateTime. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value could not be
- * converted to a DateTime.
- */
- protected function getDateTimeFromUnixParam(Request $request, $name, $mandatory = false, $default = null)
- {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_CALLBACK,
- array(
- "options" => function ($value) {
- return self::filterDate($value, 'U');
- },
- ),
- "Unix timestamp"
- );
- }
-
- /**
- * Attempt to get a date parameter value from a request where it is
- * submitted as a ISO 8601 (YYYY-MM-DD) date.
- *
- * @param Request $request The request to extract the parameter from.
- * @param string $name The name of the parameter.
- * @param boolean $mandatory (Optional) If true, an exception will be
- * thrown if the parameter is missing from the
- * request. (Defaults to false.)
- * @param mixed $default (Optional) The value to return if the
- * parameter was not specified and the parameter
- * is not mandatory. (Defaults to null.)
- * @return mixed If available and valid, the parameter value
- * as a DateTime. Otherwise, if it is missing
- * and not mandatory, the given default.
- *
- * @throws BadRequestHttpException If the parameter was not available
- * and the parameter was deemed mandatory,
- * or if the parameter value could not be
- * converted to a DateTime.
- */
- protected function getDateFromISO8601Param(
- Request $request,
- $name,
- $mandatory = false,
- $default = null
- ) {
- return $this->getParam(
- $request,
- $name,
- $mandatory,
- $default,
- FILTER_CALLBACK,
- [
- 'options' => function ($value) {
- return self::filterDate($value);
- },
- ],
- 'ISO 8601 Date'
- );
- }
-
- /**
- * Get the best match for the acceptable content type for the request, given a
- * list of supported content types.
- *
- * @param Request $request The request from which to extract the data
- * @param array $supportedTypes A list of supported MIME types.
- * @param string $paramname (Optional) A parameter that will also be
- * checked for the accept type, in addition to the Accept header
- * contents. This parameter is checked first.
- * @return mixed the best matching entry from the $supportedTypes list or null if no supported types
- * were allowable.
- */
- protected function getAcceptContentType(Request $request, $supportedTypes, $paramname = null)
- {
- $acceptTypes = $request->getAcceptableContentTypes();
-
- if ($paramname !== null) {
- $acceptType = $this->getStringParam($request, $paramname);
- if ($acceptType !== null) {
- array_unshift($acceptTypes, $acceptType);
- }
- }
-
- $selectedType = null;
-
- foreach ($acceptTypes as $type) {
- if (in_array($type, $supportedTypes)) {
- $selectedType = $type;
- break;
- }
- }
-
- return $selectedType;
- }
-
- /**
- * Helper function that creates a Response object that will result in
- * a file download on the client.
- *
- * @param $content The content of the file that will be sent
- * @param $filename The name of the file to send
- * @param $mimetype (Optional) The mimetype to set for the file. If omitted
- * then the mime type will be guessed using the finfo() fn.
- */
- protected function sendAttachment($content, $filename, $mimetype = null)
- {
- if ($mimetype === null) {
- $finfo = new \finfo(FILEINFO_MIME_TYPE);
- $mimetype = $finfo->buffer($content);
- }
-
- $response = new Response(
- $content,
- Response::HTTP_OK,
- array('Content-Type' => $mimetype)
- );
- $response->headers->set(
- 'Content-Disposition',
- $response->headers->makeDisposition(
- ResponseHeaderBag::DISPOSITION_ATTACHMENT,
- $filename
- )
- );
-
- return $response;
- }
-
- /**
- * Retrieve the 'id' property from the supplied array of values. The 'id'
- * property is defined by the provided 'selector'. If the 'id' does not
- * exist than a default can be supplied, otherwise null will be returned.
- *
- * @param array $values
- * @param string $selector
- * @param null $default
- * @return null
- */
- protected function getId(array $values, $selector = 'dtype', $default = null)
- {
- if (!isset($values) || !isset($selector) || !is_string($selector)) {
- return null;
- }
-
- $idSelector = isset($values[$selector]) ? $values[$selector] : null;
-
- return isset($idSelector) && isset($values[$idSelector]) ? $values[$idSelector] : $default;
- }
-
- /** ------------------------------------------------------------------------------------------
- * Format a data structure suitable for logging. The logger will convert an array into a JSON
- * blob for storage in the database.
- *
- * @param string $message A general message
- * @param \Symfony\Component\HttpFoundation\Request $request
- * @param boolean $includeParams if set to
- * TRUE include the GET and POST parameters in the log message.
- *
- * @return array An associative array containing the message, request path, and a block of
- * supplemental data including host, port, method, ip address, get & post parameters, etc.
- *
- * array('message' => ,
- * 'path' =>
- * 'data' => array(...)
- * );
- *
- * Note: We need to define a standard log message with optional additional information. To
- * facilitate parsing/display, I suggest that all log entries have:
- * message - human readable message
- * internal - optional internal-only message describing the error
- * path - the rest path or file/method that the exception was thrown
- * data - an associative array of optional data specific to the section
- *
- * ------------------------------------------------------------------------------------------
- */
-
- public function formatLogMesssage($message, Request $request, $includeParams = false)
- {
- $retval = array('message' => $message);
-
- $authInfo = Authentication::getAuthenticationInfo($request);
- $method = $request->getMethod();
- $host = $request->getHost();
- $port = $request->getPort();
- $retval['path'] = $request->getPathInfo();
-
- $retval['data'] = array(
- 'host' => $host,
- 'port' => $port,
- 'method' => $method,
- 'username' => $authInfo['username'],
- 'ip' => $authInfo['ip'],
- 'token' => $authInfo['token'],
- 'timestamp' => date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME'])
- );
-
- if ($includeParams) {
- $retval['data']['get'] = $request->query->all();
- $retval['data']['post'] = $request->request->all();
- }
-
- return $retval;
-
- }
-
- /**
- * Checks that the `$[start|end]Date` values are valid ( `Y-m-d` ) dates and that `$startDate`
- * is before `$endDate`.
- *
- * @param string $startDate the beginning of the date range.
- * @param string $endDate the end of the date range.
- * @throws BadRequestHttpException if either start or end dates are not provided in the format
- * `Y-m-d`, or if the start date is after the end date.
- */
- protected function checkDateRange($startDate, $endDate)
- {
- $startTimestamp = $this->getTimestamp($startDate, 'start_date');
- $endTimestamp = $this->getTimestamp($endDate, 'end_date');
-
- if ($startTimestamp > $endTimestamp) {
- throw new BadRequestHttpException('Start Date must not be after End Date');
- }
- }
-
- /**
- * Attempt to convert the provided string $date value into an equivalent unix timestamp (int).
- *
- * @param string $date The value to be converted into a DateTime.
- * @param string $paramName 'date', The name of the parameter to be included in the exception
- * message if validation fails.
- * @param string $format 'Y-m-d', The format that `$date` should be in.
- * @return int created from the provided `$date` value.
- * @throws BadRequestHttpException if the date is not in the form `Y-m-d`.
- */
- protected function getTimestamp($date, $paramName = 'date', $format = 'Y-m-d')
- {
- $parsed = date_parse_from_format($format, $date);
- $date = mktime(
- $parsed['hour'],
- $parsed['minute'],
- $parsed['second'],
- $parsed['month'],
- $parsed['day'],
- $parsed['year']
- );
-
- if ($date === false || $parsed['error_count'] > 0) {
- throw new BadRequestHttpException("Unable to parse $paramName");
- }
-
- return $date;
- }
-
- /**
- * Attempts to convert the provided $value into an instance of DateTime by using the provided $format. If $value is
- * unable to be converted into a valid DateTime or if warnings are generated during the process it will be filtered
- * and null returned.
- *
- * @param string $value the date to be validated against the provided $format. Ex: 2027-08-15
- * @param string $format the format to be used when converting the string $value to an instance of DateTime
- *
- * @return DateTime|null If the creation of a DateTime was successful without warning then an instance of DateTime
- * will be returned, else null;
- */
- private static function filterDate(string $value, string $format = 'Y-m-d'): ?DateTime
- {
- $dateTime = DateTime::createFromFormat($format, $value);
-
- $lastErrors = DateTime::getLastErrors();
-
- /* For PHP versions less than 8.2.0 $lastErrors will always be an array w/ the properties:
- * warning_count, warnings, error_count, and errors. For versions >= 8.2.0, it will return false if
- * there are no errors else it will return as it did pre-8.2.0.
- *
- * The below `if` statement takes this into account by ensuring that we specifically check for when
- * $value_dt is not false ( i.e. is a DateTime object ) but we do have 1 or more warnings which
- * indicates that the value of $value_dt is most likely not what it's expected to be.
- *
- * Example: parsing the date `2024-01-99` results in a $value_dt of:
- * DateTime('2024-04-08')
- * and a $lastError of:
- * [
- * 'warning_count' => 1,
- * 'warnings' => [
- * 10 => 'The parsed date was invalid'
- * ],
- * 'error_count' => 0,
- * 'errors' => []
- * ]
- */
- if ($dateTime === false || (is_array($lastErrors) && $lastErrors['warning_count'] > 0)) {
- return null;
- }
- return $dateTime;
- }
-}
diff --git a/classes/Rest/Controllers/DashboardControllerProvider.php b/classes/Rest/Controllers/DashboardControllerProvider.php
deleted file mode 100644
index ffef4bda29..0000000000
--- a/classes/Rest/Controllers/DashboardControllerProvider.php
+++ /dev/null
@@ -1,430 +0,0 @@
-prefix;
- $class = get_class($this);
-
- $controller->get("$root/components", "$class::getComponents");
-
- $controller->post("$root/layout", "$class::setLayout");
- $controller->delete("$root/layout", "$class::resetLayout");
-
- $controller->get("$root/rolereport", "$class::getRoleReport");
- $controller->get("$root/savedchartsreports", "$class::getSavedChartsReports");
-
- $controller->post("$root/viewedUserTour", "$class::setViewedUserTour");
- $controller->get("$root/viewedUserTour", "$class::getViewedUserTour");
-
- $controller->get("$root/statistics", "$class::getStatistics");
-
- }
-
- /*
- * Get the column layout manager for the user
- *
- * @return \CCR\ColumnLayout
- */
- private function getLayout($user)
- {
- $defaultLayout = null;
- $defaultColumnCount = 2;
-
- if ($user->isPublicUser() === false) {
- $layoutStore = new \UserStorage($user, 'summary_layout');
- $record = $layoutStore->getById(0);
- if ($record) {
- $defaultLayout = $record['layout'];
- $defaultColumnCount = $record['columns'];
- }
- }
-
- return new \CCR\ColumnLayout($defaultColumnCount, $defaultLayout);
- }
-
- private function getConfigVariables($user)
- {
- $person_id = $user->getPersonID(true);
- $obj_warehouse = new \XDWarehouse();
-
- return array(
- 'PERSON_ID' => $person_id,
- 'PERSON_NAME' => $obj_warehouse->resolveName($person_id)
- );
- }
-
- /**
- * The individual dashboard components have a namespace prefix to simplify
- * the implementation of the algorithm that determines which
- * components to display. There are two sources of configuration data for
- * the components. The roles configuration file and the user configuration
- * (in the database). The user configuration only contains chart components.
- * The user configuration is handled via the "Show in Summary tab" checkbox
- * in the metric explorer.
- *
- * Non-chart components and the full-width components are defined in the roles
- * configuration file and are not overrideable.
- *
- * Chart components are handled as follows:
- * - All user charts with "show in summary tab" checked will be displayed
- * - If a user chart has the same name as a chart in the role configuration
- * then its settings will be used in place of the role chart.
- */
- const TOP_COMPONENT = 't.';
- const CHART_COMPONENT = 'c.';
- const NON_CHART_COMPONENT = 'p.';
-
- public function getComponents(Request $request, Application $app)
- {
- $user = $this->getUserFromRequest($request);
-
- $dashboardComponents = array();
-
- $mostPrivilegedAcl = Acls::getMostPrivilegedAcl($user)->getName();
-
- $layout = $this->getLayout($user);
-
- $roleConfig = \Configuration\XdmodConfiguration::assocArrayFactory(
- 'roles.json',
- CONFIG_DIR,
- null,
- array('config_variables' => $this->getConfigVariables($user))
- );
-
- $presets = $roleConfig['roles'][$mostPrivilegedAcl];
-
- if (isset($presets['dashboard_components'])) {
-
- foreach($presets['dashboard_components'] as $component) {
-
- $componentType = self::NON_CHART_COMPONENT;
-
- if (isset($component['region']) && $component['region'] === 'top') {
- $componentType = self::TOP_COMPONENT;
- $chartLocation = $componentType . $component['name'];
- $column = -1;
- } else {
- if ($component['type'] === 'xdmod-dash-chart-cmp') {
- $componentType = self::CHART_COMPONENT;
- $component['config']['name'] = $component['name'];
- $component['config']['chart']['featured'] = true;
- }
-
- $defaultLayout = null;
- if (isset($component['location']) && isset($component['location']['row']) && isset($component['location']['column'])) {
- $defaultLayout = array($component['location']['row'], $component['location']['column']);
- }
-
- list($chartLocation, $column) = $layout->getLocation($componentType . $component['name'], $defaultLayout);
- }
-
- $dashboardComponents[$chartLocation] = array(
- 'name' => $componentType . $component['name'],
- 'type' => $component['type'],
- 'config' => isset($component['config']) ? $component['config'] : array(),
- 'column' => $column
- );
- }
- }
-
- if ($user->isPublicUser() === false)
- {
- $queryStore = new \UserStorage($user, 'queries_store');
- $queries = $queryStore->get();
-
- if ($queries != null) {
- foreach ($queries as $query) {
- if (!isset($query['config']) || !isset($query['name'])) {
- continue;
- }
-
- $queryConfig = json_decode($query['config']);
-
- if (!isset($queryConfig->featured) || !$queryConfig->featured) {
- continue;
- }
-
- $name = self::CHART_COMPONENT . $query['name'];
-
- list($chartLocation, $column) = $layout->getLocation($name);
-
- $dashboardComponents[$chartLocation] = array(
- 'name' => $name,
- 'type' => 'xdmod-dash-chart-cmp',
- 'config' => array(
- 'name' => $query['name'],
- 'chart' => $queryConfig
- ),
- 'column' => $column
- );
- }
- }
- }
-
- ksort($dashboardComponents);
-
- return $app->json(array(
- 'success' => true,
- 'total' => count($dashboardComponents),
- 'portalConfig' => array('columns' => $layout->getColumnCount()),
- 'data' => array_values($dashboardComponents)
- ));
- }
-
- /**
- * set the layout metadata
- *
- */
- public function setLayout(Request $request, Application $app)
- {
- $user = $this->authorize($request);
-
- $content = json_decode($this->getStringParam($request, 'data', true), true);
-
- if ($content === null || !isset($content['layout']) || !isset($content['columns'])) {
- throw new BadRequestHttpException('Invalid data parameter');
- }
-
- $storage = new \UserStorage($user, 'summary_layout');
-
- return $app->json(array(
- 'success' => true,
- 'total' => 1,
- 'data' => $storage->upsert(0, $content)
- ));
- }
-
- /**
- * clear the layout metadata
- *
- */
- public function resetLayout(Request $request, Application $app)
- {
- $user = $this->authorize($request);
-
- $storage = new \UserStorage($user, 'summary_layout');
-
- $storage->del();
-
- return $app->json(array(
- 'success' => true,
- 'total' => 1
- ));
- }
-
- /*
- * Set value for if a user should view the help tour or not
- */
- public function setViewedUserTour(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- $viewedTour = $this->getIntParam($request, 'viewedTour', true);
-
- if (!in_array($viewedTour, [0,1])) {
- throw new BadRequestHttpException('Invalid data parameter');
- }
-
- $storage = new \UserStorage($user, 'viewed_user_tour');
-
- return $app->json(array(
- 'success' => true,
- 'total' => 1,
- 'msg' => $storage->upsert(0, ['viewedTour' => $viewedTour])
- ));
- }
-
- /**
- * Get charts based on role.
- **/
- public function getRoleReport(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- $role = $user->getMostPrivilegedRole()->getName();
- $report_id_suffix = 'autogenerated-' . $role;
- $report_id = $user->getUserID() . '-' . $report_id_suffix;
- if (isset($user)) {
- $userReport = null;
- $rm = new \XDReportManager($user);
- $reports = $rm->fetchReportTable();
- foreach ($reports as &$report) {
- if ($report['report_id'] === $report_id) {
- $userReport = $report;
- }
- }
- if (is_null($userReport)){
- $availTemplates = $rm->enumerateReportTemplates(array($role), 'Dashboard Tab Report');
- if (empty($availTemplates)) {
- throw new NotFoundHttpException("No dashboard tab report template available for $role");
- }
-
- $template = $rm->retrieveReportTemplate($user, $availTemplates[0]['id']);
- $template->buildReportFromTemplate($_REQUEST, $report_id_suffix);
- $reports = $rm->fetchReportTable();
- foreach ($reports as &$report) {
- if ($report['report_id'] === $report_id) {
- $userReport = $report;
- }
- }
- }
- $data = $rm->loadReportData($userReport['report_id']);
- $count = 0;
- foreach($data['queue'] as $queue) {
- $chart_id = explode("&", $queue['chart_id']);
- $chart_id_parsed = array();
- foreach($chart_id as $value) {
- list($key, $value) = explode("=", $value);
- $key = urldecode($key);
- $value = urldecode($value);
- $json = json_decode($value, true);
-
- if ($key === 'timeseries') {
- $value = $value === 'y' || $value === 'true';
- } elseif ($json !== null) {
- $value = $json;
- }
- $chart_id_parsed[$key] = $value;
- }
- $data['queue'][$count]['chart_id'] = $chart_id_parsed;
- $count++;
- }
- return $app->json(array(
- 'success' => true,
- 'total' => count($data),
- 'data' => $data
- ));
- }
- }
- /*
- * Get stored value for if a user should view the help tour or not
- */
- public function getViewedUserTour(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- $storage = new \UserStorage($user, 'viewed_user_tour');
- return $app->json(array(
- 'success' => true,
- 'total' => 1,
- 'data' => $storage->get()
- ));
- }
- /**
- * Get saved charts and reports.
- **/
- public function getSavedChartsReports(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- if (isset($user)) {
- // fetch charts
- $queries = new \UserStorage($user, 'queries_store');
- $data = $queries->get();
- foreach ($data as &$query) {
- $query['name'] = htmlspecialchars($query['name'], ENT_COMPAT, 'UTF-8', false);
- $query['type'] = 'Chart';
- }
- // fetch reports
- $rm = new \XDReportManager($user);
- $reports = $rm->fetchReportTable();
- foreach ($reports as &$report) {
- $tmp = array();
- $tmp['type'] = 'Report';
- $tmp['name'] = $report['report_name'];
- $tmp['chart_count'] = $report['chart_count'];
- $tmp['charts_per_page'] = $report['charts_per_page'];
- $tmp['creation_method'] = $report['creation_method'];
- $tmp['report_delivery'] = $report['report_delivery'];
- $tmp['report_format'] = $report['report_format'];
- $tmp['report_id'] = $report['report_id'];
- $tmp['report_name'] = $report['report_name'];
- $tmp['report_schedule'] = $report['report_schedule'];
- $tmp['report_title'] = $report['report_title'];
- $tmp['ts'] = $report['last_modified'];
- $tmp['config'] = $report['report_id'];
- $data[] = $tmp;
- }
- return $app->json(array(
- 'success' => true,
- 'total' => count($data),
- 'data' => $data
- ));
- }
- }
-
- /*
- * Retrieve summary statistics
- *
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws Exception
- */
- public function getStatistics(Request $request, Application $app)
- {
- $user = $this->getUserFromRequest($request);
-
- $aggregationUnit = $request->get('aggregation_unit', 'auto');
-
- $startDate = $this->getStringParam($request, 'start_date', true);
- $endDate = $this->getStringParam($request, 'end_date', true);
-
- $this->checkDateRange($startDate, $endDate);
-
- // This try/catch block is intended to replace the "Base table or
- // view not found: 1146 Table 'modw_aggregates.jobfact_by_day'
- // doesn't exist" error message with something more informative for
- // Open XDMoD users.
- try {
- $query = new \DataWarehouse\Query\AggregateQuery(
- 'Jobs',
- $aggregationUnit,
- $startDate,
- $endDate,
- 'none',
- 'all'
- );
-
- $result = $query->execute();
- } catch (PDOException $e) {
- if ($e->getCode() === '42S02' && strpos($e->getMessage(), 'modw_aggregates.jobfact_by_') !== false) {
- $msg = 'Aggregate table not found, have you ingested your data?';
- throw new Exception($msg);
- } else {
- throw $e;
- }
- } catch (Exception $e) {
- throw new BadRequestHttpException($e->getMessage());
- }
-
- $rawRoles = XdmodConfiguration::assocArrayFactory('roles.json', CONFIG_DIR);
-
- $mostPrivileged = $user->getMostPrivilegedRole()->getName();
- $formats = $rawRoles['roles'][$mostPrivileged]['statistics_formats'];
-
- return $app->json(
- array(
- 'totalCount' => 1,
- 'success' => true,
- 'message' => '',
- 'formats' => $formats,
- 'data' => array($result)
- )
- );
- }
-}
diff --git a/classes/Rest/Controllers/LegacyControllerProvider.php b/classes/Rest/Controllers/LegacyControllerProvider.php
deleted file mode 100644
index efc53ffeba..0000000000
--- a/classes/Rest/Controllers/LegacyControllerProvider.php
+++ /dev/null
@@ -1,129 +0,0 @@
- array(
- 'route' => '/versions/current',
- 'method' => 'GET',
- ),
- );
-
- /**
- * Convert a URL arguments string from the old REST stack
- * into an associative array.
- *
- * The arguments string must not be decoded for this to work properly.
- * This means the string cannot be passed in from Silex's route helper
- * functions, as they will automatically decode the string.
- *
- * Based on the old REST stack's URL parser.
- *
- * @param string $urlArgumentsString A string of URL arguments, as defined
- * by the old REST stack.
- * @return array A mapping of URL argument keys to
- * their values.
- */
- private function parseUrlArguments($urlArgumentsString)
- {
- // Replace any blocks of slashes with a single slash.
- $urlArgumentsString = preg_replace('/\/{2,}/', '/', $urlArgumentsString);
-
- // Break up the string by key-value pairs.
- $urlArgumentPairs = explode('/', $urlArgumentsString);
-
- // Create an associative array from the pairs.
- $urlArguments = array();
- foreach ($urlArgumentPairs as $urlArgumentPair) {
- $urlArgumentPairComponents = explode('=', $urlArgumentPair, 2);
-
- if (count($urlArgumentPairComponents) < 2) {
- continue;
- }
-
- $urlArgumentPairComponents = array_map('urldecode', $urlArgumentPairComponents);
- $urlArguments[$urlArgumentPairComponents[0]] = $urlArgumentPairComponents[1];
- }
-
- // Return the associative array.
- return $urlArguments;
- }
-
- /**
- * @see BaseControllerProvider::setupRoutes
- */
- public function setupRoutes(Application $app, \Silex\ControllerCollection $controller)
- {
- foreach (self::$legacyRouteMapping as $legacyRoute => $legacyRouteOptions) {
- $controller->match($legacyRoute, '\Rest\Controllers\LegacyControllerProvider::redirectLegacyRoute')
- ->value('legacyRoute', $legacyRoute)
- ->value('options', $legacyRouteOptions);
-
- $controller->match("$legacyRoute/{urlArguments}", '\Rest\Controllers\LegacyControllerProvider::redirectLegacyRoute')
- ->assert('urlArguments', '.*')
- ->value('legacyRoute', $legacyRoute)
- ->value('options', $legacyRouteOptions);
- }
- }
-
- /**
- * Internally redirect a legacy route to its current equivalent.
- *
- * @param Request $request The request used to make this call.
- * @param Application $app The router application.
- * @param string $legacyRoute The route that invoked this function.
- * @param array $options A set of options for redirecting the call.
- * @return Response The response from the call this route
- * was redirected to.
- */
- public function redirectLegacyRoute(Request $request, Application $app, $legacyRoute, $options)
- {
- // Extract the URL arguments from the URL.
- //
- // This cannot be passed in from the route definition,
- // as Silex will apply a different method of URL decoding than the
- // old REST stack did.
- list($routeMountPoint, $urlArgumentsAndParamsString) = explode($legacyRoute, $request->getRequestUri(), 2);
- list($urlArgumentsString, $urlParamsString) = explode('?', $urlArgumentsAndParamsString, 2);
-
- $urlArguments = $this->parseUrlArguments($urlArgumentsString);
-
- // Create a sub-request which points to the new route.
- $subrequestParams = new ParameterBag();
- $subrequestParams->add($request->query->all());
- $subrequestParams->add($request->request->all());
- $subrequestParams->add($urlArguments);
-
- $subrequest = Request::create(
- '/' . \xd_utilities\getConfiguration('rest', 'version') . $options['route'],
- $options['method'],
- $subrequestParams->all(),
- $request->cookies->all(),
- $request->files->all(),
- $request->server->all(),
- $request->getContent()
- );
-
- // Launch the sub-request and return the response.
- return $app->handle($subrequest, HttpKernelInterface::SUB_REQUEST, false);
- }
-}
diff --git a/classes/Rest/Controllers/MetricExplorerControllerProvider.php b/classes/Rest/Controllers/MetricExplorerControllerProvider.php
deleted file mode 100644
index c1fe0dfcc1..0000000000
--- a/classes/Rest/Controllers/MetricExplorerControllerProvider.php
+++ /dev/null
@@ -1,405 +0,0 @@
-prefix;
- $base = '\Rest\Controllers\MetricExplorerControllerProvider';
-
- $idConverter = function ($id) {
- return (int)$id;
- };
-
- // QUERY ROUTES ========================================================
- $controller
- ->get("$root/queries", "$base::getQueries");
-
- $controller
- ->get("$root/queries/{id}", "$base::getQueryById")
- ->convert('id', $idConverter);
-
- $controller
- ->post("$root/queries", "$base::createQuery");
-
- $controller
- ->post("$root/queries/{id}", "$base::updateQueryById")
- ->convert('id', $idConverter);
-
- $controller
- ->delete("$root/queries/{id}", "$base::deleteQueryById")
- ->convert('id', $idConverter);
- // QUERY ROUTES ========================================================
-
- }
-
- /**
- * Retrieve all of the queries that the requesting user has currently saved.
- *
- * @param Request $request
- * @param Application $app
- * @return JsonResponse
- */
- public function getQueries(Request $request, Application $app)
- {
- $action = 'getQueries';
- $payload = array(
- 'success' => false,
- 'action' => $action,
- );
- $statusCode = 401;
-
- try {
-
- $user = $this->authorize($request);
- if (isset($user)) {
- $queries = new \UserStorage($user, self::_QUERIES_STORE);
- $data = $queries->get();
-
- foreach ($data as &$query) {
- $this->removeRoleFromQuery($user, $query);
- $query['name'] = htmlspecialchars($query['name'], ENT_COMPAT, 'UTF-8', false);
- }
-
- $payload['data'] = $data;
- $payload['success'] = true;
- $statusCode = 200;
- } else {
- $payload['message'] = self::EXCEPTION_MESSAGE;
- }
- } catch (BadRequestHttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (HttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (\Exception $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = 500;
- }
-
- return $app->json(
- $payload,
- $statusCode
- );
- }
-
- /**
- * Retrieve a query's information by unique id for the requesting user.
- *
- * @param Request $request
- * @param Application $app
- * @param $id
- * @return JsonResponse
- */
- public function getQueryById(Request $request, Application $app, $id)
- {
- $action = 'getQueryById';
- $payload = array(
- 'success' => false,
- 'action' => $action,
- );
- $statusCode = 401;
-
- try {
- $user = $this->authorize($request);
- if (isset($user)) {
- $queries = new \UserStorage($user, self::_QUERIES_STORE);
-
- $query = $queries->getById($id);
-
- if (isset($query)) {
- $payload['data'] = $query;
- $payload['data']['name'] = htmlspecialchars($query['name'], ENT_COMPAT, 'UTF-8', false);
- $payload['success'] = true;
- $statusCode = 200;
- } else {
- $payload['message'] = 'Unable to find the query identified by the provided id: ' . $id;
- $statusCode = 404;
- }
- } else {
- $payload['message'] = self::EXCEPTION_MESSAGE;
- }
- } catch (BadRequestHttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (HttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (\Exception $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = 500;
- }
-
- return $app->json(
- $payload,
- $statusCode
- );
- }
-
- /**
- * Create a new query to be stored in the requesting users User Profile.
- *
- * @param Request $request
- * @param Application $app
- * @return JsonResponse
- */
- public function createQuery(Request $request, Application $app)
- {
- $action = 'creatQuery';
- $payload = array(
- 'success' => false,
- 'action' => $action,
- );
- $statusCode = 401;
- try {
- $user = $this->authorize($request);
- if (isset($user)) {
- $queries = new \UserStorage($user, self::_QUERIES_STORE);
- $data = json_decode(
- $this->getStringParam($request, 'data', true),
- true
- );
- $success = $queries->insert($data) != null;
- $payload['success'] = $success;
- if ($success) {
- $payload['success'] = true;
- $payload['data'] = $data;
- $statusCode = 200;
- } else {
- $payload['message'] = 'Error creating chart. User is over the chart limit.';
- $statusCode = 500;
- }
- } else {
- $payload['message'] = self::EXCEPTION_MESSAGE;
- }
- } catch (BadRequestHttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (HttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (\Exception $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = 500;
- }
-
- return $app->json(
- $payload,
- $statusCode
- );
-
- }
-
- /**
- * Update the query identified by the provided 'id' parameter with the
- * values of the following form params ( if provided ):
- * - name
- * - config
- * - timestamp
- *
- * @param Request $request
- * @param Application $app
- * @param $id
- * @return JsonResponse
- */
- public function updateQueryById(Request $request, Application $app, $id)
- {
- $action = 'updateQuery';
- $payload = array(
- 'success' => false,
- 'action' => $action,
- 'message' => 'success'
- );
- $statusCode = 401;
-
- try {
- $user = $this->authorize($request);
- if (isset($user)) {
- $queries = new \UserStorage($user, self::_QUERIES_STORE);
-
- $query = $queries->getById($id);
- if (isset($query)) {
-
-
- $data = $this->getStringParam($request, 'data');
- if (isset($data)) {
- $jsonData = json_decode($data, true);
- $name = isset($jsonData['name']) ? $jsonData['name'] : null;
- $config = isset($jsonData['config']) ? $jsonData['config'] : null;
- $ts = isset($jsonData['ts']) ? $jsonData['ts'] : microtime(true);
- } else {
- $name = $this->getStringParam($request, 'name');
- $config = $this->getStringParam($request, 'config');
- $ts = $this->getDateTimeFromUnixParam($request, 'ts');
- }
-
- if (isset($name)) {
- $query['name'] = $name;
- }
- if (isset($config)) {
- $query['config'] = $config;
- }
- if (isset($ts)) {
- $query['ts'] = $ts;
- }
-
- $queries->upsert($id, $query);
-
- // required for the UI to do it's thing.
- $total = count($queries->get());
-
- // make sure everything is in place for returning to the
- // front end.
- $payload['total'] = $total;
- $payload['success'] = true;
- $statusCode = 200;
- } else {
- $payload['message'] = 'There was no query found for the given id';
- $statusCode = 404;
- }
- } else {
- $payload['message'] = self::EXCEPTION_MESSAGE;
- }
- } catch (BadRequestHttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (HttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (\Exception $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = 500;
- }
-
- return $app->json(
- $payload,
- $statusCode
- );
- }
-
- /**
- * Delete the query identified by the provided form-param 'id'.
- *
- * @param Request $request
- * @param Application $app
- * @param $id of the query to be deleted.
- * @return JsonResponse
- */
- public function deleteQueryById(Request $request, Application $app, $id)
- {
- $action = 'deleteQueryById';
- $payload = array(
- 'success' => false,
- 'action' => $action,
- 'message' => 'success'
- );
- $statusCode = 401;
-
- try {
- $user = $this->authorize($request);
- if (isset($user)) {
- $queries = new \UserStorage($user, self::_QUERIES_STORE);
- $query = $queries->getById($id);
-
-
- if (isset($query)) {
-
- $before = count($queries->get());
- $after = $queries->delById($id);
- $success = $before > $after;
-
- // make sure everything is in place for returning to the
- // front end.
- $payload['success'] = $success;
- $payload['message'] = $success ? $payload['message'] : 'There was an error removing the query identified by: ' . $id;
-
- $statusCode = $success ? 200 : 500;
- } else {
- $payload['message'] = 'There was no query found for the given id';
- $statusCode = 404;
- }
- } else {
- $payload['message'] = self::EXCEPTION_MESSAGE;
- }
- } catch (BadRequestHttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (HttpException $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = $e->getStatusCode();
- } catch (\Exception $e) {
- $payload['message'] = $e->getMessage();
- $statusCode = 500;
- }
-
- return $app->json(
- $payload,
- $statusCode
- );
- }
-
- private function removeRoleFromQuery(XDUser $user, array &$query)
- {
- // If the query doesn't have a config, stop.
- if (!array_key_exists('config', $query)) {
- return;
- }
-
- // If the query config doesn't have an active role, stop.
- $queryConfig = json_decode($query['config']);
- if (!property_exists($queryConfig, 'active_role')) {
- return;
- }
-
- // Remove the active role from the query config.
- $activeRoleId = $queryConfig->active_role;
- unset($queryConfig->active_role);
-
- // Check whether or not $activeRoleId is an acl name or acl display value.
- // ( Old queries may utilize the `display` property).
- $activeRole = Acls::getAclByName($activeRoleId);
- if ($activeRole === null) {
- $activeRole = Acls::getAclByDisplay($activeRoleId);
- if ($activeRole !== null) {
- $activeRoleId = $activeRole->getName();
- }
- }
- // Convert the active role into global filters.
- MetricExplorer::convertActiveRoleToGlobalFilters($user, $activeRoleId, $queryConfig->global_filters);
-
- // Store the updated config in the query.
- $query['config'] = json_encode($queryConfig);
- }
-}
diff --git a/classes/Rest/Controllers/PersonControllerProvider.php b/classes/Rest/Controllers/PersonControllerProvider.php
deleted file mode 100644
index 6ea4ee3b84..0000000000
--- a/classes/Rest/Controllers/PersonControllerProvider.php
+++ /dev/null
@@ -1,55 +0,0 @@
-
- */
-class PersonControllerProvider extends BaseControllerProvider
-{
- public function setupRoutes(Application $app, ControllerCollection $controller)
- {
- $root = $this->prefix;
- $class = get_class($this);
- $conversions = '\Rest\Utilities\Conversions';
-
- $controller
- ->get("$root/{id}/organization", "$class::getOrganizationForPerson")
- ->assert('id', '(-)?\d+')
- ->convert('id', "$conversions::toInt");
- }
-
- /**
- * @param Request $request
- * @param Application $app
- * @param $id
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Exception
- */
- public function getOrganizationForPerson(Request $request, Application $app, $id)
- {
- // Ensure that this route is only authorized for users with the 'mgr' role.
- $this->authorize($request, array('mgr'));
-
- return $app->json(
- array(
- 'success' => true,
- 'results' => array(
- 'id' => Organizations::getOrganizationIdForPerson($id)
- )
- )
- );
- }
-}
diff --git a/classes/Rest/Controllers/WarehouseExportControllerProvider.php b/classes/Rest/Controllers/WarehouseExportControllerProvider.php
index d93f2510ed..e69de29bb2 100644
--- a/classes/Rest/Controllers/WarehouseExportControllerProvider.php
+++ b/classes/Rest/Controllers/WarehouseExportControllerProvider.php
@@ -1,416 +0,0 @@
-logger = Log::factory(
- 'data-warehouse-export-rest',
- [
- 'console' => false,
- 'file' => false,
- 'mail' => false
- ]
- );
- $this->realmManager = new RealmManager();
- $this->queryHandler = new QueryHandler($this->logger);
- }
-
- /**
- * Set up data warehouse export routes.
- *
- * @param Application $app
- * @param ControllerCollection $controller
- */
- public function setupRoutes(
- Application $app,
- ControllerCollection $controller
- ) {
- $root = $this->prefix;
- $current = get_class($this);
- $conversions = '\Rest\Utilities\Conversions';
-
- $controller->get("$root/realms", "$current::getRealms");
- $controller->post("$root/request", "$current::createRequest");
- $controller->get("$root/requests", "$current::getRequests");
- $controller->delete("$root/requests", "$current::deleteRequests");
-
- $controller->get("$root/download/{id}", "$current::getExportedDataFile")
- ->assert('id', '\d+')
- ->convert('id', "$conversions::toInt");
-
- $controller->delete("$root/request/{id}", "$current::deleteRequest")
- ->assert('id', '\d+')
- ->convert('id', "$conversions::toInt");
- }
-
- /**
- * Get all the realms available for exporting for the current user.
- *
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- */
- public function getRealms(Request $request, Application $app)
- {
- $user = null;
-
- // We need to wrap the token authentication because we want the token authentication to be optional, proceeding
- // to the normal session authentication if a token is not provided.
- try {
- $user = Tokens::authenticate($request);
- } catch (Exception $e) {
- // NOOP
- }
-
- if ($user === null) {
- $user = $this->authorize($request);
- }
-
-
- $config = RawStatisticsConfiguration::factory();
-
- $realms = array_map(
- function ($realm) use ($config) {
- $name = $realm->getName();
- return [
- 'id' => $name,
- 'name' => $realm->getDisplay(),
- 'fields' => $config->getBatchExportFieldDefinitions($name)
- ];
- },
- $this->realmManager->getRealmsForUser($user)
- );
-
- return $app->json(
- [
- 'success' => true,
- 'data' => array_values($realms),
- 'total' => count($realms)
- ]
- );
- }
-
- /**
- * Get all the existing export requests for the current user.
- *
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- */
- public function getRequests(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- $results = $this->queryHandler->listUserRequestsByState($user->getUserId());
- return $app->json(
- [
- 'success' => true,
- 'data' => $results,
- 'total' => count($results)
- ]
- );
- }
-
- /**
- * Create a new export request for the current user.
- *
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- * @throws BadRequestHttpException
- */
- public function createRequest(Request $request, Application $app)
- {
- $user = $this->authorize($request);
- $realm = $this->getStringParam($request, 'realm', true);
-
- $realms = array_map(
- function ($realm) {
- return $realm->getName();
- },
- $this->realmManager->getRealmsForUser($user)
- );
- if (!in_array($realm, $realms)) {
- throw new BadRequestHttpException('Invalid realm');
- }
-
- $startDate = $this->getDateFromISO8601Param($request, 'start_date', true);
- $endDate = $this->getDateFromISO8601Param($request, 'end_date', true);
- $now = new DateTime();
-
- if ($startDate > $now) {
- throw new BadRequestHttpException('Start date cannot be in the future');
- }
-
- if ($endDate > $now) {
- throw new BadRequestHttpException('End date cannot be in the future');
- }
-
- $interval = $startDate->diff($endDate);
-
- if ($interval === false) {
- throw new BadRequestHttpException('Failed to calculate date interval');
- }
-
- if ($interval->invert === 1) {
- throw new BadRequestHttpException('Start date must be before end date');
- }
-
- $format = strtoupper($this->getStringParam($request, 'format', true));
-
- if (!in_array($format, ['CSV', 'JSON'])) {
- throw new BadRequestHttpException('format must be CSV or JSON');
- }
-
- try {
- $id = $this->queryHandler->createRequestRecord(
- $user->getUserId(),
- $realm,
- $startDate->format('Y-m-d'),
- $endDate->format('Y-m-d'),
- $format
- );
- } catch (Exception $e) {
- throw new BadRequestHttpException('Failed to create export request: ' . $e->getMessage());
- }
-
- return $app->json([
- 'success' => true,
- 'message' => 'Created export request',
- 'data' => [['id' => $id]],
- 'total' => 1
- ]);
- }
-
- /**
- * Get the requested data.
- *
- * @param Request $request
- * @param Application $app
- * @param int $id
- * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- * @throws AccessDeniedHttpException
- * @throws NotFoundHttpException
- * @throws BadRequestHttpException
- */
- public function getExportedDataFile(Request $request, Application $app, $id)
- {
- $user = $this->authorize($request);
-
- $requests = array_filter(
- $this->queryHandler->listUserRequestsByState($user->getUserId()),
- function ($request) use ($id) {
- return $request['id'] == $id;
- }
- );
-
- if (count($requests) === 0) {
- throw new NotFoundHttpException('Export request not found');
- }
-
- // Using `array_shift` because `array_filter` preserves keys so the
- // request may not be at index 0.
- $request = array_shift($requests);
-
- if ($request['state'] !== 'Available') {
- throw new BadRequestHttpException('Requested data is not available');
- }
-
- $fileManager = new FileManager();
- $file = $fileManager->getExportDataFilePath($id);
-
- if (!is_file($file)) {
- throw new NotFoundHttpException('Exported data not found');
- }
-
- if (!is_readable($file)) {
- throw new AccessDeniedHttpException('Exported data is not readable');
- }
-
- $this->logger->info(
- '',
- [
- 'module' => self::LOG_MODULE,
- 'message' => 'Sending data warehouse export file',
- 'event' => 'DOWNLOAD',
- 'id' => $id,
- 'Users.id' => $user->getUserId()
- ]
- );
-
- if ($request['downloaded_datetime'] === null) {
- $this->queryHandler->updateDownloadedDatetime($request['id']);
- }
-
- return $app->sendFile(
- $file,
- 200,
- [
- 'Content-type' => 'application/zip',
- 'Content-Disposition' => sprintf(
- 'attachment; filename="%s"',
- $fileManager->getZipFileName($request)
- )
- ]
- );
- }
-
- /**
- * Delete a single request.
- *
- * @param Request $request
- * @param Application $app
- * @param int $id
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- * @throws NotFoundHttpException
- */
- public function deleteRequest(Request $request, Application $app, $id)
- {
- $user = $this->authorize($request);
- $count = $this->queryHandler->deleteRequest($id, $user->getUserId());
-
- if ($count === 0) {
- throw new NotFoundHttpException('Export request not found');
- }
-
- $this->logger->info('', [
- 'module' => self::LOG_MODULE,
- 'message' => 'Deleted data warehouse export request',
- 'event' => 'DELETE_BY_USER',
- 'id' => $id,
- 'Users.id' => $user->getUserId()
- ]);
-
- return $app->json([
- 'success' => true,
- 'message' => 'Deleted export request',
- 'data' => [['id' => $id]],
- 'total' => 1
- ]);
- }
-
- /**
- * Delete multiple requests.
- *
- * The request body content must be a JSON encoded array of request IDs.
- *
- * @param Request $request
- * @param Application $app
- * @return \Symfony\Component\HttpFoundation\JsonResponse
- * @throws \Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException
- * @throws NotFoundHttpException
- */
- public function deleteRequests(Request $request, Application $app)
- {
- $user = $this->authorize($request);
-
- $requestIds = [];
-
- try {
- $requestIds = @json_decode($request->getContent());
-
- if ($requestIds === null) {
- throw new Exception('Failed to decode JSON');
- }
-
- if (!is_array($requestIds)) {
- throw new Exception('Export request IDs must be in an array');
- }
-
- foreach ($requestIds as $id) {
- if (!is_int($id)) {
- throw new Exception('Export request IDs must integers');
- }
- }
- } catch (Exception $e) {
- throw new BadRequestHttpException(
- 'Malformed HTTP request content: ' . $e->getMessage()
- );
- }
-
- try {
- $dbh = DB::factory('database');
- $dbh->beginTransaction();
-
- foreach ($requestIds as $id) {
- $count = $this->queryHandler->deleteRequest($id, $user->getUserId());
- if ($count === 0) {
- throw new NotFoundHttpException('Export request not found');
- }
- $this->logger->info(
- '',
- [
- 'module' => self::LOG_MODULE,
- 'message' => 'Deleted data warehouse export request',
- 'event' => 'DELETE_BY_USER',
- 'id' => $id,
- 'Users.id' => $user->getUserId()
- ]
- );
- }
-
- $dbh->commit();
- } catch (NotFoundHttpException $e) {
- $dbh->rollBack();
- throw $e;
- } catch (Exception $e) {
- $dbh->rollBack();
- throw new BadRequestHttpException('Failed to delete export requests');
- }
-
- return $app->json([
- 'success' => true,
- 'message' => 'Deleted export requests',
- 'data' => array_map(
- function ($id) {
- return ['id' => $id];
- },
- $requestIds
- ),
- 'total' => count($requestIds)
- ]);
- }
-}
diff --git a/classes/Rest/RestFacade.php b/classes/Rest/RestFacade.php
deleted file mode 100644
index 82a0e90a29..0000000000
--- a/classes/Rest/RestFacade.php
+++ /dev/null
@@ -1,138 +0,0 @@
-attributes->set(BaseControllerProvider::_USER, $options['user']);
-
- // Determine the type of request by checking if an existing request
- // is accessible. If it is, the type of request to launch is a sub-request.
- // Otherwise, a master request needs to be launched.
- $request_level = HttpKernelInterface::MASTER_REQUEST;
- try {
- $existing_request = $app['request'];
- $request_level = HttpKernelInterface::SUB_REQUEST;
- } catch (\Exception $e) {
-
- }
-
- // Launch the request.
- $response = $app->handle($request, $request_level, $catch);
-
- // If the response object was requested, return it.
- if ($returnResponse) {
- return $response;
- }
-
- // Retrieve the encoded content from the response object.
- $encodedContent = $response->getContent();
-
- // If decoding was not requested, simply return the encoded contents.
- if (!$decodeResponse) {
- return $encodedContent;
- }
-
- // Get and return the decoded content of the response.
- // Use the encoded content as the return value, if all else fails.
- $decodedContent = $encodedContent;
-
- // If the original content is provided in the response, use that as
- // the decoded content to return. Otherwise, attempt to decode the
- // response contents.
- if (property_exists($response, 'originalContent')) {
- $decodedContent = $response->originalContent;
- } else {
- $contentType = $response->headers->get('Content-Type');
- if ($contentType === 'application/json') {
- $decodedContent = json_decode($encodedContent);
- }
- }
-
- return $decodedContent;
- }
-}
diff --git a/classes/Rest/Utilities/Authentication.php b/classes/Rest/Utilities/Authentication.php
deleted file mode 100644
index 2e3aa15f38..0000000000
--- a/classes/Rest/Utilities/Authentication.php
+++ /dev/null
@@ -1,275 +0,0 @@
-getAccountStatus() == false) {
- throw new HttpException(403, 'This account is disabled.');
- }
- } elseif (!isset($authInfo['token']) || \xd_utilities\string_begins_with($authInfo['token'], 'public-')) {
- $user = XDUser::getPublicUser();
- } else {
- $user = self::resolveUserFromToken(
- $authInfo['token'],
- $authInfo['ip']
- );
- }
-
- return $user;
-
- }//authenticateUser
-
- /**
- * This function will attempt to retrieve the currently logged in users'
- * authentication information from the provided Request object. If a
- * Request object is not provided than an empty array is returned.
- *
- * @param Request $request
- * @return array of the form array(
- * 'username' => ,
- * 'password' => ,
- * 'token' => ,
- * 'ip' => )
- */
- public static function getAuthenticationInfo(Request $request)
- {
- if (!isset($request)) {
- return array();
- }
-
- try {
- $useBasicAuth = \xd_utilities\getConfiguration('rest', 'basic_auth') == 'on';
- } catch (Exception $e) {
- $useBasicAuth = false;
- }
-
- if ($useBasicAuth) {
- $username = $request->headers->get(Authentication::_DEFAULT_AUTH_USER);
- $password = $request->headers->get(Authentication::_DEFAULT_AUTH_PASSWORD);
- }
-
- if (!isset($username)) {
- $username = $request->get(Authentication::_DEFAULT_USER);
- }
- if (!isset($password)) {
- $password = $request->get(Authentication::_DEFAULT_PASSWORD);
- }
-
- $token = $request->get(Authentication::_DEFAULT_TOKEN);
- if (!isset($token)) {
- $token = $request->headers->get(Authentication::_DEFAULT_AUTH_TOKEN);
- }
- if (!isset($token)) {
- $token = $request->cookies->get(Authentication::_DEFAULT_COOKIE_TOKEN);
- }
-
- return array(
- 'username' => $username,
- 'password' => $password,
- 'token' => $token,
- 'ip' => $request->getClientIp()
- );
- } // _getAuthenticationInfo
-
- /**
- * This function will attempt to retrieve an instance of XDUser for the provided token, and ip_address.
- *
- * @param $token the session token that will be used to retrieve
- * the currently logged in user.
- * @param $ip_address the ip_address that is associated with this
- * authentication attempt.
- * @return XDUser
- * @throws Exception
- * @throws SessionExpiredException
- */
- private static function resolveUserFromToken(
- $token,
- $ip_address
- ) {
- \xd_security\start_session();
-
- // TODO: A REST API should not depend on the consumer
- // sending a session cookie. The below block is for
- // handling session expiration in the browser. This
- // function and the client code should be refactored
- // to not depend on session-related code to detect
- // expired REST tokens.
-
- if (!isset($_SESSION['xdInit'])) {
-
- // Session died (token no longer valid);
- $msg = 'Token invalid or expired. '
- . 'You must authenticate before using this call.';
- throw new \SessionExpiredException($msg);
- }
-
- $session_id = session_id();
-
- // Without IP restriction ... relaxed, especially for
- // very mobile users (in which network hopping is
- // frequent)
-
- $resolver_query = "
- SELECT user_id
- FROM SessionManager
- WHERE session_token = :session_token
- AND session_id = :session_id
- AND init_time = :init_time
- ";
- $resolver_query_params = array(
- ':session_token' => $token,
- ':session_id' => $session_id,
- ':init_time' => $_SESSION['xdInit'],
- );
-
- $pdo = DB::factory('database');
-
- $user_check = $pdo->query(
- $resolver_query,
- $resolver_query_params
- );
-
- if (count($user_check) === 1) {
- $last_active_time = self::getMicrotime();
-
- $last_active_query = "
- UPDATE SessionManager
- SET last_active = :last_active
- WHERE session_token = :session_token
- AND session_id = :session_id
- AND ip_address = :ip_address
- AND init_time = :init_time
- ";
- $pdo->execute($last_active_query, array(
- ':last_active' => $last_active_time,
- ':session_token' => $token,
- ':session_id' => $session_id,
- ':ip_address' => $ip_address,
- ':init_time' => $_SESSION['xdInit'],
- ));
-
- $user = XDUser::getUserByID($user_check[0]['user_id']);
-
- if ($user == null) {
- throw new \Exception('Invalid token specified');
- }
-
- return $user;
- } else {
-
- // An error occurred (session is intact, yet a
- // corresponding record pertaining to that session
- // does not exist in the DB)
- throw new \Exception('Invalid token specified');
- }
- }
-
- /**
- * Get the current epoch time in micro seconds.
- *
- * @return int
- */
- private static function getMicrotime()
- {
- list($usec, $sec) = explode(' ', microtime());
- return $usec + $sec;
- }
-}
diff --git a/classes/Rest/Utilities/Conversions.php b/classes/Rest/Utilities/Conversions.php
deleted file mode 100644
index b945478571..0000000000
--- a/classes/Rest/Utilities/Conversions.php
+++ /dev/null
@@ -1,57 +0,0 @@
- $value) {
- $result .= "$key: $value, ";
- }
- $result .= " )";
- } elseif ($isArray && !$isAssociativeArray) {
- $result .= "( ";
- $result .= implode(", ", $value);
- $result .= " )";
- } else {
- $result = strval($value);
- }
-
- return $result;
- }
-
- private static function isAssoc($values)
- {
- if (!is_array($values)) {
- return false;
- }
- return (bool)count(array_filter(array_keys($values), 'is_string'));
- }
-}
diff --git a/classes/Rest/XdmodApplicationFactory.php b/classes/Rest/XdmodApplicationFactory.php
index 59b43a1386..e69de29bb2 100644
--- a/classes/Rest/XdmodApplicationFactory.php
+++ b/classes/Rest/XdmodApplicationFactory.php
@@ -1,266 +0,0 @@
-register(new \Silex\Provider\RoutingServiceProvider());
-
- // SET: the regex that will be used to filter the API_SYMBOL in a route.
- // in this case we're using it as our base url.
- $app['controllers']->assert(self::API_SYMBOL, self::API_REGEX);
-
- // Set the default value for the REST API version to a string
- // representing the latest version.
- $app['controllers']->value(self::API_SYMBOL, 'latest');
-
- $app['logger.db'] = function () {
- return \CCR\Log::factory('rest.logger.db', array(
- 'console' => false,
- 'file' => false,
- 'mail' => false,
- 'dbLogLevel' => \CCR\Log::INFO
- ));
- };
-
- $app->before(function (Request $request, Application $app) {
- $request->attributes->set('timing.start', microtime(true));
- return $app;
- }, Application::EARLY_EVENT);
-
- // SETUP: a before middleware that detects / starts the query debug mode for a request.
- $app->before(function (Request $request, Application $app) {
- if ($request->query->getBoolean('debug')) {
- PDODB::debugOn();
- }
- });
-
- // SETUP: the authentication Middleware to be run before the route is.
- $app->before("\Rest\Controllers\BaseControllerProvider::authenticate", Application::EARLY_EVENT);
-
- $app->after(function (Request $request, Response $response, Application $app) {
- $logger = $app['logger.db'];
-
- $retval = array('message' => "Route called");
-
- $authInfo = Authentication::getAuthenticationInfo($request);
- if (!isset($authInfo['username']) && $request->attributes->has(BaseControllerProvider::_USER)) {
- $authInfo['username'] = $request->attributes->get(BaseControllerProvider::_USER)->getUsername();
- }
- $method = $request->getMethod();
- $host = $request->getHost();
- $port = $request->getPort();
-
- // Extracting any POST variables provided in the Request.
- $post = array();
- foreach($request->request->getIterator() as $key => $value) {
- if (!in_array($key, self::$loggingBlacklist)) {
- $post[$key] = (
- is_string($value)
- ? json_decode($value, true)
- : null
- );
- }
- }
-
- // Calculate the amount of time that has elapsed serving this request.
- $start = $request->attributes->get('timing.start');
- $end = microtime(true);
- $elapsed = $end - $start;
-
- $referer = null;
- if (isset($_SERVER['HTTP_REFERER'])) {
- $referer = $_SERVER['HTTP_REFERER'];
- }
-
- // Begin constructing the value to be logged / "returned".
- $retval['path'] = $request->getPathInfo();
- $retval['query'] = $request->getQueryString();
- $retval['referer'] = $referer;
- $retval['elapsed'] = $elapsed;
- $retval['post'] = $post;
- $retval['data'] = array(
- 'host' => $host,
- 'port' => $port,
- 'method' => $method,
- 'username' => $authInfo['username'],
- 'ip' => $authInfo['ip'],
- 'token' => $authInfo['token'],
- 'timestamp' => date("Y-m-d H:i:s", $_SERVER['REQUEST_TIME'])
- );
-
- $logger->info('', $retval);
-
- }, Application::EARLY_EVENT);
-
- // SETUP: an after middleware that detects the query debug mode and, if true, retrieves
- // and returns the collected sql queries / params.
- $app->after(function (Request $request, Response $response, Application $app) {
- $origin = $request->headers->get('Origin');
- if ($origin !== null) {
- try {
- $corsDomains = \xd_utilities\getConfiguration('cors', 'domains');
- if (!empty($corsDomains)){
- $allowedCorsDomains = explode(',', $corsDomains);
- if (in_array($origin, $allowedCorsDomains)) {
- // If these headers change similar updates will need to be made to the `error` section below
- $response->headers->set('Access-Control-Allow-Origin', $origin);
- $response->headers->set('Access-Control-Allow-Headers', 'x-requested-with, content-type');
- $response->headers->set('Access-Control-Allow-Credentials', 'true');
- $response->headers->set('Vary', 'Origin');
- }
- }
- } catch (\Exception $e) {
- // this catches if the section or config item does not exist
- // in that case we just carry on
- }
- }
- if (PDODB::debugging()) {
- $debugInfo = PDODB::debugInfo();
-
- $contentType = $response->headers->get('content-type', null);
- if ('application/json' === strtolower($contentType)) {
- $content = $response->getContent();
- $jsonContent = json_decode($content);
-
- if (is_array($jsonContent)) {
- foreach ($jsonContent as $entry) {
- if (is_object($entry)) {
- $entry->debug = $debugInfo;
- break;
- }
- }
- } elseif (is_object($jsonContent)) {
- $jsonContent->debug = $debugInfo;
- }
-
-
- $response->setContent(json_encode($jsonContent));
- }
- }
- });
-
- // MOUNT: our Controllers ( note: this calls the BaseControllerProvider::connect method )
- // which calls each of the abstract methods in turn.
- $versionedPathMountPoint = "/{" . self::API_SYMBOL . "}";
- $unversionedPathMountPoint = '';
-
- // Retrieve the rest end point configuration
- $restControllers = XdmodConfiguration::assocArrayFactory('rest.json', CONFIG_DIR);
-
- foreach ($restControllers as $key => $config) {
- if (!array_key_exists('prefix', $config) || !array_key_exists('controller', $config)) {
- throw new \Exception("Required REST endpoint information (prefix or controller) missing for $key.");
- }
-
- $prefix = $config['prefix'];
- $ControllerClass = $config['controller'];
- $controller = new $ControllerClass(
- array(
- 'prefix' => $prefix
- )
- );
-
- $app->mount($versionedPathMountPoint, $controller);
- $app->mount($unversionedPathMountPoint, $controller);
- }
-
- // SETUP: error handler
- $app->error(function (\Exception $e, Request $request, $code) {
- if($code == 405 && strtoupper($_SERVER['REQUEST_METHOD']) === 'OPTIONS' && array_key_exists('HTTP_ORIGIN', $_SERVER)){
- try {
- $corsDomains = \xd_utilities\getConfiguration('cors', 'domains');
- } catch (\Exception $cors) {
- $corsDomains = null;
- }
- if (!empty($corsDomains)){
- $allowedCorsDomains = explode(',', $corsDomains);
- $origin = $_SERVER['HTTP_ORIGIN'];
- if (in_array($origin, $allowedCorsDomains)) {
- // if these headers change we will need to update the `after` above
- return new Response(
- '',
- 204, /* in `$app->error` this value is ignored use header `X-Status-Code` to force a different status code */
- [
- 'X-Status-Code' => 204,
- 'Vary' => 'Origin',
- 'Access-Control-Allow-Origin' => $origin,
- 'Access-Control-Allow-Headers' => 'x-requested-with, content-type',
- 'Access-Control-Allow-Credentials' => 'true'
- ]
- );
- }
- }
- }
- $exceptionOutput = \handle_uncaught_exception($e);
- return new Response(
- $exceptionOutput['content'],
- $exceptionOutput['httpCode'],
- $exceptionOutput['headers']
- );
- });
-
- // Set the application instance as the global instance and return it.
- self::$instance = $app;
- return $app;
- } // getInstance()
-}
diff --git a/classes/UserStorage.php b/classes/UserStorage.php
index ae5e2cb0bd..95a4cdd914 100644
--- a/classes/UserStorage.php
+++ b/classes/UserStorage.php
@@ -79,7 +79,7 @@ public function insert(&$data)
private function _getnewid(&$storage)
{
- $newid = ($storage['maxid'] + 1) % PHP_INT_MAX;
+ $newid = ((int)($storage['maxid'] + 1)) % PHP_INT_MAX;
while(isset($storage['data'][$newid])) {
$newid = ($newid + 1) % PHP_INT_MAX;
}
diff --git a/classes/XDChartPool.php b/classes/XDChartPool.php
index e96b3ff9bb..0d5ac8a961 100644
--- a/classes/XDChartPool.php
+++ b/classes/XDChartPool.php
@@ -9,50 +9,50 @@
* of visiting the portal.
*
*/
-
+
class XDChartPool {
private $_user = null;
-
+
private $_user_id = null;
private $_person_id = null;
private $_user_full_name = null;
private $_user_email = null;
private $_user_token = null;
-
+
private $_table_name = 'ChartPool';
-
+
private $_pdo = null;
-
+
// --------------------------------------------
-
+
public function __construct($user) {
-
+
$this->_pdo = DB::factory('database');
-
+
$this->_user = $user;
$this->_user_id = $user->getUserID();
$this->_person_id = $user->getPersonID();
$this->_user_full_name = $user->getFormalName();
$this->_user_token = $user->getToken();
-
- $this->_user_email = (xd_utilities\getConfiguration('general', 'debug_mode') == 'on') ?
- xd_utilities\getConfiguration('general', 'debug_recipient') :
- $user->getEmailAddress();
-
+
+ $this->_user_email = (xd_utilities\getConfiguration('general', 'debug_mode') == 'on') ?
+ xd_utilities\getConfiguration('general', 'debug_recipient') :
+ $user->getEmailAddress();
+
}//__construct
// --------------------------------------------
-
+
public function emptyCache() {
-
+
$this->_pdo->execute(
'UPDATE ChartPool SET image_data=NULL WHERE user_id=:user_id',
array(
'user_id' => $this->_user_id
)
);
-
+
}//emptyCache
public function addChartToQueue($chartIdentifier, $chartTitle, $chartDrillDetails, $chartDateDesc) {
@@ -64,40 +64,40 @@ public function addChartToQueue($chartIdentifier, $chartTitle, $chartDrillDetail
if (empty($chartTitle)){
throw new Exception("A chart title must be specified");
}
-
+
// Since we are now letting the user have full control over the titles of charts (courtesy of the Metric Explorer),
// we need to make sure the title is escaped properly such that the thumbnails in the Report Generator don't break.
-
+
$chartIdentifier = str_replace("title=".$chartTitle, "title=".urlencode($chartTitle), $chartIdentifier);
-
+
if ($this->chartExistsInQueue($chartIdentifier)){
throw new Exception("chart_exists_in_queue");
}
-
+
$insertQuery = "INSERT INTO {$this->_table_name} (user_id, chart_id, chart_title, chart_drill_details, chart_date_description, type) VALUES " .
"(:user_id, :chart_id, :chart_title, :chart_drill_details, :chart_date_description, 'image')";
-
+
$this->_pdo->execute(
- $insertQuery,
+ $insertQuery,
array(
'user_id' => $this->_user_id,
'chart_id' => $chartIdentifier,
- 'chart_title'=> $chartTitle,
+ 'chart_title'=> $chartTitle,
'chart_date_description' => $chartDateDesc,
'chart_drill_details'=> $chartDrillDetails
)
);
-
+
}//addChartToQueue
-
+
// --------------------------------------------
-
+
public function removeChartFromQueue($chartIdentifier) {
-
+
if (empty($chartIdentifier)){
throw new Exception("A chart identifier must be specified");
}
-
+
if (!$this->chartExistsInQueue($chartIdentifier)){
throw new Exception("chart_does_not_exist_in_queue");
}
@@ -105,21 +105,26 @@ public function removeChartFromQueue($chartIdentifier) {
$this->_pdo->execute("DELETE FROM {$this->_table_name} WHERE user_id = :user_id AND chart_id = :chart_id", array('user_id' => $this->_user_id, 'chart_id' => $chartIdentifier));
}//removeChartFromQueue
-
+
// --------------------------------------------
-
+
public function chartExistsInQueue($chartIdentifier, $chartTitle = '') {
-
+
if (empty($chartIdentifier)){
//throw new Exception("A chart identifier must be specified");
}
+ // This has been added due to urlencode no longer supporting nulls ( PHP 8.2 )
+ if (is_null($chartTitle)) {
+ $chartTitle = '';
+ }
+
$chartIdentifier = str_replace("title=".$chartTitle, "title=".urlencode($chartTitle), $chartIdentifier);
-
+
$results = $this->_pdo->query("SELECT * FROM {$this->_table_name} WHERE user_id = :user_id AND chart_id = :chart_id", array('user_id' => $this->_user_id, 'chart_id' => $chartIdentifier));
-
+
return (count($results) != 0);
-
+
}//chartExistsInQueue
-
+
}//XDChartPool
diff --git a/classes/XDReportManager.php b/classes/XDReportManager.php
index aa037fa91c..076863c9d9 100644
--- a/classes/XDReportManager.php
+++ b/classes/XDReportManager.php
@@ -1140,7 +1140,8 @@ private function ripTransform(&$arr, $item)
public function fetchChartBlob(
$type,
$insertion_rank,
- $chart_id_cache_file = null
+ $chart_id_cache_file = null,
+ $logger = null
) {
$pdo = DB::factory('database');
$trace = "";
@@ -1153,7 +1154,7 @@ public function fetchChartBlob(
);
if (file_exists($temp_file)) {
- print file_get_contents($temp_file);
+ return file_get_contents($temp_file);
}
else {
if (
@@ -1206,10 +1207,8 @@ public function fetchChartBlob(
file_put_contents($temp_file, $blob);
- print $blob;
+ return $blob;
}
-
- exit;
break;
case 'chart_pool':
$this->ripTransform($insertion_rank, 'did');
@@ -1234,7 +1233,7 @@ public function fetchChartBlob(
$temp_file = $this->generateCachedFilename($insertion_rank);
if (file_exists($temp_file)) {
- print file_get_contents($temp_file);
+ return file_get_contents($temp_file);
}
else {
$blob = $this->generateChartBlob(
@@ -1244,11 +1243,8 @@ public function fetchChartBlob(
$insertion_rank['end_date']
);
file_put_contents($temp_file, $blob);
- print $blob;
+ return $blob;
}
-
- exit;
- break;
case 'report':
$iq = $pdo->query(
"
@@ -1437,10 +1433,13 @@ public function generateChartBlob(
$type,
$insertion_rank,
$start_date,
- $end_date
+ $end_date,
+ $logger = null
) {
$pdo = DB::factory('database');
-
+ if (!is_null($logger)) {
+ $logger->debug("Generating Chart Blob - Type: $type");
+ }
switch ($type) {
case 'volatile':
$temp_file = $this->generateCachedFilename(
@@ -1451,6 +1450,9 @@ public function generateChartBlob(
$temp_file = str_replace('.png', '.xrc', $temp_file);
$iq = array();
+ if (!is_null($logger)) {
+ $logger->debug("Checking if Volatile File Exists; $temp_file");
+ }
if (file_exists($temp_file) == true) {
$chart_id_config = file($temp_file);
@@ -1465,7 +1467,6 @@ public function generateChartBlob(
);
}
break;
-
case 'chart_pool':
$iq = $pdo->query(
"
@@ -1499,7 +1500,7 @@ public function generateChartBlob(
}
if (count($iq) == 0) {
- throw new \Exception("Unable to target chart entry");
+ throw new \Exception("Unable to target chart entry $type {$this->_user_id} $insertion_rank ". (new \Exception())->getTraceAsString());
}
$chart_id = $iq[0]['chart_id'];
diff --git a/classes/XDSessionManager.php b/classes/XDSessionManager.php
index 1f6f537b6d..c32c441839 100644
--- a/classes/XDSessionManager.php
+++ b/classes/XDSessionManager.php
@@ -88,10 +88,10 @@ public static function recordLogin($user)
':last_active' => $init_time,
));
- $_SESSION['xdInit'] = $init_time;
- $_SESSION['xdUser'] = $user_id;
-
- $_SESSION['session_token'] = $session_token;
+ $session = \xd_security\SessionSingleton::getSession();
+ $session->set('xdInit', $init_time);
+ $session->set('xdUser', $user_agent);
+ $session->set('session_token', $session_token);
return $session_token;
}
@@ -107,12 +107,13 @@ public static function logoutUser($token = "")
\xd_security\start_session();
}
+ $session = \xd_security\SessionSingleton::getSession();
// If a session is still active and a token has been specified,
// attempt to record the logout in the SessionManager table
// (provided the supplied token is still 'valid' and a
// corresponding record in SessionManager can be found)
- if (isset($_SESSION['xdInit']) && !empty($token)) {
+ if ($session->get('xdInit') !== null && !empty($token)) {
$session_id = session_id();
$ip_address = $_SERVER['REMOTE_ADDR'];
@@ -129,10 +130,11 @@ public static function logoutUser($token = "")
':session_token' => $token,
':session_id' => $session_id,
':ip_address' => $ip_address,
- ':init_time' => $_SESSION['xdInit'],
+ ':init_time' => $session->get('xdInit'),
));
}
+ $session->invalidate();
// Drop the session so that any REST calls requiring
// authentication (via tokens) trip the first Exception as the
// result of invoking resolveUserFromToken($token)
@@ -142,10 +144,10 @@ public static function logoutUser($token = "")
$auth = new Authentication\SAML\XDSamlAuthentication();
$auth->logout();
} catch (InvalidArgumentException $ex) {
- // This will catch when apache or nginx have been set up
- // to to have an alternate saml configuration directory
- // that does not exist, so we ignore it as saml isnt set
- // up and we dont have to do anything with it
+ // This will catch when apache or nginx have been set up
+ // to to have an alternate saml configuration directory
+ // that does not exist, so we ignore it as saml isnt set
+ // up and we dont have to do anything with it
}
}
diff --git a/classes/XDUser.php b/classes/XDUser.php
index f72135e252..561212d4cc 100644
--- a/classes/XDUser.php
+++ b/classes/XDUser.php
@@ -7,13 +7,19 @@
use Models\Services\Acls;
use Models\Services\Organizations;
use DataWarehouse\Query\Exceptions\AccessDeniedException;
+use xd_security\SessionSingleton;
+
+use Symfony\Component\PasswordHasher\PasswordHasherInterface;
+use Symfony\Component\Security\Core\User\LegacyPasswordAuthenticatedUserInterface;
+use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
/**
* XDMoD Portal User
*
* @Class XDUser
*/
-class XDUser extends CCR\Loggable implements JsonSerializable
+class XDUser extends CCR\Loggable implements JsonSerializable, UserInterface, PasswordAuthenticatedUserInterface, LegacyPasswordAuthenticatedUserInterface
{
private $_pdo; // PDO Handle (set in __construct)
@@ -166,6 +172,11 @@ class XDUser extends CCR\Loggable implements JsonSerializable
* @var boolean
*/
private $sticky;
+
+ /**
+ * @var PasswordHasherInterface
+ */
+ private $hasher;
// ---------------------------
/*
@@ -194,9 +205,11 @@ function __construct(
$organization_id = null,
$person_id = null,
array $ssoAttrs = array(),
- $sticky = false
- ) {
-
+ $sticky = false,
+ $hasher = null
+ )
+ {
+ $this->hasher = $hasher;
$this->_pdo = DB::factory('database');
$userCheck = $this->_pdo->query("SELECT id FROM Users WHERE username=:username", array(
@@ -267,7 +280,7 @@ function __construct(
'db' => false,
'mail' => false,
'console' => false,
- 'file'=> LOG_DIR . "/" . xd_utilities\getConfiguration('general', 'exceptions_logfile')
+ 'file' => LOG_DIR . "/" . xd_utilities\getConfiguration('general', 'exceptions_logfile')
)
)
);
@@ -622,7 +635,6 @@ public static function getUserByID($uid, &$targetInstance = NULL)
// the results will be the same.
$user->_roles = $user->getAcls(true);
-
return $user;
}//getUserByID
@@ -643,7 +655,7 @@ public function setPassword($raw_password)
throw new AccessDeniedException("Permission Denied. Only local accounts may have their passwords modified.");
}
- return $this->_password = $raw_password;
+ $this->_password = $this->hash($raw_password);
}//setPassword
// ---------------------------
@@ -876,10 +888,18 @@ public function getInsertQuery($updateToken = false, $includePassword = false)
*/
public function arrayToString($array = array())
{
+ $values = array_reduce(
+ array_values($array),
+ function ($carry, $item) {
+ $carry[] = var_export($item, true);
+ return $carry;
+ },
+ []
+ );
$result = 'Keys [ ';
$result .= implode(', ', array_keys($array)) . ']';
$result .= 'Values [ ';
- $result .= implode(', ', array_values($array)) . ']';
+ $result .= implode(', ', $values) . ']';
return $result;
}
@@ -955,15 +975,18 @@ public function saveUser()
}
$update_data['username'] = $this->_username;
- $includePassword = strlen($this->_password) <= CHARLIM_PASSWORD;
+ $includePassword = empty($this->_password) || strlen($this->_password) <= CHARLIM_PASSWORD;
if ($includePassword) {
if ($this->_password == "" || is_null($this->_password)) {
$update_data['password'] = NULL;
+ } else if (!$forUpdate) {
+ $this->_password = $this->hash($this->_password);
+ $update_data['password'] = $this->_password;
} else {
- $this->_password = password_hash($this->_password, PASSWORD_DEFAULT);
$update_data['password'] = $this->_password;
}
}
+
$update_data['email_address'] = ($this->_email);
$update_data['first_name'] = ($this->_firstName);
$update_data['middle_name'] = ($this->_middleName);
@@ -1202,15 +1225,14 @@ public function removeUser()
// ---------------------------
- /*
+ /**
*
* @function getUserType;
*
* @return int (maps to one of the TYPE_* class constants at the top of this file)
*
*/
-
- public function getUserType()
+ public function getUserType(): int
{
return $this->_user_type;
}
@@ -1505,7 +1527,7 @@ public function enumAllAvailableRoles()
"A PDOException was thrown in 'XDUser::enumAllAvailableRoles'",
array(
'exception' => $e,
- 'sql'=> $query
+ 'sql' => $query
)
);
@@ -1780,7 +1802,7 @@ public function getActiveOrganization()
*
*/
- public function getRoles($flag = 'informal')
+ public function getRoles($flag = 'informal'): array
{
if ($flag == 'informal') {
@@ -1816,7 +1838,7 @@ public function getRoles($flag = 'informal')
return $roles;
}
-
+ return [];
}//getRoles
// ---------------------------
@@ -1895,7 +1917,7 @@ function getAllRoles($includePublicRole = false)
public function getUserID()
{
- return (empty($this->_id)) ? '0' : $this->_id;
+ return (empty($this->_id)) ? 0 : (int)$this->_id;
}
/*
@@ -1913,13 +1935,14 @@ public function getPersonID($default = FALSE)
{
// NOTE: RESTful services do not operate on the concept of a session, so we need to check for $_SESSION[..] entities using isset
-
- if (isset($_SESSION['xdUser']) && ($_SESSION['xdUser'] == $this->_id) && ($default == FALSE)) {
+ $session = \xd_security\SessionSingleton::getSession();
+ $xdUserId = $session->get('xdUser');
+ if (isset($xdUserId) && ($xdUserId === $this->_id) && ($default == FALSE)) {
// The user object pertains to the user logged in..
-
- if (isset($_SESSION['assumed_person_id'])) {
- return $_SESSION['assumed_person_id'];
+ $assumedPersonId = $session->get('assumed_person_id');
+ if (isset($assumedPersonId)) {
+ return $assumedPersonId;
}
}
@@ -1993,7 +2016,7 @@ public function getUpdateTimestamp()
* (determines the formal description of a role based on its abbreviation)
*
* @param string $role_abbrev the role abbreviation to use when looking up the formal name.
- * @param bool $pubDisplay Determines whether or not to return the public roles `display`
+ * @param bool $pubDisplay Determines whether or not to return the public roles `display`
* property or it's `name` property. We default to true ( i.e. `display` ) as that is the
* behavior that currently exists.
*
@@ -2127,7 +2150,7 @@ public function setAcls(array $acls)
*/
public function addAcl(Acl $acl, $overwrite = false)
{
- if ( ( !array_key_exists($acl->getName(), $this->_acls) && !$overwrite ) ||
+ if ((!array_key_exists($acl->getName(), $this->_acls) && !$overwrite) ||
$overwrite === true
) {
$this->_acls[$acl->getName()] = $acl;
@@ -2233,7 +2256,7 @@ public static function getUserByUserName($username)
* have the data XDMoD is providing to them filtered by a particular
* organization.
*
- * @param string $aclName the name of the acl that should have a
+ * @param string $aclName the name of the acl that should have a
* relationship created for it with the
* provided organization.
* @param string $organizationId the name of the organization
@@ -2254,7 +2277,7 @@ public function addAclOrganization($aclName, $organizationId)
$acl = Acls::getAclByName($aclName);
- if ( null == $acl) {
+ if (null == $acl) {
throw new Exception("Unable to retrieve acl for: $aclName");
}
@@ -2267,7 +2290,7 @@ public function addAclOrganization($aclName, $organizationId)
$this->_pdo->execute($cleanUserAclGroupByParameters, array(
':user_id' => $this->_id,
- ':acl_id' => $acl->getAclId()
+ ':acl_id' => $acl->getAclId()
));
$populateUserAclGroupByParameters = <<_pdo->execute($populateUserAclGroupByParameters, array(
':user_id' => $this->_id,
- ':acl_id' => $acl->getAclId(),
- ':value' => $organizationId
+ ':acl_id' => $acl->getAclId(),
+ ':value' => $organizationId
));
} // addAclOrganization
- /**
+ /**
* Specify data which should be serialized to JSON
* @link http://php.net/manual/en/jsonserializable.jsonserialize.php
* @return mixed data which can be serialized by json_encode,
* which is a value of any type other than a resource.
* @since 5.4.0
*/
- public function jsonSerialize()
+ public function jsonSerialize(): mixed
{
$ignored = array(
- '_pdo', '_primary_role', '_publicUser', '_timeCreated','_timeUpdated',
+ '_pdo', '_primary_role', '_publicUser', '_timeCreated', '_timeUpdated',
'_timePasswordUpdated', '_token', 'logger'
);
$reflection = new ReflectionClass($this);
$results = array();
$properties = $reflection->getProperties();
- foreach($properties as $property) {
+ foreach ($properties as $property) {
$name = $property->getName();
if (!in_array($name, $ignored)) {
$property->setAccessible(true);
@@ -2353,7 +2376,7 @@ public function setOrganizationID($organizationID)
* authenticating / authorizing a password reset. If an $expiration value is provided, that will
* be used instead of generating one via the 'email_token_expiration' portal settings value.
*
- * @param int|null $expiration the date after which this rid is considered invalid.
+ * @param int|null $expiration the date after which this rid is considered invalid.
* @return string in the form "userId|expiration|hash"
* @throws Exception If there are any missing configuration properties that this function relies
* on. These include: email_token_expiration and application_secret.
@@ -2427,7 +2450,7 @@ public static function validateRID($rid)
} catch (Exception $e) {
// If there was an exception then it was because we couldn't find a user by that username
// so log the error and return the default information.
- $expirationDate = date('Y-m-d H:i:s', $expiration );
+ $expirationDate = date('Y-m-d H:i:s', $expiration);
$log->debug("Error occurred while validating RID for User: $userId, Expiration: $expirationDate");
}
@@ -2439,7 +2462,8 @@ public static function validateRID($rid)
*
* @throws Exception if there is a problem executing any of the required post logged in steps.
*/
- public function postLogin() {
+ public function postLogin()
+ {
if (!$this->isSticky()) {
$this->updatePerson();
$this->synchronizeOrganization();
@@ -2469,12 +2493,12 @@ public function synchronizeOrganization()
// If we have ssoAttrs available and this user's person's organization is 'Unknown' ( -1 ).
// Then go ahead and lookup the organization value from sso.
- if ($expectedOrganization == -1 && isset($this->ssoAttrs['organization']) && count($this->ssoAttrs['organization']) > 0) {
- $expectedOrganization = Organizations::getIdByName($this->ssoAttrs['organization'][0]);
+ if ($expectedOrganization == -1 && count($this->ssoAttrs) > 0) {
+ $expectedOrganization = Organizations::getIdByName($this->getSSOAttribute('organization'));
}
// If these don't match then the user's organization has been updated. Steps need to be taken.
- if ($actualOrganization !== $expectedOrganization) {
+ if ($actualOrganization != $expectedOrganization) {
$originalAcls = $this->getAcls(true);
// if the user is currently assigned an acl that interacts with XDMoD's centers ( i.e.
@@ -2493,7 +2517,7 @@ public function synchronizeOrganization()
$this->setAcls(array());
// Update the user w/ their new set of acls.
- foreach($otherAcls as $aclName) {
+ foreach ($otherAcls as $aclName) {
$acl = Acls::getAclByName($aclName);
$this->addAcl($acl);
}
@@ -2541,7 +2565,6 @@ public function synchronizeOrganization()
)
);
}
-
// Update / save the user with their new organization
$this->setOrganizationId($expectedOrganization);
$this->saveUser();
@@ -2560,14 +2583,15 @@ public function updatePerson()
$hasSSO = count($this->ssoAttrs) > 0;
if ($currentPersonId == PERSON_ID_UNASSOCIATED && $hasSSO) {
- $username = $this->ssoAttrs['username'][0];
- $systemUserName = isset($this->ssoAttrs['system_username']) ? $this->ssoAttrs['system_username'][0] : $username;
+ $username = $this->getSSOAttribute('username');
+ $systemUserName = $this->getSSOAttribute('system_username', $username);
$expectedPersonId = \DataWarehouse::getPersonIdFromPII($systemUserName, null);
// As long as the identified person is not Unknown and it is different than our current Person Id
// go ahead and update this user with the new person & that person's organization.
if ($expectedPersonId != PERSON_ID_UNASSOCIATED && $currentPersonId != $expectedPersonId) {
$organizationId = Organizations::getOrganizationIdForPerson($expectedPersonId);
+
$this->setPersonID($expectedPersonId);
$this->setOrganizationID($organizationId);
@@ -2668,4 +2692,114 @@ function ($value) use ($handle) {
return $db->query($query, $params);
} // public function getResources($resourceNames = array())
+
+ public function getPassword(): ?string
+ {
+ return $this->_password;
+ }
+
+
+
+ public function getSalt(): ?string
+ {
+ return null;
+ }
+
+ public function eraseCredentials()
+ {
+ // This function is required for Symfony's UserInterface but we don't actually support erasing a users credentials.
+ }
+
+ public function getUserIdentifier(): string
+ {
+ return $this->_username;
+ }
+
+ public function __serialize(): array
+ {
+ return [
+ $this->_id,
+ $this->_username,
+ $this->_password,
+ $this->_email,
+ $this->_firstName,
+ $this->_middleName,
+ $this->_lastName,
+ $this->_timeCreated,
+ $this->_timeUpdated,
+ $this->_timePasswordUpdated,
+ $this->_roles,
+ $this->_field_of_science,
+ $this->_organizationID,
+ $this->_personID,
+ $this->_user_type,
+ $this->_token
+ ];
+ }
+
+ public function __unserialize(array $data): void
+ {
+ [
+ $this->_id,
+ $this->_username,
+ $this->_password,
+ $this->_email,
+ $this->_firstName,
+ $this->_middleName,
+ $this->_lastName,
+ $this->_timeCreated,
+ $this->_timeUpdated,
+ $this->_timePasswordUpdated,
+ $this->_roles,
+ $this->_field_of_science,
+ $this->_organizationID,
+ $this->_personID,
+ $this->_user_type,
+ $this->_token
+ ] = $data;
+ }
+
+ private function hash($password)
+ {
+ if (!isset($this->hasher)) {
+ return password_hash($password, PASSWORD_DEFAULT);
+ } else {
+ return $this->hasher->hash($password);
+ }
+ }
+
+ /**
+ * Get an SSO Attribute for this user. Handles when the sso attributes are in the form:
+ * ```
+ * [
+ * "attributeName" => "attributeValue"
+ * ]
+ * ```
+ *
+ * and when they're in the form:
+ * ```
+ * [
+ * "attributeName" => [
+ * "attributeValue"
+ * ]
+ * ]
+ * ```
+ * The latter is the original format of SSO attributes, while the former is the current.
+ *
+ * @param string $attributeName the name of the SSO attribute to return.
+ * @return mixed|null null is returned if the $attributeName does not exist within this users sso attributes, else
+ * the value of the sso attribute identified by $attributeName is returned.
+ */
+ private function getSSOAttribute($attributeName, $default = null)
+ {
+ $result = null;
+ if (isset($this->ssoAttrs[$attributeName])) {
+ if (!is_array($this->ssoAttrs[$attributeName])) {
+ $result = $this->ssoAttrs[$attributeName];
+ } else {
+ $result = $this->ssoAttrs[$attributeName][0];
+ }
+ }
+ return isset($result) ? $result : $default;
+ }
}//XDUser
diff --git a/classes/Xdmod/NodeSet.php b/classes/Xdmod/NodeSet.php
index 7eb22141f1..dcee6d56fc 100644
--- a/classes/Xdmod/NodeSet.php
+++ b/classes/Xdmod/NodeSet.php
@@ -97,7 +97,7 @@ function ($v) use ($node) {
/**
* @see Iterator
*/
- public function current()
+ public function current(): mixed
{
if (!$this->valid()) {
throw new OutOfBoundsException();
@@ -109,7 +109,7 @@ public function current()
/**
* @see Iterator
*/
- public function key()
+ public function key(): mixed
{
return $this->position;
}
@@ -117,7 +117,7 @@ public function key()
/**
* @see Iterator
*/
- public function next()
+ public function next(): void
{
++$this->position;
}
@@ -125,7 +125,7 @@ public function next()
/**
* @see Iterator
*/
- public function rewind()
+ public function rewind(): void
{
$this->position = 0;
}
@@ -133,7 +133,7 @@ public function rewind()
/**
* @see Iterator
*/
- public function valid()
+ public function valid(): bool
{
return isset($this->nodes[$this->position]);
}
diff --git a/composer.json b/composer.json
index 932d2e8a89..9a99c0cbd2 100644
--- a/composer.json
+++ b/composer.json
@@ -1,43 +1,62 @@
{
- "extra": {
- "COMMENT": "If kassner/log-parser is updated to version >2.1.1, then the call to web_parser->addPattern in classes/ETL/DataEndpoint/WebServerLogFile.php (added in https://github.com/ubccr/xdmod/pull/1816) can be removed along with this 'extra' section."
- },
+ "type": "project",
+ "license": "lgpl",
+ "minimum-stability": "stable",
+ "prefer-stable": true,
"require": {
- "php": "^7.4",
- "egulias/email-validator": "^1.2",
- "google/recaptcha": "~1.1",
- "greenlion/php-sql-parser": "~4.2",
- "ircmaxell/password-compat": "~1",
- "justinrainbow/json-schema": "~5.2",
- "jquery/jquery-min-file":"^3.7.1",
+ "php": "^8.2",
+ "doctrine/annotations": "^2.0",
+ "doctrine/dbal": "^3",
+ "doctrine/doctrine-bundle": "^2.14",
+ "doctrine/doctrine-migrations-bundle": "^3.4",
+ "doctrine/orm": "^3.0",
+ "egulias/email-validator": "^4",
+ "firebase/php-jwt": "^6.10",
+ "geoip2/geoip2": "^2.12",
+ "google/recaptcha": "^1.2",
+ "greenlion/php-sql-parser": "^4.7",
+ "ircmaxell/password-compat": "^1.0",
+ "jquery/jquery-min-file": "^3.7.1",
+ "justinrainbow/json-schema": "^6.3.1",
+ "kassner/log-parser": "^2.1",
"moment/moment-min-file": "^2.13.0",
"moment/moment-timezone-min-file": "^0.5.4",
- "paragonie/random_compat": "~2.0",
- "phpmailer/phpmailer": "~6.9",
+ "mongodb/mongodb": "1.18.0",
+ "monolog/monolog": "^3",
+ "phpdocumentor/reflection-docblock": "^5.6",
+ "phpmailer/phpmailer": "^6.9",
+ "phpoffice/phpword": "^1.3.0",
+ "phpstan/phpdoc-parser": "^2.1",
+ "plotly/plotly": "^2.29.1",
"robrichards/xmlseclibs": "~3.0",
"sencha/extjs-gpl": "3.4.*",
- "silex/silex": "v2.3.0",
- "simplesamlphp/simplesamlphp": "^1.16",
- "symfony/polyfill-php56": "~1.11",
- "symfony/process": "~2.0",
+ "simplesamlphp/simplesamlphp": "*",
+ "swaggest/json-schema": "^0.12.41",
+ "symfony/asset": "6.4.*",
+ "symfony/console": "6.4.*",
+ "symfony/dotenv": "6.4.*",
+ "symfony/flex": "^1.17|^2",
+ "symfony/framework-bundle": "6.4.*",
+ "symfony/monolog-bundle": "^3.8",
+ "symfony/property-access": "6.4.*",
+ "symfony/property-info": "6.4.*",
+ "symfony/proxy-manager-bridge": "6.4.*",
+ "symfony/runtime": "6.4.*",
+ "symfony/security-bundle": "6.4.*",
+ "symfony/serializer": "6.4.*",
+ "symfony/twig-bundle": "6.4.*",
+ "symfony/yaml": "6.4.*",
"taq/pdooci": "^1.0",
"tildeio/rsvpjs-min-file": "^3.0.18",
- "ubccr/simplesamlphp-module-authglobus": "^1.3",
- "ubccr/simplesamlphp-module-authoidcoauth2": "^1.1",
- "phpoffice/phpword": "^1.2.0",
- "monolog/monolog": "^1.25",
- "plotly/plotly": "^2.29.1",
- "kassner/log-parser": "~1.5",
- "geoip2/geoip2": "~2.0",
- "ua-parser/uap-php": "^3.9",
- "mongodb/mongodb": "^1.14",
- "firebase/php-jwt": "^6.10"
+ "ua-parser/uap-php": "^3.9"
},
"require-dev": {
- "phpunit/phpunit": "^9.0",
"ccampbell/chromephp": "^4.1",
- "swaggest/json-schema": "^0.12.41",
- "dms/phpunit-arraysubset-asserts": "^0.5.0"
+ "dms/phpunit-arraysubset-asserts": "^0.4.0",
+ "phpunit/phpunit": "^9.0",
+ "symfony/maker-bundle": "^1.43",
+ "symfony/stopwatch": "6.4.*",
+ "symfony/web-profiler-bundle": "6.4.*"
},
"repositories": [
{
@@ -201,6 +220,10 @@
"external_libraries/{$name}": [
"zendframework/zendframework-minimal"
]
+ },
+ "public-dir": "html",
+ "symfony": {
+ "docker": false
}
},
"config": {
@@ -209,8 +232,16 @@
"secure-http": false,
"allow-plugins": {
"composer/installers": true,
- "simplesamlphp/composer-module-installer": true
- }
+ "composer/package-versions-deprecated": true,
+ "simplesamlphp/composer-module-installer": true,
+ "simplesamlphp/composer-xmlprovider-installer": true,
+ "symfony/flex": true,
+ "symfony/runtime": true
+ },
+ "preferred-install": {
+ "*": "dist"
+ },
+ "sort-packages": true
},
"autoload": {
"files": [
@@ -262,7 +293,28 @@
"Reports\\": "classes/Reports/",
"Rest\\": "classes/Rest/",
"User\\": "classes/User/",
- "Xdmod\\": "classes/Xdmod/"
+ "Xdmod\\": "classes/Xdmod/",
+ "Access\\": "src/"
}
+ },
+ "replace": {
+ "symfony/polyfill-ctype": "*",
+ "symfony/polyfill-iconv": "*",
+ "symfony/polyfill-php72": "*"
+ },
+ "scripts": {
+ "auto-scripts": {
+ "cache:clear": "symfony-cmd",
+ "assets:install %PUBLIC_DIR%": "symfony-cmd"
+ },
+ "post-install-cmd": [
+ "@auto-scripts"
+ ],
+ "post-update-cmd": [
+ "@auto-scripts"
+ ]
+ },
+ "conflict": {
+ "symfony/symfony": "*"
}
}
diff --git a/composer.lock b/composer.lock
index b065b79539..42c0cd2149 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "b1f6a77651cfce3d29c0e5a886429ef7",
+ "content-hash": "3c1bfd67858c59820eaeb68bceab4d71",
"packages": [
{
"name": "composer/ca-bundle",
- "version": "1.5.0",
+ "version": "1.5.7",
"source": {
"type": "git",
"url": "https://github.com/composer/ca-bundle.git",
- "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99"
+ "reference": "d665d22c417056996c59019579f1967dfe5c1e82"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
- "reference": "0c5ccfcfea312b5c5a190a21ac5cef93f74baf99",
+ "url": "https://api.github.com/repos/composer/ca-bundle/zipball/d665d22c417056996c59019579f1967dfe5c1e82",
+ "reference": "d665d22c417056996c59019579f1967dfe5c1e82",
"shasum": ""
},
"require": {
@@ -27,8 +27,8 @@
},
"require-dev": {
"phpstan/phpstan": "^1.10",
- "psr/log": "^1.0",
- "symfony/phpunit-bridge": "^4.2 || ^5",
+ "phpunit/phpunit": "^8 || ^9",
+ "psr/log": "^1.0 || ^2.0 || ^3.0",
"symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0"
},
"type": "library",
@@ -64,7 +64,7 @@
"support": {
"irc": "irc://irc.freenode.org/composer",
"issues": "https://github.com/composer/ca-bundle/issues",
- "source": "https://github.com/composer/ca-bundle/tree/1.5.0"
+ "source": "https://github.com/composer/ca-bundle/tree/1.5.7"
},
"funding": [
{
@@ -80,7 +80,7 @@
"type": "tidelift"
}
],
- "time": "2024-03-15T14:00:32+00:00"
+ "time": "2025-05-26T15:08:54+00:00"
},
{
"name": "composer/installers",
@@ -234,32 +234,40 @@
"time": "2021-09-13T08:19:44+00:00"
},
{
- "name": "doctrine/lexer",
- "version": "1.2.3",
+ "name": "doctrine/annotations",
+ "version": "2.0.2",
"source": {
"type": "git",
- "url": "https://github.com/doctrine/lexer.git",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7",
+ "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "doctrine/lexer": "^2 || ^3",
+ "ext-tokenizer": "*",
+ "php": "^7.2 || ^8.0",
+ "psr/cache": "^1 || ^2 || ^3"
},
"require-dev": {
- "doctrine/coding-standard": "^9.0",
- "phpstan/phpstan": "^1.3",
+ "doctrine/cache": "^2.0",
+ "doctrine/coding-standard": "^10",
+ "phpstan/phpstan": "^1.10.28",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.11"
+ "symfony/cache": "^5.4 || ^6.4 || ^7",
+ "vimeo/psalm": "^4.30 || ^5.14"
+ },
+ "suggest": {
+ "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations"
},
"type": "library",
"autoload": {
"psr-4": {
- "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -275,66 +283,62 @@
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
}
],
- "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
- "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "description": "Docblock Annotations Parser",
+ "homepage": "https://www.doctrine-project.org/projects/annotations.html",
"keywords": [
"annotations",
"docblock",
- "lexer",
- "parser",
- "php"
+ "parser"
],
"support": {
- "issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/1.2.3"
+ "issues": "https://github.com/doctrine/annotations/issues",
+ "source": "https://github.com/doctrine/annotations/tree/2.0.2"
},
- "funding": [
- {
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
- "type": "tidelift"
- }
- ],
- "time": "2022-02-28T11:07:21+00:00"
+ "time": "2024-09-05T10:17:24+00:00"
},
{
- "name": "egulias/email-validator",
- "version": "1.2.17",
+ "name": "doctrine/collections",
+ "version": "2.3.0",
"source": {
"type": "git",
- "url": "https://github.com/egulias/EmailValidator.git",
- "reference": "19674b35a0a3456be1b96e137098d31ed386fb61"
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/19674b35a0a3456be1b96e137098d31ed386fb61",
- "reference": "19674b35a0a3456be1b96e137098d31ed386fb61",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/2eb07e5953eed811ce1b309a7478a3b236f2273d",
+ "reference": "2eb07e5953eed811ce1b309a7478a3b236f2273d",
"shasum": ""
},
"require": {
- "doctrine/lexer": "^1.0.1",
- "php": ">=5.3.3"
+ "doctrine/deprecations": "^1",
+ "php": "^8.1",
+ "symfony/polyfill-php84": "^1.30"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.36|^7.5.15",
- "satooshi/php-coveralls": "^1.0.1"
+ "doctrine/coding-standard": "^12",
+ "ext-json": "*",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.0",
+ "phpunit/phpunit": "^10.5"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Egulias\\": "src/"
+ "psr-4": {
+ "Doctrine\\Common\\Collections\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -343,179 +347,286 @@
],
"authors": [
{
- "name": "Eduardo Gulias Davis"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
}
],
- "description": "A library for validating emails",
- "homepage": "https://github.com/egulias/EmailValidator",
+ "description": "PHP Doctrine Collections library that adds additional functionality on top of PHP arrays.",
+ "homepage": "https://www.doctrine-project.org/projects/collections.html",
"keywords": [
- "email",
- "emailvalidation",
- "emailvalidator",
- "validation",
- "validator"
+ "array",
+ "collections",
+ "iterators",
+ "php"
],
"support": {
- "issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/1.2"
+ "issues": "https://github.com/doctrine/collections/issues",
+ "source": "https://github.com/doctrine/collections/tree/2.3.0"
},
- "time": "2020-04-11T12:59:45+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcollections",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-22T10:17:19+00:00"
},
{
- "name": "firebase/php-jwt",
- "version": "v6.10.0",
+ "name": "doctrine/dbal",
+ "version": "3.10.0",
"source": {
"type": "git",
- "url": "https://github.com/firebase/php-jwt.git",
- "reference": "a49db6f0a5033aef5143295342f1c95521b075ff"
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "1cf840d696373ea0d58ad0a8875c0fadcfc67214"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff",
- "reference": "a49db6f0a5033aef5143295342f1c95521b075ff",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/1cf840d696373ea0d58ad0a8875c0fadcfc67214",
+ "reference": "1cf840d696373ea0d58ad0a8875c0fadcfc67214",
"shasum": ""
},
"require": {
- "php": "^7.4||^8.0"
+ "composer-runtime-api": "^2",
+ "doctrine/deprecations": "^0.5.3|^1",
+ "doctrine/event-manager": "^1|^2",
+ "php": "^7.4 || ^8.0",
+ "psr/cache": "^1|^2|^3",
+ "psr/log": "^1|^2|^3"
+ },
+ "conflict": {
+ "doctrine/cache": "< 1.11"
},
"require-dev": {
- "guzzlehttp/guzzle": "^6.5||^7.4",
- "phpspec/prophecy-phpunit": "^2.0",
- "phpunit/phpunit": "^9.5",
- "psr/cache": "^1.0||^2.0",
- "psr/http-client": "^1.0",
- "psr/http-factory": "^1.0"
+ "doctrine/cache": "^1.11|^2.0",
+ "doctrine/coding-standard": "13.0.0",
+ "fig/log-test": "^1",
+ "jetbrains/phpstorm-stubs": "2023.1",
+ "phpstan/phpstan": "2.1.17",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "9.6.23",
+ "slevomat/coding-standard": "8.16.2",
+ "squizlabs/php_codesniffer": "3.13.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/console": "^4.4|^5.4|^6.0|^7.0"
},
"suggest": {
- "ext-sodium": "Support EdDSA (Ed25519) signatures",
- "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
},
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
"type": "library",
"autoload": {
"psr-4": {
- "Firebase\\JWT\\": "src"
+ "Doctrine\\DBAL\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Neuman Vong",
- "email": "neuman+pear@twilio.com",
- "role": "Developer"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
},
{
- "name": "Anant Narayanan",
- "email": "anant@php.net",
- "role": "Developer"
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
}
],
- "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
- "homepage": "https://github.com/firebase/php-jwt",
+ "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+ "homepage": "https://www.doctrine-project.org/projects/dbal.html",
"keywords": [
- "jwt",
- "php"
+ "abstraction",
+ "database",
+ "db2",
+ "dbal",
+ "mariadb",
+ "mssql",
+ "mysql",
+ "oci8",
+ "oracle",
+ "pdo",
+ "pgsql",
+ "postgresql",
+ "queryobject",
+ "sasql",
+ "sql",
+ "sqlite",
+ "sqlserver",
+ "sqlsrv"
],
"support": {
- "issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.10.0"
+ "issues": "https://github.com/doctrine/dbal/issues",
+ "source": "https://github.com/doctrine/dbal/tree/3.10.0"
},
- "time": "2023-12-01T16:26:39+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T21:11:04+00:00"
},
{
- "name": "geoip2/geoip2",
- "version": "v2.13.0",
+ "name": "doctrine/deprecations",
+ "version": "1.1.5",
"source": {
"type": "git",
- "url": "https://github.com/maxmind/GeoIP2-php.git",
- "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23"
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
- "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "maxmind-db/reader": "~1.8",
- "maxmind/web-service-common": "~0.8",
- "php": ">=7.2"
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<=7.5 || >=13"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "3.*",
- "phpstan/phpstan": "*",
- "phpunit/phpunit": "^8.0 || ^9.0",
- "squizlabs/php_codesniffer": "3.*"
+ "doctrine/coding-standard": "^9 || ^12 || ^13",
+ "phpstan/phpstan": "1.4.10 || 2.1.11",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
+ "psr/log": "^1 || ^2 || ^3"
+ },
+ "suggest": {
+ "psr/log": "Allows logging deprecations via PSR-3 logger implementation"
},
"type": "library",
"autoload": {
"psr-4": {
- "GeoIp2\\": "src"
+ "Doctrine\\Deprecations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Gregory J. Oschwald",
- "email": "goschwald@maxmind.com",
- "homepage": "https://www.maxmind.com/"
- }
- ],
- "description": "MaxMind GeoIP2 PHP API",
- "homepage": "https://github.com/maxmind/GeoIP2-php",
- "keywords": [
- "IP",
- "geoip",
- "geoip2",
- "geolocation",
- "maxmind"
+ "MIT"
],
+ "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.",
+ "homepage": "https://www.doctrine-project.org/",
"support": {
- "issues": "https://github.com/maxmind/GeoIP2-php/issues",
- "source": "https://github.com/maxmind/GeoIP2-php/tree/v2.13.0"
+ "issues": "https://github.com/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
},
- "time": "2022-08-05T20:32:58+00:00"
+ "time": "2025-04-07T20:06:18+00:00"
},
{
- "name": "gettext/gettext",
- "version": "v3.6.1",
+ "name": "doctrine/doctrine-bundle",
+ "version": "2.15.0",
"source": {
"type": "git",
- "url": "https://github.com/php-gettext/Gettext.git",
- "reference": "cd3be64443551e3a693117c4bccbe53e36282456"
+ "url": "https://github.com/doctrine/DoctrineBundle.git",
+ "reference": "d88294521a1bca943240adca65fa19ca8a7288c6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/cd3be64443551e3a693117c4bccbe53e36282456",
- "reference": "cd3be64443551e3a693117c4bccbe53e36282456",
+ "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/d88294521a1bca943240adca65fa19ca8a7288c6",
+ "reference": "d88294521a1bca943240adca65fa19ca8a7288c6",
"shasum": ""
},
"require": {
- "gettext/languages": "2.*",
- "php": ">=5.3.0"
+ "doctrine/dbal": "^3.7.0 || ^4.0",
+ "doctrine/persistence": "^3.1 || ^4",
+ "doctrine/sql-formatter": "^1.0.1",
+ "php": "^8.1",
+ "symfony/cache": "^6.4 || ^7.0",
+ "symfony/config": "^6.4 || ^7.0",
+ "symfony/console": "^6.4 || ^7.0",
+ "symfony/dependency-injection": "^6.4 || ^7.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3",
+ "symfony/doctrine-bridge": "^6.4.3 || ^7.0.3",
+ "symfony/framework-bundle": "^6.4 || ^7.0",
+ "symfony/service-contracts": "^2.5 || ^3"
+ },
+ "conflict": {
+ "doctrine/annotations": ">=3.0",
+ "doctrine/cache": "< 1.11",
+ "doctrine/orm": "<2.17 || >=4.0",
+ "symfony/var-exporter": "< 6.4.1 || 7.0.0",
+ "twig/twig": "<2.13 || >=3.0 <3.0.4"
},
"require-dev": {
- "illuminate/view": "*",
- "symfony/yaml": "~2",
- "twig/extensions": "*",
- "twig/twig": "*"
+ "doctrine/annotations": "^1 || ^2",
+ "doctrine/cache": "^1.11 || ^2.0",
+ "doctrine/coding-standard": "^13",
+ "doctrine/deprecations": "^1.0",
+ "doctrine/orm": "^2.17 || ^3.1",
+ "friendsofphp/proxy-manager-lts": "^1.0",
+ "phpstan/phpstan": "2.1.1",
+ "phpstan/phpstan-phpunit": "2.0.3",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^9.6.22",
+ "psr/log": "^1.1.4 || ^2.0 || ^3.0",
+ "symfony/doctrine-messenger": "^6.4 || ^7.0",
+ "symfony/messenger": "^6.4 || ^7.0",
+ "symfony/phpunit-bridge": "^7.2",
+ "symfony/property-info": "^6.4 || ^7.0",
+ "symfony/security-bundle": "^6.4 || ^7.0",
+ "symfony/stopwatch": "^6.4 || ^7.0",
+ "symfony/string": "^6.4 || ^7.0",
+ "symfony/twig-bridge": "^6.4 || ^7.0",
+ "symfony/validator": "^6.4 || ^7.0",
+ "symfony/var-exporter": "^6.4.1 || ^7.0.1",
+ "symfony/web-profiler-bundle": "^6.4 || ^7.0",
+ "symfony/yaml": "^6.4 || ^7.0",
+ "twig/twig": "^2.13 || ^3.0.4"
},
"suggest": {
- "illuminate/view": "Is necessary if you want to use the Blade extractor",
- "symfony/yaml": "Is necessary if you want to use the Yaml extractor/generator",
- "twig/extensions": "Is necessary if you want to use the Twig extractor",
- "twig/twig": "Is necessary if you want to use the Twig extractor"
+ "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.",
+ "ext-pdo": "*",
+ "symfony/web-profiler-bundle": "To use the data collector."
},
- "type": "library",
+ "type": "symfony-bundle",
"autoload": {
"psr-4": {
- "Gettext\\": "src"
+ "Doctrine\\Bundle\\DoctrineBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -524,56 +635,88 @@
],
"authors": [
{
- "name": "Oscar Otero",
- "email": "oom@oscarotero.com",
- "homepage": "http://oscarotero.com",
- "role": "Developer"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ },
+ {
+ "name": "Doctrine Project",
+ "homepage": "https://www.doctrine-project.org/"
}
],
- "description": "PHP gettext manager",
- "homepage": "https://github.com/oscarotero/Gettext",
+ "description": "Symfony DoctrineBundle",
+ "homepage": "https://www.doctrine-project.org",
"keywords": [
- "JS",
- "gettext",
- "i18n",
- "mo",
- "po",
- "translation"
+ "database",
+ "dbal",
+ "orm",
+ "persistence"
],
"support": {
- "email": "oom@oscarotero.com",
- "issues": "https://github.com/oscarotero/Gettext/issues",
- "source": "https://github.com/php-gettext/Gettext/tree/v3.6.1"
+ "issues": "https://github.com/doctrine/DoctrineBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.0"
},
- "time": "2016-08-01T18:09:57+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-bundle",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-16T19:53:58+00:00"
},
{
- "name": "gettext/languages",
- "version": "2.10.0",
+ "name": "doctrine/doctrine-migrations-bundle",
+ "version": "3.4.2",
"source": {
"type": "git",
- "url": "https://github.com/php-gettext/Languages.git",
- "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab"
+ "url": "https://github.com/doctrine/DoctrineMigrationsBundle.git",
+ "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
- "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
+ "url": "https://api.github.com/repos/doctrine/DoctrineMigrationsBundle/zipball/5a6ac7120c2924c4c070a869d08b11ccf9e277b9",
+ "reference": "5a6ac7120c2924c4c070a869d08b11ccf9e277b9",
"shasum": ""
},
"require": {
- "php": ">=5.3"
+ "doctrine/doctrine-bundle": "^2.4",
+ "doctrine/migrations": "^3.2",
+ "php": "^7.2 || ^8.0",
+ "symfony/deprecation-contracts": "^2.1 || ^3",
+ "symfony/framework-bundle": "^5.4 || ^6.0 || ^7.0"
},
"require-dev": {
- "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
- },
- "bin": [
- "bin/export-plural-rules"
- ],
- "type": "library",
+ "composer/semver": "^3.0",
+ "doctrine/coding-standard": "^12",
+ "doctrine/orm": "^2.6 || ^3",
+ "phpstan/phpstan": "^1.4 || ^2",
+ "phpstan/phpstan-deprecation-rules": "^1 || ^2",
+ "phpstan/phpstan-phpunit": "^1 || ^2",
+ "phpstan/phpstan-strict-rules": "^1.1 || ^2",
+ "phpstan/phpstan-symfony": "^1.3 || ^2",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "symfony/phpunit-bridge": "^6.3 || ^7",
+ "symfony/var-exporter": "^5.4 || ^6 || ^7"
+ },
+ "type": "symfony-bundle",
"autoload": {
"psr-4": {
- "Gettext\\Languages\\": "src/"
+ "Doctrine\\Bundle\\MigrationsBundle\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -582,179 +725,259 @@
],
"authors": [
{
- "name": "Michele Locati",
- "email": "mlocati@gmail.com",
- "role": "Developer"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Doctrine Project",
+ "homepage": "https://www.doctrine-project.org"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "gettext languages with plural rules",
- "homepage": "https://github.com/php-gettext/Languages",
+ "description": "Symfony DoctrineMigrationsBundle",
+ "homepage": "https://www.doctrine-project.org",
"keywords": [
- "cldr",
- "i18n",
- "internationalization",
- "l10n",
- "language",
- "languages",
- "localization",
- "php",
- "plural",
- "plural rules",
- "plurals",
- "translate",
- "translations",
- "unicode"
+ "dbal",
+ "migrations",
+ "schema"
],
"support": {
- "issues": "https://github.com/php-gettext/Languages/issues",
- "source": "https://github.com/php-gettext/Languages/tree/2.10.0"
+ "issues": "https://github.com/doctrine/DoctrineMigrationsBundle/issues",
+ "source": "https://github.com/doctrine/DoctrineMigrationsBundle/tree/3.4.2"
},
"funding": [
{
- "url": "https://paypal.me/mlocati",
+ "url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
- "url": "https://github.com/mlocati",
- "type": "github"
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-migrations-bundle",
+ "type": "tidelift"
}
],
- "time": "2022-10-18T15:00:10+00:00"
+ "time": "2025-03-11T17:36:26+00:00"
},
{
- "name": "google/recaptcha",
- "version": "1.2.4",
+ "name": "doctrine/event-manager",
+ "version": "2.0.1",
"source": {
"type": "git",
- "url": "https://github.com/google/recaptcha.git",
- "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419"
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/google/recaptcha/zipball/614f25a9038be4f3f2da7cbfd778dc5b357d2419",
- "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/b680156fa328f1dfd874fd48c7026c41570b9c6e",
+ "reference": "b680156fa328f1dfd874fd48c7026c41570b9c6e",
"shasum": ""
},
"require": {
- "php": ">=5.5"
+ "php": "^8.1"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^2.2.20|^2.15",
- "php-coveralls/php-coveralls": "^2.1",
- "phpunit/phpunit": "^4.8.36|^5.7.27|^6.59|^7.5.11"
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.8.8",
+ "phpunit/phpunit": "^10.5",
+ "vimeo/psalm": "^5.24"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.2.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "ReCaptcha\\": "src/ReCaptcha"
+ "Doctrine\\Common\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.",
- "homepage": "https://www.google.com/recaptcha/",
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
"keywords": [
- "Abuse",
- "captcha",
- "recaptcha",
- "spam"
+ "event",
+ "event dispatcher",
+ "event manager",
+ "event system",
+ "events"
],
"support": {
- "forum": "https://groups.google.com/forum/#!forum/recaptcha",
- "issues": "https://github.com/google/recaptcha/issues",
- "source": "https://github.com/google/recaptcha"
+ "issues": "https://github.com/doctrine/event-manager/issues",
+ "source": "https://github.com/doctrine/event-manager/tree/2.0.1"
},
- "time": "2020-03-31T17:50:54+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-05-22T20:47:39+00:00"
},
{
- "name": "greenlion/php-sql-parser",
- "version": "v4.6.0",
+ "name": "doctrine/inflector",
+ "version": "2.0.10",
"source": {
"type": "git",
- "url": "https://github.com/greenlion/PHP-SQL-Parser.git",
- "reference": "f0e4645eb1612f0a295e3d35bda4c7740ae8c366"
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/greenlion/PHP-SQL-Parser/zipball/f0e4645eb1612f0a295e3d35bda4c7740ae8c366",
- "reference": "f0e4645eb1612f0a295e3d35bda4c7740ae8c366",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
"shasum": ""
},
"require": {
- "php": ">=5.3.2"
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "analog/analog": "^1.0.6",
- "phpunit/phpunit": "^9.5.13",
- "squizlabs/php_codesniffer": "^1.5.1"
+ "doctrine/coding-standard": "^11.0",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpstan/phpstan-strict-rules": "^1.3",
+ "phpunit/phpunit": "^8.5 || ^9.5",
+ "vimeo/psalm": "^4.25 || ^5.4"
},
"type": "library",
"autoload": {
- "psr-0": {
- "PHPSQLParser\\": "src/"
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
"authors": [
{
- "name": "Justin Swanhart",
- "email": "greenlion@gmail.com",
- "homepage": "http://code.google.com/u/greenlion@gmail.com/",
- "role": "Owner"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
},
{
- "name": "André Rothe",
- "email": "phosco@gmx.de",
- "homepage": "https://www.phosco.info",
- "role": "Committer"
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
}
],
- "description": "A pure PHP SQL (non validating) parser w/ focus on MySQL dialect of SQL",
- "homepage": "https://github.com/greenlion/PHP-SQL-Parser",
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
"keywords": [
- "creator",
- "mysql",
- "parser",
- "sql"
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
],
"support": {
- "issues": "https://github.com/greenlion/PHP-SQL-Parser/issues",
- "source": "https://github.com/greenlion/PHP-SQL-Parser"
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
},
- "time": "2023-03-09T20:54:23+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-02-18T20:23:39+00:00"
},
{
- "name": "ircmaxell/password-compat",
- "version": "v1.0.4",
+ "name": "doctrine/instantiator",
+ "version": "2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/ircmaxell/password_compat.git",
- "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c"
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c",
- "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
"shasum": ""
},
+ "require": {
+ "php": "^8.1"
+ },
"require-dev": {
- "phpunit/phpunit": "4.*"
+ "doctrine/coding-standard": "^11",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/phpstan": "^1.9.4",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5.27",
+ "vimeo/psalm": "^5.4"
},
"type": "library",
"autoload": {
- "files": [
- "lib/password.php"
- ]
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -762,126 +985,170 @@
],
"authors": [
{
- "name": "Anthony Ferrara",
- "email": "ircmaxell@php.net",
- "homepage": "http://blog.ircmaxell.com"
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
}
],
- "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
- "homepage": "https://github.com/ircmaxell/password_compat",
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
"keywords": [
- "hashing",
- "password"
+ "constructor",
+ "instantiate"
],
"support": {
- "issues": "https://github.com/ircmaxell/password_compat/issues",
- "source": "https://github.com/ircmaxell/password_compat/tree/v1.0"
+ "issues": "https://github.com/doctrine/instantiator/issues",
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
},
- "time": "2014-11-20T16:49:30+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-30T00:23:10+00:00"
},
{
- "name": "jaimeperez/twig-configurable-i18n",
- "version": "v1.2",
+ "name": "doctrine/lexer",
+ "version": "3.0.1",
"source": {
"type": "git",
- "url": "https://github.com/jaimeperez/twig-configurable-i18n.git",
- "reference": "75d4926fd102c9e62219ad7f94a6136d2f2ccd93"
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jaimeperez/twig-configurable-i18n/zipball/75d4926fd102c9e62219ad7f94a6136d2f2ccd93",
- "reference": "75d4926fd102c9e62219ad7f94a6136d2f2ccd93",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
"shasum": ""
},
"require": {
- "twig/extensions": "^1.3"
+ "php": "^8.1"
},
- "type": "project",
+ "require-dev": {
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5",
+ "psalm/plugin-phpunit": "^0.18.3",
+ "vimeo/psalm": "^5.21"
+ },
+ "type": "library",
"autoload": {
"psr-4": {
- "JaimePerez\\TwigConfigurableI18n\\": "src/"
+ "Doctrine\\Common\\Lexer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1"
+ "MIT"
],
"authors": [
{
- "name": "Jaime Perez",
- "email": "jaime.perez@uninett.no"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
}
],
- "description": "This is an extension on top of Twig's i18n extension, allowing you to customize which functions to use for translations.",
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
"keywords": [
- "extension",
- "gettext",
- "i18n",
- "internationalization",
- "translation",
- "twig"
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
],
"support": {
- "issues": "https://github.com/jaimeperez/twig-configurable-i18n/issues",
- "source": "https://github.com/jaimeperez/twig-configurable-i18n"
- },
- "abandoned": "simplesamlphp/twig-configurable-i18n",
- "time": "2016-10-03T12:34:15+00:00"
- },
- {
- "name": "jquery/jquery-min-file",
- "version": "3.7.1",
- "dist": {
- "type": "file",
- "url": "https://code.jquery.com/jquery-3.7.1.min.js",
- "shasum": "ee48592d1fff952fcf06ce0b666ed4785493afdc"
- },
- "require": {
- "composer/installers": "~1.0"
- },
- "type": "vanilla-plugin",
- "extra": {
- "installer-name": "jquery"
+ "issues": "https://github.com/doctrine/lexer/issues",
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
},
- "license": [
- "MIT"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
],
- "homepage": "https://jquery.com"
+ "time": "2024-02-05T11:56:58+00:00"
},
{
- "name": "justinrainbow/json-schema",
- "version": "v5.2.13",
+ "name": "doctrine/migrations",
+ "version": "3.9.2",
"source": {
"type": "git",
- "url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793"
+ "url": "https://github.com/doctrine/migrations.git",
+ "reference": "fa94c6f06b1bc6d4759481ec20b8b81d13e861be"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793",
- "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793",
+ "url": "https://api.github.com/repos/doctrine/migrations/zipball/fa94c6f06b1bc6d4759481ec20b8b81d13e861be",
+ "reference": "fa94c6f06b1bc6d4759481ec20b8b81d13e861be",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "composer-runtime-api": "^2",
+ "doctrine/dbal": "^3.6 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2.0",
+ "php": "^8.1",
+ "psr/log": "^1.1.3 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.2 || ^7.0"
+ },
+ "conflict": {
+ "doctrine/orm": "<2.12 || >=4"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
- "json-schema/json-schema-test-suite": "1.2.0",
- "phpunit/phpunit": "^4.8.35"
+ "doctrine/coding-standard": "^13",
+ "doctrine/orm": "^2.13 || ^3",
+ "doctrine/persistence": "^2 || ^3 || ^4",
+ "doctrine/sql-formatter": "^1.0",
+ "ext-pdo_sqlite": "*",
+ "fig/log-test": "^1",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-phpunit": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpstan/phpstan-symfony": "^2",
+ "phpunit/phpunit": "^10.3 || ^11.0 || ^12.0",
+ "symfony/cache": "^5.4 || ^6.0 || ^7.0",
+ "symfony/process": "^5.4 || ^6.0 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "suggest": {
+ "doctrine/sql-formatter": "Allows to generate formatted SQL with the diff command.",
+ "symfony/yaml": "Allows the use of yaml for migration configuration files."
},
"bin": [
- "bin/validate-json"
+ "bin/doctrine-migrations"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.0.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "JsonSchema\\": "src/JsonSchema/"
+ "Doctrine\\Migrations\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -890,573 +1157,657 @@
],
"authors": [
{
- "name": "Bruno Prieto Reis",
- "email": "bruno.p.reis@gmail.com"
- },
- {
- "name": "Justin Rainbow",
- "email": "justin.rainbow@gmail.com"
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
},
{
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
},
{
- "name": "Robert Schönthal",
- "email": "seroscho@googlemail.com"
+ "name": "Michael Simonson",
+ "email": "contact@mikesimonson.com"
}
],
- "description": "A library to validate a json schema.",
- "homepage": "https://github.com/justinrainbow/json-schema",
+ "description": "PHP Doctrine Migrations project offer additional functionality on top of the database abstraction layer (DBAL) for versioning your database schema and easily deploying changes to it. It is a very easy to use and a powerful tool.",
+ "homepage": "https://www.doctrine-project.org/projects/migrations.html",
"keywords": [
- "json",
- "schema"
+ "database",
+ "dbal",
+ "migrations"
],
"support": {
- "issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/v5.2.13"
+ "issues": "https://github.com/doctrine/migrations/issues",
+ "source": "https://github.com/doctrine/migrations/tree/3.9.2"
},
- "time": "2023-09-26T02:20:38+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fmigrations",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-29T11:36:14+00:00"
},
{
- "name": "kassner/log-parser",
- "version": "1.5.0",
+ "name": "doctrine/orm",
+ "version": "3.5.0",
"source": {
"type": "git",
- "url": "https://github.com/kassner/log-parser.git",
- "reference": "ea846b7edf24a421c5484902b2501c9c8e065796"
+ "url": "https://github.com/doctrine/orm.git",
+ "reference": "6deec3655ba3e8f15280aac11e264225854d2369"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/kassner/log-parser/zipball/ea846b7edf24a421c5484902b2501c9c8e065796",
- "reference": "ea846b7edf24a421c5484902b2501c9c8e065796",
+ "url": "https://api.github.com/repos/doctrine/orm/zipball/6deec3655ba3e8f15280aac11e264225854d2369",
+ "reference": "6deec3655ba3e8f15280aac11e264225854d2369",
"shasum": ""
},
"require": {
- "php": ">=5.3.4"
+ "composer-runtime-api": "^2",
+ "doctrine/collections": "^2.2",
+ "doctrine/dbal": "^3.8.2 || ^4",
+ "doctrine/deprecations": "^0.5.3 || ^1",
+ "doctrine/event-manager": "^1.2 || ^2",
+ "doctrine/inflector": "^1.4 || ^2.0",
+ "doctrine/instantiator": "^1.3 || ^2",
+ "doctrine/lexer": "^3",
+ "doctrine/persistence": "^3.3.1 || ^4",
+ "ext-ctype": "*",
+ "php": "^8.1",
+ "psr/cache": "^1 || ^2 || ^3",
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/var-exporter": "^6.3.9 || ^7.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^2.11",
- "phpmd/phpmd": "~2.1",
- "phpunit/phpunit": "~4.4",
- "sebastian/phpcpd": "~2.0"
+ "doctrine/coding-standard": "^13.0",
+ "phpbench/phpbench": "^1.0",
+ "phpdocumentor/guides-cli": "^1.4",
+ "phpstan/extension-installer": "^1.4",
+ "phpstan/phpstan": "2.0.3",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpunit/phpunit": "^10.4.0",
+ "psr/log": "^1 || ^2 || ^3",
+ "squizlabs/php_codesniffer": "3.12.0",
+ "symfony/cache": "^5.4 || ^6.2 || ^7.0"
+ },
+ "suggest": {
+ "ext-dom": "Provides support for XSD validation for XML mapping files",
+ "symfony/cache": "Provides cache support for Setup Tool with doctrine/cache 2.0"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Kassner": "src"
+ "psr-4": {
+ "Doctrine\\ORM\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Rafael Kassner",
- "email": "kassner@gmail.com",
- "homepage": "http://www.kassner.com.br/",
- "role": "Developer"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
}
],
- "description": "PHP Log Parser Library",
- "homepage": "http://github.com/kassner/log-parser",
+ "description": "Object-Relational-Mapper for PHP",
+ "homepage": "https://www.doctrine-project.org/projects/orm.html",
"keywords": [
- "apache",
- "format",
- "log",
- "log-format",
- "nginx",
- "parser"
+ "database",
+ "orm"
],
"support": {
- "issues": "https://github.com/kassner/log-parser/issues",
- "source": "https://github.com/kassner/log-parser/tree/master"
+ "issues": "https://github.com/doctrine/orm/issues",
+ "source": "https://github.com/doctrine/orm/tree/3.5.0"
},
- "time": "2019-02-04T07:43:30+00:00"
+ "time": "2025-07-01T17:40:53+00:00"
},
{
- "name": "maxmind-db/reader",
- "version": "v1.11.1",
+ "name": "doctrine/persistence",
+ "version": "4.0.0",
"source": {
"type": "git",
- "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
- "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7"
+ "url": "https://github.com/doctrine/persistence.git",
+ "reference": "45004aca79189474f113cbe3a53847c2115a55fa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7",
- "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7",
+ "url": "https://api.github.com/repos/doctrine/persistence/zipball/45004aca79189474f113cbe3a53847c2115a55fa",
+ "reference": "45004aca79189474f113cbe3a53847c2115a55fa",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "doctrine/event-manager": "^1 || ^2",
+ "php": "^8.1",
+ "psr/cache": "^1.0 || ^2.0 || ^3.0"
},
"conflict": {
- "ext-maxminddb": "<1.11.1,>=2.0.0"
+ "doctrine/common": "<2.10"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "3.*",
- "php-coveralls/php-coveralls": "^2.1",
- "phpstan/phpstan": "*",
- "phpunit/phpcov": ">=6.0.0",
- "phpunit/phpunit": ">=8.0.0,<10.0.0",
- "squizlabs/php_codesniffer": "3.*"
- },
- "suggest": {
- "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
- "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
- "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
+ "doctrine/coding-standard": "^12",
+ "phpstan/phpstan": "1.12.7",
+ "phpstan/phpstan-phpunit": "^1",
+ "phpstan/phpstan-strict-rules": "^1.1",
+ "phpunit/phpunit": "^9.6",
+ "symfony/cache": "^4.4 || ^5.4 || ^6.0 || ^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "MaxMind\\Db\\": "src/MaxMind/Db"
+ "Doctrine\\Persistence\\": "src/Persistence"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Gregory J. Oschwald",
- "email": "goschwald@maxmind.com",
- "homepage": "https://www.maxmind.com/"
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
}
],
- "description": "MaxMind DB Reader API",
- "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
+ "description": "The Doctrine Persistence project is a set of shared interfaces and functionality that the different Doctrine object mappers share.",
+ "homepage": "https://www.doctrine-project.org/projects/persistence.html",
"keywords": [
- "database",
- "geoip",
- "geoip2",
- "geolocation",
- "maxmind"
+ "mapper",
+ "object",
+ "odm",
+ "orm",
+ "persistence"
],
"support": {
- "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
- "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1"
+ "issues": "https://github.com/doctrine/persistence/issues",
+ "source": "https://github.com/doctrine/persistence/tree/4.0.0"
},
- "time": "2023-12-02T00:09:23+00:00"
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fpersistence",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-11-01T21:49:07+00:00"
},
{
- "name": "maxmind/web-service-common",
- "version": "v0.9.0",
+ "name": "doctrine/sql-formatter",
+ "version": "1.5.2",
"source": {
"type": "git",
- "url": "https://github.com/maxmind/web-service-common-php.git",
- "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53"
+ "url": "https://github.com/doctrine/sql-formatter.git",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
- "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
+ "url": "https://api.github.com/repos/doctrine/sql-formatter/zipball/d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
+ "reference": "d6d00aba6fd2957fe5216fe2b7673e9985db20c8",
"shasum": ""
},
"require": {
- "composer/ca-bundle": "^1.0.3",
- "ext-curl": "*",
- "ext-json": "*",
- "php": ">=7.2"
+ "php": "^8.1"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "3.*",
- "phpstan/phpstan": "*",
- "phpunit/phpunit": "^8.0 || ^9.0",
- "squizlabs/php_codesniffer": "3.*"
+ "doctrine/coding-standard": "^12",
+ "ergebnis/phpunit-slow-test-detector": "^2.14",
+ "phpstan/phpstan": "^1.10",
+ "phpunit/phpunit": "^10.5"
},
+ "bin": [
+ "bin/sql-formatter"
+ ],
"type": "library",
"autoload": {
"psr-4": {
- "MaxMind\\Exception\\": "src/Exception",
- "MaxMind\\WebService\\": "src/WebService"
+ "Doctrine\\SqlFormatter\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Gregory Oschwald",
- "email": "goschwald@maxmind.com"
+ "name": "Jeremy Dorn",
+ "email": "jeremy@jeremydorn.com",
+ "homepage": "https://jeremydorn.com/"
}
],
- "description": "Internal MaxMind Web Service API",
- "homepage": "https://github.com/maxmind/web-service-common-php",
- "support": {
- "issues": "https://github.com/maxmind/web-service-common-php/issues",
- "source": "https://github.com/maxmind/web-service-common-php/tree/v0.9.0"
- },
- "time": "2022-03-28T17:43:20+00:00"
- },
- {
- "name": "moment/moment-min-file",
- "version": "2.13.0",
- "dist": {
- "type": "file",
- "url": "https://raw.githubusercontent.com/moment/moment/2.13.0/min/moment.min.js",
- "shasum": "a8ca7eea2616fa92e2e85ba6291af6ea012fd190"
- },
- "require": {
- "composer/installers": "~1.0"
- },
- "type": "vanilla-plugin",
- "extra": {
- "installer-name": "moment"
- },
- "license": [
- "MIT"
+ "description": "a PHP SQL highlighting library",
+ "homepage": "https://github.com/doctrine/sql-formatter/",
+ "keywords": [
+ "highlight",
+ "sql"
],
- "homepage": "https://momentjs.com"
- },
- {
- "name": "moment/moment-timezone-min-file",
- "version": "0.5.4",
- "dist": {
- "type": "file",
- "url": "https://raw.githubusercontent.com/moment/moment-timezone/0.5.4/builds/moment-timezone-with-data.min.js",
- "shasum": "39b9fccc20863c23f19524a756d75cfef2ff9cbe"
- },
- "require": {
- "composer/installers": "~1.0"
- },
- "type": "vanilla-plugin",
- "extra": {
- "installer-name": "moment-timezone"
+ "support": {
+ "issues": "https://github.com/doctrine/sql-formatter/issues",
+ "source": "https://github.com/doctrine/sql-formatter/tree/1.5.2"
},
- "license": [
- "MIT"
- ],
- "homepage": "https://momentjs.com"
+ "time": "2025-01-24T11:45:48+00:00"
},
{
- "name": "mongodb/mongodb",
- "version": "1.19.0",
+ "name": "egulias/email-validator",
+ "version": "4.0.4",
"source": {
"type": "git",
- "url": "https://github.com/mongodb/mongo-php-library.git",
- "reference": "cbc8104c0b2c32b7cf572ff759324c872e8dc63a"
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/cbc8104c0b2c32b7cf572ff759324c872e8dc63a",
- "reference": "cbc8104c0b2c32b7cf572ff759324c872e8dc63a",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
"shasum": ""
},
"require": {
- "composer-runtime-api": "^2.0",
- "ext-hash": "*",
- "ext-json": "*",
- "ext-mongodb": "^1.18.0",
- "php": "^7.4 || ^8.0",
- "psr/log": "^1.1.4|^2|^3",
- "symfony/polyfill-php80": "^1.27",
- "symfony/polyfill-php81": "^1.27"
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
},
"require-dev": {
- "doctrine/coding-standard": "^12.0",
- "rector/rector": "^0.19",
- "squizlabs/php_codesniffer": "^3.7",
- "symfony/phpunit-bridge": "^5.2",
- "vimeo/psalm": "^5.13"
+ "phpunit/phpunit": "^10.2",
+ "vimeo/psalm": "^5.12"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "4.0.x-dev"
}
},
"autoload": {
- "files": [
- "src/functions.php"
- ],
"psr-4": {
- "MongoDB\\": "src/"
+ "Egulias\\EmailValidator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "Apache-2.0"
+ "MIT"
],
"authors": [
{
- "name": "Andreas Braun",
- "email": "andreas.braun@mongodb.com"
- },
- {
- "name": "Jeremy Mikola",
- "email": "jmikola@gmail.com"
- },
- {
- "name": "Jérôme Tamarelle",
- "email": "jerome.tamarelle@mongodb.com"
+ "name": "Eduardo Gulias Davis"
}
],
- "description": "MongoDB driver library",
- "homepage": "https://jira.mongodb.org/browse/PHPLIB",
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
"keywords": [
- "database",
- "driver",
- "mongodb",
- "persistence"
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
],
"support": {
- "issues": "https://github.com/mongodb/mongo-php-library/issues",
- "source": "https://github.com/mongodb/mongo-php-library/tree/1.19.0"
+ "issues": "https://github.com/egulias/EmailValidator/issues",
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.4"
},
- "time": "2024-05-10T19:49:08+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-06T22:45:56+00:00"
},
{
- "name": "monolog/monolog",
- "version": "1.27.1",
+ "name": "firebase/php-jwt",
+ "version": "v6.11.1",
"source": {
"type": "git",
- "url": "https://github.com/Seldaek/monolog.git",
- "reference": "904713c5929655dc9b97288b69cfeedad610c9a1"
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1",
- "reference": "904713c5929655dc9b97288b69cfeedad610c9a1",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
+ "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
"shasum": ""
},
"require": {
- "php": ">=5.3.0",
- "psr/log": "~1.0"
- },
- "provide": {
- "psr/log-implementation": "1.0.0"
+ "php": "^8.0"
},
"require-dev": {
- "aws/aws-sdk-php": "^2.4.9 || ^3.0",
- "doctrine/couchdb": "~1.0@dev",
- "graylog2/gelf-php": "~1.0",
- "php-amqplib/php-amqplib": "~2.4",
- "php-console/php-console": "^3.1.3",
- "phpstan/phpstan": "^0.12.59",
- "phpunit/phpunit": "~4.5",
- "ruflin/elastica": ">=0.90 <3.0",
- "sentry/sentry": "^0.13",
- "swiftmailer/swiftmailer": "^5.3|^6.0"
+ "guzzlehttp/guzzle": "^7.4",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpunit/phpunit": "^9.5",
+ "psr/cache": "^2.0||^3.0",
+ "psr/http-client": "^1.0",
+ "psr/http-factory": "^1.0"
},
"suggest": {
- "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
- "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
- "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
- "ext-mongo": "Allow sending log messages to a MongoDB server",
- "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
- "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
- "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
- "php-console/php-console": "Allow sending log messages to Google Chrome",
- "rollbar/rollbar": "Allow sending log messages to Rollbar",
- "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
- "sentry/sentry": "Allow sending log messages to a Sentry server"
+ "ext-sodium": "Support EdDSA (Ed25519) signatures",
+ "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present"
},
"type": "library",
"autoload": {
"psr-4": {
- "Monolog\\": "src/Monolog"
+ "Firebase\\JWT\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
}
],
- "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
- "homepage": "http://github.com/Seldaek/monolog",
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
"keywords": [
- "log",
- "logging",
- "psr-3"
+ "jwt",
+ "php"
],
"support": {
- "issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/1.27.1"
+ "issues": "https://github.com/firebase/php-jwt/issues",
+ "source": "https://github.com/firebase/php-jwt/tree/v6.11.1"
+ },
+ "time": "2025-04-09T20:32:01+00:00"
+ },
+ {
+ "name": "friendsofphp/proxy-manager-lts",
+ "version": "v1.0.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfPHP/proxy-manager-lts.git",
+ "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfPHP/proxy-manager-lts/zipball/2c8a6cffc3220e99352ad958fe7cf06bf6f7690f",
+ "reference": "2c8a6cffc3220e99352ad958fe7cf06bf6f7690f",
+ "shasum": ""
+ },
+ "require": {
+ "laminas/laminas-code": "~3.4.1|^4.0",
+ "php": ">=7.1",
+ "symfony/filesystem": "^4.4.17|^5.0|^6.0|^7.0"
+ },
+ "conflict": {
+ "laminas/laminas-stdlib": "<3.2.1",
+ "zendframework/zend-stdlib": "<3.2.1"
+ },
+ "replace": {
+ "ocramius/proxy-manager": "^2.1"
+ },
+ "require-dev": {
+ "ext-phar": "*",
+ "symfony/phpunit-bridge": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/Ocramius/ProxyManager",
+ "name": "ocramius/proxy-manager"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "ProxyManager\\": "src/ProxyManager"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ }
+ ],
+ "description": "Adding support for a wider range of PHP versions to ocramius/proxy-manager",
+ "homepage": "https://github.com/FriendsOfPHP/proxy-manager-lts",
+ "keywords": [
+ "aop",
+ "lazy loading",
+ "proxy",
+ "proxy pattern",
+ "service proxies"
+ ],
+ "support": {
+ "issues": "https://github.com/FriendsOfPHP/proxy-manager-lts/issues",
+ "source": "https://github.com/FriendsOfPHP/proxy-manager-lts/tree/v1.0.18"
},
"funding": [
{
- "url": "https://github.com/Seldaek",
+ "url": "https://github.com/Ocramius",
"type": "github"
},
{
- "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager",
"type": "tidelift"
}
],
- "time": "2022-06-09T08:53:42+00:00"
+ "time": "2024-03-20T12:50:41+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v2.0.21",
+ "name": "geoip2/geoip2",
+ "version": "v2.13.0",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae"
+ "url": "https://github.com/maxmind/GeoIP2-php.git",
+ "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/96c132c7f2f7bc3230723b66e89f8f150b29d5ae",
- "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae",
+ "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
+ "reference": "6a41d8fbd6b90052bc34dff3b4252d0f88067b23",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "ext-json": "*",
+ "maxmind-db/reader": "~1.8",
+ "maxmind/web-service-common": "~0.8",
+ "php": ">=7.2"
},
"require-dev": {
- "phpunit/phpunit": "*"
- },
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "friendsofphp/php-cs-fixer": "3.*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": "^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "3.*"
},
"type": "library",
"autoload": {
- "files": [
- "lib/random.php"
- ]
+ "psr-4": {
+ "GeoIp2\\": "src"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "Apache-2.0"
],
"authors": [
{
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
+ "name": "Gregory J. Oschwald",
+ "email": "goschwald@maxmind.com",
+ "homepage": "https://www.maxmind.com/"
}
],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "description": "MaxMind GeoIP2 PHP API",
+ "homepage": "https://github.com/maxmind/GeoIP2-php",
"keywords": [
- "csprng",
- "polyfill",
- "pseudorandom",
- "random"
+ "IP",
+ "geoip",
+ "geoip2",
+ "geolocation",
+ "maxmind"
],
"support": {
- "email": "info@paragonie.com",
- "issues": "https://github.com/paragonie/random_compat/issues",
- "source": "https://github.com/paragonie/random_compat"
+ "issues": "https://github.com/maxmind/GeoIP2-php/issues",
+ "source": "https://github.com/maxmind/GeoIP2-php/tree/v2.13.0"
},
- "time": "2022-02-16T17:07:03+00:00"
+ "time": "2022-08-05T20:32:58+00:00"
},
{
- "name": "phpmailer/phpmailer",
- "version": "v6.9.1",
+ "name": "gettext/gettext",
+ "version": "v5.7.3",
"source": {
"type": "git",
- "url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
+ "url": "https://github.com/php-gettext/Gettext.git",
+ "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
+ "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
+ "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
"shasum": ""
},
"require": {
- "ext-ctype": "*",
- "ext-filter": "*",
- "ext-hash": "*",
- "php": ">=5.5.0"
+ "gettext/languages": "^2.3",
+ "php": "^7.2|^8.0"
},
"require-dev": {
- "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
- "doctrine/annotations": "^1.2.6 || ^1.13.3",
- "php-parallel-lint/php-console-highlighter": "^1.0.0",
- "php-parallel-lint/php-parallel-lint": "^1.3.2",
- "phpcompatibility/php-compatibility": "^9.3.5",
- "roave/security-advisories": "dev-latest",
- "squizlabs/php_codesniffer": "^3.7.2",
- "yoast/phpunit-polyfills": "^1.0.4"
- },
- "suggest": {
- "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
- "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
- "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
- "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
- "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
- "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
- "psr/log": "For optional PSR-3 debug logging",
- "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
- "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
+ "brick/varexporter": "^0.3.5",
+ "friendsofphp/php-cs-fixer": "^3.2",
+ "oscarotero/php-cs-fixer-config": "^2.0",
+ "phpunit/phpunit": "^8.0|^9.0",
+ "squizlabs/php_codesniffer": "^3.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "PHPMailer\\PHPMailer\\": "src/"
+ "Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-only"
+ "MIT"
],
"authors": [
{
- "name": "Marcus Bointon",
- "email": "phpmailer@synchromedia.co.uk"
- },
- {
- "name": "Jim Jagielski",
- "email": "jimjag@gmail.com"
- },
- {
- "name": "Andy Prevost",
- "email": "codeworxtech@users.sourceforge.net"
- },
- {
- "name": "Brent R. Matzelle"
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
}
],
- "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+ "description": "PHP gettext manager",
+ "homepage": "https://github.com/php-gettext/Gettext",
+ "keywords": [
+ "JS",
+ "gettext",
+ "i18n",
+ "mo",
+ "po",
+ "translation"
+ ],
"support": {
- "issues": "https://github.com/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
+ "email": "oom@oscarotero.com",
+ "issues": "https://github.com/php-gettext/Gettext/issues",
+ "source": "https://github.com/php-gettext/Gettext/tree/v5.7.3"
},
"funding": [
{
- "url": "https://github.com/Synchro",
+ "url": "https://paypal.me/oscarotero",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/oscarotero",
"type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/misteroom",
+ "type": "patreon"
}
],
- "time": "2023-11-25T22:23:28+00:00"
+ "time": "2024-12-01T10:18:08+00:00"
},
{
- "name": "phpoffice/math",
- "version": "0.1.0",
+ "name": "gettext/languages",
+ "version": "2.12.1",
"source": {
"type": "git",
- "url": "https://github.com/PHPOffice/Math.git",
- "reference": "f0f8cad98624459c540cdd61d2a174d834471773"
+ "url": "https://github.com/php-gettext/Languages.git",
+ "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/Math/zipball/f0f8cad98624459c540cdd61d2a174d834471773",
- "reference": "f0f8cad98624459c540cdd61d2a174d834471773",
+ "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1",
+ "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-xml": "*",
- "php": "^7.1|^8.0"
+ "php": ">=5.3"
},
"require-dev": {
- "phpstan/phpstan": "^0.12.88 || ^1.0.0",
- "phpunit/phpunit": "^7.0 || ^9.0"
+ "phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
},
+ "bin": [
+ "bin/export-plural-rules",
+ "bin/import-cldr-data"
+ ],
"type": "library",
"autoload": {
"psr-4": {
- "PhpOffice\\Math\\": "src/Math/",
- "Tests\\PhpOffice\\Math\\": "tests/Math/"
+ "Gettext\\Languages\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1465,284 +1816,273 @@
],
"authors": [
{
- "name": "Progi1984",
- "homepage": "https://lefevre.dev"
+ "name": "Michele Locati",
+ "email": "mlocati@gmail.com",
+ "role": "Developer"
}
],
- "description": "Math - Manipulate Math Formula",
- "homepage": "https://phpoffice.github.io/Math/",
+ "description": "gettext languages with plural rules",
+ "homepage": "https://github.com/php-gettext/Languages",
"keywords": [
- "MathML",
- "officemathml",
- "php"
+ "cldr",
+ "i18n",
+ "internationalization",
+ "l10n",
+ "language",
+ "languages",
+ "localization",
+ "php",
+ "plural",
+ "plural rules",
+ "plurals",
+ "translate",
+ "translations",
+ "unicode"
],
"support": {
- "issues": "https://github.com/PHPOffice/Math/issues",
- "source": "https://github.com/PHPOffice/Math/tree/0.1.0"
+ "issues": "https://github.com/php-gettext/Languages/issues",
+ "source": "https://github.com/php-gettext/Languages/tree/2.12.1"
},
- "time": "2023-09-25T12:08:20+00:00"
+ "funding": [
+ {
+ "url": "https://paypal.me/mlocati",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/mlocati",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-19T11:14:02+00:00"
},
{
- "name": "phpoffice/phpword",
- "version": "1.2.0",
+ "name": "gettext/translator",
+ "version": "v1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/PHPOffice/PHPWord.git",
- "reference": "e76b701ef538cb749641514fcbc31a68078550fa"
+ "url": "https://github.com/php-gettext/Translator.git",
+ "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/e76b701ef538cb749641514fcbc31a68078550fa",
- "reference": "e76b701ef538cb749641514fcbc31a68078550fa",
+ "url": "https://api.github.com/repos/php-gettext/Translator/zipball/8ae0ac79053bcb732a6c584cd86f7a82ef183161",
+ "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-json": "*",
- "ext-xml": "*",
- "php": "^7.1|^8.0",
- "phpoffice/math": "^0.1"
+ "php": "^7.2|^8.0"
},
"require-dev": {
- "dompdf/dompdf": "^2.0",
- "ext-gd": "*",
- "ext-libxml": "*",
- "ext-zip": "*",
- "friendsofphp/php-cs-fixer": "^3.3",
- "mpdf/mpdf": "^8.1",
- "phpmd/phpmd": "^2.13",
- "phpstan/phpstan-phpunit": "@stable",
- "phpunit/phpunit": ">=7.0",
- "symfony/process": "^4.4 || ^5.0",
- "tecnickcom/tcpdf": "^6.5"
+ "friendsofphp/php-cs-fixer": "^2.15",
+ "gettext/gettext": "^5.0.0",
+ "oscarotero/php-cs-fixer-config": "^1.0",
+ "phpunit/phpunit": "^8.0",
+ "squizlabs/php_codesniffer": "^3.0"
},
"suggest": {
- "dompdf/dompdf": "Allows writing PDF",
- "ext-gd2": "Allows adding images",
- "ext-xmlwriter": "Allows writing OOXML and ODF",
- "ext-xsl": "Allows applying XSL style sheet to headers, to main document part, and to footers of an OOXML template",
- "ext-zip": "Allows writing OOXML and ODF"
+ "gettext/gettext": "Is necessary to load and generate array files used by the translator"
},
"type": "library",
"autoload": {
"psr-4": {
- "PhpOffice\\PhpWord\\": "src/PhpWord"
+ "Gettext\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-3.0"
+ "MIT"
],
"authors": [
{
- "name": "Mark Baker"
- },
- {
- "name": "Gabriel Bull",
- "email": "me@gabrielbull.com",
- "homepage": "http://gabrielbull.com/"
- },
- {
- "name": "Franck Lefevre",
- "homepage": "https://rootslabs.net/blog/"
- },
- {
- "name": "Ivan Lanin",
- "homepage": "http://ivan.lanin.org"
- },
- {
- "name": "Roman Syroeshko",
- "homepage": "http://ru.linkedin.com/pub/roman-syroeshko/34/a53/994/"
- },
- {
- "name": "Antoine de Troostembergh"
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
}
],
- "description": "PHPWord - A pure PHP library for reading and writing word processing documents (OOXML, ODF, RTF, HTML, PDF)",
- "homepage": "https://phpoffice.github.io/PHPWord/",
+ "description": "Gettext translator functions",
+ "homepage": "https://github.com/php-gettext/Translator",
"keywords": [
- "ISO IEC 29500",
- "OOXML",
- "Office Open XML",
- "OpenDocument",
- "OpenXML",
- "PhpOffice",
- "PhpWord",
- "Rich Text Format",
- "WordprocessingML",
- "doc",
- "docx",
- "html",
- "odf",
- "odt",
- "office",
- "pdf",
+ "gettext",
+ "i18n",
"php",
- "reader",
- "rtf",
- "template",
- "template processor",
- "word",
- "writer"
+ "translator"
],
"support": {
- "issues": "https://github.com/PHPOffice/PHPWord/issues",
- "source": "https://github.com/PHPOffice/PHPWord/tree/1.2.0"
+ "email": "oom@oscarotero.com",
+ "issues": "https://github.com/php-gettext/Translator/issues",
+ "source": "https://github.com/php-gettext/Translator/tree/v1.2.1"
},
- "time": "2023-11-30T11:22:23+00:00"
+ "funding": [
+ {
+ "url": "https://paypal.me/oscarotero",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/oscarotero",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/misteroom",
+ "type": "patreon"
+ }
+ ],
+ "time": "2025-01-09T09:20:22+00:00"
},
{
- "name": "pimple/pimple",
- "version": "v3.5.0",
+ "name": "google/recaptcha",
+ "version": "1.3.1",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Pimple.git",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+ "url": "https://github.com/google/recaptcha.git",
+ "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+ "url": "https://api.github.com/repos/google/recaptcha/zipball/56522c261d2e8c58ba416c90f81a4cd9f2ed89b9",
+ "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1 || ^2.0"
+ "php": ">=8"
},
"require-dev": {
- "symfony/phpunit-bridge": "^5.4@dev"
+ "friendsofphp/php-cs-fixer": "^3.14",
+ "php-coveralls/php-coveralls": "^2.5",
+ "phpunit/phpunit": "^10"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.4.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
- "psr-0": {
- "Pimple": "src/"
+ "psr-4": {
+ "ReCaptcha\\": "src/ReCaptcha"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- }
+ "BSD-3-Clause"
],
- "description": "Pimple, a simple Dependency Injection Container",
- "homepage": "https://pimple.symfony.com",
+ "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.",
+ "homepage": "https://www.google.com/recaptcha/",
"keywords": [
- "container",
- "dependency injection"
+ "Abuse",
+ "captcha",
+ "recaptcha",
+ "spam"
],
"support": {
- "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
- },
- "time": "2021-10-28T11:13:42+00:00"
- },
- {
- "name": "plotly/plotly",
- "version": "2.29.1",
- "dist": {
- "type": "file",
- "url": "https://cdn.plot.ly/plotly-2.29.1.min.js",
- "shasum": "62b7c9478e01491b8d774300683cd8aac2d02a45"
- },
- "require": {
- "composer/installers": "~1.0"
- },
- "type": "vanilla-plugin",
- "extra": {
- "installer-name": "plotly"
+ "forum": "https://groups.google.com/forum/#!forum/recaptcha",
+ "issues": "https://github.com/google/recaptcha/issues",
+ "source": "https://github.com/google/recaptcha"
},
- "license": [
- "MIT"
- ],
- "homepage": "https://github.com/plotly/plotly.js"
+ "time": "2025-06-26T22:21:57+00:00"
},
{
- "name": "psr/container",
- "version": "2.0.2",
+ "name": "greenlion/php-sql-parser",
+ "version": "v4.7.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ "url": "https://github.com/greenlion/PHP-SQL-Parser.git",
+ "reference": "0cd49149efc5868db9c32d1a09558ea516892586"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "url": "https://api.github.com/repos/greenlion/PHP-SQL-Parser/zipball/0cd49149efc5868db9c32d1a09558ea516892586",
+ "reference": "0cd49149efc5868db9c32d1a09558ea516892586",
"shasum": ""
},
"require": {
- "php": ">=7.4.0"
+ "php": ">=5.3.2"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0.x-dev"
- }
+ "require-dev": {
+ "analog/analog": "^1.0.6",
+ "phpunit/phpunit": "^9.5.13",
+ "squizlabs/php_codesniffer": "^2.8.1"
},
+ "type": "library",
"autoload": {
- "psr-4": {
- "Psr\\Container\\": "src/"
+ "psr-0": {
+ "PHPSQLParser\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Justin Swanhart",
+ "email": "greenlion@gmail.com",
+ "homepage": "http://code.google.com/u/greenlion@gmail.com/",
+ "role": "Owner"
+ },
+ {
+ "name": "André Rothe",
+ "email": "phosco@gmx.de",
+ "homepage": "https://www.phosco.info",
+ "role": "Committer"
}
],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
+ "description": "A pure PHP SQL (non validating) parser w/ focus on MySQL dialect of SQL",
+ "homepage": "https://github.com/greenlion/PHP-SQL-Parser",
"keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
+ "creator",
+ "mysql",
+ "parser",
+ "sql"
],
"support": {
- "issues": "https://github.com/php-fig/container/issues",
- "source": "https://github.com/php-fig/container/tree/2.0.2"
+ "issues": "https://github.com/greenlion/PHP-SQL-Parser/issues",
+ "source": "https://github.com/greenlion/PHP-SQL-Parser"
},
- "time": "2021-11-05T16:47:00+00:00"
+ "time": "2024-12-02T12:14:07+00:00"
},
{
- "name": "psr/log",
- "version": "1.1.4",
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.1",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0",
+ "ralouphie/getallheaders": "^3.0"
+ },
+ "provide": {
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.8.2",
+ "http-interop/http-factory-tests": "0.9.0",
+ "phpunit/phpunit": "^8.5.39 || ^9.6.20"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "1.1.x-dev"
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
}
},
"autoload": {
"psr-4": {
- "Psr\\Log\\": "Psr/Log/"
+ "GuzzleHttp\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1751,147 +2091,177 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Graham Campbell",
+ "email": "hello@gjcampbell.co.uk",
+ "homepage": "https://github.com/GrahamCampbell"
+ },
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "George Mponos",
+ "email": "gmponos@gmail.com",
+ "homepage": "https://github.com/gmponos"
+ },
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com",
+ "homepage": "https://github.com/Nyholm"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://github.com/sagikazarmark"
+ },
+ {
+ "name": "Tobias Schultze",
+ "email": "webmaster@tubo-world.de",
+ "homepage": "https://github.com/Tobion"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
}
],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
+ "description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
- "log",
- "psr",
- "psr-3"
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.1"
},
- "time": "2021-05-03T11:20:27+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-27T12:30:47+00:00"
},
{
- "name": "robrichards/xmlseclibs",
- "version": "3.1.1",
+ "name": "ircmaxell/password-compat",
+ "version": "v1.0.4",
"source": {
"type": "git",
- "url": "https://github.com/robrichards/xmlseclibs.git",
- "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df"
+ "url": "https://github.com/ircmaxell/password_compat.git",
+ "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df",
- "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df",
+ "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/5c5cde8822a69545767f7c7f3058cb15ff84614c",
+ "reference": "5c5cde8822a69545767f7c7f3058cb15ff84614c",
"shasum": ""
},
- "require": {
- "ext-openssl": "*",
- "php": ">= 5.4"
+ "require-dev": {
+ "phpunit/phpunit": "4.*"
},
"type": "library",
"autoload": {
- "psr-4": {
- "RobRichards\\XMLSecLibs\\": "src"
- }
+ "files": [
+ "lib/password.php"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "BSD-3-Clause"
+ "MIT"
],
- "description": "A PHP library for XML Security",
- "homepage": "https://github.com/robrichards/xmlseclibs",
+ "authors": [
+ {
+ "name": "Anthony Ferrara",
+ "email": "ircmaxell@php.net",
+ "homepage": "http://blog.ircmaxell.com"
+ }
+ ],
+ "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash",
+ "homepage": "https://github.com/ircmaxell/password_compat",
"keywords": [
- "security",
- "signature",
- "xml",
- "xmldsig"
+ "hashing",
+ "password"
],
"support": {
- "issues": "https://github.com/robrichards/xmlseclibs/issues",
- "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1"
+ "issues": "https://github.com/ircmaxell/password_compat/issues",
+ "source": "https://github.com/ircmaxell/password_compat/tree/v1.0"
},
- "time": "2020-09-05T13:00:25+00:00"
+ "time": "2014-11-20T16:49:30+00:00"
},
{
- "name": "sencha/extjs-gpl",
- "version": "3.4.1.1",
+ "name": "jquery/jquery-min-file",
+ "version": "3.7.1",
"dist": {
- "type": "zip",
- "url": "https://cdn.sencha.com/ext/gpl/ext-3.4.1.1-gpl.zip",
- "shasum": "26734b47eae909ff7f8cd7de4cadfb3531bd3cdc"
+ "type": "file",
+ "url": "https://code.jquery.com/jquery-3.7.1.min.js",
+ "shasum": "ee48592d1fff952fcf06ce0b666ed4785493afdc"
},
"require": {
"composer/installers": "~1.0"
},
"type": "vanilla-plugin",
"extra": {
- "installer-name": "extjs"
+ "installer-name": "jquery"
},
"license": [
- "GPL-3.0"
+ "MIT"
],
- "homepage": "https://www.sencha.com/products/extjs"
+ "homepage": "https://jquery.com"
},
{
- "name": "silex/silex",
- "version": "v2.3.0",
+ "name": "justinrainbow/json-schema",
+ "version": "6.4.2",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Silex.git",
- "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131"
+ "url": "https://github.com/jsonrainbow/json-schema.git",
+ "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Silex/zipball/6bc31c1b8c4ef614a7115320fd2d3b958032f131",
- "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
+ "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "pimple/pimple": "^3.0",
- "symfony/event-dispatcher": "^4.0",
- "symfony/http-foundation": "^4.0",
- "symfony/http-kernel": "^4.0",
- "symfony/routing": "^4.0"
- },
- "replace": {
- "silex/api": "self.version",
- "silex/providers": "self.version"
+ "ext-json": "*",
+ "marc-mabe/php-enum": "^4.0",
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "doctrine/dbal": "^2.2",
- "monolog/monolog": "^1.4.1",
- "swiftmailer/swiftmailer": "^5",
- "symfony/asset": "^4.0",
- "symfony/browser-kit": "^4.0",
- "symfony/config": "^4.0",
- "symfony/css-selector": "^4.0",
- "symfony/debug": "^4.0",
- "symfony/doctrine-bridge": "^4.0",
- "symfony/dom-crawler": "^4.0",
- "symfony/expression-language": "^4.0",
- "symfony/finder": "^4.0",
- "symfony/form": "^4.0",
- "symfony/intl": "^4.0",
- "symfony/monolog-bridge": "^4.0",
- "symfony/options-resolver": "^4.0",
- "symfony/phpunit-bridge": "^3.2",
- "symfony/process": "^4.0",
- "symfony/security": "^4.0",
- "symfony/serializer": "^4.0",
- "symfony/translation": "^4.0",
- "symfony/twig-bridge": "^4.0",
- "symfony/validator": "^4.0",
- "symfony/var-dumper": "^4.0",
- "symfony/web-link": "^4.0",
- "twig/twig": "^2.0"
+ "friendsofphp/php-cs-fixer": "3.3.0",
+ "json-schema/json-schema-test-suite": "1.2.0",
+ "marc-mabe/php-enum-phpstan": "^2.0",
+ "phpspec/prophecy": "^1.19",
+ "phpstan/phpstan": "^1.12",
+ "phpunit/phpunit": "^8.5"
},
+ "bin": [
+ "bin/validate-json"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.3.x-dev"
+ "dev-master": "6.x-dev"
}
},
"autoload": {
"psr-4": {
- "Silex\\": "src/Silex"
+ "JsonSchema\\": "src/JsonSchema/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1900,295 +2270,4913 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Bruno Prieto Reis",
+ "email": "bruno.p.reis@gmail.com"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "justin.rainbow@gmail.com"
},
{
"name": "Igor Wiedler",
"email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "seroscho@googlemail.com"
}
],
- "description": "The PHP micro-framework based on the Symfony Components",
- "homepage": "http://silex.sensiolabs.org",
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/jsonrainbow/json-schema",
"keywords": [
- "microframework"
+ "json",
+ "schema"
],
"support": {
- "issues": "https://github.com/silexphp/Silex/issues",
- "source": "https://github.com/silexphp/Silex/tree/v2.3.0"
+ "issues": "https://github.com/jsonrainbow/json-schema/issues",
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2"
},
- "abandoned": "symfony/flex",
- "time": "2018-04-20T05:17:01+00:00"
+ "time": "2025-06-03T18:27:04+00:00"
},
{
- "name": "simplesamlphp/assert",
- "version": "v0.8.0",
+ "name": "kassner/log-parser",
+ "version": "2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/assert.git",
- "reference": "d3b0f38f4ae083822471c15e3c4a0401ddaeac73"
+ "url": "https://github.com/kassner/log-parser.git",
+ "reference": "6a573bd2985c810e3c459d762cabfad1666c37b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/d3b0f38f4ae083822471c15e3c4a0401ddaeac73",
- "reference": "d3b0f38f4ae083822471c15e3c4a0401ddaeac73",
+ "url": "https://api.github.com/repos/kassner/log-parser/zipball/6a573bd2985c810e3c459d762cabfad1666c37b4",
+ "reference": "6a573bd2985c810e3c459d762cabfad1666c37b4",
"shasum": ""
},
"require": {
- "ext-spl": "*",
- "php": "^7.4 || ^8.0",
- "webmozart/assert": "^1.11"
- },
- "require-dev": {
- "simplesamlphp/simplesamlphp-test-framework": "^1.2.1"
+ "php": ">=7.4.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "v0.8.x-dev"
- }
- },
"autoload": {
"psr-4": {
- "SimpleSAML\\Assert\\": "src/"
+ "Kassner\\LogParser\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-or-later"
+ "Apache-2.0"
],
"authors": [
{
- "name": "Tim van Dijen",
- "email": "tvdijen@gmail.com"
- },
- {
- "name": "Jaime Perez Crespo",
- "email": "jaimepc@gmail.com"
+ "name": "Rafael Kassner",
+ "email": "kassner@gmail.com",
+ "homepage": "https://www.kassner.com.br/",
+ "role": "Developer"
}
],
- "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+ "description": "PHP Log Parser Library",
+ "homepage": "http://github.com/kassner/log-parser",
+ "keywords": [
+ "apache",
+ "format",
+ "log",
+ "log-format",
+ "nginx",
+ "parser"
+ ],
"support": {
- "issues": "https://github.com/simplesamlphp/assert/issues",
- "source": "https://github.com/simplesamlphp/assert/tree/v0.8.0"
+ "issues": "https://github.com/kassner/log-parser/issues",
+ "source": "https://github.com/kassner/log-parser/tree/2.2.0"
},
- "time": "2022-09-20T20:18:55+00:00"
+ "time": "2024-08-20T20:01:20+00:00"
},
{
- "name": "simplesamlphp/composer-module-installer",
- "version": "v1.3.4",
+ "name": "laminas/laminas-code",
+ "version": "4.16.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/composer-module-installer.git",
- "reference": "36508ed9580a30c4d5ab0bb3c25c00d0b5d42946"
+ "url": "https://github.com/laminas/laminas-code.git",
+ "reference": "1793e78dad4108b594084d05d1fb818b85b110af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/36508ed9580a30c4d5ab0bb3c25c00d0b5d42946",
- "reference": "36508ed9580a30c4d5ab0bb3c25c00d0b5d42946",
+ "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1793e78dad4108b594084d05d1fb818b85b110af",
+ "reference": "1793e78dad4108b594084d05d1fb818b85b110af",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.1 || ^2.0",
- "php": "^7.4 || ^8.0",
- "simplesamlphp/assert": "^0.8.0 || ^1.0"
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
},
"require-dev": {
- "composer/composer": "^2.4",
- "simplesamlphp/simplesamlphp-test-framework": "^1.2.1"
+ "doctrine/annotations": "^2.0.1",
+ "ext-phar": "*",
+ "laminas/laminas-coding-standard": "^3.0.0",
+ "laminas/laminas-stdlib": "^3.18.0",
+ "phpunit/phpunit": "^10.5.37",
+ "psalm/plugin-phpunit": "^0.19.0",
+ "vimeo/psalm": "^5.15.0"
},
- "type": "composer-plugin",
- "extra": {
- "class": "SimpleSAML\\Composer\\ModuleInstallerPlugin"
+ "suggest": {
+ "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
+ "laminas/laminas-stdlib": "Laminas\\Stdlib component"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "SimpleSAML\\Composer\\": "src/"
+ "Laminas\\Code\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-only"
+ "BSD-3-Clause"
+ ],
+ "description": "Extensions to the PHP Reflection API, static code scanning, and code generation",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "code",
+ "laminas",
+ "laminasframework"
],
- "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.",
"support": {
- "issues": "https://github.com/simplesamlphp/composer-module-installer/issues",
- "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.3.4"
+ "chat": "https://laminas.dev/chat",
+ "docs": "https://docs.laminas.dev/laminas-code/",
+ "forum": "https://discourse.laminas.dev",
+ "issues": "https://github.com/laminas/laminas-code/issues",
+ "rss": "https://github.com/laminas/laminas-code/releases.atom",
+ "source": "https://github.com/laminas/laminas-code"
},
- "time": "2023-03-08T20:58:22+00:00"
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2024-11-20T13:15:13+00:00"
},
{
- "name": "simplesamlphp/saml2",
- "version": "v3.2.6",
+ "name": "marc-mabe/php-enum",
+ "version": "v4.7.1",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/saml2.git",
- "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751"
+ "url": "https://github.com/marc-mabe/php-enum.git",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/a56e46ef8e0c5245a4ca7facc3d308b493215751",
- "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751",
+ "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-openssl": "*",
- "ext-zlib": "*",
- "php": ">=5.4",
- "psr/log": "~1.0",
- "robrichards/xmlseclibs": "^3.0"
+ "ext-reflection": "*",
+ "php": "^7.1 | ^8.0"
},
"require-dev": {
- "mockery/mockery": "~0.9",
- "phpmd/phpmd": "~1.5",
- "phpunit/phpunit": "~4",
- "sebastian/phpcpd": "~1.4",
- "sensiolabs/security-checker": "~1.1",
- "squizlabs/php_codesniffer": "~1.4"
+ "phpbench/phpbench": "^0.16.10 || ^1.0.4",
+ "phpstan/phpstan": "^1.3.1",
+ "phpunit/phpunit": "^7.5.20 | ^8.5.22 | ^9.5.11",
+ "vimeo/psalm": "^4.17.0 | ^5.26.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "v3.1.x-dev"
+ "dev-3.x": "3.2-dev",
+ "dev-master": "4.7-dev"
}
},
"autoload": {
- "files": [
- "src/_autoload.php"
- ],
- "psr-0": {
- "SAML2\\": "src/"
+ "psr-4": {
+ "MabeEnum\\": "src/"
+ },
+ "classmap": [
+ "stubs/Stringable.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Marc Bennewitz",
+ "email": "dev@mabe.berlin",
+ "homepage": "https://mabe.berlin/",
+ "role": "Lead"
+ }
+ ],
+ "description": "Simple and fast implementation of enumerations with native PHP",
+ "homepage": "https://github.com/marc-mabe/php-enum",
+ "keywords": [
+ "enum",
+ "enum-map",
+ "enum-set",
+ "enumeration",
+ "enumerator",
+ "enummap",
+ "enumset",
+ "map",
+ "set",
+ "type",
+ "type-hint",
+ "typehint"
+ ],
+ "support": {
+ "issues": "https://github.com/marc-mabe/php-enum/issues",
+ "source": "https://github.com/marc-mabe/php-enum/tree/v4.7.1"
+ },
+ "time": "2024-11-28T04:54:44+00:00"
+ },
+ {
+ "name": "maxmind-db/reader",
+ "version": "v1.12.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
+ "reference": "815939e006b7e68062b540ec9e86aaa8be2b6ce4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/815939e006b7e68062b540ec9e86aaa8be2b6ce4",
+ "reference": "815939e006b7e68062b540ec9e86aaa8be2b6ce4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "conflict": {
+ "ext-maxminddb": "<1.11.1 || >=2.0.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "3.*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": ">=8.0.0,<10.0.0",
+ "squizlabs/php_codesniffer": "3.*"
+ },
+ "suggest": {
+ "ext-bcmath": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+ "ext-gmp": "bcmath or gmp is required for decoding larger integers with the pure PHP decoder",
+ "ext-maxminddb": "A C-based database decoder that provides significantly faster lookups"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "MaxMind\\Db\\": "src/MaxMind/Db"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-or-later"
+ "Apache-2.0"
],
"authors": [
{
- "name": "Andreas Åkre Solberg",
- "email": "andreas.solberg@uninett.no"
+ "name": "Gregory J. Oschwald",
+ "email": "goschwald@maxmind.com",
+ "homepage": "https://www.maxmind.com/"
}
],
- "description": "SAML2 PHP library from SimpleSAMLphp",
+ "description": "MaxMind DB Reader API",
+ "homepage": "https://github.com/maxmind/MaxMind-DB-Reader-php",
+ "keywords": [
+ "database",
+ "geoip",
+ "geoip2",
+ "geolocation",
+ "maxmind"
+ ],
"support": {
- "issues": "https://github.com/simplesamlphp/saml2/issues",
- "source": "https://github.com/simplesamlphp/saml2/tree/master"
+ "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
+ "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.1"
},
- "time": "2018-11-20T11:11:28+00:00"
+ "time": "2025-05-05T20:56:32+00:00"
},
{
- "name": "simplesamlphp/simplesamlphp",
- "version": "1.16.3",
+ "name": "maxmind/web-service-common",
+ "version": "v0.10.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/simplesamlphp.git",
- "reference": "abc208dbc9c94eb8bab8266825ca035cc96072ba"
+ "url": "https://github.com/maxmind/web-service-common-php.git",
+ "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/abc208dbc9c94eb8bab8266825ca035cc96072ba",
- "reference": "abc208dbc9c94eb8bab8266825ca035cc96072ba",
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
+ "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
"shasum": ""
},
"require": {
- "ext-date": "*",
- "ext-dom": "*",
- "ext-hash": "*",
+ "composer/ca-bundle": "^1.0.3",
+ "ext-curl": "*",
"ext-json": "*",
- "ext-mbstring": "*",
- "ext-openssl": "*",
- "ext-pcre": "*",
- "ext-spl": "*",
- "ext-zlib": "*",
- "gettext/gettext": "^3.5",
- "jaimeperez/twig-configurable-i18n": "^1.2",
- "php": ">=5.4",
- "robrichards/xmlseclibs": "^3.0",
- "simplesamlphp/saml2": "~3.2.2",
- "twig/twig": "~1.0",
- "whitehat101/apr1-md5": "~1.0"
+ "php": ">=8.1"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "^2.2",
- "mikey179/vfsstream": "~1.6",
- "phpunit/phpunit": "~4.8.35"
+ "friendsofphp/php-cs-fixer": "3.*",
+ "phpstan/phpstan": "*",
+ "phpunit/phpunit": "^8.0 || ^9.0",
+ "squizlabs/php_codesniffer": "3.*"
},
- "type": "project",
+ "type": "library",
"autoload": {
- "files": [
- "lib/_autoload_modules.php"
- ],
"psr-4": {
- "SimpleSAML\\": "lib/SimpleSAML"
+ "MaxMind\\Exception\\": "src/Exception",
+ "MaxMind\\WebService\\": "src/WebService"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Gregory Oschwald",
+ "email": "goschwald@maxmind.com"
}
+ ],
+ "description": "Internal MaxMind Web Service API",
+ "homepage": "https://github.com/maxmind/web-service-common-php",
+ "support": {
+ "issues": "https://github.com/maxmind/web-service-common-php/issues",
+ "source": "https://github.com/maxmind/web-service-common-php/tree/v0.10.0"
+ },
+ "time": "2024-11-14T23:14:52+00:00"
+ },
+ {
+ "name": "moment/moment-min-file",
+ "version": "2.13.0",
+ "dist": {
+ "type": "file",
+ "url": "https://raw.githubusercontent.com/moment/moment/2.13.0/min/moment.min.js",
+ "shasum": "a8ca7eea2616fa92e2e85ba6291af6ea012fd190"
+ },
+ "require": {
+ "composer/installers": "~1.0"
+ },
+ "type": "vanilla-plugin",
+ "extra": {
+ "installer-name": "moment"
+ },
+ "license": [
+ "MIT"
+ ],
+ "homepage": "https://momentjs.com"
+ },
+ {
+ "name": "moment/moment-timezone-min-file",
+ "version": "0.5.4",
+ "dist": {
+ "type": "file",
+ "url": "https://raw.githubusercontent.com/moment/moment-timezone/0.5.4/builds/moment-timezone-with-data.min.js",
+ "shasum": "39b9fccc20863c23f19524a756d75cfef2ff9cbe"
+ },
+ "require": {
+ "composer/installers": "~1.0"
+ },
+ "type": "vanilla-plugin",
+ "extra": {
+ "installer-name": "moment-timezone"
+ },
+ "license": [
+ "MIT"
+ ],
+ "homepage": "https://momentjs.com"
+ },
+ {
+ "name": "mongodb/mongodb",
+ "version": "1.18.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mongodb/mongo-php-library.git",
+ "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/d421c418ef56a96f3dfa6b2828f936df6848ccf9",
+ "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": "^2.0",
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-mongodb": "^1.18.0",
+ "php": "^7.4 || ^8.0",
+ "psr/log": "^1.1.4|^2|^3",
+ "symfony/polyfill-php80": "^1.27",
+ "symfony/polyfill-php81": "^1.27"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^12.0",
+ "rector/rector": "^0.19",
+ "squizlabs/php_codesniffer": "^3.7",
+ "symfony/phpunit-bridge": "^5.2",
+ "vimeo/psalm": "^5.13"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.18.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "MongoDB\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Braun",
+ "email": "andreas.braun@mongodb.com"
+ },
+ {
+ "name": "Jeremy Mikola",
+ "email": "jmikola@gmail.com"
+ },
+ {
+ "name": "Jérôme Tamarelle",
+ "email": "jerome.tamarelle@mongodb.com"
+ }
+ ],
+ "description": "MongoDB driver library",
+ "homepage": "https://jira.mongodb.org/browse/PHPLIB",
+ "keywords": [
+ "database",
+ "driver",
+ "mongodb",
+ "persistence"
+ ],
+ "support": {
+ "issues": "https://github.com/mongodb/mongo-php-library/issues",
+ "source": "https://github.com/mongodb/mongo-php-library/tree/1.18.0"
+ },
+ "time": "2024-03-27T17:04:50+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "3.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
+ },
+ "provide": {
+ "psr/log-implementation": "3.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7 || ^8",
+ "ext-json": "*",
+ "graylog2/gelf-php": "^1.4.2 || ^2.0",
+ "guzzlehttp/guzzle": "^7.4.5",
+ "guzzlehttp/psr7": "^2.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4 || ^3",
+ "php-console/php-console": "^3.1.8",
+ "phpstan/phpstan": "^2",
+ "phpstan/phpstan-deprecation-rules": "^2",
+ "phpstan/phpstan-strict-rules": "^2",
+ "phpunit/phpunit": "^10.5.17 || ^11.0.7",
+ "predis/predis": "^1.1 || ^2",
+ "rollbar/rollbar": "^4.0",
+ "ruflin/elastica": "^7 || ^8",
+ "symfony/mailer": "^5.4 || ^6",
+ "symfony/mime": "^5.4 || ^6"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "ext-openssl": "Required to send log messages using SSL",
+ "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "support": {
+ "issues": "https://github.com/Seldaek/monolog/issues",
+ "source": "https://github.com/Seldaek/monolog/tree/3.9.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-24T10:02:05+00:00"
+ },
+ {
+ "name": "nyholm/psr7",
+ "version": "1.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Nyholm/psr7.git",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0"
+ },
+ "provide": {
+ "php-http/message-factory-implementation": "1.0",
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "http-interop/http-factory-tests": "^0.9",
+ "php-http/message-factory": "^1.0",
+ "php-http/psr7-integration-tests": "^1.0",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.4",
+ "symfony/error-handler": "^4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.8-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
+ }
+ ],
+ "description": "A fast PHP7 implementation of PSR-7",
+ "homepage": "https://tnyholm.se",
+ "keywords": [
+ "psr-17",
+ "psr-7"
+ ],
+ "support": {
+ "issues": "https://github.com/Nyholm/psr7/issues",
+ "source": "https://github.com/Nyholm/psr7/tree/1.8.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-09T07:06:30+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
+ },
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.1",
+ "ext-filter": "*",
+ "php": "^7.4 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.7",
+ "phpstan/phpdoc-parser": "^1.7|^2.0",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.5 || ~1.6.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-webmozart-assert": "^1.2",
+ "phpunit/phpunit": "^9.5",
+ "psalm/phar": "^5.26"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
+ },
+ "time": "2025-04-13T19:20:35+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*",
+ "phpbench/phpbench": "^1.2",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^9.5",
+ "rector/rector": "^0.13.9",
+ "vimeo/psalm": "^4.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "support": {
+ "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
+ "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.10.0"
+ },
+ "time": "2024-11-09T15:12:26+00:00"
+ },
+ {
+ "name": "phplang/scope-exit",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phplang/scope-exit.git",
+ "reference": "239b73abe89f9414aa85a7ca075ec9445629192b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phplang/scope-exit/zipball/239b73abe89f9414aa85a7ca075ec9445629192b",
+ "reference": "239b73abe89f9414aa85a7ca075ec9445629192b",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpLang\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD"
+ ],
+ "authors": [
+ {
+ "name": "Sara Golemon",
+ "email": "pollita@php.net",
+ "homepage": "https://twitter.com/SaraMG",
+ "role": "Developer"
+ }
+ ],
+ "description": "Emulation of SCOPE_EXIT construct from C++",
+ "homepage": "https://github.com/phplang/scope-exit",
+ "keywords": [
+ "cleanup",
+ "exit",
+ "scope"
+ ],
+ "support": {
+ "issues": "https://github.com/phplang/scope-exit/issues",
+ "source": "https://github.com/phplang/scope-exit/tree/master"
+ },
+ "time": "2016-09-17T00:15:18+00:00"
+ },
+ {
+ "name": "phpmailer/phpmailer",
+ "version": "v6.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPMailer/PHPMailer.git",
+ "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144",
+ "reference": "bf74d75a1fde6beaa34a0ddae2ec5fce0f72a144",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-filter": "*",
+ "ext-hash": "*",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+ "doctrine/annotations": "^1.2.6 || ^1.13.3",
+ "php-parallel-lint/php-console-highlighter": "^1.0.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3.2",
+ "phpcompatibility/php-compatibility": "^9.3.5",
+ "roave/security-advisories": "dev-latest",
+ "squizlabs/php_codesniffer": "^3.7.2",
+ "yoast/phpunit-polyfills": "^1.0.4"
+ },
+ "suggest": {
+ "decomplexity/SendOauth2": "Adapter for using XOAUTH2 authentication",
+ "ext-mbstring": "Needed to send email in multibyte encoding charset or decode encoded addresses",
+ "ext-openssl": "Needed for secure SMTP sending and DKIM signing",
+ "greew/oauth2-azure-provider": "Needed for Microsoft Azure XOAUTH2 authentication",
+ "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication",
+ "league/oauth2-google": "Needed for Google XOAUTH2 authentication",
+ "psr/log": "For optional PSR-3 debug logging",
+ "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)",
+ "thenetworg/oauth2-azure": "Needed for Microsoft XOAUTH2 authentication"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPMailer\\PHPMailer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-only"
+ ],
+ "authors": [
+ {
+ "name": "Marcus Bointon",
+ "email": "phpmailer@synchromedia.co.uk"
+ },
+ {
+ "name": "Jim Jagielski",
+ "email": "jimjag@gmail.com"
+ },
+ {
+ "name": "Andy Prevost",
+ "email": "codeworxtech@users.sourceforge.net"
+ },
+ {
+ "name": "Brent R. Matzelle"
+ }
+ ],
+ "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+ "support": {
+ "issues": "https://github.com/PHPMailer/PHPMailer/issues",
+ "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/Synchro",
+ "type": "github"
+ }
+ ],
+ "time": "2025-04-24T15:19:31+00:00"
+ },
+ {
+ "name": "phpoffice/math",
+ "version": "0.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/Math.git",
+ "reference": "fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPOffice/Math/zipball/fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a",
+ "reference": "fc31c8f57a7a81f962cbf389fd89f4d9d06fc99a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xml": "*",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.88 || ^1.0.0",
+ "phpunit/phpunit": "^7.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpOffice\\Math\\": "src/Math/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Progi1984",
+ "homepage": "https://lefevre.dev"
+ }
+ ],
+ "description": "Math - Manipulate Math Formula",
+ "homepage": "https://phpoffice.github.io/Math/",
+ "keywords": [
+ "MathML",
+ "officemathml",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPOffice/Math/issues",
+ "source": "https://github.com/PHPOffice/Math/tree/0.3.0"
+ },
+ "time": "2025-05-29T08:31:49+00:00"
+ },
+ {
+ "name": "phpoffice/phpword",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/PHPWord.git",
+ "reference": "6d75328229bc93790b37e93741adf70646cea958"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/6d75328229bc93790b37e93741adf70646cea958",
+ "reference": "6d75328229bc93790b37e93741adf70646cea958",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-gd": "*",
+ "ext-json": "*",
+ "ext-xml": "*",
+ "ext-zip": "*",
+ "php": "^7.1|^8.0",
+ "phpoffice/math": "^0.3"
+ },
+ "require-dev": {
+ "dompdf/dompdf": "^2.0 || ^3.0",
+ "ext-libxml": "*",
+ "friendsofphp/php-cs-fixer": "^3.3",
+ "mpdf/mpdf": "^7.0 || ^8.0",
+ "phpmd/phpmd": "^2.13",
+ "phpstan/phpstan": "^0.12.88 || ^1.0.0",
+ "phpstan/phpstan-phpunit": "^1.0 || ^2.0",
+ "phpunit/phpunit": ">=7.0",
+ "symfony/process": "^4.4 || ^5.0",
+ "tecnickcom/tcpdf": "^6.5"
+ },
+ "suggest": {
+ "dompdf/dompdf": "Allows writing PDF",
+ "ext-xmlwriter": "Allows writing OOXML and ODF",
+ "ext-xsl": "Allows applying XSL style sheet to headers, to main document part, and to footers of an OOXML template"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PhpOffice\\PhpWord\\": "src/PhpWord"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-only"
+ ],
+ "authors": [
+ {
+ "name": "Mark Baker"
+ },
+ {
+ "name": "Gabriel Bull",
+ "email": "me@gabrielbull.com",
+ "homepage": "http://gabrielbull.com/"
+ },
+ {
+ "name": "Franck Lefevre",
+ "homepage": "https://rootslabs.net/blog/"
+ },
+ {
+ "name": "Ivan Lanin",
+ "homepage": "http://ivan.lanin.org"
+ },
+ {
+ "name": "Roman Syroeshko",
+ "homepage": "http://ru.linkedin.com/pub/roman-syroeshko/34/a53/994/"
+ },
+ {
+ "name": "Antoine de Troostembergh"
+ }
+ ],
+ "description": "PHPWord - A pure PHP library for reading and writing word processing documents (OOXML, ODF, RTF, HTML, PDF)",
+ "homepage": "https://phpoffice.github.io/PHPWord/",
+ "keywords": [
+ "ISO IEC 29500",
+ "OOXML",
+ "Office Open XML",
+ "OpenDocument",
+ "OpenXML",
+ "PhpOffice",
+ "PhpWord",
+ "Rich Text Format",
+ "WordprocessingML",
+ "doc",
+ "docx",
+ "html",
+ "odf",
+ "odt",
+ "office",
+ "pdf",
+ "php",
+ "reader",
+ "rtf",
+ "template",
+ "template processor",
+ "word",
+ "writer"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPOffice/PHPWord/issues",
+ "source": "https://github.com/PHPOffice/PHPWord/tree/1.4.0"
+ },
+ "time": "2025-06-05T10:32:36+00:00"
+ },
+ {
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^2.0",
+ "nikic/php-parser": "^5.3.0",
+ "php-parallel-lint/php-parallel-lint": "^1.2",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
+ "phpunit/phpunit": "^9.6",
+ "symfony/process": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
+ "support": {
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0"
+ },
+ "time": "2025-07-13T07:04:09+00:00"
+ },
+ {
+ "name": "plotly/plotly",
+ "version": "2.29.1",
+ "dist": {
+ "type": "file",
+ "url": "https://cdn.plot.ly/plotly-2.29.1.min.js",
+ "shasum": "62b7c9478e01491b8d774300683cd8aac2d02a45"
+ },
+ "require": {
+ "composer/installers": "~1.0"
+ },
+ "type": "vanilla-plugin",
+ "extra": {
+ "installer-name": "plotly"
+ },
+ "license": [
+ "MIT"
+ ],
+ "homepage": "https://github.com/plotly/plotly.js"
+ },
+ {
+ "name": "psr/cache",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/cache/tree/3.0.0"
+ },
+ "time": "2021-02-03T23:26:27+00:00"
+ },
+ {
+ "name": "psr/clock",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/clock.git",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Clock\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for reading the clock.",
+ "homepage": "https://github.com/php-fig/clock",
+ "keywords": [
+ "clock",
+ "now",
+ "psr",
+ "psr-20",
+ "time"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/clock/issues",
+ "source": "https://github.com/php-fig/clock/tree/1.0.0"
+ },
+ "time": "2022-11-25T14:36:26+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/container/issues",
+ "source": "https://github.com/php-fig/container/tree/2.0.2"
+ },
+ "time": "2021-11-05T16:47:00+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "support": {
+ "issues": "https://github.com/php-fig/event-dispatcher/issues",
+ "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0"
+ },
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory"
+ },
+ "time": "2024-04-15T12:06:14+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/log/tree/3.0.2"
+ },
+ "time": "2024-09-11T13:17:53+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "robrichards/xmlseclibs",
+ "version": "3.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/robrichards/xmlseclibs.git",
+ "reference": "2bdfd742624d739dfadbd415f00181b4a77aaf07"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/2bdfd742624d739dfadbd415f00181b4a77aaf07",
+ "reference": "2bdfd742624d739dfadbd415f00181b4a77aaf07",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "php": ">= 5.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "RobRichards\\XMLSecLibs\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "A PHP library for XML Security",
+ "homepage": "https://github.com/robrichards/xmlseclibs",
+ "keywords": [
+ "security",
+ "signature",
+ "xml",
+ "xmldsig"
+ ],
+ "support": {
+ "issues": "https://github.com/robrichards/xmlseclibs/issues",
+ "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.3"
+ },
+ "time": "2024-11-20T21:13:56+00:00"
+ },
+ {
+ "name": "sencha/extjs-gpl",
+ "version": "3.4.1.1",
+ "dist": {
+ "type": "zip",
+ "url": "https://cdn.sencha.com/ext/gpl/ext-3.4.1.1-gpl.zip",
+ "shasum": "26734b47eae909ff7f8cd7de4cadfb3531bd3cdc"
+ },
+ "require": {
+ "composer/installers": "~1.0"
+ },
+ "type": "vanilla-plugin",
+ "extra": {
+ "installer-name": "extjs"
+ },
+ "license": [
+ "GPL-3.0"
+ ],
+ "homepage": "https://www.sencha.com/products/extjs"
+ },
+ {
+ "name": "simplesamlphp/assert",
+ "version": "v1.8.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/assert.git",
+ "reference": "b551f50399540172f387d97b2e7246e6c352154d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/b551f50399540172f387d97b2e7246e6c352154d",
+ "reference": "b551f50399540172f387d97b2e7246e6c352154d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-date": "*",
+ "ext-filter": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "guzzlehttp/psr7": "~2.7.1",
+ "php": "^8.1",
+ "webmozart/assert": "~1.11.0"
+ },
+ "require-dev": {
+ "ext-intl": "*",
+ "simplesamlphp/simplesamlphp-test-framework": "~1.9.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "v1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Tim van Dijen",
+ "email": "tvdijen@gmail.com"
+ },
+ {
+ "name": "Jaime Perez Crespo",
+ "email": "jaimepc@gmail.com"
+ }
+ ],
+ "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/assert/issues",
+ "source": "https://github.com/simplesamlphp/assert/tree/v1.8.2"
+ },
+ "time": "2025-06-28T12:57:30+00:00"
+ },
+ {
+ "name": "simplesamlphp/composer-module-installer",
+ "version": "v1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/composer-module-installer.git",
+ "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/edb2155d200e2a208816d06f42cfa78bfd9e7cf4",
+ "reference": "edb2155d200e2a208816d06f42cfa78bfd9e7cf4",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.6",
+ "php": "^8.1",
+ "simplesamlphp/assert": "^1.6"
+ },
+ "require-dev": {
+ "composer/composer": "^2.8.3",
+ "simplesamlphp/simplesamlphp-test-framework": "^1.8.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "SimpleSAML\\Composer\\ModuleInstallerPlugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\Composer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-only"
+ ],
+ "description": "A Composer plugin that allows installing SimpleSAMLphp modules through Composer.",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/composer-module-installer/issues",
+ "source": "https://github.com/simplesamlphp/composer-module-installer/tree/v1.4.0"
+ },
+ "time": "2024-12-08T16:57:03+00:00"
+ },
+ {
+ "name": "simplesamlphp/composer-xmlprovider-installer",
+ "version": "v1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/composer-xmlprovider-installer.git",
+ "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/composer-xmlprovider-installer/zipball/3d882187b5b0b404c381a2e4d17498ca4b2785b3",
+ "reference": "3d882187b5b0b404c381a2e4d17498ca4b2785b3",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.0",
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "composer/composer": "^2.4",
+ "simplesamlphp/simplesamlphp-test-framework": "^1.5.4"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "SimpleSAML\\Composer\\XMLProvider\\XMLProviderInstallerPlugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\Composer\\XMLProvider\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-only"
+ ],
+ "description": "A composer plugin that will auto-generate a classmap with all classes that implement SerializableElementInterface.",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/composer-xmlprovider-installer/issues",
+ "source": "https://github.com/simplesamlphp/composer-xmlprovider-installer/tree/v1.0.2"
+ },
+ "time": "2025-06-28T18:54:25+00:00"
+ },
+ {
+ "name": "simplesamlphp/saml2",
+ "version": "v5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/saml2.git",
+ "reference": "d23dce11ac5a9b84a37a283ea7fbb0d780771e6c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/d23dce11ac5a9b84a37a283ea7fbb0d780771e6c",
+ "reference": "d23dce11ac5a9b84a37a283ea7fbb0d780771e6c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-filter": "*",
+ "ext-libxml": "*",
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "ext-zlib": "*",
+ "nyholm/psr7": "~1.8.2",
+ "php": "^8.1",
+ "psr/clock": "~1.0.0",
+ "psr/http-message": "~2.0",
+ "psr/log": "~2.3.1 || ~3.0.0",
+ "simplesamlphp/assert": "~1.8.1",
+ "simplesamlphp/xml-common": "~1.25.0",
+ "simplesamlphp/xml-security": "~1.13.4",
+ "simplesamlphp/xml-soap": "~1.7.0"
+ },
+ "require-dev": {
+ "beste/clock": "~3.0.0",
+ "ext-intl": "*",
+ "mockery/mockery": "~1.6.12",
+ "simplesamlphp/composer-xmlprovider-installer": "~1.0.2",
+ "simplesamlphp/simplesamlphp-test-framework": "~1.9.2"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "v5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\SAML2\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Åkre Solberg",
+ "email": "andreas.solberg@uninett.no"
+ }
+ ],
+ "description": "SAML2 PHP library from SimpleSAMLphp",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/saml2/issues",
+ "source": "https://github.com/simplesamlphp/saml2/tree/v5.0.2"
+ },
+ "time": "2025-07-01T19:07:40+00:00"
+ },
+ {
+ "name": "simplesamlphp/saml2-legacy",
+ "version": "v4.18.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/saml2-legacy.git",
+ "reference": "9bbf43a5ace9c8e5107dad3a613b014b456ecd56"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/saml2-legacy/zipball/9bbf43a5ace9c8e5107dad3a613b014b456ecd56",
+ "reference": "9bbf43a5ace9c8e5107dad3a613b014b456ecd56",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-openssl": "*",
+ "ext-zlib": "*",
+ "php": ">=7.1 || ^8.0",
+ "psr/log": "~1.1 || ^2.0 || ^3.0",
+ "robrichards/xmlseclibs": "^3.1.1",
+ "webmozart/assert": "^1.9"
+ },
+ "conflict": {
+ "robrichards/xmlseclibs": "3.1.2"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.3",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
+ "sebastian/phpcpd": "~4.1 || ^5.0 || ^6.0",
+ "simplesamlphp/simplesamlphp-test-framework": "~0.1.0",
+ "squizlabs/php_codesniffer": "~3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "v4.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SAML2\\": "src/SAML2"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Åkre Solberg",
+ "email": "andreas.solberg@uninett.no"
+ }
+ ],
+ "description": "SAML2 PHP library from SimpleSAMLphp",
+ "support": {
+ "source": "https://github.com/simplesamlphp/saml2-legacy/tree/v4.18.1"
+ },
+ "time": "2025-03-16T11:50:02+00:00"
+ },
+ {
+ "name": "simplesamlphp/simplesamlphp",
+ "version": "v2.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/simplesamlphp.git",
+ "reference": "d791ed73656102f4d553f7e0335cc6a528b1c2dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/d791ed73656102f4d553f7e0335cc6a528b1c2dd",
+ "reference": "d791ed73656102f4d553f7e0335cc6a528b1c2dd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "ext-session": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "ext-zlib": "*",
+ "gettext/gettext": "^5.7",
+ "gettext/translator": "^1.1",
+ "php": "^8.1",
+ "phpmailer/phpmailer": "^6.8",
+ "psr/log": "^3.0",
+ "simplesamlphp/assert": "^1.1",
+ "simplesamlphp/composer-module-installer": "^1.3",
+ "simplesamlphp/saml2": "^5.0.0",
+ "simplesamlphp/saml2-legacy": "^4.18.1",
+ "simplesamlphp/simplesamlphp-assets-base": "~2.3.0",
+ "simplesamlphp/xml-security": "^1.7",
+ "symfony/cache": "^6.4",
+ "symfony/config": "^6.4",
+ "symfony/console": "^6.4",
+ "symfony/dependency-injection": "^6.4",
+ "symfony/filesystem": "^6.4",
+ "symfony/finder": "^6.4",
+ "symfony/framework-bundle": "^6.4",
+ "symfony/http-foundation": "^6.4",
+ "symfony/http-kernel": "^6.4",
+ "symfony/intl": "^6.4",
+ "symfony/password-hasher": "^6.4",
+ "symfony/polyfill-intl-icu": "^1.28",
+ "symfony/routing": "^6.4",
+ "symfony/translation-contracts": "^3.0",
+ "symfony/twig-bridge": "^6.4",
+ "symfony/var-exporter": "^6.4",
+ "symfony/yaml": "^6.4",
+ "twig/intl-extra": "^3.7",
+ "twig/twig": "^3.14.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "ext-pdo_sqlite": "*",
+ "gettext/php-scanner": "1.3.1",
+ "mikey179/vfsstream": "~1.6",
+ "predis/predis": "^2.2",
+ "simplesamlphp/simplesamlphp-test-framework": "^1.9.2",
+ "symfony/translation": "^6.4"
+ },
+ "suggest": {
+ "ext-curl": "Needed in order to check for updates automatically",
+ "ext-intl": "Needed if translations for non-English languages are required.",
+ "ext-ldap": "Needed if an LDAP backend is used",
+ "ext-memcache": "Needed if a Memcache server is used to store session information",
+ "ext-mysql": "Needed if a MySQL backend is used, either for authentication or to store session information",
+ "ext-pdo": "Needed if a database backend is used, either for authentication or to store session information",
+ "ext-pgsql": "Needed if a PostgreSQL backend is used, either for authentication or to store session information",
+ "predis/predis": "Needed if a Redis server is used to store session information"
+ },
+ "type": "project",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5.0.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/_autoload_modules.php"
+ ],
+ "psr-4": {
+ "SimpleSAML\\": "src/SimpleSAML",
+ "SimpleSAML\\Module\\core\\": "modules/core/src",
+ "SimpleSAML\\Module\\cron\\": "modules/cron/src",
+ "SimpleSAML\\Module\\saml\\": "modules/saml/src",
+ "SimpleSAML\\Module\\admin\\": "modules/admin/src",
+ "SimpleSAML\\Module\\multiauth\\": "modules/multiauth/src",
+ "SimpleSAML\\Module\\exampleauth\\": "modules/exampleauth/src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Andreas Åkre Solberg",
+ "email": "andreas.solberg@uninett.no"
+ },
+ {
+ "name": "Olav Morken",
+ "email": "olav.morken@uninett.no"
+ },
+ {
+ "name": "Jaime Perez",
+ "email": "jaime.perez@uninett.no"
+ }
+ ],
+ "description": "A PHP implementation of a SAML 2.0 service provider and identity provider.",
+ "homepage": "https://simplesamlphp.org",
+ "keywords": [
+ "SAML2",
+ "idp",
+ "oauth",
+ "shibboleth",
+ "sp",
+ "ws-federation"
+ ],
+ "support": {
+ "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
+ "source": "https://github.com/simplesamlphp/simplesamlphp"
+ },
+ "time": "2025-06-04T13:10:38+00:00"
+ },
+ {
+ "name": "simplesamlphp/simplesamlphp-assets-base",
+ "version": "v2.3.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/simplesamlphp-assets-base.git",
+ "reference": "39ac268fb1c49333a188df6094b69e28e35150f6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp-assets-base/zipball/39ac268fb1c49333a188df6094b69e28e35150f6",
+ "reference": "39ac268fb1c49333a188df6094b69e28e35150f6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1",
+ "simplesamlphp/composer-module-installer": "^1.3.4"
+ },
+ "type": "simplesamlphp-module",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Tim van Dijen",
+ "email": "tvdijen@gmail.com"
+ }
+ ],
+ "description": "Assets for the SimpleSAMLphp main repository",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/simplesamlphp-assets-base/issues",
+ "source": "https://github.com/simplesamlphp/simplesamlphp-assets-base/tree/v2.3.10"
+ },
+ "time": "2025-07-20T01:44:13+00:00"
+ },
+ {
+ "name": "simplesamlphp/xml-common",
+ "version": "v1.25.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/xml-common.git",
+ "reference": "999603aa521d91e17b562bb0b498513af80eb190"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/xml-common/zipball/999603aa521d91e17b562bb0b498513af80eb190",
+ "reference": "999603aa521d91e17b562bb0b498513af80eb190",
+ "shasum": ""
+ },
+ "require": {
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-filter": "*",
+ "ext-libxml": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "php": "^8.1",
+ "simplesamlphp/assert": "~1.8.1",
+ "simplesamlphp/composer-xmlprovider-installer": "~1.0.2",
+ "symfony/finder": "~6.4.0"
+ },
+ "require-dev": {
+ "simplesamlphp/simplesamlphp-test-framework": "~1.9.2"
+ },
+ "type": "simplesamlphp-xmlprovider",
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\XML\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Jaime Perez",
+ "email": "jaime.perez@uninett.no"
+ },
+ {
+ "name": "Tim van Dijen",
+ "email": "tvdijen@gmail.com"
+ }
+ ],
+ "description": "A library with classes and utilities for handling XML structures.",
+ "homepage": "http://simplesamlphp.org",
+ "keywords": [
+ "saml",
+ "xml"
+ ],
+ "support": {
+ "issues": "https://github.com/simplesamlphp/xml-common/issues",
+ "source": "https://github.com/simplesamlphp/xml-common"
+ },
+ "time": "2025-06-29T13:05:44+00:00"
+ },
+ {
+ "name": "simplesamlphp/xml-security",
+ "version": "v1.13.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/xml-security.git",
+ "reference": "f6f32a3c2c6b398408d5bccc9d59445edc1cb67d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/xml-security/zipball/f6f32a3c2c6b398408d5bccc9d59445edc1cb67d",
+ "reference": "f6f32a3c2c6b398408d5bccc9d59445edc1cb67d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-hash": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "php": "^8.1",
+ "simplesamlphp/assert": "~1.8.1",
+ "simplesamlphp/xml-common": "~1.25.0"
+ },
+ "require-dev": {
+ "simplesamlphp/simplesamlphp-test-framework": "~1.9.2"
+ },
+ "type": "simplesamlphp-xmlprovider",
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\XMLSecurity\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Jaime Perez Crespo",
+ "email": "jaime.perez@uninett.no",
+ "role": "Maintainer"
+ },
+ {
+ "name": "Tim van Dijen",
+ "email": "tvdijen@gmail.com",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "SimpleSAMLphp library for XML Security",
+ "homepage": "https://github.com/simplesamlphp/xml-security",
+ "keywords": [
+ "security",
+ "signature",
+ "xml",
+ "xmldsig"
+ ],
+ "support": {
+ "issues": "https://github.com/simplesamlphp/xml-security/issues",
+ "source": "https://github.com/simplesamlphp/xml-security/tree/v1.13.7"
+ },
+ "time": "2025-06-29T13:07:27+00:00"
+ },
+ {
+ "name": "simplesamlphp/xml-soap",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/simplesamlphp/xml-soap.git",
+ "reference": "ca1ee4ea29c62fa66fc30d040b4013b4543f4f76"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/simplesamlphp/xml-soap/zipball/ca1ee4ea29c62fa66fc30d040b4013b4543f4f76",
+ "reference": "ca1ee4ea29c62fa66fc30d040b4013b4543f4f76",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-pcre": "*",
+ "php": "^8.1",
+ "simplesamlphp/assert": "~1.8.1",
+ "simplesamlphp/xml-common": "~1.25.0"
+ },
+ "require-dev": {
+ "simplesamlphp/simplesamlphp-test-framework": "~1.9.2"
+ },
+ "type": "simplesamlphp-xmlprovider",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "v2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SimpleSAML\\SOAP\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-2.1-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Tim van Dijen",
+ "email": "tvdijen@gmail.com"
+ }
+ ],
+ "description": "SimpleSAMLphp library for XML SOAP",
+ "support": {
+ "issues": "https://github.com/simplesamlphp/xml-soap/issues",
+ "source": "https://github.com/simplesamlphp/xml-soap/tree/v1.7.1"
+ },
+ "time": "2025-06-03T21:07:04+00:00"
+ },
+ {
+ "name": "swaggest/json-diff",
+ "version": "v3.12.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swaggest/json-diff.git",
+ "reference": "7ebc4eab95bcc73916433964c266588d09b35052"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swaggest/json-diff/zipball/7ebc4eab95bcc73916433964c266588d09b35052",
+ "reference": "7ebc4eab95bcc73916433964c266588d09b35052",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phperf/phpunit": "4.8.37"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Swaggest\\JsonDiff\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Viacheslav Poturaev",
+ "email": "vearutop@gmail.com"
+ }
+ ],
+ "description": "JSON diff/rearrange/patch/pointer library for PHP",
+ "support": {
+ "issues": "https://github.com/swaggest/json-diff/issues",
+ "source": "https://github.com/swaggest/json-diff/tree/v3.12.1"
+ },
+ "time": "2025-03-10T08:22:10+00:00"
+ },
+ {
+ "name": "swaggest/json-schema",
+ "version": "v0.12.43",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swaggest/php-json-schema.git",
+ "reference": "1f3a77a382c5d273a0f1fe34be3b8af4060a88cd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swaggest/php-json-schema/zipball/1f3a77a382c5d273a0f1fe34be3b8af4060a88cd",
+ "reference": "1f3a77a382c5d273a0f1fe34be3b8af4060a88cd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=7.1",
+ "phplang/scope-exit": "^1.0",
+ "swaggest/json-diff": "^3.8.2",
+ "symfony/polyfill-mbstring": "^1.19"
+ },
+ "require-dev": {
+ "phperf/phpunit": "4.8.37"
+ },
+ "suggest": {
+ "ext-mbstring": "For better performance"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Swaggest\\JsonSchema\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Viacheslav Poturaev",
+ "email": "vearutop@gmail.com"
+ }
+ ],
+ "description": "High definition PHP structures with JSON-schema based validation",
+ "support": {
+ "email": "vearutop@gmail.com",
+ "issues": "https://github.com/swaggest/php-json-schema/issues",
+ "source": "https://github.com/swaggest/php-json-schema/tree/v0.12.43"
+ },
+ "time": "2024-12-22T21:18:27+00:00"
+ },
+ {
+ "name": "symfony/asset",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/asset.git",
+ "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/asset/zipball/cfee7c0d64be113383db74a2fdd65d426b7f3aab",
+ "reference": "cfee7c0d64be113383db74a2fdd65d426b7f3aab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/http-foundation": "<5.4"
+ },
+ "require-dev": {
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Asset\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/asset/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/cache",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/d038cd3054aeaf1c674022a77048b2ef6376a175",
+ "reference": "d038cd3054aeaf1c674022a77048b2ef6376a175",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^2.0|^3.0",
+ "psr/log": "^1.1|^2|^3",
+ "symfony/cache-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/var-exporter": "^6.3.6|^7.0"
+ },
+ "conflict": {
+ "doctrine/dbal": "<2.13.1",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/http-kernel": "<5.4",
+ "symfony/var-dumper": "<5.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "2.0|3.0",
+ "psr/simple-cache-implementation": "1.0|2.0|3.0",
+ "symfony/cache-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "psr/simple-cache": "^1.0|^2.0|^3.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "classmap": [
+ "Traits/ValueWrapper.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides extended PSR-6, PSR-16 (and tags) implementations",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "caching",
+ "psr6"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T09:32:03+00:00"
+ },
+ {
+ "name": "symfony/cache-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache-contracts.git",
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/5d68a57d66910405e5c0b63d6f0af941e66fc868",
+ "reference": "5d68a57d66910405e5c0b63d6f0af941e66fc868",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/cache": "^3.0"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Cache\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to caching",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/cache-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-03-13T15:25:07+00:00"
+ },
+ {
+ "name": "symfony/clock",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/clock.git",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/clock/zipball/b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "reference": "b81435fbd6648ea425d1ee96a2d8e68f4ceacd24",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/clock": "^1.0",
+ "symfony/polyfill-php83": "^1.28"
+ },
+ "provide": {
+ "psr/clock-implementation": "1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/now.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Clock\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Decouples applications from the system clock",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "clock",
+ "psr20",
+ "time"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/clock/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/config",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/80e2cf005cf17138c97193be0434cdcfd1b2212e",
+ "reference": "80e2cf005cf17138c97193be0434cdcfd1b2212e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-ctype": "~1.8"
+ },
+ "conflict": {
+ "symfony/finder": "<5.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Config\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/config/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-26T13:50:30+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350",
+ "reference": "59266a5bf6a596e3e0844fd95e6ad7ea3c1d3350",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/string": "^5.4|^6.0|^7.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<5.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/lock": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Eases the creation of beautiful and testable command line interfaces",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command-line",
+ "console",
+ "terminal"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/console/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T10:38:54+00:00"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "929ab73b93247a15166ee79e807ccee4f930322d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/929ab73b93247a15166ee79e807ccee4f930322d",
+ "reference": "929ab73b93247a15166ee79e807ccee4f930322d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/service-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4.20|^7.2.5"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2",
+ "symfony/config": "<6.1",
+ "symfony/finder": "<5.4",
+ "symfony/proxy-manager-bridge": "<6.3",
+ "symfony/yaml": "<5.4"
+ },
+ "provide": {
+ "psr/container-implementation": "1.1|2.0",
+ "symfony/service-implementation": "1.1|2.0|3.0"
+ },
+ "require-dev": {
+ "symfony/config": "^6.1|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Allows you to standardize and centralize the way objects are constructed in your application",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/dependency-injection/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T17:30:48+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/doctrine-bridge",
+ "version": "v7.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/doctrine-bridge.git",
+ "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/doctrine-bridge/zipball/a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca",
+ "reference": "a2cbc12baf9bcc5d0c125e4c0f8330b98af841ca",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/event-manager": "^2",
+ "doctrine/persistence": "^3.1|^4",
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.8",
+ "doctrine/dbal": "<3.6",
+ "doctrine/lexer": "<1.1",
+ "doctrine/orm": "<2.15",
+ "symfony/cache": "<6.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/form": "<6.4.6|>=7,<7.0.6",
+ "symfony/http-foundation": "<6.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/lock": "<6.4",
+ "symfony/messenger": "<6.4",
+ "symfony/property-info": "<6.4",
+ "symfony/security-bundle": "<6.4",
+ "symfony/security-core": "<6.4",
+ "symfony/validator": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.8|^2.0",
+ "doctrine/data-fixtures": "^1.1|^2",
+ "doctrine/dbal": "^3.6|^4",
+ "doctrine/orm": "^2.15|^3",
+ "psr/log": "^1|^2|^3",
+ "symfony/cache": "^6.4|^7.0",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/doctrine-messenger": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/form": "^6.4.6|^7.0.6",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/lock": "^6.4|^7.0",
+ "symfony/messenger": "^6.4|^7.0",
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/property-info": "^6.4|^7.0",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/stopwatch": "^6.4|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/type-info": "^7.1.8",
+ "symfony/uid": "^6.4|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Doctrine\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides integration for Doctrine with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/doctrine-bridge/tree/v7.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T11:36:08+00:00"
+ },
+ {
+ "name": "symfony/dotenv",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dotenv.git",
+ "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dotenv/zipball/234b6c602f12b00693f4b0d1054386fb30dfc8ff",
+ "reference": "234b6c602f12b00693f4b0d1054386fb30dfc8ff",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/process": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Dotenv\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Registers environment variables from a .env file",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/dotenv/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v7.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/0b31a944fcd8759ae294da4d2808cbc53aebd0c3",
+ "reference": "0b31a944fcd8759ae294da4d2808cbc53aebd0c3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "psr/log": "^1|^2|^3",
+ "symfony/var-dumper": "^6.4|^7.0"
+ },
+ "conflict": {
+ "symfony/deprecation-contracts": "<2.5",
+ "symfony/http-kernel": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/webpack-encore-bundle": "^1.0|^2.0"
+ },
+ "bin": [
+ "Resources/bin/patch-type-declarations"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools to manage errors and ease debugging PHP code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/error-handler/tree/v7.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-07T08:17:57+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "497f73ac996a598c92409b44ac43b6690c4f666d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d",
+ "reference": "497f73ac996a598c92409b44ac43b6690c4f666d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/event-dispatcher-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<6.4",
+ "symfony/service-contracts": "<2.5"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0|3.0"
+ },
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/expression-language": "^6.4|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3",
+ "symfony/stopwatch": "^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-04-22T09:11:45+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v3.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586",
+ "reference": "59eb412e93815df44f05f342958efa9f46b1e586",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/event-dispatcher": "^1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-25T14:21:43+00:00"
+ },
+ {
+ "name": "symfony/filesystem",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/filesystem.git",
+ "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/75ae2edb7cdcc0c53766c30b0a2512b8df574bd8",
+ "reference": "75ae2edb7cdcc0c53766c30b0a2512b8df574bd8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-mbstring": "~1.8"
+ },
+ "require-dev": {
+ "symfony/process": "^5.4|^6.4|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Filesystem\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides basic utilities for the filesystem",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/filesystem/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/73089124388c8510efb8d2d1689285d285937b08",
+ "reference": "73089124388c8510efb8d2d1689285d285937b08",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Finds files and directories via an intuitive fluent interface",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/finder/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-15T12:02:45+00:00"
+ },
+ {
+ "name": "symfony/flex",
+ "version": "v2.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/flex.git",
+ "reference": "423c36e369361003dc31ef11c5f15fb589e52c01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/flex/zipball/423c36e369361003dc31ef11c5f15fb589e52c01",
+ "reference": "423c36e369361003dc31ef11c5f15fb589e52c01",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^2.1",
+ "php": ">=8.0"
+ },
+ "conflict": {
+ "composer/semver": "<1.7.2"
+ },
+ "require-dev": {
+ "composer/composer": "^2.1",
+ "symfony/dotenv": "^5.4|^6.0",
+ "symfony/filesystem": "^5.4|^6.0",
+ "symfony/phpunit-bridge": "^5.4|^6.0",
+ "symfony/process": "^5.4|^6.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Flex\\Flex"
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Flex\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien.potencier@gmail.com"
+ }
+ ],
+ "description": "Composer plugin for Symfony",
+ "support": {
+ "issues": "https://github.com/symfony/flex/issues",
+ "source": "https://github.com/symfony/flex/tree/v2.8.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-05T07:45:19+00:00"
+ },
+ {
+ "name": "symfony/framework-bundle",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/framework-bundle.git",
+ "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/869b94902dd38f2f33718908f2b5d4868e3b9241",
+ "reference": "869b94902dd38f2f33718908f2b5d4868e3b9241",
+ "shasum": ""
+ },
+ "require": {
+ "composer-runtime-api": ">=2.1",
+ "ext-xml": "*",
+ "php": ">=8.1",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/dependency-injection": "^6.4.12|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.1|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/routing": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.13.1",
+ "doctrine/persistence": "<1.3",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/asset": "<5.4",
+ "symfony/asset-mapper": "<6.4",
+ "symfony/clock": "<6.3",
+ "symfony/console": "<5.4|>=7.0",
+ "symfony/dom-crawler": "<6.4",
+ "symfony/dotenv": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<6.3",
+ "symfony/lock": "<5.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<6.3",
+ "symfony/mime": "<6.4",
+ "symfony/property-access": "<5.4",
+ "symfony/property-info": "<5.4",
+ "symfony/runtime": "<5.4.45|>=6.0,<6.4.13|>=7.0,<7.1.6",
+ "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4",
+ "symfony/security-core": "<5.4",
+ "symfony/security-csrf": "<5.4",
+ "symfony/serializer": "<6.4",
+ "symfony/stopwatch": "<5.4",
+ "symfony/translation": "<6.4",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/twig-bundle": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/web-profiler-bundle": "<6.4",
+ "symfony/workflow": "<6.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.13.1|^2",
+ "doctrine/persistence": "^1.3|^2|^3",
+ "dragonmantank/cron-expression": "^3.1",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "seld/jsonlint": "^1.10",
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/asset-mapper": "^6.4|^7.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.2|^7.0",
+ "symfony/console": "^5.4.9|^6.0.9|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dom-crawler": "^6.4|^7.0",
+ "symfony/dotenv": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/html-sanitizer": "^6.1|^7.0",
+ "symfony/http-client": "^6.3|^7.0",
+ "symfony/lock": "^5.4|^6.0|^7.0",
+ "symfony/mailer": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^6.3|^7.0",
+ "symfony/mime": "^6.4|^7.0",
+ "symfony/notifier": "^5.4|^6.0|^7.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0",
+ "symfony/scheduler": "^6.4.4|^7.0.4",
+ "symfony/security-bundle": "^5.4|^6.0|^7.0",
+ "symfony/semaphore": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/string": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^6.4|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/workflow": "^6.4|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.10|^3.0.4"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\FrameworkBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/framework-bundle/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-30T07:06:12+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/0341e41d8d8830c31a1dff5cbc5bdb3ec872a073",
+ "reference": "0341e41d8d8830c31a1dff5cbc5bdb3ec872a073",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php83": "^1.27"
+ },
+ "conflict": {
+ "symfony/cache": "<6.4.12|>=7.0,<7.1.5"
+ },
+ "require-dev": {
+ "doctrine/dbal": "^2.13.1|^3|^4",
+ "predis/predis": "^1.1|^2.0",
+ "symfony/cache": "^6.4.12|^7.1.5",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Defines an object-oriented layer for the HTTP specification",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-foundation/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726",
+ "reference": "b81dcdbe34b8e8f7b3fc7b2a47fa065d5bf30726",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "psr/log": "^1|^2|^3",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<5.4",
+ "symfony/cache": "<5.4",
+ "symfony/config": "<6.1",
+ "symfony/console": "<5.4",
+ "symfony/dependency-injection": "<6.4",
+ "symfony/doctrine-bridge": "<5.4",
+ "symfony/form": "<5.4",
+ "symfony/http-client": "<5.4",
+ "symfony/http-client-contracts": "<2.5",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/translation": "<5.4",
+ "symfony/translation-contracts": "<2.5",
+ "symfony/twig-bridge": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/var-dumper": "<6.3",
+ "twig/twig": "<2.13"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0|2.0|3.0"
+ },
+ "require-dev": {
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.2|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^2.5|^3",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4.5|^6.0.5|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.4|^7.0.4",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.4|^7.0",
+ "symfony/var-exporter": "^6.2|^7.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides a structured process for converting a Request into a Response",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/http-kernel/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-31T09:23:30+00:00"
+ },
+ {
+ "name": "symfony/intl",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/intl.git",
+ "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/intl/zipball/c0938cd29804e65308051a42d1387f0dd57e1eaf",
+ "reference": "c0938cd29804e65308051a42d1387f0dd57e1eaf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Intl\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/",
+ "/Resources/data/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ },
+ {
+ "name": "Eriksen Costa",
+ "email": "eriksen.costa@infranology.com.br"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides access to the localization data of the ICU library",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "i18n",
+ "icu",
+ "internationalization",
+ "intl",
+ "l10n",
+ "localization"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/intl/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/monolog-bridge",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bridge.git",
+ "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/b0ff45e8d9289062a963deaf8b55e92488322e3f",
+ "reference": "b0ff45e8d9289062a963deaf8b55e92488322e3f",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "^1.25.1|^2|^3",
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "symfony/console": "<5.4",
+ "symfony/http-foundation": "<5.4",
+ "symfony/security-core": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/mailer": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bridge",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\Monolog\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides integration for Monolog with various Symfony components",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/monolog-bridge/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/monolog-bundle",
+ "version": "v3.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/monolog-bundle.git",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "shasum": ""
+ },
+ "require": {
+ "monolog/monolog": "^1.25.1 || ^2.0 || ^3.0",
+ "php": ">=7.2.5",
+ "symfony/config": "^5.4 || ^6.0 || ^7.0",
+ "symfony/dependency-injection": "^5.4 || ^6.0 || ^7.0",
+ "symfony/http-kernel": "^5.4 || ^6.0 || ^7.0",
+ "symfony/monolog-bridge": "^5.4 || ^6.0 || ^7.0"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4 || ^6.0 || ^7.0",
+ "symfony/phpunit-bridge": "^6.3 || ^7.0",
+ "symfony/yaml": "^5.4 || ^6.0 || ^7.0"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\MonologBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony MonologBundle",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "log",
+ "logging"
+ ],
+ "support": {
+ "issues": "https://github.com/symfony/monolog-bundle/issues",
+ "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-11-06T17:08:13+00:00"
+ },
+ {
+ "name": "symfony/password-hasher",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/password-hasher.git",
+ "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557",
+ "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/security-core": "<5.4"
+ },
+ "require-dev": {
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\PasswordHasher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Robin Chalas",
+ "email": "robin.chalas@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Provides password hashing utilities",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "hashing",
+ "password"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/password-hasher/tree/v6.4.24"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-10T08:14:14+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-icu",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-icu.git",
+ "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
+ "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance and support of other locales than \"en\""
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Icu\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's ICU-related data and classes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "icu",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-20T22:24:30+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-10T14:38:51+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.32.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "shasum": ""
+ },
+ "require": {
+ "ext-iconv": "*",
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-12-23T08:48:59+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-php80/tree/v1.33.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-02T08:10:11+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php81",
+ "version": "v1.33.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-or-later"
+ "MIT"
],
"authors": [
{
- "name": "Andreas Åkre Solberg",
- "email": "andreas.solberg@uninett.no"
- },
- {
- "name": "Olav Morken",
- "email": "olav.morken@uninett.no"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
- "name": "Jaime Perez",
- "email": "jaime.perez@uninett.no"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A PHP implementation of a SAML 2.0 service provider and identity provider, also compatible with Shibboleth 1.3 and 2.0.",
- "homepage": "http://simplesamlphp.org",
+ "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
"keywords": [
- "SAML2",
- "idp",
- "oauth",
- "shibboleth",
- "sp",
- "ws-federation"
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp"
+ "source": "https://github.com/symfony/polyfill-php81/tree/v1.33.0"
},
- "time": "2018-12-20T16:49:03+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/debug",
- "version": "v4.4.44",
+ "name": "symfony/polyfill-php83",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "1a692492190773c5310bc7877cb590c04c2f05be"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be",
- "reference": "1a692492190773c5310bc7877cb590c04c2f05be",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "psr/log": "^1|^2|^3"
- },
- "conflict": {
- "symfony/http-kernel": "<3.4"
- },
- "require-dev": {
- "symfony/http-kernel": "^3.4|^4.0|^5.0"
+ "php": ">=7.2"
},
"type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Symfony\\Component\\Debug\\": ""
+ "Symfony\\Polyfill\\Php83\\": ""
},
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2197,18 +7185,24 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides tools to ease debugging PHP code",
+ "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions",
"homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "source": "https://github.com/symfony/debug/tree/v4.4.44"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
},
"funding": [
{
@@ -2224,39 +7218,41 @@
"type": "tidelift"
}
],
- "abandoned": "symfony/error-handler",
- "time": "2022-07-28T16:29:46+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/deprecation-contracts",
- "version": "v2.5.3",
+ "name": "symfony/polyfill-php84",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d"
+ "url": "https://github.com/symfony/polyfill-php84.git",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf",
+ "reference": "000df7860439609837bbe28670b0be15783b7fbf",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.2"
},
"type": "library",
"extra": {
"thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "2.5-dev"
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
"files": [
- "function.php"
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Php84\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2273,10 +7269,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "A generic function and convention to trigger deprecation notices",
+ "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions",
"homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3"
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0"
},
"funding": [
{
@@ -2292,36 +7294,34 @@
"type": "tidelift"
}
],
- "time": "2023-01-24T14:02:46+00:00"
+ "time": "2025-02-20T12:04:08+00:00"
},
{
- "name": "symfony/error-handler",
- "version": "v4.4.44",
+ "name": "symfony/property-access",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/error-handler.git",
- "reference": "be731658121ef2d8be88f3a1ec938148a9237291"
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291",
- "reference": "be731658121ef2d8be88f3a1ec938148a9237291",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/a33acdae7c76f837c1db5465cc3445adf3ace94a",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "psr/log": "^1|^2|^3",
- "symfony/debug": "^4.4.5",
- "symfony/var-dumper": "^4.4|^5.0"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/property-info": "^5.4|^6.0|^7.0"
},
"require-dev": {
- "symfony/http-kernel": "^4.4|^5.0",
- "symfony/serializer": "^4.4|^5.0"
+ "symfony/cache": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\ErrorHandler\\": ""
+ "Symfony\\Component\\PropertyAccess\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2341,10 +7341,21 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides tools to manage errors and ease debugging PHP code",
+ "description": "Provides functions to read and write from/to an object or array using a simple string notation",
"homepage": "https://symfony.com",
+ "keywords": [
+ "access",
+ "array",
+ "extraction",
+ "index",
+ "injection",
+ "object",
+ "property",
+ "property-path",
+ "reflection"
+ ],
"support": {
- "source": "https://github.com/symfony/error-handler/tree/v4.4.44"
+ "source": "https://github.com/symfony/property-access/tree/v6.4.24"
},
"funding": [
{
@@ -2355,57 +7366,55 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2022-07-28T16:29:46+00:00"
+ "time": "2025-07-15T12:03:16+00:00"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v4.4.44",
+ "name": "symfony/property-info",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a"
+ "url": "https://github.com/symfony/property-info.git",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
- "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/1056ae3621eeddd78d7c5ec074f1c1784324eec6",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/event-dispatcher-contracts": "^1.1",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/string": "^5.4|^6.0|^7.0"
},
"conflict": {
- "symfony/dependency-injection": "<3.4"
- },
- "provide": {
- "psr/event-dispatcher-implementation": "1.0",
- "symfony/event-dispatcher-implementation": "1.1"
+ "doctrine/annotations": "<1.12",
+ "phpdocumentor/reflection-docblock": "<5.2",
+ "phpdocumentor/type-resolver": "<1.5.1",
+ "symfony/cache": "<5.4",
+ "symfony/dependency-injection": "<5.4|>=6.0,<6.4",
+ "symfony/serializer": "<5.4"
},
"require-dev": {
- "psr/log": "^1|^2|^3",
- "symfony/config": "^3.4|^4.0|^5.0",
- "symfony/dependency-injection": "^3.4|^4.0|^5.0",
- "symfony/error-handler": "~3.4|~4.4",
- "symfony/expression-language": "^3.4|^4.0|^5.0",
- "symfony/http-foundation": "^3.4|^4.0|^5.0",
- "symfony/service-contracts": "^1.1|^2",
- "symfony/stopwatch": "^3.4|^4.0|^5.0"
- },
- "suggest": {
- "symfony/dependency-injection": "",
- "symfony/http-kernel": ""
+ "doctrine/annotations": "^1.12|^2",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "phpstan/phpdoc-parser": "^1.0|^2.0",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^5.4|^6.4|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\EventDispatcher\\": ""
+ "Symfony\\Component\\PropertyInfo\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2417,18 +7426,26 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
"homepage": "https://symfony.com",
+ "keywords": [
+ "doctrine",
+ "phpdoc",
+ "property",
+ "symfony",
+ "type",
+ "validator"
+ ],
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v4.4.44"
+ "source": "https://github.com/symfony/property-info/tree/v6.4.24"
},
"funding": [
{
@@ -2439,48 +7456,48 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2022-07-20T09:59:04+00:00"
+ "time": "2025-07-14T16:38:25+00:00"
},
{
- "name": "symfony/event-dispatcher-contracts",
- "version": "v1.10.0",
+ "name": "symfony/proxy-manager-bridge",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974"
+ "url": "https://github.com/symfony/proxy-manager-bridge.git",
+ "reference": "2a14a1539f2854a8adb73319abf8923b1d7a6589"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
- "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
+ "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/2a14a1539f2854a8adb73319abf8923b1d7a6589",
+ "reference": "2a14a1539f2854a8adb73319abf8923b1d7a6589",
"shasum": ""
},
"require": {
- "php": ">=7.1.3"
- },
- "suggest": {
- "psr/event-dispatcher": "",
- "symfony/event-dispatcher-implementation": ""
+ "friendsofphp/proxy-manager-lts": "^1.0.2",
+ "php": ">=8.1",
+ "symfony/dependency-injection": "^6.3|^7.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "1.1-dev"
- }
+ "require-dev": {
+ "symfony/config": "^6.1|^7.0"
},
+ "type": "symfony-bridge",
"autoload": {
"psr-4": {
- "Symfony\\Contracts\\EventDispatcher\\": ""
- }
+ "Symfony\\Bridge\\ProxyManager\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2488,26 +7505,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Generic abstractions related to dispatching event",
+ "description": "Provides integration for ProxyManager with various Symfony components",
"homepage": "https://symfony.com",
- "keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
- ],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0"
+ "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.24"
},
"funding": [
{
@@ -2518,47 +7527,58 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2022-07-20T09:59:04+00:00"
+ "time": "2025-07-14T16:38:25+00:00"
},
{
- "name": "symfony/http-client-contracts",
- "version": "v2.5.3",
+ "name": "symfony/routing",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-client-contracts.git",
- "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1"
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
- "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e4f94e625c8e6f910aa004a0042f7b2d398278f5",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5",
"shasum": ""
},
"require": {
- "php": ">=7.2.5"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
- "suggest": {
- "symfony/http-client-implementation": ""
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "2.5-dev"
- }
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "psr/log": "^1|^2|^3",
+ "symfony/config": "^6.2|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
},
+ "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Contracts\\HttpClient\\": ""
- }
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2566,26 +7586,24 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Generic abstractions related to HTTP clients",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
"keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
+ "router",
+ "routing",
+ "uri",
+ "url"
],
"support": {
- "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.3"
+ "source": "https://github.com/symfony/routing/tree/v6.4.24"
},
"funding": [
{
@@ -2596,41 +7614,53 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-03-26T19:42:53+00:00"
+ "time": "2025-07-15T08:46:37+00:00"
},
{
- "name": "symfony/http-foundation",
- "version": "v4.4.49",
+ "name": "symfony/runtime",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-foundation.git",
- "reference": "191413c7b832c015bb38eae963f2e57498c3c173"
+ "url": "https://github.com/symfony/runtime.git",
+ "reference": "c1cc6721646f546627236c57f835272806087337"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173",
- "reference": "191413c7b832c015bb38eae963f2e57498c3c173",
+ "url": "https://api.github.com/repos/symfony/runtime/zipball/c1cc6721646f546627236c57f835272806087337",
+ "reference": "c1cc6721646f546627236c57f835272806087337",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/mime": "^4.3|^5.0",
- "symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php80": "^1.16"
+ "composer-plugin-api": "^1.0|^2.0",
+ "php": ">=8.1"
+ },
+ "conflict": {
+ "symfony/dotenv": "<5.4"
},
"require-dev": {
- "predis/predis": "~1.0",
- "symfony/expression-language": "^3.4|^4.0|^5.0"
+ "composer/composer": "^1.0.2|^2.0",
+ "symfony/console": "^5.4.9|^6.0.9|^7.0",
+ "symfony/dotenv": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin"
},
- "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\HttpFoundation\\": ""
+ "Symfony\\Component\\Runtime\\": "",
+ "Symfony\\Runtime\\Symfony\\Component\\": "Internal/"
},
"exclude-from-classmap": [
"/Tests/"
@@ -2642,18 +7672,21 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Defines an object-oriented layer for the HTTP specification",
+ "description": "Enables decoupling PHP applications from global state",
"homepage": "https://symfony.com",
+ "keywords": [
+ "runtime"
+ ],
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v4.4.49"
+ "source": "https://github.com/symfony/runtime/tree/v6.4.24"
},
"funding": [
{
@@ -2664,77 +7697,89 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2022-11-04T16:17:57+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/http-kernel",
- "version": "v4.4.51",
+ "name": "symfony/security-bundle",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-kernel.git",
- "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7"
+ "url": "https://github.com/symfony/security-bundle.git",
+ "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7",
- "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7",
+ "url": "https://api.github.com/repos/symfony/security-bundle/zipball/3b1b64ab12e74d76fedddd1df1fa68bd014d3efb",
+ "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "psr/log": "^1|^2",
- "symfony/error-handler": "^4.4",
- "symfony/event-dispatcher": "^4.4",
- "symfony/http-client-contracts": "^1.1|^2",
- "symfony/http-foundation": "^4.4.30|^5.3.7",
- "symfony/polyfill-ctype": "^1.8",
- "symfony/polyfill-php73": "^1.9",
- "symfony/polyfill-php80": "^1.16"
+ "composer-runtime-api": ">=2.1",
+ "ext-xml": "*",
+ "php": ">=8.1",
+ "symfony/clock": "^6.3|^7.0",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/dependency-injection": "^6.4.11|^7.1.4",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^6.2|^7.0",
+ "symfony/http-kernel": "^6.2",
+ "symfony/password-hasher": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^6.2|^7.0",
+ "symfony/security-csrf": "^5.4|^6.0|^7.0",
+ "symfony/security-http": "^6.3.6|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
},
"conflict": {
- "symfony/browser-kit": "<4.3",
- "symfony/config": "<3.4",
- "symfony/console": ">=5",
- "symfony/dependency-injection": "<4.3",
- "symfony/translation": "<4.2",
- "twig/twig": "<1.43|<2.13,>=2"
- },
- "provide": {
- "psr/log-implementation": "1.0|2.0"
+ "symfony/browser-kit": "<5.4",
+ "symfony/console": "<5.4",
+ "symfony/framework-bundle": "<6.4",
+ "symfony/http-client": "<5.4",
+ "symfony/ldap": "<5.4",
+ "symfony/serializer": "<6.4",
+ "symfony/twig-bundle": "<5.4",
+ "symfony/validator": "<6.4"
},
"require-dev": {
- "psr/cache": "^1.0|^2.0|^3.0",
- "symfony/browser-kit": "^4.3|^5.0",
- "symfony/config": "^3.4|^4.0|^5.0",
- "symfony/console": "^3.4|^4.0",
- "symfony/css-selector": "^3.4|^4.0|^5.0",
- "symfony/dependency-injection": "^4.3|^5.0",
- "symfony/dom-crawler": "^3.4|^4.0|^5.0",
- "symfony/expression-language": "^3.4|^4.0|^5.0",
- "symfony/finder": "^3.4|^4.0|^5.0",
- "symfony/process": "^3.4|^4.0|^5.0",
- "symfony/routing": "^3.4|^4.0|^5.0",
- "symfony/stopwatch": "^3.4|^4.0|^5.0",
- "symfony/templating": "^3.4|^4.0|^5.0",
- "symfony/translation": "^4.2|^5.0",
- "symfony/translation-contracts": "^1.1|^2",
- "twig/twig": "^1.43|^2.13|^3.0.4"
- },
- "suggest": {
- "symfony/browser-kit": "",
- "symfony/config": "",
- "symfony/console": "",
- "symfony/dependency-injection": ""
- },
- "type": "library",
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/dom-crawler": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-client": "^5.4|^6.0|^7.0",
+ "symfony/ldap": "^5.4|^6.0|^7.0",
+ "symfony/process": "^5.4|^6.0|^7.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/twig-bridge": "^5.4|^6.0|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0",
+ "twig/twig": "^2.13|^3.0.4",
+ "web-token/jwt-checker": "^3.1",
+ "web-token/jwt-signature-algorithm-ecdsa": "^3.1",
+ "web-token/jwt-signature-algorithm-eddsa": "^3.1",
+ "web-token/jwt-signature-algorithm-hmac": "^3.1",
+ "web-token/jwt-signature-algorithm-none": "^3.1",
+ "web-token/jwt-signature-algorithm-rsa": "^3.1"
+ },
+ "type": "symfony-bundle",
"autoload": {
"psr-4": {
- "Symfony\\Component\\HttpKernel\\": ""
+ "Symfony\\Bundle\\SecurityBundle\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2754,10 +7799,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides a structured process for converting a Request into a Response",
+ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v4.4.51"
+ "source": "https://github.com/symfony/security-bundle/tree/v6.4.24"
},
"funding": [
{
@@ -2768,54 +7813,63 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2023-11-10T13:31:29+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/mime",
- "version": "v5.4.41",
+ "name": "symfony/security-core",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/mime.git",
- "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42"
+ "url": "https://github.com/symfony/security-core.git",
+ "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/c71c7a1aeed60b22d05e738197e31daf2120bd42",
- "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42",
+ "url": "https://api.github.com/repos/symfony/security-core/zipball/8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53",
+ "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/deprecation-contracts": "^2.1|^3",
- "symfony/polyfill-intl-idn": "^1.10",
- "symfony/polyfill-mbstring": "^1.0",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/event-dispatcher-contracts": "^2.5|^3",
+ "symfony/password-hasher": "^5.4|^6.0|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
},
"conflict": {
- "egulias/email-validator": "~3.0.0",
- "phpdocumentor/reflection-docblock": "<3.2.2",
- "phpdocumentor/type-resolver": "<1.4.0",
- "symfony/mailer": "<4.4",
- "symfony/serializer": "<5.4.35|>=6,<6.3.12|>=6.4,<6.4.3"
+ "symfony/event-dispatcher": "<5.4",
+ "symfony/http-foundation": "<5.4",
+ "symfony/ldap": "<5.4",
+ "symfony/security-guard": "<5.4",
+ "symfony/translation": "<5.4.35|>=6.0,<6.3.12|>=6.4,<6.4.3|>=7.0,<7.0.3",
+ "symfony/validator": "<5.4"
},
"require-dev": {
- "egulias/email-validator": "^2.1.10|^3.1|^4",
- "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
- "symfony/dependency-injection": "^4.4|^5.0|^6.0",
- "symfony/process": "^5.4|^6.4",
- "symfony/property-access": "^4.4|^5.1|^6.0",
- "symfony/property-info": "^4.4|^5.1|^6.0",
- "symfony/serializer": "^5.4.35|~6.3.12|^6.4.3"
+ "psr/cache": "^1.0|^2.0|^3.0",
+ "psr/container": "^1.1|^2.0",
+ "psr/log": "^1|^2|^3",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/event-dispatcher": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/ldap": "^5.4|^6.0|^7.0",
+ "symfony/string": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4.35|~6.3.12|^6.4.3|^7.0.3",
+ "symfony/validator": "^6.4|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Mime\\": ""
+ "Symfony\\Component\\Security\\Core\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2835,14 +7889,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Allows manipulating MIME messages",
+ "description": "Symfony Security Component - Core Library",
"homepage": "https://symfony.com",
- "keywords": [
- "mime",
- "mime-type"
- ],
"support": {
- "source": "https://github.com/symfony/mime/tree/v5.4.41"
+ "source": "https://github.com/symfony/security-core/tree/v6.4.24"
},
"funding": [
{
@@ -2853,50 +7903,51 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-06-28T09:36:24+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.30.0",
+ "name": "symfony/security-csrf",
+ "version": "v7.3.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
+ "url": "https://github.com/symfony/security-csrf.git",
+ "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
- "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
+ "url": "https://api.github.com/repos/symfony/security-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3",
+ "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.2",
+ "symfony/security-core": "^6.4|^7.0"
},
- "provide": {
- "ext-ctype": "*"
+ "conflict": {
+ "symfony/http-foundation": "<6.4"
},
- "suggest": {
- "ext-ctype": "For best performance"
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0"
},
"type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
+ "Symfony\\Component\\Security\\Csrf\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2904,24 +7955,18 @@
],
"authors": [
{
- "name": "Gert de Pagter",
- "email": "BackEndTea@gmail.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for ctype functions",
+ "description": "Symfony Security Component - CSRF Library",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "ctype",
- "polyfill",
- "portable"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0"
+ "source": "https://github.com/symfony/security-csrf/tree/v7.3.0"
},
"funding": [
{
@@ -2937,44 +7982,60 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2025-01-02T18:42:10+00:00"
},
{
- "name": "symfony/polyfill-intl-idn",
- "version": "v1.30.0",
+ "name": "symfony/security-http",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c"
+ "url": "https://github.com/symfony/security-http.git",
+ "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
- "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c",
+ "url": "https://api.github.com/repos/symfony/security-http/zipball/bd6ce061b70071afea0a4805903b6ed3f6f64e07",
+ "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "symfony/polyfill-intl-normalizer": "^1.10",
- "symfony/polyfill-php72": "^1.10"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/http-foundation": "^6.2|^7.0",
+ "symfony/http-kernel": "^6.3|^7.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/property-access": "^5.4|^6.0|^7.0",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/service-contracts": "^2.5|^3"
},
- "suggest": {
- "ext-intl": "For best performance"
+ "conflict": {
+ "symfony/clock": "<6.3",
+ "symfony/event-dispatcher": "<5.4.9|>=6,<6.0.9",
+ "symfony/http-client-contracts": "<3.0",
+ "symfony/security-bundle": "<5.4",
+ "symfony/security-csrf": "<5.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/clock": "^6.3|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/http-client-contracts": "^3.0",
+ "symfony/rate-limiter": "^5.4|^6.0|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/security-csrf": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "web-token/jwt-checker": "^3.1",
+ "web-token/jwt-signature-algorithm-ecdsa": "^3.1"
},
+ "type": "library",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Idn\\": ""
- }
+ "Symfony\\Component\\Security\\Http\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2982,30 +8043,18 @@
],
"authors": [
{
- "name": "Laurent Bassin",
- "email": "laurent@bassin.info"
- },
- {
- "name": "Trevor Rowbotham",
- "email": "trevor.rowbotham@pm.me"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "description": "Symfony Security Component - HTTP Integration",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "idn",
- "intl",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.30.0"
+ "source": "https://github.com/symfony/security-http/tree/v6.4.24"
},
"funding": [
{
@@ -3016,49 +8065,78 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.30.0",
+ "name": "symfony/serializer",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb"
+ "url": "https://github.com/symfony/serializer.git",
+ "reference": "c01c719c8a837173dc100f2bd141a6271ea68a1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb",
- "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/c01c719c8a837173dc100f2bd141a6271ea68a1d",
+ "reference": "c01c719c8a837173dc100f2bd141a6271ea68a1d",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "~1.8"
},
- "suggest": {
- "ext-intl": "For best performance"
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/property-access": "<5.4",
+ "symfony/property-info": "<5.4.24|>=6,<6.2.11",
+ "symfony/uid": "<5.4",
+ "symfony/validator": "<6.4",
+ "symfony/yaml": "<5.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "require-dev": {
+ "doctrine/annotations": "^1.12|^2",
+ "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0",
+ "seld/jsonlint": "^1.10",
+ "symfony/cache": "^5.4|^6.0|^7.0",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/error-handler": "^5.4|^6.0|^7.0",
+ "symfony/filesystem": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^5.4|^6.0|^7.0",
+ "symfony/messenger": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^5.4|^6.0|^7.0",
+ "symfony/property-access": "^5.4.26|^6.3|^7.0",
+ "symfony/property-info": "^5.4.24|^6.2.11|^7.0",
+ "symfony/translation-contracts": "^2.5|^3",
+ "symfony/uid": "^5.4|^6.0|^7.0",
+ "symfony/validator": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0",
+ "symfony/var-exporter": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
},
+ "type": "library",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ "Symfony\\Component\\Serializer\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3067,26 +8145,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "intl",
- "normalizer",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0"
+ "source": "https://github.com/symfony/serializer/tree/v6.4.24"
},
"funding": [
{
@@ -3097,50 +8167,56 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/polyfill-mbstring",
- "version": "v1.30.0",
+ "name": "symfony/service-contracts",
+ "version": "v3.6.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
- "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
- "provide": {
- "ext-mbstring": "*"
- },
- "suggest": {
- "ext-mbstring": "For best performance"
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
},
"type": "library",
"extra": {
"thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
}
},
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- }
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3156,17 +8232,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill for the Mbstring extension",
+ "description": "Generic abstractions related to writing services",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
},
"funding": [
{
@@ -3182,34 +8259,34 @@
"type": "tidelift"
}
],
- "time": "2024-06-19T12:30:46+00:00"
+ "time": "2025-04-25T09:37:31+00:00"
},
{
- "name": "symfony/polyfill-php56",
- "version": "v1.20.0",
+ "name": "symfony/stopwatch",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "symfony/service-contracts": "^2.5|^3"
},
- "type": "metapackage",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Stopwatch\\": ""
},
- "branch-alias": {
- "dev-main": "1.20-dev"
- }
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3217,24 +8294,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "description": "Provides a way to profile code",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0"
+ "source": "https://github.com/symfony/stopwatch/tree/v6.4.24"
},
"funding": [
{
@@ -3245,44 +8316,60 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2020-10-23T14:02:19+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/polyfill-php72",
- "version": "v1.30.0",
+ "name": "symfony/string",
+ "version": "v7.3.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php72.git",
- "reference": "10112722600777e02d2745716b70c5db4ca70442"
+ "url": "https://github.com/symfony/string.git",
+ "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/10112722600777e02d2745716b70c5db4ca70442",
- "reference": "10112722600777e02d2745716b70c5db4ca70442",
+ "url": "https://api.github.com/repos/symfony/string/zipball/42f505aff654e62ac7ac2ce21033818297ca89ca",
+ "reference": "42f505aff654e62ac7ac2ce21033818297ca89ca",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.2",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "conflict": {
+ "symfony/translation-contracts": "<2.5"
+ },
+ "require-dev": {
+ "symfony/emoji": "^7.1",
+ "symfony/error-handler": "^6.4|^7.0",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/intl": "^6.4|^7.0",
+ "symfony/translation-contracts": "^2.5|^3.0",
+ "symfony/var-exporter": "^6.4|^7.0"
},
+ "type": "library",
"autoload": {
"files": [
- "bootstrap.php"
+ "Resources/functions.php"
],
"psr-4": {
- "Symfony\\Polyfill\\Php72\\": ""
- }
+ "Symfony\\Component\\String\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3298,16 +8385,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php72/tree/v1.30.0"
+ "source": "https://github.com/symfony/string/tree/v7.3.2"
},
"funding": [
{
@@ -3318,46 +8407,50 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-06-19T12:30:46+00:00"
+ "time": "2025-07-10T08:47:49+00:00"
},
{
- "name": "symfony/polyfill-php73",
- "version": "v1.30.0",
+ "name": "symfony/translation-contracts",
+ "version": "v3.6.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php73.git",
- "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1"
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/ec444d3f3f6505bb28d11afa41e75faadebc10a1",
- "reference": "ec444d3f3f6505bb28d11afa41e75faadebc10a1",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
+ "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.6-dev"
}
},
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Php73\\": ""
+ "Symfony\\Contracts\\Translation\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Test/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3374,16 +8467,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "description": "Generic abstractions related to translation",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php73/tree/v1.30.0"
+ "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
},
"funding": [
{
@@ -3399,41 +8494,80 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2024-09-27T08:32:26+00:00"
},
{
- "name": "symfony/polyfill-php80",
- "version": "v1.30.0",
+ "name": "symfony/twig-bridge",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php80.git",
- "reference": "77fa7995ac1b21ab60769b7323d600a991a90433"
+ "url": "https://github.com/symfony/twig-bridge.git",
+ "reference": "af9ef04e348f93410c83d04d2806103689a3d924"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/77fa7995ac1b21ab60769b7323d600a991a90433",
- "reference": "77fa7995ac1b21ab60769b7323d600a991a90433",
+ "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/af9ef04e348f93410c83d04d2806103689a3d924",
+ "reference": "af9ef04e348f93410c83d04d2806103689a3d924",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/translation-contracts": "^2.5|^3",
+ "twig/twig": "^2.13|^3.0.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "<3.2.2",
+ "phpdocumentor/type-resolver": "<1.4.0",
+ "symfony/console": "<5.4",
+ "symfony/form": "<6.3",
+ "symfony/http-foundation": "<5.4",
+ "symfony/http-kernel": "<6.4",
+ "symfony/mime": "<6.2",
+ "symfony/serializer": "<6.4",
+ "symfony/translation": "<5.4",
+ "symfony/workflow": "<5.4"
},
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10|^3|^4",
+ "league/html-to-markdown": "^5.0",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/asset-mapper": "^6.3|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/dependency-injection": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/form": "^6.4.20|^7.2.5",
+ "symfony/html-sanitizer": "^6.1|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/intl": "^5.4|^6.0|^7.0",
+ "symfony/mime": "^6.2|^7.0",
+ "symfony/polyfill-intl-icu": "~1.0",
+ "symfony/property-info": "^5.4|^6.0|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/security-acl": "^2.8|^3.0",
+ "symfony/security-core": "^5.4|^6.0|^7.0",
+ "symfony/security-csrf": "^5.4|^6.0|^7.0",
+ "symfony/security-http": "^5.4|^6.0|^7.0",
+ "symfony/serializer": "^6.4.3|^7.0.3",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^6.1|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/workflow": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0",
+ "twig/cssinliner-extra": "^2.12|^3",
+ "twig/inky-extra": "^2.12|^3",
+ "twig/markdown-extra": "^2.12|^3"
+ },
+ "type": "symfony-bridge",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Php80\\": ""
+ "Symfony\\Bridge\\Twig\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3442,28 +8576,18 @@
],
"authors": [
{
- "name": "Ion Bazan",
- "email": "ion.bazan@gmail.com"
- },
- {
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-php80/tree/v1.30.0"
+ "source": "https://github.com/symfony/twig-bridge/tree/v6.4.24"
},
"funding": [
{
@@ -3471,7 +8595,11 @@
"type": "custom"
},
{
- "url": "https://github.com/fabpot",
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
@@ -3479,41 +8607,55 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2025-07-26T12:47:35+00:00"
},
{
- "name": "symfony/polyfill-php81",
- "version": "v1.29.0",
+ "name": "symfony/twig-bundle",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php81.git",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d"
+ "url": "https://github.com/symfony/twig-bundle.git",
+ "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/c565ad1e63f30e7477fc40738343c62b40bc672d",
- "reference": "c565ad1e63f30e7477fc40738343c62b40bc672d",
+ "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/3b48b6e8225495c6d2438828982b4d219ca565ba",
+ "reference": "3b48b6e8225495c6d2438828982b4d219ca565ba",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "composer-runtime-api": ">=2.1",
+ "php": ">=8.1",
+ "symfony/config": "^6.1|^7.0",
+ "symfony/dependency-injection": "^6.1|^7.0",
+ "symfony/http-foundation": "^5.4|^6.0|^7.0",
+ "symfony/http-kernel": "^6.2",
+ "symfony/twig-bridge": "^6.4",
+ "twig/twig": "^2.13|^3.0.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "conflict": {
+ "symfony/framework-bundle": "<5.4",
+ "symfony/translation": "<5.4"
},
+ "require-dev": {
+ "symfony/asset": "^5.4|^6.0|^7.0",
+ "symfony/expression-language": "^5.4|^6.0|^7.0",
+ "symfony/finder": "^5.4|^6.0|^7.0",
+ "symfony/form": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^5.4|^6.0|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0",
+ "symfony/translation": "^5.4|^6.0|^7.0",
+ "symfony/web-link": "^5.4|^6.0|^7.0",
+ "symfony/yaml": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Php81\\": ""
+ "Symfony\\Bundle\\TwigBundle\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3522,24 +8664,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions",
+ "description": "Provides a tight integration of Twig into the Symfony full-stack framework",
"homepage": "https://symfony.com",
- "keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-php81/tree/v1.29.0"
+ "source": "https://github.com/symfony/twig-bundle/tree/v6.4.24"
},
"funding": [
{
@@ -3550,39 +8686,56 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-01-29T20:11:03+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/process",
- "version": "v2.8.52",
+ "name": "symfony/var-dumper",
+ "version": "v7.3.2",
"source": {
"type": "git",
- "url": "https://github.com/symfony/process.git",
- "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8"
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "53205bea27450dc5c65377518b3275e126d45e75"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/process/zipball/c3591a09c78639822b0b290d44edb69bf9f05dc8",
- "reference": "c3591a09c78639822b0b290d44edb69bf9f05dc8",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/53205bea27450dc5c65377518b3275e126d45e75",
+ "reference": "53205bea27450dc5c65377518b3275e126d45e75",
"shasum": ""
},
"require": {
- "php": ">=5.3.9"
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-mbstring": "~1.0"
},
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.8-dev"
- }
+ "conflict": {
+ "symfony/console": "<6.4"
},
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0",
+ "symfony/uid": "^6.4|^7.0",
+ "twig/twig": "^3.12"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
"autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
"psr-4": {
- "Symfony\\Component\\Process\\": ""
+ "Symfony\\Component\\VarDumper\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3594,64 +8747,70 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Process Component",
+ "description": "Provides mechanisms for walking through any arbitrary PHP variable",
"homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
"support": {
- "source": "https://github.com/symfony/process/tree/v2.8.50"
+ "source": "https://github.com/symfony/var-dumper/tree/v7.3.2"
},
- "time": "2018-11-11T11:18:13+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-29T20:02:46+00:00"
},
{
- "name": "symfony/routing",
- "version": "v4.4.44",
+ "name": "symfony/var-exporter",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae"
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/routing/zipball/f7751fd8b60a07f3f349947a309b5bdfce22d6ae",
- "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35",
+ "reference": "1e742d559fe5b19d0cdc281b1bf0b1fcc243bd35",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/polyfill-php80": "^1.16"
- },
- "conflict": {
- "symfony/config": "<4.2",
- "symfony/dependency-injection": "<3.4",
- "symfony/yaml": "<3.4"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
},
"require-dev": {
- "doctrine/annotations": "^1.10.4",
- "psr/log": "^1|^2|^3",
- "symfony/config": "^4.2|^5.0",
- "symfony/dependency-injection": "^3.4|^4.0|^5.0",
- "symfony/expression-language": "^3.4|^4.0|^5.0",
- "symfony/http-foundation": "^3.4|^4.0|^5.0",
- "symfony/yaml": "^3.4|^4.0|^5.0"
- },
- "suggest": {
- "doctrine/annotations": "For using the annotation loader",
- "symfony/config": "For using the all-in-one router or any loader",
- "symfony/expression-language": "For using expression matching",
- "symfony/http-foundation": "For using a Symfony Request object",
- "symfony/yaml": "For using the YAML loader"
+ "symfony/property-access": "^6.4|^7.0",
+ "symfony/serializer": "^6.4|^7.0",
+ "symfony/var-dumper": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\Routing\\": ""
+ "Symfony\\Component\\VarExporter\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3663,24 +8822,28 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Maps an HTTP request to a set of configuration variables",
+ "description": "Allows exporting any serializable PHP data structure to plain PHP code",
"homepage": "https://symfony.com",
"keywords": [
- "router",
- "routing",
- "uri",
- "url"
+ "clone",
+ "construct",
+ "export",
+ "hydrate",
+ "instantiate",
+ "lazy-loading",
+ "proxy",
+ "serialize"
],
"support": {
- "source": "https://github.com/symfony/routing/tree/v4.4.44"
+ "source": "https://github.com/symfony/var-exporter/tree/v6.4.24"
},
"funding": [
{
@@ -3691,58 +8854,49 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2022-07-20T09:59:04+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/var-dumper",
- "version": "v5.4.42",
+ "name": "symfony/yaml",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/var-dumper.git",
- "reference": "0c17c56d8ea052fc33942251c75d0e28936e043d"
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "742a8efc94027624b36b10ba58e23d402f961f51"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-dumper/zipball/0c17c56d8ea052fc33942251c75d0e28936e043d",
- "reference": "0c17c56d8ea052fc33942251c75d0e28936e043d",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/742a8efc94027624b36b10ba58e23d402f961f51",
+ "reference": "742a8efc94027624b36b10ba58e23d402f961f51",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-mbstring": "~1.0",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8"
},
"conflict": {
- "symfony/console": "<4.4"
+ "symfony/console": "<5.4"
},
"require-dev": {
- "ext-iconv": "*",
- "symfony/console": "^4.4|^5.0|^6.0",
- "symfony/http-kernel": "^4.4|^5.0|^6.0",
- "symfony/process": "^4.4|^5.0|^6.0",
- "symfony/uid": "^5.1|^6.0",
- "twig/twig": "^2.13|^3.0.4"
- },
- "suggest": {
- "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
- "ext-intl": "To show region name in time zone dump",
- "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ "symfony/console": "^5.4|^6.0|^7.0"
},
"bin": [
- "Resources/bin/var-dump-server"
+ "Resources/bin/yaml-lint"
],
"type": "library",
"autoload": {
- "files": [
- "Resources/functions/dump.php"
- ],
"psr-4": {
- "Symfony\\Component\\VarDumper\\": ""
+ "Symfony\\Component\\Yaml\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -3754,22 +8908,18 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Provides mechanisms for walking through any arbitrary PHP variable",
+ "description": "Loads and dumps YAML files",
"homepage": "https://symfony.com",
- "keywords": [
- "debug",
- "dump"
- ],
"support": {
- "source": "https://github.com/symfony/var-dumper/tree/v5.4.42"
+ "source": "https://github.com/symfony/yaml/tree/v6.4.24"
},
"funding": [
{
@@ -3780,12 +8930,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-07-26T12:23:09+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
"name": "taq/pdooci",
@@ -3857,42 +9011,35 @@
"homepage": "https://github.com/tildeio/rsvp.js"
},
{
- "name": "twig/extensions",
- "version": "v1.5.4",
+ "name": "twig/intl-extra",
+ "version": "v3.21.0",
"source": {
"type": "git",
- "url": "https://github.com/twigphp/Twig-extensions.git",
- "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
+ "url": "https://github.com/twigphp/intl-extra.git",
+ "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202",
- "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
+ "url": "https://api.github.com/repos/twigphp/intl-extra/zipball/05bc5d46b9df9e62399eae53e7c0b0633298b146",
+ "reference": "05bc5d46b9df9e62399eae53e7c0b0633298b146",
"shasum": ""
},
"require": {
- "twig/twig": "^1.27|^2.0"
+ "php": ">=8.1.0",
+ "symfony/intl": "^5.4|^6.4|^7.0",
+ "twig/twig": "^3.13|^4.0"
},
"require-dev": {
- "symfony/phpunit-bridge": "^3.4",
- "symfony/translation": "^2.7|^3.4"
- },
- "suggest": {
- "symfony/translation": "Allow the time_diff output to be translated"
+ "symfony/phpunit-bridge": "^6.4|^7.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.5-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Twig_Extensions_": "lib/"
- },
"psr-4": {
- "Twig\\Extensions\\": "src/"
- }
+ "Twig\\Extra\\Intl\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3901,53 +9048,65 @@
"authors": [
{
"name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
}
],
- "description": "Common additional features for Twig that do not directly belong in core",
+ "description": "A Twig extension for Intl",
+ "homepage": "https://twig.symfony.com",
"keywords": [
- "i18n",
- "text"
+ "intl",
+ "twig"
],
"support": {
- "issues": "https://github.com/twigphp/Twig-extensions/issues",
- "source": "https://github.com/twigphp/Twig-extensions/tree/master"
+ "source": "https://github.com/twigphp/intl-extra/tree/v3.21.0"
},
- "abandoned": true,
- "time": "2018-12-05T18:34:18+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-01-31T20:45:36+00:00"
},
{
"name": "twig/twig",
- "version": "v1.44.7",
+ "version": "v3.21.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "0887422319889e442458e48e2f3d9add1a172ad5"
+ "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/0887422319889e442458e48e2f3d9add1a172ad5",
- "reference": "0887422319889e442458e48e2f3d9add1a172ad5",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/285123877d4dd97dd7c11842ac5fb7e86e60d81d",
+ "reference": "285123877d4dd97dd7c11842ac5fb7e86e60d81d",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "symfony/polyfill-ctype": "^1.8"
+ "php": ">=8.1.0",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
- "psr/container": "^1.0",
- "symfony/phpunit-bridge": "^4.4.9|^5.0.9"
+ "phpstan/phpstan": "^2.0",
+ "psr/container": "^1.0|^2.0",
+ "symfony/phpunit-bridge": "^5.4.9|^6.4|^7.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.44-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Twig_": "lib/"
- },
+ "files": [
+ "src/Resources/core.php",
+ "src/Resources/debug.php",
+ "src/Resources/escaper.php",
+ "src/Resources/string_loader.php"
+ ],
"psr-4": {
"Twig\\": "src/"
}
@@ -3980,7 +9139,7 @@
],
"support": {
"issues": "https://github.com/twigphp/Twig/issues",
- "source": "https://github.com/twigphp/Twig/tree/v1.44.7"
+ "source": "https://github.com/twigphp/Twig/tree/v3.21.1"
},
"funding": [
{
@@ -3992,20 +9151,20 @@
"type": "tidelift"
}
],
- "time": "2022-09-28T08:38:36+00:00"
+ "time": "2025-05-03T07:21:55+00:00"
},
{
"name": "ua-parser/uap-php",
- "version": "v3.9.14",
+ "version": "v3.10.0",
"source": {
"type": "git",
"url": "https://github.com/ua-parser/uap-php.git",
- "reference": "b796c5ea5df588e65aeb4e2c6cce3811dec4fed6"
+ "reference": "f44bdd1b38198801cf60b0681d2d842980e47af5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/ua-parser/uap-php/zipball/b796c5ea5df588e65aeb4e2c6cce3811dec4fed6",
- "reference": "b796c5ea5df588e65aeb4e2c6cce3811dec4fed6",
+ "url": "https://api.github.com/repos/ua-parser/uap-php/zipball/f44bdd1b38198801cf60b0681d2d842980e47af5",
+ "reference": "f44bdd1b38198801cf60b0681d2d842980e47af5",
"shasum": ""
},
"require": {
@@ -4053,99 +9212,9 @@
"description": "A multi-language port of Browserscope's user agent parser.",
"support": {
"issues": "https://github.com/ua-parser/uap-php/issues",
- "source": "https://github.com/ua-parser/uap-php/tree/v3.9.14"
- },
- "time": "2020-10-02T23:36:20+00:00"
- },
- {
- "name": "ubccr/simplesamlphp-module-authglobus",
- "version": "1.3.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ubccr/simplesamlphp-module-authglobus.git",
- "reference": "d81f53960bdfdb015de267d804863e85d2efb5f6"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ubccr/simplesamlphp-module-authglobus/zipball/d81f53960bdfdb015de267d804863e85d2efb5f6",
- "reference": "d81f53960bdfdb015de267d804863e85d2efb5f6",
- "shasum": ""
- },
- "require": {
- "simplesamlphp/composer-module-installer": "~1.0"
- },
- "require-dev": {
- "simplesamlphp/simplesamlphp": "^1.14",
- "squizlabs/php_codesniffer": "2.8.0"
- },
- "type": "simplesamlphp-module",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "authors": [
- {
- "name": "Rudra Chakraborty",
- "email": "rudracha@buffalo.edu",
- "role": "Scientific Programmer, University at Buffalo"
- }
- ],
- "description": "Globus Auth module for SimpleSAMLphp.",
- "support": {
- "issues": "https://github.com/ubccr/simplesamlphp-module-authglobus/issues",
- "source": "https://github.com/ubccr/simplesamlphp-module-authglobus/tree/master"
- },
- "time": "2018-09-10T15:22:34+00:00"
- },
- {
- "name": "ubccr/simplesamlphp-module-authoidcoauth2",
- "version": "1.1.0",
- "source": {
- "type": "git",
- "url": "https://github.com/ubccr/simplesamlphp-module-authoidcoauth2.git",
- "reference": "bad54f7b08bbadfee2444c8a469289a8f0ca51ad"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/ubccr/simplesamlphp-module-authoidcoauth2/zipball/bad54f7b08bbadfee2444c8a469289a8f0ca51ad",
- "reference": "bad54f7b08bbadfee2444c8a469289a8f0ca51ad",
- "shasum": ""
- },
- "require": {
- "simplesamlphp/composer-module-installer": "~1.0"
- },
- "require-dev": {
- "simplesamlphp/simplesamlphp": "^1.14",
- "squizlabs/php_codesniffer": "2.8.0"
+ "source": "https://github.com/ua-parser/uap-php/tree/v3.10.0"
},
- "type": "simplesamlphp-module",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "LGPL-3.0"
- ],
- "authors": [
- {
- "name": "Open XDMoD",
- "email": "ccr-xdmod-help@buffalo.edu",
- "role": "Open XDMoD Project Team, University at Buffalo"
- },
- {
- "name": "Ben Plessinger",
- "email": "bpless@buffalo.edu",
- "role": "Senior Scientific Programmer, University at Buffalo"
- },
- {
- "name": "Ryan Rathsam",
- "email": "ryanrath@buffalo.edu",
- "role": "Scientific Programmer, University at Buffalo"
- }
- ],
- "description": "Oauth2 / OIDC auth module for SimpleSAMLphp.",
- "support": {
- "issues": "https://github.com/ubccr/simplesamlphp-module-authoidcoauth2/issues",
- "source": "https://github.com/ubccr/simplesamlphp-module-authoidcoauth2/tree/v1.1.0"
- },
- "time": "2020-09-11T18:18:04+00:00"
+ "time": "2025-07-17T15:43:24+00:00"
},
{
"name": "webmozart/assert",
@@ -4200,58 +9269,10 @@
"validate"
],
"support": {
- "issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.11.0"
- },
- "time": "2022-06-03T18:03:27+00:00"
- },
- {
- "name": "whitehat101/apr1-md5",
- "version": "v1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/whitehat101/apr1-md5.git",
- "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/whitehat101/apr1-md5/zipball/8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
- "reference": "8b261c9fc0481b4e9fa9d01c6ca70867b5d5e819",
- "shasum": ""
- },
- "require": {
- "php": ">=5.3.0"
- },
- "require-dev": {
- "phpunit/phpunit": "4.0.*"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "WhiteHat101\\Crypt\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jeremy Ebler",
- "email": "jebler@gmail.com"
- }
- ],
- "description": "Apache's APR1-MD5 algorithm in pure PHP",
- "homepage": "https://github.com/whitehat101/apr1-md5",
- "keywords": [
- "MD5",
- "apr1"
- ],
- "support": {
- "issues": "https://github.com/whitehat101/apr1-md5/issues",
- "source": "https://github.com/whitehat101/apr1-md5/tree/master"
+ "issues": "https://github.com/webmozarts/assert/issues",
+ "source": "https://github.com/webmozarts/assert/tree/1.11.0"
},
- "time": "2015-02-11T11:06:42+00:00"
+ "time": "2022-06-03T18:03:27+00:00"
}
],
"packages-dev": [
@@ -4304,24 +9325,25 @@
},
{
"name": "dms/phpunit-arraysubset-asserts",
- "version": "v0.5.0",
+ "version": "v0.4.0",
"source": {
"type": "git",
"url": "https://github.com/rdohms/phpunit-arraysubset-asserts.git",
- "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0"
+ "reference": "428293c2a00eceefbad71a2dbdfb913febb35de2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rdohms/phpunit-arraysubset-asserts/zipball/aa6b9e858414e91cca361cac3b2035ee57d212e0",
- "reference": "aa6b9e858414e91cca361cac3b2035ee57d212e0",
+ "url": "https://api.github.com/repos/rdohms/phpunit-arraysubset-asserts/zipball/428293c2a00eceefbad71a2dbdfb913febb35de2",
+ "reference": "428293c2a00eceefbad71a2dbdfb913febb35de2",
"shasum": ""
},
"require": {
"php": "^5.4 || ^7.0 || ^8.0",
- "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0 || ^10.0"
+ "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"require-dev": {
- "dms/coding-standard": "^9"
+ "dms/coding-standard": "^9",
+ "squizlabs/php_codesniffer": "^3.4"
},
"type": "library",
"autoload": {
@@ -4342,92 +9364,22 @@
"description": "This package provides ArraySubset and related asserts once deprecated in PHPUnit 8",
"support": {
"issues": "https://github.com/rdohms/phpunit-arraysubset-asserts/issues",
- "source": "https://github.com/rdohms/phpunit-arraysubset-asserts/tree/v0.5.0"
- },
- "time": "2023-06-02T17:33:53+00:00"
- },
- {
- "name": "doctrine/instantiator",
- "version": "1.5.0",
- "source": {
- "type": "git",
- "url": "https://github.com/doctrine/instantiator.git",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
- "shasum": ""
- },
- "require": {
- "php": "^7.1 || ^8.0"
- },
- "require-dev": {
- "doctrine/coding-standard": "^9 || ^11",
- "ext-pdo": "*",
- "ext-phar": "*",
- "phpbench/phpbench": "^0.16 || ^1",
- "phpstan/phpstan": "^1.4",
- "phpstan/phpstan-phpunit": "^1",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.30 || ^5.4"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Marco Pivetta",
- "email": "ocramius@gmail.com",
- "homepage": "https://ocramius.github.io/"
- }
- ],
- "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
- "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
- "keywords": [
- "constructor",
- "instantiate"
- ],
- "support": {
- "issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ "source": "https://github.com/rdohms/phpunit-arraysubset-asserts/tree/v0.4.0"
},
- "funding": [
- {
- "url": "https://www.doctrine-project.org/sponsorship.html",
- "type": "custom"
- },
- {
- "url": "https://www.patreon.com/phpdoctrine",
- "type": "patreon"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
- "type": "tidelift"
- }
- ],
- "time": "2022-12-30T00:15:36+00:00"
+ "time": "2022-02-13T15:00:28+00:00"
},
{
"name": "myclabs/deep-copy",
- "version": "1.11.1",
+ "version": "1.13.3",
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ "reference": "faed855a7b5f4d4637717c2b3863e277116beb36"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
- "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/faed855a7b5f4d4637717c2b3863e277116beb36",
+ "reference": "faed855a7b5f4d4637717c2b3863e277116beb36",
"shasum": ""
},
"require": {
@@ -4435,11 +9387,12 @@
},
"conflict": {
"doctrine/collections": "<1.6.8",
- "doctrine/common": "<2.13.3 || >=3,<3.2.2"
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
},
"require-dev": {
"doctrine/collections": "^1.6.8",
"doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
"phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
@@ -4465,7 +9418,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.13.3"
},
"funding": [
{
@@ -4473,20 +9426,20 @@
"type": "tidelift"
}
],
- "time": "2023-03-08T13:26:56+00:00"
+ "time": "2025-07-05T12:25:42+00:00"
},
{
"name": "nikic/php-parser",
- "version": "v5.0.2",
+ "version": "v5.6.0",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13"
+ "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13",
- "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/221b0d0fdf1369c71047ad1d18bb5880017bbc56",
+ "reference": "221b0d0fdf1369c71047ad1d18bb5880017bbc56",
"shasum": ""
},
"require": {
@@ -4497,7 +9450,7 @@
},
"require-dev": {
"ircmaxell/php-yacc": "^0.0.7",
- "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ "phpunit/phpunit": "^9.0"
},
"bin": [
"bin/php-parse"
@@ -4529,9 +9482,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.0"
},
- "time": "2024-03-05T20:51:40+00:00"
+ "time": "2025-07-27T20:03:57+00:00"
},
{
"name": "phar-io/manifest",
@@ -4651,85 +9604,37 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
- {
- "name": "phplang/scope-exit",
- "version": "1.0.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phplang/scope-exit.git",
- "reference": "239b73abe89f9414aa85a7ca075ec9445629192b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phplang/scope-exit/zipball/239b73abe89f9414aa85a7ca075ec9445629192b",
- "reference": "239b73abe89f9414aa85a7ca075ec9445629192b",
- "shasum": ""
- },
- "require-dev": {
- "phpunit/phpunit": "*"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "PhpLang\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD"
- ],
- "authors": [
- {
- "name": "Sara Golemon",
- "email": "pollita@php.net",
- "homepage": "https://twitter.com/SaraMG",
- "role": "Developer"
- }
- ],
- "description": "Emulation of SCOPE_EXIT construct from C++",
- "homepage": "https://github.com/phplang/scope-exit",
- "keywords": [
- "cleanup",
- "exit",
- "scope"
- ],
- "support": {
- "issues": "https://github.com/phplang/scope-exit/issues",
- "source": "https://github.com/phplang/scope-exit/tree/master"
- },
- "time": "2016-09-17T00:15:18+00:00"
- },
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.31",
+ "version": "9.2.32",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965"
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/48c34b5d8d983006bd2adc2d0de92963b9155965",
- "reference": "48c34b5d8d983006bd2adc2d0de92963b9155965",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.18 || ^5.0",
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
"php": ">=7.3",
- "phpunit/php-file-iterator": "^3.0.3",
- "phpunit/php-text-template": "^2.0.2",
- "sebastian/code-unit-reverse-lookup": "^2.0.2",
- "sebastian/complexity": "^2.0",
- "sebastian/environment": "^5.1.2",
- "sebastian/lines-of-code": "^1.0.3",
- "sebastian/version": "^3.0.1",
- "theseer/tokenizer": "^1.2.0"
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^9.3"
+ "phpunit/phpunit": "^9.6"
},
"suggest": {
"ext-pcov": "PHP extension that provides line coverage",
@@ -4738,7 +9643,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -4767,7 +9672,7 @@
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
"security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.31"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
},
"funding": [
{
@@ -4775,7 +9680,7 @@
"type": "github"
}
],
- "time": "2024-03-02T06:37:42+00:00"
+ "time": "2024-08-22T04:23:01+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -5020,45 +9925,45 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.6.19",
+ "version": "9.6.23",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8"
+ "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a1a54a473501ef4cdeaae4e06891674114d79db8",
- "reference": "a1a54a473501ef4cdeaae4e06891674114d79db8",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/43d2cb18d0675c38bd44982a5d1d88f6d53d8d95",
+ "reference": "43d2cb18d0675c38bd44982a5d1d88f6d53d8d95",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.3.1 || ^2",
+ "doctrine/instantiator": "^1.5.0 || ^2",
"ext-dom": "*",
"ext-json": "*",
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
"ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.10.1",
- "phar-io/manifest": "^2.0.3",
- "phar-io/version": "^3.0.2",
+ "myclabs/deep-copy": "^1.13.1",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
"php": ">=7.3",
- "phpunit/php-code-coverage": "^9.2.28",
- "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
"phpunit/php-invoker": "^3.1.1",
- "phpunit/php-text-template": "^2.0.3",
- "phpunit/php-timer": "^5.0.2",
- "sebastian/cli-parser": "^1.0.1",
- "sebastian/code-unit": "^1.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
"sebastian/comparator": "^4.0.8",
- "sebastian/diff": "^4.0.3",
- "sebastian/environment": "^5.1.3",
- "sebastian/exporter": "^4.0.5",
- "sebastian/global-state": "^5.0.1",
- "sebastian/object-enumerator": "^4.0.3",
- "sebastian/resource-operations": "^3.0.3",
- "sebastian/type": "^3.2",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.6",
+ "sebastian/global-state": "^5.0.7",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
"sebastian/version": "^3.0.2"
},
"suggest": {
@@ -5103,7 +10008,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.19"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.23"
},
"funding": [
{
@@ -5114,12 +10019,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-04-05T04:35:58+00:00"
+ "time": "2025-05-02T06:40:34+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -6085,29 +10998,57 @@
"time": "2020-09-28T06:39:44+00:00"
},
{
- "name": "swaggest/json-diff",
- "version": "v3.10.5",
+ "name": "symfony/maker-bundle",
+ "version": "v1.64.0",
"source": {
"type": "git",
- "url": "https://github.com/swaggest/json-diff.git",
- "reference": "17bfc66b330f46e12a7e574133497a290cd79ba5"
+ "url": "https://github.com/symfony/maker-bundle.git",
+ "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swaggest/json-diff/zipball/17bfc66b330f46e12a7e574133497a290cd79ba5",
- "reference": "17bfc66b330f46e12a7e574133497a290cd79ba5",
+ "url": "https://api.github.com/repos/symfony/maker-bundle/zipball/c86da84640b0586e92aee2b276ee3638ef2f425a",
+ "reference": "c86da84640b0586e92aee2b276ee3638ef2f425a",
"shasum": ""
},
"require": {
- "ext-json": "*"
+ "doctrine/inflector": "^2.0",
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.1",
+ "symfony/config": "^6.4|^7.0",
+ "symfony/console": "^6.4|^7.0",
+ "symfony/dependency-injection": "^6.4|^7.0",
+ "symfony/deprecation-contracts": "^2.2|^3",
+ "symfony/filesystem": "^6.4|^7.0",
+ "symfony/finder": "^6.4|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/process": "^6.4|^7.0"
+ },
+ "conflict": {
+ "doctrine/doctrine-bundle": "<2.10",
+ "doctrine/orm": "<2.15"
},
"require-dev": {
- "phperf/phpunit": "4.8.37"
+ "composer/semver": "^3.0",
+ "doctrine/doctrine-bundle": "^2.5.0",
+ "doctrine/orm": "^2.15|^3",
+ "symfony/http-client": "^6.4|^7.0",
+ "symfony/phpunit-bridge": "^6.4.1|^7.0",
+ "symfony/security-core": "^6.4|^7.0",
+ "symfony/security-http": "^6.4|^7.0",
+ "symfony/yaml": "^6.4|^7.0",
+ "twig/twig": "^3.0|^4.x-dev"
+ },
+ "type": "symfony-bundle",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.x-dev"
+ }
},
- "type": "library",
"autoload": {
"psr-4": {
- "Swaggest\\JsonDiff\\": "src/"
+ "Symfony\\Bundle\\MakerBundle\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -6116,49 +11057,143 @@
],
"authors": [
{
- "name": "Viacheslav Poturaev",
- "email": "vearutop@gmail.com"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "JSON diff/rearrange/patch/pointer library for PHP",
+ "description": "Symfony Maker helps you create empty commands, controllers, form classes, tests and more so you can forget about writing boilerplate code.",
+ "homepage": "https://symfony.com/doc/current/bundles/SymfonyMakerBundle/index.html",
+ "keywords": [
+ "code generator",
+ "dev",
+ "generator",
+ "scaffold",
+ "scaffolding"
+ ],
"support": {
- "issues": "https://github.com/swaggest/json-diff/issues",
- "source": "https://github.com/swaggest/json-diff/tree/v3.10.5"
+ "issues": "https://github.com/symfony/maker-bundle/issues",
+ "source": "https://github.com/symfony/maker-bundle/tree/v1.64.0"
},
- "time": "2023-11-17T11:12:46+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-06-23T16:12:08+00:00"
},
{
- "name": "swaggest/json-schema",
- "version": "v0.12.42",
+ "name": "symfony/process",
+ "version": "v7.3.0",
"source": {
"type": "git",
- "url": "https://github.com/swaggest/php-json-schema.git",
- "reference": "d23adb53808b8e2da36f75bc0188546e4cbe3b45"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/swaggest/php-json-schema/zipball/d23adb53808b8e2da36f75bc0188546e4cbe3b45",
- "reference": "d23adb53808b8e2da36f75bc0188546e4cbe3b45",
+ "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
+ "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "php": ">=5.4",
- "phplang/scope-exit": "^1.0",
- "swaggest/json-diff": "^3.8.2",
- "symfony/polyfill-mbstring": "^1.19"
- },
- "require-dev": {
- "phperf/phpunit": "4.8.37"
- },
- "suggest": {
- "ext-mbstring": "For better performance"
+ "php": ">=8.2"
},
"type": "library",
"autoload": {
"psr-4": {
- "Swaggest\\JsonSchema\\": "src/"
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Executes commands in sub-processes",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/process/tree/v7.3.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
+ ],
+ "time": "2025-04-17T09:11:12+00:00"
+ },
+ {
+ "name": "symfony/web-profiler-bundle",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/web-profiler-bundle.git",
+ "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/web-profiler-bundle/zipball/ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd",
+ "reference": "ae16f886ab3e3ed0a8db07d2a7c4d9d60b1eafcd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/config": "^5.4|^6.0|^7.0",
+ "symfony/framework-bundle": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0",
+ "symfony/routing": "^5.4|^6.0|^7.0",
+ "symfony/twig-bundle": "^5.4|^6.0",
+ "twig/twig": "^2.13|^3.0.4"
+ },
+ "conflict": {
+ "symfony/form": "<5.4",
+ "symfony/mailer": "<5.4",
+ "symfony/messenger": "<5.4",
+ "symfony/twig-bundle": ">=7.0"
+ },
+ "require-dev": {
+ "symfony/browser-kit": "^5.4|^6.0|^7.0",
+ "symfony/console": "^5.4|^6.0|^7.0",
+ "symfony/css-selector": "^5.4|^6.0|^7.0",
+ "symfony/stopwatch": "^5.4|^6.0|^7.0"
+ },
+ "type": "symfony-bundle",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bundle\\WebProfilerBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -6166,17 +11201,41 @@
],
"authors": [
{
- "name": "Viacheslav Poturaev",
- "email": "vearutop@gmail.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "High definition PHP structures with JSON-schema based validation",
+ "description": "Provides a development tool that gives detailed information about the execution of any request",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "dev"
+ ],
"support": {
- "email": "vearutop@gmail.com",
- "issues": "https://github.com/swaggest/php-json-schema/issues",
- "source": "https://github.com/swaggest/php-json-schema/tree/v0.12.42"
+ "source": "https://github.com/symfony/web-profiler-bundle/tree/v6.4.24"
},
- "time": "2023-09-12T14:43:42+00:00"
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-07-20T15:15:57+00:00"
},
{
"name": "theseer/tokenizer",
@@ -6232,10 +11291,10 @@
"aliases": [],
"minimum-stability": "stable",
"stability-flags": {},
- "prefer-stable": false,
+ "prefer-stable": true,
"prefer-lowest": false,
"platform": {
- "php": "^7.4"
+ "php": "^8.2"
},
"platform-dev": {},
"plugin-api-version": "2.6.0"
diff --git a/config/bundles.php b/config/bundles.php
new file mode 100644
index 0000000000..35579e2b4d
--- /dev/null
+++ b/config/bundles.php
@@ -0,0 +1,12 @@
+ ['all' => true],
+ Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
+ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
+ Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
+ Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
+ Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
+ Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
+ Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true],
+];
diff --git a/config/packages/cache.yaml b/config/packages/cache.yaml
new file mode 100644
index 0000000000..6899b72003
--- /dev/null
+++ b/config/packages/cache.yaml
@@ -0,0 +1,19 @@
+framework:
+ cache:
+ # Unique name of your app: used to compute stable namespaces for cache keys.
+ #prefix_seed: your_vendor_name/app_name
+
+ # The "app" cache stores to the filesystem by default.
+ # The data in this cache should persist between deploys.
+ # Other options include:
+
+ # Redis
+ #app: cache.adapter.redis
+ #default_redis_provider: redis://localhost
+
+ # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues)
+ #app: cache.adapter.apcu
+
+ # Namespaced pools use the above "app" backend by default
+ #pools:
+ #my.dedicated.cache: null
diff --git a/config/packages/dev/monolog.yaml b/config/packages/dev/monolog.yaml
new file mode 100644
index 0000000000..6e8b2baf7d
--- /dev/null
+++ b/config/packages/dev/monolog.yaml
@@ -0,0 +1,17 @@
+monolog:
+ handlers:
+ main:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: warning
+ # uncomment to get logging in your browser
+ # you may have to allow bigger header sizes in your Web server configuration
+ #firephp:
+ # type: firephp
+ # level: info
+ #chromephp:
+ # type: chromephp
+ # level: info
+ console:
+ type: console
+ process_psr_3_messages: false
diff --git a/config/packages/doctrine.yaml b/config/packages/doctrine.yaml
new file mode 100644
index 0000000000..d42c52d6d2
--- /dev/null
+++ b/config/packages/doctrine.yaml
@@ -0,0 +1,50 @@
+doctrine:
+ dbal:
+ url: '%env(resolve:DATABASE_URL)%'
+
+ # IMPORTANT: You MUST configure your server version,
+ # either here or in the DATABASE_URL env var (see .env file)
+ #server_version: '16'
+
+ profiling_collect_backtrace: '%kernel.debug%'
+ use_savepoints: true
+ orm:
+ auto_generate_proxy_classes: true
+ enable_lazy_ghost_objects: true
+ report_fields_where_declared: true
+ validate_xml_mapping: true
+ naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
+ auto_mapping: true
+ mappings:
+ App:
+ type: attribute
+ is_bundle: false
+ dir: '%kernel.project_dir%/src/Entity'
+ prefix: 'App\Entity'
+ alias: App
+
+when@test:
+ doctrine:
+ dbal:
+ # "TEST_TOKEN" is typically set by ParaTest
+ dbname_suffix: '_test%env(default::TEST_TOKEN)%'
+
+when@prod:
+ doctrine:
+ orm:
+ auto_generate_proxy_classes: false
+ proxy_dir: '%kernel.build_dir%/doctrine/orm/Proxies'
+ query_cache_driver:
+ type: pool
+ pool: doctrine.system_cache_pool
+ result_cache_driver:
+ type: pool
+ pool: doctrine.result_cache_pool
+
+ framework:
+ cache:
+ pools:
+ doctrine.result_cache_pool:
+ adapter: cache.app
+ doctrine.system_cache_pool:
+ adapter: cache.system
diff --git a/config/packages/doctrine_migrations.yaml b/config/packages/doctrine_migrations.yaml
new file mode 100644
index 0000000000..29231d94bd
--- /dev/null
+++ b/config/packages/doctrine_migrations.yaml
@@ -0,0 +1,6 @@
+doctrine_migrations:
+ migrations_paths:
+ # namespace is arbitrary but should be different from App\Migrations
+ # as migrations classes should NOT be autoloaded
+ 'DoctrineMigrations': '%kernel.project_dir%/migrations'
+ enable_profiler: false
diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml
new file mode 100644
index 0000000000..879229786e
--- /dev/null
+++ b/config/packages/framework.yaml
@@ -0,0 +1,26 @@
+# see https://symfony.com/doc/current/reference/configuration/framework.html
+framework:
+ annotations:
+ enabled: false
+ error_controller: Access\Errors\ErrorController
+ secret: '%env(APP_SECRET)%'
+ #csrf_protection: true
+ http_method_override: false
+
+ # Enables session support. Note that the session will ONLY be started if you read or write from it.
+ # Remove or comment this section to explicitly disable session support.
+ session:
+ handler_id: null
+ cookie_secure: auto
+ cookie_samesite: lax
+ storage_factory_id: session.storage.factory.native
+
+ #esi: true
+ #fragments: true
+ php_errors:
+ log: true
+when@test:
+ framework:
+ test: true
+ session:
+ storage_factory_id: session.storage.factory.mock_file
diff --git a/config/packages/google_recaptcha.yaml b/config/packages/google_recaptcha.yaml
new file mode 100644
index 0000000000..8670b13e59
--- /dev/null
+++ b/config/packages/google_recaptcha.yaml
@@ -0,0 +1,21 @@
+services:
+
+ # Inject this service in your controllers/services to verify a submitted captcha.
+ ReCaptcha\ReCaptcha:
+ arguments:
+ $secret: '%env(GOOGLE_RECAPTCHA_SECRET)%'
+ $requestMethod: '@ReCaptcha\RequestMethod'
+
+ # Curl is set here as default transport to communicate with Google servers.
+ # If you do not have php-curl extension, you can change for a socket or a plain POST request.
+ # Check out the repository for all other request methods:
+ # https://github.com/google/recaptcha/tree/master/src/ReCaptcha/RequestMethod
+ ReCaptcha\RequestMethod: '@ReCaptcha\RequestMethod\CurlPost'
+ ReCaptcha\RequestMethod\CurlPost: null
+ ReCaptcha\RequestMethod\Curl: null
+
+# Uncomment this line if you want to inject the site key to all your Twig templates.
+# You can also inject the "google_recaptcha_site_key" container parameter to your controllers.
+#twig:
+# globals:
+# google_recaptcha_site_key: '%google_recaptcha_site_key%'
diff --git a/config/packages/maker.yaml b/config/packages/maker.yaml
new file mode 100644
index 0000000000..231da51c6e
--- /dev/null
+++ b/config/packages/maker.yaml
@@ -0,0 +1,5 @@
+when@dev:
+ maker:
+ root_namespace: 'Access\'
+ generate_final_classes: true
+ generate_final_entities: false
diff --git a/config/packages/monolog.yaml b/config/packages/monolog.yaml
new file mode 100644
index 0000000000..8c9efa91e0
--- /dev/null
+++ b/config/packages/monolog.yaml
@@ -0,0 +1,61 @@
+monolog:
+ channels:
+ - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists
+
+when@dev:
+ monolog:
+ handlers:
+ main:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+ channels: ["!event"]
+ # uncomment to get logging in your browser
+ # you may have to allow bigger header sizes in your Web server configuration
+ #firephp:
+ # type: firephp
+ # level: info
+ #chromephp:
+ # type: chromephp
+ # level: info
+ console:
+ type: console
+ process_psr_3_messages: false
+ channels: ["!event", "!doctrine", "!console"]
+
+when@test:
+ monolog:
+ handlers:
+ main:
+ type: fingers_crossed
+ action_level: error
+ handler: nested
+ excluded_http_codes: [404, 405]
+ channels: ["!event"]
+ nested:
+ type: stream
+ path: "%kernel.logs_dir%/%kernel.environment%.log"
+ level: debug
+
+when@prod:
+ monolog:
+ handlers:
+ main:
+ type: fingers_crossed
+ action_level: error
+ handler: nested
+ excluded_http_codes: [404, 405]
+ buffer_size: 50 # How many messages should be saved? Prevent memory leaks
+ nested:
+ type: stream
+ path: php://stderr
+ level: debug
+ formatter: monolog.formatter.json
+ console:
+ type: console
+ process_psr_3_messages: false
+ channels: ["!event", "!doctrine"]
+ deprecation:
+ type: stream
+ channels: [deprecation]
+ path: php://stderr
diff --git a/config/packages/nyholm_psr7.yaml b/config/packages/nyholm_psr7.yaml
new file mode 100644
index 0000000000..ade8312498
--- /dev/null
+++ b/config/packages/nyholm_psr7.yaml
@@ -0,0 +1,11 @@
+services:
+ # Register nyholm/psr7 services for autowiring with PSR-17 (HTTP factories)
+ Psr\Http\Message\RequestFactoryInterface: '@nyholm.psr7.psr17_factory'
+ Psr\Http\Message\ResponseFactoryInterface: '@nyholm.psr7.psr17_factory'
+ Psr\Http\Message\ServerRequestFactoryInterface: '@nyholm.psr7.psr17_factory'
+ Psr\Http\Message\StreamFactoryInterface: '@nyholm.psr7.psr17_factory'
+ Psr\Http\Message\UploadedFileFactoryInterface: '@nyholm.psr7.psr17_factory'
+ Psr\Http\Message\UriFactoryInterface: '@nyholm.psr7.psr17_factory'
+
+ nyholm.psr7.psr17_factory:
+ class: Nyholm\Psr7\Factory\Psr17Factory
diff --git a/config/packages/property_info.yaml b/config/packages/property_info.yaml
new file mode 100644
index 0000000000..86eedb23f3
--- /dev/null
+++ b/config/packages/property_info.yaml
@@ -0,0 +1,3 @@
+framework:
+ property_info:
+
diff --git a/config/packages/routing.yaml b/config/packages/routing.yaml
new file mode 100644
index 0000000000..4b766ce57f
--- /dev/null
+++ b/config/packages/routing.yaml
@@ -0,0 +1,12 @@
+framework:
+ router:
+ utf8: true
+
+ # Configure how to generate URLs in non-HTTP contexts, such as CLI commands.
+ # See https://symfony.com/doc/current/routing.html#generating-urls-in-commands
+ #default_uri: http://localhost
+
+when@prod:
+ framework:
+ router:
+ strict_requirements: null
diff --git a/config/packages/security.yaml b/config/packages/security.yaml
new file mode 100644
index 0000000000..d3aafc3b58
--- /dev/null
+++ b/config/packages/security.yaml
@@ -0,0 +1,60 @@
+security:
+ password_hashers:
+ ACCESS\Entity\User: 'auto'
+ Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
+ providers:
+ # used to reload user from session & other features (e.g. switch_user)
+ app_user_provider:
+ id: Access\Security\UsernameUserProvider
+ all_users:
+ chain:
+ providers: [ 'app_user_provider' ]
+
+ firewalls:
+ dev:
+ pattern: ^/(_(profiler|wdt)|css|images|js)/
+ security: false
+ main:
+ lazy: true
+ provider: all_users
+ custom_authenticators:
+ - Access\Security\Authenticators\FormLoginAuthenticator
+ - Access\Security\Authenticators\SimpleSamlPhpAuthenticator
+ switch_user: true
+ logout:
+ path: xdmod_logout
+ invalidate_session: true
+ access_denied_handler: Access\Security\AccessDeniedHandler
+ entry_point: Access\Security\Authenticators\FormLoginAuthenticator
+ api:
+ lazy: true
+ provider: all_users
+ json_login:
+ check_path: /api/login
+ login_path: /api/login
+ logout:
+ path: api_logout
+ target: /
+
+
+ # Easy way to control access for large sections of your site
+ # Note: Only the *first* access control that matches will be used
+ access_control:
+ - { path: ^/saml/login, roles: PUBLIC_ACCESS }
+ - { path: ^/saml/metadata, roles: PUBLIC_ACCESS }
+ # - { path: ^/, roles: PUBLIC_ACCESS}
+ # - { path: ^/admin, roles: ROLE_ADMIN }
+ # - { path: ^/profile, roles: ROLE_US1ER }
+
+when@test:
+ security:
+ password_hashers:
+ # By default, password hashers are resource intensive and take time. This is
+ # important to generate secure password hashes. In tests however, secure hashes
+ # are not important, waste resources and increase test times. The following
+ # reduces the work factor to the lowest possible values.
+ Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface:
+ algorithm: auto
+ cost: 4 # Lowest possible value for bcrypt
+ time_cost: 3 # Lowest possible value for argon
+ memory_cost: 10 # Lowest possible value for argon
diff --git a/config/packages/twig.yaml b/config/packages/twig.yaml
new file mode 100644
index 0000000000..4e25e4a5bd
--- /dev/null
+++ b/config/packages/twig.yaml
@@ -0,0 +1,7 @@
+twig:
+ default_path: '%kernel.project_dir%/templates'
+ file_name_pattern: '*.twig'
+
+when@test:
+ twig:
+ strict_variables: true
diff --git a/config/packages/twig_extensions.yaml b/config/packages/twig_extensions.yaml
new file mode 100644
index 0000000000..da780f5fa0
--- /dev/null
+++ b/config/packages/twig_extensions.yaml
@@ -0,0 +1,11 @@
+services:
+ _defaults:
+ public: false
+ autowire: true
+ autoconfigure: true
+
+ # Uncomment any lines below to activate that Twig extension
+ #Twig\Extensions\ArrayExtension: null
+ #Twig\Extensions\DateExtension: null
+ #Twig\Extensions\IntlExtension: null
+ #Twig\Extensions\TextExtension: null
diff --git a/config/packages/web_profiler.yaml b/config/packages/web_profiler.yaml
new file mode 100644
index 0000000000..f414c16548
--- /dev/null
+++ b/config/packages/web_profiler.yaml
@@ -0,0 +1,21 @@
+when@dev:
+ # web_profiler_wdt:
+ # resource: '@WebProfilerBundle/Resources/config/routing/wdt.xml'
+ # prefix: /_wdt
+ #
+ # web_profiler_profiler:
+ # resource: '@WebProfilerBundle/Resources/config/routing/profiler.xml'
+ # prefix: /_profiler
+ web_profiler:
+ toolbar: true
+ intercept_redirects: false
+ framework:
+ profiler: { only_exceptions: false }
+when@test:
+ web_profiler:
+ toolbar: false
+ intercept_redirects: false
+
+ framework:
+ profiler: { collect: false }
+
diff --git a/config/preload.php b/config/preload.php
new file mode 100644
index 0000000000..5ebcdb2153
--- /dev/null
+++ b/config/preload.php
@@ -0,0 +1,5 @@
+
-Federated Open XDMoD
-
- Federated XDMoD supports the collection and aggregation of data from a number of fully-functional and individually managed XDMoD instances into a single federated instance of XDMoD capable of displaying federation-wide metrics.
- Each participating institution deploys an XDMoD instance through which local data will be collected and shipped to a central Federation Hub where it is aggregated to provide a federation-wide view of the data.
- Data particular to an individual center is available from the Hub by applying filters and drill-downs.
-
-
-
-

-
-
-
- Example data flow from heterogeneous computing resources to an XDMoD federated hub.
- XDMoD instances X and Y ingest data into their databases from the computing resources that they monitor.
- Following ingestion on the satellite instances, job data are replicated to the federated hub's database, where they are aggregated for use in the federated XDMoD user interface.
-
-
-
-
-
-
- A simple example use of the federated module is:
- Three academic instituitions each with their own HPC resource.
- Each institution has its own XDMoD instance which contains the accounting data for only their HPC resource.
- These institutions federate their data to a central hub.
- HPC accounting data for all three HPC resources is shown on the central hub.
- This central hub can then be used to report on the combined data.
-
-
- This example illistrates only one use case.
- The federated module supports cloud data as well as HPC. Support for other data realms is planned.
- There are no pre defined limits on the number of instances that can be part of a federation.
-
-
- For more information see Section II of Federating XDMoD to Monitor Affiliated Computing Resources.
-
-
- Documentation avialable at https://federated.xdmod.org.
-
-
- Source code and downloads at https://github.com/ubccr/xdmod-federated.
-
-$key.
- *
- * @param str $section the section in which the desired value resides.
- * @param str $key the key under which the desired value can be found.
- * @param mixed $default the default value to provide if there is nothing found.
- *
- * @return mixed
- **/
-function getConfigValue($section, $key, $default = null)
-{
- try {
- $result = \xd_utilities\getConfiguration($section, $key);
- } catch(\Exception $e) {
- $result = $default;
- }
- return $result;
-}
-
-$role = getConfigValue('federated', 'role');
-if($role === 'instance'){
- $hubUrl = getConfigValue('federated', 'huburl');
- echo 'This instance is part of a federation
';
- echo 'Federation Hub: ' . $hubUrl .'';
-}
-elseif ($role === 'hub'){
- $db = DB::factory('datawarehouse');
- $instanceResults = $db->query('SELECT * FROM federation_instances;');
- $instances = array();
- $lastCloudQuery = array();
- $derived = 1;
- foreach ($instanceResults as $instance) {
- $prefix = $instance['prefix'];
- $extra = json_decode($instance['extra'], true);
- $instances[$prefix] = array(
- 'contact' => $extra['contact'],
- 'url' => $extra['url'],
- 'lastCloudEvent' => null,
- 'lastJobTask' => null
- );
- unset($extra['contact']);
- unset($extra['url']);
- $instances[$prefix]['extra'] = $extra;
- array_push(
- $lastCloudQuery,
- '(SELECT \'' . $prefix . '\' AS prefix, FROM_UNIXTIME(event_time_ts) as event_ts FROM `' . $prefix . '-modw_cloud`.`event` ORDER BY 2 DESC LIMIT 1) `A' . $derived . '`'
- );
- $derived++;
- }
- $lastCloudResults = $db->query('SELECT * FROM ' . implode($lastCloudQuery, ' UNION ALL SELECT * FROM '));
- foreach ($lastCloudResults as $result) {
- $instances[$result['prefix']]['lastCloudEvent'] = $result['event_ts'];
- }
- echo 'Instances that are part of this Federation
';
- foreach($instances as $instance){
- echo '' . $instance['url'] . '
last event retrieved (' . $instance['lastCloudEvent'] . ') ';
- }
- echo '
';
-}
-else {
- echo 'This installation is not part of a federation.';
-}
diff --git a/html/about/images/Case_Western_logo.png b/html/about/images/Case_Western_logo.png
deleted file mode 100644
index aedb6ae1d34c88b47d334efbe3b70843a2451bfc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 81675
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
z
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