/* * Copyright 2010 NCHOVY * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.krakenapps.pcap.decoder.tcp; import java.net.InetSocketAddress; import java.util.Collection; import java.util.Collections; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.krakenapps.pcap.Protocol; public class TcpPortProtocolMapper implements TcpProtocolMapper { private ConcurrentMap<Integer, Protocol> tcpMap; private ConcurrentMap<InetSocketAddress, Protocol> temporaryTcpMap; private ConcurrentMap<Protocol, Set<TcpProcessor>> tcpProcessorMap; public TcpPortProtocolMapper() { tcpMap = new ConcurrentHashMap<Integer, Protocol>(); temporaryTcpMap = new ConcurrentHashMap<InetSocketAddress, Protocol>(); tcpProcessorMap = new ConcurrentHashMap<Protocol, Set<TcpProcessor>>(); tcpMap.put(80, Protocol.HTTP); tcpMap.put(8080, Protocol.HTTP); tcpMap.put(25, Protocol.SMTP); tcpMap.put(587, Protocol.SMTP); tcpMap.put(110, Protocol.POP3); tcpMap.put(1863, Protocol.MSN); tcpMap.put(21, Protocol.FTP); tcpMap.put(138, Protocol.NETBIOS); tcpMap.put(139, Protocol.NETBIOS); tcpMap.put(445, Protocol.NETBIOS); tcpMap.put(22, Protocol.SSH); tcpMap.put(23, Protocol.TELNET); tcpMap.put(43, Protocol.WHOIS); tcpMap.put(53, Protocol.DNS); tcpMap.put(66, Protocol.SQLNET); tcpMap.put(79, Protocol.FINGER); tcpMap.put(143, Protocol.IMAP); tcpMap.put(179, Protocol.BGP); tcpMap.put(1433, Protocol.MSSQL); tcpMap.put(1434, Protocol.MSSQL); tcpMap.put(3306, Protocol.MYSQL); tcpMap.put(5432, Protocol.POSTGRES); } public void register(int port, Protocol protocol) { tcpMap.put(port, protocol); } public void unregister(int port) { if (tcpMap.containsKey(port)) tcpMap.remove(port); } @Override public void register(InetSocketAddress sockAddr, Protocol protocol) { temporaryTcpMap.put(sockAddr, protocol); } @Override public void unregister(InetSocketAddress sockAddr) { if (temporaryTcpMap.containsKey(sockAddr)) temporaryTcpMap.remove(sockAddr); } @Override public void register(Protocol protocol, TcpProcessor processor) { tcpProcessorMap .putIfAbsent(protocol, Collections.newSetFromMap(new ConcurrentHashMap<TcpProcessor, Boolean>())); tcpProcessorMap.get(protocol).add(processor); } @Override public void unregister(Protocol protocol, TcpProcessor processor) { tcpProcessorMap .putIfAbsent(protocol, Collections.newSetFromMap(new ConcurrentHashMap<TcpProcessor, Boolean>())); tcpProcessorMap.get(protocol).remove(processor); } @Deprecated @Override public void unregister(Protocol protocol) { if (tcpProcessorMap.containsKey(protocol)) tcpProcessorMap.remove(protocol); } @Override public Protocol map(TcpSegment segment) { TcpSessionKey key = segment.getSessionKey(); InetSocketAddress server = new InetSocketAddress(key.getServerIp(), key.getServerPort()); if (temporaryTcpMap.containsKey(server)) return temporaryTcpMap.get(server); else if (tcpMap.containsKey(key.getServerPort())) return tcpMap.get(key.getServerPort()); return null; } @Override public Collection<TcpProcessor> getTcpProcessors(Protocol protocol) { if (protocol == null) return null; if (tcpProcessorMap.containsKey(protocol)) { Set<TcpProcessor> processors = tcpProcessorMap.get(protocol); if (processors.size() > 0) return processors; } return null; } @Deprecated @Override public TcpProcessor getTcpProcessor(Protocol protocol) { if (protocol == null) return null; if (tcpProcessorMap.containsKey(protocol)) { Set<TcpProcessor> processors = tcpProcessorMap.get(protocol); if (processors.size() > 0) return processors.iterator().next(); } return null; } }