4141use OCP \Share \IManager ;
4242use OCP \Share \IShare ;
4343use OCP \Util ;
44+ use Psr \Log \LoggerInterface ;
4445
4546class TokenManager {
4647 /** @var IRootFolder */
@@ -63,6 +64,8 @@ class TokenManager {
6364 private $ helper ;
6465 /** @var PermissionManager */
6566 private $ permissionManager ;
67+ /** @var LoggerInterface */
68+ private $ logger ;
6669
6770 public function __construct (
6871 IRootFolder $ rootFolder ,
@@ -74,7 +77,8 @@ public function __construct(
7477 WopiMapper $ wopiMapper ,
7578 IL10N $ trans ,
7679 Helper $ helper ,
77- PermissionManager $ permissionManager
80+ PermissionManager $ permissionManager ,
81+ LoggerInterface $ logger
7882 ) {
7983 $ this ->rootFolder = $ rootFolder ;
8084 $ this ->shareManager = $ shareManager ;
@@ -86,6 +90,7 @@ public function __construct(
8690 $ this ->wopiMapper = $ wopiMapper ;
8791 $ this ->helper = $ helper ;
8892 $ this ->permissionManager = $ permissionManager ;
93+ $ this ->logger = $ logger ;
8994 }
9095
9196 /**
@@ -151,7 +156,7 @@ public function generateWopiToken(string $fileId, ?string $shareToken = null, ?s
151156 // no active user login while generating the token
152157 // this is required during WopiPutRelativeFile
153158 if (is_null ($ editoruid )) {
154- \ OC :: $ server -> getLogger () ->warning ('Generating token for SaveAs without editoruid ' );
159+ $ this -> logger ->warning ('Generating token for SaveAs without editoruid ' );
155160 $ updatable = true ;
156161 } else {
157162 // Make sure we use the user folder if available since fetching all files by id from the root might be expensive
@@ -237,12 +242,18 @@ public function upgradeFromDirectInitiator(Direct $direct, Wopi $wopi) {
237242 return $ wopi ;
238243 }
239244
240- public function generateWopiTokenForTemplate (File $ templateFile , ?string $ userId , int $ targetFileId , bool $ direct = false ): Wopi {
241- $ owneruid = $ userId ;
242- $ editoruid = $ userId ;
243- $ rootFolder = $ this ->rootFolder ->getUserFolder ($ editoruid );
244- $ targetFile = $ rootFolder ->getById ($ targetFileId );
245- $ targetFile = array_shift ($ targetFile );
245+ public function generateWopiTokenForTemplate (
246+ File $ templateFile ,
247+ int $ targetFileId ,
248+ string $ owneruid ,
249+ bool $ isGuest ,
250+ bool $ direct = false ,
251+ ?int $ sharePermissions = null ,
252+ ): Wopi {
253+ $ editoruid = $ isGuest ? null : $ owneruid ;
254+
255+ $ rootFolder = $ this ->rootFolder ->getUserFolder ($ owneruid );
256+ $ targetFile = $ rootFolder ->getById ($ targetFileId )[0 ];
246257 if (!$ targetFile instanceof File) {
247258 throw new NotFoundException ();
248259 }
@@ -252,16 +263,43 @@ public function generateWopiTokenForTemplate(File $templateFile, ?string $userId
252263 throw new NotPermittedException ();
253264 }
254265
255- $ updatable = $ targetFile ->isUpdateable () && $ this ->permissionManager ->userCanEdit ($ editoruid );
266+ $ updatable = $ targetFile ->isUpdateable ();
267+ if (!is_null ($ sharePermissions )) {
268+ $ shareUpdatable = (bool )($ sharePermissions & \OCP \Constants::PERMISSION_UPDATE );
269+ $ updatable = $ updatable && $ shareUpdatable ;
270+ }
256271
257272 $ serverHost = $ this ->urlGenerator ->getAbsoluteURL ('/ ' );
258273
259274 if ($ this ->capabilitiesService ->hasTemplateSource ()) {
260- return $ this ->wopiMapper ->generateFileToken ($ targetFile ->getId (), $ owneruid , $ editoruid , 0 , $ updatable , $ serverHost , null , 0 , false , $ direct , $ templateFile ->getId ());
275+ return $ this ->wopiMapper ->generateFileToken (
276+ $ targetFile ->getId (),
277+ $ owneruid ,
278+ $ editoruid ,
279+ 0 ,
280+ $ updatable ,
281+ $ serverHost ,
282+ $ isGuest ? '' : null ,
283+ 0 ,
284+ false ,
285+ $ direct ,
286+ $ templateFile ->getId ()
287+ );
261288 }
262289
263290 // Legacy way of creating new documents from a template
264- return $ this ->wopiMapper ->generateFileToken ($ templateFile ->getId (), $ owneruid , $ editoruid , 0 , $ updatable , $ serverHost , null , $ targetFile ->getId (), $ direct );
291+ return $ this ->wopiMapper ->generateFileToken (
292+ $ templateFile ->getId (),
293+ $ owneruid ,
294+ $ editoruid ,
295+ 0 ,
296+ $ updatable ,
297+ $ serverHost ,
298+ $ isGuest ? '' : null ,
299+ $ targetFile ->getId (),
300+ false ,
301+ $ direct
302+ );
265303 }
266304
267305 public function newInitiatorToken ($ sourceServer , Node $ node = null , $ shareToken = null , bool $ direct = false , $ userId = null ): Wopi {
0 commit comments