@load base/frameworks/intel
@load ./where-locations
@load base/utils/addrs

event http_header(c: connection, is_orig: bool, name: string, value: string) &group="Intel::ADDR"
	{
	if ( ! is_orig )
		return;

	switch ( name )
		{
		case "HOST":
		# Remove the occasional port value that shows up here.
		local host = gsub(value, /:[[:digit:]]+$/, "");
		if ( is_valid_ip(host) )
			Intel::seen([$host=to_addr(host),
				     $indicator_type=Intel::ADDR,
				     $conn=c,
				     $where=HTTP::IN_HOST_HEADER]);
		break;

		case "X-FORWARDED-FOR":
		if ( is_valid_ip(value) )
			{
			local addrs = extract_ip_addresses(value);
			for ( i in addrs )
				{
				Intel::seen([$host=to_addr(addrs[i]),
				             $indicator_type=Intel::ADDR,
				             $conn=c,
				             $where=HTTP::IN_X_FORWARDED_FOR_HEADER]);
				}
			}
		break;
		}
	}

event http_header(c: connection, is_orig: bool, name: string, value: string) &group="Intel::DOMAIN"
	{
	if ( ! is_orig || name != "HOST" )
	    return;

	# Remove the occasional port value that shows up here.
	local host = gsub(value, /:[[:digit:]]+$/, "");
	if ( ! is_valid_ip(host) )
		Intel::seen([$indicator=host,
			     $indicator_type=Intel::DOMAIN,
			     $conn=c,
			     $where=HTTP::IN_HOST_HEADER]);
	}


event http_header(c: connection, is_orig: bool, name: string, value: string) &group="Intel::URL"
	{
	if ( ! is_orig || name != "REFERER" )
	    return;

	Intel::seen([$indicator=sub(value, /^.*:\/\//, ""),
	             $indicator_type=Intel::URL,
	             $conn=c,
	             $where=HTTP::IN_REFERRER_HEADER]);
	}

event http_header(c: connection, is_orig: bool, name: string, value: string) &group="Intel::SOFTWARE"
	{
	if ( ! is_orig || name != "USER-AGENT" )
	    return;

	Intel::seen([$indicator=value,
	             $indicator_type=Intel::SOFTWARE,
	             $conn=c,
	             $where=HTTP::IN_USER_AGENT_HEADER]);
	}
