Marius Cramer
2015-08-06 37b29231e47a0c4458dc1c15d98588f16f07e1e2
commit | author | age
4c2c36 1 <?php
B 2
3 /*
4 Copyright (c) 2008, Till Brehm, projektfarm Gmbh
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
b1a6a5 31 require_once '../../lib/config.inc.php';
MC 32 require_once '../../lib/app.inc.php';
4c2c36 33
B 34 //* Check permissions for module
35 $app->auth->check_module_permissions('dns');
36
8ab3cd 37 $msg = '';
T 38 $error = '';
4c2c36 39
B 40 // Loading the template
41 $app->uses('tpl,validate_dns');
42 $app->tpl->newTemplate("form.tpl.htm");
b1a6a5 43 $app->tpl->setInclude('content_tpl', 'templates/dns_import.htm');
4c2c36 44 $app->load_language_file('/web/dns/lib/lang/'.$_SESSION['s']['language'].'_dns_wizard.lng');
B 45
46 // import variables
65ea2e 47 $template_id = (isset($_POST['template_id']))?$app->functions->intval($_POST['template_id']):0;
M 48 $sys_groupid = (isset($_POST['client_group_id']))?$app->functions->intval($_POST['client_group_id']):0;
4c2c36 49 $domain = (isset($_POST['domain'])&&!empty($_POST['domain']))?$_POST['domain']:NULL;
B 50
51 // get the correct server_id
bd6659 52 if (isset($_POST['server_id'])) {
SJ 53     $server_id = $app->functions->intval($_POST['server_id']);
54     $post_server_id = true;
1a2cbf 55 } elseif (isset($_POST['server_id_value'])) {
MC 56     $server_id = $app->functions->intval($_POST['server_id_value']);
57     $post_server_id = true;
4c2c36 58 } else {
41d7d1 59     $settings = $app->getconf->get_global_config('dns');
SC 60     $server_id = $app->functions->intval($settings['default_dnsserver']);
bd6659 61     $post_server_id = false;
4c2c36 62 }
B 63
64
65 // Load the templates
66 $records = $app->db->queryAllRecords("SELECT * FROM dns_template WHERE visible = 'Y'");
67 $template_id_option = '';
68 $n = 0;
69 foreach($records as $rec){
70     $checked = ($rec['template_id'] == $template_id)?' SELECTED':'';
71     $template_id_option .= '<option value="'.$rec['template_id'].'"'.$checked.'>'.$rec['name'].'</option>';
72     if($n == 0 && $template_id == 0) $template_id = $rec['template_id'];
73     $n++;
74 }
75 unset($n);
b1a6a5 76 $app->tpl->setVar("template_id_option", $template_id_option);
4c2c36 77
B 78 // If the user is administrator
79 if($_SESSION['s']['user']['typ'] == 'admin') {
b1a6a5 80
4c2c36 81     // Load the list of servers
B 82     $records = $app->db->queryAllRecords("SELECT server_id, server_name FROM server WHERE mirror_server_id = 0 AND dns_server = 1 ORDER BY server_name");
83     $server_id_option = '';
84     foreach($records as $rec){
85         $checked = ($rec['server_id'] == $server_id)?' SELECTED':'';
86         $server_id_option .= '<option value="'.$rec['server_id'].'"'.$checked.'>'.$rec['server_name'].'</option>';
87     }
b1a6a5 88     $app->tpl->setVar("server_id", $server_id_option);
MC 89
4c2c36 90     // load the list of clients
ca4b71 91     $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name";
4c2c36 92     $clients = $app->db->queryAllRecords($sql);
B 93     $client_select = '';
94     if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= "<option value='0'></option>";
95     if(is_array($clients)) {
96         foreach( $clients as $client) {
97             $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
615a0a 98             $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
4c2c36 99         }
B 100     }
101
b1a6a5 102     $app->tpl->setVar("client_group_id", $client_select);
4c2c36 103 }
B 104
105 if ($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
b1a6a5 106
4c2c36 107     // Get the limits of the client
35509d 108     $client_group_id = intval($_SESSION["s"]["user"]["default_group"]);
cc7a82 109     $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
4c2c36 110
b1a6a5 111
4c2c36 112     // load the list of clients
cc7a82 113     $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ? ORDER BY client.company_name, client.contact_name, sys_group.name";
MC 114     $clients = $app->db->queryAllRecords($sql, $client['client_id']);
115     $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client['client_id']);
615a0a 116     $client_select = '<option value="'.$tmp['groupid'].'">'.$client['contactname'].'</option>';
4c2c36 117     if(is_array($clients)) {
B 118         foreach( $clients as $client) {
119             $selected = ($client["groupid"] == $sys_groupid)?'SELECTED':'';
615a0a 120             $client_select .= "<option value='$client[groupid]' $selected>$client[contactname]</option>\r\n";
4c2c36 121         }
B 122     }
123
b1a6a5 124     $app->tpl->setVar("client_group_id", $client_select);
4c2c36 125 }
B 126
bd6659 127 if($_SESSION["s"]["user"]["typ"] != 'admin')
SJ 128 {
129     $client_group_id = $_SESSION["s"]["user"]["default_group"];
cc7a82 130     $client_dns = $app->db->queryOneRecord("SELECT dns_servers FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
bd6659 131
SJ 132     $client_dns['dns_servers_ids'] = explode(',', $client_dns['dns_servers']);
133
134     $only_one_server = count($client_dns['dns_servers_ids']) === 1;
135     $app->tpl->setVar('only_one_server', $only_one_server);
136
137     if ($only_one_server) {
138         $app->tpl->setVar('server_id_value', $client_dns['dns_servers_ids'][0]);
139     }
140
cc7a82 141     $sql = "SELECT server_id, server_name FROM server WHERE server_id IN ?";
MC 142     $dns_servers = $app->db->queryAllRecords($sql, $client_dns['dns_servers_ids']);
bd6659 143
SJ 144     $options_dns_servers = "";
145
146     foreach ($dns_servers as $dns_server) {
147         $options_dns_servers .= "<option value='$dns_server[server_id]'>$dns_server[server_name]</option>";
148     }
149
150     $app->tpl->setVar("server_id", $options_dns_servers);
151     unset($options_dns_servers);
152
153 }
154
021ef6 155 /*
SC 156  * Now we have to check, if we should use the domain-module to select the domain
157  * or not
158  */
159 $app->uses('ini_parser,getconf');
160 $settings = $app->getconf->get_global_config('domains');
161 if ($settings['use_domain_module'] == 'y') {
162     /*
163      * The domain-module is in use.
164     */
9ec304 165     $domains = $app->tools_sites->getDomainModuleDomains("dns_soa");
021ef6 166     /*
SC 167      * We can leave domain empty if domain is filename
168     */
169     $domain_select = "<option value=''></option>\r\n";
170     if(is_array($domains) && sizeof($domains) > 0) {
171         /* We have domains in the list, so create the drop-down-list */
172         foreach( $domains as $domain) {
173             $domain_select .= "<option value=" . $domain['domain_id'] ;
174             if ($domain['domain'] == $_POST['domain']) {
175                 $domain_select .= " selected";
176             }
177             $domain_select .= ">" . $app->functions->idn_decode($domain['domain']) . ".</option>\r\n";
178         }
179     }
180     $app->tpl->setVar("domain_option", $domain_select);
181     /* check if the selected domain can be used! */
182     if ($domain) {
183         $domain_check = $app->tools_sites->checkDomainModuleDomain($domain);
184         if(!$domain_check) {
185             // invalid domain selected
186             $domain = NULL;
187         } else {
188             $domain = $domain_check;
189         }
190     }
191 }
192
02bf99 193 $lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_dns_import.lng';
b1a6a5 194 include $lng_file;
02bf99 195 $app->tpl->setVar($wb);
T 196
4c2c36 197 // Import the zone-file
B 198 //if(1=="1")
8ab3cd 199 if(isset($_FILES['file']['name']) && is_uploaded_file($_FILES['file']['tmp_name'])){
T 200     $valid_zone_file = FALSE;
b1a6a5 201
cc7a82 202     $sql = "SELECT server_name FROM `server` WHERE server_id=? OR mirror_server_id=? ORDER BY server_name ASC";
MC 203     $servers = $app->db->queryAllRecords($sql, $server_id, $server_id);
4c2c36 204     for ($i=0;$i<count($servers);$i++)
B 205     {
b1a6a5 206         if (substr($servers[$i]['server_name'], strlen($servers[$i]['server_name'])-1) != ".")
4c2c36 207         {
B 208             $servers[$i]['server_name'] .= ".";
209         }
210     }
211     $lines = file($_FILES['file']['tmp_name']);
b1a6a5 212
8ab3cd 213     // Remove empty lines, comments, whitespace, tabs, etc.
T 214     $new_lines = array();
215     foreach($lines as $line){
216         $line = trim($line);
b1a6a5 217         if ($line != '' && substr($line, 0, 1) != ';'){
MC 218             if(strpos($line, ";") !== FALSE) $line = substr($line, 0, strpos($line, ";"));
219             if(strpos($line, "(") !== FALSE) $line = substr($line, 0, strpos($line, "("));
220             if(strpos($line, ")") !== FALSE) $line = substr($line, 0, strpos($line, ")"));
8ab3cd 221             $line = trim($line);
T 222             if ($line != ''){
223                 $sPattern = '/\s+/m';
224                 $sReplace = ' ';
225                 $new_lines[] = preg_replace($sPattern, $sReplace, $line);
226             }
227         }
228     }
229     unset($lines);
230     $lines = $new_lines;
231     unset($new_lines);
b1a6a5 232
4c2c36 233     //$lines = file("apriqot.se.txt");
b1a6a5 234     $name = str_replace("txt", "", $_FILES['file']['name']);
MC 235     $name = str_replace("zone", "", $name);
8ab3cd 236
T 237     if ($domain !== NULL){
4c2c36 238         $name = $domain;
B 239     }
b1a6a5 240
MC 241     if (substr($name, -1) != "."){
8ab3cd 242         $name .= ".";
T 243     }
b1a6a5 244
8ab3cd 245     $i = 0;
T 246     $origin_exists = FALSE;
247     $soa_array_key = -1;
248     $soa = array();
249     $soa['name'] = $name;
250     $r = 0;
251     $dns_rr = array();
252     foreach($lines as $line){
b1a6a5 253
8ab3cd 254         $parts = explode(' ', $line);
b1a6a5 255
8ab3cd 256         // make all elements lowercase
T 257         $new_parts = array();
258         foreach($parts as $part){
259             $new_parts[] = strtolower($part);
260         }
261         unset($parts);
262         $parts = $new_parts;
263         unset($new_parts);
b1a6a5 264
8ab3cd 265         // if ORIGIN exists, overwrite $soa['name']
T 266         if($parts[0] == '$origin'){
267             $soa['name'] = $parts[1];
268             $origin_exists = TRUE;
269         }
270         // TTL
271         if($parts[0] == '$ttl'){
b1a6a5 272             $time_format = strtolower(substr($parts[1], -1));
02bf99 273             switch ($time_format) {
b1a6a5 274             case 's':
MC 275                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1));
276                 break;
277             case 'm':
278                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 60;
279                 break;
280             case 'h':
281                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 3600;
282                 break;
283             case 'd':
284                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 86400;
285                 break;
286             case 'w':
287                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 604800;
288                 break;
289             default:
290                 $soa['ttl'] = $app->functions->intval($parts[1]);
02bf99 291             }
T 292             unset($time_format);
8ab3cd 293         }
T 294         // SOA
295         if(in_array("soa", $parts)){
296             $soa['mbox'] = array_pop($parts);
297             //$soa['ns'] = array_pop($parts);
298             $soa['ns'] = $servers[0]['server_name'];
299             // if domain is part of SOA, overwrite $soa['name']
300             if($parts[0] != '@' && $parts[0] != 'in' && $parts[0] != 'soa' && $origin_exists === FALSE){
301                 $soa['name'] = $parts[0];
302             }
303             $soa_array_key = $i;
304             $valid_zone_file = TRUE;
305         }
306         // SERIAL
65ea2e 307         if($i == ($soa_array_key + 1)) $soa['serial'] = $app->functions->intval($parts[0]);
8ab3cd 308         // REFRESH
02bf99 309         if($i == ($soa_array_key + 2)){
b1a6a5 310             $time_format = strtolower(substr($parts[0], -1));
02bf99 311             switch ($time_format) {
b1a6a5 312             case 's':
MC 313                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1));
314                 break;
315             case 'm':
316                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
317                 break;
318             case 'h':
319                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
320                 break;
321             case 'd':
322                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
323                 break;
324             case 'w':
325                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
326                 break;
327             default:
328                 $soa['refresh'] = $app->functions->intval($parts[0]);
02bf99 329             }
T 330             unset($time_format);
331         }
8ab3cd 332         // RETRY
02bf99 333         if($i == ($soa_array_key + 3)){
b1a6a5 334             $time_format = strtolower(substr($parts[0], -1));
02bf99 335             switch ($time_format) {
b1a6a5 336             case 's':
MC 337                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1));
338                 break;
339             case 'm':
340                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
341                 break;
342             case 'h':
343                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
344                 break;
345             case 'd':
346                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
347                 break;
348             case 'w':
349                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
350                 break;
351             default:
352                 $soa['retry'] = $app->functions->intval($parts[0]);
02bf99 353             }
T 354             unset($time_format);
355         }
8ab3cd 356         // EXPIRE
02bf99 357         if($i == ($soa_array_key + 4)){
b1a6a5 358             $time_format = strtolower(substr($parts[0], -1));
02bf99 359             switch ($time_format) {
b1a6a5 360             case 's':
MC 361                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1));
362                 break;
363             case 'm':
364                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
365                 break;
366             case 'h':
367                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
368                 break;
369             case 'd':
370                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
371                 break;
372             case 'w':
373                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
374                 break;
375             default:
376                 $soa['expire'] = $app->functions->intval($parts[0]);
02bf99 377             }
T 378             unset($time_format);
379         }
8ab3cd 380         // MINIMUM
02bf99 381         if($i == ($soa_array_key + 5)){
b1a6a5 382             $time_format = strtolower(substr($parts[0], -1));
02bf99 383             switch ($time_format) {
b1a6a5 384             case 's':
MC 385                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1));
386                 break;
387             case 'm':
388                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
389                 break;
390             case 'h':
391                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
392                 break;
393             case 'd':
394                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
395                 break;
396             case 'w':
397                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
398                 break;
399             default:
400                 $soa['minimum'] = $app->functions->intval($parts[0]);
02bf99 401             }
T 402             unset($time_format);
403         }
8ab3cd 404         // RESOURCE RECORDS
T 405         if($i > ($soa_array_key + 5)){
b1a6a5 406             if(substr($parts[0], -1) == '.' || $parts[0] == '@' || ($parts[0] != 'a' && $parts[0] != 'aaaa' && $parts[0] != 'ns' && $parts[0] != 'cname' && $parts[0] != 'hinfo' && $parts[0] != 'mx' && $parts[0] != 'naptr' && $parts[0] != 'ptr' && $parts[0] != 'rp' && $parts[0] != 'srv' && $parts[0] != 'txt')){
8ab3cd 407                 if(is_numeric($parts[1])){
T 408                     if($parts[2] == 'in'){
409                         $resource_type = $parts[3];
410                         $pkey = 3;
411                     } else {
412                         $resource_type = $parts[2];
413                         $pkey = 2;
414                     }
415                 } else {
416                     if($parts[1] == 'in'){
417                         $resource_type = $parts[2];
418                         $pkey = 2;
419                     } else {
420                         $resource_type = $parts[1];
421                         $pkey = 1;
422                     }
423                 }
424                 $dns_rr[$r]['type'] = $resource_type;
425                 if($parts[0] == '@' || $parts[0] == '.'){
426                     $dns_rr[$r]['name'] = $soa['name'];
427                 } else {
428                     $dns_rr[$r]['name'] = $parts[0];
429                 }
430                 if(is_numeric($parts[1])){
65ea2e 431                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 432                 } else {
T 433                     $dns_rr[$r]['ttl'] = $soa['ttl'];
434                 }
435                 switch ($resource_type) {
b1a6a5 436                 case 'mx':
MC 437                 case 'srv':
438                     $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
439                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
440                     break;
441                 case 'txt':
442                     $dns_rr[$r]['aux'] = 0;
443                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
444                     if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
445                     if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
446                     break;
447                 default:
448                     $dns_rr[$r]['aux'] = 0;
449                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 450                 }
T 451             } else {
452                 // a 3600 IN A 1.2.3.4
453                 if(is_numeric($parts[1]) && $parts[2] == 'in' && ($parts[3] == 'a' || $parts[3] == 'aaaa' || $parts[3] == 'ns'|| $parts[3] == 'cname' || $parts[3] == 'hinfo' || $parts[3] == 'mx' || $parts[3] == 'naptr' || $parts[3] == 'ptr' || $parts[3] == 'rp' || $parts[3] == 'srv' || $parts[3] == 'txt')){
454                     $resource_type = $parts[3];
455                     $pkey = 3;
456                     $dns_rr[$r]['type'] = $resource_type;
457                     $dns_rr[$r]['name'] = $parts[0];
65ea2e 458                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 459                     switch ($resource_type) {
b1a6a5 460                     case 'mx':
MC 461                     case 'srv':
462                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
463                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
464                         break;
465                     case 'txt':
466                         $dns_rr[$r]['aux'] = 0;
467                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
468                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
469                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
470                         break;
471                     default:
472                         $dns_rr[$r]['aux'] = 0;
473                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 474                     }
b1a6a5 475                 }
8ab3cd 476                 // a IN A 1.2.3.4
T 477                 elseif($parts[1] == 'in' && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){
478                     $resource_type = $parts[2];
479                     $pkey = 2;
480                     $dns_rr[$r]['type'] = $resource_type;
481                     $dns_rr[$r]['name'] = $parts[0];
482                     $dns_rr[$r]['ttl'] = $soa['ttl'];
483                     switch ($resource_type) {
b1a6a5 484                     case 'mx':
MC 485                     case 'srv':
486                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
487                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
488                         break;
489                     case 'txt':
490                         $dns_rr[$r]['aux'] = 0;
491                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
492                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
493                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
494                         break;
495                     default:
496                         $dns_rr[$r]['aux'] = 0;
497                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 498                     }
b1a6a5 499                 }
8ab3cd 500                 // a 3600 A 1.2.3.4
T 501                 elseif(is_numeric($parts[1]) && ($parts[2] == 'a' || $parts[2] == 'aaaa' || $parts[2] == 'ns'|| $parts[2] == 'cname' || $parts[2] == 'hinfo' || $parts[2] == 'mx' || $parts[2] == 'naptr' || $parts[2] == 'ptr' || $parts[2] == 'rp' || $parts[2] == 'srv' || $parts[2] == 'txt')){
502                     $resource_type = $parts[2];
503                     $pkey = 2;
504                     $dns_rr[$r]['type'] = $resource_type;
505                     $dns_rr[$r]['name'] = $parts[0];
65ea2e 506                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 507                     switch ($resource_type) {
b1a6a5 508                     case 'mx':
MC 509                     case 'srv':
510                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
511                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
512                         break;
513                     case 'txt':
514                         $dns_rr[$r]['aux'] = 0;
515                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
516                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
517                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
518                         break;
519                     default:
520                         $dns_rr[$r]['aux'] = 0;
521                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 522                     }
b1a6a5 523                 }
8ab3cd 524                 // A 1.2.3.4
T 525                 // MX 10 mail
526                 // TXT "v=spf1 a mx ptr -all"
527                 else {
528                     $resource_type = $parts[0];
529                     $pkey = 0;
530                     $dns_rr[$r]['type'] = $resource_type;
531                     $dns_rr[$r]['name'] = $soa['name'];
532                     $dns_rr[$r]['ttl'] = $soa['ttl'];
533                     switch ($resource_type) {
b1a6a5 534                     case 'mx':
MC 535                     case 'srv':
536                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
537                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
538                         break;
539                     case 'txt':
540                         $dns_rr[$r]['aux'] = 0;
541                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
542                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
543                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
544                         break;
545                     default:
546                         $dns_rr[$r]['aux'] = 0;
547                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 548                     }
T 549                 }
550             }
551             $dns_rr[$r]['type'] = strtoupper($dns_rr[$r]['type']);
552             if($dns_rr[$r]['type'] == 'NS' && $dns_rr[$r]['name'] == $soa['name']){
553                 unset($dns_rr[$r]);
554             }
555             $r++;
556         }
557         $i++;
558     }
b1a6a5 559
8ab3cd 560     /*
4c2c36 561     $i = 0;
B 562     $r = 0;
563     $s = 0;
564     $dns_rr = array();
565     foreach ($lines as $line)
566     {
8ab3cd 567         $line = trim($line);
T 568         if ($line != '' && substr($line,0,1) != ';' && substr($line,0,1) != '$')
4c2c36 569         {
B 570             $line = str_replace("\n",NULL,$line);
571             $i++;
572
573             // TODO - Find a better way to parse the SOA record. Lazy checking.
574             if ($i <= 7)
575             {
576                 if ($i > 1)
577                 {
578                     $s++;
579                     $line = str_replace("\t",NULL,$line);
580                     if (!empty($line))
581                     {
582                         print(strpos(";",$line));
583                         $line = substr($line,0,strpos($line,";"));
584                         if ($s == 1)
585                             $soa['serial'] = $line;
586                         else if ($s == 2)
587                             $soa['refresh'] = $line;
588                         else if ($s == 3)
589                             $soa['retry'] = $line;
590                         else if ($s == 4)
591                             $soa['expire'] = $line;
592                         else if ($s == 5)
8ab3cd 593                             $soa['minimum'] = $line;
4c2c36 594
B 595                     }
596                 }
597                 else
598                 {
599                     $line = str_replace("\t",",",$line);
8ab3cd 600                     $line = str_replace(" ",",",$line);
4c2c36 601                     $recs = explode(",",$line);
B 602
603                     foreach ($recs as $key => $rec)
604                     {
605                         $rec = trim($rec);
8ab3cd 606                         if($rec == '') continue;
4c2c36 607                         //name    type    data    aux    ttl    active
B 608                         if ($key == 0)
609                         {
8ab3cd 610                             if ($rec == '@')
4c2c36 611                             {
B 612                                 $rec = $name;
613                             }
614
615                             $soa['name'] = $rec;
616                         }
617
618                         if ($key != 0 && strtolower($rec) == 'soa')
619                         {
620                             $typekeys[$s] = $key;
621                         }
622                         else if ($key > $typekey[$r])
623                         {
8ab3cd 624                             if ($rec != "" && $rec != "(")
4c2c36 625                             {
B 626                                 $rec = explode(" ",$rec);
627
628                                 $soa['ns'] = $servers[0]['server_name'];
629                                 $soa['mbox'] = $rec[1];
630                             }
631                         }
632                     }
633                 }
634             }
635             else
636             {
637                 $line = str_replace("\n","",trim($line));
638
639                 if (!empty($line))
640                 {
641
642                     preg_match_all('/(.*?)\s*IN\s*(A|CNAME|MX|TXT|NS|AAAA)\s*(.*)/',$line, $recs);
643
644                     if ($recs[1][0] == '@' || trim($recs[1][0]) == "")
645                     {
646                         $recs[1][0] = $name;
647                     }
648                     $dns_rr[$r]['name'] = $recs[1][0];
649                     $dns_rr[$r]['type'] = $recs[2][0];
650                     if (strtolower($dns_rr[$r]['type'])=='mx')
651                     {
652                         $recs[3][0] = str_replace(" ","\t",$recs[3][0]);
653                         $mx[$r] = explode("\t",$recs[3][0]);
654                         for ($m=1;$m<count($mx[$r]);$m++)
655                         {
656                             if (!empty($mx[$r][$m]))
657                                 $dns_rr[$r]['data'] = $mx[$r][$m];
658                         }
b1a6a5 659
4c2c36 660                         $dns_rr[$r]['aux'] = $mx[$r][0];
B 661                     }
662                     else if (strtolower($dns_rr[$r]['type'])=='txt')
663                     {
664                         $dns_rr[$r]['data'] = substr($recs[3][0],1,(strlen($recs[3][0])-2));
665                     }
666                     else
667                     {
668                         $dns_rr[$r]['data'] = $recs[3][0];
669                     }
670
671                     if (strtolower($dns_rr[$r]['type'])=='ns' && strtolower($dns_rr[$r]['name'])==$name)
672                     {
673                         unset($dns_rr[$r]);
674                     }
675
676                     $r++;
677                 }
678             }
679
680         }
681     }
8ab3cd 682     */
4c2c36 683
8ab3cd 684     foreach ($servers as $server){
T 685         $dns_rr[$r]['name'] = $soa['name'];
686         $dns_rr[$r]['type'] = 'NS';
4c2c36 687         $dns_rr[$r]['data'] = $server['server_name'];
B 688         $dns_rr[$r]['aux'] = 0;
689         $r++;
690     }
b1a6a5 691     //print('<pre>');
MC 692     //print_r($dns_rr);
693     //print('</pre>');
694
695
4c2c36 696     // Insert the soa record
B 697     $sys_userid = $_SESSION['s']['user']['userid'];
3a11d2 698     $origin = $soa['name'];
MC 699     $ns = $soa['ns'];
700     $mbox = $soa['mbox'];
701     $refresh = $soa['refresh'];
702     $retry = $soa['retry'];
703     $expire = $soa['expire'];
704     $minimum = $soa['minimum'];
705     $ttl = $soa['ttl'];
706     $xfer = '';
707     $serial = $app->functions->intval($soa['serial']+1);
8ab3cd 708     //print_r($soa);
T 709     //die();
710     if($valid_zone_file){
3a11d2 711         $insert_data = array(
MC 712             "sys_userid" => $sys_userid,
713             "sys_groupid" => $sys_groupid,
714             "sys_perm_user" => 'riud',
715             "sys_perm_group" => 'riud',
716             "sys_perm_other" => '',
717             "server_id" => $server_id,
718             "origin" => $origin,
719             "ns" => $ns,
720             "mbox" => $mbox,
721             "serial" => $serial,
722             "refresh" => $refresh,
723             "retry" => $retry,
724             "expire" => $expire,
725             "minimum" => $minimum,
726             "ttl" => $ttl,
727             "active" => 'Y',
728             "xfer" => $xfer
729         );
8ab3cd 730         $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
b1a6a5 731
8ab3cd 732         // Insert the dns_rr records
T 733         if(is_array($dns_rr) && $dns_soa_id > 0)
4c2c36 734         {
8ab3cd 735             foreach($dns_rr as $rr)
T 736             {
3a11d2 737                 $insert_data = array(
MC 738                     "sys_userid" => $sys_userid,
739                     "sys_groupid" => $sys_groupid,
740                     "sys_perm_user" => 'riud',
741                     "sys_perm_group" => 'riud',
742                     "sys_perm_other" => '',
743                     "server_id" => $server_id,
744                     "zone" => $dns_soa_id,
745                     "name" => $rr['name'],
746                     "type" => $rr['type'],
747                     "data" => $rr['data'],
748                     "aux" => $rr['aux'],
749                     "ttl" => $rr['ttl'],
750                     "active" => 'Y'
751                 );
8ab3cd 752                 $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
T 753             }
4c2c36 754         }
02bf99 755         $msg .= $wb['zone_file_successfully_imported_txt'];
8ab3cd 756     } else {
02bf99 757         $error .= $wb['error_no_valid_zone_file_txt'];
4c2c36 758     }
8ab3cd 759     //header('Location: /dns/dns_soa_edit.php?id='.$dns_soa_id);
02bf99 760 } else {
T 761     if(isset($_FILES['file']['name'])) {
762         $error = $wb['no_file_uploaded_error'];
763     }
4c2c36 764 }
8ab3cd 765
4c2c36 766
b1a6a5 767 $app->tpl->setVar('msg', $msg);
MC 768 $app->tpl->setVar('error', $error);
4c2c36 769
B 770 $app->tpl_defaults();
771 $app->tpl->pparse();
772
773
b1a6a5 774 ?>