package com.github.hburgmeier.jerseyoauth2.protocol.impl; import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.EnumSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang3.tuple.ImmutablePair; import com.github.hburgmeier.jerseyoauth2.api.protocol.IHttpRequest; import com.github.hburgmeier.jerseyoauth2.api.types.ParameterStyle; import com.github.hburgmeier.jerseyoauth2.protocol.impl.extractor.CombinedExtractor; import com.github.hburgmeier.jerseyoauth2.protocol.impl.extractor.HeaderExtractor; import com.github.hburgmeier.jerseyoauth2.protocol.impl.extractor.IExtractor; import com.github.hburgmeier.jerseyoauth2.protocol.impl.oauth2.Constants; public class ClientSecretExtractor implements IExtractor { private static final String BASIC_AUTH_PREFIX = "Basic "; private static final Pattern BASIC_AUTH_PWD_PATTERN = Pattern.compile("(.*):(.*)"); protected CombinedExtractor secretExtractor; protected HeaderExtractor authorizationExtractor = new HeaderExtractor(HttpHeaders.AUTHORIZATION); protected final boolean useAuthorizationHeader; protected boolean usedAuthorization; public ClientSecretExtractor(boolean useAuthorizationHeader) { super(); this.secretExtractor = new CombinedExtractor(Constants.CLIENT_SECRET); this.useAuthorizationHeader = useAuthorizationHeader; } public ClientSecretExtractor(boolean useAuthorizationHeader, EnumSet<ParameterStyle> parameterStyles) { super(); this.secretExtractor = new CombinedExtractor(Constants.CLIENT_SECRET, parameterStyles); this.useAuthorizationHeader = useAuthorizationHeader; } @Override public String extractValue(IHttpRequest request) { String value = null; usedAuthorization = false; if (useAuthorizationHeader) { String authorization = authorizationExtractor.extractValue(request); if (authorization!=null && authorization.startsWith(BASIC_AUTH_PREFIX)) { value = parseAuthorizationHeader(authorization).right; usedAuthorization = true; } else { value = secretExtractor.extractValue(request); } } else { value = secretExtractor.extractValue(request); } return value; } public boolean hasUsedAuthorization() { return usedAuthorization; } protected ImmutablePair<String, String> parseAuthorizationHeader(String auth) { try { String authStr = auth.substring(BASIC_AUTH_PREFIX.length()); String decodedAuth = new String(Base64.decodeBase64(authStr),StandardCharsets.UTF_8.name()); Matcher matcher = BASIC_AUTH_PWD_PATTERN.matcher(decodedAuth); if (matcher.matches()) { return new ImmutablePair<String, String>(matcher.group(1), matcher.group(2)); } else throw new IllegalArgumentException(auth); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } } }