Skip to content

Commit 80bb5d0

Browse files
More improvements for detecting WebGUI access rules
More code improvements to detect the following use cases of WebGUI access rules: 1) When the router's network IP address is not the commonly used base IP address (e.g. NOT "192.168.100.0"). 2) When multiple CIDR IP address blocks are defined, we need to check if any includes the router's IP address.
1 parent d244e3e commit 80bb5d0

File tree

1 file changed

+79
-14
lines changed

1 file changed

+79
-14
lines changed

MerlinAU.sh

Lines changed: 79 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#
55
# Original Creation Date: 2023-Oct-01 by @ExtremeFiretop.
66
# Official Co-Author: @Martinski W. - Date: 2023-Nov-01
7-
# Last Modified: 2024-Aug-16
7+
# Last Modified: 2024-Aug-18
88
###################################################################
99
set -u
1010

@@ -113,13 +113,22 @@ else cronListCmd="crontab -l"
113113
fi
114114

115115
##----------------------------------------##
116-
## Modified by Martinski W. [2024-May-31] ##
116+
## Modified by Martinski W. [2024-Aug-17] ##
117117
##----------------------------------------##
118118
inMenuMode=true
119119
isInteractive=false
120120
FlashStarted=false
121121

122+
# Main LAN Network Info #
123+
readonly mainLAN_IFname="$(nvram get lan_ifname)"
122124
readonly mainLAN_IPaddr="$(nvram get lan_ipaddr)"
125+
readonly mainNET_IPaddr="$(ip route show | grep -E "[[:blank:]]+dev[[:blank:]]+${mainLAN_IFname}[[:blank:]]+proto[[:blank:]]+" | awk -F ' ' '{print $1}')"
126+
127+
# RegExp for IPv4 address #
128+
readonly IPv4octet_RegEx="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
129+
readonly IPv4addrs_RegEx="(${IPv4octet_RegEx}\.){3}${IPv4octet_RegEx}"
130+
readonly IPv4privt_RegEx="(^10\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168\.)"
131+
123132
readonly fwInstalledBaseVers="$(nvram get firmver | sed 's/\.//g')"
124133
readonly fwInstalledBuildVers="$(nvram get buildno)"
125134
readonly fwInstalledExtendNum="$(nvram get extendno)"
@@ -2588,28 +2597,89 @@ _GetPasswordInput_()
25882597
}
25892598

25902599
##-------------------------------------##
2591-
## Added by Martinski W. [2024-Aug-16] ##
2600+
## Added by Martinski W. [2024-Aug-18] ##
25922601
##-------------------------------------##
2602+
_CIDR_IPaddrBlockContainsIPaddr_()
2603+
{
2604+
if [ $# -lt 2 ] || [ -z "$1" ] || [ -z "$2" ]
2605+
then return 1 ; fi
2606+
2607+
local lastNETIPaddr4thOctet cidrIPRangeMax=0
2608+
2609+
local thisLANIPaddr="$2"
2610+
local cidrNETIPaddr="${1%/*}"
2611+
local cidrNETIPmask="${1#*/}"
2612+
local NETIPaddr4thOctet="${cidrNETIPaddr##*.}"
2613+
local LANIPaddr4thOctet="${thisLANIPaddr##*.}"
2614+
2615+
# Assumes the host segment has a maximum of 8 bits #
2616+
# and the network segment has a minimum of 24 bits #
2617+
case "$cidrNETIPmask" in
2618+
31) cidrIPRangeMax=1 ;;
2619+
30) cidrIPRangeMax=3 ;;
2620+
29) cidrIPRangeMax=7 ;;
2621+
28) cidrIPRangeMax=15 ;;
2622+
27) cidrIPRangeMax=31 ;;
2623+
26) cidrIPRangeMax=63 ;;
2624+
25) cidrIPRangeMax=127 ;;
2625+
24) cidrIPRangeMax=255 ;;
2626+
esac
2627+
lastNETIPaddr4thOctet="$((NETIPaddr4thOctet + cidrIPRangeMax))"
2628+
[ "$lastNETIPaddr4thOctet" -gt 255 ] && lastNETIPaddr4thOctet=255
2629+
2630+
if [ "$LANIPaddr4thOctet" -ge "$NETIPaddr4thOctet" ] && \
2631+
[ "$LANIPaddr4thOctet" -le "$lastNETIPaddr4thOctet" ]
2632+
then return 0
2633+
else return 1
2634+
fi
2635+
}
2636+
2637+
##----------------------------------------##
2638+
## Modified by Martinski W. [2024-Aug-18] ##
2639+
##----------------------------------------##
25932640
_CheckWebGUILoginAccessOK_()
25942641
{
2595-
local accessRestriction restrictRuleList netIPv4Addr
2642+
local accessRestriction restrictRuleList
25962643
local lanIPaddrRegEx1 lanIPaddrRegEx2 lanIPaddrRegEx3
2644+
local cidrIPaddrEntry cidrIPaddrBlock cidrIPaddrRegEx
2645+
local mainLANIPaddrRegEx netwkIPv4AddrRegEx netwkIPv4AddrX
25972646

25982647
accessRestriction="$(nvram get enable_acc_restriction)"
25992648
if [ -z "$accessRestriction" ] || [ "$accessRestriction" -eq 0 ]
26002649
then return 0 ; fi
26012650

26022651
restrictRuleList="$(nvram get restrict_rulelist)"
2603-
netIPv4Addr="${mainLAN_IPaddr%.*}.0"
2652+
if [ -n "$mainNET_IPaddr" ]
2653+
then
2654+
netwkIPv4AddrX="${mainNET_IPaddr%/*}"
2655+
netwkIPv4AddrX="${netwkIPv4AddrX%.*}"
2656+
else
2657+
netwkIPv4AddrX="${mainLAN_IPaddr%.*}"
2658+
fi
2659+
netwkIPv4AddrX="${netwkIPv4AddrX}.${IPv4octet_RegEx}"
2660+
netwkIPv4AddrRegEx="$(echo "$netwkIPv4AddrX" | sed 's/\./\\./g')"
2661+
mainLANIPaddrRegEx="$(echo "$mainLAN_IPaddr" | sed 's/\./\\./g')"
26042662

26052663
# Router IP address MUST have access to WebGUI #
2606-
lanIPaddrRegEx1=">${mainLAN_IPaddr}>[13]"
2607-
lanIPaddrRegEx2=">${mainLAN_IPaddr}/32>[13]"
2608-
lanIPaddrRegEx3=">${netIPv4Addr}/(2[4-9]|3[0-1])>[13]"
2664+
cidrIPaddrRegEx="${netwkIPv4AddrRegEx}/(2[4-9]|3[0-1])"
2665+
lanIPaddrRegEx1=">${mainLANIPaddrRegEx}>[13]"
2666+
lanIPaddrRegEx2=">${mainLANIPaddrRegEx}/(2[4-9]|3[0-2])>[13]"
2667+
lanIPaddrRegEx3=">${cidrIPaddrRegEx}>[13]"
26092668

2610-
if echo "$restrictRuleList" | grep -qE "$lanIPaddrRegEx1|$lanIPaddrRegEx2|$lanIPaddrRegEx3"
2669+
if echo "$restrictRuleList" | grep -qE "$lanIPaddrRegEx1|$lanIPaddrRegEx2"
26112670
then return 0 ; fi
26122671

2672+
cidrIPaddrEntry="$(echo "$restrictRuleList" | grep -oE "$lanIPaddrRegEx3")"
2673+
if [ -n "$cidrIPaddrEntry" ]
2674+
then
2675+
cidrIPaddrBlock="$(echo "$cidrIPaddrEntry" | grep -oE "$cidrIPaddrRegEx")"
2676+
for cidrIPblock in $cidrIPaddrBlock
2677+
do
2678+
if _CIDR_IPaddrBlockContainsIPaddr_ "$cidrIPblock" "$mainLAN_IPaddr"
2679+
then return 0 ; fi
2680+
done
2681+
fi
2682+
26132683
printf "\n${REDct}*WARNING*: The \"Enable Access Restrictions\" option is currently active.${NOct}"
26142684
printf "\nTo allow webGUI login access you must add the router IP address ${GRNct}${mainLAN_IPaddr}${NOct}
26152685
with the \"${GRNct}Web UI${NOct}\" access type on the \"Access restriction list\" panel."
@@ -6477,11 +6547,6 @@ _SetSecondaryEMailAddress_()
64776547
_WaitForEnterKey_ "$advnMenuReturnPromptStr"
64786548
}
64796549

6480-
# RegExp for IPv4 address #
6481-
readonly IPv4octet_RegEx="([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"
6482-
readonly IPv4addrs_RegEx="(${IPv4octet_RegEx}\.){3}${IPv4octet_RegEx}"
6483-
readonly IPv4privt_RegEx="(^10\.|^172\.1[6-9]\.|^172\.2[0-9]\.|^172\.3[0-1]\.|^192\.168\.)"
6484-
64856550
##----------------------------------------##
64866551
## Modified by Martinski W. [2024-Apr-06] ##
64876552
##----------------------------------------##

0 commit comments

Comments
 (0)