pull/6541/head
Daniel Supernault 6 months ago
parent 8aab6bdf1a
commit f5d2d95e76
No known key found for this signature in database
GPG Key ID: 23740873EE6F76A1

@ -287,12 +287,18 @@ class UserAccountDelete extends Command
$httpFailed = [];
$retryable = collect();
$requests = function () use ($client, $urls, $digest, $payload) {
$version = config('pixelfed.version');
$appUrl = config('app.url');
$userAgent = "(Pixelfed/{$version}; +{$appUrl})";
$requests = function () use ($client, $urls, $digest, $payload, $userAgent) {
foreach ($urls as $url) {
$headers = HttpSignature::instanceActorSignWithDigest($url, $digest, [
'Content-Type' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
]);
$headers['User-Agent'] = $userAgent;
yield function () use ($client, $url, $headers, $payload) {
return $client->postAsync($url, [
'curl' => [
@ -355,6 +361,8 @@ class UserAccountDelete extends Command
'Content-Type' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
]);
$headers['User-Agent'] = $userAgent;
$this->info('Target: '.$url);
$this->newLine();

@ -98,41 +98,6 @@ class HttpSignature
return $headers;
}
public static function instanceActorSignWithDigest(
string $url,
string $digest,
array $addlHeaders = [],
string $method = 'post'
): array {
$keyId = config('app.url').'/i/actor#main-key';
$privateKey = Cache::rememberForever(InstanceActor::PKI_PRIVATE, function () {
$instance = InstanceActor::first()
?: tap(Artisan::call('instance:actor'), fn () => sleep(10)) && InstanceActor::first();
if (! $instance) {
throw new \Exception('Failed to generate or retrieve InstanceActor.');
}
return $instance->private_key;
});
abort_if(! $privateKey, 400, 'Missing instance actor key, please run php artisan instance:actor');
$headers = self::_headersToSign($url, $digest, $method);
$headers = array_merge($headers, $addlHeaders);
$stringToSign = self::_headersToSigningString($headers);
$signedHeaders = implode(' ', array_map('strtolower', array_keys($headers)));
$key = openssl_pkey_get_private($privateKey);
openssl_sign($stringToSign, $signature, $key, OPENSSL_ALGO_SHA256);
$signature = base64_encode($signature);
$signatureHeader = 'keyId="'.$keyId.'",headers="'.$signedHeaders.'",algorithm="rsa-sha256",signature="'.$signature.'"';
unset($headers['(request-target)']);
$headers['Signature'] = $signatureHeader;
return self::_headersToCurlArray($headers);
}
public static function parseSignatureHeader($signature)
{
$parts = explode(',', $signature);
@ -191,6 +156,41 @@ class HttpSignature
return [$verified, $signingString];
}
public static function instanceActorSignWithDigest(
string $url,
string $digest,
array $addlHeaders = [],
string $method = 'post'
): array {
$keyId = config('app.url').'/i/actor#main-key';
$privateKey = Cache::rememberForever(InstanceActor::PKI_PRIVATE, function () {
$instance = InstanceActor::first()
?: tap(Artisan::call('instance:actor'), fn () => sleep(10)) && InstanceActor::first();
if (! $instance) {
throw new \Exception('Failed to generate or retrieve InstanceActor.');
}
return $instance->private_key;
});
abort_if(! $privateKey, 400, 'Missing instance actor key, please run php artisan instance:actor');
$headers = self::_headersToSign($url, $digest, $method);
$headers = array_merge($headers, $addlHeaders);
$stringToSign = self::_headersToSigningString($headers);
$signedHeaders = implode(' ', array_map('strtolower', array_keys($headers)));
$key = openssl_pkey_get_private($privateKey);
openssl_sign($stringToSign, $signature, $key, OPENSSL_ALGO_SHA256);
$signature = base64_encode($signature);
$signatureHeader = 'keyId="'.$keyId.'",headers="'.$signedHeaders.'",algorithm="rsa-sha256",signature="'.$signature.'"';
unset($headers['(request-target)']);
$headers['Signature'] = $signatureHeader;
return $headers;
}
private static function _headersToSigningString($headers)
{
return implode("\n", array_map(function ($k, $v) {

Loading…
Cancel
Save