private IEnumerable <AccessControlCacheEntry> Caches(SecurityToken[] securityTokens) { List <AccessControl> misses = null; var caches = this.session.GetCache <AccessControlCacheEntry>(); foreach (var accessControl in securityTokens.SelectMany(v => v.AccessControls).Distinct()) { caches.TryGetValue(accessControl.Id, out var cache); if (cache == null || !accessControl.CacheId.Equals(cache.CacheId)) { if (misses == null) { misses = new List <AccessControl>(); } misses.Add(accessControl); } else { if (cache.EffectiveUserIds.Contains(this.User.Id)) { yield return(cache); } } } if (misses != null) { if (misses.Count > 1) { this.session.Prefetch(PrefetchPolicy, misses); } foreach (var accessControl in misses) { var cache = new AccessControlCacheEntry(accessControl); caches[accessControl.Id] = cache; if (cache.EffectiveUserIds.Contains(this.User.Id)) { yield return(cache); } } } }
private Dictionary <AccessControl, HashSet <long> > EffectivePermissionsByAccessControl() { var session = this.User.Session(); var effectivePermissionsByAccessControl = new Dictionary <AccessControl, HashSet <long> >(); var caches = session.GetCache <AccessControlCacheEntry>(); List <AccessControl> misses = null; foreach (AccessControl accessControl in this.User.AccessControlsWhereEffectiveUser) { caches.TryGetValue(accessControl.Id, out var cache); if (cache == null || !accessControl.CacheId.Equals(cache.CacheId)) { if (misses == null) { misses = new List <AccessControl>(); } misses.Add(accessControl); } else { effectivePermissionsByAccessControl.Add(accessControl, cache.EffectivePermissionIds); } } if (misses != null) { if (misses.Count > 1) { session.Prefetch(PrefetchPolicy, misses); } foreach (var accessControl in misses) { var cache = new AccessControlCacheEntry(accessControl); caches[accessControl.Id] = cache; effectivePermissionsByAccessControl.Add(accessControl, cache.EffectivePermissionIds); } } return(effectivePermissionsByAccessControl); }