diff --git a/OpenSim/Framework/Communications/Cache/AuthedSessionCache.cs b/OpenSim/Framework/Communications/Cache/AuthedSessionCache.cs new file mode 100644 index 0000000000..b989997adf --- /dev/null +++ b/OpenSim/Framework/Communications/Cache/AuthedSessionCache.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace OpenSim.Framework.Communications.Cache +{ + public class AuthedSessionCache + { + public class CacheData + { + private static readonly DateTime UNIX_EPOCH = new DateTime(1970, 1, 1); + private string m_session_id; + private string m_agent_id; + private int m_expire; + + private int get_current_unix_time() + { + return (int)(DateTime.UtcNow - UNIX_EPOCH).TotalSeconds; + } + + public CacheData(string sid, string aid) + { + m_session_id = sid; + m_agent_id = aid; + m_expire = get_current_unix_time() + DEFAULT_LIFETIME; + } + + public CacheData(string sid, string aid, int time_now) + { + m_session_id = sid; + m_agent_id = aid; + m_expire = time_now + DEFAULT_LIFETIME; + } + + public string SessionID + { + get { return m_session_id; } + set { m_session_id = value; } + } + + public string AgentID + { + get { return m_agent_id; } + set { m_agent_id = value; } + } + + public bool isExpired + { + get { return m_expire < get_current_unix_time(); } + } + + public void Renew() + { + m_expire = get_current_unix_time() + DEFAULT_LIFETIME; + } + } + + private static readonly int DEFAULT_LIFETIME = 30; + private Dictionary m_authed_sessions = new Dictionary(); + private int m_session_lifetime = DEFAULT_LIFETIME; + + public AuthedSessionCache() + { + m_session_lifetime = DEFAULT_LIFETIME; + } + + public AuthedSessionCache(int timeout) + { + m_session_lifetime = timeout; + } + + public CacheData getCachedSession(string session_id, string agent_id) + { + CacheData ret = null; + lock (m_authed_sessions) + { + if (m_authed_sessions.ContainsKey(session_id)) + { + CacheData cached_session = m_authed_sessions[session_id]; + if (!cached_session.isExpired && cached_session.AgentID == agent_id) + { + ret = m_authed_sessions[session_id]; + // auto renew + m_authed_sessions[session_id].Renew(); + } + } + } + return ret; + } + + public void Add(string session_id, string agent_id) + { + CacheData data = new CacheData(session_id, agent_id); + lock (m_authed_sessions) + { + if (m_authed_sessions.ContainsKey(session_id)) + { + m_authed_sessions[session_id] = data; + } + else + { + m_authed_sessions.Add(session_id, data); + } + } + } + } +} diff --git a/OpenSim/Grid/InventoryServer/GridInventoryService.cs b/OpenSim/Grid/InventoryServer/GridInventoryService.cs index b8a04369af..63eeced885 100644 --- a/OpenSim/Grid/InventoryServer/GridInventoryService.cs +++ b/OpenSim/Grid/InventoryServer/GridInventoryService.cs @@ -38,6 +38,7 @@ using Nwc.XmlRpc; using OpenSim.Framework; using OpenSim.Framework.Communications; +using OpenSim.Framework.Communications.Cache; namespace OpenSim.Grid.InventoryServer { @@ -48,8 +49,10 @@ namespace OpenSim.Grid.InventoryServer { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly int INVENTORY_DEFAULT_SESSION_TIME = 30; // secs private string m_userserver_url; + private AuthedSessionCache m_session_cache = new AuthedSessionCache(INVENTORY_DEFAULT_SESSION_TIME); public GridInventoryService(string userserver_url) { @@ -72,20 +75,33 @@ namespace OpenSim.Grid.InventoryServer public bool CheckAuthSession(string session_id, string avatar_id) { m_log.InfoFormat("[GRID AGENT INVENTORY]: checking authed session {0} {1}", session_id, avatar_id); - Hashtable requestData = new Hashtable(); - requestData["avatar_uuid"] = avatar_id; - requestData["session_id"] = session_id; - ArrayList SendParams = new ArrayList(); - SendParams.Add(requestData); - XmlRpcRequest UserReq = new XmlRpcRequest("check_auth_session", SendParams); - XmlRpcResponse UserResp = UserReq.Send(m_userserver_url, 3000); - - Hashtable responseData = (Hashtable)UserResp.Value; - - if (responseData.ContainsKey("auth_session") && responseData["auth_session"].ToString() == "TRUE") + if (m_session_cache.getCachedSession(session_id, avatar_id) == null) { + // cache miss, ask userserver + Hashtable requestData = new Hashtable(); + requestData["avatar_uuid"] = avatar_id; + requestData["session_id"] = session_id; + ArrayList SendParams = new ArrayList(); + SendParams.Add(requestData); + XmlRpcRequest UserReq = new XmlRpcRequest("check_auth_session", SendParams); + XmlRpcResponse UserResp = UserReq.Send(m_userserver_url, 3000); + + Hashtable responseData = (Hashtable)UserResp.Value; + if (responseData.ContainsKey("auth_session") && responseData["auth_session"].ToString() == "TRUE") + { + m_log.Info("[GRID AGENT INVENTORY]: got authed session from userserver"); + // add to cache; the session time will be automatically renewed + m_session_cache.Add(session_id, avatar_id); + return true; + } + } + else + { + // cache hits + m_log.Info("[GRID AGENT INVENTORY]: got authed session from cache"); return true; } + m_log.Info("[GRID AGENT INVENTORY]: unknown session_id, request rejected"); return false; }