/************************************************************************* * Copyright 2009-2012 Eucalyptus Systems, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/. * * Please contact Eucalyptus Systems, Inc., 6755 Hollister Ave., Goleta * CA 93117, USA or visit http://www.eucalyptus.com/licenses/ if you need * additional information or have any questions. ************************************************************************/ package com.eucalyptus.crypto.util; import java.util.regex.Pattern; import javax.annotation.Nonnull; import javax.annotation.Nullable; import com.google.common.base.Splitter; import com.google.common.base.Strings; import com.google.common.collect.Iterables; /** * */ public enum SecurityHeader { Date, X_Amz_Date(true); private final String header; private SecurityHeader() { this( false ); } private SecurityHeader( final boolean dashValue ) { this.header = dashValue ? name().replace('_','-') : name(); } /** * Get the header name. * * @return The name */ @Nonnull public String header() { return header; } public enum Value { AWS4_HMAC_SHA256( true ) { @Override public boolean matches( @Nullable final String headerValue ) { return value().equals( Iterables.getFirst( Splitter.on( whitespace ).limit( 2 ).omitEmptyStrings() .split( Strings.nullToEmpty( headerValue ) ), "" ) ); } }; private static final Pattern whitespace = Pattern.compile( "\\s+" ); private final String value; private Value() { this( false ); } private Value( final boolean dashValue ) { this.value = dashValue ? name().replace('_','-') : name(); } /** * Does this header value match the given header. * * @param header The value to match against * @return True if matches */ public abstract boolean matches( @Nullable String header ); /** * Get the header value. * * @return The value */ @Nonnull public String value() { return value; } } }