com.cognifide.qa.bb.aem.AemAuthCookieFactory Maven / Gradle / Ivy
/*-
* #%L
* Bobcat
* %%
* Copyright (C) 2016 Cognifide Ltd.
* %%
* 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.
* #L%
*/
package com.cognifide.qa.bb.aem;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.BasicCookieStore;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.cookie.BasicClientCookie;
import org.apache.http.message.BasicNameValuePair;
import org.openqa.selenium.Cookie;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.cognifide.qa.bb.constants.ConfigKeys;
import com.cognifide.qa.bb.guice.ThreadScoped;
import com.google.inject.Inject;
/**
* This class provide authentication cookie for aem instance (default cookie name: login-token)
*/
@ThreadScoped
public class AemAuthCookieFactory {
private static final Logger LOG = LoggerFactory.getLogger(AemAuthCookieFactory.class);
private static final String DEFAULT_LOGIN_TOKEN = "login-token";
private final Map cookieJar = new HashMap<>();
@Inject
private Properties properties;
@Inject
private CloseableHttpClient httpClient;
/**
* This method provides browser cookie for authenticating user to AEM instance
*
* @param url URL to AEM instance, like http://localhost:4502
* @param login Username to use
* @param password Password to use
* @return Cookie for selenium WebDriver.
*/
public Cookie getCookie(String url, String login, String password) {
if (!cookieJar.containsKey(url)) {
HttpPost loginPost = new HttpPost(url
+ "/libs/granite/core/content/login.html/j_security_check");
List nameValuePairs = new ArrayList<>();
nameValuePairs.add(new BasicNameValuePair("_charset_", "utf-8"));
nameValuePairs.add(new BasicNameValuePair("j_username", login));
nameValuePairs.add(new BasicNameValuePair("j_password", password));
nameValuePairs.add(new BasicNameValuePair("j_validate", "true"));
CookieStore cookieStore = new BasicCookieStore();
HttpClientContext context = HttpClientContext.create();
if ("true".equals(properties.getProperty(ConfigKeys.WEBDRIVER_PROXY_COOKIE))) {
addProxyCookie(cookieStore);
}
context.setCookieStore(cookieStore);
try {
loginPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
CloseableHttpResponse loginResponse = httpClient.execute(loginPost, context);
loginResponse.close();
} catch (IOException e) {
LOG.error("Can't get AEM authentication cookie", e);
} finally {
loginPost.reset();
}
Cookie cookie = findAuthenticationCookie(cookieStore.getCookies());
if (cookie != null) {
cookieJar.put(url, cookie);
}
}
return cookieJar.get(url);
}
/**
* This method allows to remove cached authentication cookie for a given URL
*
* @param url URL to AEM instance, like http://localhost:4502
*/
public void removeCookie(String url) {
cookieJar.remove(url);
}
private Cookie findAuthenticationCookie(List cookies) {
for (org.apache.http.cookie.Cookie cookie : cookies) {
if (properties.getProperty(ConfigKeys.LOGIN_TOKEN, DEFAULT_LOGIN_TOKEN)
.equals(cookie.getName())) {
return new Cookie(cookie.getName(), cookie.getValue(), cookie.getDomain(), cookie.getPath(),
cookie.getExpiryDate());
}
}
return null;
}
private void addProxyCookie(CookieStore cookieStore) {
BasicClientCookie proxyCookie = new BasicClientCookie(
properties.getProperty(ConfigKeys.WEBDRIVER_PROXY_COOKIE_NAME),
properties.getProperty(ConfigKeys.WEBDRIVER_PROXY_COOKIE_VALUE));
proxyCookie.setDomain(properties.getProperty(ConfigKeys.WEBDRIVER_PROXY_COOKIE_DOMAIN));
proxyCookie.setPath("/");
cookieStore.addCookie(proxyCookie);
}
}