package com.eviware.soapui.impl.rest; import com.eviware.soapui.config.AccessTokenPositionConfig; import com.eviware.soapui.config.AccessTokenStatusConfig; import com.eviware.soapui.config.OAuth1ProfileConfig; import com.eviware.soapui.config.RefreshAccessTokenMethodConfig; import com.eviware.soapui.config.TimeUnitConfig; import com.eviware.soapui.model.propertyexpansion.PropertyExpansion; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionContainer; import com.eviware.soapui.model.propertyexpansion.PropertyExpansionsResult; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import org.apache.commons.lang.StringUtils; import javax.annotation.Nonnull; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import static org.opensaml.xml.util.DatatypeHelper.safeTrim; public class OAuth1Profile implements PropertyExpansionContainer { public static final String CLIENT_ID_PROPERTY = "clientID"; public static final String CLIENT_SECRET_PROPERTY = "clientSecret"; public static final String AUTHORIZATION_URI_PROPERTY = "authorizationURI"; public static final String ACCESS_TOKEN_URI_PROPERTY = "accessTokenURI"; public static final String REDIRECT_URI_PROPERTY = "redirectURI"; public static final String ACCESS_TOKEN_PROPERTY = "accessToken"; public static final String REFRESH_TOKEN_PROPERTY = "refreshToken"; public static final String SCOPE_PROPERTY = "scope"; public static final String ACCESS_TOKEN_STATUS_PROPERTY = "accessTokenStatus"; public static final String ACCESS_TOKEN_POSITION_PROPERTY = "accessTokenPosition"; public static final String ACCESS_TOKEN_EXPIRATION_TIME = "accessTokenExpirationTime"; public static final String ACCESS_TOKEN_ISSUED_TIME = "accessTokenIssuedTime"; public static final String MANUAL_ACCESS_TOKEN_EXPIRATION_TIME = "manualAccessTokenExpirationTime"; public static final String USE_MANUAL_ACCESS_TOKEN_EXPIRATION_TIME = "useManualAccessTokenExpirationTime"; public static final String REFRESH_ACCESS_TOKEN_METHOD_PROPERTY = "refreshAccessTokenMethod"; public static final String MANUAL_ACCESS_TOKEN_EXPIRATION_TIME_UNIT_PROPERTY = "manualAccessTokenExpirationTimeUnit"; public static final String TOKEN_SECRET_PROPERTY = "tokenSecret"; public static final String TEMPORARY_TOKEN_URI_PROPERTY = "temporaryTokenURI"; public static final String CONSUMER_SECRET_PROPERTY = "consumerSecret"; public static final String CONSUMER_KEY_PROPERTY = "consumerKey"; public static final String RESOURCE_OWNER_LOGIN_PROPERTY = "resourceOwnerName"; public static final String RESOURCE_OWNER_PASSWORD_PROPERTY = "resourceOwnerPassword"; public static final String TOKEN_SECRET_STATUS_PROPERTY = "tokenSecretStatus"; private final OAuth1ProfileContainer OAuth1ProfileContainer; private final OAuth1ProfileConfig configuration; private final PropertyChangeSupport pcs; public OAuth1Profile(OAuth1ProfileContainer OAuth1ProfileContainer, OAuth1ProfileConfig configuration) { this.OAuth1ProfileContainer = OAuth1ProfileContainer; this.configuration = configuration; pcs = new PropertyChangeSupport(this); setDefaultAccessTokenPosition(); setDefaultAccessTokenStatus(); } public String getName() { if (StringUtils.isEmpty(configuration.getName())) { configuration.setName("OAuth 1 - Profile 1"); } return configuration.getName(); } public void setName(String newName) { configuration.setName(newName); } public void waitForAccessTokenStatus(AccessTokenStatusConfig.Enum accessTokenStatus, int timeout) { int timeLeft = timeout; while ((getAccessTokenStatus() != accessTokenStatus) && timeLeft > 0) { long startTime = System.currentTimeMillis(); try { synchronized (this) { wait(timeLeft); } } catch (InterruptedException ignore) { } timeLeft -= (System.currentTimeMillis() - startTime); } } public void applyRetrievedAccessToken(String accessToken) { // Ignore return value in this case: even if it is not a change, it is important to know that a token has been // retrieved from the server doSetAccessToken(accessToken); setAccessTokenStatus(AccessTokenStatusConfig.RETRIEVED_FROM_SERVER); } public String getAccessToken() { return configuration.getAccessToken(); } /** * NOTE: This setter should only be used from the GUI, because it also sets the property "accessTokenStatus" to * ENTERED_MANUALLY * * @param accessToken the access token supplied by the user */ public void setAccessToken(String accessToken) { if (doSetAccessToken(accessToken)) { setAccessTokenStatus(AccessTokenStatusConfig.ENTERED_MANUALLY); } } public String getConsumerKey() { return configuration.getConsumerKey(); } public void setConsumerKey(String consumerKey) { String oldValue = configuration.getConsumerKey(); String newValue = safeTrim(consumerKey); if (!StringUtils.equals(oldValue, newValue)) { configuration.setConsumerKey(newValue); pcs.firePropertyChange(CONSUMER_KEY_PROPERTY, oldValue, newValue); } } public String getTokenSecret() { return configuration.getTokenSecret(); } public void setTokenSecret(String tokenSecret) { if (doSetTokenSecret(tokenSecret)) { setTokenSecretStatus(AccessTokenStatusConfig.ENTERED_MANUALLY); } } public String getTemporaryTokenURI() { return configuration.getTemporaryTokenURI(); } public void setTemporaryTokenURI(String temporaryTokenURI) { String oldValue = configuration.getTemporaryTokenURI(); String newValue = safeTrim(temporaryTokenURI); if (!StringUtils.equals(oldValue, newValue)) { configuration.setTemporaryTokenURI(newValue); pcs.firePropertyChange(TEMPORARY_TOKEN_URI_PROPERTY, oldValue, newValue); } } public String getConsumerSecret() { return configuration.getConsumerSecret(); } public void setConsumerSecret(String consumerSecret) { String oldValue = configuration.getConsumerSecret(); String newValue = safeTrim(consumerSecret); if (!StringUtils.equals(oldValue, newValue)) { configuration.setConsumerSecret(newValue); pcs.firePropertyChange(CONSUMER_SECRET_PROPERTY, oldValue, newValue); } } public void resetTokenSecretStatusToStartingStatus() { setTokenSecretStatus(getTokenSecretStartingStatus()); } public AccessTokenStatusConfig.Enum getTokenSecretStartingStatus() { AccessTokenStatusConfig.Enum result = configuration.getTokenSecretStartingStatus(); if (result == null) { result = AccessTokenStatusConfig.UNKNOWN; } return result; } public void setTokenSecretStartingStatus(AccessTokenStatusConfig.Enum startingStatus) { if (startingStatus == null) { startingStatus = AccessTokenStatusConfig.UNKNOWN; } configuration.setTokenSecretStartingStatus(startingStatus); } public AccessTokenStatusConfig.Enum getTokenSecretStatus() { AccessTokenStatusConfig.Enum result = configuration.getTokenSecretStatus(); if (result == null) { result = AccessTokenStatusConfig.UNKNOWN; } return result; } public void setTokenSecretStatus(AccessTokenStatusConfig.Enum newStatus) { if (newStatus == null) { newStatus = AccessTokenStatusConfig.UNKNOWN; } AccessTokenStatusConfig.Enum oldStatus = configuration.getTokenSecretStatus(); if (newStatus == oldStatus) { return; } if (newStatus == AccessTokenStatusConfig.UNKNOWN) { if (configuration.isSetTokenSecretStatus()) { configuration.unsetTokenSecretStatus(); } } else { configuration.setTokenSecretStatus(newStatus); } boolean isStartingStatus = newStatus == AccessTokenStatusConfig.ENTERED_MANUALLY || newStatus == AccessTokenStatusConfig.RETRIEVED_FROM_SERVER || newStatus == AccessTokenStatusConfig.EXPIRED; if (isStartingStatus) { setTokenSecretStartingStatus(newStatus); } pcs.firePropertyChange(TOKEN_SECRET_STATUS_PROPERTY, oldStatus, newStatus); } private boolean doSetAccessToken(String accessToken) { String oldValue = configuration.getAccessToken(); String newValue = accessToken == null ? null : accessToken.trim(); if (!StringUtils.equals(oldValue, newValue)) { configuration.setAccessToken(newValue); pcs.firePropertyChange(ACCESS_TOKEN_PROPERTY, oldValue, newValue); return true; } return false; } public String getAuthorizationURI() { return configuration.getAuthorizationURI(); } public void setAuthorizationURI(String authorizationURI) { String oldValue = configuration.getAuthorizationURI(); String newValue = nullSafeTrim(authorizationURI); if (!StringUtils.equals(oldValue, newValue)) { configuration.setAuthorizationURI(newValue); pcs.firePropertyChange(AUTHORIZATION_URI_PROPERTY, oldValue, newValue); } } private String nullSafeTrim(String inputString) { return inputString == null ? null : inputString.trim(); } public String getRedirectURI() { return configuration.getRedirectURI(); } public void setRedirectURI(String redirectURI) { String oldValue = configuration.getRedirectURI(); if (!StringUtils.equals(oldValue, redirectURI)) { configuration.setRedirectURI(redirectURI); pcs.firePropertyChange(REDIRECT_URI_PROPERTY, oldValue, redirectURI); } } public OAuth1ProfileConfig getConfiguration() { return configuration; } public String getAccessTokenURI() { return configuration.getAccessTokenURI(); } public void setAccessTokenURI(String accessTokenURI) { String oldValue = configuration.getAccessTokenURI(); String newValue = nullSafeTrim(accessTokenURI); if (!StringUtils.equals(oldValue, newValue)) { configuration.setAccessTokenURI(newValue); pcs.firePropertyChange(ACCESS_TOKEN_URI_PROPERTY, oldValue, newValue); } } public AccessTokenStatusConfig.Enum getAccessTokenStatus() { return getSavedAccessTokenStatusEnum(configuration.getAccessTokenStatus()); } public void setAccessTokenStatus(AccessTokenStatusConfig.Enum newStatus) { AccessTokenStatusConfig.Enum oldStatus = getSavedAccessTokenStatusEnum(configuration.getAccessTokenStatus()); if (newStatus == oldStatus) { return; } saveAccessTokenStatusEnum(newStatus, configuration); if (isAStartingStatus(newStatus)) { setAccessTokenStartingStatus(newStatus); } pcs.firePropertyChange(ACCESS_TOKEN_STATUS_PROPERTY, oldStatus, newStatus); } public AccessTokenStatusConfig.Enum getAccessTokenStartingStatus() { return getSavedAccessTokenStartingStatusEnum(configuration.getAccessTokenStartingStatus()); } private void setAccessTokenStartingStatus(@Nonnull AccessTokenStatusConfig.Enum startingStatus) { Preconditions.checkNotNull(startingStatus); saveAccessTokenStartingStatusEnum(startingStatus, configuration); } public void resetAccessTokenStatusToStartingStatus() { setAccessTokenStatus(getAccessTokenStartingStatus()); } public AccessTokenPositionConfig.Enum getAccessTokenPosition() { return getSavedAccessTokenPositionEnum(configuration.getAccessTokenPosition()); } public void setAccessTokenPosition(@Nonnull AccessTokenPositionConfig.Enum newAccessTokenPosition) { Preconditions.checkNotNull(newAccessTokenPosition); AccessTokenPositionConfig.Enum oldAccessTokenPosition = getSavedAccessTokenPositionEnum(configuration.getAccessTokenPosition()); saveAccessTokenPositionEnum(newAccessTokenPosition, configuration); pcs.firePropertyChange(ACCESS_TOKEN_POSITION_PROPERTY, oldAccessTokenPosition, newAccessTokenPosition); } public long getAccessTokenIssuedTime() { return configuration.getAccessTokenIssuedTime(); } public void setAccessTokenIssuedTime(long newIssuedTime) { long oldIssuedTime = configuration.getAccessTokenIssuedTime(); if (oldIssuedTime != newIssuedTime) { configuration.setAccessTokenIssuedTime(newIssuedTime); pcs.firePropertyChange(ACCESS_TOKEN_ISSUED_TIME, oldIssuedTime, newIssuedTime); } } public String getManualAccessTokenExpirationTime() { return configuration.getManualAccessTokenExpirationTime(); } public void setManualAccessTokenExpirationTime(@Nonnull String newExpirationTime) { String oldExpirationTime = configuration.getManualAccessTokenExpirationTime(); if (!Objects.equal(oldExpirationTime, newExpirationTime)) { configuration.setManualAccessTokenExpirationTime(newExpirationTime); pcs.firePropertyChange(MANUAL_ACCESS_TOKEN_EXPIRATION_TIME, oldExpirationTime, newExpirationTime); } } public boolean useManualAccessTokenExpirationTime() { return configuration.getUseManualAccessTokenExpirationTime(); } public void setUseManualAccessTokenExpirationTime(boolean useManual) { boolean oldValue = configuration.getUseManualAccessTokenExpirationTime(); if (oldValue != useManual) { configuration.setUseManualAccessTokenExpirationTime(useManual); pcs.firePropertyChange(USE_MANUAL_ACCESS_TOKEN_EXPIRATION_TIME, oldValue, useManual); } } public TimeUnitConfig.Enum getManualAccessTokenExpirationTimeUnit() { if (configuration.getManualAccessTokenExpirationTimeUnit() == null) { configuration.setManualAccessTokenExpirationTimeUnit(TimeUnitConfig.SECONDS); } return configuration.getManualAccessTokenExpirationTimeUnit(); } public void setManualAccessTokenExpirationTimeUnit(TimeUnitConfig.Enum newValue) { TimeUnitConfig.Enum oldValue = getManualAccessTokenExpirationTimeUnit(); if (!oldValue.equals(newValue)) { configuration.setManualAccessTokenExpirationTimeUnit(newValue); pcs.firePropertyChange(MANUAL_ACCESS_TOKEN_EXPIRATION_TIME_UNIT_PROPERTY, oldValue.toString(), newValue.toString()); } } public OAuth1ProfileContainer getContainer() { return OAuth1ProfileContainer; } @Override public PropertyExpansion[] getPropertyExpansions() { PropertyExpansionsResult result = new PropertyExpansionsResult(OAuth1ProfileContainer.getProject(), this); result.extractAndAddAll(CLIENT_ID_PROPERTY); result.extractAndAddAll(CLIENT_SECRET_PROPERTY); result.extractAndAddAll(AUTHORIZATION_URI_PROPERTY); result.extractAndAddAll(ACCESS_TOKEN_URI_PROPERTY); result.extractAndAddAll(REDIRECT_URI_PROPERTY); result.extractAndAddAll(ACCESS_TOKEN_PROPERTY); result.extractAndAddAll(SCOPE_PROPERTY); result.extractAndAddAll(MANUAL_ACCESS_TOKEN_EXPIRATION_TIME); result.extractAndAddAll(RESOURCE_OWNER_LOGIN_PROPERTY); result.extractAndAddAll(RESOURCE_OWNER_PASSWORD_PROPERTY); return result.toArray(); } public void addPropertyChangeListener(PropertyChangeListener listener) { pcs.addPropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { pcs.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { pcs.removePropertyChangeListener(listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { pcs.removePropertyChangeListener(propertyName, listener); } private boolean isAStartingStatus(AccessTokenStatusConfig.Enum newStatus) { return newStatus == AccessTokenStatusConfig.ENTERED_MANUALLY || newStatus == AccessTokenStatusConfig.RETRIEVED_FROM_SERVER || newStatus == AccessTokenStatusConfig.EXPIRED; } private void setDefaultAccessTokenPosition() { if (getAccessTokenPosition() == null) { setAccessTokenPosition(AccessTokenPositionConfig.HEADER); } } private void setDefaultAccessTokenStatus() { setAccessTokenStatus(AccessTokenStatusConfig.UNKNOWN); } private AccessTokenStatusConfig.Enum getSavedAccessTokenStartingStatusEnum(AccessTokenStatusConfig.Enum persistedEnum) { return getSavedAccessTokenStatusEnum(persistedEnum); } private AccessTokenStatusConfig.Enum getSavedAccessTokenStatusEnum(AccessTokenStatusConfig.Enum persistedEnum) { if (persistedEnum == null) { return AccessTokenStatusConfig.UNKNOWN; } else { return persistedEnum; } } private AccessTokenPositionConfig.Enum getSavedAccessTokenPositionEnum(AccessTokenPositionConfig.Enum persistedEnum) { if (persistedEnum == null) { return null; } else { return persistedEnum; } } private RefreshAccessTokenMethods getSavedRefreshAccessTokenMethodsEnum(RefreshAccessTokenMethodConfig.Enum persistedEnum) { if (persistedEnum == null) { return null; } else { return RefreshAccessTokenMethods.valueOf(persistedEnum.toString()); } } private void saveAccessTokenStatusEnum(AccessTokenStatusConfig.Enum enumToBePersisted, OAuth1ProfileConfig configuration) { configuration.setAccessTokenStatus(enumToBePersisted); } private void saveAccessTokenStartingStatusEnum(AccessTokenStatusConfig.Enum enumToBePersisted, OAuth1ProfileConfig configuration) { configuration.setAccessTokenStartingStatus(enumToBePersisted); } private void saveAccessTokenPositionEnum(AccessTokenPositionConfig.Enum enumToBePersisted, OAuth1ProfileConfig configuration) { configuration.setAccessTokenPosition(enumToBePersisted); } public void applyRetrievedTokenSecret(String tokenSecret) { doSetTokenSecret(tokenSecret); setTokenSecretStatus(AccessTokenStatusConfig.RETRIEVED_FROM_SERVER); } private boolean doSetTokenSecret(String tokenSecret) { String oldValue = configuration.getTokenSecret(); String newValue = tokenSecret == null ? null : tokenSecret.trim(); if (!StringUtils.equals(oldValue, newValue)) { configuration.setTokenSecret(newValue); pcs.firePropertyChange(TOKEN_SECRET_PROPERTY, oldValue, newValue); return true; } return false; } public enum AccessTokenStatus { UNKNOWN("Unknown"), ENTERED_MANUALLY("Entered Manually"), WAITING_FOR_AUTHORIZATION("Waiting for Authorization"), RECEIVED_AUTHORIZATION_CODE("Received authorization code"), RETRIEVED_FROM_SERVER("Retrieved from server"), RETRIEVAL_CANCELED("Retrieval canceled"), EXPIRED("Expired"); private String description; AccessTokenStatus(String description) { this.description = description; } @Override public String toString() { return description; } } public enum AccessTokenPosition { QUERY("Query"), HEADER("Header"), BODY("Body"); private String description; AccessTokenPosition(String description) { this.description = description; } @Override public String toString() { return description; } } public enum RefreshAccessTokenMethods { AUTOMATIC("Automatic"), MANUAL("Manual"); private final String description; RefreshAccessTokenMethods(String description) { this.description = description; } @Override public String toString() { return description; } } }