mirror of
https://github.com/Unkn0wnCat/data-toolbox-site.git
synced 2025-05-07 22:05:52 +02:00
Fix edge cases in IPv4SubnettingTool
This commit is contained in:
parent
7a3bc44428
commit
ade100fdb8
4 changed files with 129 additions and 14 deletions
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "kevins-data-toolbox",
|
"name": "kevins-data-toolbox",
|
||||||
"version": "2.4.2",
|
"version": "2.4.3",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@loadable/component": "^5.15.0",
|
"@loadable/component": "^5.15.0",
|
||||||
|
|
|
@ -59,14 +59,22 @@
|
||||||
"networking": {
|
"networking": {
|
||||||
"ipv4subnetting": {
|
"ipv4subnetting": {
|
||||||
"title": "IPv4-Subnetzrechner",
|
"title": "IPv4-Subnetzrechner",
|
||||||
"description": "Der IPv4-Subnetzrechner visualisiert IPv4-Subnetze und berechnet die erste und letzte Adresse aus einem Subnetz nach CIDR-Notation."
|
"description": "Der IPv4-Subnetzrechner visualisiert IPv4-Subnetze und berechnet die erste und letzte Adresse aus einem Subnetz nach CIDR-Notation.",
|
||||||
|
"error": {
|
||||||
|
"isNaN": "Dies muss eine Zahl sein!",
|
||||||
|
"tooSmall": "Dies muss eine positive Zahl sein!",
|
||||||
|
"tooBig": "Diese Zahl darf nicht größer als 255 sein!",
|
||||||
|
"tooBigSubnet": "Diese Zahl darf nicht größer als 32 sein!"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"ipv4addr": "IPv4-Adresse",
|
"ipv4addr": "IPv4-Adresse",
|
||||||
"firstAddr": "Erste Adresse",
|
"firstAddr": "Erste Adresse",
|
||||||
"lastAddr": "Letzte Adresse",
|
"lastAddr": "Letzte Adresse",
|
||||||
"subnetMask": "Subnetzmaske",
|
"subnetMask": "Subnetzmaske",
|
||||||
"binary": "Binär"
|
"binary": "Binär",
|
||||||
|
"netAddr": "Netzwerkadresse",
|
||||||
|
"broadcastAddr": "Broadcast-Adresse"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -59,14 +59,22 @@
|
||||||
"networking": {
|
"networking": {
|
||||||
"ipv4subnetting": {
|
"ipv4subnetting": {
|
||||||
"title": "IPv4 Subnetter",
|
"title": "IPv4 Subnetter",
|
||||||
"description": "The IPv4 subnetter visualizes IPv4 subnets and calculates the first and last address from a CIDR-notated subnet."
|
"description": "The IPv4 subnetter visualizes IPv4 subnets and calculates the first and last address from a CIDR-notated subnet.",
|
||||||
|
"error": {
|
||||||
|
"isNaN": "This needs to be a valid number!",
|
||||||
|
"tooSmall": "This needs to be a positive number!",
|
||||||
|
"tooBig": "This may not be bigger than 255!",
|
||||||
|
"tooBigSubnet": "This may not be bigger than 32!"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"common": {
|
"common": {
|
||||||
"ipv4addr": "IPv4 address",
|
"ipv4addr": "IPv4 address",
|
||||||
"firstAddr": "First address",
|
"firstAddr": "First address",
|
||||||
"lastAddr": "Last address",
|
"lastAddr": "Last address",
|
||||||
"subnetMask": "Subnet mask",
|
"subnetMask": "Subnet mask",
|
||||||
"binary": "Binary"
|
"binary": "Binary",
|
||||||
|
"netAddr": "Network address",
|
||||||
|
"broadcastAddr": "Broadcast address"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -34,10 +34,10 @@ const IPv4SubnettingTool = () => {
|
||||||
|
|
||||||
let [ipBinary, setIpBinary] = useState<number|undefined>(undefined);
|
let [ipBinary, setIpBinary] = useState<number|undefined>(undefined);
|
||||||
let [subnetNumber, setSubnetMaskNumber] = useState<number|undefined>(undefined);
|
let [subnetNumber, setSubnetMaskNumber] = useState<number|undefined>(undefined);
|
||||||
let [subnetBinary, setSubnetMaskBinaryString] = useState<string|undefined>(undefined);
|
|
||||||
let [subnetMask, setSubnetMask] = useState<number|undefined>(undefined);
|
let [subnetMask, setSubnetMask] = useState<number|undefined>(undefined);
|
||||||
let [firstAddr, setFirstAddr] = useState<number|undefined>(undefined);
|
let [firstAddr, setFirstAddr] = useState<number|undefined>(undefined);
|
||||||
let [lastAddr, setLastAddr] = useState<number|undefined>(undefined);
|
let [lastAddr, setLastAddr] = useState<number|undefined>(undefined);
|
||||||
|
let [isPeerNet, setIsPeerNet] = useState<boolean>(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let myIpPart1 = ipPart1;
|
let myIpPart1 = ipPart1;
|
||||||
|
@ -92,20 +92,106 @@ const IPv4SubnettingTool = () => {
|
||||||
if(!isNaN(ipPart4Num)) setIPPart4(ipPart4Num.toString());
|
if(!isNaN(ipPart4Num)) setIPPart4(ipPart4Num.toString());
|
||||||
if(!isNaN(subnetNum)) setSubnet(subnetNum.toString());
|
if(!isNaN(subnetNum)) setSubnet(subnetNum.toString());
|
||||||
|
|
||||||
|
let invalid = false;
|
||||||
|
|
||||||
|
[ipInput1, ipInput2, ipInput3, ipInput4].forEach((field) => {
|
||||||
|
if(!field.current) return
|
||||||
|
|
||||||
|
const val = field.current.value;
|
||||||
|
|
||||||
|
if (val === "") {
|
||||||
|
field.current.setCustomValidity("");
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const valInt = parseInt(val);
|
||||||
|
|
||||||
|
if(isNaN(valInt)) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.isNaN"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valInt < 0) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.tooSmall"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valInt > 255) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.tooBig"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
field.current.setCustomValidity("");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
((field: React.RefObject<HTMLInputElement>) => {
|
||||||
|
if(!field.current) return
|
||||||
|
|
||||||
|
const val = field.current.value;
|
||||||
|
|
||||||
|
if (val === "") {
|
||||||
|
field.current.setCustomValidity("");
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const valInt = parseInt(val);
|
||||||
|
|
||||||
|
if(isNaN(valInt)) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.isNaN"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valInt < 0) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.tooSmall"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if(valInt > 32) {
|
||||||
|
field.current.setCustomValidity(t("tools.networking.ipv4subnetting.error.tooBigSubnet"));
|
||||||
|
field.current.reportValidity();
|
||||||
|
invalid = true;
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
field.current.setCustomValidity("");
|
||||||
|
})(subnetInput)
|
||||||
|
|
||||||
setIpBinary(undefined);
|
setIpBinary(undefined);
|
||||||
setFirstAddr(undefined);
|
setFirstAddr(undefined);
|
||||||
setLastAddr(undefined);
|
setLastAddr(undefined);
|
||||||
setSubnetMaskBinaryString(undefined);
|
|
||||||
setSubnetMaskNumber(undefined);
|
setSubnetMaskNumber(undefined);
|
||||||
setSubnetMask(undefined);
|
setSubnetMask(undefined);
|
||||||
|
setIsPeerNet(false);
|
||||||
|
|
||||||
|
if(invalid) return;
|
||||||
|
|
||||||
if(!isNaN(ipPart1Num) && !isNaN(ipPart2Num) && !isNaN(ipPart3Num) && !isNaN(ipPart4Num)) {
|
if(!isNaN(ipPart1Num) && !isNaN(ipPart2Num) && !isNaN(ipPart3Num) && !isNaN(ipPart4Num)) {
|
||||||
let ipBinary = ipPart1Num * Math.pow(2, 24) + ipPart2Num * Math.pow(2, 16) + ipPart3Num * Math.pow(2, 8) + ipPart4Num;
|
let ipBinary = ipPart1Num * Math.pow(2, 24) + ipPart2Num * Math.pow(2, 16) + ipPart3Num * Math.pow(2, 8) + ipPart4Num;
|
||||||
setIpBinary(ipBinary);
|
setIpBinary(ipBinary);
|
||||||
|
|
||||||
|
|
||||||
if (!isNaN(subnetNum)) {
|
if (!isNaN(subnetNum)) {
|
||||||
setSubnetMaskNumber(subnetNum);
|
setSubnetMaskNumber(subnetNum);
|
||||||
|
|
||||||
|
let peerNet = false;
|
||||||
|
|
||||||
|
if (subnetNum > 30) {
|
||||||
|
setIsPeerNet(true);
|
||||||
|
peerNet = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
let subnetMaskBinary = new Uint32Array(1);
|
let subnetMaskBinary = new Uint32Array(1);
|
||||||
|
|
||||||
|
@ -115,14 +201,21 @@ const IPv4SubnettingTool = () => {
|
||||||
|
|
||||||
subnetMaskBinary[0] ^= 0xffffffff
|
subnetMaskBinary[0] ^= 0xffffffff
|
||||||
|
|
||||||
setSubnetMaskBinaryString(subnetMaskBinary[0].toString(2))
|
//setSubnetMaskBinaryString(subnetMaskBinary[0].toString(2))
|
||||||
setSubnetMask(subnetMaskBinary[0])
|
setSubnetMask(subnetMaskBinary[0])
|
||||||
|
|
||||||
setFirstAddr((ipBinary & subnetMaskBinary[0])+1)
|
if(!peerNet) {
|
||||||
setLastAddr((ipBinary | (subnetMaskBinary[0] ^ 0xffffffff)) - 1)
|
setFirstAddr((ipBinary & subnetMaskBinary[0])+1)
|
||||||
|
setLastAddr((ipBinary | (subnetMaskBinary[0] ^ 0xffffffff)) - 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(peerNet) {
|
||||||
|
setFirstAddr((ipBinary & subnetMaskBinary[0]))
|
||||||
|
setLastAddr((ipBinary | (subnetMaskBinary[0] ^ 0xffffffff)))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, [ipPart1, ipPart2, ipPart3, ipPart4, subnet])
|
}, [ipPart1, ipPart2, ipPart3, ipPart4, subnet, t])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<main>
|
<main>
|
||||||
|
@ -149,7 +242,7 @@ const IPv4SubnettingTool = () => {
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<span className={styles.fakeLabel}>{t("tools.networking.common.subnetMask")}</span>
|
<span className={styles.fakeLabel}>{t("tools.networking.common.subnetMask")}</span>
|
||||||
<span className={styles.fakeField}>{subnetMask ? intToIPv4String(subnetMask) : "???"}</span>
|
<span className={styles.fakeField}>{subnetMask || subnetMask === 0 ? intToIPv4String(subnetMask) : "???"}</span>
|
||||||
|
|
||||||
<span className={styles.fakeLabel}>{t("tools.networking.common.firstAddr")}</span>
|
<span className={styles.fakeLabel}>{t("tools.networking.common.firstAddr")}</span>
|
||||||
<span className={styles.fakeField}>{firstAddr ? intToIPv4String(firstAddr) : "???"}</span>
|
<span className={styles.fakeField}>{firstAddr ? intToIPv4String(firstAddr) : "???"}</span>
|
||||||
|
@ -157,16 +250,22 @@ const IPv4SubnettingTool = () => {
|
||||||
<span className={styles.fakeLabel}>{t("tools.networking.common.lastAddr")}</span>
|
<span className={styles.fakeLabel}>{t("tools.networking.common.lastAddr")}</span>
|
||||||
<span className={styles.fakeField}>{lastAddr ? intToIPv4String(lastAddr) : "???"}</span>
|
<span className={styles.fakeField}>{lastAddr ? intToIPv4String(lastAddr) : "???"}</span>
|
||||||
|
|
||||||
|
<span className={styles.fakeLabel}>{t("tools.networking.common.netAddr")}</span>
|
||||||
|
<span className={styles.fakeField}>{isPeerNet ? "n/a" : (firstAddr ? intToIPv4String(firstAddr - 1) : "???")}</span>
|
||||||
|
|
||||||
|
<span className={styles.fakeLabel}>{t("tools.networking.common.broadcastAddr")}</span>
|
||||||
|
<span className={styles.fakeField}>{isPeerNet ? "n/a" : (lastAddr ? intToIPv4String(lastAddr + 1) : "???")}</span>
|
||||||
|
|
||||||
<span className={styles.fakeLabel}>{t("tools.networking.common.ipv4addr")} ({t("tools.networking.common.binary")})</span>
|
<span className={styles.fakeLabel}>{t("tools.networking.common.ipv4addr")} ({t("tools.networking.common.binary")})</span>
|
||||||
<span className={styles.fakeField}>
|
<span className={styles.fakeField}>
|
||||||
{ipBinary ? ipBinary.toString(2).padStart(32, "0").split("").map((bit, index) => {
|
{ipBinary || ipBinary === 0 ? ipBinary.toString(2).padStart(32, "0").split("").map((bit, index) => {
|
||||||
return <span style={{color: (index) >= (subnetNumber||32) ? "red" : undefined}} key={"bit"+index}>{bit}</span>
|
return <span style={{color: (index) >= (subnetNumber||32) ? "red" : undefined}} key={"bit"+index}>{bit}</span>
|
||||||
}) : "???"}
|
}) : "???"}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span className={styles.fakeLabel}>{t("tools.networking.common.subnetMask")} ({t("tools.networking.common.binary")})</span>
|
<span className={styles.fakeLabel}>{t("tools.networking.common.subnetMask")} ({t("tools.networking.common.binary")})</span>
|
||||||
<span className={styles.fakeField}>
|
<span className={styles.fakeField}>
|
||||||
{subnetBinary ? subnetBinary.padStart(32, "0").split("").map((bit, index) => {
|
{subnetMask || subnetMask === 0 ? subnetMask.toString(2).padStart(32, "0").split("").map((bit, index) => {
|
||||||
return <span key={"maskbit"+index}>{bit}</span>
|
return <span key={"maskbit"+index}>{bit}</span>
|
||||||
}) : "???"}
|
}) : "???"}
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Add table
Reference in a new issue