- Made Item::guidFromUri()'s $host parameter optional (allowing null)
- added some type-hints
- added documentation
- this may fix reported issue in #11630
This commit is contained in:
Roland Häder 2022-06-24 03:14:22 +02:00
parent dbc1ebbb5c
commit 82bb36e13d
No known key found for this signature in database
GPG Key ID: C82EDE5DDFA0BA77
3 changed files with 49 additions and 12 deletions

View File

@ -1830,11 +1830,11 @@ class Item
* Posts that are created on this system are using System::createUUID.
* Received ActivityPub posts are using Processor::getGUIDByURL.
*
* @param string $uri uri of an item entry
* @param string $host hostname for the GUID prefix
* @return string unique guid
* @param string $uri uri of an item entry
* @param string|null $host hostname for the GUID prefix
* @return string Unique guid
*/
public static function guidFromUri(string $uri, string $host): string
public static function guidFromUri(string $uri, string $host = null): string
{
// Our regular guid routine is using this kind of prefix as well
// We have to avoid that different routines could accidentally create the same value

View File

@ -313,7 +313,7 @@ class Feed
$item['uri'] = $guid;
// Don't use the GUID value directly but instead use it as a basis for the GUID
$item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST) ?? '');
$item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST));
}
if (empty($item['uri'])) {

View File

@ -31,12 +31,24 @@ use Friendica\Model\APContact;
*/
class LDSignature
{
public static function isSigned($data)
/**
* Checks if element 'signature' is found and not empty
*
* @param array $data
* @return bool
*/
public static function isSigned(array $data): bool
{
return !empty($data['signature']);
}
public static function getSigner($data)
/**
* Returns actor (signer) from given data
*
* @param array $data
* @return mixed Returns actor or false on error
*/
public static function getSigner(array $data)
{
if (!self::isSigned($data)) {
return false;
@ -66,13 +78,20 @@ class LDSignature
}
}
public static function sign($data, $owner)
/**
* Signs given data by owner's signature
*
* @param array $data Data to sign
* @param array $owner Owner information, like URL
* @return array Merged array of $data and signature
*/
public static function sign(array $data, array $owner): array
{
$options = [
'type' => 'RsaSignature2017',
'nonce' => Strings::getRandomHex(64),
'creator' => $owner['url'] . '#main-key',
'created' => DateTimeFormat::utcNow(DateTimeFormat::ATOM)
'created' => DateTimeFormat::utcNow(DateTimeFormat::ATOM),
];
$ohash = self::hash(self::signableOptions($options));
@ -82,13 +101,25 @@ class LDSignature
return array_merge($data, ['signature' => $options]);
}
private static function signableData($data)
/**
* Removes element 'signature' from array
*
* @param array $data
* @return array With no element 'signature'
*/
private static function signableData(array $data): array
{
unset($data['signature']);
return $data;
}
private static function signableOptions($options)
/**
* Removes some elements and adds '@context' to it
*
* @param array $options
* @return array With some removed elements and added '@context' element
*/
private static function signableOptions(array $options): array
{
$newopts = ['@context' => 'https://w3id.org/identity/v1'];
@ -99,7 +130,13 @@ class LDSignature
return array_merge($newopts, $options);
}
private static function hash($obj)
/**
* Hashes normalized object
*
* @param ??? $obj
* @return string SHA256 hash
*/
private static function hash($obj): string
{
return hash('sha256', JsonLD::normalize($obj));
}