/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.support.wss.entries; import com.eviware.soapui.SoapUI; import com.eviware.soapui.config.WSSEntryConfig; import com.eviware.soapui.impl.wsdl.support.wss.OutgoingWss; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContext; import com.eviware.soapui.support.StringUtils; import com.eviware.soapui.support.components.SimpleBindingForm; import com.eviware.soapui.support.xml.XmlObjectConfigurationBuilder; import com.eviware.soapui.support.xml.XmlObjectConfigurationReader; import com.jgoodies.binding.PresentationModel; import org.apache.ws.security.WSConstants; import org.apache.ws.security.message.WSSecHeader; import org.apache.ws.security.message.WSSecUsernameToken; import org.apache.ws.security.util.Base64; import org.w3c.dom.Document; import javax.swing.JComponent; import java.security.MessageDigest; public class UsernameEntry extends WssEntryBase { private static final String PASSWORD_DIGEST_EXT = "PasswordDigest Ext"; private static final String PASSWORD_DIGEST = "PasswordDigest"; private static final String PASSWORD_TEXT = "PasswordText"; public static final String TYPE = "Username"; private boolean addCreated; private boolean addNonce; private String passwordType; public void init(WSSEntryConfig config, OutgoingWss container) { super.init(config, container, TYPE); } public void process(WSSecHeader secHeader, Document doc, PropertyExpansionContext context) { WSSecUsernameToken token = new WSSecUsernameToken(); if (addCreated) { token.addCreated(); } if (addNonce) { token.addNonce(); } if (StringUtils.hasContent(passwordType)) { if (passwordType.equals(PASSWORD_TEXT)) { token.setPasswordType(WSConstants.PASSWORD_TEXT); } else if (passwordType.equals(PASSWORD_DIGEST) || passwordType.equals(PASSWORD_DIGEST_EXT)) { token.setPasswordType(WSConstants.PASSWORD_DIGEST); } } String password = context.expand(getPassword()); if (PASSWORD_DIGEST_EXT.equals(passwordType)) { try { MessageDigest sha = MessageDigest.getInstance("SHA-1"); sha.reset(); sha.update(password.getBytes("UTF-8")); password = Base64.encode(sha.digest()); } catch (Exception e) { SoapUI.logError(e); } } token.setUserInfo(context.expand(getUsername()), password); token.build(doc, secHeader); } @Override protected JComponent buildUI() { SimpleBindingForm form = new SimpleBindingForm(new PresentationModel<UsernameEntry>(this)); form.addSpace(5); form.appendTextField("username", "Username", "The username for this token"); form.appendPasswordField("password", "Password", "The password for this token"); form.appendCheckBox("addNonce", "Add Nonce", "Adds a nonce"); form.appendCheckBox("addCreated", "Add Created", "Adds a created"); form.appendComboBox("passwordType", "Password Type", new String[]{PASSWORD_TEXT, PASSWORD_DIGEST, PASSWORD_DIGEST_EXT}, "The password type to generate"); return form.getPanel(); } @Override protected void load(XmlObjectConfigurationReader reader) { addCreated = reader.readBoolean("addCreated", true); addNonce = reader.readBoolean("addNonce", true); passwordType = reader.readString("passwordType", WSConstants.PASSWORD_DIGEST); } @Override protected void save(XmlObjectConfigurationBuilder builder) { builder.add("addCreated", addCreated); builder.add("addNonce", addNonce); builder.add("passwordType", passwordType); } public boolean isAddCreated() { return addCreated; } public void setAddCreated(boolean addCreated) { this.addCreated = addCreated; saveConfig(); } public boolean isAddNonce() { return addNonce; } public void setAddNonce(boolean addNonce) { this.addNonce = addNonce; saveConfig(); } public String getPasswordType() { return passwordType; } public void setPasswordType(String passwordType) { this.passwordType = passwordType; saveConfig(); } }