Skip to content

Commit a8ca2b0

Browse files
committed
separated out the solidstoragehandler from the route, so that it becomes unit testable
1 parent a3174fb commit a8ca2b0

2 files changed

Lines changed: 85 additions & 79 deletions

File tree

lib/Routes/SolidStorage.php

Lines changed: 14 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,21 @@
11
<?php
2-
namespace Pdsinterop\PhpSolid\Routes;
32

4-
use Pdsinterop\PhpSolid\User;
5-
use Pdsinterop\PhpSolid\StorageServer;
6-
use Pdsinterop\PhpSolid\ClientRegistration;
7-
use Pdsinterop\PhpSolid\SolidNotifications;
8-
use Pdsinterop\PhpSolid\Util;
9-
use Pdsinterop\Solid\Auth\WAC;
10-
use Pdsinterop\Solid\Resources\Server as ResourceServer;
11-
use Laminas\Diactoros\ServerRequestFactory;
12-
use Laminas\Diactoros\Response;
3+
namespace Pdsinterop\PhpSolid\Routes;
134

14-
class SolidStorage {
15-
public static function respondToStorage() {
16-
$requestFactory = new ServerRequestFactory();
17-
$rawRequest = $requestFactory->fromGlobals($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);
5+
use Laminas\Diactoros\ServerRequestFactory;
6+
use Pdsinterop\PhpSolid\SolidStorageHandler;
7+
use Pdsinterop\PhpSolid\StorageServer;
188

19-
try {
20-
StorageServer::initializeStorage();
21-
$filesystem = StorageServer::getFileSystem();
22-
} catch (\Exception $e) {
23-
$response = new Response();
24-
$response = $response->withStatus(404, "Not found");
25-
StorageServer::respond($response);
26-
exit();
27-
}
9+
class SolidStorage
10+
{
11+
public static function respondToStorage()
12+
{
13+
$requestFactory = new ServerRequestFactory();
14+
$rawRequest = $requestFactory->fromGlobals($_SERVER, $_GET, $_POST, $_COOKIE, $_FILES);
2815

29-
$resourceServer = new ResourceServer($filesystem, new Response(), null);
30-
$solidNotifications = new SolidNotifications();
31-
$resourceServer->setNotifications($solidNotifications);
16+
$handler = new SolidStorageHandler();
17+
$response = $handler->handle($rawRequest);
3218

33-
$wac = new WAC($filesystem);
34-
35-
$baseUrl = Util::getServerBaseUrl();
36-
$resourceServer->setBaseUrl($baseUrl);
37-
$wac->setBaseUrl($baseUrl);
38-
39-
try {
40-
$webId = StorageServer::getWebId($rawRequest);
41-
} catch(\Exception $e) {
42-
$response = $resourceServer->getResponse()
43-
-> withStatus(400, "Bad request");
44-
StorageServer::respond($response);
45-
exit();
46-
}
47-
48-
if (!isset($webId)) {
49-
$response = $resourceServer->getResponse()
50-
->withStatus(409, "Invalid token");
51-
StorageServer::respond($response);
52-
exit();
53-
}
54-
55-
$origin = $rawRequest->getHeaderLine("Origin");
56-
57-
// FIXME: Read allowed clients from the profile instead;
58-
59-
$ownerWebId = StorageServer::getOwnerWebId();
60-
$owner = User::getUserByWebId($ownerWebId);
61-
62-
$allowedClients = $owner['allowedClients'] ?? [];
63-
$allowedOrigins = array_merge(
64-
($owner['allowedOrigins'] ?? []),
65-
(TRUSTED_APPS ?? [])
66-
);
67-
$allowedOrigins = array_unique($allowedOrigins);
68-
69-
if (!isset($origin) || ($origin === "")) {
70-
$allowedOrigins[] = "app://unset"; // FIXME: this should not be here.
71-
$origin = "app://unset";
72-
}
73-
74-
if (!$wac->isAllowed($rawRequest, $webId, $origin, $allowedOrigins)) {
75-
$response = new Response();
76-
$response = $response->withStatus(403, "Access denied!");
77-
StorageServer::respond($response);
78-
exit();
79-
}
80-
81-
$response = $resourceServer->respondToRequest($rawRequest);
82-
$response = $wac->addWACHeaders($rawRequest, $response, $webId);
83-
StorageServer::respond($response);
84-
}
19+
StorageServer::respond($response);
8520
}
86-
21+
}

lib/SolidStorageHandler.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace Pdsinterop\PhpSolid;
4+
5+
use Laminas\Diactoros\Response;
6+
use Pdsinterop\Solid\Auth\WAC;
7+
use Pdsinterop\Solid\Resources\Server as ResourceServer;
8+
use Psr\Http\Message\ResponseInterface;
9+
use Psr\Http\Message\ServerRequestInterface;
10+
11+
class SolidStorageHandler
12+
{
13+
public function handle(ServerRequestInterface $rawRequest): ResponseInterface
14+
{
15+
try {
16+
StorageServer::initializeStorage();
17+
$filesystem = StorageServer::getFileSystem();
18+
} catch (\Exception $e) {
19+
return (new Response())->withStatus(404, "Not found");
20+
}
21+
22+
$resourceServer = new ResourceServer($filesystem, new Response(), null);
23+
24+
$solidNotifications = new SolidNotifications();
25+
$resourceServer->setNotifications($solidNotifications);
26+
27+
$wac = new WAC($filesystem);
28+
29+
$baseUrl = Util::getServerBaseUrl();
30+
$resourceServer->setBaseUrl($baseUrl);
31+
$wac->setBaseUrl($baseUrl);
32+
33+
try {
34+
$webId = StorageServer::getWebId($rawRequest);
35+
} catch (\Exception $e) {
36+
return $resourceServer->getResponse()
37+
->withStatus(400, "Bad request");
38+
}
39+
40+
if (!isset($webId)) {
41+
return $resourceServer->getResponse()
42+
->withStatus(409, "Invalid token");
43+
}
44+
45+
$origin = $rawRequest->getHeaderLine("Origin");
46+
47+
// FIXME: Read allowed clients from the profile instead;
48+
$ownerWebId = StorageServer::getOwnerWebId();
49+
$owner = User::getUserByWebId($ownerWebId);
50+
$allowedClients = $owner['allowedClients'] ?? [];
51+
52+
$allowedOrigins = array_merge(
53+
($owner['allowedOrigins'] ?? []),
54+
(TRUSTED_APPS ?? [])
55+
);
56+
$allowedOrigins = array_unique($allowedOrigins);
57+
58+
if (!isset($origin) || ($origin === "")) {
59+
$allowedOrigins[] = "app://unset"; // FIXME: this should not be here.
60+
$origin = "app://unset";
61+
}
62+
63+
if (!$wac->isAllowed($rawRequest, $webId, $origin, $allowedOrigins)) {
64+
return (new Response())->withStatus(403, "Access denied!");
65+
}
66+
67+
$response = $resourceServer->respondToRequest($rawRequest);
68+
69+
return $wac->addWACHeaders($rawRequest, $response, $webId);
70+
}
71+
}

0 commit comments

Comments
 (0)