private static void DoLogoffCleanup(RequestContext requestContext) { ExTraceGlobals.CoreCallTracer.TraceDebug(0L, "[RequestDispatcher::DoLogoff] entry."); HttpContext httpContext = requestContext.HttpContext; UserContext userContext = requestContext.UserContext as UserContext; UserContextKey key = userContext.Key; try { ExTraceGlobals.UserContextTracer.TraceDebug <UserContext>(0L, "[RequestDispatcher::DoLogoffCleanup] Found user context in the cache, User context instance={0}.", userContext); userContext.State = UserContextState.MarkedForLogoff; userContext.LogBreadcrumb("MarkedForLogoff"); userContext.DoLogoffCleanup(); userContext.LogBreadcrumb("DoLogoffCleanup completed"); } finally { UserContextCookie userContextCookie = UserContextCookie.GetUserContextCookie(requestContext.HttpContext); if (userContextCookie != null) { HttpUtilities.DeleteCookie(httpContext.Response, userContextCookie.CookieName); } HttpUtilities.DeleteCookie(httpContext.Response, Canary15Profile.Owa.Name); if (key.UserContextId == null) { string message = "User context id couldn't be retrieved. Logoff can't be performed"; ExTraceGlobals.UserContextTracer.TraceDebug(0L, message); userContext.LogBreadcrumb(message); userContext.Dispose(); userContext = null; } else { userContext.LogBreadcrumb("Logoff invoking Cache.Remove"); object obj = HttpRuntime.Cache.Remove(key.ToString()); userContext.LogBreadcrumb("Logoff invoked Cache.Remove"); string message2 = (obj == null) ? "The userContext was already deleted from the cache" : "Context successfully deleted from the cache"; ExTraceGlobals.UserContextTracer.TraceDebug(0L, message2); userContext.LogBreadcrumb(message2); } } }
private static IMailboxContext GetMailboxContextFromCache(UserContextKey userContextKey, bool lockUserContextKey) { ExTraceGlobals.UserContextCallTracer.TraceDebug(0L, "UserContextManager.TryGetUserContextFromCache"); if (userContextKey == null) { ExTraceGlobals.UserContextCallTracer.TraceDebug(0L, "UserContextManager.TryGetUserContextFromCache: No UserContextKey provided, returning null."); return(null); } UserContextManager.UserContextCacheWrapper userContextCacheWrapper = null; IMailboxContext mailboxContext = null; bool flag = false; try { ExTraceGlobals.UserContextCallTracer.TraceDebug <UserContextKey>(0L, "Attempting to fetch user context from the cache. Key={0}", userContextKey); userContextCacheWrapper = (UserContextManager.UserContextCacheWrapper)HttpRuntime.Cache.Get(userContextKey.ToString()); if (userContextCacheWrapper != null && userContextCacheWrapper.UserContext != null) { if (lockUserContextKey) { if (userContextCacheWrapper.Lock == null) { throw new OwaLockException("UserContextManager::GetUserContextFromCache cannot get a lock from UserContextCacheWrapper"); } if (!userContextCacheWrapper.Lock.IsWriterLockHeld) { if (!userContextCacheWrapper.Lock.LockWriterElastic(3000)) { throw new OwaLockTimeoutException("UserContextManager::GetUserContextFromCache cannot acquire a write lock in a time fashion"); } flag = true; mailboxContext = userContextCacheWrapper.UserContext; ExTraceGlobals.UserContextCallTracer.TraceDebug <UserContextKey, IMailboxContext>(0L, "User context found in cache. Key={0}, User context instance={1}", userContextKey, mailboxContext); } } else { mailboxContext = userContextCacheWrapper.UserContext; ExTraceGlobals.UserContextCallTracer.TraceDebug <UserContextKey, IMailboxContext>(0L, "User context found in cache. Key={0}, User context instance={1}", userContextKey, mailboxContext); } } else { ExTraceGlobals.UserContextCallTracer.TraceDebug <string>(0L, "An object for this user context ID value is not present in the cache (probably was expired), so we are going to reuse the user context ID value for the new session", userContextKey.UserContextId); } } finally { if (mailboxContext != null && mailboxContext.TerminationStatus == UserContextTerminationStatus.TerminatePending) { UserContextManager.TerminateSession(mailboxContext, mailboxContext.AbandonedReason); mailboxContext = null; } if (flag && userContextCacheWrapper != null && userContextCacheWrapper.Lock != null) { userContextCacheWrapper.Lock.ReleaseWriterLock(); } if (mailboxContext != null && mailboxContext.State != UserContextState.Active) { mailboxContext = null; } } return(mailboxContext); }
private static void CreateUserContext(HttpContext httpContext, UserContextKey userContextKey, AuthZClientInfo effectiveCaller, out IMailboxContext userContext, out UserContextStatistics userContextStats) { Stopwatch stopwatch = Stopwatch.StartNew(); userContextStats = new UserContextStatistics(); userContext = null; OwaIdentity owaIdentity = null; OwaIdentity owaIdentity2 = null; OwaIdentity owaIdentity3 = null; try { try { OwaIdentity owaIdentity4 = OwaIdentity.ResolveLogonIdentity(httpContext, effectiveCaller); owaIdentity2 = owaIdentity4; string explicitLogonUser = UserContextUtilities.GetExplicitLogonUser(httpContext); if (!string.IsNullOrEmpty(explicitLogonUser)) { ExTraceGlobals.UserContextTracer.TraceDebug <string>(0L, "Created partial mailbox identity from SMTP address={0}", explicitLogonUser); owaIdentity = OwaIdentity.CreateOwaIdentityFromExplicitLogonAddress(explicitLogonUser); owaIdentity3 = owaIdentity; } if (userContextKey == null) { userContextKey = UserContextKey.CreateNew(owaIdentity4, owaIdentity, httpContext); ExTraceGlobals.UserContextTracer.TraceDebug <UserContextKey>(0L, "Creating new user context key: {0}", userContextKey); } else { ExTraceGlobals.UserContextTracer.TraceDebug <UserContextKey>(0L, "Reusing user context key: {0}", userContextKey); } OwaRWLockWrapper userContextKeyLock = UserContextManager.GetUserContextKeyLock(userContextKey.ToString()); if (userContextKeyLock == null) { userContextStats.Error = UserContextCreationError.UnableToAcquireOwaRWLock; throw new OwaLockException("UserContextManger::CreateUserContext was not able to create a lock"); } if (userContextKeyLock.LockWriterElastic(6000)) { try { userContext = UserContextManager.GetMailboxContextFromCache(userContextKey, false); if (userContext != null && userContext.TerminationStatus == UserContextTerminationStatus.TerminatePending) { UserContextManager.TerminateSession(userContext, userContext.AbandonedReason); userContext = null; } if (userContext == null) { userContextStats.Created = true; ExTraceGlobals.UserContextTracer.TraceDebug <UserContextKey>(0L, "User context was not found in the cache, creating one. UserContextKey: {0}", userContextKey); bool flag = false; try { if (UserContextManager.IsSharedContextKey(userContextKey)) { userContext = new SharedContext(userContextKey, httpContext.Request.UserAgent); } else { userContext = new UserContext(userContextKey, httpContext.Request.UserAgent); } Stopwatch stopwatch2 = Stopwatch.StartNew(); userContext.Load(owaIdentity4, owaIdentity, userContextStats); userContextStats.LoadTime = (int)stopwatch2.ElapsedMilliseconds; UserContextManager.InsertIntoCache(httpContext, userContext); owaIdentity2 = null; owaIdentity3 = null; string userName = userContext.LogonIdentity.UserSid.ToString(); PerformanceCounterManager.UpdatePerfCounteronUserContextCreation(userName, false, false, Globals.ArePerfCountersEnabled); flag = true; } finally { if (!flag) { ExTraceGlobals.UserContextTracer.TraceDebug <UserContextKey>(0L, "User context creation failed. UserContextKey: {0}", userContextKey); if (userContext != null) { ExTraceGlobals.UserContextTracer.TraceDebug <UserContextKey>(0L, "Disposing user context. UserContextKey: {0}", userContextKey); userContext.Dispose(); userContext.State = UserContextState.Abandoned; } } } } goto IL_1EA; } finally { userContextKeyLock.ReleaseWriterLock(); } goto IL_1D4; IL_1EA: goto IL_237; } IL_1D4: userContextStats.Error = UserContextCreationError.UnableToAcquireOwaRWLock; throw new OwaLockTimeoutException("UserContextManger::CreateUserContext was not able to acquire a rw lock", null, null); } catch (OwaIdentityException ex) { userContextStats.Error = UserContextCreationError.UnableToResolveLogonIdentity; OwaServerTraceLogger.AppendToLog(new TraceLogEvent("UserContext", userContext, "UserContextManager.CreateUserContext", ex.ToString())); throw; } catch (Exception ex2) { OwaServerTraceLogger.AppendToLog(new TraceLogEvent("UserContext", userContext, "UserContextManager.CreateUserContext", ex2.ToString())); throw; } IL_237 :; } finally { if (owaIdentity2 != null) { owaIdentity2.Dispose(); } if (owaIdentity3 != null) { owaIdentity3.Dispose(); } stopwatch.Stop(); userContextStats.AcquireLatency = (int)stopwatch.ElapsedMilliseconds; httpContext.Items["UserContextStatistics"] = userContextStats; } }