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 ,
@@ -119,4 +121,29 @@ public function getTrashNodeById(IUser $user, int $fileId) {
119121 return null ;
120122 }
121123 }
124+
125+ /**
126+ * Resolve the user that deleted a trash item. Files deleted by a federated share
127+ * recipient only carry the recipient's remote cloud ID, which no local IUserManager
128+ * backend can resolve, so fall back to a display-only user for the cloud ID in that
129+ * case instead of leaving the item without an "Unknown" deleted by user.
130+ */
131+ private function resolveDeletedBy (?string $ uid ): ?IUser {
132+ if (!$ uid ) {
133+ return null ;
134+ }
135+
136+ $ user = $ this ->userManager ->get ($ uid );
137+ if ($ user !== null ) {
138+ return $ user ;
139+ }
140+
141+ try {
142+ $ cloudId = $ this ->cloudIdManager ->resolveCloudId ($ uid );
143+ } catch (\InvalidArgumentException $ e ) {
144+ return null ;
145+ }
146+
147+ return $ this ->userManager ->getFederatedUser ($ cloudId );
148+ }
122149}
0 commit comments