Completed
Branch Message (ae4f9e)
by Sam
02:45
created

AlignedRdataFormatters   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 149
Duplicated Lines 0 %

Test Coverage

Coverage 96.92%

Importance

Changes 3
Bugs 0 Features 0
Metric Value
eloc 65
c 3
b 0
f 0
dl 0
loc 149
ccs 63
cts 65
cp 0.9692
rs 10
wmc 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A SOA() 0 23 1
A __construct() 0 2 1
A APL() 0 11 2
A LOC() 0 21 1
A makeLine() 0 9 2
A getRdataFormatters() 0 7 1
A RRSIG() 0 22 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of Badcow DNS Library.
7
 *
8
 * (c) Samuel Williams <[email protected]>
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Badcow\DNS;
15
16
use Badcow\DNS\Parser\Tokens;
17
use Badcow\DNS\Rdata\APL;
18
use Badcow\DNS\Rdata\LOC;
19
use Badcow\DNS\Rdata\RRSIG;
20
use Badcow\DNS\Rdata\SOA;
21
22
class AlignedRdataFormatters
23
{
24
    private function __construct()
25
    {
26
    }
27
28
    /**
29
     * @return callable[]
30
     */
31 3
    public static function getRdataFormatters(): array
32
    {
33
        return [
34 3
            SOA::TYPE => __CLASS__.'::SOA',
35 3
            APL::TYPE => __CLASS__.'::APL',
36
            LOC::TYPE => __CLASS__.'::LOC',
37
            RRSIG::TYPE => __CLASS__.'::RRSIG',
38
        ];
39
    }
40
41
    /**
42
     * @param SOA $rdata
43
     * @param int $padding
44
     *
45
     * @return string
46
     */
47 3
    public static function SOA(SOA $rdata, int $padding): string
48
    {
49
        $vars = [
50 3
            $rdata->getMname(),
51 3
            $rdata->getRname(),
52 3
            $rdata->getSerial(),
53 3
            $rdata->getRefresh(),
54 3
            $rdata->getRetry(),
55 3
            $rdata->getExpire(),
56 3
            $rdata->getMinimum(),
57
        ];
58
59 3
        $longestVarLength = max(array_map('strlen', $vars));
60
61
        return Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
62 3
            self::makeLine((string) $rdata->getMname(), 'MNAME', $longestVarLength, $padding).
63 3
            self::makeLine((string) $rdata->getRname(), 'RNAME', $longestVarLength, $padding).
64 3
            self::makeLine((string) $rdata->getSerial(), 'SERIAL', $longestVarLength, $padding).
65 3
            self::makeLine((string) $rdata->getRefresh(), 'REFRESH', $longestVarLength, $padding).
66 3
            self::makeLine((string) $rdata->getRetry(), 'RETRY', $longestVarLength, $padding).
67 3
            self::makeLine((string) $rdata->getExpire(), 'EXPIRE', $longestVarLength, $padding).
68 3
            self::makeLine((string) $rdata->getMinimum(), 'MINIMUM', $longestVarLength, $padding).
69 3
            str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
70
    }
71
72
    /**
73
     * @param APL $rdata
74
     * @param int $padding
75
     *
76
     * @return string
77
     */
78 1
    public static function APL(APL $rdata, int $padding): string
79
    {
80 1
        $blocks = explode(' ', $rdata->toText());
81 1
        $longestVarLength = max(array_map('strlen', $blocks));
82 1
        $string = Tokens::OPEN_BRACKET.Tokens::LINE_FEED;
83
84 1
        foreach ($blocks as $block) {
85 1
            $string .= self::makeLine($block, null, $longestVarLength, $padding);
86
        }
87
88 1
        return $string.str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
89
    }
90
91
    /**
92
     * Splits the RRSIG Signature into 32 character chunks.
93
     *
94
     * @param RRSIG $rrsig
95
     * @param int   $padding
96
     *
97
     * @return string
98
     */
99 1
    public static function RRSIG(RRSIG $rrsig, int $padding): string
100
    {
101 1
        $strPadding = str_repeat(Tokens::SPACE, $padding);
102 1
        $signatureParts = str_split($rrsig->getSignature(), 32);
103
104 1
        $rdata = $rrsig->getTypeCovered().Tokens::SPACE.
105 1
            $rrsig->getAlgorithm().Tokens::SPACE.
106 1
            $rrsig->getLabels().Tokens::SPACE.
107 1
            $rrsig->getOriginalTtl().Tokens::SPACE.Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
108 1
            $strPadding.
109 1
            $rrsig->getSignatureExpiration()->format(RRSIG::TIME_FORMAT).Tokens::SPACE.
110 1
            $rrsig->getSignatureInception()->format(RRSIG::TIME_FORMAT).Tokens::SPACE.
111 1
            $rrsig->getKeyTag().Tokens::SPACE.
112 1
            $rrsig->getSignersName();
113
114 1
        foreach ($signatureParts as $line) {
115 1
            $rdata .= Tokens::LINE_FEED.$strPadding.$line;
116
        }
117
118 1
        $rdata .= Tokens::SPACE.Tokens::CLOSE_BRACKET;
119
120 1
        return $rdata;
121
    }
122
123
    /**
124
     * @param LOC $rdata
125
     * @param int $padding
126
     *
127
     * @return string
128
     */
129 3
    public static function LOC(LOC $rdata, int $padding): string
130
    {
131
        $parts = [
132 3
            $rdata->getLatitude(LOC::FORMAT_DMS),
133 3
            $rdata->getLongitude(LOC::FORMAT_DMS),
134 3
            sprintf('%.2fm', $rdata->getAltitude()),
135 3
            sprintf('%.2fm', $rdata->getSize()),
136 3
            sprintf('%.2fm', $rdata->getHorizontalPrecision()),
137 3
            sprintf('%.2fm', $rdata->getVerticalPrecision()),
138
        ];
139
140 3
        $longestVarLength = max(array_map('strlen', $parts));
141
142
        return Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
143 3
            self::makeLine((string) $rdata->getLatitude(LOC::FORMAT_DMS), 'LATITUDE', $longestVarLength, $padding).
144 3
            self::makeLine((string) $rdata->getLongitude(LOC::FORMAT_DMS), 'LONGITUDE', $longestVarLength, $padding).
145 3
            self::makeLine(sprintf('%.2fm', $rdata->getAltitude()), 'ALTITUDE', $longestVarLength, $padding).
146 3
            self::makeLine(sprintf('%.2fm', $rdata->getSize()), 'SIZE', $longestVarLength, $padding).
147 3
            self::makeLine(sprintf('%.2fm', $rdata->getHorizontalPrecision()), 'HORIZONTAL PRECISION', $longestVarLength, $padding).
148 3
            self::makeLine(sprintf('%.2fm', $rdata->getVerticalPrecision()), 'VERTICAL PRECISION', $longestVarLength, $padding).
149 3
            str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
150
    }
151
152
    /**
153
     * Returns a padded line with comment.
154
     *
155
     * @param string $text
156
     * @param string $comment
157
     * @param int    $longestVarLength
158
     * @param int    $padding
159
     *
160
     * @return string
161
     */
162 3
    public static function makeLine(string $text, ?string $comment, int $longestVarLength, int $padding): string
163
    {
164 3
        $output = str_repeat(Tokens::SPACE, $padding).str_pad($text, $longestVarLength);
165
166 3
        if (null !== $comment) {
167 3
            $output .= Tokens::SPACE.Tokens::SEMICOLON.Tokens::SPACE.$comment;
168
        }
169
170 3
        return $output.Tokens::LINE_FEED;
171
    }
172
}
173