From 53670681b1a03b02faded3ae57ca476d0fa461d0 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Wed, 8 May 2024 15:29:44 +0200 Subject: [PATCH 1/5] Update metadata --- .gitattributes | 121 +++++++++++++++++++++++++++++++++++++++++++++++++ .gitignore | 9 +++- composer.lock | 21 +++++++++ 3 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 composer.lock diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..deb86b8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,121 @@ +### +# https://github.com/gitattributes/gitattributes/blob/master/Common.gitattributes +### + +# Auto detect text files and perform LF normalization +* text=auto + +# +# The above will handle all files NOT found below +# + +# Documents +*.bibtex text diff=bibtex +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.md text diff=markdown +*.mdx text diff=markdown +*.tex text diff=tex +*.adoc text +*.textile text +*.mustache text +*.csv text eol=crlf +*.tab text +*.tsv text +*.txt text +*.sql text +*.epub diff=astextplain + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as text by default. +*.svg text +# If you want to treat it as binary, +# use the following line instead. +# *.svg binary +*.eps binary + +# Scripts +*.bash text eol=lf +*.fish text eol=lf +*.ksh text eol=lf +*.sh text eol=lf +*.zsh text eol=lf +# These are explicitly windows files and should use crlf +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# Serialisation +*.json text +*.toml text +*.xml text +*.yaml text +*.yml text + +# Archives +*.7z binary +*.gz binary +*.tar binary +*.tgz binary +*.zip binary + +# Text files where line endings should be preserved +*.patch -text + +# +# Exclude files from exporting +# + +.gitattributes export-ignore +.gitignore export-ignore +.gitkeep export-ignore + +### +# https://github.com/gitattributes/gitattributes/blob/master/PHP.gitattributes +### + +# PHP files +*.php text eol=lf diff=php +*.phpt text eol=lf diff=php +*.phtml text eol=lf diff=html +*.twig text eol=lf +*.phar binary + +# Configuration +phpcs.xml text eol=lf +phpunit.xml text eol=lf +phpstan.neon text eol=lf +psalm.xml text eol=lf + +### +# Open Culture Consulting custom additions +### + +# Configuration +.editorconfig text eol=lf +*.dist.xml text eol=lf +*.xml.dist text eol=lf +*.neon text eol=lf + +# Generated documentation +doc/* linguist-generated=true + +# Exclude files from exporting +.github/* export-ignore +.phpdoc/* export-ignore +phpdoc.dist.xml export-ignore diff --git a/.gitignore b/.gitignore index 3a9875b..1f17302 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ +/.phpdoc/cache/ +/.vscode/ /vendor/ -composer.lock +.php-cs-fixer.php +phpcs.xml +phpdoc.xml +phpstan.neon +psalm.xml +TODO diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..39a781d --- /dev/null +++ b/composer.lock @@ -0,0 +1,21 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "202dff7c3944cd862680ea4668a67650", + "packages": [], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": "^7.0|^8.0", + "ext-xml": "*" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} From beeef31d9123528833ebe695ac720c1d24d7dcd1 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Wed, 8 May 2024 15:29:58 +0200 Subject: [PATCH 2/5] Fix deprecation warnings for PHP 8.1 --- Classes/Exception.php | 53 ++++++++++++++++++++++--------------------- Classes/Response.php | 6 ++++- Classes/Server.php | 14 ++++++++---- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/Classes/Exception.php b/Classes/Exception.php index c4d5b58..5d0d1a2 100644 --- a/Classes/Exception.php +++ b/Classes/Exception.php @@ -24,33 +24,34 @@ namespace OCC\OAI2; class Exception extends \Exception { + private array $errorTable = [ + 'badArgument' => [ + 'text' => 'The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax.', + ], + 'badResumptionToken' => [ + 'text' => 'The value of the resumptionToken argument is invalid or expired.', + ], + 'badVerb' => [ + 'text' => 'Value of the verb argument is not a legal OAI-PMH verb, the verb argument is missing, or the verb argument is repeated.', + ], + 'cannotDisseminateFormat' => [ + 'text' => 'The metadata format identified by the value given for the metadataPrefix argument is not supported by the item or by the repository.', + ], + 'idDoesNotExist' => [ + 'text' => 'The value of the identifier argument is unknown or illegal in this repository.', + ], + 'noRecordsMatch' => [ + 'text' => 'The combination of the values of the from, until, set and metadataPrefix arguments results in an empty list.', + ], + 'noMetadataFormats' => [ + 'text' => 'There are no metadata formats available for the specified item.', + ], + 'noSetHierarchy' => [ + 'text' => 'The repository does not support sets.', + ] + ]; + public function __construct($code) { - $this->errorTable = [ - 'badArgument' => [ - 'text' => 'The request includes illegal arguments, is missing required arguments, includes a repeated argument, or values for arguments have an illegal syntax.', - ], - 'badResumptionToken' => [ - 'text' => 'The value of the resumptionToken argument is invalid or expired.', - ], - 'badVerb' => [ - 'text' => 'Value of the verb argument is not a legal OAI-PMH verb, the verb argument is missing, or the verb argument is repeated.', - ], - 'cannotDisseminateFormat' => [ - 'text' => 'The metadata format identified by the value given for the metadataPrefix argument is not supported by the item or by the repository.', - ], - 'idDoesNotExist' => [ - 'text' => 'The value of the identifier argument is unknown or illegal in this repository.', - ], - 'noRecordsMatch' => [ - 'text' => 'The combination of the values of the from, until, set and metadataPrefix arguments results in an empty list.', - ], - 'noMetadataFormats' => [ - 'text' => 'There are no metadata formats available for the specified item.', - ], - 'noSetHierarchy' => [ - 'text' => 'The repository does not support sets.', - ], - ]; parent::__construct($this->errorTable[$code]['text']); $this->code = $code; } diff --git a/Classes/Response.php b/Classes/Response.php index d2d3c1f..17d1dfd 100644 --- a/Classes/Response.php +++ b/Classes/Response.php @@ -24,7 +24,11 @@ namespace OCC\OAI2; class Response { - public $doc; // DOMDocument. Handle of current XML Document object + public \DOMDocument $doc; // DOMDocument. Handle of current XML Document object + + private string $verb = ''; + + private \DOMElement $verbNode; public function __construct($uri, $verb, $request_args) { if (substr($uri, -1, 1) == '/') { diff --git a/Classes/Server.php b/Classes/Server.php index 0daf4c6..2a5eada 100644 --- a/Classes/Server.php +++ b/Classes/Server.php @@ -34,6 +34,12 @@ class Server { private $max_records = 100; private $token_prefix = '/tmp/oai2-'; private $token_valid = 86400; + private $uri = ''; + private $identifyResponse; + private $listMetadataFormatsCallback; + private $listRecordsCallback; + private $getRecordCallback; + private Response $response; public function __construct($uri, $args, $identifyResponse, $callbacks, $config) { $this->uri = $uri; @@ -222,7 +228,7 @@ class Server { if ($records_count - $deliveredRecords > $maxItems) { $deliveredRecords += $maxItems; $restoken = $this->createResumptionToken($deliveredRecords, $metadataPrefix, $from, $until); - $expirationDatetime = gmstrftime('%Y-%m-%dT%TZ', time()+$this->token_valid); + $expirationDatetime = date('Y-m-d\TH:i:s\Z', time()+$this->token_valid); } elseif (isset($this->args['resumptionToken'])) { // Last delivery, return empty resumptionToken $restoken = null; @@ -277,8 +283,8 @@ class Server { } private function formatTimestamp($datestamp) { - if (is_array($time = strptime($datestamp, '%Y-%m-%dT%H:%M:%SZ')) || is_array($time = strptime($datestamp, '%Y-%m-%d'))) { - return gmmktime($time['tm_hour'], $time['tm_min'], $time['tm_sec'], $time['tm_mon'] + 1, $time['tm_mday'], $time['tm_year']+1900); + if (is_array($time = date_parse_from_format('Y-m-d\TH:i:s\Z', $datestamp)) || is_array($time = date_parse_from_format('Y-m-d\TH:i:s\Z', $datestamp))) { + return gmmktime($time['hour'], $time['minute'], $time['second'], $time['month'] + 1, $time['day'], $time['year']); } else { return null; } @@ -289,7 +295,7 @@ class Server { if ($datetime === false) { $datetime = \DateTime::createFromFormat('Y-m-d', $date); } - return ($datetime !== false) && ($datetime->getLastErrors() !== false); + return ($datetime !== false); } } From c4a5a0920568170927ad621bdb24dd744e3e0e1f Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Wed, 8 May 2024 15:39:09 +0200 Subject: [PATCH 3/5] Avoid null values for XML elements --- Classes/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Response.php b/Classes/Response.php index 17d1dfd..6a7a37c 100644 --- a/Classes/Response.php +++ b/Classes/Response.php @@ -78,7 +78,7 @@ class Response { * @param string $nodeName The name of appending node. * @param string $value The content of appending node. */ - public function addToVerbNode($nodeName, $value = null) { + public function addToVerbNode($nodeName, $value = '') { if (!isset($this->verbNode) && !empty($this->verb)) { $this->verbNode = $this->addChild($this->doc->documentElement, $this->verb); } From a142f9fdfb723fc8649fd6ba9cd796b2fcef64fc Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Fri, 10 May 2024 15:02:28 +0200 Subject: [PATCH 4/5] Fix date parsing error --- Classes/Server.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Classes/Server.php b/Classes/Server.php index 2a5eada..4e39332 100644 --- a/Classes/Server.php +++ b/Classes/Server.php @@ -283,10 +283,14 @@ class Server { } private function formatTimestamp($datestamp) { - if (is_array($time = date_parse_from_format('Y-m-d\TH:i:s\Z', $datestamp)) || is_array($time = date_parse_from_format('Y-m-d\TH:i:s\Z', $datestamp))) { - return gmmktime($time['hour'], $time['minute'], $time['second'], $time['month'] + 1, $time['day'], $time['year']); - } else { + $time = date_parse_from_format('Y-m-d\TH:i:s\Z', $datestamp); + if ($time['error_count'] > 0) { + $time = date_parse_from_format('Y-m-d', $datestamp); + } + if ($time['error_count'] > 0) { return null; + } else { + return gmmktime($time['hour'], $time['minute'], $time['second'], $time['month'] + 1, $time['day'], $time['year']); } } From 6272d964346464a73ddaddcf6cc7f5509fa46983 Mon Sep 17 00:00:00 2001 From: Sebastian Meyer Date: Thu, 16 May 2024 10:53:47 +0200 Subject: [PATCH 5/5] Stricter PHP version constraints --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 2f1b2ad..ef9aab7 100644 --- a/composer.json +++ b/composer.json @@ -46,7 +46,7 @@ "docs": "https://github.com/opencultureconsulting/simple-oai-pmh/blob/master/README.md" }, "require": { - "php": "^7.0|^8.0", + "php": "7.4.*|8.0.*|8.1.*|8.2.*", "ext-xml": "*" }, "replace": {