inc/dns.inc.php
author rejo
Tue, 10 Jul 2007 21:24:06 +0000
changeset 37 b785e54690ce
parent 16 79b09e1e2985
child 47 ae140472d97c
permissions -rwxr-xr-x
[feladat @ 84] Bugfix. The function zone_count() now also counts zones an owner has only partial access to, not just those zones the owner has full access to. This fixes just the count, the zones a user has partial access to are not (yet!) shown in the "list zones" page. Bugfix. In the zone listing the "edit" button is now show for users with access level 1. Untill now they were presented an overview of the zones they could change, but there was no link for them to actually edit the zone. Bugfix. Some of the buttons in the "edit zone" interface that are of no use to a user with access level 1 have been hidden. Bugfix. Make sure a user with access level 1 with only partial access to a zone cannot add new records to that zone. Only the zone owner should be able to add new record. Bugfix. If a user with access level 1 edits a record in a zone he has only partial access to, an error was shown because of call to a non- existing function in the PEAR:MDB2. This bug was most likely introduced while migrating from PEAR:DB to PEAR:MDB2. Bugfix. A user with access level 1 was able to delete all records of a zone he has only partial access to. Some additional checks have been added. Bugfix. If a user with accees level 1 has partial access to one or more zones starting with a certain character, but did not own at least one entire zone starting with the same character, the character wasn't clickable in the "list zone" page. Interface. If no record or zone id is given for delete_record.php or delete_domain.php, don't just die but echo a nice message. The i18n files have not yet been updated to reflect this change. Interface. If no master IP is given in delete_supermaster.php, don't just die but echo a nice message. The i18n files have not yet been updated to reflect this change. [All fixes by Peter Beernink.]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     1
<?
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     2
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     3
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     4
 * Validates an IPv4 IP.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     5
 * returns true if valid.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     6
 */
16
79b09e1e2985 [feladat @ 63]
rejo
parents: 12
diff changeset
     7
function validate_input($zoneid, $type, &$content, &$name, &$prio, &$ttl)
1
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     8
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
     9
	global $db;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    10
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    11
	// Has to validate content first then it can do the rest
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    12
	// Since if content is invalid already it can aswell be just removed
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    13
	// Check first if content is IPv4, IPv6 or Hostname
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    14
	// We accomplish this by just running all tests over it
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    15
	// We start with IPv6 since its not able to have these ip's in domains.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    16
	//
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    17
	// <TODO>
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    18
	// The nocheck has to move to the configuration file
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    19
	// </TODO>
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    20
	//
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    21
	$domain = get_domain_name_from_id($zoneid);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    22
	$nocheck = array('SOA', 'HINFO', 'NAPTR', 'URL', 'MBOXFW', 'TXT');
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    23
	$hostname = false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    24
	$ip4 = false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    25
	$ip6 = false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    26
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    27
	if(!in_array(strtoupper($type), $nocheck))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    28
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    29
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    30
		if(!is_valid_ip6($content))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    31
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    32
			if(!is_valid_ip($content))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    33
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    34
				if(!is_valid_hostname($content))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    35
				{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    36
					error(ERR_DNS_CONTENT);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    37
				}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    38
				else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    39
				{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    40
					$hostname = true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    41
				}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    42
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    43
			else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    44
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    45
				$ip4 = true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    46
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    47
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    48
		else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    49
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    50
			$ip6 = true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    51
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    52
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    53
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    54
	// Prepare total hostname.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    55
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    56
	if($name == '*')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    57
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    58
		$wildcard = true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    59
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    60
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    61
	if ($name=="0") {
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    62
	   $name=$name.".".$domain;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    63
	} else {
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    64
	   $name = ($name) ? $name.".".$domain : $domain;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    65
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    66
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    67
	if (preg_match('!@\.!i', $name))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    68
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    69
		$name = str_replace('@.', '@', $name);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    70
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    71
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    72
	if(!$wildcard)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    73
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    74
		if(!is_valid_hostname($name))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    75
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    76
			error(ERR_DNS_HOSTNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    77
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    78
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    79
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    80
	// Check record type (if it exists in our allowed list.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    81
	if (!in_array(strtoupper($type), get_record_types()))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    82
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    83
		error(ERR_DNS_RECORDTYPE);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    84
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    85
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    86
	// Start handling the demands for the functions.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    87
	// Validation for IN A records. Can only have an IP. Nothing else.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    88
	if ($type == 'A' && !$ip4)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    89
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    90
		error(ERR_DNS_IPV4);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    91
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    92
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    93
	if ($type == 'AAAA' && !$ip6)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    94
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    95
		error(ERR_DNS_IPV6);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    96
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    97
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    98
	if ($type == 'CNAME' && $hostname)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
    99
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   100
		if(!is_valid_cname($name))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   101
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   102
			error(ERR_DNS_CNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   103
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   104
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   105
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   106
	if ($type == 'NS')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   107
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   108
		$status = is_valid_ns($content, $hostname);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   109
		if($status == -1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   110
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   111
			error(ERR_DNS_NS_HNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   112
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   113
		elseif($status == -2)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   114
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   115
			error(ERR_DNS_NS_CNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   116
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   117
		// Otherwise its ok
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   118
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   119
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   120
	if ($type == 'SOA')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   121
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   122
		$status = is_valid_soa($content, $zoneid);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   123
		if($status == -1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   124
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   125
			error(ERR_DNS_SOA_UNIQUE);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   126
			// Make nicer error
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   127
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   128
		elseif($status == -2)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   129
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   130
			error(ERR_DNS_SOA_NUMERIC);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   131
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   132
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   133
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   134
	// HINFO and TXT require no validation.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   135
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   136
	if ($type == 'URL')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   137
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   138
		if(!is_valid_url($content))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   139
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   140
			error(ERR_INV_URL);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   141
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   142
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   143
	if ($type == 'MBOXFW')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   144
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   145
		if(!is_valid_mboxfw($content))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   146
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   147
			error(ERR_INV_EMAIL);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   148
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   149
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   150
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   151
	// NAPTR has to be done.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   152
	// Do we want that?
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   153
	// http://www.ietf.org/rfc/rfc2915.txt
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   154
	// http://www.zvon.org/tmRFC/RFC2915/Output/chapter2.html
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   155
	// http://www.zvon.org/tmRFC/RFC3403/Output/chapter4.html
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   156
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   157
	// See if the prio field is valid and if we have one.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   158
	// If we dont have one and the type is MX record, give it value '10'
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   159
	if($type == 'NAPTR')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   160
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   161
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   162
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   163
	
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   164
	if($type == 'MX')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   165
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   166
		if($hostname)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   167
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   168
			$status = is_valid_mx($content, $prio);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   169
			if($status == -1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   170
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   171
				error(ERR_DNS_MX_CNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   172
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   173
			elseif($status == -2)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   174
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   175
				error(ERR_DNS_MX_PRIO);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   176
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   177
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   178
		else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   179
		{
6
9fcac40c1b0e [feladat @ 7]
rejo
parents: 1
diff changeset
   180
			error( _('If you specify an MX record it must be a hostname.') );
1
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   181
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   182
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   183
	else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   184
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   185
		$prio='';
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   186
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   187
	// Validate the TTL, it has to be numeric.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   188
	$ttl = (!isset($ttl) || !is_numeric($ttl)) ? $DEFAULT_TTL : $ttl;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   189
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   190
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   191
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   192
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   193
		/****************************************
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   194
		 *					*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   195
		 * RECORD VALIDATING PART.		*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   196
		 * CHANGES HERE SHOULD BE CONSIDERED	*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   197
		 * THEY REQUIRE KNOWLEDGE ABOUT THE 	*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   198
		 * DNS SPECIFICATIONS			*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   199
		 *					*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   200
		 ***************************************/
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   201
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   202
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   203
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   204
 * Validatis a CNAME record by the name it will have and its destination
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   205
 *
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   206
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   207
function is_valid_cname($dest)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   208
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   209
	/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   210
	 * This is really EVIL.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   211
	 * If the new record (a CNAME) record is being pointed to by a MX record or NS record we have to bork.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   212
	 * this is the idea.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   213
	 *
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   214
	 * MX record: blaat.nl MX mail.blaat.nl
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   215
	 * Now we look what mail.blaat.nl is
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   216
	 * We discover the following:
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   217
	 * mail.blaat.nl CNAME bork.blaat.nl
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   218
	 * This is NOT allowed! mail.onthanet.nl can not be a CNAME!
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   219
	 * The same goes for NS. mail.blaat.nl must have a normal IN A record.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   220
	 * It MAY point to a CNAME record but its not wished. Lets not support it.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   221
	 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   222
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   223
	global $db;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   224
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   225
	// Check if there are other records with this information of the following types.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   226
	// P.S. we might add CNAME to block CNAME recursion and chains.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   227
	$blockedtypes = " AND (type='MX' OR type='NS')";
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   228
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   229
	$cnamec = "SELECT type, content FROM records WHERE content='$dest'" . $blockedtypes;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   230
	$result = $db->query($cnamec);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   231
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   232
	if($result->numRows() > 0)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   233
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   234
		return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   235
		// Lets inform the user he is doing something EVIL.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   236
		// Ok we found a record that has our content field in their content field.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   237
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   238
	return true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   239
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   240
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   241
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   242
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   243
 * Checks if something is a valid domain.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   244
 * Checks for domainname with the allowed characters <a,b,...z,A,B,...Z> and - and _.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   245
 * This part must be followed by a 2 to 4 character TLD.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   246
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   247
function is_valid_domain($domain)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   248
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   249
	if ((eregi("^[0-9a-z]([-.]?[0-9a-z])*\\.[a-z]{2,4}$", $domain)) && (strlen($domain) <= 128))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   250
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   251
		return true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   252
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   253
	return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   254
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   255
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   256
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   257
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   258
 * Validates if given hostname is allowed.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   259
 * returns true if allowed.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   260
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   261
function is_valid_hostname($host)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   262
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   263
	if(count(explode(".", $host)) == 1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   264
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   265
		return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   266
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   267
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   268
	// Its not perfect (in_addr.int is allowed) but works for now.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   269
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   270
	if(preg_match('!(ip6|in-addr).(arpa|int)$!i', $host))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   271
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   272
		if(preg_match('!^(([A-Z\d]|[A-Z\d][A-Z\d-]*[A-Z\d])\.)*[A-Z\d]+$!i', $host))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   273
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   274
			return true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   275
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   276
		return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   277
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   278
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   279
	// Validate further.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   280
	return (preg_match('!^(([A-Z\d]|[A-Z\d][A-Z\d-]*[A-Z\d])\.)*[A-Z\d]+$!i', $host)) ? true : false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   281
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   282
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   283
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   284
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   285
 * Validates an IPv4 IP.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   286
 * returns true if valid.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   287
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   288
function is_valid_ip($ip)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   289
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   290
	// Stop reading at this point. Scroll down to the next function...
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   291
	// Ok... you didn't stop reading... now you have to rewrite the whole function! enjoy ;-)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   292
	// Trance unborked it. Twice even!
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   293
	return ($ip == long2ip(ip2long($ip))) ? true : false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   294
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   295
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   296
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   297
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   298
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   299
 * Validates an IPv6 IP.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   300
 * returns true if valid.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   301
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   302
function is_valid_ip6($ip)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   303
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   304
	// Validates if the given IP is truly an IPv6 address.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   305
	// Precondition: have a string
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   306
	// Postcondition: false: Error in IP
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   307
	//                true: IP is correct
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   308
	// Requires: String
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   309
	// Date: 10-sep-2002
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   310
	if(preg_match('!^[A-F0-9:]{1,39}$!i', $ip) == true)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   311
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   312
		// Not 3 ":" or more.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   313
		$p = explode(':::', $ip);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   314
		if(sizeof($p) > 1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   315
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   316
			return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   317
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   318
		// Find if there is only one occurence of "::".
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   319
		$p = explode('::', $ip);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   320
		if(sizeof($p) > 2)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   321
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   322
			return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   323
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   324
		// Not more than 8 octects
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   325
		$p = explode(':', $ip);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   326
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   327
		if(sizeof($p) > 8)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   328
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   329
			return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   330
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   331
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   332
		// Check octet length
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   333
		foreach($p as $checkPart)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   334
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   335
			if(strlen($checkPart) > 4)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   336
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   337
				return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   338
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   339
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   340
		return true;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   341
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   342
	return false;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   343
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   344
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   345
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   346
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   347
 * FANCY RECORD.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   348
 * Validates if the fancy record mboxfw is an actual email address.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   349
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   350
function is_valid_mboxfw($email)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   351
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   352
	return is_valid_email($email);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   353
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   354
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   355
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   356
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   357
 * Validates MX records.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   358
 * an MX record cant point to a CNAME record. This has to be checked.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   359
 * this function also sets a proper priority.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   360
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   361
function is_valid_mx($content, &$prio)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   362
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   363
	global $db;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   364
	// See if the destination to which this MX is pointing is NOT a CNAME record.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   365
	// Check inside our dns server.
8
47dd15d8bb8c [feladat @ 20]
rejo
parents: 6
diff changeset
   366
	if($db->queryOne("SELECT count(id) FROM records WHERE name='$content' AND type='CNAME'") > 0)
1
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   367
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   368
		return -1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   369
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   370
	else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   371
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   372
		// Fix the proper priority for the record.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   373
		// Bugfix, thanks Oscar :)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   374
		if(!isset($prio))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   375
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   376
			$prio = 10;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   377
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   378
		if(!is_numeric($prio))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   379
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   380
			if($prio == '')
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   381
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   382
				$prio = 10;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   383
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   384
			else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   385
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   386
				return -2;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   387
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   388
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   389
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   390
	return 1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   391
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   392
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   393
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   394
 * Validates NS records.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   395
 * an NS record cant point to a CNAME record. This has to be checked.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   396
 * $hostname directive means if its a hostname or not (this to avoid that NS records get ip fields)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   397
 * NS must have a hostname, it is not allowed to have an IP.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   398
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   399
function is_valid_ns($content, $hostname)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   400
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   401
	global $db;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   402
	// Check if the field is a hostname, it MUST be a hostname.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   403
	if(!$hostname)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   404
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   405
		return -1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   406
		// "an IN NS field must be a hostname."
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   407
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   408
8
47dd15d8bb8c [feladat @ 20]
rejo
parents: 6
diff changeset
   409
	if($db->queryOne("SELECT count(id) FROM records WHERE name='$content' AND type='CNAME'") > 0)
1
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   410
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   411
		return -2;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   412
		// "You can not point a NS record to a CNAME record. Remove/rename the CNAME record first or take another name."
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   413
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   414
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   415
	return 1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   416
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   417
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   418
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   419
/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   420
 * Function to check the validity of SOA records.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   421
 * return values: true if succesful
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   422
 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   423
function is_valid_soa(&$content, $zoneid)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   424
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   425
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   426
	/*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   427
	 * SOA (start of authority)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   428
	 * there is only _ONE_ SOA record allowed in every zone.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   429
	 * Validate SOA record
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   430
	 * The Start of Authority record is one of the most complex available. It specifies a lot
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   431
	 * about a domain: the name of the master nameserver ('the primary'), the hostmaster and
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   432
	 * a set of numbers indicating how the data in this domain expires and how often it needs
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   433
	 * to be checked. Further more, it contains a serial number which should rise on each change
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   434
	 * of the domain.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   435
	 					    2002120902 28800 7200 604800 10800
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   436
	 * The stored format is: primary hostmaster serial refresh retry expire default_ttl
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   437
	 * From the powerdns documentation.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   438
	 */
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   439
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   440
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   441
	// Check if there already is an occurence of a SOA, if so see if its not the one we are currently changing
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   442
	$return = get_records_by_type_from_domid("SOA", $zoneid);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   443
	if($return->numRows() > 1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   444
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   445
		return -1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   446
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   447
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   448
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   449
	$soacontent = explode(" ", $content);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   450
	// Field is at least one otherwise it wouldnt even get here.
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   451
	if(is_valid_hostname($soacontent[0]))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   452
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   453
		$totalsoa = $soacontent[0];
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   454
		// It doesnt matter what field 2 contains, but lets check if its there
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   455
		// We assume the 2nd field wont have numbers, otherwise its a TTL field
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   456
		if(count($soacontent) > 1)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   457
		{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   458
			if(is_numeric($soacontent[1]))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   459
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   460
				// its a TTL field, or at least not hostmaster or alike
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   461
				// Set final string to the default hostmaster addy
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   462
				global $HOSTMASTER;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   463
				$totalsoa .= " ". $HOSTMASTER;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   464
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   465
			else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   466
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   467
				$totalsoa .= " ".$soacontent[1];
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   468
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   469
			// For loop to iterate over the numbers
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   470
			$imax = count($soacontent);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   471
			for($i = 2; ($i < $imax) && ($i < 7); $i++)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   472
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   473
				if(!is_numeric($soacontent[$i]))
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   474
				{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   475
					return -2;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   476
				}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   477
				else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   478
				{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   479
					$totalsoa .= " ".$soacontent[$i];
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   480
				}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   481
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   482
			if($i > 7)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   483
			{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   484
				error(ERR_DNS_SOA_NUMERIC_FIELDS);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   485
			}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   486
		}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   487
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   488
	else
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   489
	{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   490
		error(ERR_DNS_SOA_HOSTNAME);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   491
	}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   492
	$content = $totalsoa;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   493
	return 1;
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   494
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   495
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   496
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   497
function is_valid_url($url)
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   498
{
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   499
	return preg_match('!^(http://)(([A-Z\d]|[A-Z\d][A-Z\d-]*[A-Z\d])\.)*[A-Z\d]+([//]([0-9a-z//~#%&\'_\-+=:?.]*))?$!i',  $url);
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   500
}
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   501
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   502
		/****************************************
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   503
		 *					*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   504
		 *    END OF RECORD VALIDATING PART.	*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   505
		 *					*
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   506
		 ***************************************/
58094faf794d [feladat @ 2]
rejo
parents:
diff changeset
   507
?>