void CloseSession(int session_id) { session_node *s; s = GetSessionByID(session_id); if (s == NULL) { eprintf("CloseSession can't find session %i\n",session_id); return; } if (!s->connected) { eprintf("CloseSession can't close unconnected session %i\n", s->session_id); return; } EnterSessionLock(); s->connected = False; if (!s->exiting_state) /* if a write error occurred during an exit, don't */ ExitSessionState(s); /* go into infinite loop */ if ((s->state != STATE_MAINTENANCE) && (s->account == NULL)) lprintf("CloseSession closing session with no account from %s\n", s->conn.name); else { AccountLogoff(s->account); if (s->account != NULL) lprintf("CloseSession/4 logging off %i\n",s->account->account_id); } s->account = NULL; InterfaceLogoff(s); if (s->conn.type == CONN_SOCKET) { if (WaitForSingleObject(s->muxSend,10000) != WAIT_OBJECT_0) eprintf("CloseSession couldn't get session %i muxSend\n",s->session_id); else { DeleteBufferList(s->send_list); s->send_list = NULL; /* no need to release mutex... we're closing it */ /* if (!ReleaseMutex(s->muxSend)) eprintf("File %s line %i release of non-owned mutex\n",__FILE__,__LINE__); */ } if (WaitForSingleObject(s->muxReceive,10000) != WAIT_OBJECT_0) eprintf("CloseSession couldn't get session %i muxReceive\n",s->session_id); else { DeleteBufferList(s->receive_list); s->receive_list = NULL; /* no need to release mutex... we're closing it */ /* if (!ReleaseMutex(s->muxReceive)) eprintf("File %s line %i release of non-owned mutex\n",__FILE__,__LINE__); */ } if (!CloseHandle(s->muxSend)) eprintf("CloseSession error (%s) closing send mutex %i in session %i\n", GetLastErrorStr(),s->muxSend,s->session_id); if (!CloseHandle(s->muxReceive)) eprintf("CloseSession error (%s) closing receive mutex %i in session %i\n", GetLastErrorStr(),s->muxReceive,s->session_id); CloseConnection(s->conn); } s->session_id = -1; s->state = -1; LeaveSessionLock(); }
int OperateSubscriberSession ( const SSubscriberRefresh &p_soRefreshRecord, const SSessionInfo &p_soSessionInfo, std::map<std::string,int> &p_soSessionPolicyList, std::map<SPolicyInfo,std::map<SPolicyDetail,int> > &p_mapProfilePolicyList, CIPConnector &p_coIPConn, otl_connect &p_coDBConn) { int iRetVal = 0; do { SPolicyInfo soPolicyInfo; std::map<SPolicyInfo,std::map<SPolicyDetail,int> >::iterator iterProfilePolicy = p_mapProfilePolicyList.end (); std::map<SPolicyInfo,std::map<SPolicyDetail,int> >::iterator iterProfilePolicyDef = p_mapProfilePolicyList.end (); UTL_LOG_N( g_coLog, "Subscriber_id: '%s'; UserName: '******'; NASIPAddress: '%s'; SessionID: '%s'; Location: '%s';", p_soRefreshRecord.m_mcSubscriberId, p_soSessionInfo.m_strUserName.c_str(), p_soSessionInfo.m_strNASIPAddress.c_str(), p_soSessionInfo.m_strSessionId.c_str(), p_soSessionInfo.m_strLocation.c_str()); /* ищем кешированные политики */ soPolicyInfo.m_strUserName = p_soSessionInfo.m_strUserName; // ищем кешированную политику для локации сервера доступа soPolicyInfo.m_strLocation = p_soSessionInfo.m_strLocation; iterProfilePolicy = p_mapProfilePolicyList.find (soPolicyInfo); // ищем кешированную политику для локации DEFAULT if (p_soSessionInfo.m_strLocation.compare("DEFAULT")) { soPolicyInfo.m_strLocation = "DEFAULT"; iterProfilePolicyDef = p_mapProfilePolicyList.find (soPolicyInfo); } /* если кешированные политики не найдены запрашиваем их из БД */ if (iterProfilePolicy == p_mapProfilePolicyList.end() && iterProfilePolicyDef == p_mapProfilePolicyList.end()) { iRetVal = CreatePolicyList (&(p_soSessionInfo), &p_mapProfilePolicyList, p_coDBConn); /* если произошла ошибка при формировании списка политик завершаем работу */ if (iRetVal) { UTL_LOG_E( g_coLog, "Subscriber_id: '%s': CreatePolicyList: error code: '%d'", p_soRefreshRecord.m_mcSubscriberId, iRetVal); break; } /* повторно ищем кешированную политику для локации сервера доступа */ soPolicyInfo.m_strLocation = p_soSessionInfo.m_strLocation; iterProfilePolicy = p_mapProfilePolicyList.find (soPolicyInfo); /* повторно ищем кешированную политику для локации DEFAULT */ if (p_soSessionInfo.m_strLocation.compare("DEFAULT")) { soPolicyInfo.m_strLocation = "DEFAULT"; iterProfilePolicyDef = p_mapProfilePolicyList.find (soPolicyInfo); } } /* если в записи очереди команд задано значение 'action' */ if (p_soRefreshRecord.m_mcAction[0]) { /* отрабатываем команду 'logoff' */ if (0 == strcmp ("logoff", p_soRefreshRecord.m_mcAction)) { iRetVal = AccountLogoff (&(p_soSessionInfo), &p_coIPConn); if (iRetVal) { break; } } /* отрабатываем команду 'checksession' */ else if (0 == strcmp("checksession", p_soRefreshRecord.m_mcAction)) { iRetVal = CheckSession(&(p_soSessionInfo), &p_coIPConn, p_coDBConn); if (iRetVal) { break; } } /* неизвестное значение 'action' */ else { UTL_LOG_E( g_coLog, "Subscriber_id: '%s': error: action: '%s' is not supported", p_soRefreshRecord.m_mcSubscriberId, p_soRefreshRecord.m_mcAction); iRetVal = -1; } } /* если политики не найдены */ else if (iterProfilePolicy == p_mapProfilePolicyList.end() && iterProfilePolicyDef == p_mapProfilePolicyList.end()) { // политики не найдены, посылаем LogOff iRetVal = AccountLogoff (&(p_soSessionInfo), &p_coIPConn); if (iRetVal) { break; } } /* обрабатываем политики */ else { if (iterProfilePolicy != p_mapProfilePolicyList.end ()) { SelectActualPolicy (&p_soSessionPolicyList, &(iterProfilePolicy->second)); } if (iterProfilePolicyDef != p_mapProfilePolicyList.end ()) { SelectActualPolicy (&p_soSessionPolicyList, &(iterProfilePolicyDef->second)); } /* отключаем активные неактуальные политики */ iRetVal = DeactivateNotrelevantPolicy (p_soSessionInfo, p_soSessionPolicyList, p_coIPConn); if (iRetVal) { break; } /* включаем неактивные актуальные политики */ if (iterProfilePolicy != p_mapProfilePolicyList.end()) { iRetVal = ActivateInactivePolicy (p_soSessionInfo, iterProfilePolicy->second, p_coIPConn); if (iRetVal) { break; } } if (iterProfilePolicyDef != p_mapProfilePolicyList.end()) { iRetVal = ActivateInactivePolicy (p_soSessionInfo, iterProfilePolicyDef->second, p_coIPConn); if (iRetVal) { break; } } } if (iRetVal) { break; } } while (0); return iRetVal; }