1111use OCA \Files_Trashbin \Helper ;
1212use OCA \Files_Trashbin \Storage ;
1313use OCA \Files_Trashbin \Trashbin ;
14+ use OCP \Federation \ICloudIdManager ;
1415use OCP \Files \FileInfo ;
1516use OCP \Files \Folder ;
1617use OCP \Files \IRootFolder ;
@@ -26,6 +27,7 @@ class LegacyTrashBackend implements ITrashBackend {
2627 public function __construct (
2728 private IRootFolder $ rootFolder ,
2829 private IUserManager $ userManager ,
30+ private ICloudIdManager $ cloudIdManager ,
2931 ) {
3032 }
3133
@@ -38,7 +40,7 @@ private function mapTrashItem(FileInfo $file, IUser $user, ?ITrashItem $parent =
3840 $ originalLocation = $ file ->getName ();
3941 }
4042 /** @psalm-suppress UndefinedInterfaceMethod */
41- $ deletedBy = $ this ->userManager -> get ($ file ['deletedBy ' ]) ?? $ parent ?->getDeletedBy();
43+ $ deletedBy = $ this ->resolveDeletedBy ($ file ['deletedBy ' ]) ?? $ parent ?->getDeletedBy();
4244 $ trashFilename = Trashbin::getTrashFilename ($ file ->getName (), $ file ->getMtime ());
4345 return new TrashItem (
4446 $ this ,
@@ -125,4 +127,29 @@ public function getTrashNodeById(IUser $user, int $fileId) {
125127 return null ;
126128 }
127129 }
130+
131+ /**
132+ * Resolve the user that deleted a trash item. Files deleted by a federated share
133+ * recipient only carry the recipient's remote cloud ID, which no local IUserManager
134+ * backend can resolve, so fall back to a display-only user for the cloud ID in that
135+ * case instead of leaving the item without an "Unknown" deleted by user.
136+ */
137+ private function resolveDeletedBy (?string $ uid ): ?IUser {
138+ if (!$ uid ) {
139+ return null ;
140+ }
141+
142+ $ user = $ this ->userManager ->get ($ uid );
143+ if ($ user !== null ) {
144+ return $ user ;
145+ }
146+
147+ try {
148+ $ cloudId = $ this ->cloudIdManager ->resolveCloudId ($ uid );
149+ } catch (\InvalidArgumentException $ e ) {
150+ return null ;
151+ }
152+
153+ return $ this ->userManager ->getFederatedUser ($ cloudId );
154+ }
128155}
0 commit comments