Skip to content

Commit

Permalink
support for http header triggers, updated content of debug cookie, al…
Browse files Browse the repository at this point in the history
…igned link to error pages
  • Loading branch information
frwiqueueit committed Oct 5, 2017
1 parent 79d0ddc commit 1dca56f
Show file tree
Hide file tree
Showing 10 changed files with 596 additions and 98 deletions.
61 changes: 40 additions & 21 deletions SDK/src/queueit/knownuserv3/sdk/KnownUser.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
package queueit.knownuserv3.sdk;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.Cookie;
Expand Down Expand Up @@ -37,10 +40,10 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String
try {
boolean isDebug = getIsDebug(queueitToken, secretKey);
if (isDebug) {
debugEntries.put("configVersion", Integer.toString(customerIntegrationInfo.Version));
debugEntries.put("pureUrl", currentUrlWithoutQueueITToken);
debugEntries.put("queueitToken", queueitToken);
debugEntries.put("OriginalURL", request.getRequestURL().toString());
debugEntries.put("ConfigVersion", Integer.toString(customerIntegrationInfo.Version));
debugEntries.put("PureUrl", currentUrlWithoutQueueITToken);
debugEntries.put("QueueitToken", queueitToken);
debugEntries.put("OriginalUrl", getOriginalUrl(request));
}

if (Utils.isNullOrWhiteSpace(currentUrlWithoutQueueITToken)) {
Expand All @@ -53,14 +56,13 @@ public static RequestValidationResult validateRequestByIntegrationConfig(String
Cookie[] cookies = request != null ? request.getCookies() : new Cookie[0];

IntegrationEvaluator configEvaluater = new IntegrationEvaluator();
String userAgent = request.getHeader("User-Agent");

IntegrationConfigModel matchedConfig = configEvaluater.getMatchedIntegrationConfig(
customerIntegrationInfo, currentUrlWithoutQueueITToken, cookies, userAgent != null ? userAgent : "");
customerIntegrationInfo, currentUrlWithoutQueueITToken, request);

if (isDebug) {
String matchedConfigName = (matchedConfig != null) ? matchedConfig.Name : "NULL";
debugEntries.put("matchedConfig", matchedConfigName);
debugEntries.put("MatchedConfig", matchedConfigName);
}

if (matchedConfig == null) {
Expand Down Expand Up @@ -136,10 +138,10 @@ private static RequestValidationResult cancelRequestByLocalConfig(

boolean isDebug = getIsDebug(queueitToken, secretKey);
if (isDebug) {
debugEntries.put("targetUrl", targetUrl);
debugEntries.put("queueitToken", queueitToken);
debugEntries.put("cancelConfig", cancelConfig != null ? cancelConfig.toString() : "NULL");
debugEntries.put("OriginalURL", request.getRequestURL().toString());
debugEntries.put("TargetUrl", targetUrl);
debugEntries.put("QueueitToken", queueitToken);
debugEntries.put("CancelConfig", cancelConfig != null ? cancelConfig.toString() : "NULL");
debugEntries.put("OriginalUrl", getOriginalUrl(request));
}

if (Utils.isNullOrWhiteSpace(targetUrl)) {
Expand Down Expand Up @@ -189,10 +191,10 @@ private static RequestValidationResult resolveQueueRequestByLocalConfig(

boolean isDebug = getIsDebug(queueitToken, secretKey);
if (isDebug) {
debugEntries.put("targetUrl", targetUrl);
debugEntries.put("queueitToken", queueitToken);
debugEntries.put("queueConfig", queueConfig != null ? queueConfig.toString() : "NULL");
debugEntries.put("OriginalURL", request.getRequestURL().toString());
debugEntries.put("TargetUrl", targetUrl);
debugEntries.put("QueueitToken", queueitToken);
debugEntries.put("QueueConfig", queueConfig != null ? queueConfig.toString() : "NULL");
debugEntries.put("OriginalUrl", getOriginalUrl(request));
}

if (Utils.isNullOrWhiteSpace(customerId)) {
Expand Down Expand Up @@ -242,17 +244,18 @@ public static void extendQueueCookie(String eventId,
userInQueueService.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, secretKey);
}

private static void setDebugCookie(Map<String, String> debugEntries, HttpServletRequest request, HttpServletResponse response) {
private static void setDebugCookie(Map<String, String> debugEntries, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
if(debugEntries.isEmpty())
return;

ICookieManager cookieManager = new CookieManager(request, response);
String cookieValue = "";
String cookieValue = "";
for (Map.Entry<String, String> entry : debugEntries.entrySet()) {
cookieValue += (entry.getKey() + "=" + entry.getValue() + "&");
cookieValue += (entry.getKey() + "=" + entry.getValue() + "|");
}
if(!"".equals(cookieValue))
cookieValue = cookieValue.substring(0, cookieValue.length() - 1); // remove trailing &
cookieValue = cookieValue.substring(0, cookieValue.length() - 1); // remove trailing char

cookieManager.setCookie(QueueITDebugKey, cookieValue, null, null);
}

Expand All @@ -265,6 +268,18 @@ private static boolean getIsDebug(String queueitToken, String secretKey) throws
}
return false;
}

private static String getOriginalUrl(HttpServletRequest request){
return (request.getQueryString() != null)
? String.join("", request.getRequestURL(), "?",request.getQueryString())
: request.getRequestURL().toString();
}
}

interface ICookieManager {

void setCookie(String cookieName, String cookieValue, Integer expiration, String cookieDomain);
String getCookie(String cookieName);
}

class CookieManager implements ICookieManager {
Expand All @@ -287,7 +302,9 @@ public void setCookie(String cookieName, String cookieValue, Integer expiration,
if (cookieValue == null) {
cookieValue = "";
}
cookie.setValue(cookieValue);
try {
cookie.setValue(URLEncoder.encode(cookieValue, "UTF-8"));
} catch (UnsupportedEncodingException ex) {}
if(expiration != null)
cookie.setMaxAge(expiration);
cookie.setPath("/");
Expand All @@ -311,7 +328,9 @@ public String getCookie(String cookieName) {

for (Cookie cookie : cookies) {
if (cookie.getName().equals(cookieName)) {
return cookie.getValue();
try {
return URLDecoder.decode(cookie.getValue(), "UTF-8");
} catch (UnsupportedEncodingException ex) { }
}
}
return null;
Expand Down
4 changes: 2 additions & 2 deletions SDK/src/queueit/knownuserv3/sdk/UserInQueueService.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ void extendQueueCookie(

class UserInQueueService implements IUserInQueueService {

public static final String SDK_VERSION = "3.2.0";
public static final String SDK_VERSION = "3.3.0";
private final IUserInQueueStateRepository _userInQueueStateRepository;

public UserInQueueService(
Expand Down Expand Up @@ -116,7 +116,7 @@ private RequestValidationResult getVaidationErrorResult(
if (!domainAlias.endsWith("/")) {
domainAlias = domainAlias + "/";
}
String redirectUrl = "https://" + domainAlias + "error/" + errorCode + "?" + query;
String redirectUrl = "https://" + domainAlias + "error/" + errorCode + "/?" + query;
return new RequestValidationResult(ActionType.QUEUE_ACTION, config.getEventId(), null, redirectUrl);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,12 +183,6 @@ public void extendQueueCookie(
}
}

interface ICookieManager {

void setCookie(String cookieName, String cookieValue, Integer expiration, String cookieDomain);
String getCookie(String cookieName);
}

class StateInfo {

private final boolean isValid;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ final class ValidatorType {
public static final String URL_VALIDATOR = "UrlValidator";
public static final String COOKIE_VALIDATOR = "CookieValidator";
public static final String USERAGENT_VALIDATOR = "UserAgentValidator";
public static final String HTTPHEADER_VALIDATOR = "HttpHeaderValidator";
}

final class UrlPartType {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@
import javax.servlet.http.Cookie;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Map;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

interface IIntegrationEvaluator {

IntegrationConfigModel getMatchedIntegrationConfig(
CustomerIntegration customerIntegration,
String currentPageUrl,
Cookie[] cookies,
String userAgent);
HttpServletRequest request) throws Exception;
}

public class IntegrationEvaluator implements IIntegrationEvaluator {
Expand All @@ -19,11 +21,14 @@ public class IntegrationEvaluator implements IIntegrationEvaluator {
public IntegrationConfigModel getMatchedIntegrationConfig(
CustomerIntegration customerIntegration,
String currentPageUrl,
Cookie[] cookies,
String userAgent) {
HttpServletRequest request) throws Exception {

if(request == null)
throw new Exception("request is null");

for (IntegrationConfigModel integration : customerIntegration.Integrations) {
for (TriggerModel trigger : integration.Triggers) {
if (evaluateTrigger(trigger, currentPageUrl, cookies, userAgent)) {
if (evaluateTrigger(trigger, currentPageUrl, request)) {
return integration;
}
}
Expand All @@ -34,37 +39,34 @@ public IntegrationConfigModel getMatchedIntegrationConfig(
private boolean evaluateTrigger(
TriggerModel trigger,
String currentPageUrl,
Cookie[] cookies,
String userAgent) {
HttpServletRequest request) {
if (trigger.LogicalOperator.equals(LogicalOperatorType.OR)) {
for (TriggerPart part : trigger.TriggerParts) {
if (evaluateTriggerPart(part, currentPageUrl, cookies, userAgent)) {
if (evaluateTriggerPart(part, currentPageUrl, request)) {
return true;
}
}
return false;
} else {
for (TriggerPart part : trigger.TriggerParts) {
if (!evaluateTriggerPart(part, currentPageUrl, cookies, userAgent)) {
if (!evaluateTriggerPart(part, currentPageUrl, request)) {
return false;
}
}
return true;
}
}

private boolean evaluateTriggerPart(
TriggerPart triggerPart,
String currentPageUrl,
Cookie[] cookies,
String userAgent) {
private boolean evaluateTriggerPart(TriggerPart triggerPart, String currentPageUrl, HttpServletRequest request) {
switch (triggerPart.ValidatorType) {
case ValidatorType.URL_VALIDATOR:
return UrlValidatorHelper.evaluate(triggerPart, currentPageUrl);
case ValidatorType.COOKIE_VALIDATOR:
return CookieValidatorHelper.evaluate(triggerPart, cookies);
return CookieValidatorHelper.evaluate(triggerPart, request.getCookies());
case ValidatorType.USERAGENT_VALIDATOR:
return UserAgentValidatorHelper.evaluate(triggerPart, userAgent);
return UserAgentValidatorHelper.evaluate(triggerPart, request.getHeader("User-Agent"));
case ValidatorType.HTTPHEADER_VALIDATOR:
return HttpHeaderValidatorHelper.evaluate(triggerPart, request);
default:
return false;
}
Expand Down Expand Up @@ -151,6 +153,18 @@ public static boolean evaluate(TriggerPart triggerPart, String userAgent) {
triggerPart.ValueToCompare);
}
}

final class HttpHeaderValidatorHelper {
public static boolean evaluate(TriggerPart triggerPart, HttpServletRequest request)
{
return ComparisonOperatorHelper.evaluate(triggerPart.Operator,
triggerPart.IsNegative,
triggerPart.IsIgnoreCase,
request.getHeader(triggerPart.HttpHeaderName),
triggerPart.ValueToCompare);
}
}

final class ComparisonOperatorHelper {

public static boolean evaluate(String opt, boolean isNegative, boolean isIgnoreCase, String left, String right) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,6 @@ public class TriggerPart {
public String UrlPart;
//CookieValidator
public String CookieName;
//HttpHeaderValidator
public String HttpHeaderName;
}
Loading

0 comments on commit 1dca56f

Please sign in to comment.