<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../.resources/report.css" type="text/css"/><link rel="shortcut icon" href="../.resources/report.gif" type="image/gif"/><title>RampartUsernameTokenValidator.java</title><link rel="stylesheet" href="../.resources/prettify.css" type="text/css"/><script type="text/javascript" src="../.resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../.sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">Coverage Report</a> &gt; <a href="index.source.html" class="el_package">org.apache.rampart.handler</a> &gt; <span class="el_source">RampartUsernameTokenValidator.java</span></div><h1>RampartUsernameTokenValidator.java</h1><pre class="source lang-java linenums">/*
 * Copyright 2004,2013 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
 * 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 &quot;AS IS&quot; 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.rampart.handler;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.rampart.RampartConstants;
import org.apache.ws.security.WSPasswordCallback;
import org.apache.ws.security.WSSecurityException;
import org.apache.ws.security.handler.RequestData;
import org.apache.ws.security.message.token.UsernameToken;
import org.apache.ws.security.validate.UsernameTokenValidator;

/**
 * Overriding the default UsernameTokenValidator provided by WSS4J because the
 * default implementation expects the user to provide the plain text password to
 * WSS4J for validation.
 * 
 */
<span class="fc" id="L39">public class RampartUsernameTokenValidator extends UsernameTokenValidator {</span>

<span class="fc" id="L41">	private static Log mlog = LogFactory.getLog(RampartConstants.MESSAGE_LOG);</span>

	@Override
	protected void verifyPlaintextPassword(UsernameToken usernameToken,
			RequestData data) throws WSSecurityException {

<span class="fc" id="L47">		String user = usernameToken.getName();</span>
<span class="fc" id="L48">		String password = usernameToken.getPassword();</span>
<span class="fc" id="L49">		String pwType = usernameToken.getPasswordType();</span>

		// Provide the password to the user for validation
<span class="fc" id="L52">		WSPasswordCallback pwCb = new WSPasswordCallback(user, password,</span>
				pwType, WSPasswordCallback.USERNAME_TOKEN, data);
		try {
<span class="fc" id="L55">			data.getCallbackHandler().handle(new Callback[] { pwCb });</span>
<span class="nc" id="L56">		} catch (IOException e) {</span>
<span class="nc bnc" id="L57" title="All 2 branches missed.">			if (mlog.isDebugEnabled()) {</span>
<span class="nc" id="L58">				mlog.debug(e);</span>
			}
<span class="nc" id="L60">			throw new WSSecurityException(</span>
					WSSecurityException.FAILED_AUTHENTICATION);
<span class="nc" id="L62">		} catch (UnsupportedCallbackException e) {</span>
<span class="nc bnc" id="L63" title="All 2 branches missed.">			if (mlog.isDebugEnabled()) {</span>
<span class="nc" id="L64">				mlog.debug(e);</span>
			}
<span class="nc" id="L66">			throw new WSSecurityException(</span>
					WSSecurityException.FAILED_AUTHENTICATION);
<span class="fc" id="L68">		}</span>

<span class="fc" id="L70">	}</span>
}
</pre><div class="footer"><span class="right">Created with <a href="http://www.eclemma.org/jacoco">JaCoCo</a> 0.7.5.201505241946</span></div></body></html>