/** * Add a delegation to the current zone * *@access private *@param string $delegatefrom lower limit of range *@param string $delegateto upper limit of range *@param string $delegateuser user to delegate zone to *@param int $ttl ttl value for this record *@return string text of result (Adding DELEGATE Record... Ok) */ function addDELEGATERecord($delegatefrom, $delegateto, $delegateuser, $ttl) { global $db, $html, $l; $i = 0; $result = ""; while (list($key, $value) = each($delegatefrom)) { if (!empty($value)) { $result .= sprintf($l['str_primary_adding_delegate_x'], xssafe($value), xssafe($delegateto[$i])) . "... "; if (!ereg('^[0-9]+$', $value)) { $this->error = sprintf($l['str_primary_bad_lower_limit_x'], xssafe($value)); } else { if (!ereg('^[0-9]+$', $delegateto[$i]) || $delegateto[$i] > 255) { $this->error = sprintf($l['str_primary_bad_upper_limit_x'], xssafe($delegateto[$i])); } else { // check if lower if below upper if (!($value <= $delegateto[$i])) { $this->error = sprintf($l['str_primary_bad_limits_x_x'], xssafe($value), xssafe($delegateto[$i])); } else { if (empty($delegateuser[$i])) { $this->error = $l['str_primary_no_user_for_delegation']; } else { // check if user is in DB or not $newuserid = $this->user->RetrieveId(addslashes($delegateuser[$i])); if ($this->user->error) { $this->error = $this->user->error; } else { if (!$newuserid) { $this->error = sprintf($l['str_primary_delegate_user_x_doesnot_exist'], xssafe($delegateuser[$i])); } else { // user exists // check if items inside this range are already registered or not $query = "SELECT val1 FROM dns_record WHERE zoneid='" . $this->zoneid . "' AND type='DELEGATE'"; $res = $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; } else { while ($line = $db->fetch_row($res)) { list($from, $to) = split('-', $line[0]); if ($from <= $value && $to >= $value || $from >= $value && $from <= $delegateto[$i]) { $this->error = sprintf($l['str_primary_delegate_bad_limits_x_x_overlaps_existing_x_x'], xssafe($value), xssafe($delegateto[$i]), xssafe($from), xssafe($to)); } } if (!$this->error) { $ttlval = $this->fixDNSTTL($ttl[$i]); $query = "INSERT INTO dns_record (zoneid, type, val1, val2, ttl)\n VALUES ('" . $this->zoneid . "', 'DELEGATE', '" . mysql_real_escape_string($value . "-" . $delegateto[$i]) . "','" . mysql_real_escape_string($delegateuser[$i]) . "','" . $ttlval . "')"; $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; } else { // create zone, affect it to delegateuser // Can NOT use standard create way because // of EXIST check. BUG: can not insert userlog $query = "INSERT INTO dns_zone (zone,zonetype,userid) VALUES ('" . mysql_real_escape_string($value . "-" . $delegateto[$i] . "." . $this->zonename) . "','P','" . $newuserid . "')"; $res = $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; } else { // create dns_confprimary records // NO - user has to modify it manually // create NS records $nskeys = array_keys($this->ns); while ($nskey = array_shift($nskeys)) { $query = "INSERT INTO dns_record\n (zoneid,type,val1,val2,ttl)\n VALUES ('" . $this->zoneid . "',\n 'SUBNS','" . mysql_real_escape_string($value) . "-" . mysql_real_escape_string($delegateto[$i]) . "','" . mysql_real_escape_string($nskey) . "','" . $this->fixDNSTTL($this->nsttl[$nskey]) . "')"; $res = $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; } } // create CNAME records $newzone = new Zone($value . "-" . $delegateto[$i] . "." . $this->zonename, 'P', '', $newuserid); $newzone->retrieveID($value . "-" . $delegateto[$i] . "." . $this->zonename, 'P'); for ($cnamecounter = $value; $cnamecounter <= $delegateto[$i]; $cnamecounter++) { $query = "INSERT INTO dns_record\n (zoneid, type, val1, val2,ttl)\n VALUES\n ('" . $this->zoneid . "',\n 'CNAME', '" . $cnamecounter . "',\n '" . $cnamecounter . "." . mysql_real_escape_string($value) . "-" . mysql_real_escape_string($delegateto[$i]) . "." . $this->zonename . ".'," . "'" . $ttlval . "')"; $db->query($query); if ($db->error()) { $this->error = $l['str_trouble_with_db']; } } // end for each CNAME if (!$this->error) { $result .= $l['str_primary_ok'] . "<br>\n"; } } } } // no error } // else db error } // user exists } // no db error } // delegateuser not null } // $from < $to } // bad upper limit } // bad lower limit } // not null $i++; } // while return $result; }