1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.directory.server.dns.protocol;
22
23
24 import java.util.ArrayList;
25
26 import org.apache.directory.server.dns.DnsServer;
27 import org.apache.directory.server.dns.DnsException;
28 import org.apache.directory.server.dns.messages.DnsMessage;
29 import org.apache.directory.server.dns.messages.DnsMessageModifier;
30 import org.apache.directory.server.dns.messages.MessageType;
31 import org.apache.directory.server.dns.messages.OpCode;
32 import org.apache.directory.server.dns.messages.ResourceRecord;
33 import org.apache.directory.server.dns.messages.ResponseCode;
34 import org.apache.directory.server.dns.service.DnsContext;
35 import org.apache.directory.server.dns.service.DomainNameService;
36 import org.apache.directory.server.dns.store.RecordStore;
37 import org.apache.mina.common.IdleStatus;
38 import org.apache.mina.common.IoHandler;
39 import org.apache.mina.common.IoSession;
40 import org.apache.mina.common.TransportType;
41 import org.apache.mina.filter.codec.ProtocolCodecFilter;
42 import org.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
44
45
46
47
48
49
50 public class DnsProtocolHandler implements IoHandler
51 {
52 private static final Logger LOG = LoggerFactory.getLogger( DnsProtocolHandler.class );
53
54 private DnsServer config;
55 private RecordStore store;
56 private String contextKey = "context";
57
58
59
60
61
62
63
64
65 public DnsProtocolHandler( DnsServer config, RecordStore store )
66 {
67 this.config = config;
68 this.store = store;
69 }
70
71
72 public void sessionCreated( IoSession session ) throws Exception
73 {
74 if ( LOG.isDebugEnabled() )
75 {
76 LOG.debug( "{} CREATED: {}", session.getRemoteAddress(), session.getTransportType() );
77 }
78
79 if ( session.getTransportType() == TransportType.DATAGRAM )
80 {
81 session.getFilterChain().addFirst( "codec",
82 new ProtocolCodecFilter( DnsProtocolUdpCodecFactory.getInstance() ) );
83 }
84 else
85 {
86 session.getFilterChain().addFirst( "codec",
87 new ProtocolCodecFilter( DnsProtocolTcpCodecFactory.getInstance() ) );
88 }
89 }
90
91
92 public void sessionOpened( IoSession session )
93 {
94 LOG.debug( "{} OPENED", session.getRemoteAddress() );
95 }
96
97
98 public void sessionClosed( IoSession session )
99 {
100 LOG.debug( "{} CLOSED", session.getRemoteAddress() );
101 }
102
103
104 public void sessionIdle( IoSession session, IdleStatus status )
105 {
106 LOG.debug( "{} IDLE ({})", session.getRemoteAddress(), status );
107 }
108
109
110 public void exceptionCaught( IoSession session, Throwable cause )
111 {
112 LOG.error( session.getRemoteAddress() + " EXCEPTION", cause );
113 session.close();
114 }
115
116
117 public void messageReceived( IoSession session, Object message )
118 {
119 LOG.debug( "{} RCVD: {}", session.getRemoteAddress(), message );
120
121 try
122 {
123 DnsContext dnsContext = new DnsContext();
124 dnsContext.setConfig( config );
125 dnsContext.setStore( store );
126 session.setAttribute( getContextKey(), dnsContext );
127
128 DomainNameService.execute( dnsContext, (DnsMessage)message );
129
130 DnsMessage response = dnsContext.getReply();
131
132 session.write( response );
133 }
134 catch ( Exception e )
135 {
136 LOG.error( e.getMessage(), e );
137
138 DnsMessage request = ( DnsMessage ) message;
139 DnsException de = ( DnsException ) e;
140
141 DnsMessageModifier modifier = new DnsMessageModifier();
142
143 modifier.setTransactionId( request.getTransactionId() );
144 modifier.setMessageType( MessageType.RESPONSE );
145 modifier.setOpCode( OpCode.QUERY );
146 modifier.setAuthoritativeAnswer( false );
147 modifier.setTruncated( false );
148 modifier.setRecursionDesired( request.isRecursionDesired() );
149 modifier.setRecursionAvailable( false );
150 modifier.setReserved( false );
151 modifier.setAcceptNonAuthenticatedData( false );
152 modifier.setResponseCode( ResponseCode.convert( ( byte ) de.getResponseCode() ) );
153 modifier.setQuestionRecords( request.getQuestionRecords() );
154 modifier.setAnswerRecords( new ArrayList<ResourceRecord>() );
155 modifier.setAuthorityRecords( new ArrayList<ResourceRecord>() );
156 modifier.setAdditionalRecords( new ArrayList<ResourceRecord>() );
157
158 session.write( modifier.getDnsMessage() );
159 }
160 }
161
162
163 public void messageSent( IoSession session, Object message )
164 {
165 LOG.debug( "{} SENT: {}", session.getRemoteAddress(), message );
166 }
167
168
169 protected String getContextKey()
170 {
171 return ( this.contextKey );
172 }
173 }