/** * Copyright (c) 2009-2011 VMware, Inc. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * 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 "AS IS" 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 com.springsource.insight.plugin.socket; import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.springsource.insight.collection.http.HttpObfuscator; import com.springsource.insight.intercept.plugin.CollectionSettingName; import com.springsource.insight.intercept.plugin.CollectionSettingsRegistry; import com.springsource.insight.intercept.plugin.CollectionSettingsUpdateListener; import com.springsource.insight.intercept.trace.ObscuredValueMarker; import com.springsource.insight.util.StringUtil; import com.springsource.insight.util.logging.InsightLogManager; /** * Need it as a separate class mainly due to testing issues - but it is also more convenient */ class SocketCollectOperationContext implements CollectionSettingsUpdateListener { /** * The {@link CollectionSettingName} used to configured obscured address patterns */ public static final CollectionSettingName OBSCURED_ADDRESSES_PATTERN_SETTING = new CollectionSettingName("obscured.addresses.pattern", SocketPluginRuntimeDescriptor.PLUGIN_NAME, "Regexp used to obscure addresses"); /** * Special setting value used to signal that no obscuring pattern is required */ public static final String NO_PATTERN_VALUE = "NONE"; private volatile Pattern obscuredAddressesPattern /* =null - i.e., no obscuring */; private ObscuredValueMarker obscuredMarker; private HttpObfuscator obfuscator; public SocketCollectOperationContext() { this(HttpObfuscator.getInstance()); CollectionSettingsRegistry registry = CollectionSettingsRegistry.getInstance(); registry.addListener(this); registry.register(OBSCURED_ADDRESSES_PATTERN_SETTING, NO_PATTERN_VALUE); } SocketCollectOperationContext(HttpObfuscator hdrsObfuscator) { obfuscator = hdrsObfuscator; obscuredMarker = hdrsObfuscator.getSensitiveValueMarker(); } public void incrementalUpdate(CollectionSettingName name, Serializable value) { if (OBSCURED_ADDRESSES_PATTERN_SETTING.equals(name)) { String curValue = (obscuredAddressesPattern == null) ? NO_PATTERN_VALUE : obscuredAddressesPattern.pattern(); String newValue = StringUtil.safeToString(value); if (StringUtil.safeCompare(curValue, newValue) != 0) { Pattern newPattern = (StringUtil.isEmpty(newValue) || NO_PATTERN_VALUE.equalsIgnoreCase(newValue)) ? null : CollectionSettingsRegistry.getPatternSettingValue(value); InsightLogManager.getLogger(getClass().getName()) .info("incrementalUpdate(" + name + "): " + curValue + " => " + newValue); obscuredAddressesPattern = newPattern; } } else if (HttpObfuscator.OBFUSCATED_HEADERS_SETTING.equals(name)) { obfuscator.incrementalUpdate(name, value); // make sure change is propagated } } ObscuredValueMarker getObscuredValueMarker() { return obscuredMarker; } void setObscuredValueMarker(ObscuredValueMarker marker) { this.obscuredMarker = marker; } /** * @param addr Address value to be checked if requires obfuscation * @return <code>true</code> if address has been marked as obscured value */ boolean updateObscuredAddressValue(String addr) { if (StringUtil.isEmpty(addr) || (obscuredAddressesPattern == null)) { return false; } Matcher matcher = obscuredAddressesPattern.matcher(addr); if (matcher.matches()) { obscuredMarker.markObscured(addr); return true; } return false; } boolean updateObscuredHeaderValue(String name, String value) { if (!obfuscator.processHeader(name, value)) { return false; } ObscuredValueMarker curMarker = getObscuredValueMarker(); ObscuredValueMarker httpMarker = obfuscator.getSensitiveValueMarker(); /* * Check if substituted the marker (e.g., for addresses obscuring). * If so, then inform the substituted marker as well of the * obscured header value */ if (curMarker != httpMarker) { curMarker.markObscured(value); } return true; } }