From 655c9ea7a173add232c737d1a648ad697c19f297 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Tue, 3 Feb 2015 16:06:56 -0500 Subject: enforce user access to offline items --- .../Sync/SyncManager.cs | 47 ++++++++++++++++++++++ .../Sync/SyncRepository.cs | 6 +-- 2 files changed, 50 insertions(+), 3 deletions(-) (limited to 'MediaBrowser.Server.Implementations/Sync') diff --git a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs index 6a4bc9cc4..749730f82 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncManager.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncManager.cs @@ -314,6 +314,10 @@ namespace MediaBrowser.Server.Implementations.Sync try { _fileSystem.DeleteDirectory(path, true); + } + catch (DirectoryNotFoundException) + { + } catch (Exception ex) { @@ -664,9 +668,48 @@ namespace MediaBrowser.Server.Implementations.Sync response.ItemIdsToRemove = response.ItemIdsToRemove.Distinct(StringComparer.OrdinalIgnoreCase).ToList(); + var itemsOnDevice = request.LocalItemIds + .Except(response.ItemIdsToRemove) + .ToList(); + + SetUserAccess(request, response, itemsOnDevice); + return response; } + private void SetUserAccess(SyncDataRequest request, SyncDataResponse response, List itemIds) + { + var users = request.OfflineUserIds + .Select(_userManager.GetUserById) + .Where(i => i != null) + .ToList(); + + foreach (var itemId in itemIds) + { + var item = _libraryManager.GetItemById(itemId); + + if (item != null) + { + var usersWithAccess = new List(); + + foreach (var user in users) + { + if (IsUserVisible(item, user)) + { + usersWithAccess.Add(user); + } + } + + response.ItemUserAccess[itemId] = users.Select(i => i.Id.ToString("N")).ToList(); + } + } + } + + private bool IsUserVisible(BaseItem item, User user) + { + return item.IsVisibleStandalone(user); + } + private bool IsLibraryItemAvailable(BaseItem item) { if (item == null) @@ -723,6 +766,10 @@ namespace MediaBrowser.Server.Implementations.Sync try { _fileSystem.DeleteDirectory(path, true); + } + catch (DirectoryNotFoundException) + { + } catch (Exception ex) { diff --git a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs index a101f13eb..85317cb23 100644 --- a/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs +++ b/MediaBrowser.Server.Implementations/Sync/SyncRepository.cs @@ -407,7 +407,6 @@ namespace MediaBrowser.Server.Implementations.Sync if (!string.IsNullOrWhiteSpace(query.TargetId)) { whereClauses.Add("TargetId=@TargetId"); - cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId; } if (!string.IsNullOrWhiteSpace(query.UserId)) { @@ -422,7 +421,7 @@ namespace MediaBrowser.Server.Implementations.Sync var startIndex = query.StartIndex ?? 0; if (startIndex > 0) { - whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY DateLastModified DESC LIMIT {0})", + whereClauses.Add(string.Format("Id NOT IN (SELECT Id FROM SyncJobs ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC LIMIT {0})", startIndex.ToString(_usCulture))); } @@ -431,7 +430,8 @@ namespace MediaBrowser.Server.Implementations.Sync cmd.CommandText += " where " + string.Join(" AND ", whereClauses.ToArray()); } - cmd.CommandText += " ORDER BY DateLastModified DESC"; + cmd.CommandText += " ORDER BY (Select Max(DateLastModified) from SyncJobs where TargetId=@TargetId) DESC, DateLastModified DESC"; + cmd.Parameters.Add(cmd, "@TargetId", DbType.String).Value = query.TargetId; if (query.Limit.HasValue) { -- cgit v1.2.3