aboutsummaryrefslogtreecommitdiffstats
path: root/Zotlabs/Module/Magic.php
diff options
context:
space:
mode:
Diffstat (limited to 'Zotlabs/Module/Magic.php')
-rw-r--r--Zotlabs/Module/Magic.php64
1 files changed, 52 insertions, 12 deletions
diff --git a/Zotlabs/Module/Magic.php b/Zotlabs/Module/Magic.php
index 122d90b1b..6aba9b1ba 100644
--- a/Zotlabs/Module/Magic.php
+++ b/Zotlabs/Module/Magic.php
@@ -6,6 +6,8 @@ use Zotlabs\Web\Controller;
use Zotlabs\Web\HTTPSig;
use Zotlabs\Lib\Libzot;
use Zotlabs\Lib\SConfig;
+use GuzzleHttp\Psr7\Request;
+use HttpSignature\HttpMessageSigner;
class Magic extends Controller {
@@ -101,26 +103,65 @@ class Magic extends Controller {
$dest = strip_zids($dest);
$dest = strip_query_param($dest,'f');
- // We now post to the OWA endpoint. This improves security by providing a signed digest
+ // try RFC9421 first
+
+ $request = new Request(
+ 'GET',
+ $owapath,
+ [
+ 'Host' => $parsed['host'],
+ 'Date' => gmdate('D, d M Y H:i:s T'),
+ 'Accept' => 'application/x-zot+json',
+ 'X-Open-Web-Auth' => random_string(),
+ ],
+ );
+
+ $signer = new HttpMessageSigner();
+
+ $signer->setPrivateKey($channel['channel_prvkey']);
+ $signer->setAlgorithm('rsa-v1_5-sha256');
+ $signer->setKeyId(channel_url($channel));
+ $signer->setCreated(time());
+ $signer->setExpires(time() + 3600);
- $data = json_encode([ 'OpenWebAuth' => random_string() ]);
+ $coveredFields = '("@method" "@target-uri" "host" "date" "accept" "x-open-web-auth")';
+ $request = $signer->signRequest($coveredFields, $request);
+ $signedHeaders = $signer->getHeaders($request);
- $headers = [];
- $headers['Accept'] = 'application/x-zot+json' ;
- $headers['Content-Type'] = 'application/x-zot+json' ;
- $headers['X-Open-Web-Auth'] = random_string();
- $headers['Host'] = $parsed['host'];
- $headers['(request-target)'] = 'get /owa';
+ $curlHeaders = [];
+ foreach ($signedHeaders as $key => $value) {
+ $curlHeaders[] = $key . ': ' . $value;
+ }
- $headers = HTTPSig::create_sig($headers,$channel['channel_prvkey'], channel_url($channel),true,'sha512');
$redirects = 0;
+ $x = z_fetch_url($owapath, false, $redirects, ['headers' => $curlHeaders]);
+ logger('owa RFC9421 fetch returned: ' . print_r($x,true),LOGGER_DATA);
+
+ $rfc9421 = false;
+
+ if ($x['success']) {
+ $rfc9421_result = json_decode($x['body'], true);
+ $rfc9421 = $rfc9421_result['success'];
+ }
+
+ if (!$rfc9421 || ($x['return_code'] >= 400 && $x['return_code'] != 404)) {
+ $headers = [];
+ $headers['Accept'] = 'application/x-zot+json' ;
+ $headers['Content-Type'] = 'application/x-zot+json' ;
+ $headers['X-Open-Web-Auth'] = random_string();
+ $headers['Host'] = $parsed['host'];
+ $headers['(request-target)'] = 'get /owa';
- $x = z_fetch_url($owapath, false, $redirects, ['headers' => $headers]);
+ $headers = HTTPSig::create_sig($headers,$channel['channel_prvkey'], channel_url($channel),true,'sha512');
+ $redirects = 0;
- logger('owa fetch returned: ' . print_r($x,true),LOGGER_DATA);
+ $x = z_fetch_url($owapath, false, $redirects, ['headers' => $headers]);
+ logger('owa fetch returned: ' . print_r($x,true),LOGGER_DATA);
+ }
if ($x['success']) {
$j = json_decode($x['body'],true);
+
if ($j['success'] && $j['encrypted_token']) {
// decrypt the token using our private key
$token = '';
@@ -139,7 +180,6 @@ class Magic extends Controller {
echo $o;
killme();
-
}
}
}