static ANSC_STATUS CcspTr069PaSsp_XML_GetMultipleItemWithSameName ( PANSC_XML_DOM_NODE_OBJECT pRootNode, char* ItemName, char** retVal ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PANSC_XML_DOM_NODE_OBJECT pChildNode = (PANSC_XML_DOM_NODE_OBJECT)NULL; char buffer[512] = {0}; ULONG uLength = 511; if (pRootNode && ItemName && retVal) { if(*retVal) { CcspTr069PaFreeMemory(*retVal); *retVal = NULL; } pChildNode = (PANSC_XML_DOM_NODE_OBJECT) AnscXmlDomNodeGetChildByName(pRootNode, ItemName); while( pChildNode != NULL) { if (AnscEqualString(pChildNode->Name, ItemName, TRUE)) { uLength = 511; // uLength: passes in max buffer length; gets out actual length if (pChildNode->GetDataString(pChildNode, NULL, buffer, &uLength) == ANSC_STATUS_SUCCESS && uLength > 0) { if(*retVal) { char* sptr = (char*)CcspTr069PaAllocateMemory(AnscSizeOfString(*retVal)+1+uLength+1); if(sptr == NULL) { CcspTr069PaTraceWarning(("Failed to reallocate returnCA\n")); CcspTr069PaFreeMemory(*retVal); *retVal = NULL; returnStatus = ANSC_STATUS_RESOURCES; goto EXIT; } _ansc_sprintf(sptr, "%s,%s", *retVal, buffer); CcspTr069PaFreeMemory(*retVal); *retVal = sptr; } else *retVal = CcspTr069PaCloneString(buffer); } } pChildNode = (PANSC_XML_DOM_NODE_OBJECT) AnscXmlDomNodeGetNextChild(pRootNode, pChildNode); } CcspTr069PaTraceDebug(("%s: %s = %s\n", __FUNCTION__, (ItemName)?(ItemName):"NULL", (*retVal)?(*retVal):"NULL")); // fprintf(stderr, "%s: %s = %s\n", __FUNCTION__, (ItemName)?(ItemName):"NULL", (*retVal)?(*retVal):"NULL"); } EXIT: return returnStatus; }
BOOL CcspCwmppoGetInitialContactFactory ( ANSC_HANDLE hThisObject ) { PCCSP_CWMP_PROCESSOR_OBJECT pMyObject = (PCCSP_CWMP_PROCESSOR_OBJECT )hThisObject; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT )pMyObject->hCcspCwmpCpeController; BOOL bInitialContactFactory = FALSE; if ( !s_bICLoaded ) { char* pValue = NULL; char psmKeyPrefixed[CCSP_TR069PA_PSM_NODE_NAME_MAX_LEN + 16]; CcspCwmpPrefixPsmKey(psmKeyPrefixed, pCcspCwmpCpeController->SubsysName, CCSP_TR069PA_PSM_KEY_InitialContactFactory); pValue = pCcspCwmpCpeController->LoadCfgFromPsm ( (ANSC_HANDLE)pCcspCwmpCpeController, psmKeyPrefixed ); bInitialContactFactory = pValue ? _ansc_atoi(pValue) : TRUE; CcspTr069PaTraceWarning(("InitialContact read from PSM is: <%s>\n", bInitialContactFactory ? "TRUE":"FALSE")); if ( pValue ) { CcspTr069PaFreeMemory(pValue); } } return bInitialContactFactory; }
ANSC_STATUS CcspCwmpAcscoHttpDelCookie ( ANSC_HANDLE hThisObject, ULONG ulIndex ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; ULONG i; PCHAR pCookie = NULL; if ( ulIndex >= pMyObject->NumCookies ) { return ANSC_STATUS_BAD_PARAMETER; } pCookie = pMyObject->Cookies[ulIndex]; for ( i = ulIndex; i < pMyObject->NumCookies - 1; i ++ ) { pMyObject->Cookies[i] = pMyObject->Cookies[i+1]; } pMyObject->NumCookies --; if ( pCookie ) { CcspTr069PaFreeMemory(pCookie); } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpsoDelAllParameters ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_SESSION_OBJECT pMyObject = (PCCSP_CWMP_SESSION_OBJECT )hThisObject; PCCSP_CWMP_ACS_CONNECTION_OBJECT pCcspCwmpAcsConnection = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)pMyObject->hCcspCwmpAcsConnection; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pMyObject->hCcspCwmpCpeController; PCCSP_CWMP_PROCESSOR_OBJECT pCcspCwmpProcessor = (PCCSP_CWMP_PROCESSOR_OBJECT )pMyObject->hCcspCwmpProcessor; ULONG i = 0; for ( i = 0; i < pMyObject->ModifiedParamCount; i++ ) { if ( pMyObject->ModifiedParamArray[i] ) { CcspTr069PaFreeMemory(pMyObject->ModifiedParamArray[i]); pMyObject->ModifiedParamArray[i] = NULL; } } pMyObject->ModifiedParamCount = 0; return ANSC_STATUS_SUCCESS; }
ANSC_HANDLE CcspCwmppoGetPeriodicInformTime ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_PROCESSOR_OBJECT pMyObject = (PCCSP_CWMP_PROCESSOR_OBJECT )hThisObject; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT )pMyObject->hCcspCwmpCpeController; PCCSP_CWMP_PROCESSOR_PROPERTY pProperty = (PCCSP_CWMP_PROCESSOR_PROPERTY)&pMyObject->Property; PANSC_UNIVERSAL_TIME pInformTime = NULL; PANSC_UNIVERSAL_TIME pCalendarTime = NULL; char* pPeriodicInformTime = NULL; pInformTime = (PANSC_UNIVERSAL_TIME)CcspTr069PaAllocateMemory(sizeof(ANSC_UNIVERSAL_TIME)); if ( !pInformTime ) return NULL; AnscZeroMemory(pInformTime, sizeof(ANSC_UNIVERSAL_TIME)); pPeriodicInformTime = CcspManagementServer_GetPeriodicInformTimeStr ( pCcspCwmpCpeController->PANameWithPrefix ); if ( pPeriodicInformTime && AnscSizeOfString(pPeriodicInformTime) != 0 ) { pCalendarTime = CcspStringToCalendarTime(pPeriodicInformTime); if ( pCalendarTime ) { *pInformTime = *pCalendarTime; CcspTr069PaFreeMemory(pCalendarTime); } } if ( pPeriodicInformTime ) { CcspTr069PaFreeMemory(pPeriodicInformTime); } return (ANSC_HANDLE)pInformTime; }
ANSC_STATUS CcspCwmppoReset ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_PROCESSOR_OBJECT pMyObject = (PCCSP_CWMP_PROCESSOR_OBJECT )hThisObject; if ( pMyObject->SecheduledCommandKey ) { CcspTr069PaFreeMemory(pMyObject->SecheduledCommandKey); pMyObject->SecheduledCommandKey = NULL; } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpCpecoSetRootObject ( ANSC_HANDLE hThisObject, char* pRootObject ) { PCCSP_CWMP_CPE_CONTROLLER_OBJECT pMyObject = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)hThisObject; if ( pMyObject->pRootObject ) { CcspTr069PaFreeMemory(pMyObject->pRootObject); pMyObject->pRootObject = NULL; } if ( pRootObject ) { pMyObject->pRootObject = CcspTr069PaCloneString(pRootObject); } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpAcscoHttpRemoveCookies ( ANSC_HANDLE hThisObject ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; ULONG i; for ( i = 0; i < pMyObject->NumCookies; i ++ ) { if ( pMyObject->Cookies[i] ) { CcspTr069PaFreeMemory(pMyObject->Cookies[i]); pMyObject->Cookies[i] = NULL; } } pMyObject->NumCookies = 0; return returnStatus; }
ANSC_STATUS CcspCwmpTcpcrhoRemove ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_TCPCR_HANDLER_OBJECT pMyObject = (PCCSP_CWMP_TCPCR_HANDLER_OBJECT )hThisObject; PANSC_DSTO_WORKER_OBJECT pDstoWorker = (PANSC_DSTO_WORKER_OBJECT )pMyObject->hDstoWorker; pMyObject->Cancel((ANSC_HANDLE)pMyObject); pMyObject->Reset ((ANSC_HANDLE)pMyObject); if ( pDstoWorker ) { CcspTr069PaFreeMemory(pDstoWorker); pMyObject->hDstoWorker = (ANSC_HANDLE)NULL; } AnscCoRemove((ANSC_HANDLE)pMyObject); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpsoConnectToAcs ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_SESSION_OBJECT pMyObject = (PCCSP_CWMP_SESSION_OBJECT )hThisObject; PCCSP_CWMP_ACS_CONNECTION_OBJECT pCcspCwmpAcsConnection = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)pMyObject->hCcspCwmpAcsConnection; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pMyObject->hCcspCwmpCpeController; PCCSP_CWMP_PROCESSOR_OBJECT pCcspCwmpProcessor = (PCCSP_CWMP_PROCESSOR_OBJECT )pMyObject->hCcspCwmpProcessor; char* pAcsUrl = (char* )NULL; char* pAcsUsername = (char* )NULL; char* pAcsPassword = (char* )NULL; pAcsUrl = pCcspCwmpProcessor->GetAcsUrl ((ANSC_HANDLE)pCcspCwmpProcessor); pAcsUsername = pCcspCwmpProcessor->GetAcsUsername((ANSC_HANDLE)pCcspCwmpProcessor); pAcsPassword = pCcspCwmpProcessor->GetAcsPassword((ANSC_HANDLE)pCcspCwmpProcessor); if ( !pAcsUrl ) { returnStatus = ANSC_STATUS_NOT_READY; goto EXIT1; } else { pCcspCwmpAcsConnection->SetAcsUrl ((ANSC_HANDLE)pCcspCwmpAcsConnection, pAcsUrl ); pCcspCwmpAcsConnection->SetUsername((ANSC_HANDLE)pCcspCwmpAcsConnection, pAcsUsername); pCcspCwmpAcsConnection->SetPassword((ANSC_HANDLE)pCcspCwmpAcsConnection, pAcsPassword); } if ( pAcsUrl ) { CcspTr069PaFreeMemory(pAcsUrl); } if ( pAcsUsername ) { CcspTr069PaFreeMemory(pAcsUsername); } if ( pAcsPassword ) { CcspTr069PaFreeMemory(pAcsPassword); } if (!pCcspCwmpAcsConnection->bActive ) { returnStatus = pCcspCwmpAcsConnection->Connect((ANSC_HANDLE)pCcspCwmpAcsConnection); } if ( returnStatus == ANSC_STATUS_SUCCESS ) { /* * Bin update on 07/08/2007 * * We don't want to lock write access at the beginning of the session, we * are supposed to do it after we get a success InformResponse. */ if( FALSE ) { pMyObject->SessionState = CCSP_CWMPSO_SESSION_STATE_abort; returnStatus = pCcspCwmpProcessor->SignalSession ( (ANSC_HANDLE)pCcspCwmpProcessor, (ANSC_HANDLE)pMyObject ); return ANSC_STATUS_NOT_READY; } pMyObject->bActive = TRUE; pMyObject->SessionState = CCSP_CWMPSO_SESSION_STATE_connected; returnStatus = pCcspCwmpProcessor->SignalSession ( (ANSC_HANDLE)pCcspCwmpProcessor, (ANSC_HANDLE)pMyObject ); } /****************************************************************** GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS ******************************************************************/ EXIT1: return returnStatus; }
/********************************************************************** prototype: ANSC_STATUS CcspCwmpSoappoUtilGetParamValue ( ANSC_HANDLE hXmlHandle, ANSC_HANDLE hParamHandle ); description: This function is called to get the parameter value from the xml handle. argument: ANSC_HANDLE hXmlHandle, The XML node; ANSC_HANDLE hParamHandle The parameter handle return: the status of the operation. **********************************************************************/ ANSC_STATUS CcspCwmpSoappoUtilGetParamValue ( ANSC_HANDLE hCcspCwmpMcoIf, ANSC_HANDLE hXmlHandle, ANSC_HANDLE hParamHandle ) { PCCSP_CWMP_MCO_INTERFACE pCcspCwmpMcoIf = (PCCSP_CWMP_MCO_INTERFACE)hCcspCwmpMcoIf; PANSC_XML_DOM_NODE_OBJECT pXmlNode = (PANSC_XML_DOM_NODE_OBJECT)hXmlHandle; PANSC_XML_DOM_NODE_OBJECT pNameNode = (PANSC_XML_DOM_NODE_OBJECT)NULL; PANSC_XML_DOM_NODE_OBJECT pValueNode = (PANSC_XML_DOM_NODE_OBJECT)NULL; PCCSP_CWMP_PARAM_VALUE pCwmpParam = (PCCSP_CWMP_PARAM_VALUE)hParamHandle; PSLAP_VARIABLE pSlapVariable= (PSLAP_VARIABLE)NULL; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; CHAR pValue[1024] = { 0 }; ULONG dataType = CCSP_CWMP_TR069_DATA_TYPE_Unspecified; ULONG length = 1024; ULONG uLongValue = 0; LONG longValue = 0; BOOL bBool = FALSE; BOOL bIsInteger = FALSE; PANSC_XML_ATTRIBUTE pAttribute = NULL; char* pDataType = NULL; char pTemp[64] = { 0 }; CHAR pHugeValue[32000] = { 0 }; /* Config file value could be as big as 32K */ pCwmpParam->Value = NULL; /*************************************************************************** * Argument | Type | Description * *************************************************************************** * Name | string(256) | This is the name of a Parameter. * *-------------------------------------------------------------------------* * Value | any | Teh is the value to be set .* ***************************************************************************/ pNameNode = (PANSC_XML_DOM_NODE_OBJECT) AnscXmlDomNodeGetHeadChild(pXmlNode); pValueNode = (PANSC_XML_DOM_NODE_OBJECT) AnscXmlDomNodeGetTailChild(pXmlNode); if( pNameNode == NULL || pValueNode == NULL || pNameNode == pValueNode) { CcspTr069PaTraceError(("Invalid arguments for ParameterValueStruct.\n")); return ANSC_STATUS_FAILURE; } /* * Get the name first; */ length = 256; returnStatus = AnscXmlDomNodeGetDataString ( pNameNode, NULL, pValue, &length ); if( returnStatus != ANSC_STATUS_SUCCESS) { CcspTr069PaTraceError(("Failed to get the parameter name.\n")); return returnStatus; } if( length == 0) { CcspTr069PaTraceError(("Empty parameter name in SetParameterValues.\n")); return ANSC_STATUS_FAILURE; } pCwmpParam->Name = CcspTr069PaCloneString(pValue); length = 1024; AnscZeroMemory(pValue, length); pSlapVariable = (PSLAP_VARIABLE)CcspTr069PaAllocateMemory(sizeof(SLAP_VARIABLE)); if ( !pSlapVariable ) { return ANSC_STATUS_RESOURCES; } SlapInitVariable(pSlapVariable); pCwmpParam->Value = pSlapVariable; pSlapVariable->Name = NULL; pSlapVariable->ContentType = 0; pSlapVariable->UsageType = 0; /* check the value */ length = 32000; returnStatus = AnscXmlDomNodeGetDataString ( pValueNode, NULL, pHugeValue, &length ); if( returnStatus != ANSC_STATUS_SUCCESS) { CcspTr069PaTraceError(("Failed to get the string parameter value.\n")); CcspTr069PaFreeMemory(pSlapVariable); pCwmpParam->Value = NULL; } else { pSlapVariable->ContentType = SLAP_CONTENT_TYPE_UNSPECIFIED; pSlapVariable->UsageType = 0; pSlapVariable->Syntax = SLAP_VAR_SYNTAX_string; pSlapVariable->Variant.varString = CcspTr069PaCloneString(pHugeValue); } pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Unspecified; /* retrieve data type */ if ( TRUE ) { PANSC_XML_ATTRIBUTE pAttribute; pCwmpParam->Tr069DataType = pCcspCwmpMcoIf->GetParamDataType(pCcspCwmpMcoIf->hOwnerContext, pCwmpParam->Name); pAttribute = (PANSC_XML_ATTRIBUTE)AnscXmlDomNodeGetFirstAttr(pValueNode); if ( pAttribute ) { char* pDataType; AnscCopyMemory(pValue, pAttribute->StringData, pAttribute->DataSize); pDataType = _ansc_strstr(pValue, ":"); if ( !pDataType ) { pDataType = pValue; } else { pDataType ++; } if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_string, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_String; } else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_int, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Int; } else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_unsignedInt, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_UnsignedInt; } else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_boolean, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Boolean; } else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_dateTime, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_DateTime; } else if ( AnscEqualString(pDataType, CCSP_CWMP_DATA_NAME_base64, TRUE) ) { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Base64; } else { pCwmpParam->Tr069DataType = CCSP_CWMP_TR069_DATA_TYPE_Unspecified; } } } if ( pCwmpParam->Tr069DataType == CCSP_CWMP_TR069_DATA_TYPE_Unspecified ) { return ANSC_STATUS_BAD_PARAMETER; } return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpAcscoHttpAddCookie ( ANSC_HANDLE hThisObject, PCHAR pCookie ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_SIMPLE_CLIENT_OBJECT pHttpSimpleClient = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient; PHTTP_HFP_INTERFACE pHttpHfpIf = (PHTTP_HFP_INTERFACE)pHttpSimpleClient->GetHfpIf((ANSC_HANDLE)pHttpSimpleClient); char* pCookieValue = NULL; PHTTP_HFO_SET_COOKIE pHfoSetCookie = NULL; if ( !pCookie || AnscSizeOfString(pCookie) <= 5) { CcspTr069PaTraceDebug(("!!!Empty Cookie, ignored.\n")); return ANSC_STATUS_SUCCESS; } if ( pMyObject->NumCookies >= CCSP_CWMP_ACSCO_MAX_COOKIE ) { CcspTr069PaTraceDebug(("!!!Too many cookies, over the limit %d.\n", CCSP_CWMP_ACSCO_MAX_COOKIE)); return ANSC_STATUS_DISCARD; } pCookieValue = (PCHAR)CcspTr069PaAllocateMemory(AnscSizeOfString(pCookie) + 64); if( NULL == pCookieValue ) { return ANSC_STATUS_RESOURCES; } pHfoSetCookie = (PHTTP_HFO_SET_COOKIE)pHttpHfpIf->ParseHeader(pHttpHfpIf->hOwnerContext, pCookie, AnscSizeOfString(pCookie)); if ( pHfoSetCookie ) { ULONG ulCookieSize = 0; int nIndex; ULONG i; /* play a trick here - suppose the definitions of Cookie and Set-Cookie/2 are the same */ pHfoSetCookie->HeaderId = HTTP_HEADER_ID_COOKIE; pHfoSetCookie->Flags &= ~HTTP_FIELD_FLAG_VALUE_PRESENT; pHfoSetCookie->Flags &= ~HTTP_FIELD_FLAG_LINE_PRESENT; ulCookieSize = pHttpHfpIf->GetHeaderSize(pHttpHfpIf->hOwnerContext, (ANSC_HANDLE)pHfoSetCookie); pHttpHfpIf->BuildHeader(pHttpHfpIf->hOwnerContext, (ANSC_HANDLE)pHfoSetCookie, pCookieValue, ulCookieSize); pCookieValue[ulCookieSize] = 0; /* remove old cookies */ for ( i = 0; i < pHfoSetCookie->CookieCount; i ++ ) { nIndex = pMyObject->FindCookie((ANSC_HANDLE)pMyObject, pHfoSetCookie->CookieArray[i].Name); if ( nIndex >= 0 ) { pMyObject->DelCookie((ANSC_HANDLE)pMyObject, (ULONG)nIndex); } } pMyObject->Cookies[pMyObject->NumCookies++] = CcspTr069PaCloneString(pCookieValue + 8); CcspTr069PaFreeMemory(pHfoSetCookie); } CcspTr069PaFreeMemory(pCookieValue); return returnStatus; }
ANSC_STATUS CcspCwmpAcscoHttpBspBrowse ( ANSC_HANDLE hThisObject, ANSC_HANDLE hBmoReq, ANSC_HANDLE hBmoRep, ANSC_HANDLE hReqContext ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; PHTTP_BMO_REQ_OBJECT pHttpBmoReq = (PHTTP_BMO_REQ_OBJECT )hBmoReq; PHTTP_BMO_REP_OBJECT pHttpBmoRep = (PHTTP_BMO_REP_OBJECT )hBmoRep; PANSC_ACS_INTERN_HTTP_CONTENT pHttpGetReq = (PANSC_ACS_INTERN_HTTP_CONTENT )hReqContext; PHTTP_RESPONSE_INFO pHttpRepInfo = (PHTTP_RESPONSE_INFO )pHttpBmoRep->GetRepInfo ((ANSC_HANDLE)pHttpBmoRep); ULONG ulResponseSize = (ULONG )pHttpBmoRep->GetBodySize((ANSC_HANDLE)pHttpBmoRep); char* pHttpResponse = (char* )NULL; char* pHeaderLocation = NULL; char* pCookie = NULL; ULONG ulCode = 0; char* pCookieHeader = NULL; ULONG ulCookieIndex = 0; BOOL bCookiesRemoved = FALSE; if ( pHttpGetReq == NULL) { return ANSC_STATUS_FAILURE; } ulCode = pHttpBmoRep->GetCode((ANSC_HANDLE)pHttpBmoRep); if( HTTP_STATUS_NO_CONTENT == ulCode) /* ACS has nothing to say */ { if( pHttpGetReq != NULL) { pHttpGetReq->ulContentSize = 0; pHttpGetReq->pContent = NULL; pHttpGetReq->bIsRedirect = FALSE; } returnStatus = ANSC_STATUS_SUCCESS; goto EXIT1; } else if( HTTP_STATUS_MOVED_PERMANENTLY != ulCode && HTTP_STATUS_FOUND != ulCode && HTTP_STATUS_OK != ulCode && HTTP_STATUS_UNAUTHORIZED != ulCode && HTTP_STATUS_TEMP_REDIRECT != ulCode ) { returnStatus = ANSC_STATUS_FAILURE; CcspTr069PaTraceDebug(("HttpClient returned code: %d\n", (int)ulCode)); goto EXIT1; } /* save Authorization header value */ if ( TRUE ) { char* pAuthHeaderValue = NULL; /* Authorization header in request */ pAuthHeaderValue = pHttpBmoReq->GetHeaderValueById((ANSC_HANDLE)pHttpBmoReq, HTTP_HEADER_ID_AUTHORIZATION); if ( pMyObject->AuthHeaderValue ) CcspTr069PaFreeMemory(pMyObject->AuthHeaderValue); pMyObject->AuthHeaderValue = CcspTr069PaCloneString(pAuthHeaderValue); } /* look for Set-Cookie headers */ pCookie = pHttpBmoRep->GetHeaderValueById2((ANSC_HANDLE)pHttpBmoRep, HTTP_HEADER_ID_SET_COOKIE2, ulCookieIndex); if ( pCookie && AnscSizeOfString(pCookie) > 0 ) { /* pMyObject->RemoveCookies((ANSC_HANDLE)pMyObject); bCookiesRemoved = TRUE; */ while ( pCookie != NULL && AnscSizeOfString(pCookie) > 0) { pCookieHeader = CcspTr069PaAllocateMemory(AnscSizeOfString(pCookie) + 16); if ( pCookieHeader ) _ansc_sprintf(pCookieHeader, "Set-Cookie2: %s", pCookie); pMyObject->AddCookie((ANSC_HANDLE)pMyObject, pCookieHeader); CcspTr069PaFreeMemory(pCookieHeader); pCookie = pHttpBmoRep->GetHeaderValueById2((ANSC_HANDLE)pHttpBmoRep, HTTP_HEADER_ID_SET_COOKIE2, ++ulCookieIndex); } } /* If Set-Cookie and Set-Cookie2 co-exist happily, we save them all */ ulCookieIndex = 0; pCookie = pHttpBmoRep->GetHeaderValueById2((ANSC_HANDLE)pHttpBmoRep, HTTP_HEADER_ID_SET_COOKIE, ulCookieIndex); if( pCookie != NULL && AnscSizeOfString(pCookie) > 0) { /* if ( !bCookiesRemoved ) { pMyObject->RemoveCookies((ANSC_HANDLE)pMyObject); bCookiesRemoved = TRUE; } */ while ( pCookie && AnscSizeOfString(pCookie) ) { pCookieHeader = CcspTr069PaAllocateMemory(AnscSizeOfString(pCookie) + 16); if ( pCookieHeader ) _ansc_sprintf(pCookieHeader, "Set-Cookie: %s", pCookie); pMyObject->AddCookie((ANSC_HANDLE)pMyObject, pCookieHeader); CcspTr069PaFreeMemory(pCookieHeader); pCookie = pHttpBmoRep->GetHeaderValueById2((ANSC_HANDLE)pHttpBmoRep, HTTP_HEADER_ID_SET_COOKIE, ++ulCookieIndex); } } /* if ( !bCookiesRemoved ) { CcspTr069PaTraceDebug(("No Cookie in the response.\n")); if( pMyObject->NumCookies != 0) { for ( i = 0; i < pMyObject->NumCookies; i ++ ) { CcspTr069PaTraceDebug(("Keep the old cookie: %s\n", pMyObject->Cookies[i])); } } else { CcspTr069PaTraceDebug(("???No cookie exists...\n")); } } */ if( HTTP_STATUS_UNAUTHORIZED == ulCode) { /* make sure if server sends back challenge, terminates the session if otherwise */ char* pWwwAuth = NULL; pHttpGetReq->bUnauthorized = TRUE; pWwwAuth = pHttpBmoRep->GetHeaderValueByName((ANSC_HANDLE)pHttpBmoRep, "WWW-Authenticate"); if ( pWwwAuth ) { returnStatus = ANSC_STATUS_DO_IT_AGAIN; /* ANSC_STATUS_SUCCESS; */ } else { returnStatus = ANSC_STATUS_FAILURE; } goto EXIT1; } if( ulCode == HTTP_STATUS_MOVED_PERMANENTLY || HTTP_STATUS_FOUND == ulCode || HTTP_STATUS_TEMP_REDIRECT == ulCode) { pHeaderLocation = pHttpBmoRep->GetHeaderValueByName((ANSC_HANDLE)pHttpBmoRep, "Location" ); if( pHeaderLocation == NULL || AnscSizeOfString(pHeaderLocation) == 0) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT1; } CcspTr069PaTraceInfo(("ACS URL moved (HTTP code=%u) to: %s\n", ulCode, pHeaderLocation)); pHttpGetReq->ulContentSize = AnscSizeOfString(pHeaderLocation); pHttpGetReq->pContent = CcspTr069PaCloneString(pHeaderLocation); pHttpGetReq->bIsRedirect = TRUE; /* notify underlying HTTP Webc Transaction object to clearn request * otherwise, in case ACS closes the socket first, we will get notified * again and current session will be terminated prematurely. */ returnStatus = ANSC_STATUS_NO_MORE_DATA; } else { if ( ulResponseSize == 0 ) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT1; } else { pHttpResponse = (char*)CcspTr069PaAllocateMemory(ulResponseSize + 1); /* we must leave room for the NULL terminator */ if ( !pHttpResponse ) { returnStatus = ANSC_STATUS_RESOURCES; goto EXIT1; } else { returnStatus = pHttpBmoRep->CopyBodyFrom ( (ANSC_HANDLE)pHttpBmoRep, pHttpResponse, &ulResponseSize ); } } pHttpGetReq->ulContentSize = ulResponseSize; pHttpGetReq->pContent = (PVOID)pHttpResponse; pHttpGetReq->bIsRedirect = FALSE; } /****************************************************************** GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS ******************************************************************/ EXIT1: if ( pHttpGetReq ) { pHttpGetReq->CompleteStatus = (returnStatus == ANSC_STATUS_DO_IT_AGAIN || returnStatus == ANSC_STATUS_NO_MORE_DATA) ? ANSC_STATUS_SUCCESS : returnStatus; AnscSetEvent(&pHttpGetReq->CompleteEvent); } return returnStatus; }
ANSC_STATUS CcspCwmpAcscoHttpBspPolish ( ANSC_HANDLE hThisObject, ANSC_HANDLE hBmoReq, ANSC_HANDLE hReqContext ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; PANSC_ACS_INTERN_HTTP_CONTENT pHttpGetReq = (PANSC_ACS_INTERN_HTTP_CONTENT)hReqContext; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_BMO_REQ_OBJECT pBmoReqObj = (PHTTP_BMO_REQ_OBJECT)hBmoReq; char pBuffer[64] = { 0 }; ULONG i, len = 0; /* add Authorization header - last good one */ if ( pMyObject->AuthHeaderValue ) { pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "Authorization", pMyObject->AuthHeaderValue); } /* * If there's a cookie returned, add the cookie */ for ( i = 0; i < pMyObject->NumCookies; i ++ ) { if ( pMyObject->Cookies[i] == NULL ) break; len += _ansc_strlen(pMyObject->Cookies[i]); } if ( pMyObject->NumCookies == 0 ) { CcspTr069PaTraceDebug(("No Cookie will be added.\n")); } else { char *cookies = (char *)CcspTr069PaAllocateMemory(len + pMyObject->NumCookies*2); if (cookies) { AnscZeroMemory(cookies, len + pMyObject->NumCookies*2); for ( i = 0; i < pMyObject->NumCookies; i ++ ) { if ( pMyObject->Cookies[i] == NULL ) break; _ansc_strcat(cookies, pMyObject->Cookies[i]); if ( i < pMyObject->NumCookies - 1 ) _ansc_strcat(cookies, "; "); } pBmoReqObj->SetHeaderValueByName ( (ANSC_HANDLE)pBmoReqObj, "Cookie", cookies ); CcspTr069PaTraceDebug(("Add Cookie into message: %s\n", cookies)); CcspTr069PaFreeMemory(cookies); } } /* When there is more than one envelope in a single HTTP Request, * when there is a SOAP response in an HTTP Request, or when there is a * SOAP Fault response in an HTTP Request, the SOAPAction header in the * HTTP Request MUST have no value (with no quotes), indicating that this * header provides no information as to the intent of the message." */ if( pHttpGetReq ==NULL || pHttpGetReq->SoapMessage == NULL || AnscSizeOfString(pHttpGetReq->SoapMessage) == 0) { /* * An empty HTTP POST MUST NOT contain a SOAPAction header. * An empty HTTP POST MUST NOT contain a Content-Type header. */ pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "Content-Length", "0"); /* pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "Content-Type", "text/xml;charset=utf-8"); */ } else { pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "Content-Type", "text/xml;charset=utf-8"); _ansc_sprintf(pBuffer, "%u", (unsigned int)AnscSizeOfString(pHttpGetReq->SoapMessage)); pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "Content-Length", pBuffer); if( pHttpGetReq->MethodName == NULL || AnscSizeOfString(pHttpGetReq->MethodName) == 0) { pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "SOAPAction", ""); } else { _ansc_sprintf(pBuffer, "\"%s\"", pHttpGetReq->MethodName); pBmoReqObj->SetHeaderValueByName((ANSC_HANDLE)pBmoReqObj, "SOAPAction", pBuffer); } returnStatus = pBmoReqObj->AppendBody ( pBmoReqObj, pHttpGetReq->SoapMessage, AnscSizeOfString(pHttpGetReq->SoapMessage) ); } return returnStatus; }
ANSC_STATUS CcspCwmpsoRemove ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_SESSION_OBJECT pMyObject = (PCCSP_CWMP_SESSION_OBJECT )hThisObject; PANSC_TIMER_DESCRIPTOR_OBJECT pSessionTimerObj = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hSessionTimerObj; PANSC_TDO_CLIENT_OBJECT pSessionTimerIf = (PANSC_TDO_CLIENT_OBJECT )pMyObject->hSessionTimerIf; PANSC_TIMER_DESCRIPTOR_OBJECT pRetryTimerObj = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hRetryTimerObj; PANSC_TDO_CLIENT_OBJECT pRetryTimerIf = (PANSC_TDO_CLIENT_OBJECT )pMyObject->hRetryTimerIf; PANSC_TIMER_DESCRIPTOR_OBJECT pDelayedActiveNotifTimerObj = (PANSC_TIMER_DESCRIPTOR_OBJECT)pMyObject->hDelayedActiveNotifTimerObj; PANSC_TDO_CLIENT_OBJECT pDelayedActiveNotifTimerIf = (PANSC_TDO_CLIENT_OBJECT )pMyObject->hDelayedActiveNotifTimerIf; PCCSP_CWMP_ACS_CONNECTION_OBJECT pCcspCwmpAcsConnection = (PCCSP_CWMP_ACS_CONNECTION_OBJECT )pMyObject->hCcspCwmpAcsConnection; PCCSP_CWMP_MCO_INTERFACE pCcspCwmpMcoIf = (PCCSP_CWMP_MCO_INTERFACE )pMyObject->hCcspCwmpMcoIf; pMyObject->Reset((ANSC_HANDLE)pMyObject); if ( pSessionTimerObj ) { pSessionTimerObj->Remove((ANSC_HANDLE)pSessionTimerObj); } if ( pSessionTimerIf ) { CcspTr069PaFreeMemory(pSessionTimerIf); } if ( pRetryTimerObj ) { pRetryTimerObj->Remove((ANSC_HANDLE)pRetryTimerObj); } if ( pRetryTimerIf ) { CcspTr069PaFreeMemory(pRetryTimerIf); } if ( pDelayedActiveNotifTimerObj ) { pDelayedActiveNotifTimerObj->Remove((ANSC_HANDLE)pDelayedActiveNotifTimerObj); } if ( pDelayedActiveNotifTimerIf ) { CcspTr069PaFreeMemory(pDelayedActiveNotifTimerIf); } if ( pCcspCwmpAcsConnection ) { pCcspCwmpAcsConnection->Remove((ANSC_HANDLE)pCcspCwmpAcsConnection); pMyObject->hCcspCwmpAcsConnection = (ANSC_HANDLE)NULL; } if ( pCcspCwmpMcoIf ) { CcspTr069PaFreeMemory(pCcspCwmpMcoIf); pMyObject->hCcspCwmpMcoIf = (ANSC_HANDLE)NULL; } AnscFreeLock (&pMyObject->AccessLock ); AnscFreeLock (&pMyObject->AsyncReqQueueLock); AnscFreeLock (&pMyObject->SavedReqQueueLock); AnscFreeLock (&pMyObject->AsyncRepQueueLock); AnscFreeEvent(&pMyObject->AsyncProcessEvent); AnscCoRemove ((ANSC_HANDLE)pMyObject ); return ANSC_STATUS_SUCCESS; }
/********************************************************************** prototype: ANSC_STATUS CcspCwmpAcscoRequestOny ( ANSC_HANDLE hThisObject ); description: This function is called to send the last empty request to ACS. argument: ANSC_HANDLE hThisObject The caller object. return: the status of the operation; **********************************************************************/ ANSC_STATUS CcspCwmpAcscoRequestOnly ( ANSC_HANDLE hThisObject ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; return pMyObject->Request((ANSC_HANDLE)pMyObject, NULL, NULL, 0, 0); #if 0 PHTTP_SIMPLE_CLIENT_OBJECT pHttpClient = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient; PCCSP_CWMP_SESSION_OBJECT pWmpSession = (PCCSP_CWMP_SESSION_OBJECT )pMyObject->hCcspCwmpSession; PCCSP_CWMP_MCO_INTERFACE pCcspCwmpMcoIf = (PCCSP_CWMP_MCO_INTERFACE )pWmpSession->hCcspCwmpMcoIf; PHTTP_HFP_INTERFACE pHttpHfpIf = (PHTTP_HFP_INTERFACE)pHttpClient->GetHfpIf((ANSC_HANDLE)pHttpClient); PHTTP_CAS_INTERFACE pHttpCasIf = NULL; PHTTP_REQUEST_URI pHttpReqInfo = NULL; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; ANSC_ACS_INTERN_HTTP_CONTENT intHttpContent = { 0 }; PANSC_ACS_INTERN_HTTP_CONTENT pHttpGetReq = &intHttpContent; BOOL bApplyTls = FALSE; PCHAR pRequestURL = NULL; PCHAR pTempString = NULL; PHTTP_AUTH_CLIENT_OBJECT pAuthClientObj = NULL; char pNewUrl[257] = { 0 }; ULONG uRedirect = 0; ULONG uMaxRedirect = 5; if( pMyObject->AcsUrl == NULL || AnscSizeOfString(pMyObject->AcsUrl) <= 10 || pHttpHfpIf == NULL) { return ANSC_STATUS_NOT_READY; } CcspTr069PaTraceDebug(("CcspCwmpAcscoRequest -- AcsUrl = '%s'\n", pMyObject->AcsUrl)); pRequestURL = pMyObject->AcsUrl; if ( AnscEqualString2(pRequestURL, "https", 5, FALSE) ) { bApplyTls = TRUE; } else if ( AnscEqualString2(pRequestURL, "http", 4, FALSE) ) { bApplyTls = FALSE; } else { return ANSC_STATUS_NOT_SUPPORTED; } pHttpCasIf = (PHTTP_CAS_INTERFACE)pHttpClient->GetCasIf((ANSC_HANDLE)pHttpClient); if ( pHttpCasIf != NULL) { if( pMyObject->Username == NULL || AnscSizeOfString(pMyObject->Username) == 0) { pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, FALSE); } else { pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, TRUE); pAuthClientObj = (PHTTP_AUTH_CLIENT_OBJECT)pHttpClient->GetClientAuthObj((ANSC_HANDLE)pHttpClient); if ( pAuthClientObj != NULL) { pAuthClientObj->SetAcmIf((ANSC_HANDLE)pAuthClientObj, (ANSC_HANDLE)pMyObject->hHttpAcmIf); } else { CcspTr069PaTraceError(("Failed to Get HttpAuthClient object.\n")); } } } pHttpReqInfo = (PHTTP_REQUEST_URI)pHttpHfpIf->ParseHttpUrl ( pHttpHfpIf->hOwnerContext, pRequestURL, AnscSizeOfString(pRequestURL) ); if ( !pHttpReqInfo ) { return ANSC_STATUS_INTERNAL_ERROR; } pHttpReqInfo->Type = HTTP_URI_TYPE_ABS_PATH; CcspTr069PaTraceInfo(("Send empty request to now at: %u\n", (unsigned int)AnscGetTickInSeconds())); returnStatus = pHttpClient->Request ( (ANSC_HANDLE)pHttpClient, (ULONG )HTTP_METHOD_CODE_POST, (ANSC_HANDLE)pHttpReqInfo, (ANSC_HANDLE)NULL, bApplyTls ); AnscSleep(500); CcspTr069PaFreeMemory(pHttpReqInfo); return returnStatus; #endif }
ANSC_STATUS CcspCwmpsoAddModifiedParameter ( ANSC_HANDLE hThisObject, char* pParamName, char* pParamValue, ULONG CwmpDataType, BOOL bConnectNow ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_SESSION_OBJECT pMyObject = (PCCSP_CWMP_SESSION_OBJECT)hThisObject; PCCSP_CWMP_ACS_CONNECTION_OBJECT pCcspCwmpAcsConnection = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)pMyObject->hCcspCwmpAcsConnection; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pMyObject->hCcspCwmpCpeController; PCCSP_CWMP_PROCESSOR_OBJECT pCcspCwmpProcessor = (PCCSP_CWMP_PROCESSOR_OBJECT)pMyObject->hCcspCwmpProcessor; ULONG i = 0; ULONG bExist = FALSE; CcspTr069PaTraceDebug(("AddModifiedParameter - '%s'\n", pParamName)); if ( pMyObject->ModifiedParamCount >= CCSP_CWMPSO_MAX_PARAM_NUMBER ) { CcspTr069PaFreeMemory(pParamName); return ANSC_STATUS_RESOURCES; } for ( i = 0; i < pMyObject->ModifiedParamCount; i++ ) { if ( pMyObject->ModifiedParamArray[i] ) { if ( AnscEqualString ( pParamName, pMyObject->ModifiedParamArray[i], TRUE ) ) { bExist = TRUE; if ( pMyObject->ModifiedParamValueArray[i] ) { CcspTr069PaFreeMemory(pMyObject->ModifiedParamValueArray[i]); } pMyObject->ModifiedParamValueArray[i] = CcspTr069PaCloneString(pParamValue); pMyObject->ModifiedParamTypeArray [i] = CwmpDataType; break; } } } if( !bExist) { pMyObject->ModifiedParamArray [pMyObject->ModifiedParamCount] = CcspTr069PaCloneString(pParamName); pMyObject->ModifiedParamValueArray[pMyObject->ModifiedParamCount] = CcspTr069PaCloneString(pParamValue); pMyObject->ModifiedParamTypeArray [pMyObject->ModifiedParamCount++] = CwmpDataType; } /* * Bin: We are supposed to add "ValueChange" event for passive notification as well. */ if ( TRUE ) { PCCSP_CWMP_EVENT pCcspCwmpEvent = (PCCSP_CWMP_EVENT)CcspTr069PaAllocateMemory(sizeof(CCSP_CWMP_EVENT)); if ( !pCcspCwmpEvent ) { return ANSC_STATUS_RESOURCES; } else { pCcspCwmpEvent->EventCode = CcspTr069PaCloneString(CCSP_CWMP_INFORM_EVENT_NAME_ValueChange); pCcspCwmpEvent->CommandKey = NULL; } returnStatus = pMyObject->AddCwmpEvent ( (ANSC_HANDLE)pMyObject, pCcspCwmpEvent, bConnectNow && pCcspCwmpCpeController->bBootInformSent ); } return returnStatus; }
ANSC_STATUS CcspCwmpStunmoRegGetStunInfo ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_STUN_MANAGER_OBJECT pMyObject = (PCCSP_CWMP_STUN_MANAGER_OBJECT )hThisObject; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pMyObject->hCcspCwmpCpeController; PCCSP_CWMP_STUN_INFO pCcspCwmpStunInfo = (PCCSP_CWMP_STUN_INFO )&pMyObject->CcspCwmpStunInfo; CCSP_STRING pValue; /* retrieve STUN settings from MS FC */ pCcspCwmpStunInfo->UDPConnectionRequestAddressNotificationLimit = 0; pCcspCwmpStunInfo->STUNEnable = CcspManagementServer_GetSTUNEnable ( pCcspCwmpCpeController->PANameWithPrefix ); pValue = CcspManagementServer_GetSTUNServerAddress ( pCcspCwmpCpeController->PANameWithPrefix ); AnscZeroMemory(pCcspCwmpStunInfo->STUNServerAddress, 257); if ( pValue ) { _ansc_strncpy(pCcspCwmpStunInfo->STUNServerAddress, pValue, 256); CcspTr069PaFreeMemory(pValue); } pCcspCwmpStunInfo->STUNServerPort = (USHORT)CcspManagementServer_GetSTUNServerPort ( pCcspCwmpCpeController->PANameWithPrefix ); pValue = CcspManagementServer_GetSTUNUsername ( pCcspCwmpCpeController->PANameWithPrefix ); AnscZeroMemory(pCcspCwmpStunInfo->STUNUsername, 257); if ( pValue ) { _ansc_strncpy(pCcspCwmpStunInfo->STUNUsername, pValue, 256); CcspTr069PaFreeMemory(pValue); } pValue = CcspManagementServer_GetSTUNPassword ( pCcspCwmpCpeController->PANameWithPrefix ); AnscZeroMemory(pCcspCwmpStunInfo->STUNPassword, 257); if ( pValue ) { _ansc_strncpy(pCcspCwmpStunInfo->STUNPassword, pValue, 256); CcspTr069PaFreeMemory(pValue); } pCcspCwmpStunInfo->STUNMaximumKeepAlivePeriod = CcspManagementServer_GetSTUNMaximumKeepAlivePeriod ( pCcspCwmpCpeController->PANameWithPrefix ); pCcspCwmpStunInfo->STUNMinimumKeepAlivePeriod = CcspManagementServer_GetSTUNMinimumKeepAlivePeriod ( pCcspCwmpCpeController->PANameWithPrefix ); pCcspCwmpStunInfo->NATDetected = CcspManagementServer_GetNATDetected ( pCcspCwmpCpeController->PANameWithPrefix ); return returnStatus; }
ANSC_STATUS CcspCwmpAcscoRemove ( ANSC_HANDLE hThisObject ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; PHTTP_BSP_INTERFACE pHttpBspIf = (PHTTP_BSP_INTERFACE )pMyObject->hHttpBspIf; PHTTP_ACM_INTERFACE pHttpAcmIf = (PHTTP_ACM_INTERFACE )pMyObject->hHttpAcmIf; PHTTP_SIMPLE_CLIENT_OBJECT pHttpClient = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient; pMyObject->Reset((ANSC_HANDLE)pMyObject); pMyObject->RemoveCookies(hThisObject); if( pMyObject->AcsUrl != NULL) { CcspTr069PaFreeMemory(pMyObject->AcsUrl); pMyObject->AcsUrl = NULL; } if( pMyObject->Username != NULL) { CcspTr069PaFreeMemory(pMyObject->Username); pMyObject->Username = NULL; } if( pMyObject->Password != NULL) { CcspTr069PaFreeMemory(pMyObject->Password); pMyObject->Password = NULL; } if ( pMyObject->AuthHeaderValue ) { CcspTr069PaFreeMemory(pMyObject->AuthHeaderValue); pMyObject->AuthHeaderValue = NULL; } if ( pHttpBspIf ) { CcspTr069PaFreeMemory(pHttpBspIf); pMyObject->hHttpBspIf = (ANSC_HANDLE)NULL; } if ( pHttpAcmIf ) { CcspTr069PaFreeMemory(pHttpAcmIf); pMyObject->hHttpAcmIf = (ANSC_HANDLE)NULL; } if( pHttpClient != NULL) { pHttpClient->Remove(pHttpClient); } AnscCoRemove((ANSC_HANDLE)pMyObject); return ANSC_STATUS_SUCCESS; }
ANSC_STATUS CcspCwmpAcscoRequest ( ANSC_HANDLE hThisObject, char* pSoapMessage, char* pMethodName, ULONG ulReqEnvCount, ULONG ulRepEnvCount ) { PCCSP_CWMP_ACS_CONNECTION_OBJECT pMyObject = (PCCSP_CWMP_ACS_CONNECTION_OBJECT)hThisObject; PHTTP_SIMPLE_CLIENT_OBJECT pHttpClient = (PHTTP_SIMPLE_CLIENT_OBJECT)pMyObject->hHttpSimpleClient; PCCSP_CWMP_SESSION_OBJECT pWmpSession = (PCCSP_CWMP_SESSION_OBJECT )pMyObject->hCcspCwmpSession; PCCSP_CWMP_CPE_CONTROLLER_OBJECT pCcspCwmpCpeController = (PCCSP_CWMP_CPE_CONTROLLER_OBJECT)pWmpSession->hCcspCwmpCpeController; PCCSP_CWMP_STAT_INTERFACE pCcspCwmpStatIf = (PCCSP_CWMP_STAT_INTERFACE)pCcspCwmpCpeController->hCcspCwmpStaIf; PCCSP_CWMP_CFG_INTERFACE pCcspCwmpCfgIf = (PCCSP_CWMP_CFG_INTERFACE)pCcspCwmpCpeController->hCcspCwmpCfgIf; PCCSP_CWMP_MCO_INTERFACE pCcspCwmpMcoIf = (PCCSP_CWMP_MCO_INTERFACE )pWmpSession->hCcspCwmpMcoIf; PHTTP_HFP_INTERFACE pHttpHfpIf = (PHTTP_HFP_INTERFACE)pHttpClient->GetHfpIf((ANSC_HANDLE)pHttpClient); PHTTP_CAS_INTERFACE pHttpCasIf = NULL; PHTTP_REQUEST_URI pHttpReqInfo = NULL; ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PANSC_ACS_INTERN_HTTP_CONTENT pHttpGetReq = &intHttpContent; BOOL bApplyTls = FALSE; PCHAR pRequestURL = NULL; PCHAR pTempString = NULL; PHTTP_AUTH_CLIENT_OBJECT pAuthClientObj = NULL; char pNewUrl[257] = { 0 }; ULONG uRedirect = 0; ULONG uMaxRedirect = 5; ULONG ulRpcCallTimeout= CCSP_CWMPSO_RPCCALL_TIMEOUT; /* If the response is 401 authentication required, we need to try again */ int nMaxAuthRetries = 2; if( pMyObject->AcsUrl == NULL || AnscSizeOfString(pMyObject->AcsUrl) <= 10 || pHttpHfpIf == NULL) { return ANSC_STATUS_NOT_READY; } AnscZeroMemory(pHttpGetReq, sizeof(ANSC_ACS_INTERN_HTTP_CONTENT)); CcspTr069PaTraceDebug(("CcspCwmpAcscoRequest -- AcsUrl = '%s'\n", pMyObject->AcsUrl)); pHttpCasIf = (PHTTP_CAS_INTERFACE)pHttpClient->GetCasIf((ANSC_HANDLE)pHttpClient); if ( pHttpCasIf != NULL) { if( pMyObject->Username == NULL || AnscSizeOfString(pMyObject->Username) == 0) { pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, FALSE); } else { pHttpCasIf->EnableAuth(pHttpCasIf->hOwnerContext, TRUE); pAuthClientObj = (PHTTP_AUTH_CLIENT_OBJECT)pHttpClient->GetClientAuthObj((ANSC_HANDLE)pHttpClient); if ( pAuthClientObj != NULL) { pAuthClientObj->SetAcmIf((ANSC_HANDLE)pAuthClientObj, (ANSC_HANDLE)pMyObject->hHttpAcmIf); } else { CcspTr069PaTraceError(("Failed to Get HttpAuthClient object.\n")); } } } #ifdef _DEBUG if ( !pSoapMessage ) { CcspTr069PaTraceDebug(("CPE Request:\n<EMPTY>\n")); } else if ( AnscSizeOfString(pSoapMessage) <= CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH ) { CcspTr069PaTraceDebug(("CPE Request:\n%s\n", pSoapMessage)); } else { char partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+1+8]; AnscCopyMemory(partSoap, pSoapMessage, CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH); partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH] = '\n'; partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+1] = '.'; partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+2] = '.'; partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+3] = '.'; partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+4] = '\n'; partSoap[CCSP_CWMP_TRACE_MAX_SOAP_MSG_LENGTH+5] = 0; CcspTr069PaTraceDebug(("CPE Request:\n%s\n", partSoap)); } #endif START: pRequestURL = pMyObject->AcsUrl; pHttpReqInfo = (PHTTP_REQUEST_URI)pHttpHfpIf->ParseHttpUrl ( pHttpHfpIf->hOwnerContext, pRequestURL, AnscSizeOfString(pRequestURL) ); if ( !pHttpReqInfo ) { return ANSC_STATUS_INTERNAL_ERROR; } pHttpReqInfo->Type = HTTP_URI_TYPE_ABS_PATH; /* init the request */ AnscZeroMemory(pHttpGetReq, sizeof(ANSC_ACS_INTERN_HTTP_CONTENT)); pHttpGetReq->bIsRedirect = FALSE; pHttpGetReq->SoapMessage = pSoapMessage; /* When there is more than one envelope in a single HTTP Request, * when there is a SOAP response in an HTTP Request, or when there is a * SOAP Fault response in an HTTP Request, the SOAPAction header in the * HTTP Request MUST have no value (with no quotes), indicating that this * header provides no information as to the intent of the message." */ if( ulReqEnvCount == 1 && ulRepEnvCount == 0) { pHttpGetReq->MethodName = pMethodName; } AnscInitializeEvent(&pHttpGetReq->CompleteEvent); while ( nMaxAuthRetries > 0 ) { CcspTr069PaTraceInfo(("ACS Request now at: %u\n", (unsigned int)AnscGetTickInSeconds())); if ( AnscEqualString2(pRequestURL, "https", 5, FALSE) ) { bApplyTls = TRUE; } else if ( AnscEqualString2(pRequestURL, "http", 4, FALSE) ) { if ( bIsComcastImage() ){ #ifdef _SUPPORT_HTTP CcspTr069PaTraceInfo(("HTTP request from ACS is supported\n")); bApplyTls = FALSE; #else CcspTr069PaTraceInfo(("TR-069 blocked unsecured traffic from ACS\n")); pHttpGetReq->CompleteStatus = ANSC_STATUS_NOT_SUPPORTED; pHttpGetReq->bUnauthorized = TRUE; pHttpGetReq->bIsRedirect = FALSE; break; #endif } else { bApplyTls = FALSE; } } else { pHttpGetReq->CompleteStatus = ANSC_STATUS_NOT_SUPPORTED; pHttpGetReq->bUnauthorized = FALSE; pHttpGetReq->bIsRedirect = FALSE; break; } if(pHttpGetReq->pContent != NULL) { CcspTr069PaFreeMemory(pHttpGetReq->pContent); pHttpGetReq->pContent = NULL; } pHttpGetReq->CompleteStatus = ANSC_STATUS_FAILURE; pHttpGetReq->bUnauthorized = FALSE; AnscResetEvent (&pHttpGetReq->CompleteEvent); returnStatus = pHttpClient->Request ( (ANSC_HANDLE)pHttpClient, (ULONG )HTTP_METHOD_CODE_POST, (ANSC_HANDLE)pHttpReqInfo, (ANSC_HANDLE)pHttpGetReq, bApplyTls ); if( returnStatus != ANSC_STATUS_SUCCESS) { CcspTr069PaTraceError(("ACS Request failed: returnStatus = %.X\n", (unsigned int)returnStatus)); break; } if ( pCcspCwmpCfgIf && pCcspCwmpCfgIf->GetCwmpRpcTimeout ) { ulRpcCallTimeout = pCcspCwmpCfgIf->GetCwmpRpcTimeout(pCcspCwmpCfgIf->hOwnerContext); if ( ulRpcCallTimeout < CCSP_CWMPSO_RPCCALL_TIMEOUT ) { ulRpcCallTimeout = CCSP_CWMPSO_RPCCALL_TIMEOUT; } } AnscWaitEvent(&pHttpGetReq->CompleteEvent, ulRpcCallTimeout * 1000); if ( pHttpGetReq->CompleteStatus == ANSC_STATUS_SUCCESS && pHttpGetReq->bUnauthorized && nMaxAuthRetries > 0 ) { CcspTr069PaTraceError(("ACS Request is not authenticated, try again.\n")); nMaxAuthRetries --; #ifdef _ANSC_USE_OPENSSL_ if( bApplyTls ) { if ( ANSC_STATUS_SUCCESS == CcspTr069PaSsp_GetTr069CertificateLocationForSyndication( &openssl_client_ca_certificate_files ) ) { openssl_load_ca_certificates( SSL_CLIENT_CALLS ); } } #endif /* _ANSC_USE_OPENSSL_ */ } else { CcspTr069PaTraceInfo(("ACS Request has completed with status code %lu, at %lu\n", pHttpGetReq->CompleteStatus, AnscGetTickInSeconds())); break; } } /* AnscResetEvent (&pHttpGetReq->CompleteEvent); */ AnscFreeEvent(&pHttpGetReq->CompleteEvent); CcspTr069PaFreeMemory(pHttpReqInfo); if ( pHttpGetReq->CompleteStatus != ANSC_STATUS_SUCCESS ) { if ( pHttpGetReq->CompleteStatus == ANSC_STATUS_RESET_SESSION ) { goto REDIRECTED; } else { returnStatus = pHttpGetReq->CompleteStatus; goto EXIT; } } else if( pHttpGetReq->bUnauthorized) { returnStatus = ANSC_STATUS_FAILURE; if( pCcspCwmpStatIf) { pCcspCwmpStatIf->IncTcpFailure(pCcspCwmpStatIf->hOwnerContext); } goto EXIT; } REDIRECTED: if( pHttpGetReq->bIsRedirect) { if( _ansc_strstr((PCHAR)pHttpGetReq->pContent, "http") == pHttpGetReq->pContent) { if ( pMyObject->AcsUrl ) CcspTr069PaFreeMemory(pMyObject->AcsUrl); pMyObject->AcsUrl = CcspTr069PaCloneString(pHttpGetReq->pContent); } else { /* if it's partial path */ pTempString = _ansc_strstr(pRequestURL, "//"); if( pTempString == NULL) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT; } pTempString += AnscSizeOfString("//"); pTempString = _ansc_strstr(pTempString, "/"); if( pTempString == NULL) { returnStatus = ANSC_STATUS_FAILURE; goto EXIT; } AnscCopyMemory(pNewUrl, pRequestURL, (ULONG)(pTempString - pRequestURL)); AnscCatString(pNewUrl, (PCHAR)pHttpGetReq->pContent); if ( pMyObject->AcsUrl ) CcspTr069PaFreeMemory(pMyObject->AcsUrl); pMyObject->AcsUrl = CcspTr069PaCloneString(pNewUrl); } uRedirect ++; if( uRedirect >= uMaxRedirect) { CcspTr069PaTraceDebug(("Maximum Redirection reached. Give up!\n")); returnStatus = ANSC_STATUS_FAILURE; goto EXIT; } else { CcspTr069PaTraceDebug(("Acs connection redirection #%u: '%s'\n", (unsigned int)uRedirect, pMyObject->AcsUrl)); /* in case redirected ACS challenges CPE again */ nMaxAuthRetries = 2; /* tear down current HTTP session before redirecting to new ACS, * otherwise, there might be case that ACS sends out redirection * response and immediately closes the socket, CWMP may be * confused by closing CWMP session prematurely. */ pHttpClient->DelAllWcsos((ANSC_HANDLE)pHttpClient); goto START; } } if(pWmpSession != NULL) { if( pHttpGetReq->ulContentSize > 0 && pHttpGetReq->pContent != NULL) { CcspTr069PaTraceDebug(("Response:\n%s\n", (char*)pHttpGetReq->pContent)); returnStatus = pWmpSession->RecvSoapMessage ( pWmpSession, (PCHAR)pHttpGetReq->pContent ); } else { CcspTr069PaTraceDebug(("Response: <EMPTY>\n")); returnStatus = pCcspCwmpMcoIf->NotifyAcsStatus ( pCcspCwmpMcoIf->hOwnerContext, TRUE, /* no more requests */ FALSE ); } } EXIT: if(pHttpGetReq->pContent != NULL) { CcspTr069PaFreeMemory(pHttpGetReq->pContent); pHttpGetReq->pContent = NULL; } /****************************************************************** GRACEFUL ROLLBACK PROCEDURES AND EXIT DOORS ******************************************************************/ return returnStatus; }