diff --git a/.circleci/config.yml b/.circleci/config.yml
index efa6c98678..756700f19d 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -27,18 +27,33 @@ 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
- run:
name: Generate Cert for XDMoD
command: docker exec xdmod /usr/bin/openssl req -new -key /etc/pki/tls/private/localhost.key -x509 -sha256 -days 365 -set_serial $RANDOM -extensions v3_req -out /etc/pki/tls/certs/localhost.crt -subj "/C=XX/L=Default City/O=Default Company Ltd"
+ - run:
+ name: Update PHP to PHP8.2
+ command: |
+ docker exec xdmod dnf module reset -y php
+ docker exec xdmod dnf module enable -y php:8.2
+ docker exec xdmod dnf install -y php-devel openssl-devel
+ docker exec xdmod dnf update -y php php-common php-opcache php-cli php-gd php-curl php-pear php-zip php-gmp php-pdo php-xml php-mbstring php-mysqlnd php-pecl-apcu php-pecl-json php-pear
+ docker exec xdmod pecl uninstall mongodb-1.18.1
+ docker exec xdmod pecl install mongodb-1.18.1
+ docker exec xdmod pecl install zip
+ docker exec xdmod dnf remove -y php-devel openssl-devel
+ docker exec xdmod bash -c ">/var/log/php_errors.log"
- run:
name: Copy Files for Playwright and XDMoD containers
command: |
docker cp ~/project xdmod:/root/xdmod
- docker cp ~/project playwright:/root/xdmod
+ docker exec playwright mkdir -p /root/xdmod/tests/ /root/xdmod/tests/artifacts/xdmod/
+ docker cp ~/project/tests/playwright playwright:/root/xdmod/tests/
+ docker cp ~/project/tests/ci playwright:/root/xdmod/tests/
+ docker cp ~/project/tests/artifacts/xdmod/ui playwright:/root/xdmod/tests/artifacts/xdmod/
- run:
name: Create test result directories
command: |
@@ -56,6 +71,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 +100,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
@@ -187,7 +209,7 @@ jobs:
- run:
name: Ensure that no PHP command-line errors were generated
command: |
- docker exec xdmod /bin/bash -c "if [ -s /var/log/php_errors.log ]; then cat /var/log/php_errors.log; false; fi"
+ docker exec xdmod /bin/bash -c "if [ -s /var/log/php_errors.log ]; then cat /var/log/php_errors.log | grep -v 'Warning'; false; fi"
- store_artifacts:
path: /tmp/screenshots
- store_artifacts:
diff --git a/.env b/.env
new file mode 100644
index 0000000000..7cc2298afd
--- /dev/null
+++ b/.env
@@ -0,0 +1,9 @@
+# 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 ###
+XDMOD_LOG_DIR=/var/log/xdmod
diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml
index 5a65f30d08..5dc30714e4 100644
--- a/.github/workflows/linter.yml
+++ b/.github/workflows/linter.yml
@@ -25,7 +25,7 @@ jobs:
- name: Setup php
uses: shivammathur/setup-php@v2
with:
- php-version: '7.4'
+ php-version: '8.2'
extensions: xml
tools: composer:v2
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..fc5a44d74a
--- /dev/null
+++ b/bin/console
@@ -0,0 +1,39 @@
+#!/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/CCRDBFormatter.php b/classes/CCR/CCRDBFormatter.php
index c34ff313d6..c2e3f1ebab 100644
--- a/classes/CCR/CCRDBFormatter.php
+++ b/classes/CCR/CCRDBFormatter.php
@@ -3,6 +3,7 @@
namespace CCR;
use Monolog\Formatter\NormalizerFormatter;
+use Monolog\LogRecord;
class CCRDBFormatter extends NormalizerFormatter
{
@@ -12,7 +13,7 @@ class CCRDBFormatter extends NormalizerFormatter
* all of the properties from the context. If the message is an empty
* string the message property is not added.
*/
- public function format(array $record)
+ public function format(LogRecord $record)
{
$vars = parent::format($record);
diff --git a/classes/CCR/CCRDBHandler.php b/classes/CCR/CCRDBHandler.php
index b56bbc5adf..a67bf5ff51 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,16 @@ 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);
-
- $this->db->execute($sql, array(
+ $params = [
':id' => $this->getNextId(),
':ident' => $record['channel'],
':priority' => Log::convertToCCRLevel($record['level']),
':message' => $record['formatted']
- ));
+ ];
+ $this->db->execute($sql, $params);
}
/**
diff --git a/classes/CCR/CCRLineFormatter.php b/classes/CCR/CCRLineFormatter.php
index 897f7d2941..a795d17fbf 100644
--- a/classes/CCR/CCRLineFormatter.php
+++ b/classes/CCR/CCRLineFormatter.php
@@ -4,6 +4,7 @@
use Monolog\Formatter\LineFormatter;
use Monolog\Formatter\NormalizerFormatter;
+use Monolog\LogRecord;
use Monolog\Utils;
class CCRLineFormatter extends LineFormatter
@@ -45,7 +46,7 @@ protected function toJson($data, $ignoreErrors = false): string
* string and context object. If either the context is empty or the message
* is an empty string they are ommitted.
*/
- public function format(array $record)
+ public function format(LogRecord $record): string
{
$vars = NormalizerFormatter::format($record);
@@ -98,6 +99,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..bd2d7f8ef6 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') {
@@ -262,7 +264,7 @@ protected static function getDbHandler($ident, array $conf)
{
$dbLogLevel = $conf['dbLogLevel'] ?? self::getDefaultLogLevel('db');
- $handler = new CCRDBHandler(null, null, null, self::convertToMonologLevel($dbLogLevel));
+ $handler = new CCRDBHandler(null, null, null, $dbLogLevel);
$handler->setFormatter(new CCRDBFormatter());
return $handler;
@@ -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/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/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/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/OpenXdmod/Migration/AclConfigMigration.php b/classes/OpenXdmod/Migration/AclConfigMigration.php
index c266e91870..ffbc2ff106 100644
--- a/classes/OpenXdmod/Migration/AclConfigMigration.php
+++ b/classes/OpenXdmod/Migration/AclConfigMigration.php
@@ -18,9 +18,10 @@ public function execute()
$cmd = BIN_DIR . '/acl-config';
$output = shell_exec($cmd);
- $hadError = strpos($output, 'error') !== false;
- if ($hadError) {
+ if ($output === false) {
+ $this->logger->error("Error executing acl-config");
+ } else if ($output !== null) {
$this->logger->error($output);
}
}
diff --git a/classes/OpenXdmod/Migration/DotEnvConfigMigration.php b/classes/OpenXdmod/Migration/DotEnvConfigMigration.php
new file mode 100644
index 0000000000..c64cd1ec62
--- /dev/null
+++ b/classes/OpenXdmod/Migration/DotEnvConfigMigration.php
@@ -0,0 +1,49 @@
+apply([
+ 'app_secret' => hash('sha512', time())
+ ]);
+ file_put_contents(BASE_DIR . '/.env', $envTemplate->getContents());
+
+ $cmdBase = 'APP_ENV=prod APP_DEBUG=0';
+ $console = BIN_DIR .'/console';
+
+ // Make sure to clear the cache before dumping the dotenv so we start clean.
+ $this->executeCommand("$cmdBase $console cache:clear");
+
+ // Dump dotenv data so we don't read .env each time in prod.
+ // Note: this means that if you want to start debugging stuff you'll need to delete the generated .env.
+ $this->executeCommand("$cmdBase $console dotenv:dump");
+ }
+ }
+
+ protected function executeCommand($command)
+ {
+ $output = array();
+ $returnVar = 0;
+
+ exec($command . ' 2>&1', $output, $returnVar);
+
+ if ($returnVar != 0) {
+ $msg = "Command exited with non-zero return status:\n"
+ . "command = $command\noutput =\n" . implode("\n", $output);
+ throw new \Exception($msg);
+ }
+
+ return $output;
+ }
+
+
+}
diff --git a/classes/OpenXdmod/Migration/MigrationFactory.php b/classes/OpenXdmod/Migration/MigrationFactory.php
index c51f21df0f..c9c4ad29bf 100644
--- a/classes/OpenXdmod/Migration/MigrationFactory.php
+++ b/classes/OpenXdmod/Migration/MigrationFactory.php
@@ -93,6 +93,7 @@ function ($class) use ($databasesMigrationName) {
}
$migrations[] = new AclConfigMigration($fromVersion, $toVersion);
+ $migrations[] = new DotEnvConfigMigration($fromVersion, $toVersion);
$migration = new CompositeMigration(
$fromVersion,
diff --git a/classes/OpenXdmod/Setup/GeneralSetup.php b/classes/OpenXdmod/Setup/GeneralSetup.php
index 19c6403441..5eaa99f88b 100644
--- a/classes/OpenXdmod/Setup/GeneralSetup.php
+++ b/classes/OpenXdmod/Setup/GeneralSetup.php
@@ -5,6 +5,8 @@
namespace OpenXdmod\Setup;
+use Xdmod\Template;
+
/**
* General setup.
*/
@@ -124,5 +126,21 @@ public function handle()
);
$this->saveIniConfig($settings, 'portal_settings');
+
+ $envTemplate = new Template('env');
+ $envTemplate->apply([
+ 'app_secret' => hash('sha512', time())
+ ]);
+ $this->saveTemplate($envTemplate, BASE_DIR . '/.env');
+
+ $cmdBase = 'APP_ENV=prod APP_DEBUG=0';
+ $console = BIN_DIR .'/console';
+
+ // Make sure to clear the cache before dumping the dotenv so we start clean.
+ $this->executeCommand("$cmdBase $console cache:clear");
+
+ // Dump dotenv data so we don't read .env each time in prod.
+ // Note: this means that if you want to start debugging stuff you'll need to delete the generated .env.
+ $this->executeCommand("$cmdBase $console dotenv:dump");
}
}
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
deleted file mode 100644
index 338cf5837a..0000000000
--- a/classes/Rest/Controllers/BaseControllerProvider.php
+++ /dev/null
@@ -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/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
deleted file mode 100644
index 59b43a1386..0000000000
--- a/classes/Rest/XdmodApplicationFactory.php
+++ /dev/null
@@ -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/XDController.php b/classes/XDController.php
deleted file mode 100644
index 8edc4f177d..0000000000
--- a/classes/XDController.php
+++ /dev/null
@@ -1,82 +0,0 @@
-_requirements = $requirements;
- $this->_registered_operations = array();
-
- $this->_operation_handler_directory = $basePath.'/'.substr(basename($_SERVER["SCRIPT_NAME"]), 0, -4);
-
- }//construct
-
- // ---------------------------
-
- public function registerOperation($operation) {
-
- $this->_registered_operations[] = $operation;
-
- }//registerOperation
-
- // ---------------------------
-
- public function invoke($method, $session_variable = 'xdUser') {
-
-
- xd_security\enforceUserRequirements($this->_requirements, $session_variable);
-
- // --------------------
-
- $params = array('operation' => RESTRICTION_OPERATION);
-
- $isValid = xd_security\secureCheck($params, $method);
-
- if (!$isValid) {
- $returnData['status'] = 'operation_not_specified';
- $returnData['success'] = false;
- $returnData['totalCount'] = 0;
- $returnData['message'] = 'operation_not_specified';
- $returnData['data'] = array();
- xd_controller\returnJSON($returnData);
- };
-
- // --------------------
-
- if(!in_array($_REQUEST['operation'], $this->_registered_operations)){
- $returnData['status'] = 'invalid_operation_specified';
- $returnData['success'] = false;
- $returnData['totalCount'] = 0;
- $returnData['message'] = 'invalid_operation_specified';
- $returnData['data'] = array();
- xd_controller\returnJSON($returnData);
- }
-
- $operation_handler = $this->_operation_handler_directory.'/'.$_REQUEST['operation'].'.php';
-
- if (file_exists($operation_handler)){
- include $operation_handler;
- }
- else{
- $returnData['status'] = 'operation_not_defined';
- $returnData['success'] = false;
- $returnData['totalCount'] = 0;
- $returnData['message'] = 'operation_not_defined';
- $returnData['data'] = array();
- xd_controller\returnJSON($returnData);
- }
-
- }//invoke
-
- }//XDController
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..c4b83e3398 100644
--- a/composer.json
+++ b/composer.json
@@ -1,43 +1,57 @@
{
- "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",
+ "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 +215,10 @@
"external_libraries/{$name}": [
"zendframework/zendframework-minimal"
]
+ },
+ "public-dir": "html",
+ "symfony": {
+ "docker": false
}
},
"config": {
@@ -209,15 +227,22 @@
"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": [
"configuration/constants.php",
"libraries/response.php",
"libraries/web_message.php",
- "libraries/rest.php",
"libraries/versioning.php",
"libraries/date.php",
"libraries/utilities.php",
@@ -232,7 +257,6 @@
"classes/XDChartPool.php",
"classes/XDStatistics.php",
"classes/SessionExpiredException.php",
- "classes/XDController.php",
"classes/XDUser.php",
"classes/UniqueException.php",
"classes/XDError.php",
@@ -249,7 +273,7 @@
],
"psr-4": {
"Authentication\\": "classes/Authentication/",
- "CCR\\": "classes/CCR/",
+ "CCR\\": ["classes/CCR/", "src/"],
"Common\\": "classes/Common/",
"Configuration\\": "classes/Configuration/",
"DataWarehouse\\": "classes/DataWarehouse/",
@@ -260,9 +284,28 @@
"Realm\\": "classes/Realm/",
"ReportTemplates\\": "classes/ReportTemplates/",
"Reports\\": "classes/Reports/",
- "Rest\\": "classes/Rest/",
"User\\": "classes/User/",
"Xdmod\\": "classes/Xdmod/"
}
+ },
+ "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..9efd30571f 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": "a50a7ac9c87d0fb8292f93eaed72241c",
"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",
@@ -233,33 +233,82 @@
],
"time": "2021-09-13T08:19:44+00:00"
},
+ {
+ "name": "doctrine/deprecations",
+ "version": "1.1.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/deprecations.git",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<=7.5 || >=13"
+ },
+ "require-dev": {
+ "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": {
+ "Doctrine\\Deprecations\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "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/doctrine/deprecations/issues",
+ "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
+ },
+ "time": "2025-04-07T20:06:18+00:00"
+ },
{
"name": "doctrine/lexer",
- "version": "1.2.3",
+ "version": "3.0.1",
"source": {
"type": "git",
"url": "https://github.com/doctrine/lexer.git",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229"
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/lexer/zipball/c268e882d4dbdd85e36e4ad69e02dc284f89d229",
- "reference": "c268e882d4dbdd85e36e4ad69e02dc284f89d229",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
+ "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "doctrine/coding-standard": "^9.0",
- "phpstan/phpstan": "^1.3",
- "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5",
- "vimeo/psalm": "^4.11"
+ "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": {
- "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+ "Doctrine\\Common\\Lexer\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -291,7 +340,7 @@
],
"support": {
"issues": "https://github.com/doctrine/lexer/issues",
- "source": "https://github.com/doctrine/lexer/tree/1.2.3"
+ "source": "https://github.com/doctrine/lexer/tree/3.0.1"
},
"funding": [
{
@@ -307,34 +356,43 @@
"type": "tidelift"
}
],
- "time": "2022-02-28T11:07:21+00:00"
+ "time": "2024-02-05T11:56:58+00:00"
},
{
"name": "egulias/email-validator",
- "version": "1.2.17",
+ "version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/egulias/EmailValidator.git",
- "reference": "19674b35a0a3456be1b96e137098d31ed386fb61"
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/19674b35a0a3456be1b96e137098d31ed386fb61",
- "reference": "19674b35a0a3456be1b96e137098d31ed386fb61",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
+ "reference": "d42c8731f0624ad6bdc8d3e5e9a4524f68801cfa",
"shasum": ""
},
"require": {
- "doctrine/lexer": "^1.0.1",
- "php": ">=5.3.3"
+ "doctrine/lexer": "^2.0 || ^3.0",
+ "php": ">=8.1",
+ "symfony/polyfill-intl-idn": "^1.26"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.36|^7.5.15",
- "satooshi/php-coveralls": "^1.0.1"
+ "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": "4.0.x-dev"
+ }
+ },
"autoload": {
- "psr-0": {
- "Egulias\\": "src/"
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -346,7 +404,7 @@
"name": "Eduardo Gulias Davis"
}
],
- "description": "A library for validating emails",
+ "description": "A library for validating emails against several RFCs",
"homepage": "https://github.com/egulias/EmailValidator",
"keywords": [
"email",
@@ -357,32 +415,38 @@
],
"support": {
"issues": "https://github.com/egulias/EmailValidator/issues",
- "source": "https://github.com/egulias/EmailValidator/tree/1.2"
+ "source": "https://github.com/egulias/EmailValidator/tree/4.0.4"
},
- "time": "2020-04-11T12:59:45+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2025-03-06T22:45:56+00:00"
},
{
"name": "firebase/php-jwt",
- "version": "v6.10.0",
+ "version": "v6.11.1",
"source": {
"type": "git",
"url": "https://github.com/firebase/php-jwt.git",
- "reference": "a49db6f0a5033aef5143295342f1c95521b075ff"
+ "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff",
- "reference": "a49db6f0a5033aef5143295342f1c95521b075ff",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
+ "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66",
"shasum": ""
},
"require": {
- "php": "^7.4||^8.0"
+ "php": "^8.0"
},
"require-dev": {
- "guzzlehttp/guzzle": "^6.5||^7.4",
+ "guzzlehttp/guzzle": "^7.4",
"phpspec/prophecy-phpunit": "^2.0",
"phpunit/phpunit": "^9.5",
- "psr/cache": "^1.0||^2.0",
+ "psr/cache": "^2.0||^3.0",
"psr/http-client": "^1.0",
"psr/http-factory": "^1.0"
},
@@ -420,9 +484,91 @@
],
"support": {
"issues": "https://github.com/firebase/php-jwt/issues",
- "source": "https://github.com/firebase/php-jwt/tree/v6.10.0"
+ "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"
},
- "time": "2023-12-01T16:26:39+00:00"
+ "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/Ocramius",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ocramius/proxy-manager",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2024-03-20T12:50:41+00:00"
},
{
"name": "geoip2/geoip2",
@@ -484,33 +630,28 @@
},
{
"name": "gettext/gettext",
- "version": "v3.6.1",
+ "version": "v5.7.3",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Gettext.git",
- "reference": "cd3be64443551e3a693117c4bccbe53e36282456"
+ "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/cd3be64443551e3a693117c4bccbe53e36282456",
- "reference": "cd3be64443551e3a693117c4bccbe53e36282456",
+ "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
+ "reference": "95820f020e4f2f05e0bbaa5603e4c6ec3edc50f1",
"shasum": ""
},
"require": {
- "gettext/languages": "2.*",
- "php": ">=5.3.0"
+ "gettext/languages": "^2.3",
+ "php": "^7.2|^8.0"
},
"require-dev": {
- "illuminate/view": "*",
- "symfony/yaml": "~2",
- "twig/extensions": "*",
- "twig/twig": "*"
- },
- "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"
+ "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": {
@@ -531,7 +672,7 @@
}
],
"description": "PHP gettext manager",
- "homepage": "https://github.com/oscarotero/Gettext",
+ "homepage": "https://github.com/php-gettext/Gettext",
"keywords": [
"JS",
"gettext",
@@ -542,23 +683,37 @@
],
"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/php-gettext/Gettext/issues",
+ "source": "https://github.com/php-gettext/Gettext/tree/v5.7.3"
},
- "time": "2016-08-01T18:09:57+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": "2024-12-01T10:18:08+00:00"
},
{
"name": "gettext/languages",
- "version": "2.10.0",
+ "version": "2.12.1",
"source": {
"type": "git",
"url": "https://github.com/php-gettext/Languages.git",
- "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab"
+ "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
- "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab",
+ "url": "https://api.github.com/repos/php-gettext/Languages/zipball/0b0b0851c55168e1dfb14305735c64019732b5f1",
+ "reference": "0b0b0851c55168e1dfb14305735c64019732b5f1",
"shasum": ""
},
"require": {
@@ -568,7 +723,8 @@
"phpunit/phpunit": "^4.8 || ^5.7 || ^6.5 || ^7.5 || ^8.4"
},
"bin": [
- "bin/export-plural-rules"
+ "bin/export-plural-rules",
+ "bin/import-cldr-data"
],
"type": "library",
"autoload": {
@@ -607,7 +763,7 @@
],
"support": {
"issues": "https://github.com/php-gettext/Languages/issues",
- "source": "https://github.com/php-gettext/Languages/tree/2.10.0"
+ "source": "https://github.com/php-gettext/Languages/tree/2.12.1"
},
"funding": [
{
@@ -619,34 +775,108 @@
"type": "github"
}
],
- "time": "2022-10-18T15:00:10+00:00"
+ "time": "2025-03-19T11:14:02+00:00"
+ },
+ {
+ "name": "gettext/translator",
+ "version": "v1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-gettext/Translator.git",
+ "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-gettext/Translator/zipball/8ae0ac79053bcb732a6c584cd86f7a82ef183161",
+ "reference": "8ae0ac79053bcb732a6c584cd86f7a82ef183161",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2|^8.0"
+ },
+ "require-dev": {
+ "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": {
+ "gettext/gettext": "Is necessary to load and generate array files used by the translator"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Gettext\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Oscar Otero",
+ "email": "oom@oscarotero.com",
+ "homepage": "http://oscarotero.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Gettext translator functions",
+ "homepage": "https://github.com/php-gettext/Translator",
+ "keywords": [
+ "gettext",
+ "i18n",
+ "php",
+ "translator"
+ ],
+ "support": {
+ "email": "oom@oscarotero.com",
+ "issues": "https://github.com/php-gettext/Translator/issues",
+ "source": "https://github.com/php-gettext/Translator/tree/v1.2.1"
+ },
+ "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": "google/recaptcha",
- "version": "1.2.4",
+ "version": "1.3.1",
"source": {
"type": "git",
"url": "https://github.com/google/recaptcha.git",
- "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419"
+ "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/google/recaptcha/zipball/614f25a9038be4f3f2da7cbfd778dc5b357d2419",
- "reference": "614f25a9038be4f3f2da7cbfd778dc5b357d2419",
+ "url": "https://api.github.com/repos/google/recaptcha/zipball/56522c261d2e8c58ba416c90f81a4cd9f2ed89b9",
+ "reference": "56522c261d2e8c58ba416c90f81a4cd9f2ed89b9",
"shasum": ""
},
"require": {
- "php": ">=5.5"
+ "php": ">=8"
},
"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"
+ "friendsofphp/php-cs-fixer": "^3.14",
+ "php-coveralls/php-coveralls": "^2.5",
+ "phpunit/phpunit": "^10"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-master": "1.3.x-dev"
}
},
"autoload": {
@@ -671,20 +901,20 @@
"issues": "https://github.com/google/recaptcha/issues",
"source": "https://github.com/google/recaptcha"
},
- "time": "2020-03-31T17:50:54+00:00"
+ "time": "2025-06-26T22:21:57+00:00"
},
{
"name": "greenlion/php-sql-parser",
- "version": "v4.6.0",
+ "version": "v4.7.0",
"source": {
"type": "git",
"url": "https://github.com/greenlion/PHP-SQL-Parser.git",
- "reference": "f0e4645eb1612f0a295e3d35bda4c7740ae8c366"
+ "reference": "0cd49149efc5868db9c32d1a09558ea516892586"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/greenlion/PHP-SQL-Parser/zipball/f0e4645eb1612f0a295e3d35bda4c7740ae8c366",
- "reference": "f0e4645eb1612f0a295e3d35bda4c7740ae8c366",
+ "url": "https://api.github.com/repos/greenlion/PHP-SQL-Parser/zipball/0cd49149efc5868db9c32d1a09558ea516892586",
+ "reference": "0cd49149efc5868db9c32d1a09558ea516892586",
"shasum": ""
},
"require": {
@@ -693,7 +923,7 @@
"require-dev": {
"analog/analog": "^1.0.6",
"phpunit/phpunit": "^9.5.13",
- "squizlabs/php_codesniffer": "^1.5.1"
+ "squizlabs/php_codesniffer": "^2.8.1"
},
"type": "library",
"autoload": {
@@ -731,7 +961,123 @@
"issues": "https://github.com/greenlion/PHP-SQL-Parser/issues",
"source": "https://github.com/greenlion/PHP-SQL-Parser"
},
- "time": "2023-03-09T20:54:23+00:00"
+ "time": "2024-12-02T12:14:07+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "2.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/c2270caaabe631b3b44c85f99e5a04bbb8060d16",
+ "reference": "c2270caaabe631b3b44c85f99e5a04bbb8060d16",
+ "shasum": ""
+ },
+ "require": {
+ "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": {
+ "bamarni-bin": {
+ "bin-links": true,
+ "forward-command": false
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "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": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "support": {
+ "issues": "https://github.com/guzzle/psr7/issues",
+ "source": "https://github.com/guzzle/psr7/tree/2.7.1"
+ },
+ "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": "ircmaxell/password-compat",
@@ -780,95 +1126,51 @@
"time": "2014-11-20T16:49:30+00:00"
},
{
- "name": "jaimeperez/twig-configurable-i18n",
- "version": "v1.2",
- "source": {
- "type": "git",
- "url": "https://github.com/jaimeperez/twig-configurable-i18n.git",
- "reference": "75d4926fd102c9e62219ad7f94a6136d2f2ccd93"
- },
+ "name": "jquery/jquery-min-file",
+ "version": "3.7.1",
"dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/jaimeperez/twig-configurable-i18n/zipball/75d4926fd102c9e62219ad7f94a6136d2f2ccd93",
- "reference": "75d4926fd102c9e62219ad7f94a6136d2f2ccd93",
- "shasum": ""
+ "type": "file",
+ "url": "https://code.jquery.com/jquery-3.7.1.min.js",
+ "shasum": "ee48592d1fff952fcf06ce0b666ed4785493afdc"
},
"require": {
- "twig/extensions": "^1.3"
+ "composer/installers": "~1.0"
},
- "type": "project",
- "autoload": {
- "psr-4": {
- "JaimePerez\\TwigConfigurableI18n\\": "src/"
- }
+ "type": "vanilla-plugin",
+ "extra": {
+ "installer-name": "jquery"
},
- "notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1"
- ],
- "authors": [
- {
- "name": "Jaime Perez",
- "email": "jaime.perez@uninett.no"
- }
- ],
- "description": "This is an extension on top of Twig's i18n extension, allowing you to customize which functions to use for translations.",
- "keywords": [
- "extension",
- "gettext",
- "i18n",
- "internationalization",
- "translation",
- "twig"
- ],
- "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"
- },
- "license": [
- "MIT"
+ "MIT"
],
"homepage": "https://jquery.com"
},
{
"name": "justinrainbow/json-schema",
- "version": "v5.2.13",
+ "version": "6.4.2",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
- "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793"
+ "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/fbbe7e5d79f618997bc3332a6f49246036c45793",
- "reference": "fbbe7e5d79f618997bc3332a6f49246036c45793",
+ "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
+ "reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "ext-json": "*",
+ "marc-mabe/php-enum": "^4.0",
+ "php": "^7.2 || ^8.0"
},
"require-dev": {
- "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1",
+ "friendsofphp/php-cs-fixer": "3.3.0",
"json-schema/json-schema-test-suite": "1.2.0",
- "phpunit/phpunit": "^4.8.35"
+ "marc-mabe/php-enum-phpstan": "^2.0",
+ "phpspec/prophecy": "^1.19",
+ "phpstan/phpstan": "^1.12",
+ "phpunit/phpunit": "^8.5"
},
"bin": [
"bin/validate-json"
@@ -876,7 +1178,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0.x-dev"
+ "dev-master": "6.x-dev"
}
},
"autoload": {
@@ -907,44 +1209,38 @@
}
],
"description": "A library to validate a json schema.",
- "homepage": "https://github.com/justinrainbow/json-schema",
+ "homepage": "https://github.com/jsonrainbow/json-schema",
"keywords": [
"json",
"schema"
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
- "source": "https://github.com/jsonrainbow/json-schema/tree/v5.2.13"
+ "source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2"
},
- "time": "2023-09-26T02:20:38+00:00"
+ "time": "2025-06-03T18:27:04+00:00"
},
{
"name": "kassner/log-parser",
- "version": "1.5.0",
+ "version": "2.2.0",
"source": {
"type": "git",
"url": "https://github.com/kassner/log-parser.git",
- "reference": "ea846b7edf24a421c5484902b2501c9c8e065796"
+ "reference": "6a573bd2985c810e3c459d762cabfad1666c37b4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/kassner/log-parser/zipball/ea846b7edf24a421c5484902b2501c9c8e065796",
- "reference": "ea846b7edf24a421c5484902b2501c9c8e065796",
+ "url": "https://api.github.com/repos/kassner/log-parser/zipball/6a573bd2985c810e3c459d762cabfad1666c37b4",
+ "reference": "6a573bd2985c810e3c459d762cabfad1666c37b4",
"shasum": ""
},
"require": {
- "php": ">=5.3.4"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2.11",
- "phpmd/phpmd": "~2.1",
- "phpunit/phpunit": "~4.4",
- "sebastian/phpcpd": "~2.0"
+ "php": ">=7.4.0"
},
"type": "library",
"autoload": {
- "psr-0": {
- "Kassner": "src"
+ "psr-4": {
+ "Kassner\\LogParser\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -955,7 +1251,7 @@
{
"name": "Rafael Kassner",
"email": "kassner@gmail.com",
- "homepage": "http://www.kassner.com.br/",
+ "homepage": "https://www.kassner.com.br/",
"role": "Developer"
}
],
@@ -971,35 +1267,169 @@
],
"support": {
"issues": "https://github.com/kassner/log-parser/issues",
- "source": "https://github.com/kassner/log-parser/tree/master"
+ "source": "https://github.com/kassner/log-parser/tree/2.2.0"
+ },
+ "time": "2024-08-20T20:01:20+00:00"
+ },
+ {
+ "name": "laminas/laminas-code",
+ "version": "4.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laminas/laminas-code.git",
+ "reference": "1793e78dad4108b594084d05d1fb818b85b110af"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1793e78dad4108b594084d05d1fb818b85b110af",
+ "reference": "1793e78dad4108b594084d05d1fb818b85b110af",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0"
+ },
+ "require-dev": {
+ "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"
+ },
+ "suggest": {
+ "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features",
+ "laminas/laminas-stdlib": "Laminas\\Stdlib component"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Laminas\\Code\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "Extensions to the PHP Reflection API, static code scanning, and code generation",
+ "homepage": "https://laminas.dev",
+ "keywords": [
+ "code",
+ "laminas",
+ "laminasframework"
+ ],
+ "support": {
+ "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"
+ },
+ "funding": [
+ {
+ "url": "https://funding.communitybridge.org/projects/laminas-project",
+ "type": "community_bridge"
+ }
+ ],
+ "time": "2024-11-20T13:15:13+00:00"
+ },
+ {
+ "name": "marc-mabe/php-enum",
+ "version": "v4.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/marc-mabe/php-enum.git",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/marc-mabe/php-enum/zipball/7159809e5cfa041dca28e61f7f7ae58063aae8ed",
+ "reference": "7159809e5cfa041dca28e61f7f7ae58063aae8ed",
+ "shasum": ""
+ },
+ "require": {
+ "ext-reflection": "*",
+ "php": "^7.1 | ^8.0"
+ },
+ "require-dev": {
+ "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-3.x": "3.2-dev",
+ "dev-master": "4.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "MabeEnum\\": "src/"
+ },
+ "classmap": [
+ "stubs/Stringable.php"
+ ]
},
- "time": "2019-02-04T07:43:30+00:00"
+ "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.11.1",
+ "version": "v1.12.1",
"source": {
"type": "git",
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
- "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7"
+ "reference": "815939e006b7e68062b540ec9e86aaa8be2b6ce4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/1e66f73ffcf25e17c7a910a1317e9720a95497c7",
- "reference": "1e66f73ffcf25e17c7a910a1317e9720a95497c7",
+ "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"
+ "ext-maxminddb": "<1.11.1 || >=2.0.0"
},
"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.*"
},
@@ -1036,29 +1466,29 @@
],
"support": {
"issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
- "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.11.1"
+ "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.12.1"
},
- "time": "2023-12-02T00:09:23+00:00"
+ "time": "2025-05-05T20:56:32+00:00"
},
{
"name": "maxmind/web-service-common",
- "version": "v0.9.0",
+ "version": "v0.10.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/web-service-common-php.git",
- "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53"
+ "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
- "reference": "4dc5a3e8df38aea4ca3b1096cee3a038094e9b53",
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
+ "reference": "d7c7c42fc31bff26e0ded73a6e187bcfb193f9c4",
"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.*",
@@ -1087,9 +1517,9 @@
"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"
+ "source": "https://github.com/maxmind/web-service-common-php/tree/v0.10.0"
},
- "time": "2022-03-28T17:43:20+00:00"
+ "time": "2024-11-14T23:14:52+00:00"
},
{
"name": "moment/moment-min-file",
@@ -1133,16 +1563,16 @@
},
{
"name": "mongodb/mongodb",
- "version": "1.19.0",
+ "version": "1.18.0",
"source": {
"type": "git",
"url": "https://github.com/mongodb/mongo-php-library.git",
- "reference": "cbc8104c0b2c32b7cf572ff759324c872e8dc63a"
+ "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/cbc8104c0b2c32b7cf572ff759324c872e8dc63a",
- "reference": "cbc8104c0b2c32b7cf572ff759324c872e8dc63a",
+ "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/d421c418ef56a96f3dfa6b2828f936df6848ccf9",
+ "reference": "d421c418ef56a96f3dfa6b2828f936df6848ccf9",
"shasum": ""
},
"require": {
@@ -1165,7 +1595,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.x-dev"
+ "dev-master": "1.18.x-dev"
}
},
"autoload": {
@@ -1204,57 +1634,74 @@
],
"support": {
"issues": "https://github.com/mongodb/mongo-php-library/issues",
- "source": "https://github.com/mongodb/mongo-php-library/tree/1.19.0"
+ "source": "https://github.com/mongodb/mongo-php-library/tree/1.18.0"
},
- "time": "2024-05-10T19:49:08+00:00"
+ "time": "2024-03-27T17:04:50+00:00"
},
{
"name": "monolog/monolog",
- "version": "1.27.1",
+ "version": "3.9.0",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
- "reference": "904713c5929655dc9b97288b69cfeedad610c9a1"
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1",
- "reference": "904713c5929655dc9b97288b69cfeedad610c9a1",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/10d85740180ecba7896c87e06a166e0c95a0e3b6",
+ "reference": "10d85740180ecba7896c87e06a166e0c95a0e3b6",
"shasum": ""
},
"require": {
- "php": ">=5.3.0",
- "psr/log": "~1.0"
+ "php": ">=8.1",
+ "psr/log": "^2.0 || ^3.0"
},
"provide": {
- "psr/log-implementation": "1.0.0"
+ "psr/log-implementation": "3.0.0"
},
"require-dev": {
- "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "aws/aws-sdk-php": "^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"
+ "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-mongo": "Allow sending log messages to a MongoDB server",
+ "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 PHP Driver",
+ "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",
- "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"
+ "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"
@@ -1268,11 +1715,11 @@
{
"name": "Jordi Boggiano",
"email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
+ "homepage": "https://seld.be"
}
],
"description": "Sends your logs to files, sockets, inboxes, databases and various web services",
- "homepage": "http://github.com/Seldaek/monolog",
+ "homepage": "https://github.com/Seldaek/monolog",
"keywords": [
"log",
"logging",
@@ -1280,7 +1727,7 @@
],
"support": {
"issues": "https://github.com/Seldaek/monolog/issues",
- "source": "https://github.com/Seldaek/monolog/tree/1.27.1"
+ "source": "https://github.com/Seldaek/monolog/tree/3.9.0"
},
"funding": [
{
@@ -1292,36 +1739,49 @@
"type": "tidelift"
}
],
- "time": "2022-06-09T08:53:42+00:00"
+ "time": "2025-03-24T10:02:05+00:00"
},
{
- "name": "paragonie/random_compat",
- "version": "v2.0.21",
+ "name": "nyholm/psr7",
+ "version": "1.8.2",
"source": {
"type": "git",
- "url": "https://github.com/paragonie/random_compat.git",
- "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae"
+ "url": "https://github.com/Nyholm/psr7.git",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/paragonie/random_compat/zipball/96c132c7f2f7bc3230723b66e89f8f150b29d5ae",
- "reference": "96c132c7f2f7bc3230723b66e89f8f150b29d5ae",
+ "url": "https://api.github.com/repos/Nyholm/psr7/zipball/a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
+ "reference": "a71f2b11690f4b24d099d6b16690a90ae14fc6f3",
"shasum": ""
},
"require": {
- "php": ">=5.2.0"
+ "php": ">=7.2",
+ "psr/http-factory": "^1.0",
+ "psr/http-message": "^1.1 || ^2.0"
},
- "require-dev": {
- "phpunit/phpunit": "*"
+ "provide": {
+ "php-http/message-factory-implementation": "1.0",
+ "psr/http-factory-implementation": "1.0",
+ "psr/http-message-implementation": "1.0"
},
- "suggest": {
- "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ "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": {
- "files": [
- "lib/random.php"
- ]
+ "psr-4": {
+ "Nyholm\\Psr7\\": "src/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1329,134 +1789,130 @@
],
"authors": [
{
- "name": "Paragon Initiative Enterprises",
- "email": "security@paragonie.com",
- "homepage": "https://paragonie.com"
+ "name": "Tobias Nyholm",
+ "email": "tobias.nyholm@gmail.com"
+ },
+ {
+ "name": "Martijn van der Ven",
+ "email": "martijn@vanderven.se"
}
],
- "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "description": "A fast PHP7 implementation of PSR-7",
+ "homepage": "https://tnyholm.se",
"keywords": [
- "csprng",
- "polyfill",
- "pseudorandom",
- "random"
+ "psr-17",
+ "psr-7"
],
"support": {
- "email": "info@paragonie.com",
- "issues": "https://github.com/paragonie/random_compat/issues",
- "source": "https://github.com/paragonie/random_compat"
+ "issues": "https://github.com/Nyholm/psr7/issues",
+ "source": "https://github.com/Nyholm/psr7/tree/1.8.2"
},
- "time": "2022-02-16T17:07:03+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/Zegnat",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nyholm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-09-09T07:06:30+00:00"
},
{
- "name": "phpmailer/phpmailer",
- "version": "v6.9.1",
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/PHPMailer/PHPMailer.git",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18"
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/039de174cd9c17a8389754d3b877a2ed22743e18",
- "reference": "039de174cd9c17a8389754d3b877a2ed22743e18",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
"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"
+ "php": "^7.2 || ^8.0"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
"autoload": {
"psr-4": {
- "PHPMailer\\PHPMailer\\": "src/"
+ "phpDocumentor\\Reflection\\": "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": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
}
],
- "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
+ "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/PHPMailer/PHPMailer/issues",
- "source": "https://github.com/PHPMailer/PHPMailer/tree/v6.9.1"
+ "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
},
- "funding": [
- {
- "url": "https://github.com/Synchro",
- "type": "github"
- }
- ],
- "time": "2023-11-25T22:23:28+00:00"
+ "time": "2020-06-27T09:03:43+00:00"
},
{
- "name": "phpoffice/math",
- "version": "0.1.0",
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.6.2",
"source": {
"type": "git",
- "url": "https://github.com/PHPOffice/Math.git",
- "reference": "f0f8cad98624459c540cdd61d2a174d834471773"
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/Math/zipball/f0f8cad98624459c540cdd61d2a174d834471773",
- "reference": "f0f8cad98624459c540cdd61d2a174d834471773",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-xml": "*",
- "php": "^7.1|^8.0"
+ "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": {
- "phpstan/phpstan": "^0.12.88 || ^1.0.0",
- "phpunit/phpunit": "^7.0 || ^9.0"
+ "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": {
- "PhpOffice\\Math\\": "src/Math/",
- "Tests\\PhpOffice\\Math\\": "tests/Math/"
+ "phpDocumentor\\Reflection\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1465,82 +1921,318 @@
],
"authors": [
{
- "name": "Progi1984",
- "homepage": "https://lefevre.dev"
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
}
],
- "description": "Math - Manipulate Math Formula",
- "homepage": "https://phpoffice.github.io/Math/",
- "keywords": [
- "MathML",
- "officemathml",
- "php"
- ],
+ "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/PHPOffice/Math/issues",
- "source": "https://github.com/PHPOffice/Math/tree/0.1.0"
+ "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
},
- "time": "2023-09-25T12:08:20+00:00"
+ "time": "2025-04-13T19:20:35+00:00"
},
{
- "name": "phpoffice/phpword",
- "version": "1.2.0",
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.10.0",
"source": {
"type": "git",
- "url": "https://github.com/PHPOffice/PHPWord.git",
- "reference": "e76b701ef538cb749641514fcbc31a68078550fa"
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPOffice/PHPWord/zipball/e76b701ef538cb749641514fcbc31a68078550fa",
- "reference": "e76b701ef538cb749641514fcbc31a68078550fa",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/679e3ce485b99e84c775d28e2e96fade9a7fb50a",
+ "reference": "679e3ce485b99e84c775d28e2e96fade9a7fb50a",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-json": "*",
- "ext-xml": "*",
- "php": "^7.1|^8.0",
- "phpoffice/math": "^0.1"
+ "doctrine/deprecations": "^1.0",
+ "php": "^7.3 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0",
+ "phpstan/phpdoc-parser": "^1.18|^2.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"
- },
- "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"
+ "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": {
- "PhpOffice\\PhpWord\\": "src/PhpWord"
+ "phpDocumentor\\Reflection\\": "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": "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",
@@ -1587,62 +2279,56 @@
],
"support": {
"issues": "https://github.com/PHPOffice/PHPWord/issues",
- "source": "https://github.com/PHPOffice/PHPWord/tree/1.2.0"
+ "source": "https://github.com/PHPOffice/PHPWord/tree/1.4.0"
},
- "time": "2023-11-30T11:22:23+00:00"
+ "time": "2025-06-05T10:32:36+00:00"
},
{
- "name": "pimple/pimple",
- "version": "v3.5.0",
+ "name": "phpstan/phpdoc-parser",
+ "version": "2.2.0",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Pimple.git",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed"
+ "url": "https://github.com/phpstan/phpdoc-parser.git",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
- "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
+ "reference": "b9e61a61e39e02dd90944e9115241c7f7e76bfd8",
"shasum": ""
},
"require": {
- "php": ">=7.2.5",
- "psr/container": "^1.1 || ^2.0"
+ "php": "^7.4 || ^8.0"
},
"require-dev": {
- "symfony/phpunit-bridge": "^5.4@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",
- "extra": {
- "branch-alias": {
- "dev-master": "3.4.x-dev"
- }
- },
"autoload": {
- "psr-0": {
- "Pimple": "src/"
+ "psr-4": {
+ "PHPStan\\PhpDocParser\\": [
+ "src/"
+ ]
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
- "authors": [
- {
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
- }
- ],
- "description": "Pimple, a simple Dependency Injection Container",
- "homepage": "https://pimple.symfony.com",
- "keywords": [
- "container",
- "dependency injection"
- ],
+ "description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
- "source": "https://github.com/silexphp/Pimple/tree/v3.5.0"
+ "issues": "https://github.com/phpstan/phpdoc-parser/issues",
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.2.0"
},
- "time": "2021-10-28T11:13:42+00:00"
+ "time": "2025-07-13T07:04:09+00:00"
},
{
"name": "plotly/plotly",
@@ -1665,31 +2351,31 @@
"homepage": "https://github.com/plotly/plotly.js"
},
{
- "name": "psr/container",
- "version": "2.0.2",
+ "name": "psr/cache",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/container.git",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963"
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963",
- "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963",
+ "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
+ "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
- "php": ">=7.4.0"
+ "php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
- "Psr\\Container\\": "src/"
+ "Psr\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1702,48 +2388,2879 @@
"homepage": "https://www.php-fig.org/"
}
],
- "description": "Common Container Interface (PHP FIG PSR-11)",
- "homepage": "https://github.com/php-fig/container",
+ "description": "Common interface for caching libraries",
"keywords": [
- "PSR-11",
- "container",
- "container-interface",
- "container-interop",
- "psr"
+ "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.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "31628f36fc97c5714d181b3a8d29efb85c6a7677"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/cache/zipball/31628f36fc97c5714d181b3a8d29efb85c6a7677",
+ "reference": "31628f36fc97c5714d181b3a8d29efb85c6a7677",
+ "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.28"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-10-30T08:37:02+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.28",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/config.git",
+ "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/config/zipball/15947c18ef3ddb0b2f4ec936b9e90e2520979f62",
+ "reference": "15947c18ef3ddb0b2f4ec936b9e90e2520979f62",
+ "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.28"
+ },
+ "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-11-01T19:52:02+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.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "5f311eaf0b321f8ec640f6bae12da43a14026898"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/5f311eaf0b321f8ec640f6bae12da43a14026898",
+ "reference": "5f311eaf0b321f8ec640f6bae12da43a14026898",
+ "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.26"
+ },
+ "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-09-11T09:57:09+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/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"
+ }
],
- "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"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "psr/log",
- "version": "1.1.4",
+ "name": "symfony/monolog-bundle",
+ "version": "v3.10.0",
"source": {
"type": "git",
- "url": "https://github.com/php-fig/log.git",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11"
+ "url": "https://github.com/symfony/monolog-bundle.git",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11",
- "reference": "d49695b909c3b7628b6289db5479a1c204601f11",
+ "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
+ "reference": "414f951743f4aa1fd0f5bf6a0e9c16af3fe7f181",
"shasum": ""
},
"require": {
- "php": ">=5.3.0"
+ "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"
},
- "type": "library",
+ "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": "1.1.x-dev"
+ "dev-master": "3.x-dev"
}
},
"autoload": {
"psr-4": {
- "Psr\\Log\\": "Psr/Log/"
- }
+ "Symfony\\Bundle\\MonologBundle\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1751,147 +5268,149 @@
],
"authors": [
{
- "name": "PHP-FIG",
- "homepage": "https://www.php-fig.org/"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "Common interface for logging libraries",
- "homepage": "https://github.com/php-fig/log",
+ "description": "Symfony MonologBundle",
+ "homepage": "https://symfony.com",
"keywords": [
"log",
- "psr",
- "psr-3"
+ "logging"
],
"support": {
- "source": "https://github.com/php-fig/log/tree/1.1.4"
+ "issues": "https://github.com/symfony/monolog-bundle/issues",
+ "source": "https://github.com/symfony/monolog-bundle/tree/v3.10.0"
},
- "time": "2021-05-03T11:20:27+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": "2023-11-06T17:08:13+00:00"
},
{
- "name": "robrichards/xmlseclibs",
- "version": "3.1.1",
+ "name": "symfony/password-hasher",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/robrichards/xmlseclibs.git",
- "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df"
+ "url": "https://github.com/symfony/password-hasher.git",
+ "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/robrichards/xmlseclibs/zipball/f8f19e58f26cdb42c54b214ff8a820760292f8df",
- "reference": "f8f19e58f26cdb42c54b214ff8a820760292f8df",
+ "url": "https://api.github.com/repos/symfony/password-hasher/zipball/dcab5ac87450aaed26483ba49c2ce86808da7557",
+ "reference": "dcab5ac87450aaed26483ba49c2ce86808da7557",
"shasum": ""
},
"require": {
- "ext-openssl": "*",
- "php": ">= 5.4"
+ "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": {
- "RobRichards\\XMLSecLibs\\": "src"
- }
+ "Symfony\\Component\\PasswordHasher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"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": "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": [
- "security",
- "signature",
- "xml",
- "xmldsig"
+ "hashing",
+ "password"
],
"support": {
- "issues": "https://github.com/robrichards/xmlseclibs/issues",
- "source": "https://github.com/robrichards/xmlseclibs/tree/3.1.1"
- },
- "time": "2020-09-05T13:00:25+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"
+ "source": "https://github.com/symfony/password-hasher/tree/v6.4.24"
},
- "license": [
- "GPL-3.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"
+ }
],
- "homepage": "https://www.sencha.com/products/extjs"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "silex/silex",
- "version": "v2.3.0",
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/silexphp/Silex.git",
- "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131"
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/silexphp/Silex/zipball/6bc31c1b8c4ef614a7115320fd2d3b958032f131",
- "reference": "6bc31c1b8c4ef614a7115320fd2d3b958032f131",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
"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"
+ "php": ">=7.2"
},
- "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"
+ "suggest": {
+ "ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "2.3.x-dev"
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "Silex\\": "src/Silex"
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -1900,295 +5419,413 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
- "name": "Igor Wiedler",
- "email": "igor@wiedler.ch"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "The PHP micro-framework based on the Symfony Components",
- "homepage": "http://silex.sensiolabs.org",
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
"keywords": [
- "microframework"
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/silexphp/Silex/issues",
- "source": "https://github.com/silexphp/Silex/tree/v2.3.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
},
- "abandoned": "symfony/flex",
- "time": "2018-04-20T05:17:01+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": "2024-09-09T11:45:10+00:00"
},
{
- "name": "simplesamlphp/assert",
- "version": "v0.8.0",
+ "name": "symfony/polyfill-intl-icu",
+ "version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/assert.git",
- "reference": "d3b0f38f4ae083822471c15e3c4a0401ddaeac73"
+ "url": "https://github.com/symfony/polyfill-intl-icu.git",
+ "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/assert/zipball/d3b0f38f4ae083822471c15e3c4a0401ddaeac73",
- "reference": "d3b0f38f4ae083822471c15e3c4a0401ddaeac73",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
+ "reference": "bfc8fa13dbaf21d69114b0efcd72ab700fb04d0c",
"shasum": ""
},
"require": {
- "ext-spl": "*",
- "php": "^7.4 || ^8.0",
- "webmozart/assert": "^1.11"
+ "php": ">=7.2"
},
- "require-dev": {
- "simplesamlphp/simplesamlphp-test-framework": "^1.2.1"
+ "suggest": {
+ "ext-intl": "For best performance and support of other locales than \"en\""
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "v0.8.x-dev"
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "SimpleSAML\\Assert\\": "src/"
- }
+ "Symfony\\Polyfill\\Intl\\Icu\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-or-later"
+ "MIT"
],
"authors": [
{
- "name": "Tim van Dijen",
- "email": "tvdijen@gmail.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
- "name": "Jaime Perez Crespo",
- "email": "jaimepc@gmail.com"
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "A wrapper around webmozart/assert to make it useful beyond checking method arguments",
+ "description": "Symfony polyfill for intl's ICU-related data and classes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "icu",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "issues": "https://github.com/simplesamlphp/assert/issues",
- "source": "https://github.com/simplesamlphp/assert/tree/v0.8.0"
+ "source": "https://github.com/symfony/polyfill-intl-icu/tree/v1.33.0"
},
- "time": "2022-09-20T20:18:55+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-06-20T22:24:30+00:00"
},
{
- "name": "simplesamlphp/composer-module-installer",
- "version": "v1.3.4",
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/composer-module-installer.git",
- "reference": "36508ed9580a30c4d5ab0bb3c25c00d0b5d42946"
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/composer-module-installer/zipball/36508ed9580a30c4d5ab0bb3c25c00d0b5d42946",
- "reference": "36508ed9580a30c4d5ab0bb3c25c00d0b5d42946",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3",
+ "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.1 || ^2.0",
- "php": "^7.4 || ^8.0",
- "simplesamlphp/assert": "^0.8.0 || ^1.0"
+ "php": ">=7.2",
+ "symfony/polyfill-intl-normalizer": "^1.10"
},
- "require-dev": {
- "composer/composer": "^2.4",
- "simplesamlphp/simplesamlphp-test-framework": "^1.2.1"
+ "suggest": {
+ "ext-intl": "For best performance"
},
- "type": "composer-plugin",
+ "type": "library",
"extra": {
- "class": "SimpleSAML\\Composer\\ModuleInstallerPlugin"
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
},
"autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
"psr-4": {
- "SimpleSAML\\Composer\\": "src/"
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "LGPL-2.1-only"
+ "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"
],
- "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"
+ "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0"
},
- "time": "2023-03-08T20:58:22+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": "2024-09-10T14:38:51+00:00"
},
{
- "name": "simplesamlphp/saml2",
- "version": "v3.2.6",
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/saml2.git",
- "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751"
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/saml2/zipball/a56e46ef8e0c5245a4ca7facc3d308b493215751",
- "reference": "a56e46ef8e0c5245a4ca7facc3d308b493215751",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c",
+ "reference": "3833d7255cc303546435cb650316bff708a1c75c",
"shasum": ""
},
"require": {
- "ext-dom": "*",
- "ext-openssl": "*",
- "ext-zlib": "*",
- "php": ">=5.4",
- "psr/log": "~1.0",
- "robrichards/xmlseclibs": "^3.0"
+ "php": ">=7.2"
},
- "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"
+ "suggest": {
+ "ext-intl": "For best performance"
},
"type": "library",
"extra": {
- "branch-alias": {
- "dev-master": "v3.1.x-dev"
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
}
},
"autoload": {
"files": [
- "src/_autoload.php"
+ "bootstrap.php"
],
- "psr-0": {
- "SAML2\\": "src/"
- }
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "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": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
}
],
- "description": "SAML2 PHP library from SimpleSAMLphp",
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "issues": "https://github.com/simplesamlphp/saml2/issues",
- "source": "https://github.com/simplesamlphp/saml2/tree/master"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
},
- "time": "2018-11-20T11:11:28+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": "2024-09-09T11:45:10+00:00"
},
{
- "name": "simplesamlphp/simplesamlphp",
- "version": "1.16.3",
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/simplesamlphp/simplesamlphp.git",
- "reference": "abc208dbc9c94eb8bab8266825ca035cc96072ba"
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/simplesamlphp/simplesamlphp/zipball/abc208dbc9c94eb8bab8266825ca035cc96072ba",
- "reference": "abc208dbc9c94eb8bab8266825ca035cc96072ba",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493",
+ "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493",
"shasum": ""
},
"require": {
- "ext-date": "*",
- "ext-dom": "*",
- "ext-hash": "*",
- "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"
+ "ext-iconv": "*",
+ "php": ">=7.2"
},
- "require-dev": {
- "friendsofphp/php-cs-fixer": "^2.2",
- "mikey179/vfsstream": "~1.6",
- "phpunit/phpunit": "~4.8.35"
+ "provide": {
+ "ext-mbstring": "*"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
},
- "type": "project",
"autoload": {
"files": [
- "lib/_autoload_modules.php"
+ "bootstrap.php"
],
"psr-4": {
- "SimpleSAML\\": "lib/SimpleSAML"
+ "Symfony\\Polyfill\\Mbstring\\": ""
}
},
"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 for the Mbstring extension",
+ "homepage": "https://symfony.com",
"keywords": [
- "SAML2",
- "idp",
- "oauth",
- "shibboleth",
- "sp",
- "ws-federation"
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
],
"support": {
- "issues": "https://github.com/simplesamlphp/simplesamlphp/issues",
- "source": "https://github.com/simplesamlphp/simplesamlphp"
+ "source": "https://github.com/symfony/polyfill-mbstring/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-12-23T08:48:59+00:00"
},
{
- "name": "symfony/debug",
- "version": "v4.4.44",
+ "name": "symfony/polyfill-php80",
+ "version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/debug.git",
- "reference": "1a692492190773c5310bc7877cb590c04c2f05be"
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be",
- "reference": "1a692492190773c5310bc7877cb590c04c2f05be",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
+ "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608",
"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\\Php80\\": ""
},
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2197,18 +5834,28 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.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.0+ 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-php80/tree/v1.33.0"
},
"funding": [
{
@@ -2219,44 +5866,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"
}
],
- "abandoned": "symfony/error-handler",
- "time": "2022-07-28T16:29:46+00:00"
+ "time": "2025-01-02T08:10:11+00:00"
},
{
- "name": "symfony/deprecation-contracts",
- "version": "v2.5.3",
+ "name": "symfony/polyfill-php81",
+ "version": "v1.33.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/deprecation-contracts.git",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d"
+ "url": "https://github.com/symfony/polyfill-php81.git",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d",
- "reference": "80d075412b557d41002320b96a096ca65aa2c98d",
+ "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
+ "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c",
"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\\Php81\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2273,10 +5926,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "A generic function and convention to trigger deprecation notices",
+ "description": "Symfony polyfill backporting some PHP 8.1+ 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-php81/tree/v1.33.0"
},
"funding": [
{
@@ -2287,44 +5946,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": "2023-01-24T14:02:46+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/error-handler",
- "version": "v4.4.44",
+ "name": "symfony/polyfill-php83",
+ "version": "v1.32.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/error-handler.git",
- "reference": "be731658121ef2d8be88f3a1ec938148a9237291"
+ "url": "https://github.com/symfony/polyfill-php83.git",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/error-handler/zipball/be731658121ef2d8be88f3a1ec938148a9237291",
- "reference": "be731658121ef2d8be88f3a1ec938148a9237291",
+ "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491",
+ "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "psr/log": "^1|^2|^3",
- "symfony/debug": "^4.4.5",
- "symfony/var-dumper": "^4.4|^5.0"
- },
- "require-dev": {
- "symfony/http-kernel": "^4.4|^5.0",
- "symfony/serializer": "^4.4|^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\\ErrorHandler\\": ""
+ "Symfony\\Polyfill\\Php83\\": ""
},
- "exclude-from-classmap": [
- "/Tests/"
+ "classmap": [
+ "Resources/stubs"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -2333,18 +5998,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 manage errors and 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/error-handler/tree/v4.4.44"
+ "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0"
},
"funding": [
{
@@ -2360,52 +6031,34 @@
"type": "tidelift"
}
],
- "time": "2022-07-28T16:29:46+00:00"
+ "time": "2024-09-09T11:45:10+00:00"
},
{
- "name": "symfony/event-dispatcher",
- "version": "v4.4.44",
+ "name": "symfony/property-access",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a"
+ "url": "https://github.com/symfony/property-access.git",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
- "reference": "1e866e9e5c1b22168e0ce5f0b467f19bba61266a",
+ "url": "https://api.github.com/repos/symfony/property-access/zipball/a33acdae7c76f837c1db5465cc3445adf3ace94a",
+ "reference": "a33acdae7c76f837c1db5465cc3445adf3ace94a",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/event-dispatcher-contracts": "^1.1",
- "symfony/polyfill-php80": "^1.16"
- },
- "conflict": {
- "symfony/dependency-injection": "<3.4"
- },
- "provide": {
- "psr/event-dispatcher-implementation": "1.0",
- "symfony/event-dispatcher-implementation": "1.1"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/property-info": "^5.4|^6.0|^7.0"
},
"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": ""
+ "symfony/cache": "^5.4|^6.0|^7.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\EventDispatcher\\": ""
+ "Symfony\\Component\\PropertyAccess\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2425,10 +6078,21 @@
"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": "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/event-dispatcher/tree/v4.4.44"
+ "source": "https://github.com/symfony/property-access/tree/v6.4.24"
},
"funding": [
{
@@ -2439,48 +6103,59 @@
"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-15T12:03:16+00:00"
},
{
- "name": "symfony/event-dispatcher-contracts",
- "version": "v1.10.0",
+ "name": "symfony/property-info",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/event-dispatcher-contracts.git",
- "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974"
+ "url": "https://github.com/symfony/property-info.git",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
- "reference": "761c8b8387cfe5f8026594a75fdf0a4e83ba6974",
+ "url": "https://api.github.com/repos/symfony/property-info/zipball/1056ae3621eeddd78d7c5ec074f1c1784324eec6",
+ "reference": "1056ae3621eeddd78d7c5ec074f1c1784324eec6",
"shasum": ""
},
"require": {
- "php": ">=7.1.3"
+ "php": ">=8.1",
+ "symfony/string": "^5.4|^6.0|^7.0"
},
- "suggest": {
- "psr/event-dispatcher": "",
- "symfony/event-dispatcher-implementation": ""
+ "conflict": {
+ "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"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/contracts",
- "name": "symfony/contracts"
- },
- "branch-alias": {
- "dev-main": "1.1-dev"
- }
+ "require-dev": {
+ "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\\Contracts\\EventDispatcher\\": ""
- }
+ "Symfony\\Component\\PropertyInfo\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2488,26 +6163,26 @@
],
"authors": [
{
- "name": "Nicolas Grekas",
- "email": "p@tchwork.com"
+ "name": "Kévin Dunglas",
+ "email": "dunglas@gmail.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Generic abstractions related to dispatching event",
+ "description": "Extracts information about PHP class' properties using metadata of popular sources",
"homepage": "https://symfony.com",
"keywords": [
- "abstractions",
- "contracts",
- "decoupling",
- "interfaces",
- "interoperability",
- "standards"
+ "doctrine",
+ "phpdoc",
+ "property",
+ "symfony",
+ "type",
+ "validator"
],
"support": {
- "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v1.10.0"
+ "source": "https://github.com/symfony/property-info/tree/v6.4.24"
},
"funding": [
{
@@ -2518,47 +6193,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/http-client-contracts",
- "version": "v2.5.3",
+ "name": "symfony/proxy-manager-bridge",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-client-contracts.git",
- "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1"
+ "url": "https://github.com/symfony/proxy-manager-bridge.git",
+ "reference": "2a14a1539f2854a8adb73319abf8923b1d7a6589"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
- "reference": "e5cc97c2b4a4db0ba26bebc154f1426e3fd1d2f1",
+ "url": "https://api.github.com/repos/symfony/proxy-manager-bridge/zipball/2a14a1539f2854a8adb73319abf8923b1d7a6589",
+ "reference": "2a14a1539f2854a8adb73319abf8923b1d7a6589",
"shasum": ""
},
"require": {
- "php": ">=7.2.5"
- },
- "suggest": {
- "symfony/http-client-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": "2.5-dev"
- }
+ "require-dev": {
+ "symfony/config": "^6.1|^7.0"
},
+ "type": "symfony-bridge",
"autoload": {
"psr-4": {
- "Symfony\\Contracts\\HttpClient\\": ""
- }
+ "Symfony\\Bridge\\ProxyManager\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2566,26 +6242,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 HTTP clients",
+ "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/http-client-contracts/tree/v2.5.3"
+ "source": "https://github.com/symfony/proxy-manager-bridge/tree/v6.4.24"
},
"funding": [
{
@@ -2596,41 +6264,54 @@
"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-14T16:38:25+00:00"
},
{
- "name": "symfony/http-foundation",
- "version": "v4.4.49",
+ "name": "symfony/routing",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-foundation.git",
- "reference": "191413c7b832c015bb38eae963f2e57498c3c173"
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-foundation/zipball/191413c7b832c015bb38eae963f2e57498c3c173",
- "reference": "191413c7b832c015bb38eae963f2e57498c3c173",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/e4f94e625c8e6f910aa004a0042f7b2d398278f5",
+ "reference": "e4f94e625c8e6f910aa004a0042f7b2d398278f5",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/mime": "^4.3|^5.0",
- "symfony/polyfill-mbstring": "~1.1",
- "symfony/polyfill-php80": "^1.16"
+ "php": ">=8.1",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "doctrine/annotations": "<1.12",
+ "symfony/config": "<6.2",
+ "symfony/dependency-injection": "<5.4",
+ "symfony/yaml": "<5.4"
},
"require-dev": {
- "predis/predis": "~1.0",
- "symfony/expression-language": "^3.4|^4.0|^5.0"
+ "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\\Component\\HttpFoundation\\": ""
+ "Symfony\\Component\\Routing\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2650,10 +6331,16 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Defines an object-oriented layer for the HTTP specification",
+ "description": "Maps an HTTP request to a set of configuration variables",
"homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
"support": {
- "source": "https://github.com/symfony/http-foundation/tree/v4.4.49"
+ "source": "https://github.com/symfony/routing/tree/v6.4.24"
},
"funding": [
{
@@ -2664,77 +6351,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": "2022-11-04T16:17:57+00:00"
+ "time": "2025-07-15T08:46:37+00:00"
},
{
- "name": "symfony/http-kernel",
- "version": "v4.4.51",
+ "name": "symfony/runtime",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/http-kernel.git",
- "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7"
+ "url": "https://github.com/symfony/runtime.git",
+ "reference": "c1cc6721646f546627236c57f835272806087337"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ad8ab192cb619ff7285c95d28c69b36d718416c7",
- "reference": "ad8ab192cb619ff7285c95d28c69b36d718416c7",
+ "url": "https://api.github.com/repos/symfony/runtime/zipball/c1cc6721646f546627236c57f835272806087337",
+ "reference": "c1cc6721646f546627236c57f835272806087337",
"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-plugin-api": "^1.0|^2.0",
+ "php": ">=8.1"
},
"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/dotenv": "<5.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"
+ "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"
},
- "suggest": {
- "symfony/browser-kit": "",
- "symfony/config": "",
- "symfony/console": "",
- "symfony/dependency-injection": ""
+ "type": "composer-plugin",
+ "extra": {
+ "class": "Symfony\\Component\\Runtime\\Internal\\ComposerPlugin"
},
- "type": "library",
"autoload": {
"psr-4": {
- "Symfony\\Component\\HttpKernel\\": ""
+ "Symfony\\Component\\Runtime\\": "",
+ "Symfony\\Runtime\\Symfony\\Component\\": "Internal/"
},
"exclude-from-classmap": [
"/Tests/"
@@ -2746,18 +6409,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": "Provides a structured process for converting a Request into a Response",
+ "description": "Enables decoupling PHP applications from global state",
"homepage": "https://symfony.com",
+ "keywords": [
+ "runtime"
+ ],
"support": {
- "source": "https://github.com/symfony/http-kernel/tree/v4.4.51"
+ "source": "https://github.com/symfony/runtime/tree/v6.4.24"
},
"funding": [
{
@@ -2768,54 +6434,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": "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-bundle",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/mime.git",
- "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42"
+ "url": "https://github.com/symfony/security-bundle.git",
+ "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/mime/zipball/c71c7a1aeed60b22d05e738197e31daf2120bd42",
- "reference": "c71c7a1aeed60b22d05e738197e31daf2120bd42",
+ "url": "https://api.github.com/repos/symfony/security-bundle/zipball/3b1b64ab12e74d76fedddd1df1fa68bd014d3efb",
+ "reference": "3b1b64ab12e74d76fedddd1df1fa68bd014d3efb",
"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"
+ "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": {
- "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/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": {
- "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"
- },
- "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\\Mime\\": ""
+ "Symfony\\Bundle\\SecurityBundle\\": ""
},
"exclude-from-classmap": [
"/Tests/"
@@ -2835,14 +6536,10 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Allows manipulating MIME messages",
+ "description": "Provides a tight integration of the Security component into the Symfony full-stack framework",
"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-bundle/tree/v6.4.24"
},
"funding": [
{
@@ -2853,50 +6550,67 @@
"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-core",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "0424dff1c58f028c451efff2045f5d92410bd540"
+ "url": "https://github.com/symfony/security-core.git",
+ "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540",
- "reference": "0424dff1c58f028c451efff2045f5d92410bd540",
+ "url": "https://api.github.com/repos/symfony/security-core/zipball/8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53",
+ "reference": "8ff659ffd3b823f0b3969b6c7a602b80b6ec2e53",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "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"
},
- "provide": {
- "ext-ctype": "*"
+ "conflict": {
+ "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"
},
- "suggest": {
- "ext-ctype": "For best performance"
+ "require-dev": {
+ "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",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- }
+ "Symfony\\Component\\Security\\Core\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2904,24 +6618,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 - Core 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-core/tree/v6.4.24"
},
"funding": [
{
@@ -2932,49 +6640,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-05-31T15:07:36+00:00"
+ "time": "2025-07-10T08:14:14+00:00"
},
{
- "name": "symfony/polyfill-intl-idn",
- "version": "v1.30.0",
+ "name": "symfony/security-csrf",
+ "version": "v7.3.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-idn.git",
- "reference": "a6e83bdeb3c84391d1dfe16f42e40727ce524a5c"
+ "url": "https://github.com/symfony/security-csrf.git",
+ "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3"
},
"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-csrf/zipball/2b4b0c46c901729e4e90719eacd980381f53e0a3",
+ "reference": "2b4b0c46c901729e4e90719eacd980381f53e0a3",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "symfony/polyfill-intl-normalizer": "^1.10",
- "symfony/polyfill-php72": "^1.10"
+ "php": ">=8.2",
+ "symfony/security-core": "^6.4|^7.0"
},
- "suggest": {
- "ext-intl": "For best performance"
+ "conflict": {
+ "symfony/http-foundation": "<6.4"
},
- "type": "library",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
+ "require-dev": {
+ "psr/log": "^1|^2|^3",
+ "symfony/http-foundation": "^6.4|^7.0",
+ "symfony/http-kernel": "^6.4|^7.0"
},
+ "type": "library",
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Intl\\Idn\\": ""
- }
+ "Symfony\\Component\\Security\\Csrf\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -2982,30 +6692,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 - CSRF Library",
"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-csrf/tree/v7.3.0"
},
"funding": [
{
@@ -3021,44 +6719,59 @@
"type": "tidelift"
}
],
- "time": "2024-05-31T15:07:36+00:00"
+ "time": "2025-01-02T18:42:10+00:00"
},
{
- "name": "symfony/polyfill-intl-normalizer",
- "version": "v1.30.0",
+ "name": "symfony/security-http",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
- "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb"
+ "url": "https://github.com/symfony/security-http.git",
+ "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/a95281b0be0d9ab48050ebd988b967875cdb9fdb",
- "reference": "a95281b0be0d9ab48050ebd988b967875cdb9fdb",
+ "url": "https://api.github.com/repos/symfony/security-http/zipball/bd6ce061b70071afea0a4805903b6ed3f6f64e07",
+ "reference": "bd6ce061b70071afea0a4805903b6ed3f6f64e07",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "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\\Normalizer\\": ""
+ "Symfony\\Component\\Security\\Http\\": ""
},
- "classmap": [
- "Resources/stubs"
+ "exclude-from-classmap": [
+ "/Tests/"
]
},
"notification-url": "https://packagist.org/downloads/",
@@ -3067,26 +6780,18 @@
],
"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"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
],
+ "description": "Symfony Security Component - HTTP Integration",
+ "homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.30.0"
+ "source": "https://github.com/symfony/security-http/tree/v6.4.24"
},
"funding": [
{
@@ -3097,50 +6802,79 @@
"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/serializer",
+ "version": "v6.4.24",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c"
+ "url": "https://github.com/symfony/serializer.git",
+ "reference": "c01c719c8a837173dc100f2bd141a6271ea68a1d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c",
- "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c",
+ "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"
},
- "provide": {
- "ext-mbstring": "*"
+ "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"
},
- "suggest": {
- "ext-mbstring": "For best performance"
+ "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",
- "extra": {
- "thanks": {
- "url": "https://github.com/symfony/polyfill",
- "name": "symfony/polyfill"
- }
- },
"autoload": {
- "files": [
- "bootstrap.php"
- ],
"psr-4": {
- "Symfony\\Polyfill\\Mbstring\\": ""
- }
+ "Symfony\\Component\\Serializer\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -3148,25 +6882,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 the Mbstring extension",
+ "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",
- "mbstring",
- "polyfill",
- "portable",
- "shim"
- ],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0"
+ "source": "https://github.com/symfony/serializer/tree/v6.4.24"
},
"funding": [
{
@@ -3177,40 +6904,57 @@
"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:14:14+00:00"
},
{
- "name": "symfony/polyfill-php56",
- "version": "v1.20.0",
+ "name": "symfony/service-contracts",
+ "version": "v3.6.1",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-php56.git",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
- "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=8.1",
+ "psr/container": "^1.1|^2.0",
+ "symfony/deprecation-contracts": "^2.5|^3"
+ },
+ "conflict": {
+ "ext-psr": "<1.1|>=2"
},
- "type": "metapackage",
+ "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": "1.20-dev"
+ "dev-main": "3.6-dev"
}
},
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Test/"
+ ]
+ },
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
@@ -3225,16 +6969,18 @@
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "description": "Generic abstractions related to writing services",
"homepage": "https://symfony.com",
"keywords": [
- "compatibility",
- "polyfill",
- "portable",
- "shim"
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php56/tree/v1.20.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
},
"funding": [
{
@@ -3245,44 +6991,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-15T11:30:57+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 +7060,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 +7082,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 +7142,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 +7169,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 +7251,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": [
{
@@ -3474,46 +7273,64 @@
"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-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 +7339,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,108 +7361,131 @@
"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/"
+ ]
+ },
+ "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 mechanisms for walking through any arbitrary PHP variable",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/var-dumper/tree/v7.3.2"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
},
- "exclude-from-classmap": [
- "/Tests/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
},
{
- "name": "Symfony Community",
- "homepage": "https://symfony.com/contributors"
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
}
],
- "description": "Symfony Process Component",
- "homepage": "https://symfony.com",
- "support": {
- "source": "https://github.com/symfony/process/tree/v2.8.50"
- },
- "time": "2018-11-11T11:18:13+00:00"
+ "time": "2025-07-29T20:02:46+00:00"
},
{
- "name": "symfony/routing",
- "version": "v4.4.44",
+ "name": "symfony/var-exporter",
+ "version": "v6.4.26",
"source": {
"type": "git",
- "url": "https://github.com/symfony/routing.git",
- "reference": "f7751fd8b60a07f3f349947a309b5bdfce22d6ae"
+ "url": "https://github.com/symfony/var-exporter.git",
+ "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc"
},
"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/466fcac5fa2e871f83d31173f80e9c2684743bfc",
+ "reference": "466fcac5fa2e871f83d31173f80e9c2684743bfc",
"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 +7497,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.26"
},
"funding": [
{
@@ -3691,58 +7529,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-09-11T09:57:09+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 +7583,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 +7605,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 +7686,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 +7723,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 +7814,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 +7826,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 +7887,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"
- },
- "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"
+ "source": "https://github.com/ua-parser/uap-php/tree/v3.10.0"
},
- "time": "2020-09-11T18:18:04+00:00"
+ "time": "2025-07-17T15:43:24+00:00"
},
{
"name": "webmozart/assert",
@@ -4204,54 +7948,6 @@
"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"
- },
- "time": "2015-02-11T11:06:42+00:00"
}
],
"packages-dev": [
@@ -4304,24 +8000,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": {
@@ -4335,43 +8032,134 @@
],
"authors": [
{
- "name": "Rafael Dohms",
- "email": "rdohms@gmail.com"
+ "name": "Rafael Dohms",
+ "email": "rdohms@gmail.com"
+ }
+ ],
+ "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.4.0"
+ },
+ "time": "2022-02-13T15:00:28+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "reference": "5817d0659c5b50c9b950feb9af7b9668e2c436bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "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-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "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"
+ }
+ ],
+ "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": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/inflector/issues",
+ "source": "https://github.com/doctrine/inflector/tree/2.0.10"
+ },
+ "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"
}
],
- "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"
+ "time": "2024-02-18T20:23:39+00:00"
},
{
"name": "doctrine/instantiator",
- "version": "1.5.0",
+ "version": "2.0.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/instantiator.git",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b"
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/doctrine/instantiator/zipball/0a0fa9780f5d4e507415a065172d26a98d02047b",
- "reference": "0a0fa9780f5d4e507415a065172d26a98d02047b",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
+ "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0",
"shasum": ""
},
"require": {
- "php": "^7.1 || ^8.0"
+ "php": "^8.1"
},
"require-dev": {
- "doctrine/coding-standard": "^9 || ^11",
+ "doctrine/coding-standard": "^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"
+ "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": {
@@ -4398,7 +8186,7 @@
],
"support": {
"issues": "https://github.com/doctrine/instantiator/issues",
- "source": "https://github.com/doctrine/instantiator/tree/1.5.0"
+ "source": "https://github.com/doctrine/instantiator/tree/2.0.0"
},
"funding": [
{
@@ -4414,20 +8202,20 @@
"type": "tidelift"
}
],
- "time": "2022-12-30T00:15:36+00:00"
+ "time": "2022-12-30T00:23:10+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 +8223,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 +8254,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 +8262,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 +8286,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 +8318,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 +8440,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 +8479,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.2-dev"
+ "dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -4767,7 +8508,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 +8516,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 +8761,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 +8844,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 +8855,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 +9834,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 +9893,213 @@
],
"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.4.0",
"source": {
"type": "git",
- "url": "https://github.com/swaggest/php-json-schema.git",
- "reference": "d23adb53808b8e2da36f75bc0188546e4cbe3b45"
+ "url": "https://github.com/symfony/process.git",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8"
},
"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/7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
+ "reference": "7ca8dc2d0dcf4882658313aba8be5d9fd01026c8",
"shasum": ""
},
"require": {
- "ext-json": "*",
- "php": ">=5.4",
- "phplang/scope-exit": "^1.0",
- "swaggest/json-diff": "^3.8.2",
- "symfony/polyfill-mbstring": "^1.19"
+ "php": ">=8.2"
},
- "require-dev": {
- "phperf/phpunit": "4.8.37"
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
},
- "suggest": {
- "ext-mbstring": "For better performance"
+ "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.4.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-10-16T11:21:06+00:00"
+ },
+ {
+ "name": "symfony/stopwatch",
+ "version": "v6.4.24",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/stopwatch.git",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/stopwatch/zipball/b67e94e06a05d9572c2fa354483b3e13e3cb1898",
+ "reference": "b67e94e06a05d9572c2fa354483b3e13e3cb1898",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "symfony/service-contracts": "^2.5|^3"
},
"type": "library",
"autoload": {
"psr-4": {
- "Swaggest\\JsonSchema\\": "src/"
+ "Symfony\\Component\\Stopwatch\\": ""
+ },
+ "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 way to profile code",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/stopwatch/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/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 +10107,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 +10197,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..c6e7d818ab
--- /dev/null
+++ b/config/bundles.php
@@ -0,0 +1,10 @@
+ ['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],
+];
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/framework.yaml b/config/packages/framework.yaml
new file mode 100644
index 0000000000..5cdcf6bd63
--- /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: CCR\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..9f650d433a
--- /dev/null
+++ b/config/packages/maker.yaml
@@ -0,0 +1,5 @@
+when@dev:
+ maker:
+ root_namespace: 'CCR\'
+ 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..1caa402816
--- /dev/null
+++ b/config/packages/monolog.yaml
@@ -0,0 +1,58 @@
+monolog:
+ channels:
+ - deprecation # Deprecations are logged in the dedicated "deprecation" channel when it exists
+
+when@dev:
+ monolog:
+ handlers:
+ main:
+ type: stream
+ path: "%log_dir%/exceptions.log"
+ level: debug
+ channels: ["!event"]
+ 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: "%log_dir%/exceptions.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
+ file:
+ type: stream
+ path: '%log_dir%/exceptions.log'
+ level: warning
+ channels: ['!event']
+ 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..9b40534baa
--- /dev/null
+++ b/config/packages/security.yaml
@@ -0,0 +1,47 @@
+security:
+ password_hashers:
+ CCR\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: CCR\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:
+ - CCR\Security\Authenticators\FormLoginAuthenticator
+ - CCR\Security\Authenticators\SimpleSamlPhpAuthenticator
+ switch_user: true
+ logout:
+ path: xdmod_logout
+ invalidate_session: true
+ access_denied_handler: CCR\Security\AccessDeniedHandler
+ entry_point: CCR\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 }
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 aedb6ae1d3..0000000000
Binary files a/html/about/images/Case_Western_logo.png and /dev/null differ
diff --git a/html/about/images/SDSC_logo.jpg b/html/about/images/SDSC_logo.jpg
deleted file mode 100644
index 5e0c72c9df..0000000000
Binary files a/html/about/images/SDSC_logo.jpg and /dev/null differ
diff --git a/html/about/images/Tufts_logo.png b/html/about/images/Tufts_logo.png
deleted file mode 100644
index 4ec9bda0e0..0000000000
Binary files a/html/about/images/Tufts_logo.png and /dev/null differ
diff --git a/html/about/images/access_logo.png b/html/about/images/access_logo.png
deleted file mode 100644
index ec40253d86..0000000000
Binary files a/html/about/images/access_logo.png and /dev/null differ
diff --git a/html/about/links.html b/html/about/links.html
deleted file mode 100644
index 311c379457..0000000000
--- a/html/about/links.html
+++ /dev/null
@@ -1,20 +0,0 @@
-
-Links
-
-
- |
- |
-
-
-
- |
- |
-
-
- |
- |
-
-
- |
- |
-
diff --git a/html/about/openxd.html b/html/about/openxd.html
deleted file mode 100644
index 72175a21cd..0000000000
--- a/html/about/openxd.html
+++ /dev/null
@@ -1,39 +0,0 @@
-
-Open XDMoD
-
-While initially focused on the NSF XSEDE program, an open source version of XDMoD that provides similar functionality for academic and industrial HPC centers is available and undergoing continued development, namely Open XDMoD. Open XDMoD for use by academic and industrial HPC centers is available for download through GitHub (http://open.xdmod.org).
-Highlights include:
-
-- A graphical user interface with extensive graphic and analytical capability.
-- Detailed utilization metrics including number of jobs, CPU hours, wait times, job size, etc.
-- Customizable Metric Explorer where users can generate custom plots comparing multiple metrics
-- A custom report builder for the automatic generation of detailed periodic reports.
-- Support for resource managers includes
-
-- SLURM, SGE/UGE, PBS/TORQUE/PBS Pro, LSF
-
-- Optional modules supported
-
-
-
-
-
-
- |
-
-
- | Fig.1 Open Source XDMoD Summary Tab |
-
-
- |
- |
-  |
-
-
- | Fig.2 Open Source XDMoD Usage Tab |
-
-
-
diff --git a/html/about/presentations.html b/html/about/presentations.html
deleted file mode 100644
index f63691f1fa..0000000000
--- a/html/about/presentations.html
+++ /dev/null
@@ -1,148 +0,0 @@
-
-Presentations
-
-
-PEARC '25
-
-- Nikolay A. Simakov. "Enhancing an HPC Resources Modeling Framework with a Realistic, Slurm-Like, HPC Resource Model". Presentation available at doi:10.13140/RG.2.2.16351.98724.
-
-Supercomputing 2024 (SC24), Atlanta, GA
-
-- Nikolay A. Simakov. "Benchmarking and Continuous Performance Monitoring of HPC Resources using the XDMoD Application Kernel Module." SIGHPC Systems Professionals Workshop HPCSYSPROS24 at SC24. November 22, 2024. The presentation is available at doi:10.13140/RG.2.2.13362.62409.
-
-
-2024-12-12 Internet2 Technical Exchange: Boston, MA
-
-- Jennifer Schopf, "Understanding Globus Data Transfers with NetSage"
-
-
-ACCESS Resource Provider Workshop September 2024
-
-- Aaron Weeden, "What We Do in ACCESS Metrics"
-
-
-PEARC24: Providence, RI
-
-- Nikolay A. Simakov, "Modeling Users on High-Performance Computing Resource"
-- Tom Furlani, "ACCESS Metrics Overview and Career Guidance"
-
-
-Research Computing at Smaller Institutions Conference, Swarthmore College, June 2024
-
-- Joseph White, "Making the Case: Monitoring and Metrics"
-
-
-ACCESS Resource Provider Forum May 2024
-
-- Aaron Weeden, "Plans for reporting on NAIRR Pilot usage"
-
-
-HPC Asia 2024: Nagoya, Japan
-
-- N.A. Simakov, "First Impressions of the NVIDIA Grace CPU Superchip and NVIDIA Grace Hopper Superchip and Scientific Workloads"
-
-
-2023-10-26 ACCESS RP Forum (virtual)
-
-- How to leverage ACCESS XDMoD to facilitate Campus Champion support for campus researchers
-
-
-2023-09-19 Campus Champions All Champions Call (virtual)
-
-- How to leverage ACCESS XDMoD to facilitate Resource Provider Operations
-
-
-Metrics2023: Denver, CO
-
-- Dr. Abani Patra, "Measuring Performance and Usage - Evolution of the Measuring and Monitoring of NSF Supercomputing"
-- N.A. Simakov, "Feasibility of Application-Agnostic Performance per Currency Metric on an Example of Gromacs, a Molecular Dynamics Application"
-- Aaron Weeden, "The Data Analytics Framework for XDMoD"
-
-
-PEARC23: Portland, OR
-
-- Open OnDemand, XDMoD, and ColdFront: an HPC center management toolset (tutorial)
-- Introduction to CI usage and performance data analysis with XDMoD and the new Analytics Framework. (tutorial)
-- N.A Simakov, "The Taming of the Wolf - how to use the Ookami Cray Apollo 80 system and Fujitsu A64FX processors" (workshop)
-- Dr. Jennifer M. Schopf, Doug Southworth, "EPOC Support for Cyberinfrastructure and Data Movement" (Panel discussion)
-
-
-Cray User Group meeting (CUG) 2023 in Helsinki, Finland, May 7 – 11, 2023
-
-- N.A. Simakov, "Benchmarking High-End ARM Systems with Scientific Applications. Performance and Energy Efficiency"
-
-
-ISC High Performance 2023 (ISC23): Hamburg, Germany
-
-
-ARM HPC User Group (AHUG) Symposium at SC 2022
-
-- N.A. Simakov, “Are we ready for broader adoption of ARM in the HPC community: Benchmarks and Applications on High-End ARM Systems with XDMoD Application Kernels”
-
-
-PEARC22: Boston, MA
-
-
-PEARC21: (virtual)
-
-
-Supercomputing 2020 (SC'20): Atlanta, GA (virtual), November 18, 2020
-
-
-Gateways20: Bethesda, MD (virtual), October 13, 2020
-
-
-NYSERNet 2020: (virtual), October 2, 2020
-
-
-PEARC20: Portland, OR (virtual)
-
-
-PEARC19: Chicago, IL
-
-
-2018-09-05 Research Computing Campus Champions Presentation
-
-
-SC17: Denver, CO
-
-
-SC16: Salt Lake City, UT
-
-
-XSEDE16: Miami, FL
-
-
-XSEDE15: Saint Louis, MO
-
diff --git a/html/about/roadmap.php b/html/about/roadmap.php
deleted file mode 100644
index ef522ff478..0000000000
--- a/html/about/roadmap.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- * @license https://opensource.org/licenses/LGPL-3.0 LGPL-3.0
- */
-
-require_once __DIR__ . '/../../configuration/linker.php';
-
-/**
- * Attempt to retrieve a value from the configuration located at
- * $section->$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;
-}
-
-$result = array();
-
-$url = getConfigValue('roadmap', 'url');
-$header = getConfigValue('roadmap', 'header', '');
-
-if (!empty($header)) {
- $result[]="$header
";
-}
-
-if (!empty($url)) {
- $result[]="";
-} else {
- $result[] = <<
-
-
Roadmap Not Configured
-
- Please contact your Systems Administrator if you believe this is
- in error.
-
-
-
-EOT;
-}
-echo implode($result);
diff --git a/html/about/supremm.html b/html/about/supremm.html
deleted file mode 100644
index 3cd261ea73..0000000000
--- a/html/about/supremm.html
+++ /dev/null
@@ -1,30 +0,0 @@
-
-The Job-Level Performance Realm
-
-
-The Job-Level Performance (SUPReMM) realm provides job-level performance data for detailed analysis in the XDMoD user interface or through the Data Analytics Framework. This information is populated by cross-referencing jobs from XDMoD's data warehouse with node-level performance data running on compute nodes.
-
-
-Node-level performance data are gathered through collection software such as Performance Co-Pilot (PCP), Prometheus, or HPCPerfStats running on compute nodes. These collectors sample node hardware information at a regularly configured interval and provide a wide variety of job performance information including memory, I/O file data, CPU data and network data.
-
-
-More information about setup and usage can be found in the documentation.
-
-
-
-
-  |
-
-
- Fig 1. SUPReMM data workflow diagram |
-
-
- |
- |
-  |
-
-
- Fig 2. Serial Data Copy causing a large dropoff of performance. |
-
-
-
diff --git a/html/about/team.html b/html/about/team.html
deleted file mode 100644
index d7d1a1b876..0000000000
--- a/html/about/team.html
+++ /dev/null
@@ -1,28 +0,0 @@
-
-ACCESS Monitoring and Measurement Team (MMS)
-
-University at Buffalo
-Thomas R. Furlani (ACCESS MMS PI)
-Matthew D. Jones (ACCESS MMS co-PI, Center Director CCR)
-Joseph P. White (ACCESS MMS co-PI and Lead Developer)
-Nikolay Simakov (Computational Scientist)
-Gregary Dean (Programmer/Analyst)
-Ryan Rathsam (Programmer/Analyst)
-Conner Saeli (Programmer/Analyst)
-Aaron Weeden (Programmer/Analyst)
-Andrew Stoltman (Programmer/Analyst)
-
-Texas Advanced Computing Center
-Jennifer Schopf (ACCESS MMS co-PI, Leader TACC sub award)
-
Stephen Harrell (HPC Engineering Scientist)
-Amit Ruhela (Manager, HPC Tools)
-
-Tufts University
-Abani Patra (ACCESS MMS co-PI)
-
-Case Western
-Vipin Chaudhary (Leader Case Western sub award)
-
-San Diego Supercomputer Center
-Shava Smallen (Leader Cloud Bank sub award)
-
diff --git a/html/about/xdmod.php b/html/about/xdmod.php
deleted file mode 100644
index fa3e49335c..0000000000
--- a/html/about/xdmod.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-

-
XDMoD: Comprehensive HPC System Management Tool
-
-
-The University at Buffalo Center for Computational Research (CCR) has been at the forefront of the development of open source tools for use by national and campus level high performance computing (HPC) centers to help ensure their optimal operation as well as provide metrics to demonstrate the utility, service, competitive advantage, and return on investment that these centers provide.
-The XDMoD (XD Metrics on Demand) tool provides HPC center personnel and senior leadership with the ability to easily obtain detailed operational metrics of HPC systems coupled with extensive analytical capability to optimize performance at the system and job level, ensure quality of service, and provide accurate data to guide system upgrades and acquisitions.
-
-
-
-  |
-
-
- | XDMoD Summary Tab |
-
-
-
-Funded by the National Science Foundation, XDMoD (https://xdmod.access-ci.org/)
- is designed to audit and facilitate the operation and utilization of advanced
-cyberinfrastructure. This includes data on resources allocated via the
-NSF-funded ACCESS project and
-historical data on XSEDE allocated resources.
-Similarly, Open XDMoD (http://open.xdmod.org),
- the open source version of XDMoD, is designed to provide similar capability to academic and industrial HPC centers.
-
-
-When referencing XDMoD, please cite the following publication:
-Jeffrey T. Palmer, Steven M. Gallo, Thomas R. Furlani, Matthew D. Jones, Robert L. DeLeon, Joseph P. White, Nikolay Simakov, Abani K. Patra, Jeanette Sperhac, Thomas Yearke, Ryan Rathsam, Martins Innus, Cynthia D. Cornelius, James C. Browne, William L. Barth, Richard T. Evans,
-"Open XDMoD: A Tool for the Comprehensive Management of High-Performance Computing Resources",
-Computing in Science & Engineering, Vol 17, Issue 4, 2015, pp. 52-62.
-10.1109/MCSE.2015.68
-
-
-XDMoD Version:
diff --git a/html/auth_error.php b/html/auth_error.php
deleted file mode 100644
index a5ce51e6d7..0000000000
--- a/html/auth_error.php
+++ /dev/null
@@ -1,51 +0,0 @@
-
-
-
-
-
-
- Access Denied
-
-
-
-
-
-
-
-
-  |
-
-
-
- Authentication to XSEDE has failed.
-
- Click here if you need to reset your XSEDE User Portal Password
-
- If you do not have an XSEDE Portal Account,
- create one now by clicking here.
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/html/controllers/chart_pool.php b/html/controllers/chart_pool.php
deleted file mode 100644
index 863dd5ff82..0000000000
--- a/html/controllers/chart_pool.php
+++ /dev/null
@@ -1,25 +0,0 @@
-registerOperation('add_to_queue');
- $controller->registerOperation('remove_from_queue');
-
- $controller->invoke('POST');
diff --git a/html/controllers/chart_pool/add_to_queue.php b/html/controllers/chart_pool/add_to_queue.php
deleted file mode 100644
index 37b193bb15..0000000000
--- a/html/controllers/chart_pool/add_to_queue.php
+++ /dev/null
@@ -1,41 +0,0 @@
-add_to_queue
-
- \xd_security\assertParametersSet(array(
- 'chart_id' => RESTRICTION_CHART_TYPE,
- //'chart_title' => RESTRICTION_CHART_TITLE,
- 'chart_drill_details' => RESTRICTION_CHART_DETAILS,
- 'chart_date_desc' => RESTRICTION_CHART_DATE_DESC,
- 'module' => RESTRICTION_CHART_MODULE
- ));
-
- // -----------------------------
-
- try {
-
- $user = \xd_security\getLoggedInUser();
-
- $chart_pool = new XDChartPool($user);
-
- $chart_title = (!empty($_POST['chart_title'])) ? $_POST['chart_title'] : 'Untitled Chart';
-
- //$_POST['chart_id'] = 'controller_module='.$_POST['module'].'&'.$_POST['chart_id'];
-
- $chart_pool->addChartToQueue($_POST['chart_id'], $chart_title, $_POST['chart_drill_details'], $_POST['chart_date_desc']);
- $returnData['success'] = true;
- $returnData['action'] = 'add';
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
-
- \xd_controller\returnJSON($returnData);
diff --git a/html/controllers/chart_pool/remove_from_queue.php b/html/controllers/chart_pool/remove_from_queue.php
deleted file mode 100644
index 255bd2e02b..0000000000
--- a/html/controllers/chart_pool/remove_from_queue.php
+++ /dev/null
@@ -1,40 +0,0 @@
-remove_from_queue
-
- \xd_security\assertParametersSet(array(
- 'chart_id' => RESTRICTION_CHART_TYPE,
- 'module' => RESTRICTION_CHART_MODULE
- ));
-
- // -----------------------------
-
- try {
-
- $user = \xd_security\getLoggedInUser();
-
- $chart_pool = new XDChartPool($user);
-
- $chart_title = (!empty($_POST['chart_title'])) ? $_POST['chart_title'] : 'Untitled Chart';
-
- //$_POST['chart_id'] = 'controller_module='.$_POST['module'].'&'.$_POST['chart_id'];
-
- $_POST['chart_id'] = str_replace("title=".$chart_title, "title=".urlencode($chart_title), $_POST['chart_id']);
-
- $chart_pool->removeChartFromQueue($_POST['chart_id']);
- $returnData['success'] = true;
- $returnData['action'] = 'remove';
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
-
- \xd_controller\returnJSON($returnData);
diff --git a/html/controllers/common_params.php b/html/controllers/common_params.php
deleted file mode 100644
index 1243c06e5e..0000000000
--- a/html/controllers/common_params.php
+++ /dev/null
@@ -1,206 +0,0 @@
-registerOperation('create_report');
- $controller->registerOperation('get_reports');
- $controller->registerOperation('save_reports');
- $controller->registerOperation('delete_report');
- $controller->invoke('REQUEST');
diff --git a/html/controllers/dashboard_launch.php b/html/controllers/dashboard_launch.php
deleted file mode 100644
index ac0e04d9eb..0000000000
--- a/html/controllers/dashboard_launch.php
+++ /dev/null
@@ -1,43 +0,0 @@
- 'dashboard_launch');
-
- try {
-
- $user = \xd_security\getLoggedInUser();
-
- if ( isset($user) && $user->isManager() ) {
-
- $_SESSION['xdDashboardUser'] = $user->getUserID();
- $response['success'] = true;
-
- }
- else {
-
- $response['success'] = false;
-
- }
-
- }
- catch(SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch(Exception $e) {
-
- unset($_SESSION['xdDashboardUser']);
- $response['success'] = false;
-
- }
-
- echo json_encode($response);
diff --git a/html/controllers/mailer.php b/html/controllers/mailer.php
deleted file mode 100644
index afba242d96..0000000000
--- a/html/controllers/mailer.php
+++ /dev/null
@@ -1,18 +0,0 @@
-registerOperation('contact');
- $controller->registerOperation('sign_up');
-
- $controller->invoke('POST');
diff --git a/html/controllers/mailer/contact.php b/html/controllers/mailer/contact.php
deleted file mode 100644
index 86b3615668..0000000000
--- a/html/controllers/mailer/contact.php
+++ /dev/null
@@ -1,119 +0,0 @@
-contact
-
-$response = array();
-
-\xd_security\assertParametersSet(array(
- 'name' => RESTRICTION_FIRST_NAME,
- 'message' => RESTRICTION_NON_EMPTY,
- 'username' => RESTRICTION_NON_EMPTY,
- 'token' => RESTRICTION_NON_EMPTY,
- 'timestamp' => RESTRICTION_NON_EMPTY
-));
-
-\xd_security\assertEmailParameterSet('email');
-
-// ----------------------------------------------------------
-
-// If the user claims to be a public user, verify that they're not logged in.
-// Otherwise, verify that their claimed username matches the logged in user.
-$user_is_public = $_POST['username'] === '__public__';
-
-if ($user_is_public) {
- $user_logged_in = false;
- try {
- \xd_security\getLoggedInUser();
- $user_logged_in = true;
- } catch (Exception $e) {}
-
- if ($user_logged_in) {
- \xd_response\presentError("Client claims to be public user but is logged in.");
- }
-} else {
- $user = \xd_security\getLoggedInUser();
- if ($_POST['username'] !== $user->getUsername()) {
- \xd_response\presentError("Client claims to be a user other than the logged in user.");
- }
-}
-
-// ----------------------------------------------------------
-
-$user_info = $user_is_public ? 'Public Visitor' : "Username: ".$_POST['username'];
-$reason = isset($_POST['reason']) ? $_POST['reason'] : 'contact';
-
-// ----------------------------------------------------------
-
-\xd_utilities\verify_captcha();
-
-// ----------------------------------------------------------
-
-switch ($reason) {
- case 'wishlist':
- $subject = "[WISHLIST] Feature request sent from a portal visitor";
- $message_type = "feature request";
- break;
-
- default:
- $subject = "Message sent from a portal visitor";
- $message_type = "message";
- break;
-}
-
-$timestamp = date('m/d/Y, g:i:s A', $_POST['timestamp']);
-
-$message = "Below is a $message_type from '{$_POST['name']}' ({$_POST['email']}):\n\n";
-$message .= $_POST['message'];
-$message .="\n------------------------\n\nSession Tracking Data:\n\n ";
-$message .="$user_info\n\n Token: {$_POST['token']}\n Timestamp: $timestamp";
-
-try {
- //Original sender's e-mail must be in the 'fromAddress' field for the XDMoD Request Tracker to function
- MailWrapper::sendMail(array(
- 'body' => $message,
- 'subject' => $subject,
- 'toAddress' => \xd_utilities\getConfiguration('general', 'contact_page_recipient'),
- 'fromAddress' => $_POST['email'],
- 'fromName' => $_POST['name']
- )
- );
-}
-catch (Exception $e) {
- $response['success'] = false;
- $response['message'] = $e->getMessage();
- echo json_encode($response);
- exit;
-}
-
-// =====================================================
-
-$message
- = "Hello, {$_POST['name']}\n\n"
- . "This e-mail is to inform you that the XDMoD Portal Team has received your $message_type, and will\n"
- . "be in touch with you as soon as possible.\n\n"
- . MailWrapper::getMaintainerSignature();
-
-// -------------------
-
-try {
- MailWrapper::sendMail(array(
- 'body' => $message,
- 'subject' => "Thank you for your $message_type.",
- 'toAddress' => $_POST['email']
- )
- );
-}
-catch (Exception $e) {
- $response['success'] = false;
- $response['message'] = $e->getMessage();
- echo json_encode($response);
- exit;
-}
-
-// =====================================================
-
-$response['success'] = true;
-
-echo json_encode($response);
diff --git a/html/controllers/mailer/sign_up.php b/html/controllers/mailer/sign_up.php
deleted file mode 100644
index adfec59ceb..0000000000
--- a/html/controllers/mailer/sign_up.php
+++ /dev/null
@@ -1,106 +0,0 @@
-sign_up
-
-\xd_security\assertParametersSet(array(
- 'first_name' => RESTRICTION_FIRST_NAME,
- 'last_name' => RESTRICTION_LAST_NAME,
- 'title' => RESTRICTION_NON_EMPTY,
- 'organization' => RESTRICTION_NON_EMPTY,
- 'field_of_science' => RESTRICTION_NON_EMPTY,
- 'additional_information' => RESTRICTION_NON_EMPTY
-));
-
-\xd_security\assertEmailParameterSet('email');
-
-// Check CAPTCHA if enabled.
-
-\xd_utilities\verify_captcha();
-
-// Insert account request into database (so it appears in the internal
-// dashboard under "XDMoD Account Requests").
-
-$pdo = DB::factory('database');
-
-$pdo->execute(
- "
- INSERT INTO AccountRequests (
- first_name,
- last_name,
- organization,
- title,
- email_address,
- field_of_science,
- additional_information,
- time_submitted,
- status,
- comments
- ) VALUES (
- :first_name,
- :last_name,
- :organization,
- :title,
- :email_address,
- :field_of_science,
- :additional_information,
- NOW(),
- 'new',
- ''
- )
- ",
- array(
- 'first_name' => $_POST['first_name'],
- 'last_name' => $_POST['last_name'],
- 'organization' => $_POST['organization'],
- 'title' => $_POST['title'],
- 'email_address' => $_POST['email'],
- 'field_of_science' => $_POST['field_of_science'],
- 'additional_information' => $_POST['additional_information']
- )
-);
-
-// Create email.
-
-$time_requested = date('D, F j, Y \a\t g:i A');
-$organization = ORGANIZATION_NAME;
-
-$message = <<<"EOMSG"
-The following person has signed up for an account on XDMoD:
-
-Person Details ----------------------------------
-
-Name: {$_POST['first_name']} {$_POST['last_name']}
-E-Mail: {$_POST['email']}
-Title: {$_POST['title']}
-Organization: {$_POST['organization']}
-
-Time Account Requested: $time_requested
-
-Affiliation with $organization:
-
-{$_POST['additional_information']}
-
-EOMSG;
-
-$response = array();
-
-// Original sender's e-mail must be in the "fromAddress" field for the XDMoD Request Tracker to function
-try {
- MailWrapper::sendMail(array(
- 'body' => $message,
- 'subject' => "[" . \xd_utilities\getConfiguration('general', 'title') . "] A visitor has signed up",
- 'toAddress' => \xd_utilities\getConfiguration('general', 'contact_page_recipient'),
- 'fromAddress' => $_POST['email'],
- 'fromName' => $_POST['last_name'] . ', ' . $_POST['first_name']
- ));
- $response['success'] = true;
-}
-catch (Exception $e) {
- $response['success'] = false;
- $response['message'] = $e->getMessage();
-}
-
-echo json_encode($response);
diff --git a/html/controllers/metric_explorer.php b/html/controllers/metric_explorer.php
deleted file mode 100644
index 49362614d2..0000000000
--- a/html/controllers/metric_explorer.php
+++ /dev/null
@@ -1,35 +0,0 @@
-registerOperation('get_data');
- $controller->registerOperation('get_rawdata');
- $controller->registerOperation('get_dimension');
- $controller->registerOperation('get_dw_descripter');
- $controller->registerOperation('get_filters');
- $controller->registerOperation('set_filters');
-
- $controller->invoke('REQUEST');
diff --git a/html/controllers/metric_explorer/common.php b/html/controllers/metric_explorer/common.php
deleted file mode 100644
index 27a0b87061..0000000000
--- a/html/controllers/metric_explorer/common.php
+++ /dev/null
@@ -1,255 +0,0 @@
-filters['data']); $i < $b; $i++) {
- $y->filters['data'][$i] = (object)$y->filters['data'][$i];
- }
-
- $y->filters = (object)$y->filters;
-
- // Set values of new attribs for backward compatibility.
- if (!isset($y->line_type) || empty($y->line_type)) {
- $y->line_type = 'Solid';
- }
-
- if (
- !isset($y->line_width)
- || empty($y->line_width)
- || !is_numeric($y->line_width)
- ) {
- $y->line_width = 2;
- }
-
- if (!isset($y->color) || empty($y->color)) {
- $y->color = 'auto';
- }
-
- if (!isset($y->shadow) || empty($y->shadow)) {
- $y->shadow = false;
- }
-
- $ret[] = $y;
- }
-
- return $ret;
- }
- $ret = urldecode($_REQUEST['data_series']);
-
- $jret = json_decode($ret);
-
- if (!is_array($jret)) {
- throw new Exception('Invalid data_series specified');
- }
-
- foreach ($jret as &$y) {
-
- // Set values of new attribs for backward compatibility.
- if (!isset($y->line_type) || empty($y->line_type)) {
- $y->line_type = 'Solid';
- }
-
- if (
- !isset($y->line_width)
- || empty($y->line_width)
- || !is_numeric($y->line_width)
- ) {
- $y->line_width = 2;
- }
-
- if (!isset($y->color) || empty($y->color)) {
- $y->color = 'auto';
- }
-
- if (!isset($y->shadow) || empty($y->shadow)) {
- $y->shadow = false;
- }
- }
-
- return $jret;
-}
-
-function getSelectedFilterIds()
-{
- return
- isset($_REQUEST['selectedFilterIds'])
- && $_REQUEST['selectedFilterIds'] != ''
- ? explode(',', $_REQUEST['selectedFilterIds'])
- : array();
-}
-
-function getGlobalFilters()
-{
- if (
- !isset($_REQUEST['global_filters'])
- || empty($_REQUEST['global_filters'])
- ) {
- return (object)array('data' => array(), 'total' => 0);
- }
-
- if (is_array($_REQUEST['global_filters'])) {
- $v = $_REQUEST['global_filters']['data'];
-
- $ret = (object)array('data' => array(), 'total' => 0);
-
- foreach ($v as $x) {
- $ret->data[] = (object)$x;
- $ret->total++;
- }
-
- return $ret;
- }
-
- $ret = urldecode($_REQUEST['global_filters']);
-
- return json_decode($ret);
-}
-
-function getShowContextMenu()
-{
- return
- isset($_REQUEST['showContextMenu'])
- ? $_REQUEST['showContextMenu'] == 'true'
- || $_REQUEST['showContextMenu'] === 'y'
- : false;
-}
-
-function getXAxis()
-{
- if (!isset($_REQUEST['x_axis']) || empty($_REQUEST['x_axis'])) {
- return array();
- }
-
- if (is_array($_REQUEST['x_axis'])) {
- $ret = new stdClass;
-
- foreach ($_REQUEST['x_axis'] as $k => $x) {
- if (is_array($x)) {
- $ret->{$k} = (object)$x;
- }
- else {
- $ret->{$k} = $x;
- }
- }
-
- return $ret;
- }
-
- return json_decode(urldecode($_REQUEST['x_axis']));
-}
-
-function getYAxis()
-{
- if (!isset($_REQUEST['y_axis']) || empty($_REQUEST['y_axis'])) {
- return array();
- }
-
- if (is_array($_REQUEST['y_axis'])) {
- $ret = new stdClass;
-
- foreach ($_REQUEST['y_axis'] as $k => $x) {
- if (is_array($x)) {
- $ret->{$k} = (object)$x;
- }
- else {
- $ret->{$k} = $x;
- }
- }
-
- return $ret;
- }
-
- return json_decode(urldecode($_REQUEST['y_axis']));
-}
-
-function getLegend()
-{
- if (!isset($_REQUEST['legend']) || empty($_REQUEST['legend'])) {
- return array();
- }
-
- if (is_array($_REQUEST['legend'])) {
- $ret = new stdClass;
-
- foreach($_REQUEST['legend'] as $k => $x) {
- if (is_array($x)) {
- $ret->{$k} = (object)$x;
- }
- else {
- $ret->{$k} = $x;
- }
- }
-
- return $ret;
- }
-
- return json_decode(urldecode($_REQUEST['legend']));
-}
-
-function getShowFilters()
-{
- return
- isset($_REQUEST['show_filters'])
- ? $_REQUEST['show_filters'] == 'y'
- || $_REQUEST['show_filters'] == 'true'
- : true;
-}
-
diff --git a/html/controllers/metric_explorer/get_data.php b/html/controllers/metric_explorer/get_data.php
deleted file mode 100644
index cfc98be73b..0000000000
--- a/html/controllers/metric_explorer/get_data.php
+++ /dev/null
@@ -1,33 +0,0 @@
-get_data($user);
-
-$end = microtime(true);
-
-$logger->log($start, $end);
-
-
-foreach($result['headers'] as $k => $v) {
- header( $k . ": " . $v);
-}
-
-echo $result['results'];
diff --git a/html/controllers/metric_explorer/get_dimension.php b/html/controllers/metric_explorer/get_dimension.php
deleted file mode 100644
index 82dbc886a5..0000000000
--- a/html/controllers/metric_explorer/get_dimension.php
+++ /dev/null
@@ -1,35 +0,0 @@
-getAllRoles(true);
-
-$roleDescriptors = array();
-foreach ($roles as $activeRole) {
- $shortRole = $activeRole;
- $us_pos = strpos($shortRole, '_');
- if ($us_pos > 0)
- {
- $shortRole = substr($shortRole, 0, $us_pos);
- }
-
- if (array_key_exists($shortRole, $roleDescriptors)) {
- continue;
- }
-
- // If enabled, try to lookup answer in cache first.
- $cache_enabled = xd_utilities\getConfiguration('internal', 'dw_desc_cache') === 'on';
- $cache_data_found = false;
- if ($cache_enabled)
- {
- $db = \CCR\DB::factory('database');
- $db->execute('create table if not exists dw_desc_cache (role char(5), response mediumtext, index (role) ) ');
- $cachedResults = $db->query('select response from dw_desc_cache where role=:role', array('role' => $shortRole));
- if(count($cachedResults) > 0)
- {
- $roleDescriptors[$shortRole] = unserialize($cachedResults[0]['response']);
- $cache_data_found = true;
- }
- }
-
- // If the cache was not used or was not useful, get descriptors from code.
- if (!$cache_data_found)
- {
- $realms = array();
- $groupByObjects = array();
-
- $realmObjects = Realms::getRealmObjectsForUser($user);
- $query_descripter_realms = Acls::getQueryDescripters($user);
-
- foreach($query_descripter_realms as $query_descripter_realm => $query_descripter_groups)
- {
- $category = DataWarehouse::getCategoryForRealm($query_descripter_realm);
- if ($category === null) {
- continue;
- }
- $seenstats = array();
-
- $realmObject = $realmObjects[$query_descripter_realm];
- $realmDisplay = $realmObject->getDisplay();
- $realms[$query_descripter_realm] = array(
- 'text' => $query_descripter_realm,
- 'category' => $realmDisplay,
- 'dimensions' => array(),
- 'metrics' => array(),
- );
- foreach($query_descripter_groups as $query_descripter_group) {
- foreach ($query_descripter_group as $query_descripter) {
- if ($query_descripter->getDisableMenu()) {
- continue;
- }
-
- $groupByName = $query_descripter->getGroupByName();
- $group_by_object = $query_descripter->getGroupByInstance();
- $permittedStatistics = $group_by_object->getRealm()->getStatisticIds();
-
- $groupByObjects[$query_descripter_realm . '_' . $groupByName] = array(
- 'object' => $group_by_object,
- 'permittedStats' => $permittedStatistics);
- $realms[$query_descripter_realm]['dimensions'][$groupByName] = array(
- 'text' => $groupByName == 'none' ? 'None' : $group_by_object->getName(),
- 'info' => $group_by_object->getHtmlDescription()
- );
-
- $stats = array_diff($permittedStatistics, $seenstats);
- if (empty($stats)) {
- continue;
- }
-
- $statsObjects = $query_descripter->getStatisticsClasses($stats);
- foreach ($statsObjects as $realm_group_by_statistic => $statistic_object) {
-
- if ( ! $statistic_object->showInMetricCatalog() ) {
- continue;
- }
-
- $semStatId = \Realm\Realm::getStandardErrorStatisticFromStatistic(
- $realm_group_by_statistic
- );
- $realms[$query_descripter_realm]['metrics'][$realm_group_by_statistic] =
- array(
- 'text' => $statistic_object->getName(),
- 'info' => $statistic_object->getHtmlDescription(),
- 'std_err' => in_array($semStatId, $permittedStatistics),
- 'hidden_groupbys' => $statistic_object->getHiddenGroupBys()
- );
- $seenstats[] = $realm_group_by_statistic;
- }
- }
- }
- $texts = array();
- foreach($realms[$query_descripter_realm]['metrics'] as $key => $row)
- {
- $texts[$key] = $row['text'];
- }
- array_multisort($texts, SORT_ASC, $realms[$query_descripter_realm]['metrics']);
- }
- $texts = array();
- foreach($realms as $key => $row)
- {
- $texts[$key] = $row['text'];
- }
- array_multisort($texts, SORT_ASC, $realms);
-
- $roleDescriptors[$shortRole] = array('totalCount'=> 1, 'data' => array(array( 'realms' => $realms)));
-
- // Cache the results if the cache is enabled.
- if ($cache_enabled)
- {
- $db->execute('insert into dw_desc_cache (role, response) values (:role, :response)', array('role' =>$shortRole, 'response' => serialize($roleDescriptors[$shortRole])));
- }
- }
-}
-
-$combinedRealmDescriptors = array();
-foreach ($roleDescriptors as $roleDescriptor) {
- foreach ($roleDescriptor['data'][0]['realms'] as $realm => $realmDescriptor) {
- if (!isset($combinedRealmDescriptors[$realm])) {
- $combinedRealmDescriptors[$realm] = array(
- 'metrics' => array(),
- 'dimensions' => array(),
- 'text' => $realmDescriptor['text'],
- 'category' => $realmDescriptor['category'],
- );
- }
-
- $combinedRealmDescriptors[$realm]['metrics'] += $realmDescriptor['metrics'];
- $combinedRealmDescriptors[$realm]['dimensions'] += $realmDescriptor['dimensions'];
- }
-}
-
-xd_controller\returnJSON(array(
- 'totalCount' => 1,
- 'data' => array(
- array(
- 'realms' => $combinedRealmDescriptors,
- ),
- ),
-));
diff --git a/html/controllers/metric_explorer/get_filters.php b/html/controllers/metric_explorer/get_filters.php
deleted file mode 100644
index 8c732b137d..0000000000
--- a/html/controllers/metric_explorer/get_filters.php
+++ /dev/null
@@ -1,47 +0,0 @@
-getProfile();
- $filters = $userProfile->fetchValue('filters');
- if($filters!= NULL)
- {
- $filtersArray = json_decode($filters);
- $returnData = array(
- 'totalCount' => count($filtersArray),
- 'message' => 'success',
- 'data' => $filtersArray ,
- 'success' => true);
- }
- else
- {
- $returnData = array(
- 'totalCount' => 0,
- 'message' => 'success',
- 'data' => array(),
- 'success' => true);
- }
-
-}
-catch(SessionExpiredException $see)
-{
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-}
-catch(Exception $ex)
-{
- $returnData = array(
- 'totalCount' => 0,
- 'message' => $ex->getMessage(),
- 'data' => array(),
- 'success' => false);
-}
-
-xd_controller\returnJSON($returnData);
diff --git a/html/controllers/metric_explorer/get_rawdata.php b/html/controllers/metric_explorer/get_rawdata.php
deleted file mode 100644
index 68a3d93e1e..0000000000
--- a/html/controllers/metric_explorer/get_rawdata.php
+++ /dev/null
@@ -1,189 +0,0 @@
- $end_ts) {
- throw new Exception(
- 'End date must be greater than or equal to start date'
- );
- }
-
- if (getTimeseries()) {
- // For timeseries data the date range is set to be only the data-point that was
- // selected. Therefore we adjust the start and end date appropriately
-
- $time_period = TimeAggregationUnit::deriveAggregationUnitName(getAggregationUnit(), $start_date, $end_date);
- $time_point = $_REQUEST['datapoint'] / 1000;
-
- list($start_date, $end_date) = TimeAggregationUnit::getRawTimePeriod($time_point, $time_period);
- }
-
- $title = getTitle();
-
- $global_filters = getGlobalFilters();
-
- $dataset_classname = '\DataWarehouse\Data\SimpleDataset';
-
- $filename
- = 'xdmod_'
- . ($title != '' ? $title : 'untitled')
- . '_' . $start_date . '_to_' . $end_date;
-
- $filename = substr($filename, 0, 100);
-
- $all_data_series = getDataSeries();
-
- $datasetid = $_REQUEST['datasetId'];
-
- // find requested dataset.
- $data_description = null;
- foreach ($all_data_series as $data_description_index => $data_series) {
- // NOTE: this only works if the id's are not floats.
- if ("{$data_series->id}" == "$datasetid") {
- $data_description = $data_series;
- break;
- }
- }
-
- if ($data_description === null) {
- throw new Exception("Internal error");
- }
-
- // Check that the user has at least one role authorized to view this data.
- MetricExplorer::checkDataAccess(
- $user,
- $data_description->realm,
- 'none',
- $data_description->metric
- );
-
- if ($format === 'jsonstore') {
-
- $query_classname = '\\DataWarehouse\\Query\\' . $data_description->realm . '\\RawData';
-
- $query = new $query_classname(
- $data_description->realm,
- 'day',
- $start_date,
- $end_date,
- null,
- $data_description->metric,
- array()
- );
-
- $groupedRoleParameters = array();
- foreach ($global_filters->data as $global_filter) {
- if ($global_filter->checked == 1) {
- if (
- !isset(
- $groupedRoleParameters[$global_filter->dimension_id]
- )
- ) {
- $groupedRoleParameters[$global_filter->dimension_id]
- = array();
- }
-
- $groupedRoleParameters[$global_filter->dimension_id][]
- = $global_filter->value_id;
- }
- }
-
- $query->setMultipleRoleParameters($user->getAllRoles(), $user);
-
- $query->setRoleParameters($groupedRoleParameters);
-
- $query->setFilters($data_description->filters);
-
- $dataset = new $dataset_classname($query);
-
- // DEFINE: that we're going to be sending back json.
- header('Content-type: application/json');
-
- $filterOpts = array('options' => array('default' => null, 'min_range' => 0));
-
- $limit = filter_input(INPUT_POST, 'limit', FILTER_VALIDATE_INT, $filterOpts);
- $offset = filter_input(INPUT_POST, 'start', FILTER_VALIDATE_INT, $filterOpts);
-
- $totalCount = $dataset->getTotalPossibleCount();
-
- $ret = array();
-
- // As a small optimization only compute the total count the first time (ie when the offset is 0)
- if($offset === null or $offset == 0) {
- $privquery = new $query_classname(
- $data_description->realm,
- 'day',
- $start_date,
- $end_date,
- null,
- $data_description->metric,
- array()
- );
- $privquery->setRoleParameters($groupedRoleParameters);
- $privquery->setFilters($data_description->filters);
- $privdataset = new $dataset_classname($privquery);
-
- $ret['totalAvailable'] = $privdataset->getTotalPossibleCount();
- }
-
- $ret['data'] = $dataset->getResults($limit, $offset);
- $ret['totalCount'] = $totalCount;
-
- $end = microtime(true);
- $logger->log($start, $end);
-
- print json_encode($ret);
- exit(0);
-
- }
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- $end = microtime(true);
- $logger->log($start, $end);
- throw $see;
-} catch (Exception $ex) {
- $end = microtime(true);
- $logger->log($start, $end);
- \xd_response\presentError($ex);
-}
diff --git a/html/controllers/metric_explorer/set_filters.php b/html/controllers/metric_explorer/set_filters.php
deleted file mode 100644
index bd0226d39a..0000000000
--- a/html/controllers/metric_explorer/set_filters.php
+++ /dev/null
@@ -1,28 +0,0 @@
-getProfile();
- $userProfile->setValue('filters',$_REQUEST['filters']);
- $userProfile->save();
-
-}
-catch(SessionExpiredException $see)
-{
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-}
-catch(Exception $ex)
-{
- print_r($ex);
-}
-
-//xd_controller\returnJSON($returnData);
diff --git a/html/controllers/public_interface.php b/html/controllers/public_interface.php
deleted file mode 100644
index be20eca671..0000000000
--- a/html/controllers/public_interface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-registerOperation('get_public');
-
- $controller->invoke('REQUEST');
diff --git a/html/controllers/public_interface/get_public.php b/html/controllers/public_interface/get_public.php
deleted file mode 100644
index 4909597a2b..0000000000
--- a/html/controllers/public_interface/get_public.php
+++ /dev/null
@@ -1,50 +0,0 @@
-execute();
-
- $returnData = array(
- 'totalCount' => 1,
- 'message' =>'',
- 'data' => array($results),
- 'success' => true
- );
-
-}
-catch(Exception $ex) {
- \xd_response\presentError($ex->getMessage());
-}
-
-\xd_controller\returnJSON($returnData);
diff --git a/html/controllers/report_builder.php b/html/controllers/report_builder.php
deleted file mode 100644
index f8d6739078..0000000000
--- a/html/controllers/report_builder.php
+++ /dev/null
@@ -1,49 +0,0 @@
-registerOperation('enum_available_charts');
- $controller->registerOperation('enum_reports');
- //$controller->registerOperation('get_charts');
- $controller->registerOperation('get_new_report_name');
- $controller->registerOperation('get_preview_data');
- $controller->registerOperation('remove_chart_from_pool');
- $controller->registerOperation('remove_report_by_id');
- $controller->registerOperation('save_report');
- $controller->registerOperation('send_report');
- $controller->registerOperation('download_report');
- $controller->registerOperation('fetch_report_data');
-
- $controller->registerOperation('enum_templates');
- $controller->registerOperation('build_from_template');
-
- $controller->invoke('REQUEST');
-
-?>
diff --git a/html/controllers/report_builder/build_from_template.php b/html/controllers/report_builder/build_from_template.php
deleted file mode 100644
index bee1abf223..0000000000
--- a/html/controllers/report_builder/build_from_template.php
+++ /dev/null
@@ -1,30 +0,0 @@
-buildReportFromTemplate($_REQUEST);
-
- $returnData['success'] = true;
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
-
- \xd_controller\returnJSON($returnData);
diff --git a/html/controllers/report_builder/download_report.php b/html/controllers/report_builder/download_report.php
deleted file mode 100644
index 752128a05c..0000000000
--- a/html/controllers/report_builder/download_report.php
+++ /dev/null
@@ -1,96 +0,0 @@
- array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array(
- 'regexp' => ReportGenerator::REPORT_FORMATS_REGEX,
- 'default' => ''
- )
- ),
- 'report_loc' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array(
- 'regexp' => ReportGenerator::REPORT_TMPDIR_REGEX,
- 'default' => null
- )
- )
-);
-
-\xd_security\assertParametersSet(array(
- 'report_loc',
- 'format'
-));
-
-try {
-
- $get = filter_input_array(INPUT_GET, $filters);
-
- if (!XDReportManager::isValidFormat($get['format'])) {
- print "Invalid format specified";
- exit;
- }
-
- if ($get['report_loc'] === null) {
- throw new BadRequestHttpException('Invalid filename');
- }
-
- $output_format = $get['format'];
-
- $user = \xd_security\getLoggedInUser();
-
- $rm = new XDReportManager($user);
-
- // --------------------------------------------
-
- // Resolve absolute path to report document on backend
-
- $report_id = preg_replace('/(.+)-(.+)-(.+)/', '$1-$2', $get['report_loc']);
-
- $working_directory = sys_get_temp_dir() . '/' . $get['report_loc'];
-
- $report_file = $working_directory.'/'.$report_id.'.'.$output_format;
-
- // --------------------------------------------
-
- if (!file_exists($report_file)) {
- print "The report you are referring to does not exist.";
- exit;
- }
-
- // --------------------------------------------
-
- // Build filename for attachment
-
- $report_name = $rm->getReportName($report_id, true).'.'.$output_format;
-
- // --------------------------------------------
-
- header("Content-type: " . XDReportManager::resolveContentType($output_format));
-
- header("Content-Disposition:inline;filename=\"$report_name\"");
-
- readfile($report_file);
-
- // Cleanup old temp working directories (over a day old) ========
- $tmp = sys_get_temp_dir();
- exec('find ' . escapeshellarg($tmp) . ' -type d -mtime +1', $o);
-
- $tmpQuoted = preg_quote($tmp, '/');
- foreach ($o as $e) {
- if ((preg_match('/^' . $tmpQuoted . '\/\d{2}-\d{10}/', $e) == 1) ||
- (preg_match('/^' . $tmpQuoted . '\/monthly_compliance_report(.+)$/', $e) == 1)
- ) {
- exec("rm -rf $e");
- }
- }//foreach
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (Exception $e) {
- \xd_response\presentError($e->getMessage());
-}
diff --git a/html/controllers/report_builder/enum_available_charts.php b/html/controllers/report_builder/enum_available_charts.php
deleted file mode 100644
index ee742e2d19..0000000000
--- a/html/controllers/report_builder/enum_available_charts.php
+++ /dev/null
@@ -1,26 +0,0 @@
-fetchChartPool();
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/enum_reports.php b/html/controllers/report_builder/enum_reports.php
deleted file mode 100644
index 4fa2a5be53..0000000000
--- a/html/controllers/report_builder/enum_reports.php
+++ /dev/null
@@ -1,25 +0,0 @@
-fetchReportTable();
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/enum_templates.php b/html/controllers/report_builder/enum_templates.php
deleted file mode 100644
index 9a18915711..0000000000
--- a/html/controllers/report_builder/enum_templates.php
+++ /dev/null
@@ -1,30 +0,0 @@
-getRoles());
-
- // We do not want to show the "Dashboard Tab Reports" - copy to a new array to ensure
- // continuous indexes so it will be serialized to a json array not a json object.
- $templates = [];
- foreach($orig_templates as $key => $value){
- if ($value['name'] !== 'Dashboard Tab Report') {
- $templates[] = $value;
- }
- }
-
- $returnData['status'] = 'success';
- $returnData['success'] = true;
- $returnData['templates'] = $templates;
- $returnData['count'] = count($templates);
-
- \xd_controller\returnJSON($returnData);
-
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (Exception $e) {
- \xd_response\presentError($e->getMessage());
-}
diff --git a/html/controllers/report_builder/fetch_report_data.php b/html/controllers/report_builder/fetch_report_data.php
deleted file mode 100644
index 76adb6a184..0000000000
--- a/html/controllers/report_builder/fetch_report_data.php
+++ /dev/null
@@ -1,57 +0,0 @@
-flushReportImageCache();
- }
-
- $data = $rm->loadReportData($_POST['selected_report']);
-
- // ----------------------------------
-
- if (isset($_POST['based_on_other']) && $_POST['based_on_other'] == 'true') {
-
- // The report to be retrieved is to be the basis for a new report.
- // In this case, overwrite the report_id and report name fields so when it comes time to save this
- // report, a new report will be created instead of the original being overwritten / updated.
-
- $data['report_id'] = '';
- $data['general']['name'] = $rm->generateUniqueName($data['general']['name']);
-
- }
- else {
-
- $data['report_id'] = $_POST['selected_report'];
-
- }
-
- // ----------------------------------
-
- $returnData['action'] = 'fetch_report_data';
- $returnData['success'] = true;
- $returnData['results'] = $data;
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/get_new_report_name.php b/html/controllers/report_builder/get_new_report_name.php
deleted file mode 100644
index 0e4768f66f..0000000000
--- a/html/controllers/report_builder/get_new_report_name.php
+++ /dev/null
@@ -1,26 +0,0 @@
-generateUniqueName();
-
- \xd_controller\returnJSON($response);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/get_preview_data.php b/html/controllers/report_builder/get_preview_data.php
deleted file mode 100644
index 95c1624399..0000000000
--- a/html/controllers/report_builder/get_preview_data.php
+++ /dev/null
@@ -1,35 +0,0 @@
-getPreviewData($_POST['report_id'], $_POST['token'], $_POST['charts_per_page']);
-
- $returnData = array();
-
- $returnData['report_id'] = $_POST['report_id'];
- $returnData['success'] = true;
- $returnData['charts'] = $data;
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/remove_chart_from_pool.php b/html/controllers/report_builder/remove_chart_from_pool.php
deleted file mode 100644
index 877209a0a6..0000000000
--- a/html/controllers/report_builder/remove_chart_from_pool.php
+++ /dev/null
@@ -1,45 +0,0 @@
- $v) {
-
- if (preg_match('/^selected_chart_/', $k) == 1) {
-
- $rm->removeChartFromChartPoolByID($v);
-
- if(preg_match('/controller_module=(.+?)&/', $v, $m)) {
-
- $module_id = $m[1];
-
- if (!isset($returnData['dropped_entries'][$module_id])) $returnData['dropped_entries'][$module_id] = array();
- $returnData['dropped_entries'][$module_id][] = $v;
- }
-
- }
-
- }//foreach ($_POST as $k => $v)
-
- $returnData['success'] = true;
- $returnData['action'] = 'remove';
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/remove_report_by_id.php b/html/controllers/report_builder/remove_report_by_id.php
deleted file mode 100644
index 0691acd076..0000000000
--- a/html/controllers/report_builder/remove_report_by_id.php
+++ /dev/null
@@ -1,31 +0,0 @@
-removeReportCharts($report_id);
- $rm->removeReportbyID($report_id);
- }
-
- $returnData['action'] = 'remove_report_by_id';
- $returnData['success'] = true;
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/report_builder/save_report.php b/html/controllers/report_builder/save_report.php
deleted file mode 100644
index 1c39fb24bf..0000000000
--- a/html/controllers/report_builder/save_report.php
+++ /dev/null
@@ -1,159 +0,0 @@
- array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => '/^create|update$/')
- ),
- 'report_id' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_ID_REGEX)
- ),
- 'report_format' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_FORMATS_REGEX . 'i')
- ),
- 'charts_per_page' => array(
- 'filter' => FILTER_VALIDATE_INT,
- 'options' => array('min_range' => 1)
- ),
- 'report_schedule' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_SCHEDULE_REGEX)
- ),
- 'report_delivery' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_DELIVERY_REGEX)
- )
-);
-
-try {
- $user = \xd_security\getLoggedInUser();
- $rm = new XDReportManager($user);
- $post = filter_input_array(INPUT_POST, $filters);
- $map = array();
-
- \xd_security\assertParameterSet('phase');
-
- switch ($post['phase']) {
- case 'create':
- $report_id = $user->getUserID()."-".time();
- break;
- case 'update':
- \xd_security\assertParameterSet('report_id');
- $report_id = $post['report_id'];
-
- // Cache the blobs so they can be re-introduced as necessary during the report update process
- $rm->buildBlobMap($report_id, $map);
- $rm->removeReportCharts($report_id);
- break;
- }
-
- $report_name = mb_convert_encoding($_POST['report_name'], ReportGenerator::REPORT_CHAR_ENCODING, 'UTF-8');
- $report_title = mb_convert_encoding($_POST['report_title'], ReportGenerator::REPORT_CHAR_ENCODING, 'UTF-8');
- $report_header = mb_convert_encoding($_POST['report_header'], ReportGenerator::REPORT_CHAR_ENCODING, 'UTF-8');
- $report_footer = mb_convert_encoding($_POST['report_footer'], ReportGenerator::REPORT_CHAR_ENCODING, 'UTF-8');
-
- $rm->configureSelectedReport(
- $report_id,
- $report_name,
- $report_title,
- $report_header,
- $report_footer,
- $post['report_format'],
- $post['charts_per_page'],
- $post['report_schedule'],
- $post['report_delivery']
- );
-
- if ($rm->isUniqueName($report_name, $report_id) == false) {
- \xd_response\presentError('Another report you have created is already using this name.');
- }
-
- switch ($post['phase']) {
- case 'create':
- $rm->insertThisReport("Manual");
- break;
- case 'update':
- $rm->saveThisReport();
- break;
- }
-
- foreach ($_POST as $k => $v) {
- if (preg_match('/chart_data_(\d+)/', $k, $m) > 0) {
- $order = $m[1];
-
- list($chart_id, $chart_title, $chart_drill_details, $chart_date_description, $timeframe_type, $entry_type) = explode(';', $v);
-
- $chart_title = str_replace('%3B', ';', $chart_title);
- $chart_drill_details = str_replace('%3B', ';', $chart_drill_details);
-
- $cache_ref_variable = 'chart_cacheref_'.$order;
-
- // Transfer blobs residing in the directory used for temporary
- // files into the database as necessary for each chart which
- // comprises the report.
-
- if (isset($_POST[$cache_ref_variable])) {
- $cache_ref = filter_var(
- $_POST[$cache_ref_variable],
- FILTER_VALIDATE_REGEXP,
- array('options' => array('regexp' => ReportGenerator::CHART_CACHEREF_REGEX))
- );
-
- list($start_date, $end_date, $ref, $rank) = explode(';', $cache_ref);
-
- $location = sys_get_temp_dir() . "/{$ref}_{$rank}_{$start_date}_{$end_date}.png";
-
- // Generate chart blob if it doesn't exist. This file
- // should have already been created by
- // report_image_renderer.php, but is not in Firefox.
- // See Mantis 0001336
- if (!is_file($location)) {
- $insertion_rank = array(
- 'rank' => $rank,
- 'did' => '',
- );
- $cached_blob = $start_date . ',' . $end_date . ';'
- . $rm->generateChartBlob('volatile', $insertion_rank, $start_date, $end_date);
- } else {
- $cached_blob = $start_date.','.$end_date.';'.file_get_contents($location);
- }
-
- $chart_id_found = false;
-
- foreach ($map as &$e) {
- if ($e['chart_id'] == $chart_id) {
- $e['image_data'] = $cached_blob;
- $chart_id_found = true;
- }
- }
-
- if ($chart_id_found == false) {
- $map[] = array(
- 'chart_id' => $chart_id,
- 'image_data' => $cached_blob
- );
- }
- }
-
- $rm->saveCharttoReport($report_id, $chart_id, $chart_title, $chart_drill_details, $chart_date_description, $order, $timeframe_type, $entry_type, $map);
- }
- }
-
- $returnData['action'] = 'save_report';
- $returnData['phase'] = $post['phase'];
- $returnData['report_id'] = $report_id;
- $returnData['success'] = true;
- $returnData['status'] = 'success';
-
- \xd_controller\returnJSON($returnData);
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (\Exception $e) {
- \xd_response\presentError($e->getMessage());
-}
diff --git a/html/controllers/report_builder/send_report.php b/html/controllers/report_builder/send_report.php
deleted file mode 100644
index 13b50f8d8a..0000000000
--- a/html/controllers/report_builder/send_report.php
+++ /dev/null
@@ -1,113 +0,0 @@
- array(
- 'filter' => FILTER_VALIDATE_BOOLEAN
- ),
- 'report_id' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_ID_REGEX)
- ),
- 'start_date' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_DATE_REGEX)
- ),
- 'end_date' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_DATE_REGEX)
- ),
- 'export_format' => array(
- 'filter' => FILTER_VALIDATE_REGEXP,
- 'options' => array('regexp' => ReportGenerator::REPORT_FORMATS_REGEX)
- )
-);
-
- try {
-
- $userdata = filter_input_array(INPUT_POST, $filters);
-
- $user = \xd_security\getLoggedInUser();
-
- $rm = new XDReportManager($user);
-
- $report_id = $userdata['report_id'];
- if ($report_id === null) {
- \xd_response\presentError('Invalid value specified for report_id');
- }
-
- $build_only = $userdata['build_only'];
- if ($build_only === null) {
- \xd_response\presentError('Invalid value specified for build_only');
- }
-
- $export_format = $userdata['export_format'];
- if ($export_format === null) {
- $export_format = XDReportManager::DEFAULT_FORMAT;
- }
-
- $start_date = $userdata['start_date'];
- $end_date = $userdata['end_date'];
-
- $returnData['action'] = 'send_report';
- $returnData['build_only'] = $build_only;
-
- try {
-
- $build_response = $rm->buildReport($report_id, $export_format, $start_date, $end_date);
-
- $working_dir = $build_response['template_path'];
- $report_filename = $build_response['report_file'];
-
- if ($build_only) {
-
- // Present enough information so that the download_report controller can serve up the file
- // (and provide appropriate cleanup) afterwards.
-
- $returnData['report_loc'] = basename($working_dir);
-
- $returnData['message'] = 'Report built successfully
';
- $returnData['success'] = true;
- $returnData['report_name'] = $rm->getReportName($report_id, true).'.'.$export_format;
-
- \xd_controller\returnJSON($returnData);
-
- exit;
-
- }
-
- $mailStatus = $rm->mailReport($report_id, $report_filename, '', $build_response);
-
- $destination_email_address = $rm->getReportUserEmailAddress($report_id);
-
- $returnData['message'] = $mailStatus ? "Report built and sent to
$destination_email_address" : 'Problem mailing the report';
- $returnData['success'] = $mailStatus;
-
- }
- catch(\Exception $e) {
-
- $returnData['success'] = false;
- $returnData['message'] = $e->getMessage();
-
- }
-
- if (isset($working_dir) == true) {
- exec("rm -rf $working_dir");
- }
-
- // ==========================================================================
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch (\Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/role_manager.php b/html/controllers/role_manager.php
deleted file mode 100644
index 0a85df0ef3..0000000000
--- a/html/controllers/role_manager.php
+++ /dev/null
@@ -1,27 +0,0 @@
-registerOperation('enum_center_staff_members');
- $controller->registerOperation('get_member_status');
- $controller->registerOperation('upgrade_member');
- $controller->registerOperation('downgrade_member');
-
- $controller->invoke('POST');
diff --git a/html/controllers/role_manager/downgrade_member.php b/html/controllers/role_manager/downgrade_member.php
deleted file mode 100644
index ce58e1bf49..0000000000
--- a/html/controllers/role_manager/downgrade_member.php
+++ /dev/null
@@ -1,38 +0,0 @@
-getActiveOrganization();
- $memberUserId = $member->getUserID();
-
- // An eligible user must be associated with the currently logged in users center.
- if (!Users::userIsAssociatedWithCenter($memberUserId, $organization)) {
- \xd_response\presentError('center_mismatch_between_member_and_director');
- }
-
- //
- Users::demoteUserFromCenterStaff($member, $organization);
-
- $returnData['success'] = true;
-
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (\Exception $e) {
- \xd_response\presentError($e->getMessage());
-}
-
-echo json_encode($returnData);
diff --git a/html/controllers/role_manager/enum_center_staff_members.php b/html/controllers/role_manager/enum_center_staff_members.php
deleted file mode 100644
index 3227c0f96f..0000000000
--- a/html/controllers/role_manager/enum_center_staff_members.php
+++ /dev/null
@@ -1,27 +0,0 @@
-getUserID());
-
- $returnData = array();
-
- $returnData['success'] = true;
- $returnData['count'] = count($members);
- $returnData['members'] = $members;
-
- echo json_encode($returnData);
-
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (\Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
-}
diff --git a/html/controllers/role_manager/get_member_status.php b/html/controllers/role_manager/get_member_status.php
deleted file mode 100644
index cffd548654..0000000000
--- a/html/controllers/role_manager/get_member_status.php
+++ /dev/null
@@ -1,58 +0,0 @@
- true,
- 'message' => '',
- 'eligible' => true
- );
-
- $activeUser = \xd_security\getLoggedInUser();
- $organization = $activeUser->getActiveOrganization();
- $memberUserId = $member->getUserID();
-
- // An eligible user must be associated with the currently logged in users center.
- if (!Users::userIsAssociatedWithCenter($memberUserId, $organization)) {
- \xd_response\presentError('center_mismatch_between_member_and_director');
- }
-
- // They must not already be a Center Director for the organization.
- if (Centers::hasCenterRelation($memberUserId, $organization, ROLE_ID_CENTER_DIRECTOR)) {
- $returnData['success'] = false;
- $returnData['message'] = "is a Center Director";
- \xd_controller\returnJSON($returnData);
- }
-
- // This makes them ineligible for promotion, but eligible for demotion.
- if (Centers::hasCenterRelation($memberUserId, $organization, ROLE_ID_CENTER_STAFF)) {
- $returnData['eligible'] = false;
- }
-
- // They must be active
- if (!$member->getAccountStatus()) {
- $returnData['success'] = false;
- $returnData['message'] = "User is disabled";
- \xd_controller\returnJSON($returnData);
- }
-
- echo json_encode($returnData);
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (\Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
-}
diff --git a/html/controllers/role_manager/upgrade_member.php b/html/controllers/role_manager/upgrade_member.php
deleted file mode 100644
index fefb1e806b..0000000000
--- a/html/controllers/role_manager/upgrade_member.php
+++ /dev/null
@@ -1,65 +0,0 @@
-hasAcl(ROLE_ID_CENTER_DIRECTOR) || !$activeUser->getAccountStatus()) {
- \xd_controller\returnJSON(
- array(
- 'success' => false,
- 'message' => 'You are not authorized to perform this action'
- )
- );
- }
-
- $organization = $activeUser->getActiveOrganization();
- $memberUserId = $member->getUserID();
-
- // An eligible user must be associated with the currently logged in users center.
- if (!Users::userIsAssociatedWithCenter($memberUserId, $organization)) {
- \xd_response\presentError('center_mismatch_between_member_and_director');
- }
-
- // They must not already be a Center Director for the organization.
- if (Centers::hasCenterRelation($memberUserId, $organization, ROLE_ID_CENTER_DIRECTOR)) {
- $returnData['success'] = false;
- $returnData['message'] = "is a Center Director";
- \xd_controller\returnJSON($returnData);
- }
-
- // They must not be a Center Staff for the organization.
- // Although this makes them eligible for demotion.
- if (Centers::hasCenterRelation($memberUserId, $organization, ROLE_ID_CENTER_STAFF)) {
- $returnData['success'] = false;
- $returnData['message'] = "is already a Center Staff";
- \xd_controller\returnJSON($returnData);
- }
-
- Users::promoteUserToCenterStaff($member, $organization);
- $returnData['success'] = true;
- $returnData['message'] = "has been upgraded to Center Staff
(promoted by {$activeUser->getFormalName()})";
-
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (\Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
-}
-
-echo json_encode($returnData);
diff --git a/html/controllers/sab_user.php b/html/controllers/sab_user.php
deleted file mode 100644
index 5821a70760..0000000000
--- a/html/controllers/sab_user.php
+++ /dev/null
@@ -1,27 +0,0 @@
-registerOperation('enum_tg_users');
-$controller->registerOperation('assign_assumed_person');
-$controller->registerOperation('get_mapping');
-
-$session_variable
- = (isset($_POST['dashboard_mode']))
- ? 'xdDashboardUser'
- : 'xdUser';
-
-$controller->invoke('POST', $session_variable);
-
diff --git a/html/controllers/sab_user/assign_assumed_person.php b/html/controllers/sab_user/assign_assumed_person.php
deleted file mode 100644
index 3a63c7a88d..0000000000
--- a/html/controllers/sab_user/assign_assumed_person.php
+++ /dev/null
@@ -1,38 +0,0 @@
-assign_assumed_person
-
-$params = array('person_id' => RESTRICTION_ASSIGNMENT);
-
-$isValid = xd_security\secureCheck($params, 'POST');
-
-if (!$isValid) {
- $returnData = array(
- 'success' => false,
- 'status' => 'invalid_id_specified',
- 'message' => 'invalid_id_specified',
- );
- xd_controller\returnJSON($returnData);
-};
-
-$xdw = new XDWarehouse();
-
-if ($xdw->resolveName($_POST['person_id']) == NO_MAPPING) {
- $returnData = array(
- 'success' => false,
- 'status' => 'no_person_mapping',
- 'message' => 'no_person_mapping',
- );
- xd_controller\returnJSON($returnData);
-}
-
-$_SESSION['assumed_person_id'] = $_POST['person_id'];
-
-$returnData = array(
- 'success' => true,
- 'status' => 'success',
- 'message' => 'success',
-);
-
-xd_controller\returnJSON($returnData);
-
diff --git a/html/controllers/sab_user/enum_tg_users.php b/html/controllers/sab_user/enum_tg_users.php
deleted file mode 100644
index 5b4c396168..0000000000
--- a/html/controllers/sab_user/enum_tg_users.php
+++ /dev/null
@@ -1,105 +0,0 @@
-enum_tg_users
-
-use Models\Services\Acls;
-
-$params = array(
- 'start' => RESTRICTION_NUMERIC_POS,
- 'limit' => RESTRICTION_NUMERIC_POS,
- 'search_mode' => RESTRICTION_SEARCH_MODE,
- 'pi_only' => RESTRICTION_YES_NO
-);
-
-$isValid = xd_security\secureCheck($params, 'POST');
-
-if (!$isValid) {
- $returnData = array(
- 'success' => false,
- 'status' => 'invalid_params_specified',
- 'message' => 'invalid_params_specified',
- 'total_user_count' => 0,
- );
- xd_controller\returnJSON($returnData);
-};
-
-$xdw = new XDWarehouse();
-
-$name_filter = (isset($_POST['query'])) ? $_POST['query'] : NULL;
-$use_pi_filter = ($_POST['pi_only'] == 'y');
-
-// Determine if the user accessing the controller is a Campus Champion
-
-$university_id = NULL;
-
-$user_session_variable
- = (isset($_POST['dashboard_mode']))
- ? 'xdDashboardUser'
- : 'xdUser';
-
-$user = \XDUser::getUserByID($_SESSION[$user_session_variable]);
-
-if (
- $user->hasAcl(ROLE_ID_CAMPUS_CHAMPION)
- && (!isset($_POST['userManagement']))
-) {
-
- // Add an additional filter to eventually produce a listing of
- // individuals affiliated with the same university as this user.
- $university_id = Acls::getDescriptorParamValue($user, ROLE_ID_CAMPUS_CHAMPION, 'provider');
-}
-
-if ($_POST['search_mode'] == 'formal_name') {
- $searchMethod = FORMAL_NAME_SEARCH;
-}
-
-if ($_POST['search_mode'] == 'username') {
- $searchMethod = USERNAME_SEARCH;
-}
-
-list($userCount, $users) = $xdw->enumerateGridUsers(
- $searchMethod,
- $_POST['start'],
- $_POST['limit'],
- $name_filter,
- $use_pi_filter,
- $university_id
-);
-
-$entry_id = 0;
-
-$userEntries = array();
-
-foreach ($users as $currentUser) {
- $entry_id++;
-
- if ($searchMethod == FORMAL_NAME_SEARCH) {
- $personName = $currentUser['long_name'];
- $personID = $currentUser['id'];
- }
-
- if ($searchMethod == USERNAME_SEARCH) {
- $personName = $currentUser['absusername'];
-
- // Append the absusername to the id so that each entry is guaranteed
- // to have a unique identifier (needed for dependent ExtJS combobox
- // (TGUserDropDown.js) to work properly regarding selections).
- $personID = $currentUser['id'] . ';' . $currentUser['absusername'];
- }
-
- $userEntries[] = array(
- 'id' => $entry_id,
- 'person_id' => $personID,
- 'person_name' => $personName
- );
-}
-
-$returnData = array(
- 'success' => true,
- 'status' => 'success',
- 'message' => 'success',
- 'total_user_count' => $userCount,
- 'users' => $userEntries,
-);
-
-xd_controller\returnJSON($returnData);
diff --git a/html/controllers/sab_user/get_mapping.php b/html/controllers/sab_user/get_mapping.php
deleted file mode 100644
index 27b174f7fc..0000000000
--- a/html/controllers/sab_user/get_mapping.php
+++ /dev/null
@@ -1,36 +0,0 @@
-get_mapping
-
-$params = array(
- 'use_default' => RESTRICTION_YES_NO
-);
-
-$isValid = xd_security\secureCheck($params, 'POST');
-
-if (!$isValid) {
- $returnData = array(
- 'success' => false,
- 'status' => 'invalid_params_specified',
- 'message' => 'invalid_params_specified',
- );
- xd_controller\returnJSON($returnData);
-};
-
-$logged_in_user = \xd_security\getLoggedInUser();
-
-$mapped_person_id = $logged_in_user->getPersonID($_POST['use_default'] == 'y');
-
-$xdw = new XDWarehouse();
-$mapped_person_name = $xdw->resolveName($mapped_person_id);
-
-$returnData = array(
- 'success' => true,
- 'status' => 'success',
- 'message' => 'success',
- 'mapped_person_id' => $mapped_person_id,
- 'mapped_person_name' => $mapped_person_name,
-);
-
-xd_controller\returnJSON($returnData);
-
diff --git a/html/controllers/ui_data/summary3.php b/html/controllers/ui_data/summary3.php
deleted file mode 100644
index a793952e3d..0000000000
--- a/html/controllers/ui_data/summary3.php
+++ /dev/null
@@ -1,161 +0,0 @@
-data as $filter) {
- $filterDimensionKey = $filter->dimension_id . '_filter';
- $filterValueId = $filter->value_id;
- if (isset($raw_parameters[$filterDimensionKey])) {
- $raw_parameters[$filterDimensionKey] .= ',' . $filterValueId;
- } else {
- $raw_parameters[$filterDimensionKey] = $filterValueId;
- }
- }
- }
- $enabledRealms = \Models\Services\Realms::getEnabledRealms();
- if (in_array('Jobs', $enabledRealms)) {
- $query_descripter = new \User\Elements\QueryDescripter('Jobs', 'none');
-
- // 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',
- $aggregation_unit,
- $start_date,
- $end_date,
- 'none',
- 'all',
- $query_descripter->pullQueryParameters($raw_parameters)
- );
- $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;
- }
- }
- }
-
- $mostPrivilegedAcl = Acls::getMostPrivilegedAcl($logged_in_user);
-
- $rolesConfig = \Configuration\XdmodConfiguration::assocArrayFactory('roles.json', CONFIG_DIR);
- $roles = $rolesConfig['roles'];
-
- $mostPrivilegedAclName = $mostPrivilegedAcl->getName();
- $mostPrivilegedAclSummaryCharts = $roles['default']['summary_charts'];
-
- if (isset($roles[$mostPrivilegedAclName]['summary_charts'])) {
- $mostPrivilegedAclSummaryCharts = $roles[$mostPrivilegedAclName]['summary_charts'];
- }
-
- $summaryCharts = array();
- foreach ($mostPrivilegedAclSummaryCharts as $chart)
- {
- $realm = $chart['data_series']['data'][0]['realm'];
- if (!in_array($realm, $enabledRealms)) {
- continue;
- }
- $chart['preset'] = true;
-
- $summaryCharts[] = json_encode($chart);
- }
-
- if (!isset($_REQUEST['public_user']) || $_REQUEST['public_user'] != 'true')
- {
- $queryStore = new \UserStorage($logged_in_user, 'queries_store');
- $queries = $queryStore->get();
-
- if ($queries != NULL) {
- foreach ($queries as $i => $query) {
- if (isset($query['config'])) {
-
- $queryConfig = json_decode($query['config']);
-
- $name = isset($query['name']) ? $query['name'] : null;
-
- if (isset($name)) {
- if (preg_match('/summary_(?P\S+)/', $query['name'], $matches) > 0) {
- $queryConfig->summary_index = $matches['index'];
- } else {
- $queryConfig->summary_index = $query['name'];
- }
- }
-
- if (property_exists($queryConfig, 'summary_index')
- && isset($queryConfig->summary_index)
- && isset($queryConfig->featured)
- && $queryConfig->featured
- ) {
- if (isset($summaryCharts[$queryConfig->summary_index])) {
- $queryConfig->preset = true;
- }
- $summaryCharts[$queryConfig->summary_index] = json_encode($queryConfig);
- }
- }
- }
- }
- }
-
- foreach ($summaryCharts as $i => $summaryChart) {
- $summaryChartObject = json_decode($summaryChart);
- $summaryChartObject->index = $i;
- $summaryCharts[$i] = json_encode($summaryChartObject);
- }
- ksort($summaryCharts, SORT_STRING);
- //print_r($summaryCharts);
- $result['charts'] = json_encode(array_values($summaryCharts));
-
- echo json_encode(array('totalCount' => 1, 'success' => true, 'message' => '', 'data' => array($result) ));
-
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (Exception $ex) {
- echo json_encode(array('totalCount' => 0,
- 'message' => $ex->getMessage()."
".$ex->getTraceAsString(),
- 'data' => array(),
- 'success' => false));
-}
-
diff --git a/html/controllers/user_admin.php b/html/controllers/user_admin.php
deleted file mode 100644
index 428cffbfae..0000000000
--- a/html/controllers/user_admin.php
+++ /dev/null
@@ -1,36 +0,0 @@
-registerOperation('enum_roles');
-$controller->registerOperation('list_users');
-$controller->registerOperation('get_user_details');
-$controller->registerOperation('create_user');
-$controller->registerOperation('update_user');
-$controller->registerOperation('delete_user');
-$controller->registerOperation('pass_reset');
-$controller->registerOperation('enum_resource_providers');
-$controller->registerOperation('enum_institutions');
-$controller->registerOperation('enum_user_types');
-$controller->registerOperation('enum_exception_email_addresses');
-$controller->registerOperation('empty_report_image_cache');
-$controller->registerOperation('search_users');
-
-$controller->invoke('POST', 'xdDashboardUser');
-
diff --git a/html/controllers/user_admin/create_user.php b/html/controllers/user_admin/create_user.php
deleted file mode 100644
index 1260c11e84..0000000000
--- a/html/controllers/user_admin/create_user.php
+++ /dev/null
@@ -1,150 +0,0 @@
-create_user
-
-$creator = \xd_security\assertDashboardUserLoggedIn();
-
-\xd_security\assertParametersSet(array(
- 'username' => RESTRICTION_USERNAME,
- 'first_name' => RESTRICTION_FIRST_NAME,
- 'last_name' => RESTRICTION_LAST_NAME,
- // 'assignment' => RESTRICTION_ASSIGNMENT,
- 'user_type' => RESTRICTION_GROUP,
- 'institution' => RESTRICTION_INSTITUTION
-
-));
-
-\xd_security\assertEmailParameterSet('email_address');
-
-// -----------------------------
-
-if (isset($_POST['acls'])) {
- $acls = json_decode($_POST['acls'], true);
- if (!is_array($acls) || count($acls) < 1){
- \xd_response\presentError("Acl information is required");
- }
- // Checking for an acl set that only contains feature acls.
- // Feature acls are acls that only provide access to an XDMoD feature and
- // are not used for data access.
- $aclNames = array();
- $featureAcls = Acls::getAclsByTypeName('feature');
- $tabAcls = Acls::getAclsByTypeName('tab');
- $uiOnlyAcls = array_merge($featureAcls, $tabAcls);
- if (count($uiOnlyAcls) > 0) {
- $aclNames = array_reduce(
- $uiOnlyAcls,
- function ($carry, Acl $item) {
- $carry []= $item->getName();
- return $carry;
- },
- array()
- );
- }
- $diff = array_diff(array_keys($acls), $aclNames);
- $found = !empty($diff);
- if (!$found) {
- \xd_response\presentError('Please include a non-feature acl ( i.e. User, PI etc. )');
- }
-}
-else {
- \xd_response\presentError("Acl information is required");
-}
-
-$sticky = isset($_POST['sticky']) ? filter_var($_POST['sticky'], FILTER_VALIDATE_BOOLEAN) : false;
-
-try {
- $password_chars = 'abcdefghijklmnopqrstuvwxyz!@#$%-_=+ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
- $max_password_chars_index = strlen($password_chars) - 1;
- $password = '';
- for ($i = 0; $i < CHARLIM_PASSWORD; $i++) {
- $password .= $password_chars[mt_rand(0, $max_password_chars_index)];
- }
-
- $newuser = new XDUser(
- $_POST['username'],
- $password,
- $_POST['email_address'],
- $_POST['first_name'],
- '',
- $_POST['last_name'],
- array_keys($acls),
- ROLE_ID_USER,
- $_POST['institution'],
- $_POST['assignment'],
- array(),
- $sticky
- );
- $newuser->setUserType($_POST['user_type']);
- $newuser->saveUser();
- // =============================
- foreach ($acls as $acl => $centers) {
- // Now that the user has been updated, We need to check if they have been assigned any
- // 'center' acls. If they have and if an 'institution' has been provided ( it should have
- // been ) then we need to call `setOrganizations` so that the user_acl_group_by_parameters
- // table is updated accordingly.
- if (in_array($acl, array('cd', 'cs')) && isset($_POST['institution'])) {
- $newuser->setOrganizations(
- array(
- $_POST['institution'] => array(
- 'primary'=> 1,
- 'active' => 1
- )
- ),
- $acl
- );
- }
- }
- // =============================
-
- // 'institution' now corresponds to a Users organization and will always be present, not only
- // when a user has been assigned the campus champion acl. This means we need to update the logic
- // that gates the `setInstitution` function call to include a check if the user has been
- // assigned the Campus Champion acl.
- if (isset($_POST['institution']) && in_array(ROLE_ID_CAMPUS_CHAMPION, array_keys($acls))) {
- $newuser->setInstitution($_POST['institution']);
- }
-
- $page_title = \xd_utilities\getConfiguration('general', 'title');
- $site_address = \xd_utilities\getConfigurationUrlBase('general', 'site_address');
-
- // -------------------
-
- $message = "Welcome to the $page_title. Your account has been created.\n\n";
- $message .= "Your username is: ".$_POST['username']."\n\n";
- $message .= "Please visit the following page to create your password:\n\n";
- $message .= "${site_address}password_reset.php?mode=new&rid=".$newuser->generateRID()."\n\n";
- $message .= "Once you have created a password, you will be directed to $site_address where you can then log in using your credentials.\n\n";
-
- $message .= "For assistance on using the portal, please consult the User Manual:\n";
- $message .= $site_address."user_manual\n\n";
- $message .= "The XDMoD Team";
-
- MailWrapper::sendMail(array(
- 'body' => $message,
- 'subject' => "$page_title: Account Created",
- 'toAddress' => $_POST['email_address']
- )
- );
-}
-catch (Exception $e) {
- \xd_response\presentError($e->getMessage());
-}
-
-// -----------------------------
-
-if (isset($_REQUEST['account_request_id']) && !empty($_REQUEST['account_request_id'])) {
- $xda = new XDAdmin();
- $xda->updateAccountRequestStatus($_REQUEST['account_request_id'], $creator->getUsername());
-}
-
-$returnData['success'] = true;
-$returnData['user_type'] = $_POST['user_type'];
-$returnData['message'] = 'User '.$_POST['username'].' created successfully';
-
-\xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/delete_user.php b/html/controllers/user_admin/delete_user.php
deleted file mode 100644
index f6854e5e12..0000000000
--- a/html/controllers/user_admin/delete_user.php
+++ /dev/null
@@ -1,42 +0,0 @@
-delete_user
-
- $logged_in_user = \xd_security\assertDashboardUserLoggedIn();
-
- \xd_security\assertParameterSet('uid', RESTRICTION_UID);
-
- try {
-
- $user_to_remove = XDUser::getUserByID($_POST['uid']);
-
- if ($user_to_remove == NULL) {
- \xd_response\presentError("user_does_not_exist");
- }
-
- if ($logged_in_user->getUsername() == $user_to_remove->getUsername()) {
- \xd_response\presentError("You are not allowed to delete your own account.");
- }
-
- // Remove all entries in this user's profile
- $profile = $user_to_remove->getProfile();
- $profile->clear();
-
- $username = $user_to_remove->getUsername();
-
- $statusPrefix = $user_to_remove->isSSOUser() ? 'Single Sign On ' : '';
- $displayUsername = $user_to_remove->getUsername();
-
- $user_to_remove->removeUser();
-
- $returnData['success'] = true;
- $returnData['message'] = $statusPrefix."User $displayUsername deleted from the portal";
-
- \xd_controller\returnJSON($returnData);
-
- }
- catch(Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/user_admin/empty_report_image_cache.php b/html/controllers/user_admin/empty_report_image_cache.php
deleted file mode 100644
index ff8e63ee09..0000000000
--- a/html/controllers/user_admin/empty_report_image_cache.php
+++ /dev/null
@@ -1,35 +0,0 @@
-empty_report_image_cache
-
- \xd_security\assertDashboardUserLoggedIn();
- \xd_security\assertParameterSet('uid', RESTRICTION_UID);
-
- try {
-
- $target_user = XDUser::getUserByID($_POST['uid']);
-
- if ($target_user == NULL) {
- \xd_response\presentError("user_does_not_exist");
- }
-
- $chart_pool = new XDChartPool($target_user);
- $chart_pool->emptyCache();
-
- $report_manager = new XDReportManager($target_user);
- $report_manager->emptyCache();
- $report_manager->flushReportImageCache();
-
- $displayUsername = $target_user->getUsername();
-
- $returnData['success'] = true;
- $returnData['message'] = "The report image cache for user $displayUsername has been emptied";
-
- xd_controller\returnJSON($returnData);
-
- }
- catch(Exception $e) {
-
- \xd_response\presentError($e->getMessage());
-
- }
diff --git a/html/controllers/user_admin/enum_exception_email_addresses.php b/html/controllers/user_admin/enum_exception_email_addresses.php
deleted file mode 100644
index 38645a3d6a..0000000000
--- a/html/controllers/user_admin/enum_exception_email_addresses.php
+++ /dev/null
@@ -1,15 +0,0 @@
-enum_exception_email_addresses
-
- $xda = new XDAdmin();
-
- $email_addresses = $xda->enumerateExceptionEmailAddresses();
-
- // -----------------------------
-
- $returnData['success'] = true;
- $returnData['status'] = 'success';
- $returnData['email_addresses'] = $email_addresses;
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/enum_institutions.php b/html/controllers/user_admin/enum_institutions.php
deleted file mode 100644
index 81b8a14594..0000000000
--- a/html/controllers/user_admin/enum_institutions.php
+++ /dev/null
@@ -1,25 +0,0 @@
-enum_institutions
-
-$xda = new XDAdmin();
-
-$name_filter = (isset($_POST['query'])) ? $_POST['query'] : NULL;
-
-$query = $xda->enumerateInstitutions($name_filter);
-
-// If there were records found based on the free-form `query` parameter -> organization name then go
-// ahead and return them. If not, then by default retrieve / return the full list of organizations.
-if (count($query) > 0) {
- $institutions = $query;
-} else {
- $institutions = $xda->enumerateInstitutions(null);
-}
-
-$returnData['status'] = 'success';
-$returnData['success'] = true;
-$returnData['total_institution_count'] = count($institutions);
-
-$returnData['institutions'] = $institutions;
-
-\xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/enum_resource_providers.php b/html/controllers/user_admin/enum_resource_providers.php
deleted file mode 100644
index 1a1f4bb544..0000000000
--- a/html/controllers/user_admin/enum_resource_providers.php
+++ /dev/null
@@ -1,29 +0,0 @@
-enum_resource_providers
-
- $xda = new XDAdmin();
-
- $resourceProviders = $xda->enumerateResourceProviders();
-
- $providers = array();
-
- //$providers[] = array('id' => '-1', 'organization' => 'No Service Provider');
-
- foreach($resourceProviders as $provider) {
-
- $providers[] = array(
- 'id' => $provider['id'],
- 'organization' => $provider['organization'].' ('.$provider['name'].')',
- 'include' => false
- );
-
- }
-
- // -----------------------------
-
- $returnData['status'] = 'success';
- $returnData['success'] = true;
- $returnData['providers'] = $providers;
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/enum_roles.php b/html/controllers/user_admin/enum_roles.php
deleted file mode 100644
index a7848097ac..0000000000
--- a/html/controllers/user_admin/enum_roles.php
+++ /dev/null
@@ -1,30 +0,0 @@
-enum_roles
-
- $xda = new XDAdmin();
-
- $roles = $xda->enumerateAcls();
-
-foreach($roles as $currentRole) {
- // requiresCenter can only be true iff the current install supports
- // multiple service providers.
- if ($currentRole['name'] !== 'pub') {
- $roleEntries[] = array(
- 'acl' => $currentRole['display'],
- 'acl_id' => $currentRole['name'],
- 'include' => false,
- 'primary' => false,
- 'displays_center' => false,
- 'requires_center' => false
- );
- }
-}//foreach
-
-// -----------------------------
-
- $returnData['success'] = true;
- $returnData['status'] = 'success';
- $returnData['acls'] = $roleEntries;
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/enum_user_types.php b/html/controllers/user_admin/enum_user_types.php
deleted file mode 100644
index c4e44a4807..0000000000
--- a/html/controllers/user_admin/enum_user_types.php
+++ /dev/null
@@ -1,23 +0,0 @@
-enum_user_types
-
-$xda = new XDAdmin();
-
-$userTypes = $xda->enumerateUserTypes();
-
-$userTypeEntries = array();
-
-foreach ($userTypes as $type) {
- $userTypeEntries[] = array(
- 'id' => $type['id'],
- 'type' => $type['type'],
- );
-}
-
-$returnData['success'] = true;
-$returnData['status'] = 'success';
-$returnData['user_types'] = $userTypeEntries;
-
-\xd_controller\returnJSON($returnData);
-
diff --git a/html/controllers/user_admin/get_user_details.php b/html/controllers/user_admin/get_user_details.php
deleted file mode 100644
index e852ca1d39..0000000000
--- a/html/controllers/user_admin/get_user_details.php
+++ /dev/null
@@ -1,81 +0,0 @@
-get_user_details
-
-use Models\Services\Acls;
-
-\xd_security\assertParameterSet('uid', RESTRICTION_UID);
-
- // -----------------------------
-
- $selected_user = XDUser::getUserByID($_POST['uid']);
-
- if ($selected_user == NULL){
- \xd_response\presentError("user_does_not_exist");
- }
-
- // -----------------------------
-
- $userDetails = array();
-
- $userDetails['username'] = $selected_user->getUsername();
- $userDetails['formal_name'] = $selected_user->getFormalName();
-
- $userDetails['time_created'] = $selected_user->getCreationTimestamp();
- $userDetails['time_updated'] = $selected_user->getUpdateTimestamp();
- $userDetails['time_last_logged_in'] = $selected_user->getLastLoginTimestamp();
-
- $userDetails['email_address'] = $selected_user->getEmailAddress();
-
- if ($userDetails['email_address'] == NO_EMAIL_ADDRESS_SET) {
- $userDetails['email_address'] = '';
- }
-
- $userDetails['assigned_user_id'] = $selected_user->getPersonID(TRUE);
-
- //$userDetails['provider'] = $selected_user->getOrganization();
- $userDetails['institution'] = $selected_user->getOrganizationID();
-
- $userDetails['user_type'] = $selected_user->getUserType();
-
- $obj_warehouse = new XDWarehouse();
-
- $userDetails['institution_name'] = $obj_warehouse->resolveInstitutionName($userDetails['institution']);
-
- $userDetails['assigned_user_name'] = $obj_warehouse->resolveName($userDetails['assigned_user_id']);
-
- if ($userDetails['assigned_user_name'] == NO_MAPPING) {
- $userDetails['assigned_user_name'] = '';
- }
-
- $userDetails['is_active'] = $selected_user->getAccountStatus() ? 'active' : 'disabled' ;
- $userDetails['sticky'] = $selected_user->isSticky();
-
- $acls = Acls::listUserAcls($selected_user);
- $populatedAcls = array_reduce(
- $acls,
- function ($carry, $item) use ($selected_user) {
- $aclName = $item['name'];
- $aclCenters = array();
- if ($item['requires_center'] == true) {
- $aclCenters = Acls::getDescriptorParamValues(
- $selected_user,
- $aclName,
- 'provider'
- );
- }
-
- $carry[$aclName] = $aclCenters;
-
- return $carry;
- },
- array()
- );
-
- $userDetails['acls'] = $populatedAcls;
-
- $returnData['user_information'] = $userDetails;
- $returnData['status'] = 'success';
- $returnData['success'] = true;
-
- \xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_admin/list_users.php b/html/controllers/user_admin/list_users.php
deleted file mode 100644
index e66411954d..0000000000
--- a/html/controllers/user_admin/list_users.php
+++ /dev/null
@@ -1,48 +0,0 @@
-list_users
-
-\xd_security\assertParameterSet('group', RESTRICTION_GROUP);
-
-// -----------------------------
-
-$xda = new XDAdmin();
-
-$userListing = $xda->getUserListing($_POST['group']);
-
-$users = array();
-
-foreach ($userListing as $currentUser) {
-
- $userData = explode(';', $currentUser['username']);
- if ($userData[0] !== 'Public User') {
- $userEntry = array(
- 'id' => $currentUser['id'],
- 'username' => $userData[0],
- 'first_name' => $currentUser['first_name'],
- 'last_name' => $currentUser['last_name'],
- 'account_is_active' => $currentUser['account_is_active'],
- 'last_logged_in' => parseMicrotime($currentUser['last_logged_in'])
- );
-
- $users[] = $userEntry;
- }
-}//foreach($userListing as $currentUser)
-
-// -----------------------------
-
-$returnData['success'] = true;
-$returnData['status'] = 'success';
-$returnData['users'] = $users;
-
-\xd_controller\returnJSON($returnData);
-
-// -----------------------------
-
-function parseMicrotime($mtime)
-{
-
- $time_frags = explode('.', $mtime);
- return $time_frags[0] * 1000;
-
-}//parseMicrotime
diff --git a/html/controllers/user_admin/pass_reset.php b/html/controllers/user_admin/pass_reset.php
deleted file mode 100644
index 49e095e99a..0000000000
--- a/html/controllers/user_admin/pass_reset.php
+++ /dev/null
@@ -1,65 +0,0 @@
-pass_reset
-
-$params = array('uid' => RESTRICTION_UID);
-
-$isValid = xd_security\secureCheck($params, 'POST');
-
-if (!$isValid) {
- $returnData['success'] = false;
- $returnData['status'] = 'invalid_id_specified';
- xd_controller\returnJSON($returnData);
-};
-
-// -----------------------------
-
-$user_to_email = XDUser::getUserByID($_POST['uid']);
-
-if ($user_to_email == NULL) {
- $returnData['success'] = false;
- $returnData['status'] = 'user_does_not_exist';
- xd_controller\returnJSON($returnData);
-}
-
-// -----------------------------
-
-$page_title = \xd_utilities\getConfiguration('general', 'title');
-
-// -------------------
-
-try {
- $userName = $user_to_email->getUsername();
-
- $rid = $user_to_email->generateRID();
-
- $site_address
- = \xd_utilities\getConfigurationUrlBase('general', 'site_address');
- $resetUrl = "${site_address}password_reset.php?rid=$rid";
-
- MailWrapper::sendTemplate(
- 'password_reset',
- array(
- 'first_name' => $user_to_email->getFirstName(),
- 'username' => $userName,
- 'reset_url' => $resetUrl,
- 'expiration' => strftime("%c %Z", explode('|', $rid)[1]),
- 'maintainer_signature' => MailWrapper::getMaintainerSignature(),
- 'subject' => "$page_title: Password Reset",
- 'toAddress' => $user_to_email->getEmailAddress()
- )
- );
-
- $returnData['success'] = true;
- $returnData['status'] = "Password reset e-mail sent to user {$userName}";
- $returnData['message'] = $returnData['status'];
-}
-catch (Exception $e) {
- $returnData['success'] = false;
- $returnData['message'] = $e->getMessage();
-}
-
-xd_controller\returnJSON($returnData);
-
diff --git a/html/controllers/user_admin/search_users.php b/html/controllers/user_admin/search_users.php
deleted file mode 100644
index 35a9705628..0000000000
--- a/html/controllers/user_admin/search_users.php
+++ /dev/null
@@ -1,23 +0,0 @@
-searchUsers(json_decode($_REQUEST['search_crit'], true));
-
- $returnData = array(
- 'success' => true,
- 'data' => $users,
- 'total' => count($users),
- );
-
- xd_controller\returnJSON($returnData);
-} catch (Exception $e) {
- xd_response\presentError($e->getMessage());
-}
diff --git a/html/controllers/user_admin/update_user.php b/html/controllers/user_admin/update_user.php
deleted file mode 100644
index 3eec1dadea..0000000000
--- a/html/controllers/user_admin/update_user.php
+++ /dev/null
@@ -1,229 +0,0 @@
-update_user
-
-use Models\Services\Acls;
-use Models\Acl;
-use Models\Services\Centers;
-use Models\Services\Organizations;
-
-$params = array('uid' => RESTRICTION_UID);
-
-$isValid = xd_security\secureCheck($params, 'POST');
-
-if (!$isValid) {
- $returnData['success'] = false;
- $returnData['status'] = 'invalid_id_specified';
- xd_controller\returnJSON($returnData);
-};
-
-// -----------------------------
-
-$user_to_update = XDUser::getUserByID($_POST['uid']);
-
-if ($user_to_update == null) {
- $returnData['success'] = false;
- $returnData['status'] = 'user_does_not_exist';
- xd_controller\returnJSON($returnData);
-}
-
-// -----------------------------
-
-$params = array(
- 'first_name' => RESTRICTION_FIRST_NAME,
- 'last_name' => RESTRICTION_LAST_NAME,
- 'assigned_user' => RESTRICTION_ASSIGNMENT,
- 'is_active' => RESTRICTION_ACTIVE_FLAG,
- 'user_type' => RESTRICTION_GROUP,
- 'institution' => RESTRICTION_INSTITUTION
-);
-
-\xd_security\assertEmailParameterSet('email_address');
-
-$qualifyingParams = xd_security\secureCheck($params, 'POST', false);
-
-if ($qualifyingParams == 0) {
- $returnData['success'] = false;
- $returnData['status'] = 'need_update_information';
- xd_controller\returnJSON($returnData);
-}
-
-// -----------------------------
-
-$me = XDUser::getUserByID($_SESSION['xdDashboardUser']);
-
-if ($me->getUserID() == $user_to_update->getUserID()) {
-
- if (isset($_POST['is_active'])) {
- $returnData['success'] = false;
- $returnData['status'] = 'You are not allowed to disable your own account.';
- xd_controller\returnJSON($returnData);
- }
-
- if (isset($_POST['acls'])) {
-
- $role_config = json_decode($_POST['acls'], true);
- if (!array_key_exists(ROLE_ID_MANAGER, $role_config)) {
- $returnData['success'] = false;
- $returnData['status'] = 'You are not allowed to revoke manager access from yourself.';
- xd_controller\returnJSON($returnData);
- }
- }//if (isset($_POST['acls']))
-
-}
-
-if (isset($_POST['first_name'])) {
- $user_to_update->setFirstName($_POST['first_name']);
-}
-if (isset($_POST['last_name'])) {
- $user_to_update->setLastName($_POST['last_name']);
-}
-
-if (isset($_POST['email_address'])) {
-
- $email_address = (strlen($_POST['email_address']) > 0) ? $_POST['email_address'] : NO_EMAIL_ADDRESS_SET;
-
- if (($user_to_update->getUserType() != SSO_USER_TYPE) && ($email_address == NO_EMAIL_ADDRESS_SET)) {
- $returnData['success'] = false;
- $returnData['status'] = 'This XDMoD user must have an e-mail address set.';
- xd_controller\returnJSON($returnData);
- }
-
- $user_to_update->setEmailAddress($email_address);
-
-}
-
-if (isset($_POST['assigned_user'])) {
- $user_to_update->setPersonID($_POST['assigned_user']);
-}
-if (isset($_POST['is_active'])) {
- $user_to_update->setAccountStatus($_POST['is_active'] == 'y' ? ACTIVE : INACTIVE);
-}
-
-if (isset($_POST['user_type'])) {
-
- if ($user_to_update->getUserType() != SSO_USER_TYPE) {
-
- $user_to_update->setUserType($_POST['user_type']);
-
- }
-
-}
-
-if (isset($_POST['sticky'])) {
- $user_to_update->setSticky($_POST['sticky'] === 'true');
-}
-
-// Store this users original set of acls before they are possibly modified below.
-$originalAcls = $user_to_update->getAcls(true);
-
-// ===========================================
-// Make sure that we're not attempting to enable / disable the user before
-// processing 'acls'
-if (!isset($_POST['is_active'])) {
- if (isset($_POST['acls'])) {
-
- $acls = json_decode($_POST['acls'], true);
- if (count($acls) < 1) {
- \xd_response\presentError("Acl information is required");
- }
-
- // Checking for an acl set that only contains feature acls.
- // Feature acls are acls that only provide access to an XDMoD feature and
- // are not used for data access.
- $aclNames = array();
- $featureAcls = Acls::getAclsByTypeName('feature');
- $tabAcls = Acls::getAclsByTypeName('tab');
- $uiOnlyAcls = array_merge($featureAcls, $tabAcls);
- if (count($uiOnlyAcls) > 0) {
- $aclNames = array_reduce(
- $uiOnlyAcls,
- function ($carry, Acl $item) {
- $carry [] = $item->getName();
- return $carry;
- },
- array()
- );
- }
- $diff = array_diff(array_keys($acls), $aclNames);
- $found = !empty($diff);
- if (!$found) {
- \xd_response\presentError('Please include a non-feature acl ( i.e. User, PI etc. )');
- }
-
- $user_to_update->setAcls(array());
- foreach ($acls as $aclName => $centers) {
- $acl = Acls::getAclByName($aclName);
- $user_to_update->addAcl($acl);
- }
- } else {
- \xd_response\presentError("Acl information is required");
- } // if (isset($_POST['acls'])) {
-}
-
-// 'institution' now corresponds to a Users organization and is not only present when they are a
-// campus champion. This means we need to make sure that the User's organization_id is populated but
-// that the old behavior of having `setInstitution` called w/ the 'institution' value is still
-// retained as this will have an effect on the results of CampusChampionRole's `getIdentifier`
-// function ( which is often displayed to the user ).
-if (isset($_POST['institution'])) {
- $user_to_update->setOrganizationID($_POST['institution']);
-
- $oldCampusChampion = in_array(ROLE_ID_CAMPUS_CHAMPION, $originalAcls);
- $newCampusChampion = in_array(ROLE_ID_CAMPUS_CHAMPION, array_keys($acls));
-
- if ($newCampusChampion && !$oldCampusChampion) {
- $user_to_update->setInstitution($_POST['institution']);
- } elseif (!$newCampusChampion && $oldCampusChampion) {
- $user_to_update->disassociateWithInstitution();
- }
-}//if (isset($_POST['institution']))
-
-try {
- $user_to_update->saveUser();
-
- if (!isset($_POST['is_active'])) {
- if (isset($_POST['acls']) && isset($acls)) {
-
- // clear the organizations first.
- $user_to_update->setOrganizations(array(), ROLE_ID_CENTER_DIRECTOR);
- $user_to_update->setOrganizations(array(), ROLE_ID_CENTER_STAFF);
-
- // then add each new one.
- foreach ($acls as $aclName => $centers) {
- // Now that the user has been created, We need to check if they have been assigned
- // any 'center' acls. If they have and if an 'institution' has been provided ( it
- // should have been ) then we need to call `setOrganizations` so that the
- // user_acl_group_by_parameters table is updated accordingly.
- //
- if (in_array($aclName, array('cd', 'cs')) && isset($_POST['institution'])) {
- $user_to_update->setOrganizations(
- array(
- $_POST['institution'] => array(
- 'primary'=> 1,
- 'active' => 1
- )
- ),
- $aclName
- );
- }
- }
- }
- }
-} catch (Exception $e) {
- $returnData['success'] = false;
- $returnData['status'] = $e->getMessage();
- xd_controller\returnJSON($returnData);
-}
-
-$returnData['success'] = true;
-
-$statusPrefix = $user_to_update->isSSOUser() ? 'Single Sign On ' : '';
-$displayUsername = $user_to_update->getUsername();
-
-$returnData['status'] = $statusPrefix . "User $displayUsername updated successfully";
-
-$returnData['username'] = $user_to_update->getUsername();
-$returnData['user_type'] = $user_to_update->getUserType(); //if isset()...
-
-xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_auth.php b/html/controllers/user_auth.php
deleted file mode 100644
index 2dc04f4355..0000000000
--- a/html/controllers/user_auth.php
+++ /dev/null
@@ -1,30 +0,0 @@
-registerOperation('login');
- $controller->registerOperation('logout');
- $controller->registerOperation('pass_reset');
- $controller->registerOperation('session_check');
- $controller->registerOperation('update_pass');
-
- $controller->invoke('POST');
diff --git a/html/controllers/user_auth/login.php b/html/controllers/user_auth/login.php
deleted file mode 100644
index 6ab8c02520..0000000000
--- a/html/controllers/user_auth/login.php
+++ /dev/null
@@ -1,31 +0,0 @@
-login
-
- $params = array('username' => RESTRICTION_USERNAME, 'password' => RESTRICTION_PASSWORD);
-
- $isValid = xd_security\secureCheck($params, 'POST');
-
- if (!$isValid) {
- $returnData['status'] = 'credentials_not_specified';
- xd_controller\returnJSON($returnData);
- }
-
- $user = XDUser::authenticate($_POST['username'], $_POST['password']);
-
- if (XDUser::isAuthenticated($user)) {
-
- $_SESSION['xdUser'] = $user->getUserID();
-
- $returnData['status'] = 'success';
- $returnData['first_name'] = $user->getFirstName();
- $returnData['account_is_active'] = ($user->getAccountStatus() == ACTIVE) ? 'true' : 'false';
-
- }
- else{
-
- $returnData['status'] = 'fail';
-
- }
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_auth/logout.php b/html/controllers/user_auth/logout.php
deleted file mode 100644
index c3da970e00..0000000000
--- a/html/controllers/user_auth/logout.php
+++ /dev/null
@@ -1,9 +0,0 @@
-logout
-
- session_destroy();
-
- $returnData['status'] = 'success';
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_auth/pass_reset.php b/html/controllers/user_auth/pass_reset.php
deleted file mode 100644
index e8dc163822..0000000000
--- a/html/controllers/user_auth/pass_reset.php
+++ /dev/null
@@ -1,65 +0,0 @@
-pass_reset
-
-$isValid = isset($_POST['email']) && xd_security\isEmailValid($_POST['email']);
-
-if (!$isValid) {
- $returnData['status'] = 'invalid_email_address';
- xd_controller\returnJSON($returnData);
-};
-
-// -----------------------------
-
-$user_to_email = XDUser::userExistsWithEmailAddress($_POST['email'], TRUE);
-
-if ($user_to_email == INVALID) {
- $returnData['status'] = 'no_user_mapping';
- xd_controller\returnJSON($returnData);
-}
-
-if ($user_to_email == AMBIGUOUS) {
- $returnData['status'] = 'multiple_accounts_mapped';
- xd_controller\returnJSON($returnData);
-}
-
-$user_to_email = XDUser::getUserByID($user_to_email);
-
-// -----------------------------
-
-$page_title = \xd_utilities\getConfiguration('general', 'title');
-
-// -------------------
-
-try {
- $rid = $user_to_email->generateRID();
-
- $site_address
- = \xd_utilities\getConfigurationUrlBase('general', 'site_address');
- $resetUrl = "${site_address}password_reset.php?rid=$rid";
-
- MailWrapper::sendTemplate(
- 'password_reset',
- array(
- 'first_name' => $user_to_email->getFirstName(),
- 'username' => $user_to_email->getUsername(),
- 'reset_url' => $resetUrl,
- 'expiration' => strftime("%c %Z", explode('|', $rid)[1]),
- 'maintainer_signature' => MailWrapper::getMaintainerSignature(),
- 'subject' => "$page_title: Password Reset",
- 'toAddress' => $user_to_email->getEmailAddress()
- )
- );
- $returnData['success'] = true;
- $returnData['status'] = 'success';
-}
-catch (Exception $e) {
- $returnData['success'] = false;
- $returnData['message'] = $e->getMessage();
- $returnData['status'] = 'failure';
-}
-
-xd_controller\returnJSON($returnData);
-
diff --git a/html/controllers/user_auth/session_check.php b/html/controllers/user_auth/session_check.php
deleted file mode 100644
index 00ce45d740..0000000000
--- a/html/controllers/user_auth/session_check.php
+++ /dev/null
@@ -1,21 +0,0 @@
-session_check
-
- try {
- if (isset($_REQUEST['session_user_id_type']) && $_REQUEST['session_user_id_type'] === 'Dashboard') {
- xd_security\getDashboardUser();
- } else {
- xd_security\detectUser(array(XDUser::PUBLIC_USER));
- }
- } catch (SessionExpiredException $see) {
- // TODO: Use only specific exceptions in security functions so this
- // block and generic catch block below can be refactored out.
- throw $see;
- } catch (Exception $e) {
- xd_response\presentError($e);
- }
-
- $returnData['success'] = true;
- $returnData['message'] = 'Session Alive';
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_auth/update_pass.php b/html/controllers/user_auth/update_pass.php
deleted file mode 100644
index 36781801b7..0000000000
--- a/html/controllers/user_auth/update_pass.php
+++ /dev/null
@@ -1,52 +0,0 @@
-update_pass
-
- $params = array(
- 'rid' => RESTRICTION_RID,
- 'password' => RESTRICTION_PASSWORD
- );
-
- $isValid = xd_security\secureCheck($params, 'POST');
-
- if (!$isValid) {
- $returnData['status'] = 'invalid_params_specified';
- xd_controller\returnJSON($returnData);
- };
-
- // -----------------------------
-
- $validationCheck = XDUser::validateRID($_POST['rid']);
-
- if ($validationCheck['status'] == VALID){
-
- $user_id = $validationCheck['user_id'];
-
- $user_to_update = XDUser::getUserById($user_id);
-
- $password = urldecode($_POST['password']);
-
- $user_to_update->setPassword($password);
-
- try {
-
- $user_to_update->saveUser();
-
- }
- catch(Exception $e) {
-
- $returnData['status'] = $e->getMessage();
- xd_controller\returnJSON($returnData);
-
- }
-
- $returnData['status'] = "success";
-
- }
- else {
-
- $returnData['status'] = "invalid_rid";
-
- }
-
- xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_interface.php b/html/controllers/user_interface.php
deleted file mode 100644
index c10871b6a6..0000000000
--- a/html/controllers/user_interface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-registerOperation('get_tabs');
- $controller->registerOperation('get_menus');
- $controller->registerOperation('get_charts');
- $controller->registerOperation('get_data');
- $controller->registerOperation('get_param_descriptions');
-
- $controller->invoke('REQUEST');
diff --git a/html/controllers/user_interface/get_charts.php b/html/controllers/user_interface/get_charts.php
deleted file mode 100644
index d3215de840..0000000000
--- a/html/controllers/user_interface/get_charts.php
+++ /dev/null
@@ -1,34 +0,0 @@
-getCharts($user);
-
-$end = microtime(true);
-
-$logger->log($start, $end);
-
-// Set the headers returned in the charts response.
-foreach ($chartResponse['headers'] as $headerName => $headerValue) {
- header("$headerName: $headerValue");
-}
-
-// Print out the response content.
-echo $chartResponse['results'];
diff --git a/html/controllers/user_interface/get_data.php b/html/controllers/user_interface/get_data.php
deleted file mode 100644
index 0988f64a1d..0000000000
--- a/html/controllers/user_interface/get_data.php
+++ /dev/null
@@ -1,4 +0,0 @@
- $realm,
- 'id' => 'realm_' . $realm,
- 'realm' => $realm,
- 'query_group' => $query_group_name,
- 'node_type' => 'realm',
- 'iconCls' => 'realm',
- 'description' => $realm,
- 'leaf' => false,
- );
- }
- } elseif (
- isset($_REQUEST['node'])
- && \xd_utilities\string_begins_with($_REQUEST['node'], 'category_')
- ) {
- $query_group_name = 'tg_usage';
-
- if (isset($_REQUEST['query_group'])) {
- $query_group_name = $_REQUEST['query_group'];
- }
-
- // Get the categories ( realms ) that XDMoD knows about.
- $categories = DataWarehouse::getCategories();
-
- // Retrieve the realms that the user has access to
- $realms = Realms::getRealmIdsForUser($user);
-
- // Filter the categories by those that the user has access to.
- $categories = array_map(function ($category) use ($realms) {
- return array_filter($category, function ($realm) use ($realms) {
- return in_array($realm, $realms);
- });
- }, $categories);
- $categories = array_filter($categories);
-
- // Ensure the categories are sorted as the realms were.
- $categoryRealmIndices = array();
- foreach ($categories as $categoryName => $category) {
- foreach ($category as $realm) {
- $realmIndex = array_search($realm, $realms);
- if (
- !isset($categoryRealmIndices[$categoryName])
- || $categoryRealmIndices[$categoryName] > $realmIndex
- ) {
- $categoryRealmIndices[$categoryName] = $realmIndex;
- }
- }
- }
- array_multisort($categoryRealmIndices, $categories);
-
- // If the user requested certain categories, ensure those categories
- // are valid.
- if (isset($_REQUEST['category'])) {
- $requestedCategories = explode(',', $_REQUEST['category']);
- $missingCategories = array_diff($requestedCategories, array_keys($categories));
- if (!empty($missingCategories)) {
- throw new Exception("Invalid categories: " . implode(', ', $missingCategories));
- }
- $categories = array_map(function ($categoryName) use ($categories) {
- return $categories[$categoryName];
- }, $requestedCategories);
- }
-
- foreach ($categories as $categoryName => $category) {
- $hasItems = false;
- $categoryReturnData = array();
- foreach ($category as $realm_name) {
-
- // retrieve the query descripters this user is authorized to view for this realm.
- $query_descripter_groups = Acls::getQueryDescripters(
- $user,
- $realm_name
- );
- foreach($query_descripter_groups as $groupBy => $queryDescriptorData) {
- $queryDescriptor = $queryDescriptorData['all'];
-
- if ($queryDescriptor->getShowMenu() !== true) {
- continue;
- }
-
- $nodeId = (
- 'node=group_by'
- . '&realm='
- . $categoryName
- . '&group_by='
- . $queryDescriptor->getGroupByName()
- );
-
- // Make sure that the nodeText, derived from the query descripters menu
- // label, has each instance of $realm_name replaced with $categoryName.
- $nodeText = preg_replace(
- '/' . preg_quote($realm_name, '/') . '/',
- $categoryName,
- $queryDescriptor->getMenuLabel()
- );
-
- // If this $nodeId has been seen before but for a different realm. Update
- // the list of realms associated with this $nodeId
- $nodeRealms = (
- isset($categoryReturnData[$nodeId])
- ? $categoryReturnData[$nodeId]['realm'] . ",${realm_name}"
- : $realm_name
- );
-
- $categoryReturnData[$nodeId] = array(
- 'text' => $nodeText,
- 'id' => $nodeId,
- 'group_by' => $queryDescriptor->getGroupByName(),
- 'query_group' => $query_group_name,
- 'category' => $categoryName,
- 'realm' => $nodeRealms,
- 'defaultChartSettings' => $queryDescriptor->getChartSettings(true),
- 'chartSettings' => $queryDescriptor->getChartSettings(true),
- 'node_type' => 'group_by',
- 'iconCls' => 'menu',
- 'description' => $queryDescriptor->getGroupByLabel(),
- 'leaf' => false
- );
-
- $hasItems = true;
- }
- }
-
- if ($hasItems) {
- $returnData = array_merge(
- $returnData,
- array_values($categoryReturnData)
- );
-
- $returnData[] = array(
- 'text' => '',
- 'id' => '-111',
- 'node_type' => 'separator',
- 'iconCls' => 'blank',
- 'leaf' => true,
- 'disabled' => true
- );
- }
- }
- } elseif (
- isset($_REQUEST['node'])
- && substr($_REQUEST['node'], 0, 13) == 'node=group_by'
- ) {
- if (isset($_REQUEST['category'])) {
- $categoryName = $_REQUEST['category'];
-
- if (isset($_REQUEST['group_by'])) {
- $query_group_name = 'tg_usage';
-
- if (isset($_REQUEST['query_group'])) {
- $query_group_name = $_REQUEST['query_group'];
- }
-
- // Get the categories. If the requested one does not exist,
- // throw an exception.
- $categories = DataWarehouse::getCategories();
- if (!isset($categories[$categoryName])) {
- throw new Exception("Category not found.");
- }
-
- $group_by_name = $_REQUEST['group_by'];
-
- foreach ($categories[$categoryName] as $realm_name) {
- $query_descripter = Acls::getQueryDescripters($user, $realm_name, $group_by_name);
- if (empty($query_descripter)) {
- continue;
- }
-
- $group_by = $query_descripter->getGroupByInstance();
-
- foreach ($query_descripter->getPermittedStatistics() as $realm_group_by_statistic) {
- $statistic_object = $query_descripter->getStatistic($realm_group_by_statistic);
-
- if ( ! $statistic_object->showInMetricCatalog() || in_array($group_by_name, $statistic_object->getHiddenGroupBys())) {
- continue;
- }
-
- $statName = $statistic_object->getId();
- $chartSettings = $query_descripter->getChartSettings();
- if(!$statistic_object->usesTimePeriodTablesForAggregate()){
- $chartSettingsArray = json_decode($chartSettings, true);
- $chartSettingsArray['dataset_type'] = 'timeseries';
- $chartSettingsArray['display_type'] = 'line';
- $chartSettingsArray['swap_xy'] = false;
- $chartSettings = json_encode($chartSettingsArray);
- }
- $returnData[] = array(
- 'text' => $statistic_object->getName(false),
- 'id' => 'node=statistic'
- . '&realm='
- . $realm_name
- . '&group_by='
- . $group_by_name
- . '&statistic='
- . $statName,
- 'statistic' => $statName,
- 'group_by' => $group_by_name,
- 'group_by_label' => $group_by->getName(),
- 'query_group' => $query_group_name,
- 'category' => $categoryName,
- 'realm' => $realm_name,
- 'defaultChartSettings' => $chartSettings,
- 'chartSettings' => $chartSettings,
- 'node_type' => 'statistic',
- 'iconCls' => 'chart',
- 'description' => $statName,
- 'leaf' => true,
- 'supportsAggregate' => $statistic_object->usesTimePeriodTablesForAggregate()
- );
- }
- }
-
- if (empty($returnData)) {
- throw new Exception("Category not found.");
- }
-
- $texts = array();
- foreach($returnData as $key => $row) {
- $texts[$key] = $row['text'];
- }
- array_multisort($texts, SORT_ASC, $returnData);
- }
- }
- }
-} catch (SessionExpiredException $see) {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (Exception $ex) {
- $returnData = array(
- 'totalCount' => 0,
- 'message' => $ex->getMessage(),
- 'data' => array($ex->getTraceAsString()),
- 'success' => false,
- );
-}
-
-xd_controller\returnJSON($returnData);
diff --git a/html/controllers/user_interface/get_param_descriptions.php b/html/controllers/user_interface/get_param_descriptions.php
deleted file mode 100644
index 0cfa4e04a4..0000000000
--- a/html/controllers/user_interface/get_param_descriptions.php
+++ /dev/null
@@ -1,41 +0,0 @@
-pullQueryParameterDescriptionsFromRequest($_REQUEST, $user);
-
- $key_value_param_descriptions = array();
- foreach($parameter_descriptions as $param_desc)
- {
- $kv = explode('=',$param_desc);
- $key_value_param_descriptions[] = array('key' => trim($kv[0],' '), 'value' => trim($kv[1],' '));
- }
-
- $returnData = array(
- 'totalCount' => count($key_value_param_descriptions),
- 'success' => true,
- 'message' => 'success',
- 'data' => $key_value_param_descriptions);
-
- }
- catch(SessionExpiredException $see)
- {
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
- }
- catch(Exception $ex)
- {
- $returnData = array(
- 'totalCount' => 0,
- 'message' => $ex->getMessage(),
- 'data' => array(),
- 'success' => false);
- }
-
- print json_encode($returnData);
diff --git a/html/controllers/user_interface/get_tabs.php b/html/controllers/user_interface/get_tabs.php
deleted file mode 100644
index 93ded42336..0000000000
--- a/html/controllers/user_interface/get_tabs.php
+++ /dev/null
@@ -1,58 +0,0 @@
-get_tabs
-
-use Models\Services\Tabs;
-
-$returnData = array();
-
-try {
- $user = \xd_security\detectUser(array(XDUser::PUBLIC_USER));
-
- $results = array();
- $tabs = Tabs::getTabs($user);
- foreach($tabs as $tab) {
- $results[] = array(
- 'tab' => $tab['name'],
- 'isDefault' => isset($tab['default']) ? $tab['default'] : false,
- 'title' => $tab['title'],
- 'pos' => $tab['position'],
- 'permitted_modules' => isset($tab['permitted_modules']) ? $tab['permitted_modules'] : null,
- 'javascriptClass' => $tab['javascriptClass'],
- 'javascriptReference' => $tab['javascriptReference'],
- 'tooltip' => isset($tab['tooltip']) ? $tab['tooltip'] : '',
- 'userManualSectionName' => $tab['userManualSectionName'],
- );
- }
- // Sort tabs
- usort(
- $results,
- function ($a, $b) {
- return ($a['pos'] < $b['pos']) ? -1 : 1;
- }
- );
-
- $returnData = array(
- 'success' => true,
- 'totalCount' => 1,
- 'message' => '',
- 'data' => array(
- array('tabs' => json_encode(array_values($results)))
- ),
- );
-} catch (SessionExpiredException $see)
-{
- // TODO: Refactor generic catch block below to handle specific exceptions,
- // which would allow this block to be removed.
- throw $see;
-} catch (Exception $e) {
- $returnData = array(
- 'success' => false,
- 'totalCount' => 0,
- 'message' => $e->getMessage(),
- 'stacktrace' => $e->getTrace(),
- 'data' => array(),
- );
-}
-
-xd_controller\returnJSON($returnData);
diff --git a/html/gaq.php b/html/gaq.php
deleted file mode 100644
index ed6780d7c3..0000000000
--- a/html/gaq.php
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/html/internal_dashboard/css/AdminPanel.css b/html/gui/css/dashboard/AdminPanel.css
similarity index 87%
rename from html/internal_dashboard/css/AdminPanel.css
rename to html/gui/css/dashboard/AdminPanel.css
index 8d6cad00c0..15a0dd36fe 100644
--- a/html/internal_dashboard/css/AdminPanel.css
+++ b/html/gui/css/dashboard/AdminPanel.css
@@ -1,12 +1,12 @@
/* Styling for message prompt (defined in CCR.js as CCR.xdmod.ui.userManagementMessage) */
.user_management_message_prompt {
- background-image: url('../../gui/images/people_16.png');
+ background-image: url('../../images/people_16.png');
}
.admin_panel_invalid_text_entry {
background-color: #fdc6c8 !important;
- background-image: url('../../gui/images/exclamation.png') !important;
+ background-image: url('../../images/exclamation.png') !important;
background-repeat: no-repeat !important;
background-position: right !important;
}
@@ -128,7 +128,7 @@
}
.admin_panel_btn_create_user {
- background: url('../../gui/images/user_add.png') no-repeat !important;
+ background: url('../../images/user_add.png') no-repeat !important;
}
.admin_panel_user_details {
@@ -136,7 +136,7 @@
}
.admin_panel_btn_save_icon {
- background: url('../../gui/images/disk.png') no-repeat !important;
+ background: url('../../images/disk.png') no-repeat !important;
}
.admin_panel_user_list_selector .x-hide-label {
@@ -179,16 +179,16 @@ div.admin_panel_existing_user_settings div.x-form-item {
.btn_center_selections_reset
{
- background-image: url('../images/icon_reset.png') !important;
+ background-image: url('../../images/dashboard/icon_reset.png') !important;
}
.btn_center_selections_save
{
- background-image: url('../images/icon_save.png') !important;
+ background-image: url('../../images/dashboard/icon_save.png') !important;
}
.btn_ingestion_exception
{
- background-image: url('../images/icon_exception.png') !important;
+ background-image: url('../../images/dashboard/icon_exception.png') !important;
}
diff --git a/html/internal_dashboard/css/dashboard.css b/html/gui/css/dashboard/dashboard.css
similarity index 100%
rename from html/internal_dashboard/css/dashboard.css
rename to html/gui/css/dashboard/dashboard.css
diff --git a/html/gui/css/dashboard/management.css b/html/gui/css/dashboard/management.css
new file mode 100644
index 0000000000..fc2a7d564a
--- /dev/null
+++ b/html/gui/css/dashboard/management.css
@@ -0,0 +1,72 @@
+.dashboard_user_stats_timeframe .x-form-check-wrap {
+ padding-left: 10px;
+}
+
+.btn_refresh
+{
+ background-image: url('../../images/dashboard/icon_refresh.png') !important;
+}
+
+.btn_delete,
+.general_btn_close
+{
+ background-image: url('../../images/dashboard/icon_delete.png') !important;
+}
+
+.btn_edit
+{
+ background-image: url('../../images/dashboard/icon_edit.png') !important;
+}
+
+.btn_init_dialog
+{
+ background-image: url('../../images/dashboard/icon_dialog.png') !important;
+}
+
+.update_highlight
+{
+ background-color: #eaf945;
+}
+
+.btn_login_as
+{
+ background-image: url('../../images/dashboard/icon_login.png') !important;
+}
+
+/* ------ Current Users Section Stylings ------- */
+
+.btn_email
+{
+ background-image: url('../../images/dashboard/icon_email.png') !important;
+}
+
+/* --------------------------------------------- */
+
+.btn_group
+{
+ background-image: url('../../images/dashboard/icon_group.png') !important;
+}
+
+
+.btn_role
+{
+ background-image: url('../../images/dashboard/icon_role.png') !important;
+}
+
+.selected_menu_item
+{
+ color: #00f;
+}
+
+/* ------ Recipient Verification Window Stylings ------- */
+
+.btn_email_send
+{
+ background-image: url('../../images/dashboard/icon_email_send.png') !important;
+}
+
+.btn_email_cancel
+{
+ background-image: url('../../images/dashboard/icon_email_cancel.png') !important;
+}
+
diff --git a/html/internal_dashboard/css/menu.css b/html/gui/css/dashboard/menu.css
similarity index 100%
rename from html/internal_dashboard/css/menu.css
rename to html/gui/css/dashboard/menu.css
diff --git a/html/internal_dashboard/css/splash.css b/html/gui/css/dashboard/splash.css
similarity index 100%
rename from html/internal_dashboard/css/splash.css
rename to html/gui/css/dashboard/splash.css
diff --git a/html/gui/general/login.php b/html/gui/general/login.php
deleted file mode 100644
index 70073a0cb9..0000000000
--- a/html/gui/general/login.php
+++ /dev/null
@@ -1,125 +0,0 @@
-isSamlConfigured()) {
- $xdmodUser = $auth->getXdmodAccount();
- if ($xdmodUser->getAccountStatus()) {
- $formal_name = $xdmodUser->getFormalName();
- $xdmodUser->postLogin();
- \xd_rest\setCookies();
- } else {
- $message = 'Your account is currently inactive, please contact an administrator.';
- }
- }
-} catch (Exception $e) {
- $message = $e->getMessage();
-}
-// Used for Single Sign On or samlErrors
-?>
-
-
-
-
-
-
-
-
-
-
-
-
- Contact a system administrator.
-
-
-
-
-
-
-
-
-
- |
-
- Welcome,
-
-
-
-
-
- Logging you into XDMoD
-
- |
-
-
-
-
-