Exemple #1
0
BOOL StringChunk_Match_NoWildCard(StringChunk	*dl,
								  const char	*Str,
								  int			*HashValue,
								  char			**Data
								  )
{
	EntryForString *FoundEntry;

	const char *FoundString;

	FoundEntry = HashTable_Get(&(dl -> List_Pos), Str, 0, NULL, HashValue);
	while( FoundEntry != NULL )
	{
		FoundString = StringList_GetByOffset(&(dl -> List),
											 FoundEntry -> OffsetOfString
											 );
		if( strcmp(FoundString, Str) == 0 )
		{
			if( FoundEntry -> OffsetOfData >=0 && Data != NULL )
			{
				*Data = ExtendableBuffer_GetPositionByOffset(
												&(dl -> AdditionalDataChunk),
												FoundEntry -> OffsetOfData
												);
			}

			return TRUE;
		}

		FoundEntry = HashTable_Get(&(dl -> List_Pos), Str, 0, FoundEntry, HashValue);
	}

	return FALSE;

}
Exemple #2
0
void ShowNormalMassage(ThreadContext *Context, int32_t Offset, char ProtocolCharacter)
{
	char DateAndTime[32];
	char InfoBuffer[1024];

	if( ShowMassages == TRUE || DEBUGMODE )
	{
		GetCurDateAndTime(DateAndTime, sizeof(DateAndTime));

		InfoBuffer[0] = '\0';
		GetAllAnswers(ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, Offset), InfoBuffer, sizeof(InfoBuffer));
	}

	if( ShowMassages == TRUE )
	{
		printf("%s[%c][%s][%s][%s] : %d bytes\n%s",
			  DateAndTime,
			  ProtocolCharacter,
			  Context -> ClientIP,
			  DNSGetTypeName(Context -> RequestingType),
			  Context -> RequestingDomain,
			  ExtendableBuffer_GetUsedBytes(Context -> ResponseBuffer) - Offset,
			  InfoBuffer
			  );
	}

	DEBUG_FILE("[%c][%s][%s][%s] :%d bytes\n%s",
			   ProtocolCharacter,
			   Context -> ClientIP,
			   DNSGetTypeName(Context -> RequestingType),
			   Context -> RequestingDomain,
			   ExtendableBuffer_GetUsedBytes(Context -> ResponseBuffer) - Offset,
			   InfoBuffer
			   );
}
Exemple #3
0
static const char *Hosts_FindFromContainer(HostsContainer *Container, StringChunk *SubContainer, const char *Name)
{
	OffsetOfHosts *IP;

	if( StringChunk_Match(SubContainer, Name, NULL, (char **)&IP) == TRUE )
	{
		return ExtendableBuffer_GetPositionByOffset(&(Container -> IPs), IP -> Offset);
	} else {
		return NULL;
	}
}
Exemple #4
0
static int32_t Hosts_IdenticalToLast(HostsContainer	*Container,
										HostsRecordType	CurrentType,
										const char		*CurrentContent,
										int				CurrentLength
										)
{
	static HostsContainer *LastContainer = NULL;
	static HostsRecordType LastType = HOSTS_TYPE_UNKNOWN;
	static int32_t LastOffset = 0;
	static int32_t LastLength = 0;

	if( LastContainer == NULL || LastContainer != Container )
	{
		LastContainer = Container;
		LastType = CurrentType;
		LastOffset = 0;
		LastLength = CurrentLength;
		return -1;
	}

	if( LastType == HOSTS_TYPE_UNKNOWN )
	{
		LastType = CurrentType;
		LastOffset = 0;
		LastLength = CurrentLength;
		return -1;
	}

	if( LastType == CurrentType )
	{
		if( memcmp(ExtendableBuffer_GetPositionByOffset(&(Container -> IPs), LastOffset),
					CurrentContent,
					CurrentLength
					) == 0
			)
		{
			return LastOffset;
		} else {
			LastOffset += LastLength;
			LastLength = CurrentLength;
			return -1;
		}
	} else {
		LastType = CurrentType;
		LastOffset += LastLength;
		LastLength = CurrentLength;
		return -1;
	}

}
Exemple #5
0
BOOL StringChunk_Match_OnlyWildCard(StringChunk	*dl,
									const char	*Str,
									char		**Data
									)
{
	EntryForString *FoundEntry;

	const char *FoundString;

	int loop;

	for( loop = 0; loop != Array_GetUsed(&(dl -> List_W_Pos)); ++loop )
	{
		FoundEntry = (EntryForString *)Array_GetBySubscript(&(dl -> List_W_Pos), loop);
		if( FoundEntry != NULL )
		{
			FoundString = StringList_GetByOffset(&(dl -> List_W), FoundEntry -> OffsetOfString);
			if( WILDCARD_MATCH(FoundString, Str) == WILDCARD_MATCHED )
			{
				if( FoundEntry -> OffsetOfData >=0 && Data != NULL )
				{
					*Data = ExtendableBuffer_GetPositionByOffset(
													&(dl -> AdditionalDataChunk),
													FoundEntry -> OffsetOfData
													);
				}
				return TRUE;
			}

		} else {
			return FALSE;
		}
	}

	return FALSE;
}
Exemple #6
0
static int QueryFromServer(ThreadContext *Context)
{
	char		ProtocolCharacter;

	int			StateOfReceiving;

	SOCKET		*SocketUsed;

	DNSQuaryProtocol	ProtocolUsed;

	struct	sockaddr	*ServerAddr;
	int					NumberOfAddresses;

	sa_family_t	Family;

	BOOL		UseSecondary;

	int32_t	StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer);

	int			AnswerCount;

	/* Determine whether the secondaries are used */
	if( NullSecondary != TRUE &&
		(IsExcludedDomain(Context -> RequestingDomain, &(Context -> RequestingDomainHashValue)) ||
		GfwList_Match(Context -> RequestingDomain, &(Context -> RequestingDomainHashValue)))
		 )
	{
		UseSecondary = TRUE;
	} else {
		UseSecondary = FALSE;
	}

	SelectSocketAndProtocol(Context, &SocketUsed, &ProtocolUsed, UseSecondary);

	SetAddressAndPrococolLetter(Context,
								ProtocolUsed,
								&ServerAddr,
								&NumberOfAddresses,
								&Family,
								&ProtocolCharacter
								);

	StateOfReceiving = QueryFromServerBase(SocketUsed,
										   ServerAddr,
										   NumberOfAddresses,
										   ProtocolUsed,
										   Context -> RequestEntity,
										   Context -> RequestLength,
										   Context -> ResponseBuffer,
										   Context -> RequestingDomain
										   );

	if(StateOfReceiving < 0) /* Failed */
	{
		ShowErrorMassage(Context, ProtocolCharacter);

		/* Move pointer to the next */
		AddressChunk_Advance(&Addresses, ProtocolUsed);

		if( UseSecondary == FALSE && NullSecondary != TRUE && AllowFallBack == TRUE )
		{
			INFO("Fallback from %c for %s .\n",
				 ProtocolCharacter,
				 Context -> RequestingDomain
				 );

			SelectSocketAndProtocol(Context,
									&SocketUsed,
									&ProtocolUsed,
									TRUE
									);

			SetAddressAndPrococolLetter(Context,
										ProtocolUsed,
										&ServerAddr,
										&NumberOfAddresses,
										&Family,
										&ProtocolCharacter
										);

			StateOfReceiving = QueryFromServerBase(SocketUsed,
												   ServerAddr,
												   NumberOfAddresses,
												   ProtocolUsed,
												   Context -> RequestEntity,
												   Context -> RequestLength,
												   Context -> ResponseBuffer,
												   Context -> RequestingDomain
												   );

			if( StateOfReceiving < 0 )
			{
				ShowErrorMassage(Context, ProtocolCharacter);

				/* Move pointer to the next */
				AddressChunk_Advance(&Addresses, ProtocolUsed);

				return QUERY_RESULT_ERROR;
			}
		} else {
			return QUERY_RESULT_ERROR;
		}
	}

	AnswerCount = DNSGetAnswerCount(ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset));

	if( AnswerCount < 1 )
	{
		AddressChunk_Advance(&Addresses, ProtocolUsed);
	}

	ShowNormalMassage(Context, StartOffset, ProtocolCharacter);


	return StateOfReceiving;

}
Exemple #7
0
static int Hosts_RecursivelyQuery(const char *IPOrCName, int *AnswerCount, ThreadContext *Context)
{
	int		PrependLength = 2 + 2 + 2 + 4 + 2 + strlen(IPOrCName) + 2;
	BOOL	OriCompress = Context -> Compress;

	int		State;

	int		StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer);
	char	*StartPos;
	int		EndOffset;
	const char	*AnswerPos;
	int		MoreSpaceNeeded = 0;

	char	*HereSaved;

	HereSaved = ExtendableBuffer_Expand(Context -> ResponseBuffer, PrependLength, NULL);
	if( HereSaved == NULL )
	{
		return -1;
	}

	Context -> Compress = FALSE;

	DNSGenResourceRecord(HereSaved + 1, INT_MAX, "", DNS_TYPE_CNAME, DNS_CLASS_IN, 60, IPOrCName, strlen(IPOrCName) + 1, TRUE);

	HereSaved[0] = 0xC0;
	HereSaved[1] = 0x0C;

	StartOffset = ExtendableBuffer_GetEndOffset(Context -> ResponseBuffer);

	State = GetAnswersByName(Context, IPOrCName, Context -> RequestingType, "CNameRedirect");
	if( State < 0 )
	{
		Context -> Compress = OriCompress;
		return -1;
	}

	StartPos = ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset);

	EndOffset = DNSJumpOverAnswerRecords(StartPos) - ExtendableBuffer_GetData(Context -> ResponseBuffer);

	(*AnswerCount) = (int)DNSGetAnswerCount(StartPos) + 1;

	ExtendableBuffer_Eliminate(Context -> ResponseBuffer, EndOffset, StartOffset + State - EndOffset);

	MoreSpaceNeeded = DNSExpandCName_MoreSpaceNeeded(StartPos);
	if( ExtendableBuffer_Expand(Context -> ResponseBuffer, MoreSpaceNeeded, NULL) == NULL )
	{
		Context -> Compress = OriCompress;
		return -1;
	}

	EndOffset += MoreSpaceNeeded;

	StartPos = ExtendableBuffer_GetPositionByOffset(Context -> ResponseBuffer, StartOffset);

	DNSExpandCName(StartPos);

	AnswerPos = DNSJumpOverQuestionRecords(StartPos);

	ExtendableBuffer_Eliminate(Context -> ResponseBuffer, StartOffset, AnswerPos - StartPos);

	Context -> Compress = OriCompress;
	return EndOffset - StartOffset - (AnswerPos - StartPos) + PrependLength;
}