24
24
use OCP \AppFramework \Http \Attribute \PublicPage ;
25
25
use OCP \AppFramework \Http \DataResponse ;
26
26
use OCP \IRequest ;
27
+ use Psr \Log \LoggerInterface ;
27
28
28
29
/**
29
30
* @psalm-suppress UndefinedClass
@@ -39,6 +40,7 @@ public function __construct(
39
40
private WhiteboardContentService $ contentService ,
40
41
private ExceptionService $ exceptionService ,
41
42
private ConfigService $ configService ,
43
+ private LoggerInterface $ logger ,
42
44
) {
43
45
parent ::__construct ($ appName , $ request );
44
46
}
@@ -48,15 +50,60 @@ public function __construct(
48
50
#[PublicPage]
49
51
public function show (int $ fileId ): DataResponse {
50
52
try {
51
- $ jwt = $ this ->getJwtFromRequest ();
53
+ $ this ->logger ->info ('WhiteboardController::show - Request for fileId: ' . $ fileId , [
54
+ 'file_id ' => $ fileId ,
55
+ 'request_params ' => $ this ->request ->getParams ()
56
+ ]);
52
57
53
- $ userId = $ this ->jwtService -> getUserIdFromJWT ( $ jwt );
58
+ $ jwt = $ this ->getJwtFromRequest ( );
54
59
55
- $ user = $ this ->getUserFromIdServiceFactory -> create ( $ userId )-> getUser ( );
60
+ $ this ->logger -> warning ( ' JWT token retrieved, attempting to extract user ID ' );
56
61
57
- $ file = $ this ->getFileServiceFactory -> create ( $ user , $ fileId )-> getFile ( );
62
+ $ userId = $ this ->jwtService -> getUserIdFromJWT ( $ jwt );
58
63
59
- $ data = $ this ->contentService ->getContent ($ file );
64
+ $ this ->logger ->warning ('User ID extracted from JWT: ' . $ userId );
65
+
66
+ try {
67
+ $ user = $ this ->getUserFromIdServiceFactory ->create ($ userId )->getUser ();
68
+ } catch (Exception $ e ) {
69
+ $ this ->logger ->error ('Failed to create user object for: ' . $ userId , [
70
+ 'error ' => $ e ->getMessage ()
71
+ ]);
72
+ throw $ e ;
73
+ }
74
+
75
+ $ this ->logger ->warning ('User object created for: ' . $ userId );
76
+
77
+ try {
78
+ $ file = $ this ->getFileServiceFactory ->create ($ user , $ fileId )->getFile ();
79
+ } catch (Exception $ e ) {
80
+ $ this ->logger ->error ('Failed to retrieve file for fileId: ' . $ fileId , [
81
+ 'error ' => $ e ->getMessage ()
82
+ ]);
83
+ throw $ e ;
84
+ }
85
+
86
+ $ this ->logger ->warning ('File retrieved for fileId: ' . $ fileId );
87
+
88
+ try {
89
+ $ data = $ this ->contentService ->getContent ($ file );
90
+ } catch (Exception $ e ) {
91
+ $ this ->logger ->error ('Failed to retrieve content for file ' , [
92
+ 'file_id ' => $ fileId ,
93
+ 'error ' => $ e ->getMessage ()
94
+ ]);
95
+ throw $ e ;
96
+ }
97
+
98
+ $ this ->logger ->warning ('Content retrieved for file ' , [
99
+ 'file_id ' => $ fileId ,
100
+ 'data_size ' => is_array ($ data ) ? count ($ data ) : 'not array '
101
+ ]);
102
+
103
+ $ this ->logger ->warning ('Content retrieved for file ' , [
104
+ 'file_id ' => $ fileId ,
105
+ 'data_size ' => is_array ($ data ) ? count ($ data ) : 'not array '
106
+ ]);
60
107
61
108
return new DataResponse (['data ' => $ data ]);
62
109
} catch (Exception $ e ) {
@@ -69,15 +116,55 @@ public function show(int $fileId): DataResponse {
69
116
#[PublicPage]
70
117
public function update (int $ fileId , array $ data ): DataResponse {
71
118
try {
72
- $ this ->validateBackendSharedToken ($ fileId );
119
+ $ this ->logger ->info ('WhiteboardController::update - Request for fileId: ' . $ fileId , [
120
+ 'file_id ' => $ fileId ,
121
+ 'request_params ' => $ this ->request ->getParams ()
122
+ ]);
73
123
74
- $ userId = $ this ->getUserIdFromRequest ( );
124
+ $ this ->validateBackendSharedToken ( $ fileId );
75
125
76
- $ user = $ this ->getUserFromIdServiceFactory -> create ( $ userId )-> getUser ( );
126
+ $ this ->logger -> warning ( ' Backend shared token validated for fileId: ' . $ fileId );
77
127
78
- $ file = $ this ->getFileServiceFactory -> create ( $ user , $ fileId )-> getFile ();
128
+ $ userId = $ this ->getUserIdFromRequest ();
79
129
80
- $ this ->contentService ->updateContent ($ file , $ data );
130
+ $ this ->logger ->warning ('User ID extracted from request: ' . $ userId );
131
+
132
+ try {
133
+ $ user = $ this ->getUserFromIdServiceFactory ->create ($ userId )->getUser ();
134
+ } catch (Exception $ e ) {
135
+ $ this ->logger ->error ('Failed to create user object for: ' . $ userId , [
136
+ 'error ' => $ e ->getMessage ()
137
+ ]);
138
+ throw $ e ;
139
+ }
140
+
141
+ $ this ->logger ->warning ('User object created for: ' . $ userId );
142
+
143
+ try {
144
+ $ file = $ this ->getFileServiceFactory ->create ($ user , $ fileId )->getFile ();
145
+ } catch (Exception $ e ) {
146
+ $ this ->logger ->error ('Failed to retrieve file for fileId: ' . $ fileId , [
147
+ 'error ' => $ e ->getMessage ()
148
+ ]);
149
+ throw $ e ;
150
+ }
151
+
152
+ $ this ->logger ->warning ('File retrieved for fileId: ' . $ fileId );
153
+
154
+ try {
155
+ $ this ->contentService ->updateContent ($ file , $ data );
156
+ } catch (Exception $ e ) {
157
+ $ this ->logger ->error ('Failed to update content for file ' , [
158
+ 'file_id ' => $ fileId ,
159
+ 'error ' => $ e ->getMessage ()
160
+ ]);
161
+ throw $ e ;
162
+ }
163
+
164
+ $ this ->logger ->warning ('Content updated for file ' , [
165
+ 'file_id ' => $ fileId ,
166
+ 'data_size ' => count ($ data )
167
+ ]);
81
168
82
169
return new DataResponse (['status ' => 'success ' ]);
83
170
} catch (Exception $ e ) {
@@ -88,6 +175,7 @@ public function update(int $fileId, array $data): DataResponse {
88
175
private function getJwtFromRequest (): string {
89
176
$ authHeader = $ this ->request ->getHeader ('Authorization ' );
90
177
if (sscanf ($ authHeader , 'Bearer %s ' , $ jwt ) !== 1 ) {
178
+ $ this ->logger ->error ('Invalid JWT format in Authorization header ' );
91
179
throw new UnauthorizedException ();
92
180
}
93
181
return (string )$ jwt ;
@@ -100,21 +188,38 @@ private function getUserIdFromRequest(): string {
100
188
private function validateBackendSharedToken (int $ fileId ): void {
101
189
$ backendSharedToken = $ this ->request ->getHeader ('X-Whiteboard-Auth ' );
102
190
if (!$ backendSharedToken || !$ this ->verifySharedToken ($ backendSharedToken , $ fileId )) {
191
+ $ this ->logger ->error ('Invalid backend shared token ' , [
192
+ 'file_id ' => $ fileId ,
193
+ 'token_present ' => !empty ($ backendSharedToken ),
194
+ 'token_length ' => strlen ((string )$ backendSharedToken )
195
+ ]);
196
+
103
197
throw new InvalidUserException ('Invalid backend shared token ' );
104
198
}
199
+
200
+ $ this ->logger ->warning ('Backend shared token validated successfully for fileId: ' . $ fileId );
105
201
}
106
202
107
203
private function verifySharedToken (string $ token , int $ fileId ): bool {
108
204
[$ roomId , $ timestamp , $ signature ] = explode (': ' , $ token );
109
205
110
206
if ($ roomId !== (string )$ fileId ) {
111
207
return false ;
208
+ } else {
209
+ $ this ->logger ->warning ('Room ID matches file ID: ' . $ fileId );
112
210
}
113
211
114
212
$ sharedSecret = $ this ->configService ->getWhiteboardSharedSecret ();
213
+
214
+ $ this ->logger ->warning ('Shared secret retrieved, length: ' . strlen ($ sharedSecret ));
215
+
115
216
$ payload = "$ roomId: $ timestamp " ;
116
217
$ expectedSignature = hash_hmac ('sha256 ' , $ payload , $ sharedSecret );
117
218
219
+ $ this ->logger ->warning ('Token validation ' , [
220
+ 'token_valid ' => hash_equals ($ expectedSignature , $ signature )
221
+ ]);
222
+
118
223
return hash_equals ($ expectedSignature , $ signature );
119
224
}
120
225
}
0 commit comments