@@ -192,6 +192,10 @@ protected function formatShare(IShare $share, Node $recipientNode = null): array
192192 $ result ['expiration ' ] = $ expiration ->format ('Y-m-d 00:00:00 ' );
193193 }
194194
195+ $ currentUserPermissions = $ recipientNode ?->getPermissions() ?? Constants::PERMISSION_ALL ;
196+ $ userHasEnoughPermissions = ($ currentUserPermissions & $ share ->getPermissions ()) === $ share ->getPermissions ();
197+ $ token = $ userHasEnoughPermissions ? $ share ->getToken () : null ;
198+
195199 if ($ share ->getShareType () === IShare::TYPE_USER ) {
196200 $ sharedWith = $ this ->userManager ->get ($ share ->getSharedWith ());
197201 $ result ['share_with ' ] = $ share ->getSharedWith ();
@@ -218,6 +222,7 @@ protected function formatShare(IShare $share, Node $recipientNode = null): array
218222 $ result ['share_with ' ] = $ share ->getSharedWith ();
219223 $ result ['share_with_displayname ' ] = $ group !== null ? $ group ->getDisplayName () : $ share ->getSharedWith ();
220224 } elseif ($ share ->getShareType () === IShare::TYPE_LINK ) {
225+ $ url = ($ token !== null ) ? $ this ->urlGenerator ->linkToRouteAbsolute ('files_sharing.sharecontroller.showShare ' , ['token ' => $ token ]) : null ;
221226
222227 // "share_with" and "share_with_displayname" for passwords of link
223228 // shares was deprecated in Nextcloud 15, use "password" instead.
@@ -228,23 +233,23 @@ protected function formatShare(IShare $share, Node $recipientNode = null): array
228233
229234 $ result ['send_password_by_talk ' ] = $ share ->getSendPasswordByTalk ();
230235
231- $ result ['token ' ] = $ share -> getToken () ;
232- $ result ['url ' ] = $ this -> urlGenerator -> linkToRouteAbsolute ( ' files_sharing.sharecontroller.showShare ' , [ ' token ' => $ share -> getToken ()]) ;
236+ $ result ['token ' ] = $ token ;
237+ $ result ['url ' ] = $ url ;
233238 } elseif ($ share ->getShareType () === IShare::TYPE_REMOTE ) {
234239 $ result ['share_with ' ] = $ share ->getSharedWith ();
235240 $ result ['share_with_displayname ' ] = $ this ->getCachedFederatedDisplayName ($ share ->getSharedWith ());
236- $ result ['token ' ] = $ share -> getToken () ;
241+ $ result ['token ' ] = $ token ;
237242 } elseif ($ share ->getShareType () === IShare::TYPE_REMOTE_GROUP ) {
238243 $ result ['share_with ' ] = $ share ->getSharedWith ();
239244 $ result ['share_with_displayname ' ] = $ this ->getDisplayNameFromAddressBook ($ share ->getSharedWith (), 'CLOUD ' );
240- $ result ['token ' ] = $ share -> getToken () ;
245+ $ result ['token ' ] = $ token ;
241246 } elseif ($ share ->getShareType () === IShare::TYPE_EMAIL ) {
242247 $ result ['share_with ' ] = $ share ->getSharedWith ();
243248 $ result ['password ' ] = $ share ->getPassword ();
244249 $ result ['password_expiration_time ' ] = $ share ->getPasswordExpirationTime () !== null ? $ share ->getPasswordExpirationTime ()->format (\DateTime::ATOM ) : null ;
245250 $ result ['send_password_by_talk ' ] = $ share ->getSendPasswordByTalk ();
246251 $ result ['share_with_displayname ' ] = $ this ->getDisplayNameFromAddressBook ($ share ->getSharedWith (), 'EMAIL ' );
247- $ result ['token ' ] = $ share -> getToken () ;
252+ $ result ['token ' ] = $ token ;
248253 } elseif ($ share ->getShareType () === IShare::TYPE_CIRCLE ) {
249254 // getSharedWith() returns either "name (type, owner)" or
250255 // "name (type, owner) [id]", depending on the Circles app version.
0 commit comments