Marius Burkard
2016-04-20 4569cae57f127afd093794310ccd290d2d9fdf36
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) != ';'){
81b7f7 218             if(strpos($line, ";") !== FALSE) {
FS 219                 if (!preg_match("/v=DKIM|v=DMARC/",$line)) {
220                     $line = substr($line, 0, strpos($line, ";"));
221                 }
222             }
223             if(strpos($line, "(") !== FALSE ) {
224                 if (!preg_match("/v=DKIM/",$line)) {
225                     $line = substr($line, 0, strpos($line, "("));
226                 }
227             }
228             if(strpos($line, ")") !== FALSE ) {
229                 if (!preg_match("/v=DKIM/",$line)) {
230                     $line = substr($line, 0, strpos($line, ")"));
231                 }
232             }
233             
8ab3cd 234             $line = trim($line);
T 235             if ($line != ''){
236                 $sPattern = '/\s+/m';
237                 $sReplace = ' ';
238                 $new_lines[] = preg_replace($sPattern, $sReplace, $line);
239             }
240         }
241     }
242     unset($lines);
243     $lines = $new_lines;
244     unset($new_lines);
b1a6a5 245
4c2c36 246     //$lines = file("apriqot.se.txt");
b1a6a5 247     $name = str_replace("txt", "", $_FILES['file']['name']);
MC 248     $name = str_replace("zone", "", $name);
8ab3cd 249
T 250     if ($domain !== NULL){
4c2c36 251         $name = $domain;
B 252     }
b1a6a5 253
MC 254     if (substr($name, -1) != "."){
8ab3cd 255         $name .= ".";
T 256     }
b1a6a5 257
8ab3cd 258     $i = 0;
T 259     $origin_exists = FALSE;
260     $soa_array_key = -1;
261     $soa = array();
262     $soa['name'] = $name;
263     $r = 0;
264     $dns_rr = array();
265     foreach($lines as $line){
b1a6a5 266
8ab3cd 267         $parts = explode(' ', $line);
b1a6a5 268
81b7f7 269         // make elements lowercase
FS 270         $dkim=@($parts[3]=='"v=DKIM1;')?true:false;
271         $dmarc=@($parts[3]=='"v=DMARC1;')?true:false;
272
8ab3cd 273         $new_parts = array();
T 274         foreach($parts as $part){
81b7f7 275             if(!$dkim && !$dmarc) {
FS 276                 $new_parts[] = strtolower($part);
277             } else {
278                 $new_parts[] = $part;
279             }
8ab3cd 280         }
T 281         unset($parts);
282         $parts = $new_parts;
283         unset($new_parts);
b1a6a5 284
8ab3cd 285         // if ORIGIN exists, overwrite $soa['name']
T 286         if($parts[0] == '$origin'){
287             $soa['name'] = $parts[1];
288             $origin_exists = TRUE;
289         }
290         // TTL
291         if($parts[0] == '$ttl'){
b1a6a5 292             $time_format = strtolower(substr($parts[1], -1));
02bf99 293             switch ($time_format) {
b1a6a5 294             case 's':
MC 295                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1));
296                 break;
297             case 'm':
298                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 60;
299                 break;
300             case 'h':
301                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 3600;
302                 break;
303             case 'd':
304                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 86400;
305                 break;
306             case 'w':
307                 $soa['ttl'] = $app->functions->intval(substr($parts[1], 0, -1)) * 604800;
308                 break;
309             default:
310                 $soa['ttl'] = $app->functions->intval($parts[1]);
02bf99 311             }
T 312             unset($time_format);
8ab3cd 313         }
T 314         // SOA
315         if(in_array("soa", $parts)){
316             $soa['mbox'] = array_pop($parts);
317             //$soa['ns'] = array_pop($parts);
318             $soa['ns'] = $servers[0]['server_name'];
319             // if domain is part of SOA, overwrite $soa['name']
320             if($parts[0] != '@' && $parts[0] != 'in' && $parts[0] != 'soa' && $origin_exists === FALSE){
321                 $soa['name'] = $parts[0];
322             }
323             $soa_array_key = $i;
324             $valid_zone_file = TRUE;
325         }
326         // SERIAL
65ea2e 327         if($i == ($soa_array_key + 1)) $soa['serial'] = $app->functions->intval($parts[0]);
8ab3cd 328         // REFRESH
02bf99 329         if($i == ($soa_array_key + 2)){
b1a6a5 330             $time_format = strtolower(substr($parts[0], -1));
02bf99 331             switch ($time_format) {
b1a6a5 332             case 's':
MC 333                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1));
334                 break;
335             case 'm':
336                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
337                 break;
338             case 'h':
339                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
340                 break;
341             case 'd':
342                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
343                 break;
344             case 'w':
345                 $soa['refresh'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
346                 break;
347             default:
348                 $soa['refresh'] = $app->functions->intval($parts[0]);
02bf99 349             }
T 350             unset($time_format);
351         }
8ab3cd 352         // RETRY
02bf99 353         if($i == ($soa_array_key + 3)){
b1a6a5 354             $time_format = strtolower(substr($parts[0], -1));
02bf99 355             switch ($time_format) {
b1a6a5 356             case 's':
MC 357                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1));
358                 break;
359             case 'm':
360                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
361                 break;
362             case 'h':
363                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
364                 break;
365             case 'd':
366                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
367                 break;
368             case 'w':
369                 $soa['retry'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
370                 break;
371             default:
372                 $soa['retry'] = $app->functions->intval($parts[0]);
02bf99 373             }
T 374             unset($time_format);
375         }
8ab3cd 376         // EXPIRE
02bf99 377         if($i == ($soa_array_key + 4)){
b1a6a5 378             $time_format = strtolower(substr($parts[0], -1));
02bf99 379             switch ($time_format) {
b1a6a5 380             case 's':
MC 381                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1));
382                 break;
383             case 'm':
384                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
385                 break;
386             case 'h':
387                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
388                 break;
389             case 'd':
390                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
391                 break;
392             case 'w':
393                 $soa['expire'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
394                 break;
395             default:
396                 $soa['expire'] = $app->functions->intval($parts[0]);
02bf99 397             }
T 398             unset($time_format);
399         }
8ab3cd 400         // MINIMUM
02bf99 401         if($i == ($soa_array_key + 5)){
b1a6a5 402             $time_format = strtolower(substr($parts[0], -1));
02bf99 403             switch ($time_format) {
b1a6a5 404             case 's':
MC 405                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1));
406                 break;
407             case 'm':
408                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 60;
409                 break;
410             case 'h':
411                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 3600;
412                 break;
413             case 'd':
414                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 86400;
415                 break;
416             case 'w':
417                 $soa['minimum'] = $app->functions->intval(substr($parts[0], 0, -1)) * 604800;
418                 break;
419             default:
420                 $soa['minimum'] = $app->functions->intval($parts[0]);
02bf99 421             }
T 422             unset($time_format);
423         }
8ab3cd 424         // RESOURCE RECORDS
T 425         if($i > ($soa_array_key + 5)){
b1a6a5 426             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 427                 if(is_numeric($parts[1])){
T 428                     if($parts[2] == 'in'){
429                         $resource_type = $parts[3];
430                         $pkey = 3;
431                     } else {
432                         $resource_type = $parts[2];
433                         $pkey = 2;
434                     }
435                 } else {
436                     if($parts[1] == 'in'){
437                         $resource_type = $parts[2];
438                         $pkey = 2;
439                     } else {
440                         $resource_type = $parts[1];
441                         $pkey = 1;
442                     }
443                 }
444                 $dns_rr[$r]['type'] = $resource_type;
445                 if($parts[0] == '@' || $parts[0] == '.'){
446                     $dns_rr[$r]['name'] = $soa['name'];
447                 } else {
448                     $dns_rr[$r]['name'] = $parts[0];
449                 }
450                 if(is_numeric($parts[1])){
65ea2e 451                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 452                 } else {
T 453                     $dns_rr[$r]['ttl'] = $soa['ttl'];
454                 }
455                 switch ($resource_type) {
b1a6a5 456                 case 'mx':
MC 457                 case 'srv':
458                     $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
459                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
460                     break;
461                 case 'txt':
462                     $dns_rr[$r]['aux'] = 0;
463                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
464                     if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
465                     if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
466                     break;
467                 default:
468                     $dns_rr[$r]['aux'] = 0;
469                     $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 470                 }
T 471             } else {
472                 // a 3600 IN A 1.2.3.4
473                 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')){
474                     $resource_type = $parts[3];
475                     $pkey = 3;
476                     $dns_rr[$r]['type'] = $resource_type;
477                     $dns_rr[$r]['name'] = $parts[0];
65ea2e 478                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 479                     switch ($resource_type) {
b1a6a5 480                     case 'mx':
MC 481                     case 'srv':
482                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
483                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
484                         break;
485                     case 'txt':
486                         $dns_rr[$r]['aux'] = 0;
487                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
488                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
489                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
490                         break;
491                     default:
492                         $dns_rr[$r]['aux'] = 0;
493                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 494                     }
b1a6a5 495                 }
8ab3cd 496                 // a IN A 1.2.3.4
T 497                 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')){
498                     $resource_type = $parts[2];
499                     $pkey = 2;
500                     $dns_rr[$r]['type'] = $resource_type;
501                     $dns_rr[$r]['name'] = $parts[0];
502                     $dns_rr[$r]['ttl'] = $soa['ttl'];
503                     switch ($resource_type) {
b1a6a5 504                     case 'mx':
MC 505                     case 'srv':
506                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
507                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
508                         break;
509                     case 'txt':
510                         $dns_rr[$r]['aux'] = 0;
511                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
512                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
513                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
514                         break;
515                     default:
516                         $dns_rr[$r]['aux'] = 0;
517                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 518                     }
b1a6a5 519                 }
8ab3cd 520                 // a 3600 A 1.2.3.4
T 521                 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')){
522                     $resource_type = $parts[2];
523                     $pkey = 2;
524                     $dns_rr[$r]['type'] = $resource_type;
525                     $dns_rr[$r]['name'] = $parts[0];
65ea2e 526                     $dns_rr[$r]['ttl'] = $app->functions->intval($parts[1]);
8ab3cd 527                     switch ($resource_type) {
b1a6a5 528                     case 'mx':
MC 529                     case 'srv':
530                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
531                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
532                         break;
533                     case 'txt':
534                         $dns_rr[$r]['aux'] = 0;
535                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
536                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
537                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
538                         break;
539                     default:
540                         $dns_rr[$r]['aux'] = 0;
541                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 542                     }
b1a6a5 543                 }
8ab3cd 544                 // A 1.2.3.4
T 545                 // MX 10 mail
546                 // TXT "v=spf1 a mx ptr -all"
547                 else {
548                     $resource_type = $parts[0];
549                     $pkey = 0;
550                     $dns_rr[$r]['type'] = $resource_type;
551                     $dns_rr[$r]['name'] = $soa['name'];
552                     $dns_rr[$r]['ttl'] = $soa['ttl'];
553                     switch ($resource_type) {
b1a6a5 554                     case 'mx':
MC 555                     case 'srv':
556                         $dns_rr[$r]['aux'] = $app->functions->intval($parts[$pkey+1]);
557                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+2));
558                         break;
559                     case 'txt':
560                         $dns_rr[$r]['aux'] = 0;
561                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
562                         if(substr($dns_rr[$r]['data'], 0, 1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 1);
563                         if(substr($dns_rr[$r]['data'], -1) == '"') $dns_rr[$r]['data'] = substr($dns_rr[$r]['data'], 0, -1);
564                         break;
565                     default:
566                         $dns_rr[$r]['aux'] = 0;
567                         $dns_rr[$r]['data'] = implode(' ', array_slice($parts, $pkey+1));
8ab3cd 568                     }
T 569                 }
570             }
571             $dns_rr[$r]['type'] = strtoupper($dns_rr[$r]['type']);
572             if($dns_rr[$r]['type'] == 'NS' && $dns_rr[$r]['name'] == $soa['name']){
573                 unset($dns_rr[$r]);
574             }
575             $r++;
576         }
577         $i++;
578     }
4c2c36 579
8ab3cd 580     foreach ($servers as $server){
T 581         $dns_rr[$r]['name'] = $soa['name'];
582         $dns_rr[$r]['type'] = 'NS';
4c2c36 583         $dns_rr[$r]['data'] = $server['server_name'];
B 584         $dns_rr[$r]['aux'] = 0;
585         $r++;
586     }
b1a6a5 587     //print('<pre>');
MC 588     //print_r($dns_rr);
589     //print('</pre>');
590
591
4c2c36 592     // Insert the soa record
B 593     $sys_userid = $_SESSION['s']['user']['userid'];
3a11d2 594     $origin = $soa['name'];
MC 595     $ns = $soa['ns'];
596     $mbox = $soa['mbox'];
597     $refresh = $soa['refresh'];
598     $retry = $soa['retry'];
599     $expire = $soa['expire'];
600     $minimum = $soa['minimum'];
601     $ttl = $soa['ttl'];
602     $xfer = '';
603     $serial = $app->functions->intval($soa['serial']+1);
8ab3cd 604     //print_r($soa);
T 605     //die();
606     if($valid_zone_file){
3a11d2 607         $insert_data = array(
MC 608             "sys_userid" => $sys_userid,
609             "sys_groupid" => $sys_groupid,
610             "sys_perm_user" => 'riud',
611             "sys_perm_group" => 'riud',
612             "sys_perm_other" => '',
613             "server_id" => $server_id,
614             "origin" => $origin,
615             "ns" => $ns,
616             "mbox" => $mbox,
617             "serial" => $serial,
618             "refresh" => $refresh,
619             "retry" => $retry,
620             "expire" => $expire,
621             "minimum" => $minimum,
622             "ttl" => $ttl,
623             "active" => 'Y',
624             "xfer" => $xfer
625         );
8ab3cd 626         $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
b1a6a5 627
8ab3cd 628         // Insert the dns_rr records
T 629         if(is_array($dns_rr) && $dns_soa_id > 0)
4c2c36 630         {
8ab3cd 631             foreach($dns_rr as $rr)
T 632             {
3a11d2 633                 $insert_data = array(
MC 634                     "sys_userid" => $sys_userid,
635                     "sys_groupid" => $sys_groupid,
636                     "sys_perm_user" => 'riud',
637                     "sys_perm_group" => 'riud',
638                     "sys_perm_other" => '',
639                     "server_id" => $server_id,
640                     "zone" => $dns_soa_id,
641                     "name" => $rr['name'],
642                     "type" => $rr['type'],
643                     "data" => $rr['data'],
644                     "aux" => $rr['aux'],
645                     "ttl" => $rr['ttl'],
646                     "active" => 'Y'
647                 );
8ab3cd 648                 $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
T 649             }
4c2c36 650         }
02bf99 651         $msg .= $wb['zone_file_successfully_imported_txt'];
8ab3cd 652     } else {
02bf99 653         $error .= $wb['error_no_valid_zone_file_txt'];
4c2c36 654     }
8ab3cd 655     //header('Location: /dns/dns_soa_edit.php?id='.$dns_soa_id);
02bf99 656 } else {
T 657     if(isset($_FILES['file']['name'])) {
658         $error = $wb['no_file_uploaded_error'];
659     }
4c2c36 660 }
8ab3cd 661
4c2c36 662
b1a6a5 663 $app->tpl->setVar('msg', $msg);
MC 664 $app->tpl->setVar('error', $error);
4c2c36 665
B 666 $app->tpl_defaults();
667 $app->tpl->pparse();
668
669
b1a6a5 670 ?>