Skip to content

Commit 218298c

Browse files
benjaminfruehbackportbot[bot]
authored andcommitted
fix: always validate share token if provided
fix: always validate share token if provided Signed-off-by: Benjamin Frueh <benjamin.frueh@gmail.com> [skip ci]
1 parent df77302 commit 218298c

1 file changed

Lines changed: 54 additions & 5 deletions

File tree

tests/unit/Middleware/SessionMiddlewareTest.php

Lines changed: 54 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,16 @@
77
use OCA\Text\Middleware\SessionMiddleware;
88
use OCA\Text\Service\DocumentService;
99
use OCA\Text\Service\SessionService;
10+
use OCP\Constants;
11+
use OCP\Files\File;
1012
use OCP\Files\Folder;
1113
use OCP\Files\IRootFolder;
1214
use OCP\IL10N;
1315
use OCP\IRequest;
1416
use OCP\ISession;
17+
use OCP\IUser;
1518
use OCP\IUserSession;
19+
use OCP\Share\Exceptions\ShareNotFound;
1620
use OCP\Share\IManager;
1721
use OCP\Share\IShare;
1822
use Test\TestCase;
@@ -89,29 +93,74 @@ public function testWrongArrayBlocked(): void {
8993
$this->invokeMiddleware($share);
9094
}
9195

96+
public function testLoggedInUserWithInvalidToken(): void {
97+
$this->expectException(InvalidSessionException::class);
98+
99+
$user = $this->createMock(IUser::class);
100+
$user->method('getUID')->willReturn('user1');
101+
102+
$share = $this->createPasswordProtectedShare('42');
103+
$this->shareManager->method('getShareByToken')->willThrowException(new ShareNotFound());
104+
105+
$this->invokeMiddleware($share, $user);
106+
}
107+
108+
public function testLoggedInUserWithValidToken(): void {
109+
$user = $this->createMock(IUser::class);
110+
$user->method('getUID')->willReturn('user1');
111+
112+
$share = $this->createMock(IShare::class);
113+
$share->method('getId')->willReturn('user2-share');
114+
$share->method('getPassword')->willReturn(null);
115+
$share->method('getPermissions')->willReturn(Constants::PERMISSION_READ);
116+
$share->method('getShareOwner')->willReturn('user2');
117+
$share->method('getAttributes')->willReturn(null);
118+
119+
$this->shareManager->method('getShareByToken')->willReturn($share);
120+
121+
$controller = $this->createMock(ISessionAwareController::class);
122+
$controller->expects($this->never())->method('setUserId');
123+
$controller->expects($this->once())->method('setDocumentId');
124+
125+
$this->invokeMiddleware($share, $user, $controller);
126+
}
127+
128+
public function testLoggedInUserWithValidTokenUnauthenticated(): void {
129+
$this->expectException(InvalidSessionException::class);
130+
131+
$user = $this->createMock(IUser::class);
132+
$user->method('getUID')->willReturn('user1');
133+
134+
$share = $this->createPasswordProtectedShare('user2-share');
135+
$this->session->method('get')->with('public_link_authenticated')->willReturn(null);
136+
$this->shareManager->method('getShareByToken')->willReturn($share);
137+
138+
$this->invokeMiddleware($share, $user);
139+
}
140+
92141
private function createPasswordProtectedShare(string $id): IShare {
93142
$share = $this->createMock(IShare::class);
94143
$share->method('getId')->willReturn($id);
95144
$share->method('getPassword')->willReturn('password');
96-
$share->method('getPermissions')->willReturn(\OCP\Constants::PERMISSION_READ);
145+
$share->method('getPermissions')->willReturn(Constants::PERMISSION_READ);
97146
$share->method('getShareOwner')->willReturn('owner');
98147
$share->method('getAttributes')->willReturn(null);
99148
return $share;
100149
}
101150

102-
private function invokeMiddleware(IShare $share): void {
151+
private function invokeMiddleware(IShare $share, ?IUser $user = null, ?ISessionAwareController $controller = null): void {
103152
$this->request->method('getParam')->willReturnMap([
104153
['documentId', null, 999],
105154
['shareToken', null, 'token'],
106155
]);
107-
$this->userSession->method('getUser')->willReturn(null);
156+
$this->userSession->method('getUser')->willReturn($user);
108157
$this->shareManager->method('getShareByToken')->willReturn($share);
109158

110159
$folder = $this->createMock(Folder::class);
111-
$folder->method('getFirstNodeById')->willReturn($this->createMock(\OCP\Files\File::class));
160+
$folder->method('getFirstNodeById')->willReturn($this->createMock(File::class));
112161
$this->rootFolder->method('getUserFolder')->willReturn($folder);
113162

114-
$controller = $this->createMock(ISessionAwareController::class);
163+
$controller ??= $this->createMock(ISessionAwareController::class);
115164
self::invokePrivate($this->middleware, 'assertUserOrShareToken', [$controller]);
116165
}
117166
}

0 commit comments

Comments
 (0)