content: /**
   * 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.activemq.jaas;
  
  import java.io.IOException;
  import java.security.Principal;
  import java.util.HashMap;
  import java.util.HashSet;
  import java.util.Iterator;
  import java.util.List;
  import java.util.Set;
  import java.util.Vector;
  
  import javax.security.auth.Subject;
  import javax.security.auth.login.LoginException;
  
  import junit.framework.TestCase;
  
  public class CertificateLoginModuleTest extends TestCase {
  
      private static final String USER_NAME = "testUser";
      private static final List<String> GROUP_NAMES = new Vector<String>();
  
      private StubCertificateLoginModule loginModule;
  
      private Subject subject;
  
      public CertificateLoginModuleTest() {
          GROUP_NAMES.add("testGroup1");
          GROUP_NAMES.add("testGroup2");
          GROUP_NAMES.add("testGroup3");
          GROUP_NAMES.add("testGroup4");
      }
  
      protected void setUp() throws Exception {
          subject = new Subject();
      }
  
      protected void tearDown() throws Exception {
      }
  
      private void loginWithCredentials(String userName, Set<String> groupNames) throws LoginException {
          loginModule = new StubCertificateLoginModule(userName, new HashSet<String>(groupNames));
          JaasCertificateCallbackHandler callbackHandler = new JaasCertificateCallbackHandler(null);
  
          loginModule.initialize(subject, callbackHandler, null, new HashMap());
  
          loginModule.login();
          loginModule.commit();
      }
  
      private void checkPrincipalsMatch(Subject subject) {
          boolean nameFound = false;
          boolean groupsFound[] = new boolean[GROUP_NAMES.size()];
          for (int i = 0; i < groupsFound.length; ++i) {
              groupsFound[i] = false;
          }
  
          for (Iterator iter = subject.getPrincipals().iterator(); iter.hasNext();) {
              Principal currentPrincipal = (Principal)iter.next();
  
              if (currentPrincipal instanceof UserPrincipal) {
                  if (((UserPrincipal)currentPrincipal).getName().equals(USER_NAME)) {
                      if (!nameFound) {
                          nameFound = true;
                      } else {
                          fail("UserPrincipal found twice.");
                      }
  
                  } else {
                      fail("Unknown UserPrincipal found.");
                  }
  
              } else if (currentPrincipal instanceof GroupPrincipal) {
                  int principalIdx = GROUP_NAMES.indexOf(((GroupPrincipal)currentPrincipal).getName());
  
                  if (principalIdx < 0) {
                      fail("Unknown GroupPrincipal found.");
                  }
  
                  if (!groupsFound[principalIdx]) {
                      groupsFound[principalIdx] = true;
                  } else {
                      fail("GroupPrincipal found twice.");
                  }
              } else {
                  fail("Unknown Principal type found.");
              }
          }
      }
  
      public void testLoginSuccess() throws IOException {
          try {
              loginWithCredentials(USER_NAME, new HashSet<String>(GROUP_NAMES));
          } catch (Exception e) {
              fail("Unable to login: " + e.getMessage());
          }
  
          checkPrincipalsMatch(subject);
      }
  
      public void testLoginFailure() throws IOException {
          boolean loginFailed = false;
  
          try {
              loginWithCredentials(null, new HashSet<String>());
          } catch (LoginException e) {
              loginFailed = true;
          }
  
          if (!loginFailed) {
              fail("Logged in with unknown certificate.");
          }
      }
  
      public void testLogOut() throws IOException {
          try {
              loginWithCredentials(USER_NAME, new HashSet<String>(GROUP_NAMES));
          } catch (Exception e) {
              fail("Unable to login: " + e.getMessage());
          }
  
          loginModule.logout();
  
          assertEquals("logout should have cleared Subject principals.", 0, subject.getPrincipals().size());
      }
  }
  