Completed
Push — master ( dfe0cd...94ecc1 )
by Sam
05:40 queued 02:43
created

AlignedRdataFormatters::makeLine()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 2

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
c 2
b 0
f 0
nc 2
nop 4
dl 0
loc 9
ccs 5
cts 5
cp 1
crap 2
rs 10
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
use Badcow\DNS\Rdata\TXT;
22
23
class AlignedRdataFormatters
24
{
25
    /**
26
     * @var callable[]
27
     */
28
    public static $rdataFormatters = [
29
        SOA::TYPE => __CLASS__.'::SOA',
30
        APL::TYPE => __CLASS__.'::APL',
31
        LOC::TYPE => __CLASS__.'::LOC',
32
        RRSIG::TYPE => __CLASS__.'::RRSIG',
33
        TXT::TYPE => __CLASS__.'::TXT',
34
    ];
35
36
    /**
37
     * @return callable[]
38
     */
39
    public static function getRdataFormatters(): array
40
    {
41
        return self::$rdataFormatters;
42
    }
43
44 3
    public static function SOA(SOA $rdata, int $padding): string
45
    {
46
        $vars = [
47 3
            $rdata->getMname(),
48 3
            $rdata->getRname(),
49 3
            $rdata->getSerial(),
50 3
            $rdata->getRefresh(),
51 3
            $rdata->getRetry(),
52 3
            $rdata->getExpire(),
53 3
            $rdata->getMinimum(),
54
        ];
55
56 3
        $longestVarLength = max(array_map('strlen', $vars));
57
58 3
        return Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
59 3
            self::makeLine((string) $rdata->getMname(), 'MNAME', $longestVarLength, $padding).
60 3
            self::makeLine((string) $rdata->getRname(), 'RNAME', $longestVarLength, $padding).
61 3
            self::makeLine((string) $rdata->getSerial(), 'SERIAL', $longestVarLength, $padding).
62 3
            self::makeLine((string) $rdata->getRefresh(), 'REFRESH', $longestVarLength, $padding).
63 3
            self::makeLine((string) $rdata->getRetry(), 'RETRY', $longestVarLength, $padding).
64 3
            self::makeLine((string) $rdata->getExpire(), 'EXPIRE', $longestVarLength, $padding).
65 3
            self::makeLine((string) $rdata->getMinimum(), 'MINIMUM', $longestVarLength, $padding).
66 3
            str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
67
    }
68
69 1
    public static function APL(APL $rdata, int $padding): string
70
    {
71 1
        $blocks = explode(' ', $rdata->toText());
72 1
        $longestVarLength = (int) max(array_map('strlen', $blocks));
73 1
        $string = Tokens::OPEN_BRACKET.Tokens::LINE_FEED;
74
75 1
        foreach ($blocks as $block) {
76 1
            $string .= self::makeLine($block, null, $longestVarLength, $padding);
77
        }
78
79 1
        return $string.str_repeat(' ', $padding).Tokens::CLOSE_BRACKET;
80
    }
81
82
    /**
83
     * Split the TXT string into 40 character lines if the string is larger than 50 characters.
84
     */
85 1
    public static function TXT(TXT $txt, int $padding): string
86
    {
87 1
        if (null === $txt->getText() || strlen($txt->getText()) <= 50) {
88 1
            return $txt->toText();
89
        }
90
91 1
        $lines = str_split($txt->getText(), 40);
92 1
        $padString = str_repeat(Tokens::SPACE, $padding);
93
94 1
        $rdata = Tokens::OPEN_BRACKET.Tokens::SPACE;
95 1
        foreach ($lines as $line) {
96 1
            $txtSplit = new TXT();
97 1
            $txtSplit->setText($line);
98
99 1
            $rdata .= Tokens::LINE_FEED.$padString.Tokens::SPACE.Tokens::SPACE.$txtSplit->toText();
100
        }
101 1
        $rdata .= Tokens::LINE_FEED.$padString.Tokens::CLOSE_BRACKET;
102
103 1
        return $rdata;
104
    }
105
106
    /**
107
     * Splits the RRSIG Signature into 32 character chunks.
108
     */
109 1
    public static function RRSIG(RRSIG $rrsig, int $padding): string
110
    {
111 1
        $strPadding = str_repeat(Tokens::SPACE, $padding);
112 1
        $signatureParts = str_split(base64_encode($rrsig->getSignature()), 32);
113
114 1
        $rdata = $rrsig->getTypeCovered().Tokens::SPACE.
115 1
            $rrsig->getAlgorithm().Tokens::SPACE.
116 1
            $rrsig->getLabels().Tokens::SPACE.
117 1
            $rrsig->getOriginalTtl().Tokens::SPACE.Tokens::OPEN_BRACKET.Tokens::LINE_FEED.
118 1
            $strPadding.
119 1
            $rrsig->getSignatureExpiration()->format(RRSIG::TIME_FORMAT).Tokens::SPACE.
120 1
            $rrsig->getSignatureInception()->format(RRSIG::TIME_FORMAT).Tokens::SPACE.
121 1
            $rrsig->getKeyTag().Tokens::SPACE.
122 1
            $rrsig->getSignersName();
123
124 1
        foreach ($signatureParts as $line) {
125 1
            $rdata .= Tokens::LINE_FEED.$strPadding.$line;
126
        }
127
128 1
        $rdata .= Tokens::SPACE.Tokens::CLOSE_BRACKET;
129
130 1
        return $rdata;
131
    }
132
133 3
    public static function LOC(LOC $loc, int $padding): string
134
    {
135
        $parts = [
136 3
            'LATITUDE' => (string) $loc->getLatitude(LOC::FORMAT_DMS),
137 3
            'LONGITUDE' => (string) $loc->getLongitude(LOC::FORMAT_DMS),
138 3
            'ALTITUDE' => sprintf('%.2fm', $loc->getAltitude()),
139 3
            'SIZE' => sprintf('%.2fm', $loc->getSize()),
140 3
            'HORIZONTAL PRECISION' => sprintf('%.2fm', $loc->getHorizontalPrecision()),
141 3
            'VERTICAL PRECISION' => sprintf('%.2fm', $loc->getVerticalPrecision()),
142
        ];
143
144 3
        $longestVarLength = max(array_map('strlen', $parts));
145 3
        $rdata = Tokens::OPEN_BRACKET.Tokens::LINE_FEED;
146
147 3
        foreach ($parts as $comment => $text) {
148 3
            $rdata .= self::makeLine($text, $comment, $longestVarLength, $padding);
149
        }
150 3
        $rdata .= str_repeat(Tokens::SPACE, $padding).Tokens::CLOSE_BRACKET;
151
152 3
        return $rdata;
153
    }
154
155
    /**
156
     * Returns a padded line with comment.
157
     *
158
     * @param string $comment
159
     */
160 3
    public static function makeLine(string $text, ?string $comment, int $longestVarLength, int $padding): string
161
    {
162 3
        $output = str_repeat(Tokens::SPACE, $padding).str_pad($text, $longestVarLength);
163
164 3
        if (null !== $comment) {
165 3
            $output .= Tokens::SPACE.Tokens::SEMICOLON.Tokens::SPACE.$comment;
166
        }
167
168 3
        return $output.Tokens::LINE_FEED;
169
    }
170
}
171