ANSC_STATUS CosaUsersRegGetUserInfo ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCOSA_DATAMODEL_USERS pMyObject = ( PCOSA_DATAMODEL_USERS )hThisObject; PPOAM_IREP_FOLDER_OBJECT pPoamIrepFoUser = (PPOAM_IREP_FOLDER_OBJECT )pMyObject->hIrepFolderUser; PPOAM_IREP_FOLDER_OBJECT pPoamIrepFoEnumUser = (PPOAM_IREP_FOLDER_OBJECT )NULL; PCOSA_CONTEXT_LINK_OBJECT pCosaUserContext = NULL; PCOSA_DML_USER pCosaUser = NULL; PSLAP_VARIABLE pSlapVariable = NULL; ULONG ulEntryCount = 0; ULONG ulIndex = 0; ULONG uInstanceNumber = 0; BOOL bNew = FALSE; char* pAliasUser = NULL; char* pFolderName = NULL; if ( !pPoamIrepFoUser ) { return ANSC_STATUS_FAILURE; } /* This is saved structure for user ***************************************** <User> <NextInstanceNumber> xxx </> <1> <alias>xxx</> <bNew>false</> </1> <2> <alias>xxx</> <bNew>false</> </2> </User> **************************************************** */ /* Get Maximum number */ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoUser->GetRecord ( (ANSC_HANDLE)pPoamIrepFoUser, COSA_DML_RR_NAME_UserNextInsNunmber, NULL ); if ( pSlapVariable ) { pMyObject->maxInstanceOfUser = pSlapVariable->Variant.varUint32; SlapFreeVariable(pSlapVariable); } } /* enumerate user.{i} */ ulEntryCount = pPoamIrepFoUser->GetFolderCount((ANSC_HANDLE)pPoamIrepFoUser); for ( ulIndex = 0; ulIndex < ulEntryCount; ulIndex++ ) { /* Get i in user.{i} */ pFolderName = pPoamIrepFoUser->EnumFolder ( (ANSC_HANDLE)pPoamIrepFoUser, ulIndex ); if ( !pFolderName ) { continue; } uInstanceNumber = _ansc_atol(pFolderName); if ( uInstanceNumber == 0 ) { AnscFreeMemory(pFolderName); continue; } pPoamIrepFoEnumUser = pPoamIrepFoUser->GetFolder((ANSC_HANDLE)pPoamIrepFoUser, pFolderName); AnscFreeMemory(pFolderName); if ( !pPoamIrepFoEnumUser ) { continue; } /* Get user.{i}.Username value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumUser->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumUser, COSA_DML_RR_NAME_UserAlias, NULL ); if ( pSlapVariable ) { pAliasUser = AnscCloneString(pSlapVariable->Variant.varString); SlapFreeVariable(pSlapVariable); } } /* Get user.{i}.bNew value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumUser->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumUser, COSA_DML_RR_NAME_UserbNew, NULL ); if ( pSlapVariable ) { bNew = pSlapVariable->Variant.varBool; SlapFreeVariable(pSlapVariable); } else { bNew = TRUE; } } /* Create one entry and keep this delay_added entry */ pCosaUser = (PCOSA_DML_USER)AnscAllocateMemory(sizeof(COSA_DML_USER)); if ( !pCosaUser ) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT1; } /* set some default value firstly */ USERS_USER_SET_DEFAULTVALUE(pCosaUser); /* save alias and instanceNumber */ pCosaUser->InstanceNumber = uInstanceNumber; AnscCopyString( pCosaUser->Username, pAliasUser ); /* Create one link point */ pCosaUserContext = (PCOSA_CONTEXT_LINK_OBJECT)AnscAllocateMemory(sizeof(COSA_CONTEXT_LINK_OBJECT)); if ( !pCosaUserContext ) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT2; } COSA_CONTEXT_LINK_INITIATION_CONTENT(pCosaUserContext) pCosaUserContext->InstanceNumber = uInstanceNumber; pCosaUserContext->hContext = (ANSC_HANDLE)pCosaUser; pCosaUser = 0; pCosaUserContext->bNew = bNew; CosaSListPushEntryByInsNum(&pMyObject->UserList, (PCOSA_CONTEXT_LINK_OBJECT)pCosaUserContext); /* release some memory */ if (pAliasUser) { AnscFreeMemory(pAliasUser); pAliasUser = NULL; } pPoamIrepFoEnumUser->Remove((ANSC_HANDLE)pPoamIrepFoEnumUser); pPoamIrepFoEnumUser = NULL; } EXIT2: if(pCosaUser) AnscFreeMemory(pCosaUser); EXIT1: if(pAliasUser) AnscFreeMemory(pAliasUser); if ( pPoamIrepFoEnumUser ) pPoamIrepFoEnumUser->Remove((ANSC_HANDLE)pPoamIrepFoEnumUser); return returnStatus; }
ANSC_STATUS CosaNatRegGetNatInfo ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCOSA_DATAMODEL_NAT pMyObject = ( PCOSA_DATAMODEL_NAT )hThisObject; PPOAM_IREP_FOLDER_OBJECT pPoamIrepFoNat = (PPOAM_IREP_FOLDER_OBJECT )pMyObject->hIrepFolderNat; PPOAM_IREP_FOLDER_OBJECT pPoamIrepFoNatPt = (PPOAM_IREP_FOLDER_OBJECT )pMyObject->hIrepFolderNatPt; PPOAM_IREP_FOLDER_OBJECT pPoamIrepFoEnumNat = (PPOAM_IREP_FOLDER_OBJECT )NULL; PCOSA_CONTEXT_PMAPPING_LINK_OBJECT pCosaNatContext = NULL; PCOSA_CONTEXT_LINK_OBJECT pCosaNatPtContext = NULL; PCOSA_DML_NAT_PMAPPING pCosaNat = NULL; PCOSA_DML_NAT_PTRIGGER pCosaNatPt = NULL; PSLAP_VARIABLE pSlapVariable = NULL; ULONG ulEntryCount = 0; ULONG ulIndex = 0; ULONG uInstanceNumber = 0; BOOL bNew = FALSE; char* pAliasNat = NULL; char* pFolderName = NULL; CcspTraceWarning(("!!!!!! In CosaNatRegGetNatInfo !!!!!!\n")); if ( !pPoamIrepFoNat || !pPoamIrepFoNatPt ) { CcspTraceWarning(("!!!!!! pPoamIrepFoNat: %p, pPoamIrepFoNatPt: %p !!!!!!\n", pPoamIrepFoNat, pPoamIrepFoNatPt)); return ANSC_STATUS_FAILURE; } /* This is saved structure for nat ***************************************** <Nat> <1> <alias>xxx</> <bNew>false</> </1> <2> <alias>xxx</> <bNew>false</> </2> </Nat> **************************************************** */ /* enumerate Portmapping.{i} */ ulEntryCount = pPoamIrepFoNat->GetFolderCount((ANSC_HANDLE)pPoamIrepFoNat); for ( ulIndex = 0; ulIndex < ulEntryCount; ulIndex++ ) { /* Get i in Portmapping.{i} */ pFolderName = pPoamIrepFoNat->EnumFolder ( (ANSC_HANDLE)pPoamIrepFoNat, ulIndex ); if ( !pFolderName ) { continue; } uInstanceNumber = _ansc_atol(pFolderName); if ( uInstanceNumber == 0 ) { AnscFreeMemory(pFolderName); continue; } pPoamIrepFoEnumNat = pPoamIrepFoNat->GetFolder((ANSC_HANDLE)pPoamIrepFoNat, pFolderName); AnscFreeMemory(pFolderName); if ( !pPoamIrepFoEnumNat ) { continue; } /* Get PortMapping.{i}.Alias value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumNat->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumNat, COSA_DML_RR_NAME_NATAlias, NULL ); if ( pSlapVariable ) { pAliasNat = AnscCloneString(pSlapVariable->Variant.varString); SlapFreeVariable(pSlapVariable); } } /* Get PortMapping.{i}.bNew value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumNat->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumNat, COSA_DML_RR_NAME_NATbNew, NULL ); if ( pSlapVariable ) { bNew = pSlapVariable->Variant.varBool; SlapFreeVariable(pSlapVariable); } else { bNew = TRUE; } } /* Create one entry and keep this delay_added entry */ pCosaNat = (PCOSA_DML_NAT_PMAPPING)AnscAllocateMemory(sizeof(COSA_DML_NAT_PMAPPING)); if ( !pCosaNat ) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT1; } /* set some default value firstly */ NAT_PORTMAPPING_SET_DEFAULTVALUE(pCosaNat); /* save alias and instanceNumber */ pCosaNat->InstanceNumber = uInstanceNumber; AnscCopyString( pCosaNat->Alias, pAliasNat ); /* Create one link point */ pCosaNatContext = (PCOSA_CONTEXT_PMAPPING_LINK_OBJECT)AnscAllocateMemory(sizeof(COSA_CONTEXT_PMAPPING_LINK_OBJECT)); if ( !pCosaNatContext ) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT2; } NAT_PMAPPING_INITIATION_CONTEXT(pCosaNatContext) pCosaNatContext->InstanceNumber = pCosaNat->InstanceNumber; pCosaNatContext->hContext = (ANSC_HANDLE)pCosaNat; pCosaNat = 0; pCosaNatContext->bNew = bNew; CosaSListPushEntryByInsNum(&pMyObject->NatPMappingList, (PCOSA_CONTEXT_LINK_OBJECT)pCosaNatContext); /* release some memory */ if (pAliasNat) { AnscFreeMemory(pAliasNat); pAliasNat = NULL; } pPoamIrepFoEnumNat->Remove((ANSC_HANDLE)pPoamIrepFoEnumNat); pPoamIrepFoEnumNat = NULL; } /* This is saved structure for nat port trigger ***************************************** <Nat> <PortTrigger> <Record>NextInsNumber</Record> <1> <alias>xxx</> <bNew>true</> </1> <2> <alias>xxx</> <bNew>true</> </2> </PortTrigger> </Nat> **************************************************** */ /* enumerate PortTrigger.{i} */ ulEntryCount = pPoamIrepFoNatPt->GetFolderCount((ANSC_HANDLE)pPoamIrepFoNatPt); CcspTraceWarning(("!!!!!! ulEntryCount for PortTrigger: %d !!!!!!\n", ulEntryCount)); for ( ulIndex = 0; ulIndex < ulEntryCount; ulIndex++ ) { /* Get i in PortTrigger.{i} */ pFolderName = pPoamIrepFoNatPt->EnumFolder ( (ANSC_HANDLE)pPoamIrepFoNatPt, ulIndex ); CcspTraceWarning(("!!!!!! pFolderName: %s !!!!!!\n", pFolderName)); if ( !pFolderName ) { continue; } uInstanceNumber = _ansc_atol(pFolderName); if ( uInstanceNumber == 0 ) { AnscFreeMemory(pFolderName); continue; } pPoamIrepFoEnumNat = pPoamIrepFoNatPt->GetFolder((ANSC_HANDLE)pPoamIrepFoNatPt, pFolderName); AnscFreeMemory(pFolderName); if ( !pPoamIrepFoEnumNat ) { continue; } /* Get PortTrigger.{i}.Alias value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumNat->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumNat, COSA_DML_RR_NAME_NATAlias, NULL ); if ( pSlapVariable ) { pAliasNat = AnscCloneString(pSlapVariable->Variant.varString); SlapFreeVariable(pSlapVariable); } } /* Get PortTrigger.{i}.bNew value*/ if ( TRUE ) { pSlapVariable = (PSLAP_VARIABLE)pPoamIrepFoEnumNat->GetRecord ( (ANSC_HANDLE)pPoamIrepFoEnumNat, COSA_DML_RR_NAME_NATbNew, NULL ); if ( pSlapVariable ) { bNew = pSlapVariable->Variant.varBool; SlapFreeVariable(pSlapVariable); } else { bNew = TRUE; } } /* Create one entry and keep this delay_added entry */ pCosaNatPt = (PCOSA_DML_NAT_PTRIGGER)AnscAllocateMemory(sizeof(COSA_DML_NAT_PTRIGGER)); if ( !pCosaNatPt ) { returnStatus = ANSC_STATUS_RESOURCES; goto EXIT1; } /* set some default value firstly */ COSA_DML_NAT_PTRIGGER_INIT(pCosaNatPt); /* save alias and instanceNumber */ pCosaNatPt->InstanceNumber = uInstanceNumber; AnscCopyString( pCosaNatPt->Alias, pAliasNat ); CcspTraceWarning(("!!!!!! pCosaNatPt->InstanceNumber: %d, pCosaNatPt->Alias: %s !!!!!!\n", pCosaNatPt->InstanceNumber, pCosaNatPt->Alias)); /* Create one link point */ pCosaNatPtContext = (PCOSA_CONTEXT_LINK_OBJECT)AnscAllocateMemory(sizeof(COSA_CONTEXT_LINK_OBJECT)); if ( !pCosaNatPtContext ) { AnscFreeMemory(pCosaNatPt); /*RDKB-6742, CID-33206, Free unused resources after use*/ pCosaNatPt = NULL; returnStatus = ANSC_STATUS_FAILURE; goto EXIT2; } COSA_CONTEXT_LINK_INITIATION_CONTENT(pCosaNatPtContext) pCosaNatPtContext->InstanceNumber = pCosaNatPt->InstanceNumber; pCosaNatPtContext->hContext = (ANSC_HANDLE)pCosaNatPt; pCosaNatPtContext->bNew = bNew; CosaSListPushEntryByInsNum(&pMyObject->NatPTriggerList, (PCOSA_CONTEXT_LINK_OBJECT)pCosaNatPtContext); /* release some memory */ if (pAliasNat) { AnscFreeMemory(pAliasNat); pAliasNat = NULL; } pPoamIrepFoEnumNat->Remove((ANSC_HANDLE)pPoamIrepFoEnumNat); pPoamIrepFoEnumNat = NULL; } EXIT2: if(pCosaNat) AnscFreeMemory(pCosaNat); EXIT1: if(pAliasNat) AnscFreeMemory(pAliasNat); if ( pPoamIrepFoEnumNat ) pPoamIrepFoEnumNat->Remove((ANSC_HANDLE)pPoamIrepFoEnumNat); return returnStatus; }
ANSC_HANDLE WebVhoIdentifyGso ( ANSC_HANDLE hThisObject, ANSC_HANDLE hBmoReq ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PWEB_VIRTUAL_HOST_OBJECT pMyObject = (PWEB_VIRTUAL_HOST_OBJECT )hThisObject; PWEB_VIRTUAL_HOST_PROPERTY pProperty = (PWEB_VIRTUAL_HOST_PROPERTY )&pMyObject->Property; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; PWEB_LSM_INTERFACE pLsmIf = (PWEB_LSM_INTERFACE )pMyObject->hLsmIf; PHTTP_BMO_REQ_OBJECT pBmoReq = (PHTTP_BMO_REQ_OBJECT )hBmoReq; PHTTP_HFO_COOKIE pHttpHfoCookie = (PHTTP_HFO_COOKIE )NULL; PHTTP_COOKIE_CONTENT pCookieContent = (PHTTP_COOKIE_CONTENT )NULL; PWEB_GENERAL_SESSION_OBJECT pSession = (PWEB_GENERAL_SESSION_OBJECT)NULL; ULONG ulSessionId = (ULONG )0xFFFFFFFF; char* pLsmIdentifier = (char* )NULL; char pEmptyLsmId[] = {0}; BOOL bLsmIdAlloc = (BOOL )FALSE; ULONG ulClientAddr = (ULONG )AnscReadUlong(pBmoReq->GetClientAddr((ANSC_HANDLE)pBmoReq)); USHORT usClientPort = (USHORT )pBmoReq->GetClientPort((ANSC_HANDLE)pBmoReq); BOOL bGotSessionId = (BOOL )FALSE; BOOL bGotLsmId = (BOOL )FALSE; ULONG i = 0; ULONG ulCookieIndex = 0; if ( !pProperty->bEnableSessionTracking ) { return (ANSC_HANDLE)NULL; } pHttpHfoCookie = (PHTTP_HFO_COOKIE)pBmoReq->GetHeaderField2 ( (ANSC_HANDLE)pBmoReq, HTTP_HEADER_ID_COOKIE, ulCookieIndex ++ ); while ( pHttpHfoCookie ) { for ( i = 0; i < pHttpHfoCookie->CookieCount; i++ ) { pCookieContent = &pHttpHfoCookie->CookieArray[i]; if ( !bGotSessionId && AnscEqualString ( pCookieContent->Name, pProperty->VhoCookieName, TRUE ) ) { PUCHAR pCookieValue = pCookieContent->Value; /* Some clients will use double quote in cookie value * although we don't specify in Set-Cookie. */ if ( pCookieValue[0] == '"' ) { pCookieValue ++; } ulSessionId = (ULONG)_ansc_atol(pCookieValue); bGotSessionId = TRUE; } else if ( !bGotLsmId && AnscEqualString ( pCookieContent->Name, pProperty->LsmCookieName, TRUE ) ) { bGotLsmId = TRUE; pLsmIdentifier = pCookieContent->Value; /* Some clients will use double quote in cookie value * although we don't specify in Set-Cookie. This may * cause session match failure, and therefore authentication * may fail. */ if ( pLsmIdentifier ) { ULONG ulLen = (ULONG)AnscSizeOfString(pLsmIdentifier); if ( ulLen == 2 && *pLsmIdentifier == '"' && *(pLsmIdentifier + 1) == '"' ) { pLsmIdentifier = pEmptyLsmId; } else if ( ulLen > 2 && *pLsmIdentifier == '"' && *(pLsmIdentifier + ulLen - 1) == '"' ) { pLsmIdentifier = AnscAllocateMemory(ulLen); AnscCopyMemory(pLsmIdentifier, pCookieContent->Value + 1, ulLen - 2); pLsmIdentifier[ulLen - 2] = 0; bLsmIdAlloc = TRUE; } } } } if ( bGotSessionId && bGotLsmId ) { break; } pHttpHfoCookie = (PHTTP_HFO_COOKIE)pBmoReq->GetHeaderField2 ( (ANSC_HANDLE)pBmoReq, HTTP_HEADER_ID_COOKIE, ulCookieIndex ++ ); } pSession = (PWEB_GENERAL_SESSION_OBJECT)pMyObject->GetGso ( (ANSC_HANDLE)pMyObject, ulSessionId, pLsmIdentifier, (PUCHAR)&ulClientAddr, usClientPort ); if ( bLsmIdAlloc && pLsmIdentifier ) { AnscFreeMemory(pLsmIdentifier); } return (ANSC_HANDLE)pSession; }