static ULONG AnscGetIanaTypeByName ( PANSC_UTILBOX_IANA_MEDIA pSet, ULONG ulCount, PUCHAR pName, ULONG ulNameLen ) { ULONG Type = 0; ULONG i; PANSC_UTILBOX_IANA_MEDIA pInfo; if (!pName || ulNameLen == 0) { return 0; } for (i = 0; i < ulCount; i ++) { pInfo = (PANSC_UTILBOX_IANA_MEDIA)&pSet[i]; if ( pInfo->Name == NULL || (ulNameLen == AnscSizeOfString(pInfo->Name) && AnscEqualString2(pName, pInfo->Name, ulNameLen, FALSE)) ) { return pInfo->Type; } } return 0; }
BOOL Bmc2ComeoSoaIsBuiltInObject ( ANSC_HANDLE hThisObject, char* obj_name ) { PBMC2_PEC_INTERFACE pBmc2PecIf = (PBMC2_PEC_INTERFACE)hThisObject; ULONG i; ULONG ulLen; ULONG ulObjNameLen = obj_name ? AnscSizeOfString(obj_name) : 0; PUCHAR pObjName; for (i = 0; i < sizeof(s_Bmc2BuiltinObjs)/sizeof(s_Bmc2BuiltinObjs[0]); i ++) { pObjName = (PUCHAR)s_Bmc2BuiltinObjs[i]; ulLen = AnscSizeOfString(pObjName); if ( ulObjNameLen != ulLen ) { continue; } if ( AnscEqualString2(obj_name, pObjName, ulLen, TRUE) ) { return TRUE; } } return FALSE; }
static char* Bmc2EnvcoFindSubStrNoCase ( char* pString, char* pSub ) { int i, nStringLen, nSubLen; if ( !pString || !pSub ) { return NULL; } nStringLen = AnscSizeOfString(pString); nSubLen = AnscSizeOfString(pSub); for ( i = 0; i <= nStringLen - nSubLen; i ++ ) { if ( AnscEqualString2(pString+i, pSub, nSubLen, FALSE) ) { return pString+i; } } return NULL; }
ANSC_STATUS SlapBmc2OutoMoveCursor ( ANSC_HANDLE hThisObject, char* pWhere /* UP/DOWN/LEFT/RIGHT/HOME/END */ ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PSLAP_BMC2_OUTPUT_OBJECT pMyObject = (PSLAP_BMC2_OUTPUT_OBJECT)hThisObject; char* pCmd = NULL; char* pCmd2 = NULL; int nSizeWhere = AnscSizeOfString(pWhere); if ( nSizeWhere == 2 && AnscEqualString2(pWhere, "UP", 2, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_Cursor_Up; } else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "DOWN", 4, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_Cursor_Down; } else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "LEFT", 4, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_Cursor_Backward; } else if ( nSizeWhere == 5 && AnscEqualString2(pWhere, "RIGHT", 5, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_Cursor_Forward; } else if ( nSizeWhere == 4 && AnscEqualString2(pWhere, "HOME", 4, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_ANSI_Cursor_Home; pCmd2 = TELNET_ANSI_TTY_CODE_VT100_Cursor_Home; } else if ( nSizeWhere == 3 && AnscEqualString2(pWhere, "END", 3, FALSE) ) { pCmd = TELNET_ANSI_TTY_CODE_ANSI_Cursor_End; pCmd2 = TELNET_ANSI_TTY_CODE_VT100_Cursor_End; } if ( pCmd != NULL ) { returnStatus = pMyObject->Write((ANSC_HANDLE)pMyObject, pCmd); } if ( pCmd2 != NULL ) { returnStatus = pMyObject->Write((ANSC_HANDLE)pMyObject, pCmd2); } return returnStatus; }
BOOL BwrmEcoRamIsPageCachedForced ( ANSC_HANDLE hThisObject, char* page_path ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBWRM_ENV_CONTROLLER_OBJECT pMyObject = (PBWRM_ENV_CONTROLLER_OBJECT )hThisObject; PBWRM_ENV_CONTROLLER_PROPERTY pProperty = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property; PSINGLE_LINK_ENTRY pSLinkEntry = (PSINGLE_LINK_ENTRY )NULL; PBWRM_ENV_CACHE_FORCED_PAGE pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)NULL; BOOL bForced = FALSE; ULONG ulLen = AnscSizeOfString(page_path); AnscAcquireLock(&pMyObject->AccessLock); pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->ForcedCachedPages); while ( pSLinkEntry ) { pCacheForcedPage = ACCESS_BWRM_ENV_CACHE_FORCED_PAGE(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( ulLen == AnscSizeOfString(pCacheForcedPage->PagePath) && AnscEqualString2(pCacheForcedPage->PagePath, page_path, ulLen, FALSE) ) { bForced = TRUE; break; } } AnscReleaseLock(&pMyObject->AccessLock); return bForced; }
ULONG AnscIsvpGetIdByString ( const ANSC_ID_STRING_PAIR pIsvp[], ULONG ulIsvpLen, PUCHAR pStr, ULONG ulStrLen, BOOL bCaseSensitive, ULONG ulUnmappedValue ) { ULONG i; for (i = 0; i < ulIsvpLen; i ++) { if (AnscSizeOfString(pIsvp[i].string) == ulStrLen && AnscEqualString2(pIsvp[i].string, pStr, ulStrLen, bCaseSensitive)) { return pIsvp[i].id; } } return ulUnmappedValue; }
char* HttpBmoGetHeaderValueByName2 ( ANSC_HANDLE hThisObject, char* name, ULONG ulIndex ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PHTTP_BASIC_MESSAGE_OBJECT pMyObject = (PHTTP_BASIC_MESSAGE_OBJECT )hThisObject; PHTTP_HFP_INTERFACE pHfpIf = (PHTTP_HFP_INTERFACE )pMyObject->hHfpIf; #ifndef _CCSP_CWMP_TCP_CONNREQ_HANDLER PHTTP_HELPER_CONTAINER_OBJECT pHttpHco = (PHTTP_HELPER_CONTAINER_OBJECT)pMyObject->hContainerContext; #endif PHTTP_HEADER_FIELD pHttpHfo = NULL; char* pHttpHfValue = NULL; char* pHttpHfColon = NULL; PSINGLE_LINK_ENTRY pSLinkEntry = NULL; ULONG ulHeaderId = HTTP_HEADER_ID_RESERVED; ULONG i = 0; ULONG ulCount = 0; ulHeaderId = #ifdef _CCSP_CWMP_TCP_CONNREQ_HANDLER AnscHttpGetHeaderCode(name); #else pHttpHco->GetHeaderId ( (ANSC_HANDLE)pHttpHco, name ); #endif if ( ulHeaderId != HTTP_HEADER_ID_RESERVED ) { return pMyObject->GetHeaderValueById2((ANSC_HANDLE)pMyObject, ulHeaderId, ulIndex); } AnscAcquireLock(&pMyObject->HfoTableLock); for ( i = 0; i < HTTP_BMO_HFO_TABLE_SIZE; i++ ) { pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->HfoTable[i]); while ( pSLinkEntry ) { pHttpHfo = ACCESS_HTTP_HEADER_FIELD(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( !(pHttpHfo->Flags & HTTP_FIELD_FLAG_LINE_PRESENT) ) { continue; } else if ( AnscSizeOfString(pHttpHfo->HeaderLine) < AnscSizeOfString(name) ) { continue; } else { pHttpHfColon = _ansc_strchr(pHttpHfo->HeaderLine, ':'); } if ( !pHttpHfColon ) { continue; } else if ( ((ULONG)pHttpHfColon - (ULONG)pHttpHfo->HeaderLine) != AnscSizeOfString(name) ) { continue; } else if ( AnscEqualString2 ( pHttpHfo->HeaderLine, name, AnscSizeOfString(name), FALSE ) ) { if ( ulCount != ulIndex ) { ulCount ++; continue; } AnscReleaseLock(&pMyObject->HfoTableLock); AnscHttpGetHfValue(pHttpHfo->HeaderLine, AnscSizeOfString(pHttpHfo->HeaderLine), pHttpHfValue); return pHttpHfValue; } } } AnscReleaseLock(&pMyObject->HfoTableLock); return NULL; }
BOOL HttpSmpoUtilParseAbsoluteURI ( ANSC_HANDLE hHttpSmpo, ANSC_HANDLE hRequestUri, PUCHAR pBuf, ULONG ulSize ) { /* absoluteURI = scheme ":" *( uchar | reserved ) */ PHTTP_REQUEST_URI pUri = (PHTTP_REQUEST_URI)hRequestUri; PUCHAR pScheme = pBuf; PUCHAR pNext; ULONG ulLen; BOOL bHttp = FALSE; USHORT usPort = 0; PUCHAR pHost; PUCHAR pLast = pBuf + ulSize - 1; pNext = _ansc_memchr(pBuf, HTTP_SMPO_CHAR_COLON, ulSize); if (!pNext) { return FALSE; } pHost = pNext + 1; ulLen = pNext - pBuf; if ( ulLen == HTTP_SMPO_PROTOCOL_HTTPS_LENGTH && AnscEqualString2(pScheme, HTTP_SMPO_PROTOCOL_HTTPS, HTTP_SMPO_PROTOCOL_HTTPS_LENGTH, FALSE) ) { pUri->Flag |= HTTP_URI_FLAG_HTTPS; bHttp = TRUE; usPort = HTTPS_PORT; } else if ( ulLen == 4 && AnscEqualString2(pScheme, "http", 4, FALSE) ) { bHttp = TRUE; usPort = HTTP_PORT; } pNext = _ansc_memchr(pBuf, HTTP_SMPO_CHAR_SLASH, pNext - pScheme); if (pNext) { /* scheme name shouldn't have slash in it */ return FALSE; } pUri->Type = HTTP_URI_TYPE_ABSOLUTE_URI; HttpSmpoUtilCopyHeaderString(pBuf, ulSize, pUri->HostName, ANSC_DOMAIN_NAME_SIZE); if (bHttp) { PUCHAR pLast = pBuf + ulSize - 1; pUri->HostPort = usPort; pNext = pHost; if ( *(pNext + 1) == HTTP_SMPO_CHAR_SLASH ) { pHost = pNext + 2; } if (pHost) { BOOL bPath = TRUE; PUCHAR pPort; PUCHAR pHostEnd = NULL; pNext = _ansc_memchr(pHost, HTTP_SMPO_CHAR_SLASH, pLast - pHost + 1); if (!pNext) { pNext = _ansc_memchr(pHost, HTTP_SMPO_CHAR_SPACE, pLast - pHost + 1); bPath = FALSE; pHostEnd = pLast; } else { pHostEnd = pNext - 1; } if (TRUE) { if (bPath && pNext) { HttpSmpoUtilParseAbsPath(hHttpSmpo, hRequestUri, pNext, pLast - pNext + 1); pUri->Type = HTTP_URI_TYPE_ABSOLUTE_URI; } else { pUri->PathArray[0][0] = '/'; pUri->PathArray[0][1] = 0; } if (pNext) { pPort = _ansc_memchr(pHost, HTTP_SMPO_CHAR_COLON, pNext - pHost); } else { pPort = _ansc_memchr(pHost, HTTP_SMPO_CHAR_COLON, pHostEnd - pHost + 1); } if (pPort) { pUri->HostPort = _ansc_atoi(pPort + 1); } else { pUri->HostPort = usPort; } HttpSmpoUtilCopyHeaderString ( pHost, pPort ? (pPort - pHost) : ( pNext ? (pNext - pHost) : (pLast - pHost + 1) ), pUri->HostName, ANSC_DOMAIN_NAME_SIZE ); } } } return TRUE; }
ANSC_STATUS BwrmEcoRamForcePageCache ( ANSC_HANDLE hThisObject, char* page_path, BOOL bCachedForced ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBWRM_ENV_CONTROLLER_OBJECT pMyObject = (PBWRM_ENV_CONTROLLER_OBJECT )hThisObject; PBWRM_ENV_CONTROLLER_PROPERTY pProperty = (PBWRM_ENV_CONTROLLER_PROPERTY)&pMyObject->Property; PSINGLE_LINK_ENTRY pSLinkEntry = (PSINGLE_LINK_ENTRY )NULL; PBWRM_ENV_CACHE_FORCED_PAGE pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)NULL; BOOL bFound = FALSE; ULONG ulLen = AnscSizeOfString(page_path); AnscAcquireLock(&pMyObject->AccessLock); pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->ForcedCachedPages); while ( pSLinkEntry ) { pCacheForcedPage = ACCESS_BWRM_ENV_CACHE_FORCED_PAGE(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( ulLen == AnscSizeOfString(pCacheForcedPage->PagePath) && AnscEqualString2(pCacheForcedPage->PagePath, page_path, ulLen, FALSE) ) { bFound = TRUE; break; } } if ( bFound && !bCachedForced ) { /* remove it from the list */ AnscQueuePopEntryByLink(&pMyObject->ForcedCachedPages, &pCacheForcedPage->Linkage); } else if ( bCachedForced && !bFound ) { pCacheForcedPage = (PBWRM_ENV_CACHE_FORCED_PAGE)AnscAllocateMemory(sizeof(BWRM_ENV_CACHE_FORCED_PAGE)); if ( pCacheForcedPage ) { pCacheForcedPage->PagePath = AnscCloneString(page_path); if ( pCacheForcedPage->PagePath ) { AnscQueuePushEntry(&pMyObject->ForcedCachedPages, &pCacheForcedPage->Linkage); } else { BwrmEnvRemoveCacheForcedPage(pCacheForcedPage); } } } AnscReleaseLock(&pMyObject->AccessLock); return returnStatus; }
ANSC_HANDLE Bmc2EnvcoDelCommandProperty ( ANSC_HANDLE hThisObject, char* pCommandName, char* pDomainNamePattern ) { ANSC_STATUS returnStatus = ANSC_STATUS_SUCCESS; PBMC2_ENV_CONTROLLER_OBJECT pMyObject = (PBMC2_ENV_CONTROLLER_OBJECT )hThisObject; PBMC2_ENV_CONTROLLER_PROPERTY pProperty = (PBMC2_ENV_CONTROLLER_PROPERTY)&pMyObject->Property; PBMC2_COMMAND_PROPERTY pBmc2CommandProperty = (PBMC2_COMMAND_PROPERTY )NULL; PSINGLE_LINK_ENTRY pSLinkEntry = (PSINGLE_LINK_ENTRY )NULL; ULONG ulHashIndex = AnscHashString(pCommandName, AnscSizeOfString(pCommandName), BMC2_ENVCO_COMPO_TABLE_SIZE); PBMC2_COMMAND_PROPERTY pBmc2CommandRef = (PBMC2_COMMAND_PROPERTY )NULL; AnscAcquireLock(&pMyObject->CompoTableLock); pSLinkEntry = AnscQueueGetFirstEntry(&pMyObject->CompoTable[ulHashIndex]); while ( pSLinkEntry ) { pBmc2CommandProperty = ACCESS_BMC2_COMMAND_PROPERTY(pSLinkEntry); pSLinkEntry = AnscQueueGetNextEntry(pSLinkEntry); if ( AnscEqualString ( pBmc2CommandProperty->CommandName, pCommandName, FALSE ) ) { BOOL bDomainMatched = FALSE; /* check if the specified domain matches pattern defined in command property */ if ( !pDomainNamePattern && !pBmc2CommandProperty->DomainNamePattern ) { bDomainMatched = TRUE; } else if ( !pDomainNamePattern && pBmc2CommandProperty->DomainNamePattern ) { if ( AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE) ) { bDomainMatched = TRUE; } } else if ( !pBmc2CommandProperty->DomainNamePattern || AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE) ) { if ( !pDomainNamePattern || AnscEqualString(pDomainNamePattern, "*", TRUE) ) { bDomainMatched = TRUE; } } else { ULONG ulDNLen = AnscSizeOfString(pBmc2CommandProperty->DomainNamePattern); ULONG ulCmdDNLen = AnscSizeOfString(pDomainNamePattern); ULONG ulCmpLen = (ulDNLen > ulCmdDNLen) ? ulCmdDNLen : ulDNLen; if ( !pBmc2CommandRef && AnscEqualString2(pDomainNamePattern, pBmc2CommandProperty->DomainNamePattern, ulCmpLen, FALSE) ) { pBmc2CommandRef = pBmc2CommandProperty; } else if ( !pBmc2CommandRef && (!pBmc2CommandProperty->DomainNamePattern || AnscEqualString(pBmc2CommandProperty->DomainNamePattern, "*", TRUE)) ) { pBmc2CommandRef = pBmc2CommandProperty; } else { BOOL bEndWithStar = (pBmc2CommandProperty->DomainNamePattern[ulDNLen - 1] == '*'); if ( bEndWithStar && AnscEqualString2(pDomainNamePattern, pBmc2CommandProperty->DomainNamePattern, ulDNLen - 1, FALSE) ) { pBmc2CommandRef = pBmc2CommandProperty; } } bDomainMatched = AnscEqualString ( pBmc2CommandProperty->DomainNamePattern, pDomainNamePattern, FALSE ); } if ( !bDomainMatched ) { continue; } AnscQueuePopEntryByLink(&pMyObject->CompoTable[ulHashIndex], &pBmc2CommandProperty->Linkage); AnscReleaseLock(&pMyObject->CompoTableLock); Bmc2FreeCommandProperty(pBmc2CommandProperty); return (ANSC_HANDLE)NULL; } } AnscReleaseLock(&pMyObject->CompoTableLock); return (ANSC_HANDLE)pBmc2CommandRef; }
void AnscTrace3 ( char* pTraceId, char* pDebugStr, ... ) { BOOL bTraceIdMatched = FALSE; ULONG ulTraceIdCount = sizeof(g_tTraceIdTable) / sizeof(char*); ULONG i = 0; if ( g_bSelectTraceId ) { for ( i = 0; i < ulTraceIdCount; i++ ) { if ( (AnscSizeOfString(pTraceId) >= AnscSizeOfString(g_tTraceIdTable[i]))&& AnscEqualString2 ( pTraceId, g_tTraceIdTable[i], AnscSizeOfString(g_tTraceIdTable[i]), FALSE ) ) { bTraceIdMatched = TRUE; break; } } } else { bTraceIdMatched = TRUE; } if ( bTraceIdMatched ) { char* pTempChar = (char*)AnscAllocateMemory(1024); va_list val; if ( !pTempChar ) { return; } else { va_start(val, pDebugStr); _ansc_vsprintf(pTempChar, pDebugStr, val); va_end(val); } #ifdef _ANSC_KERNEL KernelTrace(pTempChar); #else UserTrace (pTempChar); #endif AnscFreeMemory(pTempChar); } return; }
/********************************************************************** 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 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; }