LocalSystem::formatData()   B
last analyzed

Complexity

Conditions 7
Paths 7

Size

Total Lines 37
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 21
c 1
b 0
f 0
nc 7
nop 1
dl 0
loc 37
rs 8.6506
1
<?php
2
3
namespace RemotelyLiving\PHPDNS\Mappers;
4
5
use RemotelyLiving\PHPDNS\Entities\DNSRecord;
6
use RemotelyLiving\PHPDNS\Entities\DNSRecordType;
7
use RemotelyLiving\PHPDNS\Entities\Interfaces\DNSRecordInterface;
8
9
use function array_flip;
10
use function sprintf;
11
12
if (!defined('DNS_CAA')) {
13
    define('DNS_CAA', 8192);
14
}
15
16
use const DNS_A;
17
use const DNS_A6;
18
use const DNS_AAAA;
19
use const DNS_ANY;
20
use const DNS_CAA;
21
use const DNS_CNAME;
22
use const DNS_HINFO;
23
use const DNS_MX;
24
use const DNS_NAPTR;
25
use const DNS_NS;
26
use const DNS_PTR;
27
use const DNS_SOA;
28
use const DNS_SRV;
29
use const DNS_TXT;
30
31
final class LocalSystem extends MapperAbstract
32
{
33
    private const PHP_CODE_TYPE_MAP = [
34
        DNS_A => DNSRecordType::TYPE_A,
35
        DNS_CNAME => DNSRecordType::TYPE_CNAME,
36
        DNS_HINFO => DNSRecordType::TYPE_HINFO,
37
        DNS_CAA => DNSRecordType::TYPE_CAA,
38
        DNS_MX => DNSRecordType::TYPE_MX,
39
        DNS_NS => DNSRecordType::TYPE_NS,
40
        DNS_PTR => DNSRecordType::TYPE_PTR,
41
        DNS_SOA => DNSRecordType::TYPE_SOA,
42
        DNS_TXT => DNSRecordType::TYPE_TXT,
43
        DNS_AAAA => DNSRecordType::TYPE_AAAA,
44
        DNS_SRV => DNSRecordType::TYPE_SRV,
45
        DNS_NAPTR => DNSRecordType::TYPE_NAPTR,
46
        DNS_A6 => DNSRecordType::TYPE_A6,
47
        DNS_ANY => DNSRecordType::TYPE_ANY,
48
    ];
49
    /**
50
     * @var string
51
     */
52
    private const TARGET = 'target';
53
    /**
54
     * @var string
55
     */
56
    private const PRI = 'pri';
57
    /**
58
     * @var string
59
     */
60
    private const TEMPLATE = '%s %s %s %s %s %s %s';
61
62
    public function toDNSRecord(): DNSRecordInterface
63
    {
64
        $IPAddress = null;
65
66
        if (isset($this->fields['ipv6'])) {
67
            $IPAddress = $this->fields['ipv6'];
68
        }
69
70
        if (isset($this->fields['ip'])) {
71
            $IPAddress = $this->fields['ip'];
72
        }
73
74
        return DNSRecord::createFromPrimitives(
75
            $this->fields['type'],
76
            $this->fields['host'],
77
            $this->fields['ttl'],
78
            $IPAddress,
79
            $this->fields['class'],
80
            $this->formatData($this->fields)
81
        );
82
    }
83
84
    public function getTypeCodeFromType(DNSRecordType $type): int
85
    {
86
        return array_flip(self::PHP_CODE_TYPE_MAP)[(string)$type] ?? DNS_ANY;
87
    }
88
89
    private function formatData(array $fields): ?string
90
    {
91
        if (isset($this->fields['flags'], $fields['tag'], $fields['value'])) {
92
            return "{$fields['flags']} {$fields['tag']} \"{$fields['value']}\"";
93
        }
94
95
        if (isset($fields['mname'])) {
96
            return sprintf(
97
                self::TEMPLATE,
98
                $fields['mname'],
99
                $fields['rname'],
100
                $fields['serial'],
101
                $fields['refresh'],
102
                $fields['retry'],
103
                $fields['expire'],
104
                $fields['minimum-ttl']
105
            );
106
        }
107
108
        if (isset($fields[self::TARGET], $fields[self::PRI], $fields['weight'], $fields['port'])) {
109
            return "{$fields[self::PRI]} {$fields['weight']} {$fields['port']} {$fields[self::TARGET]}";
110
        }
111
112
113
        if (isset($fields[self::TARGET], $fields[self::PRI])) {
114
            return "{$fields[self::PRI]} {$fields[self::TARGET]}";
115
        }
116
117
        if (isset($fields[self::TARGET])) {
118
            return $fields[self::TARGET];
119
        }
120
121
        if (isset($fields['txt'])) {
122
            return $fields['txt'];
123
        }
124
125
        return null;
126
    }
127
}
128