/** * adds a single domain to the database using the given array * * @param array $domain_data * * @return int last-inserted id or false on error */ private function _addSingleDomainToDatabase($domain_data = array()) { // format domain $idna_convert = new idna_convert_wrapper(); $domain_data['domain'] = $idna_convert->encode(preg_replace(array('/\\:(\\d)+$/', '/^https?\\:\\/\\//'), '', $domain_data['domain'])); // check if it is a valid domain if (!validateDomain($domain_data['domain'])) { return false; } // no system-hostname can be added if ($domain_data['domain'] == Settings::Get('system.hostname')) { return false; } // no existing domains can be imported if (in_array($domain_data['domain'], $this->_knownDomains)) { return false; } // check for alias-domain if (!empty($domain_data['aliasdomain'])) { // format $domain_data['aliasdomain'] = $idna_convert->encode(preg_replace(array('/\\:(\\d)+$/', '/^https?\\:\\/\\//'), '', $domain_data['aliasdomain'])); // validate alias-domain if (!validateDomain($domain_data['aliasdomain'])) { // invalid-domain lol - skip to be sure we dont add anything weird return false; } // does the domain we want to be an alias of exists? if (!in_array($domain_data['aliasdomain'], $this->_knownDomains)) { // it does not - User should respect the order of import so if the domain // he wants to alias is also part of the import is ABOVE this one // - we'd better skip return false; } } // check for use_ssl and ssl_redirect if (!isset($domain_data['use_ssl']) || $domain_data['use_ssl'] == 1) { // if not set: default is whatever the system says // if set to 1: set to 0 if system has no ssl enabled $domain_data['use_ssl'] = Settings::get('system.use_ssl') == 1 ? 1 : 0; } // use_ssl flag if ($domain_data['use_ssl'] != 1) { $domain_data['use_ssl'] = 0; } // ssl_redirect flag if ($domain_data['ssl_redirect'] != 1) { $domain_data['ssl_redirect'] = 0; } // if use_ssl is 0 ssl_redirect must be too (no ssl-ip => no ssl-redirect) if ($domain_data['use_ssl'] == 0 && $domain_data['ssl_redirect'] == 1) { $domain_data['ssl_redirect'] = 0; } // add to known domains $this->_knownDomains[] = $domain_data['domain']; // docroot (URL allowed, will lead to redirect) if (!preg_match('/^https?\\:\\/\\//', $domain_data['documentroot'])) { $domain_data['documentroot'] = makeCorrectDir($this->_custData['documentroot'] . "/" . $domain_data['documentroot']); } // is bind domain? if (!isset($domain_data['isbinddomain'])) { $domain_data['isbinddomain'] = Settings::Get('system.bind_enable') == '1' ? 1 : 0; } elseif ($domain_data['isbinddomain'] != 1) { $domain_data['isbinddomain'] = 0; } // zonefile if (!isset($domain_data['zonefile'])) { $domain_data['zonefile'] = ""; } else { if (!empty($domain_data['zonefile']) && Settings::Get('system.bind_enable') == '1') { $domain_data['zonefile'] = makeCorrectFile($domain_data['zonefile']); } else { $domain_data['zonefile'] = ""; } } // openbasedir flag if (!isset($domain_data['openbasedir'])) { $domain_data['openbasedir'] = 1; } elseif ($domain_data['openbasedir'] != 1) { $domain_data['openbasedir'] = 0; } // speciallogfile flag if (!isset($domain_data['speciallogfile'])) { $domain_data['speciallogfile'] = 0; } elseif ($domain_data['speciallogfile'] != 1) { $domain_data['speciallogfile'] = 0; } /* * automatically set values (not from the file) */ // add date $domain_data['add_date'] = time(); // set adminid $domain_data['adminid'] = (int) $this->_custData['adminid']; // set customerid $domain_data['customerid'] = (int) $this->_custId; // check for required fields foreach ($this->_required_fields as $rfld) { if (!isset($domain_data[$rfld])) { return false; } } // clean all fields that do not belong to the required fields $domain_data_tmp = $domain_data; foreach ($domain_data_tmp as $fld => $val) { if (!in_array($fld, $this->_required_fields)) { unset($domain_data[$fld]); } } // save iplist $iplist = $domain_data['ips']; $iplist_arr = array_unique(explode(",", $iplist)); $knownIPsCheck = array_unique($this->_knownIpPortChk); // check whether we actually have at least one of the used IP's in our system $result_iplist = array_intersect($iplist_arr, $knownIPsCheck); // write back iplist $iplist = implode(",", $result_iplist); // dont need that for the domain-insert-statement unset($domain_data['ips']); // remember use_ssl value $use_ssl = (bool) $domain_data['use_ssl']; // dont need that for the domain-insert-statement unset($domain_data['use_ssl']); // finally ADD the domain to panel_domains Database::pexecute($this->_ins_stmt, $domain_data); // get the newly inserted domain-id $domain_id = Database::lastInsertId(); // insert domain <-> ip/port reference if (empty($iplist)) { $iplist = Settings::Get('system.ipaddress'); } // split ip-list and remove duplicates $iplist_arr = array_unique(explode(",", $iplist)); foreach ($iplist_arr as $ip) { // if we know the ip, at all variants (different ports, ssl and non-ssl) of it! if (isset($this->_knownIpPort[$ip])) { foreach ($this->_knownIpPort[$ip] as $ipdata) { // no ssl ip/ports should be used for this domain if ($use_ssl == false && $ipdata['ssl'] == 1) { continue; } // add domain->ip reference Database::pexecute($this->_ipp_ins_stmt, array('domid' => $domain_id, 'ipid' => $ipdata['id'])); } } } return $domain_id; }