/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.apache.hadoop.hdfsproxy;

import java.io.IOException;
import java.io.PrintWriter;

import javax.naming.NamingException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.apache.cactus.FilterTestCase;
import org.apache.cactus.WebRequest;
import org.apache.cactus.WebResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestLdapIpDirFilter extends FilterTestCase {

  public static final Log LOG = LogFactory.getLog(TestLdapIpDirFilter.class);

  private class DummyFilterChain implements FilterChain {
    public void doFilter(ServletRequest theRequest, ServletResponse theResponse)
        throws IOException, ServletException {
      PrintWriter writer = theResponse.getWriter();

      writer.print("<p>some content</p>");
      writer.close();
    }

    public void init(FilterConfig theConfig) {
    }

    public void destroy() {
    }
  }

  public void testIpRestriction() throws ServletException, IOException,
      NamingException {
    LdapIpDirFilter filter = new LdapIpDirFilter();
    String baseName = "ou=proxyroles,dc=mycompany,dc=com";
    DummyLdapContext dlc = new DummyLdapContext();
    filter.initialize(baseName, dlc);
    request.setRemoteIPAddress("127.0.0.2");
    request.removeAttribute("org.apache.hadoop.hdfsproxy.authorized.userID");
    FilterChain mockFilterChain = new DummyFilterChain();
    filter.doFilter(request, response, mockFilterChain);
    assertNull(request
        .getAttribute("org.apache.hadoop.hdfsproxy.authorized.userID"));
  }

  public void endIpRestriction(WebResponse theResponse) {
    assertEquals(theResponse.getStatusCode(), 403);
    assertTrue("Text missing 'IP not authorized to access' : : ["
        + theResponse.getText() + "]", theResponse.getText().indexOf(
        "IP not authorized to access") > 0);
  }

  public void beginPathRestriction(WebRequest theRequest) {
    theRequest.setURL("proxy-test:0", null, "/streamFile", null,
        "filename=/nontestdir");
  }

  public void testPathRestriction() throws ServletException, IOException,
      NamingException {
    LdapIpDirFilter filter = new LdapIpDirFilter();
    String baseName = "ou=proxyroles,dc=mycompany,dc=com";
    DummyLdapContext dlc = new DummyLdapContext();
    filter.initialize(baseName, dlc);
    request.setRemoteIPAddress("127.0.0.1");
    request.removeAttribute("org.apache.hadoop.hdfsproxy.authorized.userID");
    FilterChain mockFilterChain = new DummyFilterChain();
    filter.doFilter(request, response, mockFilterChain);
    assertNull(request
        .getAttribute("org.apache.hadoop.hdfsproxy.authorized.userID"));
  }

  public void endPathRestriction(WebResponse theResponse) {
    assertEquals(theResponse.getStatusCode(), 403);
    assertTrue("Text missing 'User not authorized to access path' : : ["
        + theResponse.getText() + "]", theResponse.getText().indexOf(
        "User not authorized to access path") > 0);
  }

  public void beginDoFilter(WebRequest theRequest) {
    theRequest.setURL("proxy-test:0", null, "/streamFile", null,
        "filename=/testdir");
  }

  public void testDoFilter() throws ServletException, IOException,
      NamingException {
    LdapIpDirFilter filter = new LdapIpDirFilter();
    String baseName = "ou=proxyroles,dc=mycompany,dc=com";
    DummyLdapContext dlc = new DummyLdapContext();
    filter.initialize(baseName, dlc);
    request.setRemoteIPAddress("127.0.0.1");

    ServletContext context = config.getServletContext();
    context.removeAttribute("name.node.address");
    context.removeAttribute("name.conf");
    assertNull(context.getAttribute("name.node.address"));
    assertNull(context.getAttribute("name.conf"));
    filter.init(config);
    assertNotNull(context.getAttribute("name.node.address"));
    assertNotNull(context.getAttribute("name.conf"));

    request.removeAttribute("org.apache.hadoop.hdfsproxy.authorized.userID");
    FilterChain mockFilterChain = new DummyFilterChain();
    filter.doFilter(request, response, mockFilterChain);
    assertEquals(request
        .getAttribute("org.apache.hadoop.hdfsproxy.authorized.userID"),
        "testuser");

  }

  public void endDoFilter(WebResponse theResponse) {
    assertEquals("<p>some content</p>", theResponse.getText());
  }

}
