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; }
ANSC_HANDLE HttpSmpoUtilParseRequestLine ( ANSC_HANDLE hHttpSmpo, PVOID buffer, ULONG ulSize ) { PHTTP_SIMPLE_MSG_PARSER pMyObject; ANSC_HANDLE hResult; ULONG i; PHTTP_REQUEST_INFO pRequestInfo = NULL; PUCHAR pMethod, pUri, pVersion; ULONG ulMethod, ulUri, ulVersion; PUCHAR pBuf; PUCHAR pMsg; pMyObject = (PHTTP_SIMPLE_MSG_PARSER)hHttpSmpo; hResult = (ANSC_HANDLE)NULL; pMethod = NULL; pUri = NULL; pVersion = NULL; pBuf = (PUCHAR)buffer; /* skip possible leading spaces and tab */ for (i = 0; i < ulSize; i ++) { if (pBuf[i] != ' ') break; } pMethod = &pBuf[i]; pMsg = _ansc_strchr(pMethod, ' '); if (!pMsg) { return (ANSC_HANDLE)NULL; } ulMethod = (ULONG)(pMsg - pMethod); /* skip possible leading spaces and tab */ while (*pMsg == ' ') { pMsg ++; } pUri = pMsg; pMsg = _ansc_strchr(pUri, ' '); if (!pMsg) return (ANSC_HANDLE)NULL; ulUri = (ULONG)(pMsg - pUri); pMsg ++; pVersion = pMsg; ulVersion = ((PUCHAR)buffer + ulSize - pMsg); if (pMethod && pUri && pVersion) { pRequestInfo = (PHTTP_REQUEST_INFO)AnscAllocateMemory(sizeof(HTTP_REQUEST_INFO)); /* parse method */ pRequestInfo->Method = HttpSmpoUtilGetMethodId(pMethod, ulMethod); if (pMethod && ulMethod != 0) { ULONG ulNameLen = ulMethod; if (ulNameLen >= HTTP_MAX_METHOD_STR_SIZE) { ulNameLen = HTTP_MAX_METHOD_STR_SIZE - 1; } AnscCopyMemory(pRequestInfo->MethodName, pMethod, ulNameLen); pRequestInfo->MethodName[ulNameLen] = '\0'; } pRequestInfo->RequestUri.PathLevel = 1; pRequestInfo->MajorVersion = 1; pRequestInfo->MinorVersion = 0; /* parse version */ HttpSmpoUtilParseRequestLineVersion ( pVersion, ulVersion, &pRequestInfo->MajorVersion, &pRequestInfo->MinorVersion ); pRequestInfo->RequestUri.HostPort = HTTP_SERVER_PORT; /* parse URI */ HttpSmpoUtilParseRquestLineUri(hHttpSmpo, (ANSC_HANDLE)&pRequestInfo->RequestUri, pUri, ulUri); if (pRequestInfo->RequestUri.Type == HTTP_URI_TYPE_ASTERISK || pRequestInfo->RequestUri.Type == HTTP_URI_TYPE_RESERVED) { pRequestInfo->RequestUri.PathLevel = 0; } HttpSmpoUtilCopyHeaderString((PUCHAR)buffer, ulSize, pRequestInfo->StartLine, HTTP_MAX_START_LINE_SIZE); } return (ANSC_HANDLE)pRequestInfo; }
/********************************************************************** caller: owner of this object prototype: BOOL NSLookupDiagnostics_Validate ( ANSC_HANDLE hInsContext, char* pReturnParamName, ULONG* puLength ); description: This function is called to finally commit all the update. argument: ANSC_HANDLE hInsContext, The instance handle; char* pReturnParamName, The buffer (128 bytes) of parameter name if there's a validation. ULONG* puLength The output length of the param name. return: TRUE if there's no validation. **********************************************************************/ BOOL NSLookupDiagnostics_Validate ( ANSC_HANDLE hInsContext, char* pReturnParamName, ULONG* puLength ) { char* p = NULL; char* pDomainName = NULL; ULONG ulDNLength = DSLH_NS_MAX_STRING_LENGTH_Host; ULONG i = 0; PCOSA_DATAMODEL_DIAG pMyObject = (PCOSA_DATAMODEL_DIAG)g_pCosaBEManager->hDiag; PDSLH_NSLOOKUP_INFO pNSLookupDiagInfo = pMyObject->hDiagNSLookInfo; char* pAddrName = NULL; if ( !pNSLookupDiagInfo ) { return FALSE; } //COSAValidateHierarchyInterface doesn't work now due to incomplete lan device management if ( pNSLookupDiagInfo->DiagnosticState == DSLH_DIAG_STATE_TYPE_Requested || /*COSAValidateHierarchyInterface && */ AnscSizeOfString(pNSLookupDiagInfo->Interface) > 0 ) { // COSAValidateHierarchyInterface depends on the specific target if(AnscSizeOfString(pNSLookupDiagInfo->Interface) > 0) pAddrName = CosaGetInterfaceAddrByName(pNSLookupDiagInfo->Interface); else pAddrName = CosaGetInterfaceAddrByName("Device.DeviceInfo.X_COMCAST-COM_WAN_IP"); if(strcmp(pAddrName,"::") && (isValidIPv4Address(pAddrName) || isValidIPv6Address(pAddrName))) { AnscCopyString(pNSLookupDiagInfo->IfAddr, pAddrName); AnscFreeMemory(pAddrName); } else { AnscFreeMemory(pAddrName); AnscCopyString(pReturnParamName, "Interface"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } /* if ( !COSAValidateHierarchyInterface ( pNSLookupDiagInfo->Interface, DSLH_LAN_LAYER3_INTERFACE | DSLH_WAN_LAYER3_CONNECTION_INTERFACE | DSLH_NULL_STRING_INTERFACE )) { AnscCopyString(pReturnParamName, "Interface"); return FALSE; } */ } if ( pNSLookupDiagInfo->DiagnosticState == DSLH_DIAG_STATE_TYPE_Requested || AnscSizeOfString(pNSLookupDiagInfo->HostName) > 0 ) { p = pNSLookupDiagInfo->HostName; //check if there is any illegal character for(i = 0; i < AnscSizeOfString(p); i++) { if ( (p[i] >= '0' && p[i] <= '9') || (p[i] >= 'a' && p[i] <= 'z') || (p[i] >= 'A' && p[i] <= 'Z') || p[i] == '$' || p[i] == '-' || p[i] == '_' || p[i] == '.' || p[i] == '+' || p[i] == '!' || p[i] == '*' || p[i] == 39 || p[i] == '(' || p[i] == ')' || p[i] == ',' || p[i] == '"' ) { continue; } else { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } if ( pNSLookupDiagInfo->HostName[0] != '.') { p = _ansc_strstr(pNSLookupDiagInfo->HostName + 1, ".."); if ( p ) { for(; p < pNSLookupDiagInfo->HostName + AnscSizeOfString(pNSLookupDiagInfo->HostName); p++) { if ( *p != '.' ) { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } } } else { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } pDomainName = AnscAllocateMemory(DSLH_NS_MAX_STRING_LENGTH_Host); if ( !pDomainName ) { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } CosaGetParamValueString ( #ifndef DM_IGD "Device.DHCPv4.Server.Pool.1.DomainName", #else "InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.DomainName", #endif pDomainName, &ulDNLength ); if ( !AnscSizeOfString(pDomainName) ) { if ( pNSLookupDiagInfo->HostName[0] != '.') { p = _ansc_strchr(pNSLookupDiagInfo->HostName + 1, '.'); if ( !p ) { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } else if ( p[1] == '0' || p[1] == '.' ) { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } else { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } else { if ( pNSLookupDiagInfo->HostName[0] == '.') { AnscCopyString(pReturnParamName, "HostName"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } } if ( pNSLookupDiagInfo->DiagnosticState == DSLH_DIAG_STATE_TYPE_Requested || AnscSizeOfString(pNSLookupDiagInfo->DNSServer) > 0 ) { /* * if DNSServer is empty then we have to take default DNS Server value Device.DNS.Client.Server.1.DNSServer */ if ( 0 == AnscSizeOfString(pNSLookupDiagInfo->DNSServer) ) { parameterValStruct_t varStruct = { 0 }; UCHAR ucEntryNameValue[128] = { 0 }; UCHAR ucEntryParamName[128] = { 0 }; int ulEntryNameLen = 0; AnscCopyString( ucEntryParamName, "Device.DNS.Client.Server.1.DNSServer"); varStruct.parameterName = ucEntryParamName; varStruct.parameterValue = ucEntryNameValue; if ( ANSC_STATUS_SUCCESS == COSAGetParamValueByPathName( g_MessageBusHandle, &varStruct, &ulEntryNameLen ) ) { AnscCopyString( pNSLookupDiagInfo->DNSServer, varStruct.parameterValue ); } } //still not clear how to validate dns server // we are only validating if the server ip is v4/v6 if(!isValidIPv4Address(pNSLookupDiagInfo->DNSServer) && !isValidIPv6Address(pNSLookupDiagInfo->DNSServer)) { AnscCopyString(pReturnParamName, "DNSServer"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } if ( TRUE ) { if ( pNSLookupDiagInfo->Timeout < DSLH_NS_MIN_Timeout ) { AnscCopyString(pReturnParamName, "Timeout"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } if ( TRUE ) { if ( pNSLookupDiagInfo->NumberOfRepetitions < DSLH_NS_MIN_NumberOfRepetitions ) { AnscCopyString(pReturnParamName, "NumberOfRepetitions"); pNSLookupDiagInfo->DiagnosticState = DSLH_DIAG_STATE_TYPE_None; return FALSE; } } return TRUE; }