|  | @@ -1,15 +1,11 @@
 | 
	
		
			
				|  |  |  package org.springframework.security.web.access.expression;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.net.InetAddress;
 | 
	
		
			
				|  |  | -import java.net.UnknownHostException;
 | 
	
		
			
				|  |  | -import java.util.Arrays;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import org.springframework.security.access.expression.SecurityExpressionRoot;
 | 
	
		
			
				|  |  |  import org.springframework.security.core.Authentication;
 | 
	
		
			
				|  |  |  import org.springframework.security.web.FilterInvocation;
 | 
	
		
			
				|  |  | -import org.springframework.util.StringUtils;
 | 
	
		
			
				|  |  | +import org.springframework.security.web.util.IpAddressMatcher;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   *
 | 
	
	
		
			
				|  | @@ -34,57 +30,7 @@ public class WebSecurityExpressionRoot extends SecurityExpressionRoot {
 | 
	
		
			
				|  |  |       * @return true if the IP address of the current request is in the required range.
 | 
	
		
			
				|  |  |       */
 | 
	
		
			
				|  |  |      public boolean hasIpAddress(String ipAddress) {
 | 
	
		
			
				|  |  | -        int nMaskBits = 0;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (ipAddress.indexOf('/') > 0) {
 | 
	
		
			
				|  |  | -            String[] addressAndMask = StringUtils.split(ipAddress, "/");
 | 
	
		
			
				|  |  | -            ipAddress = addressAndMask[0];
 | 
	
		
			
				|  |  | -            nMaskBits = Integer.parseInt(addressAndMask[1]);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        InetAddress requiredAddress = parseAddress(ipAddress);
 | 
	
		
			
				|  |  | -        InetAddress remoteAddress = parseAddress(request.getRemoteAddr());
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (!requiredAddress.getClass().equals(remoteAddress.getClass())) {
 | 
	
		
			
				|  |  | -            throw new IllegalArgumentException("IP Address in expression must be the same type as " +
 | 
	
		
			
				|  |  | -                    "version returned by request");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (nMaskBits == 0) {
 | 
	
		
			
				|  |  | -            return remoteAddress.equals(requiredAddress);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        byte[] remAddr = remoteAddress.getAddress();
 | 
	
		
			
				|  |  | -        byte[] reqAddr = requiredAddress.getAddress();
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        int oddBits = nMaskBits % 8;
 | 
	
		
			
				|  |  | -        int nMaskBytes = nMaskBits/8 + (oddBits == 0 ? 0 : 1);
 | 
	
		
			
				|  |  | -        byte[] mask = new byte[nMaskBytes];
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Arrays.fill(mask, 0, oddBits == 0 ? mask.length : mask.length - 1, (byte)0xFF);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        if (oddBits != 0) {
 | 
	
		
			
				|  |  | -            int finalByte = (1 << oddBits) - 1;
 | 
	
		
			
				|  |  | -            finalByte <<= 8-oddBits;
 | 
	
		
			
				|  |  | -            mask[mask.length - 1] = (byte) finalByte;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | - //       System.out.println("Mask is " + new sun.misc.HexDumpEncoder().encode(mask));
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        for (int i=0; i < mask.length; i++) {
 | 
	
		
			
				|  |  | -            if ((remAddr[i] & mask[i]) != (reqAddr[i] & mask[i])) {
 | 
	
		
			
				|  |  | -                return false;
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        return true;
 | 
	
		
			
				|  |  | +        return (new IpAddressMatcher(ipAddress).matches(request));
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private InetAddress parseAddress(String address) {
 | 
	
		
			
				|  |  | -        try {
 | 
	
		
			
				|  |  | -            return InetAddress.getByName(address);
 | 
	
		
			
				|  |  | -        } catch (UnknownHostException e) {
 | 
	
		
			
				|  |  | -            throw new IllegalArgumentException("Failed to parse address" + address, e);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  |  }
 |