예제 #1
0
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();
}
예제 #2
0
파일: coam.cpp 프로젝트: isub/coam
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;
}