Completed
Branch Version3 (22030a)
by Sam
01:45
created

Factory::SOA()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 10
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 13
ccs 10
cts 10
cp 1
rs 9.8333
c 0
b 0
f 0
cc 1
nc 1
nop 7
crap 1
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\Rdata;
15
16
use PhpIP\IPBlock;
17
18
class Factory
19
{
20
    /**
21
     * Creates a new RData object from a name.
22
     *
23
     * @param string $name
24
     *
25
     * @throws UnsupportedTypeException
26
     *
27
     * @return RdataInterface
28
     */
29 1
    public static function newRdataFromName(string $name): RdataInterface
30
    {
31 1
        if (!self::isTypeImplemented($name)) {
32 1
            throw new UnsupportedTypeException($name);
33
        }
34
35 1
        $className = self::getRdataClassName($name);
36
37 1
        return new $className();
38
    }
39
40
    /**
41
     * @param int $id
42
     *
43
     * @return RdataInterface
44
     *
45
     * @throws UnsupportedTypeException
46
     */
47
    public static function newRdataFromId(int $id): RdataInterface
48
    {
49
        return self::newRdataFromName(TypeCodes::getName($id));
50
    }
51
52
    /**
53
     * @param string $name
54
     *
55
     * @return bool
56
     */
57 17
    public static function isTypeImplemented(string $name): bool
58
    {
59 17
        return class_exists(self::getRdataClassName($name));
60
    }
61
62
    /**
63
     * @param string $type
64
     * @param string $text
65
     *
66
     * @return RdataInterface
67
     */
68 16
    public static function textToRdataType(string $type, string $text): RdataInterface
69
    {
70 16
        if (!self::isTypeImplemented($type)) {
71 1
            return new PolymorphicRdata($type, $text);
72
        }
73
74
        /** @var callable $callable */
75 15
        $callable = self::getRdataClassName($type).'::fromText';
76
77 15
        return call_user_func($callable, $text);
78
    }
79
80
    /**
81
     * Get the fully qualified class name of the RData class for $type.
82
     *
83
     * @param string $type
84
     *
85
     * @return string
86
     */
87 17
    public static function getRdataClassName(string $type): string
88
    {
89 17
        return __NAMESPACE__.'\\'.strtoupper($type);
90
    }
91
92
    /**
93
     * Create a new AAAA R-Data object.
94
     *
95
     * @param string $address
96
     *
97
     * @return AAAA
98
     */
99 12
    public static function AAAA(string $address): AAAA
100
    {
101 12
        $rdata = new AAAA();
102 12
        $rdata->setAddress($address);
103
104 12
        return $rdata;
105
    }
106
107
    /**
108
     * Create a new A R-Data object.
109
     *
110
     * @param string $address
111
     *
112
     * @return A
113
     */
114 12
    public static function A(string $address): A
115
    {
116 12
        $rdata = new A();
117 12
        $rdata->setAddress($address);
118
119 12
        return $rdata;
120
    }
121
122
    /**
123
     * Create a new CNAME object.
124
     *
125
     * @param string $cname
126
     *
127
     * @return CNAME
128
     */
129 9
    public static function CNAME(string $cname): CNAME
130
    {
131 9
        $rdata = new CNAME();
132 9
        $rdata->setTarget($cname);
133
134 9
        return $rdata;
135
    }
136
137
    /**
138
     * @param string $cpu
139
     * @param string $os
140
     *
141
     * @return HINFO
142
     */
143 9
    public static function HINFO(string $cpu, string $os): HINFO
144
    {
145 9
        $rdata = new HINFO();
146 9
        $rdata->setCpu($cpu);
147 9
        $rdata->setOs($os);
148
149 9
        return $rdata;
150
    }
151
152
    /**
153
     * @param int    $preference
154
     * @param string $exchange
155
     *
156
     * @return MX
157
     */
158 11
    public static function MX(int $preference, string $exchange): MX
159
    {
160 11
        $rdata = new MX();
161 11
        $rdata->setPreference($preference);
162 11
        $rdata->setExchange($exchange);
163
164 11
        return $rdata;
165
    }
166
167
    /**
168
     * @param string $mname
169
     * @param string $rname
170
     * @param int    $serial
171
     * @param int    $refresh
172
     * @param int    $retry
173
     * @param int    $expire
174
     * @param int    $minimum
175
     *
176
     * @return SOA
177
     */
178 14
    public static function SOA(string $mname, string $rname, int $serial, int $refresh, int $retry, int $expire, int $minimum): SOA
179
    {
180 14
        $rdata = new SOA();
181 14
        $rdata->setMname($mname);
182 14
        $rdata->setRname($rname);
183 14
        $rdata->setSerial($serial);
184 14
        $rdata->setRefresh($refresh);
185 14
        $rdata->setRetry($retry);
186 14
        $rdata->setExpire($expire);
187 14
        $rdata->setMinimum($minimum);
188
189 14
        return $rdata;
190
    }
191
192
    /**
193
     * @param string $nsdname
194
     *
195
     * @return NS
196
     */
197 13
    public static function NS(string $nsdname): NS
198
    {
199 13
        $rdata = new NS();
200 13
        $rdata->setTarget($nsdname);
201
202 13
        return $rdata;
203
    }
204
205
    /**
206
     * @param string $text
207
     *
208
     * @return TXT
209
     */
210 10
    public static function TXT(string $text): TXT
211
    {
212 10
        $rdata = new TXT();
213 10
        $rdata->setText($text);
214
215 10
        return $rdata;
216
    }
217
218
    /**
219
     * @param string $target
220
     *
221
     * @return DNAME
222
     */
223 9
    public static function DNAME(string $target): DNAME
224
    {
225 9
        $rdata = new DNAME();
226 9
        $rdata->setTarget($target);
227
228 9
        return $rdata;
229
    }
230
231
    /**
232
     * @param float $lat
233
     * @param float $lon
234
     * @param float $alt
235
     * @param float $size
236
     * @param float $hp
237
     * @param float $vp
238
     *
239
     * @return LOC
240
     */
241 10
    public static function LOC(float $lat, float $lon, $alt = 0.0, $size = 1.0, $hp = 10000.0, $vp = 10.0): LOC
242
    {
243 10
        $loc = new LOC();
244 10
        $loc->setLatitude($lat);
245 10
        $loc->setLongitude($lon);
246 10
        $loc->setAltitude($alt);
247 10
        $loc->setSize($size);
248 10
        $loc->setHorizontalPrecision($hp);
249 10
        $loc->setVerticalPrecision($vp);
250
251 10
        return $loc;
252
    }
253
254
    /**
255
     * @param string $target
256
     *
257
     * @return PTR
258
     */
259 2
    public static function PTR(string $target): PTR
260
    {
261 2
        $ptr = new PTR();
262 2
        $ptr->setTarget($target);
263
264 2
        return $ptr;
265
    }
266
267
    /**
268
     * @param int    $flags
269
     * @param int    $algorithm
270
     * @param string $publicKey
271
     *
272
     * @return DNSKEY
273
     */
274 1
    public static function DNSKEY(int $flags, int $algorithm, string $publicKey): DNSKEY
275
    {
276 1
        $rdata = new DNSKEY();
277 1
        $rdata->setFlags($flags);
278 1
        $rdata->setAlgorithm($algorithm);
279 1
        $rdata->setPublicKey($publicKey);
280
281 1
        return $rdata;
282
    }
283
284
    /**
285
     * @param int    $keyTag
286
     * @param int    $algorithm
287
     * @param string $digest
288
     * @param int    $digestType
289
     *
290
     * @return DS
291
     */
292 1
    public static function DS(int $keyTag, int $algorithm, string $digest, int $digestType = DS::DIGEST_SHA1): DS
293
    {
294 1
        $rdata = new DS();
295 1
        $rdata->setKeyTag($keyTag);
296 1
        $rdata->setAlgorithm($algorithm);
297 1
        $rdata->setDigest($digest);
298 1
        $rdata->setDigestType($digestType);
299
300 1
        return $rdata;
301
    }
302
303
    /**
304
     * @param string $nextDomainName
305
     * @param array  $types
306
     *
307
     * @return NSEC
308
     */
309 1
    public static function NSEC(string $nextDomainName, array $types): NSEC
310
    {
311 1
        $rdata = new NSEC();
312 1
        $rdata->setNextDomainName($nextDomainName);
313 1
        array_map([$rdata, 'addType'], $types);
314
315 1
        return $rdata;
316
    }
317
318
    /**
319
     * @param string    $typeCovered
320
     * @param int       $algorithm
321
     * @param int       $labels
322
     * @param int       $originalTtl
323
     * @param \DateTime $signatureExpiration
324
     * @param \DateTime $signatureInception
325
     * @param int       $keyTag
326
     * @param string    $signersName
327
     * @param string    $signature
328
     *
329
     * @return RRSIG
330
     */
331 1
    public static function RRSIG(string $typeCovered, int $algorithm, int $labels, int $originalTtl,
332
                                 \DateTime $signatureExpiration, \DateTime $signatureInception, int $keyTag,
333
                                 string $signersName, string $signature): RRSIG
334
    {
335 1
        $rrsig = new RRSIG();
336 1
        $rrsig->setTypeCovered($typeCovered);
337 1
        $rrsig->setAlgorithm($algorithm);
338 1
        $rrsig->setLabels($labels);
339 1
        $rrsig->setOriginalTtl($originalTtl);
340 1
        $rrsig->setSignatureExpiration($signatureExpiration);
341 1
        $rrsig->setSignatureInception($signatureInception);
342 1
        $rrsig->setKeyTag($keyTag);
343 1
        $rrsig->setSignersName($signersName);
344 1
        $rrsig->setSignature($signature);
345
346 1
        return $rrsig;
347
    }
348
349
    /**
350
     * @param int    $priority
351
     * @param int    $weight
352
     * @param int    $port
353
     * @param string $target
354
     *
355
     * @return SRV
356
     */
357 1
    public static function SRV(int $priority, int $weight, int $port, string $target): SRV
358
    {
359 1
        $rdata = new SRV();
360 1
        $rdata->setPriority($priority);
361 1
        $rdata->setWeight($weight);
362 1
        $rdata->setPort($port);
363 1
        $rdata->setTarget($target);
364
365 1
        return $rdata;
366
    }
367
368
    /**
369
     * @param IPBlock[] $includedRanges
370
     * @param IPBlock[] $excludedRanges
371
     *
372
     * @return APL
373
     */
374 2
    public static function APL(array $includedRanges = [], array $excludedRanges = []): APL
375
    {
376 2
        $rdata = new APL();
377
378 2
        foreach ($includedRanges as $ipBlock) {
379 2
            $rdata->addAddressRange($ipBlock, true);
380
        }
381
382 2
        foreach ($excludedRanges as $ipBlock) {
383 2
            $rdata->addAddressRange($ipBlock, false);
384
        }
385
386 2
        return $rdata;
387
    }
388
389
    /**
390
     * @param int    $flag
391
     * @param string $tag
392
     * @param string $value
393
     *
394
     * @return CAA
395
     */
396 1
    public static function CAA(int $flag, string $tag, string $value): CAA
397
    {
398 1
        $rdata = new CAA();
399 1
        $rdata->setFlag($flag);
400 1
        $rdata->setTag($tag);
401 1
        $rdata->setValue($value);
402
403 1
        return $rdata;
404
    }
405
406
    /**
407
     * @param int    $subType
408
     * @param string $hostname
409
     *
410
     * @return AFSDB
411
     */
412
    public static function AFSDB(int $subType, string $hostname): AFSDB
413
    {
414
        $afsdb = new AFSDB();
415
        $afsdb->setSubType($subType);
416
        $afsdb->setHostname($hostname);
417
418
        return $afsdb;
419
    }
420
421
    /**
422
     * @param int    $flags
423
     * @param int    $algorithm
424
     * @param string $publicKey
425
     *
426
     * @return CDNSKEY
427
     */
428
    public static function CDNSKEY(int $flags, int $algorithm, string $publicKey): CDNSKEY
429
    {
430
        $cdnskey = new CDNSKEY();
431
        $cdnskey->setFlags($flags);
432
        $cdnskey->setAlgorithm($algorithm);
433
        $cdnskey->setPublicKey($publicKey);
434
435
        return $cdnskey;
436
    }
437
438
    /**
439
     * @param int    $keyTag
440
     * @param int    $algorithm
441
     * @param string $digest
442
     * @param int    $digestType
443
     *
444
     * @return CDS
445
     */
446
    public static function CDS(int $keyTag, int $algorithm, string $digest, int $digestType = DS::DIGEST_SHA1): CDS
447
    {
448
        $cds = new CDS();
449
        $cds->setKeyTag($keyTag);
450
        $cds->setAlgorithm($algorithm);
451
        $cds->setDigest($digest);
452
        $cds->setDigestType($digestType);
453
454
        return $cds;
455
    }
456
457
    /**
458
     * @param int|string $certificateType
459
     * @param int        $keyTag
460
     * @param int        $algorithm
461
     * @param string     $certificate
462
     *
463
     * @return CERT
464
     */
465 1
    public static function CERT($certificateType, int $keyTag, int $algorithm, string $certificate): CERT
466
    {
467 1
        $cert = new CERT();
468 1
        $cert->setCertificateType($certificateType);
469 1
        $cert->setKeyTag($keyTag);
470 1
        $cert->setAlgorithm($algorithm);
471 1
        $cert->setCertificate($certificate);
472
473 1
        return $cert;
474
    }
475
476 1
    public static function CSYNC(int $soaSerial, int $flags, array $types): CSYNC
477
    {
478 1
        $csync = new CSYNC();
479 1
        $csync->setSoaSerial($soaSerial);
480 1
        $csync->setFlags($flags);
481 1
        array_map([$csync, 'addType'], $types);
482
483 1
        return $csync;
484
    }
485
486
    /**
487
     * @param string|null $digest         Set to &null if the $identifier and $fqdn are known
488
     * @param int         $identifierType 16-bit integer
489
     * @param string|null $identifier     This is ignored if $digest is not &null
490
     * @param string|null $fqdn           This is ignored if $digest is not &null
491
     *
492
     * @return DHCID
493
     */
494 3
    public static function DHCID(?string $digest, int $identifierType, ?string $identifier = null, ?string $fqdn = null): DHCID
495
    {
496 3
        $dhcid = new DHCID();
497 3
        if (null !== $digest) {
498
            $dhcid->setIdentifierType($identifierType);
499
            $dhcid->setDigest($digest);
500
501
            return $dhcid;
502
        }
503
504 3
        if (null === $identifier || null === $fqdn) {
505
            throw new \InvalidArgumentException('Identifier and FQDN cannot be null if digest is null.');
506
        }
507
508 3
        $dhcid->setIdentifier($identifierType, $identifier);
509 3
        $dhcid->setFqdn($fqdn);
510
511 3
        return $dhcid;
512
    }
513
514
    /**
515
     * @param int    $keyTag
516
     * @param int    $algorithm
517
     * @param string $digest
518
     * @param int    $digestType
519
     *
520
     * @return DLV
521
     */
522
    public static function DLV(int $keyTag, int $algorithm, string $digest, int $digestType = DS::DIGEST_SHA1): DLV
523
    {
524
        $rdata = new DLV();
525
        $rdata->setKeyTag($keyTag);
526
        $rdata->setAlgorithm($algorithm);
527
        $rdata->setDigest($digest);
528
        $rdata->setDigestType($digestType);
529
530
        return $rdata;
531
    }
532
533
    public static function HIP(): HIP
534
    {
535
        // TODO: Implement HIP() method.
536
    }
537
538
    /**
539
     * @param int         $precedence an 8-bit unsigned integer
540
     * @param string|null $gateway    either &null for no gateway, a fully qualified domain name, or an IPv4 or IPv6 address
541
     * @param int         $algorithm  either IPSECKEY::ALGORITHM_NONE, IPSECKEY::ALGORITHM_DSA, IPSECKEY::ALGORITHM_RSA, or IPSECKEY::ALGORITHM_ECDSA
542
     * @param string|null $publicKey  base64 encoded public key
543
     *
544
     * @return IPSECKEY
545
     */
546 6
    public static function IPSECKEY(int $precedence, ?string $gateway, int $algorithm = 0, ?string $publicKey = null): IPSECKEY
547
    {
548 6
        $ipseckey = new IPSECKEY();
549 6
        $ipseckey->setPrecedence($precedence);
550 6
        $ipseckey->setGateway($gateway);
551 6
        $ipseckey->setPublicKey($algorithm, $publicKey);
552
553 6
        return $ipseckey;
554
    }
555
556
    /**
557
     * @param int    $flags
558
     * @param int    $protocol
559
     * @param int    $algorithm
560
     * @param string $publicKey
561
     *
562
     * @return KEY
563
     */
564
    public static function KEY(int $flags, int $protocol, int $algorithm, string $publicKey): KEY
565
    {
566
        $key = new KEY();
567
        $key->setFlags($flags);
568
        $key->setProtocol($protocol);
569
        $key->setAlgorithm($algorithm);
570
        $key->setPublicKey($publicKey);
571
572
        return $key;
573
    }
574
575
    /**
576
     * @param int    $preference
577
     * @param string $exchanger
578
     *
579
     * @return KX
580
     */
581
    public static function KX(int $preference, string $exchanger): KX
582
    {
583
        $kx = new KX();
584
        $kx->setPreference($preference);
585
        $kx->setExchanger($exchanger);
586
587
        return $kx;
588
    }
589
590
    /**
591
     * @param int    $order
592
     * @param int    $preference
593
     * @param string $flags
594
     * @param string $services
595
     * @param string $regexp
596
     * @param string $replacement
597
     *
598
     * @return NAPTR
599
     */
600 2
    public static function NAPTR(int $order, int $preference, string $flags, string $services, string $regexp, string $replacement): NAPTR
601
    {
602 2
        $naptr = new NAPTR();
603 2
        $naptr->setOrder($order);
604 2
        $naptr->setPreference($preference);
605 2
        $naptr->setFlags($flags);
606 2
        $naptr->setServices($services);
607 2
        $naptr->setRegexp($regexp);
608 2
        $naptr->setReplacement($replacement);
609
610 2
        return $naptr;
611
    }
612
613 1
    public static function NSEC3(int $hashAlgorithm, bool $unsignedDelegationsCovered, int $iterations, string $salt, string $nextHashedOwnerName, array $types): NSEC3
614
    {
615 1
        $nsec3 = new NSEC3();
616 1
        $nsec3->setHashAlgorithm($hashAlgorithm);
617 1
        $nsec3->setUnsignedDelegationsCovered($unsignedDelegationsCovered);
618 1
        $nsec3->setIterations($iterations);
619 1
        $nsec3->setSalt($salt);
620 1
        $nsec3->setNextHashedOwnerName($nextHashedOwnerName);
621 1
        array_map([$nsec3, 'addType'], $types);
622
623 1
        return $nsec3;
624
    }
625
626
    /**
627
     * @param int    $hashAlgorithm
628
     * @param int    $flags
629
     * @param int    $iterations
630
     * @param string $salt
631
     *
632
     * @return NSEC3PARAM
633
     */
634 1
    public static function NSEC3PARAM(int $hashAlgorithm, int $flags, int $iterations, string $salt): NSEC3PARAM
635
    {
636 1
        $nsec3param = new NSEC3PARAM();
637 1
        $nsec3param->setHashAlgorithm($hashAlgorithm);
638 1
        $nsec3param->setFlags($flags);
639 1
        $nsec3param->setIterations($iterations);
640 1
        $nsec3param->setSalt($salt);
641
642 1
        return $nsec3param;
643
    }
644
645
    public static function RP(string $mboxDomain, string $txtDomain): RP
646
    {
647
        $rp = new RP();
648
        $rp->setMailboxDomainName($mboxDomain);
649
        $rp->setTxtDomainName($txtDomain);
650
651
        return $rp;
652
    }
653
654
    /**
655
     * @param string    $typeCovered
656
     * @param int       $algorithm
657
     * @param int       $labels
658
     * @param int       $originalTtl
659
     * @param \DateTime $signatureExpiration
660
     * @param \DateTime $signatureInception
661
     * @param int       $keyTag
662
     * @param string    $signersName
663
     * @param string    $signature
664
     *
665
     * @return SIG
666
     */
667
    public static function SIG(string $typeCovered, int $algorithm, int $labels, int $originalTtl,
668
                                 \DateTime $signatureExpiration, \DateTime $signatureInception, int $keyTag,
669
                                 string $signersName, string $signature): SIG
670
    {
671
        $sig = new SIG();
672
        $sig->setTypeCovered($typeCovered);
673
        $sig->setAlgorithm($algorithm);
674
        $sig->setLabels($labels);
675
        $sig->setOriginalTtl($originalTtl);
676
        $sig->setSignatureExpiration($signatureExpiration);
677
        $sig->setSignatureInception($signatureInception);
678
        $sig->setKeyTag($keyTag);
679
        $sig->setSignersName($signersName);
680
        $sig->setSignature($signature);
681
682
        return $sig;
683
    }
684
685
    /**
686
     * @param int    $algorithm
687
     * @param int    $fpType
688
     * @param string $fingerprint
689
     *
690
     * @return SSHFP
691
     */
692 8
    public static function SSHFP(int $algorithm, int $fpType, string $fingerprint): SSHFP
693
    {
694 8
        $sshfp = new SSHFP();
695 8
        $sshfp->setAlgorithm($algorithm);
696 6
        $sshfp->setFingerprintType($fpType);
697 4
        $sshfp->setFingerprint($fingerprint);
698
699 3
        return $sshfp;
700
    }
701
702
    /**
703
     * @param int    $keyTag
704
     * @param int    $algorithm
705
     * @param string $digest
706
     * @param int    $digestType
707
     *
708
     * @return TA
709
     */
710
    public static function TA(int $keyTag, int $algorithm, string $digest, int $digestType = DS::DIGEST_SHA1): TA
711
    {
712
        $ta = new TA();
713
        $ta->setKeyTag($keyTag);
714
        $ta->setAlgorithm($algorithm);
715
        $ta->setDigest($digest);
716
        $ta->setDigestType($digestType);
717
718
        return $ta;
719
    }
720
721
    /**
722
     * @param string    $algorithm
723
     * @param \DateTime $inception
724
     * @param \DateTime $expiration
725
     * @param int       $mode
726
     * @param int       $error
727
     * @param string    $keyData    binary string
728
     * @param string    $otherData  binary string
729
     *
730
     * @return TKEY
731
     */
732 1
    public static function TKEY(string $algorithm, \DateTime $inception, \DateTime $expiration, int $mode, int $error, string $keyData, string $otherData = ''): TKEY
733
    {
734 1
        $tkey = new TKEY();
735 1
        $tkey->setAlgorithm($algorithm);
736 1
        $tkey->setInception($inception);
737 1
        $tkey->setExpiration($expiration);
738 1
        $tkey->setMode($mode);
739 1
        $tkey->setError($error);
740 1
        $tkey->setKeyData($keyData);
741 1
        $tkey->setOtherData($otherData);
742
743 1
        return $tkey;
744
    }
745
746
    public static function TLSA(): TLSA
747
    {
748
        // TODO: Implement TLSA() method.
749
    }
750
751
    public static function TSIG(): TSIG
752
    {
753
        // TODO: Implement TSIG() method.
754
    }
755
756
    /**
757
     * @param int    $priority
758
     * @param int    $weight
759
     * @param string $target
760
     *
761
     * @return URI
762
     */
763 6
    public static function URI(int $priority, int $weight, string $target): URI
764
    {
765 6
        $uri = new URI();
766 6
        $uri->setPriority($priority);
767 4
        $uri->setWeight($weight);
768 2
        $uri->setTarget($target);
769
770 1
        return $uri;
771
    }
772
}
773