1 20 package org.apache.mina.filter; 21 22 import java.net.InetAddress ; 23 import java.net.InetSocketAddress ; 24 import java.net.SocketAddress ; 25 import java.util.Collection ; 26 import java.util.Set ; 27 import java.util.concurrent.CopyOnWriteArraySet ; 28 29 import org.apache.mina.common.IdleStatus; 30 import org.apache.mina.common.IoFilter; 31 import org.apache.mina.common.IoFilterAdapter; 32 import org.apache.mina.common.IoSession; 33 import org.apache.mina.util.SessionLog; 34 35 42 public class BlacklistFilter extends IoFilterAdapter { 43 private final Set <InetAddress > blacklist = new CopyOnWriteArraySet <InetAddress >(); 44 45 52 public void setBlacklist(InetAddress ... addresses) { 53 if (addresses == null) 54 throw new NullPointerException ("addresses"); 55 blacklist.clear(); 56 for (int i = 0; i < addresses.length; i++) { 57 InetAddress addr = addresses[i]; 58 block(addr, "addresses[" + i + ']'); 59 } 60 } 61 62 72 public void setBlacklist(Collection <InetAddress > addresses) { 73 if (addresses == null) 74 throw new NullPointerException ("addresses"); 75 76 InetAddress [] inetAddresses = new InetAddress [addresses.size()]; 77 try { 78 setBlacklist(addresses.toArray(inetAddresses)); 79 } catch (ArrayStoreException ase) { 80 IllegalArgumentException iae = new IllegalArgumentException ( 81 "Collection of addresses must contain only InetAddress instances."); 82 iae.initCause(ase); 83 throw iae; 84 } 85 } 86 87 90 public void block(InetAddress address, String error_string) { 91 if (address == null) 92 throw new NullPointerException (error_string); 93 blacklist.add(address); 94 } 95 96 99 public void block(InetAddress address) { 100 block(address, "address"); 101 } 102 103 106 public void unblock(InetAddress address) { 107 if (address == null) 108 throw new NullPointerException ("address"); 109 blacklist.remove(address); 110 } 111 112 @Override 113 public void sessionCreated(NextFilter nextFilter, IoSession session) { 114 if (!isBlocked(session)) { 115 nextFilter.sessionCreated(session); 117 } else { 118 blockSession(session); 119 } 120 } 121 122 @Override 123 public void sessionOpened(NextFilter nextFilter, IoSession session) 124 throws Exception { 125 if (!isBlocked(session)) { 126 nextFilter.sessionOpened(session); 128 } else { 129 blockSession(session); 130 } 131 } 132 133 @Override 134 public void sessionClosed(NextFilter nextFilter, IoSession session) 135 throws Exception { 136 if (!isBlocked(session)) { 137 nextFilter.sessionClosed(session); 139 } else { 140 blockSession(session); 141 } 142 } 143 144 @Override 145 public void sessionIdle(NextFilter nextFilter, IoSession session, 146 IdleStatus status) throws Exception { 147 if (!isBlocked(session)) { 148 nextFilter.sessionIdle(session, status); 150 } else { 151 blockSession(session); 152 } 153 } 154 155 @Override 156 public void messageReceived(NextFilter nextFilter, IoSession session, 157 Object message) { 158 if (!isBlocked(session)) { 159 nextFilter.messageReceived(session, message); 161 } else { 162 blockSession(session); 163 } 164 } 165 166 @Override 167 public void messageSent(NextFilter nextFilter, IoSession session, 168 Object message) throws Exception { 169 if (!isBlocked(session)) { 170 nextFilter.messageSent(session, message); 172 } else { 173 blockSession(session); 174 } 175 } 176 177 private void blockSession(IoSession session) { 178 SessionLog.info(session, "Remote address in the blacklist; closing."); 179 session.close(); 180 } 181 182 private boolean isBlocked(IoSession session) { 183 SocketAddress remoteAddress = session.getRemoteAddress(); 184 if (remoteAddress instanceof InetSocketAddress ) { 185 if (blacklist.contains(((InetSocketAddress ) remoteAddress) 186 .getAddress())) { 187 return true; 188 } 189 } 190 191 return false; 192 } 193 } 194 | Popular Tags |