std::shared_ptr<Session> SessionManager::CreateNewSession() { std::shared_ptr<ServerSessionImpl> spSession( new ServerSessionImpl(m_ioService, m_worldModel, *this)); // query auth manager for server authentication module to use (if any) std::shared_ptr<IServerAuthModule> spAuthModule = m_authManager.GetAuthenticationModule(); if (spAuthModule != NULL) spSession->SetAuthenticationModule(spAuthModule); return spSession; }
CSmartPtr<CWebSession> CWebSock::GetSession() { if (!m_spSession.IsNull()) { return m_spSession; } const CString sCookieSessionId = GetRequestCookie("SessionId"); CSmartPtr<CWebSession> *pSession = Sessions.m_mspSessions.GetItem(sCookieSessionId); if (pSession != NULL) { // Refresh the timeout Sessions.m_mspSessions.AddItem((*pSession)->GetId(), *pSession); m_spSession = *pSession; DEBUG("Found existing session from cookie: [" + sCookieSessionId + "] IsLoggedIn(" + CString((*pSession)->IsLoggedIn() ? "true" : "false") + ")"); return *pSession; } if (Sessions.m_mIPSessions.count(GetRemoteIP()) > m_uiMaxSessions) { mIPSessionsIterator it = Sessions.m_mIPSessions.find(GetRemoteIP()); DEBUG("Remote IP: " << GetRemoteIP() << "; discarding session [" << it->second->GetId() << "]"); Sessions.m_mspSessions.RemItem(it->second->GetId()); } CString sSessionID; do { sSessionID = CString::RandomString(32); sSessionID += ":" + GetRemoteIP() + ":" + CString(GetRemotePort()); sSessionID += ":" + GetLocalIP() + ":" + CString(GetLocalPort()); sSessionID += ":" + CString(time(NULL)); sSessionID = sSessionID.SHA256(); DEBUG("Auto generated session: [" + sSessionID + "]"); } while (Sessions.m_mspSessions.HasItem(sSessionID)); CSmartPtr<CWebSession> spSession(new CWebSession(sSessionID, GetRemoteIP())); Sessions.m_mspSessions.AddItem(spSession->GetId(), spSession); m_spSession = spSession; return spSession; }