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;
}
Exemplo n.º 3
0
/**********************************************************************

    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;
}