Passed
Push — develop ( d30961...dd7b3a )
by Nikolay
34:55 queued 29:58
created

Cidr::getNetMasks()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 39
Code Lines 36

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 36
c 0
b 0
f 0
dl 0
loc 39
rs 9.344
cc 1
nc 1
nop 0
1
<?php
2
3
/*
4
 * MikoPBX - free phone system for small business
5
 * Copyright © 2017-2023 Alexey Portnov and Nikolay Beketov
6
 *
7
 * This program is free software: you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 3 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License along with this program.
18
 * If not, see <https://www.gnu.org/licenses/>.
19
 */
20
21
namespace MikoPBX\AdminCabinet\Library;
22
23
use Phalcon\Di\Injectable;
24
25
class Cidr extends Injectable
26
{
27
    // convert cidr to netmask
28
    // e.g. 21 = 255.255.248.0
29
    public function cidr2netmask(int $cidr): false|string
30
    {
31
        $bin = '';
32
        for ($i = 1; $i <= 32; $i++) {
33
            $bin .= $cidr >= $i ? '1' : '0';
34
        }
35
36
        $netmask = long2ip(intval(bindec($bin)));
37
38
        if ($netmask == "0.0.0.0") {
39
            return false;
40
        }
41
42
        return $netmask;
43
    }
44
45
    // get network address from cidr subnet
46
    // e.g. 10.0.2.56/21 = 10.0.0.0
47
    public function cidr2network(string $ip, int $cidr): false|string
48
    {
49
        return long2ip((ip2long($ip)) & ((-1 << (32 - $cidr))));
50
    }
51
52
    // convert netmask to cidr
53
    // e.g. 255.255.255.128 = 25
54
    public function netmask2cidr(string $netmask): int
55
    {
56
        $bits    = 0;
57
        $netmask = explode(".", $netmask);
58
59
        foreach ($netmask as $octect) {
60
            $bits += strlen(str_replace("0", "", decbin((int)$octect)));
61
        }
62
63
        return $bits;
64
    }
65
66
    // is ip in subnet
67
    // e.g. is 10.5.21.30 in 10.5.16.0/20 == true
68
    //      is 192.168.50.2 in 192.168.30.0/23 == false
69
    public function cidr_match(string $ip, string $network, int $cidr): bool
70
    {
71
        if ((ip2long($ip) & ~((1 << (32 - $cidr)) - 1)) == ip2long($network)) {
72
            return true;
73
        }
74
75
        return false;
76
    }
77
78
    /**
79
     * Retrieves an array of network masks with CIDR notation as the key and the corresponding netmask.
80
     *
81
     * @return array Associative array where keys are CIDR notation (0-32) and values
82
     * are the corresponding netmask strings.
83
     */
84
    public static function getNetMasks(): array
85
    {
86
        $arrMasks = [
87
            "0" => "0 - 0.0.0.0",
88
            "1" => "1 - 128.0.0.0",
89
            "2" => "2 - 192.0.0.0",
90
            "3" => "3 - 224.0.0.0",
91
            "4" => "4 - 240.0.0.0",
92
            "5" => "5 - 248.0.0.0",
93
            "6" => "6 - 252.0.0.0",
94
            "7" => "7 - 254.0.0.0",
95
            "8" => "8 - 255.0.0.0",
96
            "9" => "9 - 255.128.0.0",
97
            "10" => "10 - 255.192.0.0",
98
            "11" => "11 - 255.224.0.0",
99
            "12" => "12 - 255.240.0.0",
100
            "13" => "13 - 255.248.0.0",
101
            "14" => "14 - 255.252.0.0",
102
            "15" => "15 - 255.254.0.0",
103
            "16" => "16 - 255.255.0.0",
104
            "17" => "17 - 255.255.128.0",
105
            "18" => "18 - 255.255.192.0",
106
            "19" => "19 - 255.255.224.0",
107
            "20" => "20 - 255.255.240.0",
108
            "21" => "21 - 255.255.248.0",
109
            "22" => "22 - 255.255.252.0",
110
            "23" => "23 - 255.255.254.0",
111
            "24" => "24 - 255.255.255.0",
112
            "25" => "25 - 255.255.255.128",
113
            "26" => "26 - 255.255.255.192",
114
            "27" => "27 - 255.255.255.224",
115
            "28" => "28 - 255.255.255.240",
116
            "29" => "29 - 255.255.255.248",
117
            "30" => "30 - 255.255.255.252",
118
            "31" => "31 - 255.255.255.254",
119
            "32" => "32 - 255.255.255.255",
120
        ];
121
        krsort($arrMasks, SORT_NUMERIC);
122
        return $arrMasks;
123
    }
124
}
125