View Javadoc

1   /*
2    *  Licensed to the Apache Software Foundation (ASF) under one
3    *  or more contributor license agreements.  See the NOTICE file
4    *  distributed with this work for additional information
5    *  regarding copyright ownership.  The ASF licenses this file
6    *  to you under the Apache License, Version 2.0 (the
7    *  "License"); you may not use this file except in compliance
8    *  with the License.  You may obtain a copy of the License at
9    *  
10   *    http://www.apache.org/licenses/LICENSE-2.0
11   *  
12   *  Unless required by applicable law or agreed to in writing,
13   *  software distributed under the License is distributed on an
14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   *  KIND, either express or implied.  See the License for the
16   *  specific language governing permissions and limitations
17   *  under the License. 
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   * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
48   * @version $Rev: 591064 $, $Date: 2007-11-01 17:03:46 +0100 (Do, 01 Nov 2007) $
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       * Creates a new instance of DnsProtocolHandler.
61       *
62       * @param config
63       * @param store
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 }