using System; using System.Runtime.Caching; using Kreta.Core; using Kreta.Framework; using Kreta.Web.Security; namespace Kreta.Web.Controllers.Logic { public class SessionHandler { private static readonly CacheItemPolicy DefaultCacheItemPolicy = new CacheItemPolicy { SlidingExpiration = TimeSpan.FromMinutes(60) }; private static int sessionTimeOut = 0; private static string GetCacheKey(string sessionId) { return $"{nameof(SessionHandler)}_{sessionId}"; } public static int SessionTimeOut { get { if (sessionTimeOut < 1) { sessionTimeOut = (SDAServer.Instance.Configuration.SessionTimeout - 1) * 60; // A kérés és válasz alatt a mi számlálónk elcsúszik pár másodperccel és a valódi session hamarabb járna le. if (sessionTimeOut < 45) { sessionTimeOut = 45; } } return sessionTimeOut; } } public static void UpdateSessionTime() { string sessionId = ClaimData.SessionId; if (string.IsNullOrWhiteSpace(sessionId)) { throw new Exception("Invalid Session key"); } Cache.Set(GetCacheKey(sessionId), DateTime.Now, DefaultCacheItemPolicy); } public static int GetRemainingTime() { string sessionId = ClaimData.SessionId; if (string.IsNullOrWhiteSpace(sessionId)) { throw new Exception("Invalid Session key"); } DateTime lastCallTime = Cache.AddOrGetExisting(GetCacheKey(sessionId), DateTime.Now, DefaultCacheItemPolicy); TimeSpan spendTime = DateTime.Now - lastCallTime; int remainingTime = SessionTimeOut - (spendTime.Minutes * 60 + spendTime.Seconds); PingKretaServerSession(sessionId); return remainingTime; } public static void DropSession(string sessionId) { Cache.Remove(GetCacheKey(sessionId)); } private static void PingKretaServerSession(string sessionId) { SDAServer.Instance.SessionManager.PingSession(sessionId); } } }