Author: ruchithf Date: Wed Jan 16 17:15:40 2008 New Revision: 612671 URL: http://svn.apache.org/viewvc?rev=612671&view=rev Log: Fixed WSS-68, thanks Marcel Ammerlaan for the patch
Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenAction.java webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/WSConstants.java Wed Jan 16 17:15:40 2008 @@ -177,6 +177,15 @@ * The password type URI used in the username token */ public static final String PASSWORD_TEXT = USERNAMETOKEN_NS + "#PasswordText"; + + /** + * Sets the [EMAIL PROTECTED] org.apache.ws.security.message.WSSAddUsernameToken#build(Document, String, String) UserNameToken} + * method to send _no_ password related information. + * <p/> + * This is a required method as defined by WS Specification, Username token profile as passwords are optional. + * Also see the WS-I documentation for scenario's using this feature in a trust environment. + */ + public static final String PW_NONE = "PasswordNone"; /** * Sets the [EMAIL PROTECTED] org.apache.ws.security.message.WSEncryptBody#build(Document, Crypto) encryption} Modified: webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/WSPasswordCallback.java Wed Jan 16 17:15:40 2008 @@ -75,7 +75,7 @@ public final static int SECURITY_CONTEXT_TOKEN = 6; public final static int CUSTOM_TOKEN = 7; public final static int ENCRYPTED_KEY_TOKEN = 8; - + private String identifier; private String password; private byte[] key; @@ -113,6 +113,19 @@ */ public String getIdentifer() { return identifier; + } + + /** + * Extended callback interface allows for setting the username as well. + * Callback functions can change the identifier, this is intended in the usernametoken scenario + * where the usernametoken denotes the identity, but a fixed identity for signing is used + * The initial value is that from the configuration file. If this method is not called, the + * configured identity is used. + * + * @param ident The identity. + */ + public void setIdentifier(String ident) { + this.identifier = ident; } /** Modified: webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenAction.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenAction.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenAction.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/action/UsernameTokenAction.java Wed Jan 16 17:15:40 2008 @@ -17,6 +17,8 @@ package org.apache.ws.security.action; +import org.apache.ws.security.WSConstants; +import org.apache.ws.security.WSPasswordCallback; import org.apache.ws.security.WSSecurityException; import org.apache.ws.security.handler.RequestData; import org.apache.ws.security.handler.WSHandler; @@ -27,18 +29,20 @@ public class UsernameTokenAction implements Action { public void execute(WSHandler handler, int actionToDo, Document doc, RequestData reqData) throws WSSecurityException { - String password; - password = - handler.getPassword(reqData.getUsername(), + + // Always call the callback for the username. We mis-use the configured password callback class and callback methods for this. + String providedUsername = reqData.getUsername(); + WSPasswordCallback callbackData = handler.getPassword(reqData.getUsername(), actionToDo, WSHandlerConstants.PW_CALLBACK_CLASS, - WSHandlerConstants.PW_CALLBACK_REF, reqData) - .getPassword(); + WSHandlerConstants.PW_CALLBACK_REF, reqData); + providedUsername = callbackData.getIdentifer(); + String password = callbackData.getPassword(); WSSecUsernameToken builder = new WSSecUsernameToken(); builder.setWsConfig(reqData.getWssConfig()); builder.setPasswordType(reqData.getPwType()); - builder.setUserInfo(reqData.getUsername(), password); + builder.setUserInfo(providedUsername, password); if (reqData.getUtElements() != null && reqData.getUtElements().length > 0) { for (int j = 0; j < reqData.getUtElements().length; j++) { Modified: webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/handler/RequestData.java Wed Jan 16 17:15:40 2008 @@ -1,6 +1,7 @@ package org.apache.ws.security.handler; import org.apache.ws.security.SOAPConstants; +import org.apache.ws.security.WSConstants; import org.apache.ws.security.WSSConfig; import org.apache.ws.security.components.crypto.Crypto; import org.apache.ws.security.message.WSSecHeader; @@ -19,7 +20,7 @@ private SOAPConstants soapConstants = null; private String actor = null; private String username = null; - private String pwType = null; + private String pwType = WSConstants.PASSWORD_DIGEST; // Make this the default when no password type is given. private String[] utElements = null; private Crypto sigCrypto = null; private Crypto decCrypto = null; Modified: webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/handler/WSHandler.java Wed Jan 16 17:15:40 2008 @@ -51,10 +51,11 @@ /** * Extracted from WSDoAllReceiver and WSDoAllSender - * + * Extended to all passwordless UsernameTokens and configurable identities. * * @author Davanum Srinivas ([EMAIL PROTECTED]). * @author Werner Dittmann ([EMAIL PROTECTED]). + * @author Marcel Ammerlaan ([EMAIL PROTECTED]). */ public abstract class WSHandler { public static String DONE = "done"; @@ -430,11 +431,17 @@ Object mc = reqData.getMsgContext(); String type = getString(WSHandlerConstants.PASSWORD_TYPE, mc); - reqData.setPwType(type); if (type != null) { - reqData.setPwType(type.equals(WSConstants.PW_TEXT) - ? WSConstants.PASSWORD_TEXT - : WSConstants.PASSWORD_DIGEST); + if(WSConstants.PW_TEXT.equals(type)) { + reqData.setPwType(WSConstants.PASSWORD_TEXT); + } else if(WSConstants.PW_DIGEST.equals(type)) { + reqData.setPwType(WSConstants.PASSWORD_DIGEST); + } else if(WSConstants.PW_NONE.equals(type)) { + // No password requested. + reqData.setPwType(null); + } else { + throw new WSSecurityException("Unknown password type encoding: " + type); + } } String add = getString(WSHandlerConstants.ADD_UT_ELEMENTS, mc); @@ -604,8 +611,7 @@ throw new WSSecurityException( "WSHandler: illegal timestampStrict parameter"); } - - + /** * Get a password to construct a UsernameToken or sign a message. * <p/> @@ -620,25 +626,19 @@ WSPasswordCallback pwCb = null; String password = null; CallbackHandler cbHandler = null; - String err = "provided null or empty password"; - Object mc = reqData.getMsgContext(); + String err = "provided null or empty password"; + Object mc = reqData.getMsgContext(); String callback = getString(clsProp, mc); if (callback != null) { // we have a password callback class pwCb = readPwViaCallbackClass(callback, username, doAction, reqData); - if ((pwCb.getPassword() == null) && (pwCb.getKey() == null)) { - throw new WSSecurityException("WSHandler: password callback class " - +err); - } - } else if ((cbHandler = (CallbackHandler) getProperty(mc, refProp)) - != null) { + // Null passwords are not always a problem: if the callback was called to provide a username instead. + } else if ((cbHandler = (CallbackHandler) getProperty(mc, refProp)) != null) { pwCb = performCallback(cbHandler, username, doAction); - if ((pwCb.getPassword() == null) && (pwCb.getKey() == null)) { - throw new WSSecurityException("WSHandler: password callback " - +err); - } } else if ((password = getPassword(mc)) == null) { - throw new WSSecurityException("WSHandler: application "+err); + // TODO: hmm. does this also need changed for username processing? + throw new WSSecurityException("WSHandler: application " + err); } else { + // TODO: hmm. does this also need changed for username processing? setPassword(mc, null); pwCb = new WSPasswordCallback("", WSPasswordCallback.UNKNOWN); pwCb.setPassword(password); Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/message/WSSecUsernameToken.java Wed Jan 16 17:15:40 2008 @@ -63,14 +63,10 @@ * contains the password type. Only allowed values are * [EMAIL PROTECTED] WSConstants#PASSWORD_DIGEST} and * [EMAIL PROTECTED] WSConstants#PASSWORD_TEXT}. + * or null when no password is needed. */ public void setPasswordType(String pwType) { - if (pwType == null) { - passwordType = WSConstants.PASSWORD_DIGEST; - } else if (pwType.equals(WSConstants.PASSWORD_DIGEST) - || pwType.equals(WSConstants.PASSWORD_TEXT)) { - passwordType = pwType; - } + this.passwordType = pwType; } /** Modified: webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/message/token/UsernameToken.java Wed Jan 16 17:15:40 2008 @@ -45,6 +45,7 @@ * UsernameToken according to WS Security specifications, UsernameToken profile. * * Enhanced to support digest password type for username token signature + * Enhanced to support passwordless usernametokens as allowed by spec. * * @author Davanum Srinivas ([EMAIL PROTECTED]) * @author Werner Dittmann ([EMAIL PROTECTED]) @@ -168,7 +169,8 @@ * @param pwType * the required password encoding, either * [EMAIL PROTECTED] WSConstants#PASSWORD_DIGEST} or - * [EMAIL PROTECTED] WSConstants#PASSWORD_TEXT} or <code>null</code> if no + * [EMAIL PROTECTED] WSConstants#PASSWORD_TEXT} or + * [EMAIL PROTECTED] WSConstants#PASSWORD_NONE} <code>null</code> if no * password required */ public UsernameToken(boolean milliseconds, Document doc, String pwType) { @@ -399,8 +401,14 @@ */ public void setPassword(String pwd) { if (pwd == null) { - throw new IllegalArgumentException("pwd == null"); + if(this.passwordType != null) { + throw new IllegalArgumentException("pwd == null but a password is needed"); + } else { + // Ignore setting the password. + return; + } } + raw_password = pwd; // enhancement by Alberto coletti Text node = getFirstNode(this.elementPassword); try { Modified: webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java URL: http://svn.apache.org/viewvc/webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java?rev=612671&r1=612670&r2=612671&view=diff ============================================================================== --- webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java (original) +++ webservices/wss4j/trunk/src/org/apache/ws/security/processor/DerivedKeyTokenProcessor.java Wed Jan 16 17:15:40 2008 @@ -33,8 +33,6 @@ import org.apache.ws.security.util.Base64; import org.w3c.dom.Element; -import sun.security.x509.KeyIdentifier; - import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]