| /* |
| * Copyright (c) 2007-2009, 2011, 2012, 2015 Eike Stepper (Berlin, Germany) and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Eike Stepper - initial API and implementation |
| */ |
| package org.eclipse.net4j.util.tests; |
| |
| import org.eclipse.net4j.util.WrappedException; |
| import org.eclipse.net4j.util.security.ChallengeNegotiator; |
| import org.eclipse.net4j.util.security.IChallengeResponse; |
| import org.eclipse.net4j.util.security.IPasswordCredentialsProvider; |
| import org.eclipse.net4j.util.security.NegotiationContext; |
| import org.eclipse.net4j.util.security.PasswordCredentials; |
| import org.eclipse.net4j.util.security.PasswordCredentialsProvider; |
| import org.eclipse.net4j.util.security.Randomizer; |
| import org.eclipse.net4j.util.security.ResponseNegotiator; |
| import org.eclipse.net4j.util.security.UserManager; |
| |
| import java.nio.ByteBuffer; |
| import java.util.concurrent.BlockingQueue; |
| import java.util.concurrent.LinkedBlockingQueue; |
| import java.util.concurrent.TimeUnit; |
| |
| /** |
| * @author Eike Stepper |
| */ |
| public class SecurityTest extends AbstractOMTest |
| { |
| private static final int TIMEOUT = 1000; |
| |
| private static final String USER_ID = "stepper"; //$NON-NLS-1$ |
| |
| private static final char[] PASSWORD1 = "eike2007".toCharArray(); //$NON-NLS-1$ |
| |
| private static final char[] PASSWORD2 = "invalid".toCharArray(); //$NON-NLS-1$ |
| |
| private static final PasswordCredentials CREDENTIALS = new PasswordCredentials(USER_ID, PASSWORD1); |
| |
| private IPasswordCredentialsProvider credentialsProvider = new PasswordCredentialsProvider(CREDENTIALS); |
| |
| public void testRandomizerAcceptsSeedsBeforeActivation() |
| { |
| Randomizer randomizer = new Randomizer(); |
| randomizer.setSeed(2l); |
| } |
| |
| public void testSuccess() throws Exception |
| { |
| // Prepare randomizer |
| Randomizer randomizer = new Randomizer(); |
| randomizer.activate(); |
| |
| // Prepare user manager |
| UserManager userManager = new UserManager(); |
| userManager.activate(); |
| userManager.addUser(USER_ID, PASSWORD1); |
| |
| // Create negotiation contexts |
| PeerNegotiationContext challengeContext = new PeerNegotiationContext(); |
| PeerNegotiationContext responseContext = new PeerNegotiationContext(); |
| |
| // Prepare challenge context |
| challengeContext.setPeer(responseContext); |
| Thread challengeThread = new Thread(challengeContext, "challengeThread"); //$NON-NLS-1$ |
| challengeThread.start(); |
| |
| // Prepare response context |
| responseContext.setPeer(challengeContext); |
| Thread responseThread = new Thread(responseContext, "responseThread"); //$NON-NLS-1$ |
| responseThread.start(); |
| |
| // Prepare response negotiator |
| ResponseNegotiator responseNegotiator = new ResponseNegotiator(); |
| responseNegotiator.setCredentialsProvider(credentialsProvider); |
| responseNegotiator.activate(); |
| responseNegotiator.negotiate(responseContext); |
| |
| // Prepare challenge negotiator |
| ChallengeNegotiator challengeNegotiator = new ChallengeNegotiator(); |
| challengeNegotiator.setRandomizer(randomizer); |
| challengeNegotiator.setUserManager(userManager); |
| challengeNegotiator.activate(); |
| challengeNegotiator.negotiate(challengeContext); |
| |
| Enum<?> responseState = responseContext.waitUntilFinished(TIMEOUT); |
| assertEquals(IChallengeResponse.State.SUCCESS, responseState); |
| |
| Enum<?> challengeState = challengeContext.waitUntilFinished(TIMEOUT); |
| assertEquals(IChallengeResponse.State.SUCCESS, challengeState); |
| |
| challengeContext.deactivate(); |
| responseContext.deactivate(); |
| challengeNegotiator.deactivate(); |
| responseNegotiator.deactivate(); |
| userManager.deactivate(); |
| randomizer.deactivate(); |
| } |
| |
| public void testFailure() throws Exception |
| { |
| // Prepare randomizer |
| Randomizer randomizer = new Randomizer(); |
| randomizer.activate(); |
| |
| // Prepare user manager |
| UserManager userManager = new UserManager(); |
| userManager.activate(); |
| userManager.addUser(USER_ID, PASSWORD2); |
| |
| // Create negotiation contexts |
| PeerNegotiationContext challengeContext = new PeerNegotiationContext(); |
| PeerNegotiationContext responseContext = new PeerNegotiationContext(); |
| |
| // Prepare challenge context |
| challengeContext.setPeer(responseContext); |
| Thread challengeThread = new Thread(challengeContext, "challengeThread"); //$NON-NLS-1$ |
| challengeThread.start(); |
| |
| // Prepare response context |
| responseContext.setPeer(challengeContext); |
| Thread responseThread = new Thread(responseContext, "responseThread"); //$NON-NLS-1$ |
| responseThread.start(); |
| |
| // Prepare response negotiator |
| ResponseNegotiator responseNegotiator = new ResponseNegotiator(); |
| responseNegotiator.setCredentialsProvider(credentialsProvider); |
| responseNegotiator.activate(); |
| responseNegotiator.negotiate(responseContext); |
| |
| // Prepare challenge negotiator |
| ChallengeNegotiator challengeNegotiator = new ChallengeNegotiator(); |
| challengeNegotiator.setRandomizer(randomizer); |
| challengeNegotiator.setUserManager(userManager); |
| challengeNegotiator.activate(); |
| challengeNegotiator.negotiate(challengeContext); |
| |
| Enum<?> responseState = responseContext.waitUntilFinished(TIMEOUT); |
| assertEquals(IChallengeResponse.State.FAILURE, responseState); |
| |
| Enum<?> challengeState = challengeContext.waitUntilFinished(TIMEOUT); |
| assertEquals(IChallengeResponse.State.FAILURE, challengeState); |
| |
| challengeContext.deactivate(); |
| responseContext.deactivate(); |
| challengeNegotiator.deactivate(); |
| responseNegotiator.deactivate(); |
| userManager.deactivate(); |
| randomizer.deactivate(); |
| } |
| |
| /** |
| * @author Eike Stepper |
| */ |
| private final class PeerNegotiationContext extends NegotiationContext implements Runnable |
| { |
| private PeerNegotiationContext peer; |
| |
| private String userID; |
| |
| private BlockingQueue<ByteBuffer> queue = new LinkedBlockingQueue<ByteBuffer>(); |
| |
| private boolean running; |
| |
| public PeerNegotiationContext() |
| { |
| } |
| |
| @SuppressWarnings("unused") |
| public PeerNegotiationContext getPeer() |
| { |
| return peer; |
| } |
| |
| public void setPeer(PeerNegotiationContext peer) |
| { |
| this.peer = peer; |
| } |
| |
| @SuppressWarnings("unused") |
| public String getUserID() |
| { |
| return userID; |
| } |
| |
| public void setUserID(String userID) |
| { |
| this.userID = userID; |
| } |
| |
| public ByteBuffer getBuffer() |
| { |
| return ByteBuffer.allocateDirect(4096); |
| } |
| |
| public void transmitBuffer(ByteBuffer buffer) |
| { |
| buffer.flip(); |
| queue.add(buffer); |
| } |
| |
| public void deactivate() |
| { |
| running = false; |
| } |
| |
| public void run() |
| { |
| running = true; |
| while (running) |
| { |
| if (peer != null) |
| { |
| Receiver receiver = peer.getReceiver(); |
| if (receiver != null) |
| { |
| ByteBuffer buffer = null; |
| |
| try |
| { |
| buffer = queue.poll(20, TimeUnit.MILLISECONDS); |
| } |
| catch (InterruptedException ex) |
| { |
| throw WrappedException.wrap(ex); |
| } |
| |
| if (buffer != null) |
| { |
| receiver.receiveBuffer(peer, buffer); |
| } |
| } |
| } |
| } |
| } |
| } |
| } |