diff options
Diffstat (limited to 'skins/common/block.js')
-rw-r--r-- | skins/common/block.js | 48 |
1 files changed, 40 insertions, 8 deletions
diff --git a/skins/common/block.js b/skins/common/block.js index ad04f810..fb86cbd6 100644 --- a/skins/common/block.js +++ b/skins/common/block.js @@ -1,6 +1,34 @@ -addOnloadHook( considerChangingExpiryFocus ); +// @TODO: find some better JS file for this +// Note: borrows from IP.php +window.isIPv4Address = function( address, allowBlock ) { + var block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : ''; + var RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])'; + var RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE; + return address.search( new RegExp( '^' + RE_IP_ADD + block + '$' ) ) != -1; +}; + +// @TODO: find some better JS file for this +// Note: borrows from IP.php +window.isIPv6Address = function( address, allowBlock ) { + var block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : ''; + var RE_IPV6_ADD = + '(?:' + // starts with "::" (including "::") + ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' + + '|' + // ends with "::" (except "::") + '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' + + '|' + // contains no "::" + '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' + + ')'; + if ( address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1 ) { + return true; + } + var RE_IPV6_ADD = // contains one "::" in the middle (single '::' check below) + '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}'; + return address.search( new RegExp( '^' + RE_IPV6_ADD + block + '$' ) ) != -1 + && address.search( /::/ ) != -1 && address.search( /::.*::/ ) == -1; +}; -function considerChangingExpiryFocus() { +window.considerChangingExpiryFocus = function() { if ( !document.getElementById ) { return; } @@ -18,9 +46,9 @@ function considerChangingExpiryFocus() { } else { field.style.display = 'none'; } -} +}; -function updateBlockOptions() { +window.updateBlockOptions = function() { if ( !document.getElementById ) { return; } @@ -30,9 +58,10 @@ function updateBlockOptions() { return; } - var addy = target.value; - var isEmpty = addy.match(/^\s*$/); - var isIp = addy.match(/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|:(:[0-9A-Fa-f]{1,4}){1,7}|[0-9A-Fa-f]{1,4}(:{1,2}[0-9A-Fa-f]{1,4}|::$){1,7})(\/\d+)?$/); + var addy = target.value.replace( /(^\s*|\s*$)/, '' ); // trim + var isEmpty = (addy == ""); + + var isIp = isIPv4Address( addy, true ) || isIPv6Address( addy, true ); var isIpRange = isIp && addy.match(/\/\d+$/); var anonymousRow = document.getElementById( 'wpAnonOnlyRow' ); @@ -54,4 +83,7 @@ function updateBlockOptions() { if( watchuserRow ) { watchuserRow.style.display = isIpRange && !isEmpty ? 'none' : ''; } -} +}; + +addOnloadHook( updateBlockOptions ); +addOnloadHook( considerChangingExpiryFocus ); |