diff --git a/README.md b/README.md index 310ec8b..aada9d0 100644 --- a/README.md +++ b/README.md @@ -24,11 +24,11 @@ the following example of a controller is all that is needed to validate that a u class ResourceController < ApplicationController def index begin - + configJson = File.read('integrationconfig.json') customerId = "" # Your Queue-it customer ID secretKey = "" # Your 72 char secret key as specified in Go Queue-it self-service platform - + requestUrl = request.original_url pattern = Regexp.new("([\\?&])(" + QueueIt::KnownUser::QUEUEIT_TOKEN_KEY + "=[^&]*)", Regexp::IGNORECASE) requestUrlWithoutToken = requestUrl.gsub(pattern, '') @@ -39,17 +39,19 @@ class ResourceController < ApplicationController #requestUriNoToken = URI.parse(requestUrlWithoutToken) #requestUriNoToken.host = "INSERT-REPLACEMENT-HOST-HERE" #requestUrlWithoutToken = requestUriNoToken.to_s - + queueitToken = request.query_parameters[QueueIt::KnownUser::QUEUEIT_TOKEN_KEY.to_sym] + # Initialize the SDK with the rails http context (must be done before calling validateRequestByIntegrationConfig) + QueueIt::HttpContextProvider::setHttpContext(QueueIt::RailsHttpContext.new(request)) + # Verify if the user has been through the queue validationResult = QueueIt::KnownUser.validateRequestByIntegrationConfig( - requestUrlWithoutToken, - queueitToken, - configJson, - customerId, - secretKey, - request) + requestUrlWithoutToken, + queueitToken, + configJson, + customerId, + secretKey) if(validationResult.doRedirect) #Adding no cache headers to prevent browsers to cache requests @@ -57,21 +59,23 @@ class ResourceController < ApplicationController response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" #end - + if(!validationResult.isAjaxResult) - # Send the user to the queue - either becuase hash was missing or becuase is was invalid - redirect_to validationResult.redirectUrl + # Send the user to the queue - either becuase hash was missing or becuase is was invalid + redirect_to validationResult.redirectUrl else - head :ok - response.headers[validationResult.getAjaxQueueRedirectHeaderKey()] = validationResult.getAjaxRedirectUrl() - end + head :ok + ajaxQueueRedirectHeaderName = validationResult.getAjaxQueueRedirectHeaderKey() + response.headers[ajaxQueueRedirectHeaderName] = validationResult.getAjaxRedirectUrl() + response.headers["Access-Control-Expose-Headers"] = ajaxQueueRedirectHeaderName + end else # Request can continue, we remove queueittoken from url to avoid sharing of user specific token - if(requestUrl != requestUrlWithoutToken && validationResult.actionType == "Queue") + if(requestUrl != requestUrlWithoutToken && validationResult.actionType == "Queue") redirect_to requestUrlWithoutToken - end + end end - + rescue StandardError => stdErr # There was an error validating the request # Use your own logging framework to log the error @@ -93,7 +97,7 @@ The following is an example of how to specify the configuration in code: class ResourceController < ApplicationController def index begin - + customerId = "" # Your Queue-it customer ID secretKey = "" # Your 72 char secret key as specified in Go Queue-it self-service platform eventConfig = QueueIt::QueueEventConfig.new @@ -104,41 +108,46 @@ class ResourceController < ApplicationController eventConfig.extendCookieValidity = true # Should the Queue-it session cookie validity time be extended each time the validation runs? # eventConfig.culture = "da-DK" # Optional - Culture of the queue layout in the format specified here: https:#msdn.microsoft.com/en-us/library/ee825488(v=cs.20).aspx. If unspecified then settings from Event will be used. # eventConfig.layoutName = "NameOfYourCustomLayout" # Optional - Name of the queue layout. If unspecified then settings from Event will be used. - + requestUrl = request.original_url queueitToken = request.query_parameters[QueueIt::KnownUser::QUEUEIT_TOKEN_KEY.to_sym] - + + # Initialize the SDK with the rails http context (must be done before calling validateRequestByIntegrationConfig) + QueueIt::HttpContextProvider::setHttpContext(QueueIt::RailsHttpContext.new(request)) + # Verify if the user has been through the queue validationResult = QueueIt::KnownUser.resolveQueueRequestByLocalConfig( - requestUrl, - queueitToken, - eventConfig, - customerId, - secretKey, - request) - + requestUrl, + queueitToken, + eventConfig, + customerId, + secretKey) + if(validationResult.doRedirect) #Adding no cache headers to prevent browsers to cache requests response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate, max-age=0" response.headers["Pragma"] = "no-cache" response.headers["Expires"] = "Fri, 01 Jan 1990 00:00:00 GMT" #end - if(!validationResult.isAjaxResult) - # Send the user to the queue - either becuase hash was missing or becuase is was invalid - redirect_to validationResult.redirectUrl + if(!validationResult.isAjaxResult) + # Send the user to the queue - either becuase hash was missing or becuase is was invalid + redirect_to validationResult.redirectUrl else - head :ok - response.headers[validationResult.getAjaxQueueRedirectHeaderKey()] = validationResult.getAjaxRedirectUrl() + head :ok + ajaxQueueRedirectHeaderName = validationResult.getAjaxQueueRedirectHeaderKey() + response.headers[ajaxQueueRedirectHeaderName] = validationResult.getAjaxRedirectUrl() + response.headers["Access-Control-Expose-Headers"] = ajaxQueueRedirectHeaderName end else - # Request can continue - we remove queueittoken form querystring parameter to avoid sharing of user specific token - pattern = Regexp.new("([\\?&])(" + QueueIt::KnownUser::QUEUEIT_TOKEN_KEY + "=[^&]*)", Regexp::IGNORECASE) - requestUrlWithoutToken = requestUrl.gsub(pattern, '') - - if(requestUrl != requestUrlWithoutToken && validationResult.actionType == "Queue") - redirect_to requestUrlWithoutToken - end + # Request can continue - we remove queueittoken form querystring parameter to avoid sharing of user specific token + pattern = Regexp.new("([\\?&])(" + QueueIt::KnownUser::QUEUEIT_TOKEN_KEY + "=[^&]*)", Regexp::IGNORECASE) + requestUrlWithoutToken = requestUrl.gsub(pattern, '') + + if(requestUrl != requestUrlWithoutToken && validationResult.actionType == "Queue") + redirect_to requestUrlWithoutToken + end end + rescue StandardError => stdErr # There was an error validating the request # Use your own logging framework to log the error @@ -148,3 +157,32 @@ class ResourceController < ApplicationController end end ``` + +## Advanced Features +### Request body trigger + +The connector supports triggering on request body content. An example could be a POST call with specific item ID where you want end-users to queue up for. +For this to work, you will need to contact Queue-it support or enable request body triggers in your integration settings in your GO Queue-it platform account. +Once enabled you will need to update your integration so request body is available for the connector. +You need to create a custom RailsHttpContext similar to this one (make sure to inherit from `QueueIt::RailsHttpContext`): + +```ruby +class RailsHttpContextWithRequestBody < QueueIt::RailsHttpContext + @request + + def initialize(request) + super + @request = request + end + + def requestBodyAsString + return @request.raw_post + end +end +``` + +Then, on each request, before calling the any of the SDK methods, you should initialize the SDK with your custom RailsHttpContext implementation, instead of the RailsHttpContext: + +```ruby +QueueIt::HttpContextProvider::setHttpContext(RailsHttpContextWithRequestBody.new(request)) +``` \ No newline at end of file diff --git a/lib/queueit_knownuserv3.rb b/lib/queueit_knownuserv3.rb index 101d791..80b412f 100644 --- a/lib/queueit_knownuserv3.rb +++ b/lib/queueit_knownuserv3.rb @@ -1,3 +1,4 @@ +require_relative "queueit_knownuserv3/httpcontext_provider" require_relative "queueit_knownuserv3/known_user" require_relative "queueit_knownuserv3/models" require_relative "queueit_knownuserv3/connector_diagnostics" diff --git a/lib/queueit_knownuserv3/httpcontext_provider.rb b/lib/queueit_knownuserv3/httpcontext_provider.rb new file mode 100644 index 0000000..01c1f29 --- /dev/null +++ b/lib/queueit_knownuserv3/httpcontext_provider.rb @@ -0,0 +1,93 @@ +module QueueIt + class IHttpContext + + def userAgent + raise 'userAgent not implemented' + end + + def headers + raise 'headers not implemented' + end + + def url + raise 'url not implemented' + end + + def userHostAddress + raise 'userHostAddress not implemented' + end + + def cookieManager + raise 'cookieManager not implemented' + end + + def requestBodyAsString + raise 'requestBodyAsString not implemented' + end + + end + + class RailsHttpContext < IHttpContext + @request + + def initialize(request) + @request = request + end + + def userAgent + return @request.user_agent + end + + def headers + return @request.headers + end + + def url + return @request.env["rack.url_scheme"] + "://" + @request.env["HTTP_HOST"] + @request.original_fullpath + end + + def userHostAddress + return @request.remote_ip + end + + def cookieManager + cookieManager = CookieManager.new(@request.cookie_jar) + return cookieManager + end + + def requestBodyAsString + return '' + end + + end + + # Used to initialize SDK for each request + class SDKInitializer + + def self.setHttpContext(httpContext) + if (httpContext.class < IHttpContext) + HttpContextProvider.setHttpContext(httpContext) + else + raise "httpContext must be a subclass of IHttpContext (e.g. MyHttpContext < IHttpContext)" + end + end + + end + + class HttpContextProvider + @@httpContext + + def self.httpContext + if (defined?(@@httpContext)) + return @@httpContext + else + raise "Please initialize the SDK using SDKInitializer.setHttpContext(httpContext) method" + end + end + + def self.setHttpContext(httpContext) + @@httpContext = httpContext + end + + end +end diff --git a/lib/queueit_knownuserv3/integration_config_helpers.rb b/lib/queueit_knownuserv3/integration_config_helpers.rb index ddff909..76258d4 100644 --- a/lib/queueit_knownuserv3/integration_config_helpers.rb +++ b/lib/queueit_knownuserv3/integration_config_helpers.rb @@ -2,19 +2,19 @@ module QueueIt class IntegrationEvaluator - def getMatchedIntegrationConfig(customerIntegration, currentPageUrl, request) + def getMatchedIntegrationConfig(customerIntegration, currentPageUrl, httpContext) if (!customerIntegration.kind_of?(Hash) || !customerIntegration.key?("Integrations") || !customerIntegration["Integrations"].kind_of?(Array)) return nil; end customerIntegration["Integrations"].each do |integrationConfig| next if !integrationConfig.kind_of?(Hash) || !integrationConfig.key?("Triggers") || !integrationConfig["Triggers"].kind_of?(Array) - + integrationConfig["Triggers"].each do |trigger| if(!trigger.kind_of?(Hash)) return false end - if(evaluateTrigger(trigger, currentPageUrl, request)) + if(evaluateTrigger(trigger, currentPageUrl, httpContext)) return integrationConfig end end @@ -23,19 +23,19 @@ def getMatchedIntegrationConfig(customerIntegration, currentPageUrl, request) return nil end - def evaluateTrigger(trigger, currentPageUrl, request) + def evaluateTrigger(trigger, currentPageUrl, httpContext) if (!trigger.key?("LogicalOperator") || !trigger.key?("TriggerParts") || !trigger["TriggerParts"].kind_of?(Array)) return false; end - + if(trigger["LogicalOperator"].eql? "Or") trigger["TriggerParts"].each do |triggerPart| if(!triggerPart.kind_of?(Hash)) return false end - if(evaluateTriggerPart(triggerPart, currentPageUrl, request)) + if(evaluateTriggerPart(triggerPart, currentPageUrl, httpContext)) return true end end @@ -45,7 +45,7 @@ def evaluateTrigger(trigger, currentPageUrl, request) if(!triggerPart.kind_of?(Hash)) return false end - if(!evaluateTriggerPart(triggerPart, currentPageUrl, request)) + if(!evaluateTriggerPart(triggerPart, currentPageUrl, httpContext)) return false end end @@ -53,7 +53,7 @@ def evaluateTrigger(trigger, currentPageUrl, request) end end - def evaluateTriggerPart(triggerPart, currentPageUrl, request) + def evaluateTriggerPart(triggerPart, currentPageUrl, httpContext) if (!triggerPart.key?("ValidatorType")) return false end @@ -62,11 +62,13 @@ def evaluateTriggerPart(triggerPart, currentPageUrl, request) when "UrlValidator" return UrlValidatorHelper.evaluate(triggerPart, currentPageUrl) when "CookieValidator" - return CookieValidatorHelper.evaluate(triggerPart, request.cookie_jar) + return CookieValidatorHelper.evaluate(triggerPart, httpContext.cookieManager) when "UserAgentValidator" - return UserAgentValidatorHelper.evaluate(triggerPart, request.user_agent) + return UserAgentValidatorHelper.evaluate(triggerPart, httpContext.userAgent) when "HttpHeaderValidator" - return HttpHeaderValidatorHelper.evaluate(triggerPart, request.headers) + return HttpHeaderValidatorHelper.evaluate(triggerPart, httpContext.headers) + when "RequestBodyValidator" + return RequestBodyValidatorHelper.evaluate(triggerPart, httpContext.requestBodyAsString) else return false end @@ -75,28 +77,28 @@ def evaluateTriggerPart(triggerPart, currentPageUrl, request) class UrlValidatorHelper def self.evaluate(triggerPart, url) - if (triggerPart.nil? || + if (triggerPart.nil? || !triggerPart.key?("Operator") || !triggerPart.key?("IsNegative") || !triggerPart.key?("IsIgnoreCase") || !triggerPart.key?("UrlPart")) return false end - + urlPart = UrlValidatorHelper.getUrlPart(triggerPart["UrlPart"], url) return ComparisonOperatorHelper.evaluate( - triggerPart["Operator"], - triggerPart["IsNegative"], - triggerPart["IsIgnoreCase"], - urlPart, + triggerPart["Operator"], + triggerPart["IsNegative"], + triggerPart["IsIgnoreCase"], + urlPart, triggerPart["ValueToCompare"], triggerPart["ValuesToCompare"]) end def self.getUrlPart(urlPart, url) begin - urlParts = URI.parse(url) + urlParts = URI.parse(url) case urlPart when "PagePath" return urlParts.path @@ -114,7 +116,7 @@ def self.getUrlPart(urlPart, url) end class CookieValidatorHelper - def self.evaluate(triggerPart, cookieJar) + def self.evaluate(triggerPart, cookieManager) begin if (triggerPart.nil? || !triggerPart.key?("Operator") || @@ -124,20 +126,20 @@ def self.evaluate(triggerPart, cookieJar) return false end - if(cookieJar.nil?) + if(cookieManager.nil?) return false end - cookieName = triggerPart["CookieName"] + cookieName = triggerPart["CookieName"].to_sym cookieValue = '' - if(!cookieName.nil? && !cookieJar[cookieName.to_sym].nil?) - cookieValue = cookieJar[cookieName.to_sym] + if(!cookieName.nil? && !cookieManager.getCookie(cookieName).nil?) + cookieValue = cookieManager.getCookie(cookieName) end return ComparisonOperatorHelper.evaluate( - triggerPart["Operator"], - triggerPart["IsNegative"], - triggerPart["IsIgnoreCase"], - cookieValue, + triggerPart["Operator"], + triggerPart["IsNegative"], + triggerPart["IsIgnoreCase"], + cookieValue, triggerPart["ValueToCompare"], triggerPart["ValuesToCompare"]) rescue @@ -155,12 +157,12 @@ def self.evaluate(triggerPart, userAgent) !triggerPart.key?("IsIgnoreCase")) return false end - + return ComparisonOperatorHelper.evaluate( - triggerPart["Operator"], - triggerPart["IsNegative"], - triggerPart["IsIgnoreCase"], - userAgent, + triggerPart["Operator"], + triggerPart["IsNegative"], + triggerPart["IsIgnoreCase"], + userAgent, triggerPart["ValueToCompare"], triggerPart["ValuesToCompare"]) end @@ -170,7 +172,7 @@ def self.evaluate(triggerPart, userAgent) class HttpHeaderValidatorHelper def self.evaluate(triggerPart, headers) begin - if (triggerPart.nil? || + if (triggerPart.nil? || !triggerPart.key?("Operator") || !triggerPart.key?("IsNegative") || !triggerPart.key?("IsIgnoreCase") @@ -180,10 +182,33 @@ def self.evaluate(triggerPart, headers) headerValue = headers[triggerPart['HttpHeaderName']] return ComparisonOperatorHelper.evaluate( - triggerPart["Operator"], - triggerPart["IsNegative"], - triggerPart["IsIgnoreCase"], - headerValue, + triggerPart["Operator"], + triggerPart["IsNegative"], + triggerPart["IsIgnoreCase"], + headerValue, + triggerPart["ValueToCompare"], + triggerPart["ValuesToCompare"]) + rescue + return false + end + end + end + + class RequestBodyValidatorHelper + def self.evaluate(triggerPart, bodyValue) + begin + if (triggerPart.nil? || + !triggerPart.key?("Operator") || + !triggerPart.key?("IsNegative") || + !triggerPart.key?("IsIgnoreCase")) + return false + end + + return ComparisonOperatorHelper.evaluate( + triggerPart["Operator"], + triggerPart["IsNegative"], + triggerPart["IsIgnoreCase"], + bodyValue, triggerPart["ValueToCompare"], triggerPart["ValuesToCompare"]) rescue @@ -197,19 +222,19 @@ def self.evaluate(opt, isNegative, ignoreCase, value, valueToCompare, valuesToCo if (value.nil?) value = '' end - - if (valueToCompare.nil?) + + if (valueToCompare.nil?) valueToCompare = '' end - + if (valuesToCompare.nil?) valuesToCompare = [] end - case opt + case opt when "Equals" return ComparisonOperatorHelper.equals(value, valueToCompare, isNegative, ignoreCase) - when "Contains" + when "Contains" return ComparisonOperatorHelper.contains(value, valueToCompare, isNegative, ignoreCase) when "EqualsAny" return ComparisonOperatorHelper.equalsAny(value, valuesToCompare, isNegative, ignoreCase) diff --git a/lib/queueit_knownuserv3/known_user.rb b/lib/queueit_knownuserv3/known_user.rb index ce56f87..d5e58ec 100644 --- a/lib/queueit_knownuserv3/known_user.rb +++ b/lib/queueit_knownuserv3/known_user.rb @@ -2,31 +2,34 @@ require 'json' module QueueIt + class KnownUser QUEUEIT_TOKEN_KEY = "queueittoken" QUEUEIT_DEBUG_KEY = "queueitdebug" QUEUEIT_AJAX_HEADER_KEY = "x-queueit-ajaxpageurl" - - @@userInQueueService = nil - def self.getUserInQueueService(cookieJar) + + @@userInQueueService = nil + def self.getUserInQueueService() if (@@userInQueueService == nil) - return UserInQueueService.new(UserInQueueStateCookieRepository.new(CookieManager.new(cookieJar))) + return UserInQueueService.new(UserInQueueStateCookieRepository.new(HttpContextProvider.httpContext.cookieManager)) end - + return @@userInQueueService end private_class_method :getUserInQueueService - def self.isQueueAjaxCall(request) - return request.headers[QUEUEIT_AJAX_HEADER_KEY] != nil + def self.isQueueAjaxCall + headers = HttpContextProvider.httpContext.headers + return headers[QUEUEIT_AJAX_HEADER_KEY] != nil end private_class_method :isQueueAjaxCall - def self.generateTargetUrl(originalTargetUrl, request) - unless isQueueAjaxCall(request) + def self.generateTargetUrl(originalTargetUrl) + unless isQueueAjaxCall() return originalTargetUrl - end - return CGI::unescape(request.headers[QUEUEIT_AJAX_HEADER_KEY]) + end + headers = HttpContextProvider.httpContext.headers + return CGI::unescape(headers[QUEUEIT_AJAX_HEADER_KEY]) end private_class_method :generateTargetUrl @@ -39,103 +42,106 @@ def self.convertToInt(value) return converted end private_class_method :convertToInt - - def self.logMoreRequestDetails(debugEntries, request) + + def self.logMoreRequestDetails(debugEntries) + httpContext = HttpContextProvider.httpContext + headers = httpContext.headers + debugEntries["ServerUtcTime"] = Time.now.utc.iso8601 - debugEntries["RequestIP"] = request.remote_ip - debugEntries["RequestHttpHeader_Via"] = request.headers["via"] - debugEntries["RequestHttpHeader_Forwarded"] = request.headers["forwarded"] - debugEntries["RequestHttpHeader_XForwardedFor"] = request.headers["x-forwarded-for"] - debugEntries["RequestHttpHeader_XForwardedHost"] = request.headers["x-forwarded-host"] - debugEntries["RequestHttpHeader_XForwardedProto"] = request.headers["x-forwarded-proto"] + debugEntries["RequestIP"] = httpContext.userHostAddress + debugEntries["RequestHttpHeader_Via"] = headers["via"] + debugEntries["RequestHttpHeader_Forwarded"] = headers["forwarded"] + debugEntries["RequestHttpHeader_XForwardedFor"] = headers["x-forwarded-for"] + debugEntries["RequestHttpHeader_XForwardedHost"] = headers["x-forwarded-host"] + debugEntries["RequestHttpHeader_XForwardedProto"] = headers["x-forwarded-proto"] end private_class_method :logMoreRequestDetails - def self.setDebugCookie(debugEntries, cookieJar) + def self.setDebugCookie(debugEntries) if(debugEntries == nil || debugEntries.length == 0) return end - - cookieManager = CookieManager.new(cookieJar) + + cookieManager = HttpContextProvider.httpContext.cookieManager cookieValue = '' debugEntries.each do |entry| cookieValue << (entry[0].to_s + '=' + entry[1].to_s + '|') end - cookieValue = cookieValue.chop # remove trailing char - cookieManager.setCookie(QUEUEIT_DEBUG_KEY, cookieValue, nil, nil) + cookieValue = cookieValue.chop # remove trailing char + cookieManager.setCookie(QUEUEIT_DEBUG_KEY, cookieValue, nil, nil, false, false) end private_class_method :setDebugCookie - def self._resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, request, debugEntries, isDebug) - + def self._resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, debugEntries, isDebug) + if(isDebug) debugEntries["SdkVersion"] = UserInQueueService::SDK_VERSION debugEntries["Runtime"] = getRuntime() debugEntries["TargetUrl"] = targetUrl debugEntries["QueueitToken"] = queueitToken - debugEntries["OriginalUrl"] = getRealOriginalUrl(request) + debugEntries["OriginalUrl"] = getRealOriginalUrl() if(queueConfig == nil) debugEntries["QueueConfig"] = "NULL" else debugEntries["QueueConfig"] = queueConfig.toString() end - logMoreRequestDetails(debugEntries, request) + logMoreRequestDetails(debugEntries) end - + if(Utils.isNilOrEmpty(customerId)) raise KnownUserError, "customerId can not be nil or empty." end - + if(Utils.isNilOrEmpty(secretKey)) raise KnownUserError, "secretKey can not be nil or empty." end - + if(queueConfig == nil) raise KnownUserError, "queueConfig can not be nil." end - + if(Utils.isNilOrEmpty(queueConfig.eventId)) raise KnownUserError, "queueConfig.eventId can not be nil or empty." end - + if(Utils.isNilOrEmpty(queueConfig.queueDomain)) raise KnownUserError, "queueConfig.queueDomain can not be nil or empty." end - + minutes = convertToInt(queueConfig.cookieValidityMinute) if(minutes <= 0) - raise KnownUserError, "queueConfig.cookieValidityMinute should be integer greater than 0." + raise KnownUserError, "queueConfig.cookieValidityMinute should be integer greater than 0." end - + if(![true, false].include? queueConfig.extendCookieValidity) raise KnownUserError, "queueConfig.extendCookieValidity should be valid boolean." end - userInQueueService = getUserInQueueService(request.cookie_jar) + userInQueueService = getUserInQueueService() result = userInQueueService.validateQueueRequest(targetUrl, queueitToken, queueConfig, customerId, secretKey) - result.isAjaxResult = isQueueAjaxCall(request) - + result.isAjaxResult = isQueueAjaxCall() + return result end private_class_method :_resolveQueueRequestByLocalConfig - - def self._cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey, request, debugEntries, isDebug) - targetUrl = generateTargetUrl(targetUrl, request) + + def self._cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey, debugEntries, isDebug) + targetUrl = generateTargetUrl(targetUrl) if(isDebug) debugEntries["SdkVersion"] = UserInQueueService::SDK_VERSION debugEntries["Runtime"] = getRuntime() debugEntries["TargetUrl"] = targetUrl debugEntries["QueueitToken"] = queueitToken - debugEntries["OriginalUrl"] = getRealOriginalUrl(request) + debugEntries["OriginalUrl"] = getRealOriginalUrl() if(cancelConfig == nil) debugEntries["CancelConfig"] = "NULL" else debugEntries["CancelConfig"] = cancelConfig.toString() end - logMoreRequestDetails(debugEntries, request) + logMoreRequestDetails(debugEntries) end - + if(Utils.isNilOrEmpty(targetUrl)) raise KnownUserError, "targetUrl can not be nil or empty." end @@ -143,89 +149,89 @@ def self._cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, cust if(Utils.isNilOrEmpty(customerId)) raise KnownUserError, "customerId can not be nil or empty." end - + if(Utils.isNilOrEmpty(secretKey)) raise KnownUserError, "secretKey can not be nil or empty." end - + if(cancelConfig == nil) raise KnownUserError, "cancelConfig can not be nil." end - + if(Utils.isNilOrEmpty(cancelConfig.eventId)) raise KnownUserError, "cancelConfig.eventId can not be nil or empty." end - + if(Utils.isNilOrEmpty(cancelConfig.queueDomain)) raise KnownUserError, "cancelConfig.queueDomain can not be nil or empty." end - userInQueueService = getUserInQueueService(request.cookie_jar) + userInQueueService = getUserInQueueService() result = userInQueueService.validateCancelRequest(targetUrl, cancelConfig, customerId, secretKey) - result.isAjaxResult = isQueueAjaxCall(request) - + result.isAjaxResult = isQueueAjaxCall() + return result end private_class_method :_cancelRequestByLocalConfig - def self.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, secretKey, request) + def self.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) if(Utils.isNilOrEmpty(eventId)) raise KnownUserError, "eventId can not be nil or empty." end - + if(Utils.isNilOrEmpty(secretKey)) raise KnownUserError, "secretKey can not be nil or empty." end minutes = convertToInt(cookieValidityMinute) if(minutes <= 0) - raise KnownUserError, "cookieValidityMinute should be integer greater than 0." + raise KnownUserError, "cookieValidityMinute should be integer greater than 0." end - userInQueueService = getUserInQueueService(request.cookie_jar) - userInQueueService.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, secretKey) + userInQueueService = getUserInQueueService() + userInQueueService.extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) end - def self.resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, request) + def self.resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey) debugEntries = Hash.new connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken) - + if(connectorDiagnostics.hasError) return connectorDiagnostics.validationResult end begin - targetUrl = generateTargetUrl(targetUrl, request) - return _resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, request, debugEntries, connectorDiagnostics.isEnabled) + targetUrl = generateTargetUrl(targetUrl) + return _resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, debugEntries, connectorDiagnostics.isEnabled) rescue Exception => e if(connectorDiagnostics.isEnabled) debugEntries["Exception"] = e.message end raise e ensure - setDebugCookie(debugEntries, request.cookie_jar) + setDebugCookie(debugEntries) end end - def self.validateRequestByIntegrationConfig(currentUrlWithoutQueueITToken, queueitToken, integrationConfigJson, customerId, secretKey, request) - debugEntries = Hash.new + def self.validateRequestByIntegrationConfig(currentUrlWithoutQueueITToken, queueitToken, integrationConfigJson, customerId, secretKey) + debugEntries = Hash.new customerIntegration = Hash.new connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken) - + if(connectorDiagnostics.hasError) return connectorDiagnostics.validationResult end begin if(connectorDiagnostics.isEnabled) debugEntries["SdkVersion"] = UserInQueueService::SDK_VERSION - debugEntries["Runtime"] = getRuntime() + debugEntries["Runtime"] = getRuntime() debugEntries["PureUrl"] = currentUrlWithoutQueueITToken debugEntries["QueueitToken"] = queueitToken - debugEntries["OriginalUrl"] = getRealOriginalUrl(request) - logMoreRequestDetails(debugEntries, request) + debugEntries["OriginalUrl"] = getRealOriginalUrl() + logMoreRequestDetails(debugEntries) end customerIntegration = JSON.parse(integrationConfigJson) - + if(connectorDiagnostics.isEnabled) if(customerIntegration.length != 0 and customerIntegration["Version"] != nil) debugEntries["ConfigVersion"] = customerIntegration["Version"] @@ -243,7 +249,7 @@ def self.validateRequestByIntegrationConfig(currentUrlWithoutQueueITToken, queue end integrationEvaluator = IntegrationEvaluator.new - matchedConfig = integrationEvaluator.getMatchedIntegrationConfig(customerIntegration, currentUrlWithoutQueueITToken, request) + matchedConfig = integrationEvaluator.getMatchedIntegrationConfig(customerIntegration, currentUrlWithoutQueueITToken, HttpContextProvider.httpContext) if(connectorDiagnostics.isEnabled) if(matchedConfig == nil) @@ -256,22 +262,22 @@ def self.validateRequestByIntegrationConfig(currentUrlWithoutQueueITToken, queue if(matchedConfig == nil) return RequestValidationResult.new(nil, nil, nil, nil, nil, nil) end - + # unspecified or 'Queue' specified if(!matchedConfig.key?("ActionType") || Utils.isNilOrEmpty(matchedConfig["ActionType"]) || matchedConfig["ActionType"].eql?(ActionTypes::QUEUE)) - return handleQueueAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, - customerId, secretKey, matchedConfig, request, debugEntries, connectorDiagnostics.isEnabled) - + return handleQueueAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, + customerId, secretKey, matchedConfig, debugEntries, connectorDiagnostics.isEnabled) + elsif(matchedConfig["ActionType"].eql?(ActionTypes::CANCEL)) - return handleCancelAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, - customerId, secretKey, matchedConfig, request, debugEntries, connectorDiagnostics.isEnabled) - + return handleCancelAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, + customerId, secretKey, matchedConfig, debugEntries, connectorDiagnostics.isEnabled) + # for all unknown types default to 'Ignore' else - userInQueueService = getUserInQueueService(request.cookie_jar) + userInQueueService = getUserInQueueService() result = userInQueueService.getIgnoreActionResult(matchedConfig["Name"]) - result.isAjaxResult = isQueueAjaxCall(request) - + result.isAjaxResult = isQueueAjaxCall() + return result end rescue Exception => e @@ -280,68 +286,73 @@ def self.validateRequestByIntegrationConfig(currentUrlWithoutQueueITToken, queue end raise e ensure - setDebugCookie(debugEntries, request.cookie_jar) + setDebugCookie(debugEntries) end end - def self.handleQueueAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, customerId, secretKey, matchedConfig, request, debugEntries, isDebug) + def self.handleQueueAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, customerId, secretKey, matchedConfig, debugEntries, isDebug) queueConfig = QueueEventConfig.new queueConfig.eventId = matchedConfig["EventId"] - queueConfig.queueDomain = matchedConfig["QueueDomain"] queueConfig.layoutName = matchedConfig["LayoutName"] queueConfig.culture = matchedConfig["Culture"] - queueConfig.cookieDomain = matchedConfig["CookieDomain"] + queueConfig.queueDomain = matchedConfig["QueueDomain"] queueConfig.extendCookieValidity = matchedConfig["ExtendCookieValidity"] queueConfig.cookieValidityMinute = matchedConfig["CookieValidityMinute"] + queueConfig.cookieDomain = matchedConfig["CookieDomain"] + queueConfig.isCookieHttpOnly = matchedConfig["IsCookieHttpOnly"] || false + queueConfig.isCookieSecure = matchedConfig["IsCookieSecure"] || false queueConfig.version = customerIntegration["Version"] queueConfig.actionName = matchedConfig["Name"] case matchedConfig["RedirectLogic"] when "ForcedTargetUrl" - targetUrl = matchedConfig["ForcedTargetUrl"] + targetUrl = matchedConfig["ForcedTargetUrl"] when "EventTargetUrl" targetUrl = '' else - targetUrl = generateTargetUrl(currentUrlWithoutQueueITToken, request) + targetUrl = generateTargetUrl(currentUrlWithoutQueueITToken) end - return _resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, request, debugEntries, isDebug) + return _resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig, customerId, secretKey, debugEntries, isDebug) end - def self.handleCancelAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, customerId, secretKey, matchedConfig, request, debugEntries, isDebug) + def self.handleCancelAction(currentUrlWithoutQueueITToken, queueitToken, customerIntegration, customerId, secretKey, matchedConfig, debugEntries, isDebug) cancelConfig = CancelEventConfig.new cancelConfig.eventId = matchedConfig["EventId"] cancelConfig.queueDomain = matchedConfig["QueueDomain"] cancelConfig.cookieDomain = matchedConfig["CookieDomain"] + cancelConfig.isCookieHttpOnly = matchedConfig["IsCookieHttpOnly"] || false + cancelConfig.isCookieSecure = matchedConfig["IsCookieSecure"] || false cancelConfig.version = customerIntegration["Version"] cancelConfig.actionName = matchedConfig["Name"] - - return _cancelRequestByLocalConfig(currentUrlWithoutQueueITToken, queueitToken, cancelConfig, customerId, secretKey, request, debugEntries, isDebug) + + return _cancelRequestByLocalConfig(currentUrlWithoutQueueITToken, queueitToken, cancelConfig, customerId, secretKey, debugEntries, isDebug) end - def self.cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey, request) + def self.cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey) debugEntries = Hash.new connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken) - + if(connectorDiagnostics.hasError) return connectorDiagnostics.validationResult end begin - return _cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey, request, debugEntries, connectorDiagnostics.isEnabled) + return _cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig, customerId, secretKey, debugEntries, connectorDiagnostics.isEnabled) rescue Exception => e if(connectorDiagnostics.isEnabled) debugEntries["Exception"] = e.message end raise e ensure - setDebugCookie(debugEntries, request.cookie_jar) + setDebugCookie(debugEntries) end end - def self.getRealOriginalUrl(request) - # RoR could modify request.original_url if request contains x-forwarded-host/proto http headers. + def self.getRealOriginalUrl() + return HttpContextProvider.httpContext.url + # RoR could modify request.original_url if request contains x-forwarded-host/proto http headers. # Therefore we need this method to be able to access the 'real' original url. - return request.env["rack.url_scheme"] + "://" + request.env["HTTP_HOST"] + request.original_fullpath + #return request.env["rack.url_scheme"] + "://" + request.env["HTTP_HOST"] + request.original_fullpath end def self.getRuntime() @@ -355,7 +366,7 @@ class CookieManager def initialize(cookieJar) @cookies = cookieJar end - + def getCookie(name) key = name.to_sym if(!Utils.isNilOrEmpty(@cookies[key])) @@ -364,9 +375,9 @@ def getCookie(name) return nil end - def setCookie(name, value, expire, domain) + def setCookie(name, value, expire, domain, isHttpOnly, isSecure) key = name.to_sym - noDomain = Utils.isNilOrEmpty(domain) + noDomain = Utils.isNilOrEmpty(domain) deleteCookie = Utils.isNilOrEmpty(value) noExpire = Utils.isNilOrEmpty(expire) @@ -375,22 +386,22 @@ def setCookie(name, value, expire, domain) @cookies.delete(key) else if(noExpire) - @cookies[key] = { :value => value, :httponly => false } + @cookies[key] = { :value => value, :httponly => isHttpOnly, :secure => isSecure } else - @cookies[key] = { :value => value, :expires => expire, :httponly => false } + @cookies[key] = { :value => value, :expires => expire, :httponly => isHttpOnly, :secure => isSecure } end - end + end else if(deleteCookie) - @cookies.delete(key, :domain => domain) + @cookies.delete(key, :domain => domain) else if(noExpire) - @cookies[key] = { :value => value, :domain => domain, :httponly => false } + @cookies[key] = { :value => value, :domain => domain, :httponly => isHttpOnly, :secure => isSecure } else - @cookies[key] = { :value => value, :expires => expire, :domain => domain, :httponly => false } + @cookies[key] = { :value => value, :expires => expire, :domain => domain, :httponly => isHttpOnly, :secure => isSecure } end - end - end + end + end end end end diff --git a/lib/queueit_knownuserv3/models.rb b/lib/queueit_knownuserv3/models.rb index ae64d8e..e7e552b 100644 --- a/lib/queueit_knownuserv3/models.rb +++ b/lib/queueit_knownuserv3/models.rb @@ -19,17 +19,29 @@ def self.urlDecode(value) end end - class CancelEventConfig + class QueueEventConfig attr_accessor :eventId + attr_accessor :layoutName + attr_accessor :culture attr_accessor :queueDomain + attr_accessor :extendCookieValidity + attr_accessor :cookieValidityMinute attr_accessor :cookieDomain + attr_accessor :isCookieHttpOnly + attr_accessor :isCookieSecure attr_accessor :version attr_accessor :actionName def initialize @eventId = nil + @layoutName = nil + @culture = nil @queueDomain = nil + @extendCookieValidity = nil + @cookieValidityMinute = nil @cookieDomain = nil + @isCookieHttpOnly = false + @isCookieSecure = false @version = nil @actionName = "unspecified" end @@ -38,30 +50,32 @@ def toString return "EventId:" + Utils.toString(eventId) + "&Version:" + Utils.toString(version) + "&QueueDomain:" + Utils.toString(queueDomain) + - "&CookieDomain:" + Utils.toString(cookieDomain) + + "&CookieDomain:" + Utils.toString(cookieDomain) + + "&IsCookieHttpOnly:" + Utils.toString(isCookieHttpOnly) + + "&IsCookieSecure:" + Utils.toString(isCookieSecure) + + "&ExtendCookieValidity:" + Utils.toString(extendCookieValidity) + + "&CookieValidityMinute:" + Utils.toString(cookieValidityMinute) + + "&LayoutName:" + Utils.toString(layoutName) + + "&Culture:" + Utils.toString(culture) + "&ActionName:" + Utils.toString(actionName) end end - class QueueEventConfig - attr_accessor :eventId - attr_accessor :layoutName - attr_accessor :culture + class CancelEventConfig + attr_accessor :eventId attr_accessor :queueDomain - attr_accessor :extendCookieValidity - attr_accessor :cookieValidityMinute attr_accessor :cookieDomain + attr_accessor :isCookieHttpOnly + attr_accessor :isCookieSecure attr_accessor :version attr_accessor :actionName def initialize @eventId = nil - @layoutName = nil - @culture = nil @queueDomain = nil - @extendCookieValidity = nil - @cookieValidityMinute = nil @cookieDomain = nil + @isCookieHttpOnly = false + @isCookieSecure = false @version = nil @actionName = "unspecified" end @@ -70,11 +84,9 @@ def toString return "EventId:" + Utils.toString(eventId) + "&Version:" + Utils.toString(version) + "&QueueDomain:" + Utils.toString(queueDomain) + - "&CookieDomain:" + Utils.toString(cookieDomain) + - "&ExtendCookieValidity:" + Utils.toString(extendCookieValidity) + - "&CookieValidityMinute:" + Utils.toString(cookieValidityMinute) + - "&LayoutName:" + Utils.toString(layoutName) + - "&Culture:" + Utils.toString(culture) + + "&CookieDomain:" + Utils.toString(cookieDomain) + + "&IsCookieHttpOnly:" + Utils.toString(isCookieHttpOnly) + + "&IsCookieSecure:" + Utils.toString(isCookieSecure) + "&ActionName:" + Utils.toString(actionName) end end diff --git a/lib/queueit_knownuserv3/user_in_queue_service.rb b/lib/queueit_knownuserv3/user_in_queue_service.rb index a2b19a6..ec2e3a8 100644 --- a/lib/queueit_knownuserv3/user_in_queue_service.rb +++ b/lib/queueit_knownuserv3/user_in_queue_service.rb @@ -3,7 +3,7 @@ module QueueIt class UserInQueueService - SDK_VERSION_NO = "3.6.1" + SDK_VERSION_NO = "3.7.0" SDK_VERSION = "v3-ruby-" + SDK_VERSION_NO def initialize(userInQueueStateRepository) @@ -19,6 +19,8 @@ def validateQueueRequest(targetUrl, queueitToken, config, customerId, secretKey) state.queueId, nil, !Utils::isNilOrEmpty(config.cookieDomain) ? config.cookieDomain : '', + config.isCookieHttpOnly, + config.isCookieSecure, state.redirectType, secretKey) end @@ -44,7 +46,7 @@ def validateQueueRequest(targetUrl, queueitToken, config, customerId, secretKey) end if (state.isFound && !isTokenValid) - @userInQueueStateRepository.cancelQueueCookie(config.eventId, config.cookieDomain); + @userInQueueStateRepository.cancelQueueCookie(config.eventId, config.cookieDomain, config.isCookieHttpOnly, config.isCookieSecure); end return requestValidationResult; @@ -53,12 +55,19 @@ def validateQueueRequest(targetUrl, queueitToken, config, customerId, secretKey) def validateCancelRequest(targetUrl, cancelConfig, customerId, secretKey) state = @userInQueueStateRepository.getState(cancelConfig.eventId, -1, secretKey, false) if (state.isValid) - @userInQueueStateRepository.cancelQueueCookie(cancelConfig.eventId, cancelConfig.cookieDomain) + @userInQueueStateRepository.cancelQueueCookie(cancelConfig.eventId, cancelConfig.cookieDomain, cancelConfig.isCookieHttpOnly, cancelConfig.isCookieSecure) + query = getQueryString(customerId, cancelConfig.eventId, cancelConfig.version, cancelConfig.actionName, nil, nil) + - (!Utils::isNilOrEmpty(targetUrl) ? ("&r=" + Utils.urlEncode(targetUrl)) : "" ) - uriPath = "cancel/" + customerId + "/" + cancelConfig.eventId + "/" - + (!Utils::isNilOrEmpty(targetUrl) ? ("&r=" + Utils.urlEncode(targetUrl)) : "" ) + + uriPath = "cancel/" + customerId + "/" + cancelConfig.eventId + + if(!Utils::isNilOrEmpty(state.queueId)) + uriPath = uriPath + "/" + state.queueId + end + redirectUrl = generateRedirectUrl(cancelConfig.queueDomain, uriPath, query) + return RequestValidationResult.new(ActionTypes::CANCEL, cancelConfig.eventId, state.queueId, redirectUrl, state.redirectType, cancelConfig.actionName) else return RequestValidationResult.new(ActionTypes::CANCEL, cancelConfig.eventId, nil, nil, nil, cancelConfig.actionName) @@ -71,6 +80,8 @@ def getValidTokenResult(config, queueParams, secretKey) queueParams.queueId, queueParams.cookieValidityMinutes, !Utils::isNilOrEmpty(config.cookieDomain) ? config.cookieDomain : '', + config.isCookieHttpOnly, + config.isCookieSecure, queueParams.redirectType, secretKey) @@ -121,8 +132,8 @@ def generateRedirectUrl(queueDomain, uriPath, query) return "https://" + queueDomain + uriPath + "?" + query end - def extendQueueCookie(eventId, cookieValidityMinutes, cookieDomain, secretKey) - @userInQueueStateRepository.reissueQueueCookie(eventId, cookieValidityMinutes, cookieDomain, secretKey) + def extendQueueCookie(eventId, cookieValidityMinutes, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) + @userInQueueStateRepository.reissueQueueCookie(eventId, cookieValidityMinutes, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) end def getIgnoreActionResult(actionName) diff --git a/lib/queueit_knownuserv3/user_in_queue_state_cookie_repository.rb b/lib/queueit_knownuserv3/user_in_queue_state_cookie_repository.rb index 27336b8..0c9c5e8 100644 --- a/lib/queueit_knownuserv3/user_in_queue_state_cookie_repository.rb +++ b/lib/queueit_knownuserv3/user_in_queue_state_cookie_repository.rb @@ -1,45 +1,45 @@ -require 'openssl' +require 'openssl' require 'base64' require 'date' module QueueIt - class UserInQueueStateCookieRepository + class UserInQueueStateCookieRepository QUEUEIT_DATA_KEY = "QueueITAccepted-SDFrts345E-V3" - + def initialize(cookieManager) @cookieManager = cookieManager end - def cancelQueueCookie(eventId, cookieDomain) + def cancelQueueCookie(eventId, cookieDomain, isCookieHttpOnly, isCookieSecure) cookieKey = self.class.getCookieKey(eventId) - @cookieManager.setCookie(cookieKey, nil, -1, cookieDomain) + @cookieManager.setCookie(cookieKey, nil, -1, cookieDomain, isCookieHttpOnly, isCookieSecure) end - def store(eventId, queueId, fixedCookieValidityMinutes, cookieDomain, redirectType, secretKey) + def store(eventId, queueId, fixedCookieValidityMinutes, cookieDomain, isCookieHttpOnly, isCookieSecure, redirectType, secretKey) cookieKey = self.class.getCookieKey(eventId) cookieValue = createCookieValue(eventId, queueId, Utils.toString(fixedCookieValidityMinutes), redirectType, secretKey) - @cookieManager.setCookie(cookieKey, cookieValue, Time.now + (24*60*60), cookieDomain) + @cookieManager.setCookie(cookieKey, cookieValue, Time.now + (24*60*60), cookieDomain, isCookieHttpOnly, isCookieSecure) end def self.getCookieKey(eventId) return QUEUEIT_DATA_KEY + '_' + eventId end - def createCookieValue(eventId, queueId, fixedCookieValidityMinutes, redirectType, secretKey) + def createCookieValue(eventId, queueId, fixedCookieValidityMinutes, redirectType, secretKey) issueTime = Time.now.getutc.tv_sec.to_s hashValue = generateHash(eventId, queueId, fixedCookieValidityMinutes, redirectType, issueTime, secretKey) - + fixedCookieValidityMinutesPart = "" if(!Utils.isNilOrEmpty(fixedCookieValidityMinutes)) fixedCookieValidityMinutesPart = "&FixedValidityMins=" + fixedCookieValidityMinutes end - - cookieValue = "EventId=" + eventId + "&QueueId=" + queueId + fixedCookieValidityMinutesPart + "&RedirectType=" + redirectType + "&IssueTime=" + issueTime + "&Hash=" + hashValue + + cookieValue = "EventId=" + eventId + "&QueueId=" + queueId + fixedCookieValidityMinutesPart + "&RedirectType=" + redirectType + "&IssueTime=" + issueTime + "&Hash=" + hashValue return cookieValue end - - def getCookieNameValueMap(cookieValue) - result = Hash.new + + def getCookieNameValueMap(cookieValue) + result = Hash.new cookieNameValues = cookieValue.split("&") cookieNameValues.each do |item| arr = item.split("=") @@ -54,98 +54,98 @@ def generateHash(eventId, queueId, fixedCookieValidityMinutes, redirectType, iss OpenSSL::HMAC.hexdigest('sha256', secretKey, eventId + queueId + fixedCookieValidityMinutes + redirectType + issueTime) end - def isCookieValid(secretKey, cookieNameValueMap, eventId, cookieValidityMinutes, validateTime) + def isCookieValid(secretKey, cookieNameValueMap, eventId, cookieValidityMinutes, validateTime) begin - if (!cookieNameValueMap.key?("EventId")) + if (!cookieNameValueMap.key?("EventId")) return false end - - if (!cookieNameValueMap.key?("QueueId")) + + if (!cookieNameValueMap.key?("QueueId")) return false end - - if (!cookieNameValueMap.key?("RedirectType")) + + if (!cookieNameValueMap.key?("RedirectType")) return false end - - if (!cookieNameValueMap.key?("IssueTime")) + + if (!cookieNameValueMap.key?("IssueTime")) return false end - - if (!cookieNameValueMap.key?("Hash")) + + if (!cookieNameValueMap.key?("Hash")) return false end fixedCookieValidityMinutes = "" - if (cookieNameValueMap.key?("FixedValidityMins")) + if (cookieNameValueMap.key?("FixedValidityMins")) fixedCookieValidityMinutes = cookieNameValueMap["FixedValidityMins"] end - + hashValue = generateHash( - cookieNameValueMap["EventId"], + cookieNameValueMap["EventId"], cookieNameValueMap["QueueId"], fixedCookieValidityMinutes, cookieNameValueMap["RedirectType"], cookieNameValueMap["IssueTime"], secretKey) - - if (hashValue != cookieNameValueMap["Hash"]) + + if (hashValue != cookieNameValueMap["Hash"]) return false - end - - if (eventId.upcase != cookieNameValueMap["EventId"].upcase) + end + + if (eventId.upcase != cookieNameValueMap["EventId"].upcase) return false end - + if(validateTime) validity = cookieValidityMinutes if(!Utils.isNilOrEmpty(fixedCookieValidityMinutes)) validity = fixedCookieValidityMinutes.to_i end - + expirationTime = cookieNameValueMap["IssueTime"].to_i + (validity*60) if(expirationTime < Time.now.getutc.tv_sec) return false end - end - - return true + end + + return true rescue return false end end - def reissueQueueCookie(eventId, cookieValidityMinutes, cookieDomain, secretKey) + def reissueQueueCookie(eventId, cookieValidityMinutes, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) cookieKey = self.class.getCookieKey(eventId) cookieValue = @cookieManager.getCookie(cookieKey) - if (cookieValue.nil?) + if (cookieValue.nil?) return end - + cookieNameValueMap = getCookieNameValueMap(cookieValue) - if (!isCookieValid(secretKey, cookieNameValueMap, eventId, cookieValidityMinutes, true)) - return + if (!isCookieValid(secretKey, cookieNameValueMap, eventId, cookieValidityMinutes, true)) + return end fixedCookieValidityMinutes = "" - if (cookieNameValueMap.key?("FixedValidityMins")) + if (cookieNameValueMap.key?("FixedValidityMins")) fixedCookieValidityMinutes = cookieNameValueMap["FixedValidityMins"] end cookieValue = createCookieValue( - eventId, - cookieNameValueMap["QueueId"], - fixedCookieValidityMinutes, - cookieNameValueMap["RedirectType"], + eventId, + cookieNameValueMap["QueueId"], + fixedCookieValidityMinutes, + cookieNameValueMap["RedirectType"], secretKey) - - @cookieManager.setCookie(cookieKey, cookieValue, Time.now + (24*60*60), cookieDomain) + + @cookieManager.setCookie(cookieKey, cookieValue, Time.now + (24*60*60), cookieDomain, isCookieHttpOnly, isCookieSecure) end - def getState(eventId, cookieValidityMinutes, secretKey, validateTime) + def getState(eventId, cookieValidityMinutes, secretKey, validateTime) begin cookieKey = self.class.getCookieKey(eventId) - if (@cookieManager.getCookie(cookieKey).nil?) + if (@cookieManager.getCookie(cookieKey).nil?) return StateInfo.new(false, false, nil, nil, nil) end cookieNameValueMap = getCookieNameValueMap(@cookieManager.getCookie(cookieKey)) @@ -154,14 +154,14 @@ def getState(eventId, cookieValidityMinutes, secretKey, validateTime) end fixedCookieValidityMinutes = nil - if (cookieNameValueMap.key?("FixedValidityMins")) + if (cookieNameValueMap.key?("FixedValidityMins")) fixedCookieValidityMinutes = cookieNameValueMap["FixedValidityMins"].to_i end return StateInfo.new( true, - true, - cookieNameValueMap["QueueId"], + true, + cookieNameValueMap["QueueId"], fixedCookieValidityMinutes, cookieNameValueMap["RedirectType"]) rescue @@ -170,14 +170,14 @@ def getState(eventId, cookieValidityMinutes, secretKey, validateTime) end end - class StateInfo + class StateInfo attr_reader :isFound attr_reader :isValid attr_reader :queueId attr_reader :fixedCookieValidityMinutes attr_reader :redirectType - def initialize(isFound, isValid, queueId, fixedCookieValidityMinutes, redirectType) + def initialize(isFound, isValid, queueId, fixedCookieValidityMinutes, redirectType) @isFound = isFound @isValid = isValid @queueId = queueId diff --git a/test/queueit_knownuserv3/test_integration_config_helpers.rb b/test/queueit_knownuserv3/test_integration_config_helpers.rb index cdfd75d..4afa09e 100644 --- a/test/queueit_knownuserv3/test_integration_config_helpers.rb +++ b/test/queueit_knownuserv3/test_integration_config_helpers.rb @@ -2,20 +2,15 @@ require_relative '../../lib/queueit_knownuserv3' module QueueIt - class HttpRequestMock - attr_accessor :user_agent - attr_accessor :original_url - attr_accessor :cookie_jar - end - + class TestIntegrationEvaluator < Test::Unit::TestCase def test_getMatchedIntegrationConfig_oneTrigger_and_notMatched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -43,21 +38,21 @@ def test_getMatchedIntegrationConfig_oneTrigger_and_notMatched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, HttpRequestMock.new) + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, HttpContextMock.new) assert(matchedConfig == nil); end def test_getMatchedIntegrationConfig_oneTrigger_and_matched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -85,23 +80,28 @@ def test_getMatchedIntegrationConfig_oneTrigger_and_matched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) assert( matchedConfig["Name"].eql? "integration1" ); end def test_getMatchedIntegrationConfig_oneTrigger_and_notmatched_UserAgent - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -136,24 +136,29 @@ def test_getMatchedIntegrationConfig_oneTrigger_and_notmatched_UserAgent } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.user_agent = "bot.html google.com googlebot test" - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + contextMock.userAgent = "bot.html google.com googlebot test" + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) assert( matchedConfig == nil); end def test_getMatchedIntegrationConfig_oneTrigger_or_notMatched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "Or", @@ -181,23 +186,28 @@ def test_getMatchedIntegrationConfig_oneTrigger_or_notMatched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) assert( matchedConfig == nil ); end def test_getMatchedIntegrationConfig_oneTrigger_or_matched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "Or", @@ -225,23 +235,28 @@ def test_getMatchedIntegrationConfig_oneTrigger_or_matched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) assert( matchedConfig["Name"].eql? "integration1" ); end def test_getMatchedIntegrationConfig_twoTriggers_matched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -283,23 +298,28 @@ def test_getMatchedIntegrationConfig_twoTriggers_matched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) - assert( matchedConfig["Name"].eql? "integration1" ); + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) + assert( matchedConfig["Name"].eql? "integration1" ); end def test_getMatchedIntegrationConfig_threeIntegrationsInOrder_secondMatched - integrationConfig = - { - "Integrations" => + integrationConfig = + { + "Integrations" => [ { "Name" => "integration0", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -319,7 +339,7 @@ def test_getMatchedIntegrationConfig_threeIntegrationsInOrder_secondMatched }, { "Name" => "integration1", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -339,7 +359,7 @@ def test_getMatchedIntegrationConfig_threeIntegrationsInOrder_secondMatched }, { "Name" => "integration2", - "Triggers" => + "Triggers" => [ { "LogicalOperator" => "And", @@ -359,103 +379,108 @@ def test_getMatchedIntegrationConfig_threeIntegrationsInOrder_secondMatched } ] } - + url = "http://test.testdomain.com:8080/test?q=2"; - requestMock = HttpRequestMock.new - requestMock.cookie_jar = { :c2 => "ddd", :c1 => "Value1" } + contextMock = HttpContextMock.new + + cookieManager = CookieManagerMock.new + cookieManager.cookieList[:c1] = { "value" => "Value1" } + cookieManager.cookieList[:c2] = { "value" => "ddd" } + contextMock.cookieManager = cookieManager + testObject = IntegrationEvaluator.new; - matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, requestMock) - assert( matchedConfig["Name"].eql? "integration1" ); + matchedConfig = testObject.getMatchedIntegrationConfig(integrationConfig, url, contextMock) + assert( matchedConfig["Name"].eql? "integration1" ); end end class TestUrlValidatorHelper < Test::Unit::TestCase - def test_evaluate + def test_evaluate assert( !UrlValidatorHelper.evaluate(nil, "notimportant") ) assert( !UrlValidatorHelper.evaluate({}, "notimportant") ) - - triggerPart = + + triggerPart = { "UrlPart" => "PageUrl", "Operator" => "Contains", "IsIgnoreCase" => true, "IsNegative" => false, - "ValueToCompare" => "http://test.testdomain.com:8080/test?q=1" + "ValueToCompare" => "http://test.testdomain.com:8080/test?q=1" } assert( !UrlValidatorHelper.evaluate(triggerPart, "http://test.testdomain.com:8080/test?q=2") ) - - triggerPart = + + triggerPart = { "UrlPart" => "PagePath", "Operator" => "Equals", "IsIgnoreCase"=> true, "IsNegative"=> false, - "ValueToCompare"=> "/Test/t1" + "ValueToCompare"=> "/Test/t1" } assert( UrlValidatorHelper.evaluate(triggerPart, "http://test.testdomain.com:8080/test/t1?q=2&y02") ) - - triggerPart = + + triggerPart = { "UrlPart" => "HostName", "Operator" => "Contains", "IsIgnoreCase" => true, "IsNegative" => false, - "ValueToCompare" => "test.testdomain.com" + "ValueToCompare" => "test.testdomain.com" } assert( UrlValidatorHelper.evaluate(triggerPart, "http://m.test.testdomain.com:8080/test?q=2") ) - - triggerPart = + + triggerPart = { "UrlPart" => "HostName", "Operator" => "Contains", "IsIgnoreCase" => true, "IsNegative" => true, - "ValueToCompare" => "test.testdomain.com" + "ValueToCompare" => "test.testdomain.com" } assert( !UrlValidatorHelper.evaluate(triggerPart,"http://m.test.testdomain.com:8080/test?q=2") ) end end class TestUserAgentValidatorHelper < Test::Unit::TestCase - def test_evaluate + def test_evaluate assert( !UserAgentValidatorHelper.evaluate(nil, "notimportant") ) assert( !UserAgentValidatorHelper.evaluate({}, "notimportant") ) - - triggerPart = + + triggerPart = { "Operator" => "Contains", "IsIgnoreCase" => false, "IsNegative" => false, - "ValueToCompare" => "googlebot" + "ValueToCompare" => "googlebot" } assert( !UserAgentValidatorHelper.evaluate(triggerPart, "Googlebot sample useraagent") ) - - triggerPart = + + triggerPart = { "Operator" => "Equals", "IsIgnoreCase"=> true, "IsNegative"=> true, - "ValueToCompare"=> "googlebot" + "ValueToCompare"=> "googlebot" } assert( UserAgentValidatorHelper.evaluate(triggerPart, "oglebot sample useraagent") ) - - triggerPart = + + triggerPart = { - + "Operator" => "Contains", "IsIgnoreCase" => false, "IsNegative" => true, - "ValueToCompare" => "googlebot" + "ValueToCompare" => "googlebot" } assert(!UserAgentValidatorHelper.evaluate(triggerPart, "googlebot") ) - - triggerPart = + + triggerPart = { - + "Operator" => "Contains", "IsIgnoreCase" => true, "IsNegative" => false, - "ValueToCompare" => "googlebot" + "ValueToCompare" => "googlebot" } assert( UserAgentValidatorHelper.evaluate(triggerPart, "Googlebot") ) end @@ -463,10 +488,13 @@ def test_evaluate class TestCookieValidatorHelper < Test::Unit::TestCase def test_evaluate - assert( !CookieValidatorHelper.evaluate(nil, {:c1 => "notimportant" }) ) - assert( !CookieValidatorHelper.evaluate({}, {:c1 => "notimportant" }) ) - - triggerPart = + cookieManagerMock = CookieManagerMock.new + + cookieManagerMock.cookieList[:c1] = { "value" => "notimportant" } + assert(!CookieValidatorHelper.evaluate(nil, cookieManagerMock)) + assert(!CookieValidatorHelper.evaluate({}, cookieManagerMock)) + + triggerPart = { "CookieName" => "c1", "Operator" => "Contains", @@ -474,17 +502,19 @@ def test_evaluate "IsNegative" => false, "ValueToCompare" => "1" } - assert( !CookieValidatorHelper.evaluate(triggerPart, {:c1 => "hhh"}) ) + cookieManagerMock.cookieList = {:c1 => { "value" => "hhh" }} + assert(!CookieValidatorHelper.evaluate(triggerPart, cookieManagerMock)) - triggerPart = + triggerPart = { "CookieName" => "c1", "Operator" => "Contains", "ValueToCompare" => "1" } - assert( !CookieValidatorHelper.evaluate(triggerPart, {:c2 => "ddd", :c1 => "3"}) ) - - triggerPart = + cookieManagerMock.cookieList = {:c2 => { "value" => "ddd" }, :c1 => { "value" => "3" }} + assert(!CookieValidatorHelper.evaluate(triggerPart, cookieManagerMock)) + + triggerPart = { "CookieName" => "c1", "Operator" => "Contains", @@ -492,9 +522,10 @@ def test_evaluate "IsNegative" => false, "ValueToCompare" => "1" } - assert( CookieValidatorHelper.evaluate(triggerPart, {:c2 => "ddd", :c1 => "1"}) ) - - triggerPart = + cookieManagerMock.cookieList = {:c2 => { "value" => "ddd" }, :c1 => { "value" => "1" }} + assert(CookieValidatorHelper.evaluate(triggerPart, cookieManagerMock)) + + triggerPart = { "CookieName" => "c1", "Operator" => "Contains", @@ -502,7 +533,8 @@ def test_evaluate "IsNegative" => true, "ValueToCompare" => "1" } - assert( !CookieValidatorHelper.evaluate(triggerPart, {:c2 => "ddd", :c1 => "1"}) ) + cookieManagerMock.cookieList = {:c2 => { "value" => "ddd" }, :c1 => { "value" => "1" }} + assert(!CookieValidatorHelper.evaluate(triggerPart, cookieManagerMock)) end end @@ -510,8 +542,8 @@ class TestHttpHeaderValidatorHelper < Test::Unit::TestCase def test_evaluate assert( !HttpHeaderValidatorHelper.evaluate(nil, {'a-header' => "notimportant" }) ) assert( !HttpHeaderValidatorHelper.evaluate({}, {'a-header' => "notimportant" }) ) - - triggerPart = + + triggerPart = { "HttpHeaderName" => "a-header", "Operator" => "Contains", @@ -521,15 +553,15 @@ def test_evaluate } assert( HttpHeaderValidatorHelper.evaluate(triggerPart, {'a-header' => "VaLuE"}) ) - triggerPart = + triggerPart = { "HttpHeaderName" => "a-header", "Operator" => "Contains", "ValueToCompare" => "value" } assert( !HttpHeaderValidatorHelper.evaluate(triggerPart, {'a-header' => "not" }) ) - - triggerPart = + + triggerPart = { "HttpHeaderName" => "a-header", "Operator" => "Contains", @@ -540,6 +572,35 @@ def test_evaluate end end + class TestRequestBodyValidatorHelperHelper < Test::Unit::TestCase + def test_evaluate + assert(!RequestBodyValidatorHelper.evaluate(nil, "notimportant")) + assert(!RequestBodyValidatorHelper.evaluate({}, "notimportant")) + + triggerPart = + { + "Operator" => "Contains", + "IsIgnoreCase" => false, + "IsNegative" => false, + "ValueToCompare" => "test body" + } + assert(RequestBodyValidatorHelper.evaluate(triggerPart, "test body")) + + triggerPart["ValueToCompare"] = "ZZZ"; + assert(!RequestBodyValidatorHelper.evaluate(triggerPart, "test body")) + + triggerPart["ValueToCompare"] = "Test"; + triggerPart["IsIgnoreCase"] = true; + assert(RequestBodyValidatorHelper.evaluate(triggerPart, "test body")) + + triggerPart["ValueToCompare"] = "Test"; + triggerPart["IsIgnoreCase"] = true; + triggerPart["IsNegative"] = true; + assert(!RequestBodyValidatorHelper.evaluate(triggerPart, "test body")) + + end + end + class TestComparisonOperatorHelper < Test::Unit::TestCase def test_evaluate_equals_operator assert( ComparisonOperatorHelper.evaluate("Equals", false, false, nil, nil, nil) ) @@ -583,6 +644,6 @@ def test_evaluate_containsAny_operator def test_evaluate_unsupported_operator assert( !ComparisonOperatorHelper.evaluate("-not-supported-", false, false, nil, nil, nil) ) - end + end end end diff --git a/test/queueit_knownuserv3/test_known_user.rb b/test/queueit_knownuserv3/test_known_user.rb index 572dc89..37c75a1 100644 --- a/test/queueit_knownuserv3/test_known_user.rb +++ b/test/queueit_knownuserv3/test_known_user.rb @@ -3,30 +3,25 @@ require_relative '../../lib/queueit_knownuserv3' module QueueIt - class HttpRequestMock - attr_accessor :user_agent - attr_accessor :env - attr_accessor :original_fullpath - attr_accessor :cookie_jar - attr_accessor :remote_ip + class HttpContextMock < IHttpContext + attr_accessor :userAgent attr_accessor :headers + attr_accessor :url + attr_accessor :userHostAddress + attr_accessor :cookieManager + attr_accessor :requestBodyAsString def initialize @headers = {} end - - def setRealOriginalUrl(proto, host, path) - @env = {"rack.url_scheme" => proto, "HTTP_HOST" => host} - @original_fullpath = path - end end class UserInQueueServiceMock attr_reader :extendQueueCookieCalls attr_reader :validateQueueRequestCalls attr_reader :validateCancelRequestCalls - attr_reader :getIgnoreActionResultCalls - + attr_reader :getIgnoreActionResultCalls + attr_accessor :validateQueueRequestResult attr_accessor :validateCancelRequestResult attr_accessor :getIgnoreActionResult @@ -44,12 +39,14 @@ def initialize @validateCancelRequestResult = RequestValidationResult.new(ActionTypes::CANCEL, nil, nil, nil, nil, nil) @getIgnoreActionResult = RequestValidationResult.new(ActionTypes::IGNORE, nil, nil, nil, nil, nil) end - - def extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, secretKey) + + def extendQueueCookie(eventId, cookieValidityMinute, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) @extendQueueCookieCalls[@extendQueueCookieCalls.length] = { "eventId" => eventId, "cookieValidityMinute" => cookieValidityMinute, "cookieDomain" => cookieDomain, + "isCookieHttpOnly" => isCookieHttpOnly, + "isCookieSecure" => isCookieSecure, "secretKey" => secretKey } end @@ -96,12 +93,12 @@ def self.generateDebugToken(eventId, secretKey, expired) if(expired) ts = (Time.now.getutc.tv_sec - 1000).to_s end - tokenWithoutHash = QueueUrlParams::EVENT_ID_KEY + QueueUrlParams::KEY_VALUE_SEPARATOR_CHAR + eventId + - QueueUrlParams::KEY_VALUE_SEPARATOR_GROUP_CHAR + + tokenWithoutHash = QueueUrlParams::EVENT_ID_KEY + QueueUrlParams::KEY_VALUE_SEPARATOR_CHAR + eventId + + QueueUrlParams::KEY_VALUE_SEPARATOR_GROUP_CHAR + QueueUrlParams::REDIRECT_TYPE_KEY + QueueUrlParams::KEY_VALUE_SEPARATOR_CHAR + "debug" + - QueueUrlParams::KEY_VALUE_SEPARATOR_GROUP_CHAR + + QueueUrlParams::KEY_VALUE_SEPARATOR_GROUP_CHAR + QueueUrlParams::TIMESTAMP_KEY + QueueUrlParams::KEY_VALUE_SEPARATOR_CHAR + ts - + hash = OpenSSL::HMAC.hexdigest('sha256', secretKey, tokenWithoutHash) token = tokenWithoutHash + QueueUrlParams::KEY_VALUE_SEPARATOR_GROUP_CHAR + QueueUrlParams::HASH_KEY + QueueUrlParams::KEY_VALUE_SEPARATOR_CHAR + hash return token @@ -109,10 +106,10 @@ def self.generateDebugToken(eventId, secretKey, expired) end class TestKnownUser < Test::Unit::TestCase - def test_cancelRequestByLocalConfig - userInQueueService = UserInQueueServiceMock.new + def test_cancelRequestByLocalConfig + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - + cancelConfig = CancelEventConfig.new cancelConfig.eventId = "eventId" cancelConfig.queueDomain = "queueDomain" @@ -120,19 +117,19 @@ def test_cancelRequestByLocalConfig cancelConfig.cookieDomain = "cookieDomain" cancelConfig.actionName = "CancelAction" - result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey", HttpRequestMock.new) + result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey") - assert( userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "targetUrl" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"] == cancelConfig ) - assert( userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerId" ) - assert( userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretKey" ) - assert( !result.isAjaxResult ) + assert(userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "targetUrl") + assert(userInQueueService.validateCancelRequestCalls[0]["config"] == cancelConfig) + assert(userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerId") + assert(userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretKey") + assert(!result.isAjaxResult) end def test_cancelRequestByLocalConfig_AjaxCall - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - + cancelConfig = CancelEventConfig.new cancelConfig.eventId = "eventId" cancelConfig.queueDomain = "queueDomain" @@ -140,160 +137,188 @@ def test_cancelRequestByLocalConfig_AjaxCall cancelConfig.cookieDomain = "cookieDomain" cancelConfig.actionName = "CancelAction" - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + userInQueueService.validateCancelRequestResult = RequestValidationResult.new(ActionTypes::CANCEL, "eventId", nil, "http://q.qeuue-it.com", nil, cancelConfig.actionName) - result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey", requestMock) + result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey") - assert( userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://url" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"] == cancelConfig ) - assert( userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerId" ) - assert( userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretKey" ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) - assert( result.actionName == cancelConfig.actionName ) + assert(userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://url") + assert(userInQueueService.validateCancelRequestCalls[0]["config"] == cancelConfig) + assert(userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerId") + assert(userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretKey") + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") + assert(result.actionName == cancelConfig.actionName) end def test_cancelRequestByLocalConfig_nil_QueueDomain + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + cancelConfig = CancelEventConfig.new cancelConfig.eventId = "eventId" - + begin - KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "cancelConfig.queueDomain can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end - + def test_cancelRequestByLocalConfig_nil_EventId + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + cancelConfig = CancelEventConfig.new cancelConfig.queueDomain = "queueDomain" begin - KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "cancelConfig.eventId can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_cancelRequestByLocalConfig_nil_CancelConfig + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.cancelRequestByLocalConfig("targetUrl", "token", nil, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig("targetUrl", "token", nil, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "cancelConfig can not be nil." end - - assert( errorThrown ) + + assert(errorThrown) end def test_cancelRequestByLocalConfig_nil_CustomerId + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.cancelRequestByLocalConfig("targetUrl", "token", CancelEventConfig.new, nil, "secretKey", HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig("targetUrl", "token", CancelEventConfig.new, nil, "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "customerId can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_cancelRequestByLocalConfig_nil_SeceretKey + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.cancelRequestByLocalConfig("targetUrl", "token", CancelEventConfig.new, "customerId", nil, HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig("targetUrl", "token", CancelEventConfig.new, "customerId", nil) rescue KnownUserError => err errorThrown = err.message.eql? "secretKey can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_cancelRequestByLocalConfig_nil_TargetUrl + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.cancelRequestByLocalConfig(nil, "token", CancelEventConfig.new, "customerId", nil, HttpRequestMock.new) + KnownUser.cancelRequestByLocalConfig(nil, "token", CancelEventConfig.new, "customerId", nil) rescue KnownUserError => err errorThrown = err.message.eql? "targetUrl can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_extendQueueCookie_nil_EventId + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.extendQueueCookie(nil, 10, "cookieDomain", "secretkey", {}) + KnownUser.extendQueueCookie(nil, 10, "cookieDomain", false, false, "secretkey") rescue KnownUserError => err errorThrown = err.message.eql? "eventId can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_extendQueueCookie_nil_SecretKey + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.extendQueueCookie("eventId", 10, "cookieDomain", nil, {}) + KnownUser.extendQueueCookie("eventId", 10, "cookieDomain", false, false, nil) rescue KnownUserError => err errorThrown = err.message.eql? "secretKey can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_extendQueueCookie_Invalid_CookieValidityMinute + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.extendQueueCookie("eventId", "invalidInt", "cookieDomain", "secrettKey", {}) + KnownUser.extendQueueCookie("eventId", "invalidInt", "cookieDomain", false, false, "secrettKey") rescue KnownUserError => err errorThrown = err.message.eql? "cookieValidityMinute should be integer greater than 0." end - - assert( errorThrown ) + + assert(errorThrown) end def test_extendQueueCookie_Negative_CookieValidityMinute + HttpContextProvider.setHttpContext(HttpContextMock.new) + errorThrown = false - + begin - KnownUser.extendQueueCookie("eventId", -1, "cookieDomain", "secrettKey", {}) + KnownUser.extendQueueCookie("eventId", -1, "cookieDomain", false, false, "secrettKey") rescue KnownUserError => err errorThrown = err.message.eql? "cookieValidityMinute should be integer greater than 0." end - - assert( errorThrown ) + + assert(errorThrown) end def test_extendQueueCookie - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - KnownUser.extendQueueCookie("evtId", 10, "domain", "key", HttpRequestMock.new) - - assert( userInQueueService.extendQueueCookieCalls[0]["eventId"] == "evtId" ) - assert( userInQueueService.extendQueueCookieCalls[0]["cookieValidityMinute"] == 10 ) - assert( userInQueueService.extendQueueCookieCalls[0]["cookieDomain"] == "domain" ) - assert( userInQueueService.extendQueueCookieCalls[0]["secretKey"] == "key" ) + HttpContextProvider.setHttpContext(HttpContextMock.new) + + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + KnownUser.extendQueueCookie("evtId", 10, "domain", true, true, "key") + + assert(userInQueueService.extendQueueCookieCalls[0]["eventId"] == "evtId") + assert(userInQueueService.extendQueueCookieCalls[0]["cookieValidityMinute"] == 10) + assert(userInQueueService.extendQueueCookieCalls[0]["cookieDomain"] == "domain") + assert(userInQueueService.extendQueueCookieCalls[0]["isCookieHttpOnly"]) + assert(userInQueueService.extendQueueCookieCalls[0]["isCookieSecure"]) + assert(userInQueueService.extendQueueCookieCalls[0]["secretKey"] == "key") end def test_resolveQueueRequestByLocalConfig_empty_eventId + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -305,17 +330,19 @@ def test_resolveQueueRequestByLocalConfig_empty_eventId queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", "secretkey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", "secretkey") rescue KnownUserError => err errorThrown = err.message.eql? "queueConfig.eventId can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_empty_secretKey + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -327,17 +354,19 @@ def test_resolveQueueRequestByLocalConfig_empty_secretKey queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", nil, HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", nil) rescue KnownUserError => err errorThrown = err.message.eql? "secretKey can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_empty_queueDomain + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -349,17 +378,19 @@ def test_resolveQueueRequestByLocalConfig_empty_queueDomain queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", "secretkey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerid", "secretkey") rescue KnownUserError => err errorThrown = err.message.eql? "queueConfig.queueDomain can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_empty_customerId + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -371,17 +402,19 @@ def test_resolveQueueRequestByLocalConfig_empty_customerId queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, nil, "secretKey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, nil, "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "customerId can not be nil or empty." end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_Invalid_extendCookieValidity + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -393,17 +426,19 @@ def test_resolveQueueRequestByLocalConfig_Invalid_extendCookieValidity queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.eql? "queueConfig.extendCookieValidity should be valid boolean." end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_Invalid_cookieValidityMinute + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -415,17 +450,19 @@ def test_resolveQueueRequestByLocalConfig_Invalid_cookieValidityMinute queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.start_with? "queueConfig.cookieValidityMinute should be integer greater than 0" end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig_zero_cookieValidityMinute + HttpContextProvider.setHttpContext(HttpContextMock.new) + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -437,18 +474,19 @@ def test_resolveQueueRequestByLocalConfig_zero_cookieValidityMinute queueConfig.version = 12 errorThrown = false - + begin - KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey", HttpRequestMock.new) + KnownUser.resolveQueueRequestByLocalConfig("targeturl", "queueIttoken", queueConfig, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.start_with? "queueConfig.cookieValidityMinute should be integer greater than 0" end - - assert( errorThrown ) + + assert(errorThrown) end def test_resolveQueueRequestByLocalConfig - userInQueueService = UserInQueueServiceMock.new + HttpContextProvider.setHttpContext(HttpContextMock.new) + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) queueConfig = QueueEventConfig.new @@ -462,18 +500,18 @@ def test_resolveQueueRequestByLocalConfig queueConfig.version = 12 queueConfig.actionName = "QueueAction" - result = KnownUser.resolveQueueRequestByLocalConfig("target", "token", queueConfig, "id", "key", HttpRequestMock.new) + result = KnownUser.resolveQueueRequestByLocalConfig("target", "token", queueConfig, "id", "key") - assert( userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "target" ) - assert( userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"] == queueConfig ) - assert( userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id" ) - assert( userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key" ) - assert( !result.isAjaxResult ) + assert(userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "target") + assert(userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token") + assert(userInQueueService.validateQueueRequestCalls[0]["config"] == queueConfig) + assert(userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id") + assert(userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key") + assert(!result.isAjaxResult) end def test_resolveQueueRequestByLocalConfig_AjaxCall - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) queueConfig = QueueEventConfig.new @@ -487,41 +525,43 @@ def test_resolveQueueRequestByLocalConfig_AjaxCall queueConfig.version = 12 queueConfig.actionName = "QueueAction" - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + userInQueueService.validateQueueRequestResult = RequestValidationResult.new(ActionTypes::QUEUE, "eventId", nil, "http://q.qeuue-it.com", nil, queueConfig.actionName) - result = KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "token", queueConfig, "customerId", "secretKey", requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("targetUrl", "token", queueConfig, "customerId", "secretKey") - assert( userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://url" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"] == queueConfig ) - assert( userInQueueService.validateQueueRequestCalls[0]["customerId"] == "customerId" ) - assert( userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "secretKey" ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) - assert( result.actionName == queueConfig.actionName ) + assert(userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://url") + assert(userInQueueService.validateQueueRequestCalls[0]["config"] == queueConfig) + assert(userInQueueService.validateQueueRequestCalls[0]["customerId"] == "customerId") + assert(userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "secretKey") + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") + assert(result.actionName == queueConfig.actionName) end def test_validateRequestByIntegrationConfig_empty_currentUrlWithoutQueueITToken errorThrown = false - + begin - KnownUser.validateRequestByIntegrationConfig("", "queueIttoken", "{}", "customerId", "secretKey", HttpRequestMock.new) + KnownUser.validateRequestByIntegrationConfig("", "queueIttoken", "{}", "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.start_with? "currentUrlWithoutQueueITToken can not be nil or empty" end - - assert( errorThrown ) + + assert(errorThrown) end def test_validateRequestByIntegrationConfig - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - integrationConfig = + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -532,10 +572,10 @@ def test_validateRequestByIntegrationConfig :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -544,7 +584,7 @@ def test_validateRequestByIntegrationConfig :ValidatorType => "UrlValidator", :IsNegative => false, :IsIgnoreCase => true - }, + }, { :Operator => "Contains", :ValueToCompare => "googlebot", @@ -566,37 +606,39 @@ def test_validateRequestByIntegrationConfig :PublishDate => "2017-05-15T21:39:12.0076806Z", :ConfigDataVersion => "1.0.0.1" } - mockRequest = HttpRequestMock.new - mockRequest.user_agent = 'googlebot' - mockRequest.cookie_jar = Hash.new + httpContextMock = HttpContextMock.new + httpContextMock.userAgent = 'googlebot' + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "token", integrationConfigJson, "id", "key", mockRequest) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "token", integrationConfigJson, "id", "key") - assert( userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://test.com?event1=true" ) - assert( userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token" ) - assert( userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id" ) - assert( userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key" ) + assert(userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://test.com?event1=true") + assert(userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token") + assert(userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id") + assert(userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key") - assert( userInQueueService.validateQueueRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].eventId == "event1" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].culture == "" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].layoutName == "Christmas Layout by Queue-it" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].extendCookieValidity ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].cookieValidityMinute == 20 ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].cookieDomain == ".test.com" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].version == 3 ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name] ) - assert( !result.isAjaxResult ) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].eventId == "event1") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].culture == "") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].layoutName == "Christmas Layout by Queue-it") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].extendCookieValidity) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].cookieValidityMinute == 20) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].cookieDomain == ".test.com") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].version == 3) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name]) + assert(!result.isAjaxResult) end def test_validateRequestByIntegrationConfig_AjaxCall - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - integrationConfig = + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -607,10 +649,10 @@ def test_validateRequestByIntegrationConfig_AjaxCall :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -619,7 +661,7 @@ def test_validateRequestByIntegrationConfig_AjaxCall :ValidatorType => "UrlValidator", :IsNegative => false, :IsIgnoreCase => true - }, + }, { :Operator => "Contains", :ValueToCompare => "googlebot", @@ -641,39 +683,41 @@ def test_validateRequestByIntegrationConfig_AjaxCall :PublishDate => "2017-05-15T21:39:12.0076806Z", :ConfigDataVersion => "1.0.0.1" } - mockRequest = HttpRequestMock.new - mockRequest.user_agent = 'googlebot' - mockRequest.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } - mockRequest.cookie_jar = Hash.new + httpContextMock = HttpContextMock.new + httpContextMock.userAgent = 'googlebot' + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + integrationConfigJson = JSON.generate(integrationConfig) userInQueueService.validateQueueRequestResult = RequestValidationResult.new(ActionTypes::QUEUE, "eventId", nil, "http://q.qeuue-it.com", nil, integrationConfig[:Integrations][0][:Name]) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "token", integrationConfigJson, "id", "key", mockRequest) - - assert( userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://url" ) - assert( userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token" ) - assert( userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id" ) - assert( userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key" ) - - assert( userInQueueService.validateQueueRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].eventId == "event1" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].culture == "" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].layoutName == "Christmas Layout by Queue-it" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].extendCookieValidity ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].cookieValidityMinute == 20 ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].cookieDomain == ".test.com" ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].version == 3 ) - assert( userInQueueService.validateQueueRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name] ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) - end + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "token", integrationConfigJson, "id", "key") + + assert(userInQueueService.validateQueueRequestCalls[0]["targetUrl"] == "http://url") + assert(userInQueueService.validateQueueRequestCalls[0]["queueitToken"] == "token") + assert(userInQueueService.validateQueueRequestCalls[0]["customerId"] == "id") + assert(userInQueueService.validateQueueRequestCalls[0]["secretKey"] == "key") + + assert(userInQueueService.validateQueueRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].eventId == "event1") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].culture == "") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].layoutName == "Christmas Layout by Queue-it") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].extendCookieValidity) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].cookieValidityMinute == 20) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].cookieDomain == ".test.com") + assert(userInQueueService.validateQueueRequestCalls[0]["config"].version == 3) + assert(userInQueueService.validateQueueRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name]) + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") + end def test_validateRequestByIntegrationConfig_NotMatch - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - integrationConfig = + integrationConfig = { :Description => "test", :Integrations => [ @@ -686,21 +730,22 @@ def test_validateRequestByIntegrationConfig_NotMatch } integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.validateQueueRequestCalls.length == 0 ) - assert( !result.doRedirect ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.validateQueueRequestCalls.length == 0) + assert(!result.doRedirect) end - + def test_validateRequestByIntegrationConfig_ForcedTargetUrl - userInQueueService = UserInQueueServiceMock.new + HttpContextProvider.setHttpContext(HttpContextMock.new) + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -711,10 +756,10 @@ def test_validateRequestByIntegrationConfig_ForcedTargetUrl :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -739,22 +784,22 @@ def test_validateRequestByIntegrationConfig_ForcedTargetUrl :PublishDate => "2017-05-15T21:39:12.0076806Z", :ConfigDataVersion => "1.0.0.1" } - + integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "http://test.com" ) - assert( !result.isAjaxResult ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "http://test.com") + assert(!result.isAjaxResult) end def test_validateRequestByIntegrationConfig_ForcedTargetUrl_AjaxCall - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -765,10 +810,10 @@ def test_validateRequestByIntegrationConfig_ForcedTargetUrl_AjaxCall :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -793,27 +838,30 @@ def test_validateRequestByIntegrationConfig_ForcedTargetUrl_AjaxCall :PublishDate => "2017-05-15T21:39:12.0076806Z", :ConfigDataVersion => "1.0.0.1" } - - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + userInQueueService.validateQueueRequestResult = RequestValidationResult.new(ActionTypes::QUEUE, "eventId", nil, "http://q.qeuue-it.com", nil, integrationConfig[:Integrations][0][:Name]) integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", requestMock) - - assert( userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "http://test.com" ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "http://test.com") + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") end def test_validateRequestByIntegrationConfig_EventTargetUrl - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + HttpContextProvider.setHttpContext(HttpContextMock.new) + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -824,10 +872,10 @@ def test_validateRequestByIntegrationConfig_EventTargetUrl :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -853,20 +901,20 @@ def test_validateRequestByIntegrationConfig_EventTargetUrl } integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "" ) - assert( !result.isAjaxResult ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "") + assert(!result.isAjaxResult) end def test_validateRequestByIntegrationConfig_EventTargetUrl_AjaxCall - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", @@ -877,10 +925,10 @@ def test_validateRequestByIntegrationConfig_EventTargetUrl_AjaxCall :Culture => "", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -905,36 +953,39 @@ def test_validateRequestByIntegrationConfig_EventTargetUrl_AjaxCall :ConfigDataVersion => "1.0.0.1" } - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + userInQueueService.validateQueueRequestResult = RequestValidationResult.new(ActionTypes::QUEUE, "eventId", nil, "http://q.qeuue-it.com", nil, integrationConfig[:Integrations][0][:Name]) integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", requestMock) - - assert( userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "" ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.validateQueueRequestCalls[0]['targetUrl'] == "") + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") end def test_validateRequestByIntegrationConfig_CancelAction - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + HttpContextProvider.setHttpContext(HttpContextMock.new) + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "Cancel", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -948,7 +999,7 @@ def test_validateRequestByIntegrationConfig_CancelAction :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -959,38 +1010,38 @@ def test_validateRequestByIntegrationConfig_CancelAction } integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://test.com?event1=true" ) - assert( userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerid" ) - assert( userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretkey" ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") - assert( userInQueueService.validateCancelRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].eventId == "event1" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].cookieDomain == ".test.com" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].version == 3 ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name] ) - assert( !result.isAjaxResult ) + assert(userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://test.com?event1=true") + assert(userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerid") + assert(userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretkey") + + assert(userInQueueService.validateCancelRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].eventId == "event1") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].cookieDomain == ".test.com") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].version == 3) + assert(userInQueueService.validateCancelRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name]) + assert(!result.isAjaxResult) end def test_validateRequestByIntegrationConfig_CancelAction_AjaxCall - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "Cancel", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1004,7 +1055,7 @@ def test_validateRequestByIntegrationConfig_CancelAction_AjaxCall :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -1014,44 +1065,46 @@ def test_validateRequestByIntegrationConfig_CancelAction_AjaxCall :ConfigDataVersion => "1.0.0.1" } - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + userInQueueService.validateCancelRequestResult = RequestValidationResult.new(ActionTypes::CANCEL, "eventId", nil, "http://q.qeuue-it.com", nil, integrationConfig[:Integrations][0][:Name]) integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", requestMock) - - assert( userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://url" ) - assert( userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerid" ) - assert( userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretkey" ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") - assert( userInQueueService.validateCancelRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].eventId == "event1" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].cookieDomain == ".test.com" ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].version == 3 ) - assert( userInQueueService.validateCancelRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name] ) - assert( result.isAjaxResult ) - assert( result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com" ) + assert(userInQueueService.validateCancelRequestCalls[0]["targetUrl"] == "http://url") + assert(userInQueueService.validateCancelRequestCalls[0]["customerId"] == "customerid") + assert(userInQueueService.validateCancelRequestCalls[0]["secretKey"] == "secretkey") + + assert(userInQueueService.validateCancelRequestCalls[0]["config"].queueDomain == "knownusertest.queue-it.net") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].eventId == "event1") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].cookieDomain == ".test.com") + assert(userInQueueService.validateCancelRequestCalls[0]["config"].version == 3) + assert(userInQueueService.validateCancelRequestCalls[0]["config"].actionName == integrationConfig[:Integrations][0][:Name]) + assert(result.isAjaxResult) + assert(result.getAjaxRedirectUrl.downcase == "http%3a%2f%2fq.qeuue-it.com") end def test_validateRequestByIntegrationConfig_ignoreAction - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "Ignore", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1065,7 +1118,7 @@ def test_validateRequestByIntegrationConfig_ignoreAction :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -1076,31 +1129,31 @@ def test_validateRequestByIntegrationConfig_ignoreAction } integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.getIgnoreActionResultCalls.length.eql? 1 ) - assert( userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name] ) - assert( !result.isAjaxResult ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.getIgnoreActionResultCalls.length.eql? 1) + assert(userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name]) + assert(!result.isAjaxResult) end def test_validateRequestByIntegrationConfig_ignoreAction_AjaxCall - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "Ignore", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1114,7 +1167,7 @@ def test_validateRequestByIntegrationConfig_ignoreAction_AjaxCall :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -1124,35 +1177,36 @@ def test_validateRequestByIntegrationConfig_ignoreAction_AjaxCall :ConfigDataVersion => "1.0.0.1" } - requestMock = HttpRequestMock.new - requestMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } - + httpContextMock = HttpContextMock.new + httpContextMock.headers = { "x-queueit-ajaxpageurl" => "http%3a%2f%2furl" } + HttpContextProvider.setHttpContext(httpContextMock) + integrationConfigJson = JSON.generate(integrationConfig) - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", requestMock) - - assert( userInQueueService.getIgnoreActionResultCalls.length.eql? 1 ) - assert( userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name] ) - assert( result.isAjaxResult ) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.getIgnoreActionResultCalls.length.eql? 1) + assert(userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name]) + assert(result.isAjaxResult) end def test_validateRequestByIntegrationConfig_defaultsTo_ignoreAction - userInQueueService = UserInQueueServiceMock.new - KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - - integrationConfig = + userInQueueService = UserInQueueServiceMock.new + KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) + + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "some-future-action-type", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1166,7 +1220,7 @@ def test_validateRequestByIntegrationConfig_defaultsTo_ignoreAction :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -1177,34 +1231,36 @@ def test_validateRequestByIntegrationConfig_defaultsTo_ignoreAction } integrationConfigJson = JSON.generate(integrationConfig) - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", HttpRequestMock.new) - - assert( userInQueueService.getIgnoreActionResultCalls.length.eql? 1 ) - assert( userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name] ) + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") + + assert(userInQueueService.getIgnoreActionResultCalls.length.eql? 1) + assert(userInQueueService.getIgnoreActionResultCalls[0]["actionName"] == integrationConfig[:Integrations][0][:Name]) end def test_ValidateRequestByIntegrationConfig_Debug - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - integrationConfig = + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", #:ActionType => "Queue", #omitting will default to "Queue" :EventId => "event1", :CookieDomain => ".test.com", + :IsCookieHttpOnly => false, + :IsCookieSecure => false, :LayoutName => "Christmas Layout by Queue-it", :Culture => "da-DK", :ExtendCookieValidity => true, :CookieValidityMinute => 20, - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1213,7 +1269,7 @@ def test_ValidateRequestByIntegrationConfig_Debug :ValidatorType => "UrlValidator", :IsNegative => false, :IsIgnoreCase => true - }, + }, { :Operator => "Contains", :ValueToCompare => "googlebot", @@ -1235,64 +1291,78 @@ def test_ValidateRequestByIntegrationConfig_Debug :PublishDate => "2017-05-15T21:39:12.0076806Z", :ConfigDataVersion => "1.0.0.1" } - - requestMock = HttpRequestMock.new - requestMock.user_agent = "googlebot" - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + + httpContextMock = HttpContextMock.new + httpContextMock.userAgent = "googlebot" + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) + integrationConfigJson = JSON.generate(integrationConfig) - + secretKey = "secretKey" queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", secretKey, false) - + expectedServerTime = Time.now.utc.iso8601 - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, integrationConfigJson, "customerId", secretKey, requestMock) + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, integrationConfigJson, "customerId", secretKey) - expectedCookieValue = + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|PureUrl=http://test.com?event1=true|QueueitToken=" + queueitToken + + "|PureUrl=http://test.com?event1=true|QueueitToken=" + queueitToken + "|OriginalUrl=http://localhost/original_url" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" + - "|ConfigVersion=3|MatchedConfig=event1action" + - "|TargetUrl=http://test.com?event1=true|QueueConfig=EventId:event1&Version:3&QueueDomain:knownusertest.queue-it.net&CookieDomain:.test.com&ExtendCookieValidity:true&CookieValidityMinute:20&LayoutName:Christmas Layout by Queue-it&Culture:da-DK&ActionName:" + integrationConfig[:Integrations][0][:Name] - - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + "|ConfigVersion=3|MatchedConfig=event1action" + + "|TargetUrl=http://test.com?event1=true" + + "|QueueConfig=EventId:event1" + + "&Version:3" + + "&QueueDomain:knownusertest.queue-it.net" + + "&CookieDomain:.test.com" + + "&IsCookieHttpOnly:false" + + "&IsCookieSecure:false" + + "&ExtendCookieValidity:true" + + "&CookieValidityMinute:20" + + "&LayoutName:Christmas Layout by Queue-it" + + "&Culture:da-DK" + + "&ActionName:" + integrationConfig[:Integrations][0][:Name] + + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_ValidateRequestByIntegrationConfig_Debug_WithoutMatch - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } - - integrationConfig = + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) + + integrationConfig = { :Description => "test", :Integrations => [ @@ -1305,467 +1375,471 @@ def test_ValidateRequestByIntegrationConfig_Debug_WithoutMatch } secretKey = "secretKey" - queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", secretKey, false) + queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", secretKey, false) integrationConfigJson = JSON.generate(integrationConfig) expectedServerTime = Time.now.utc.iso8601 - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, integrationConfigJson, "customerId", secretKey, requestMock) + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, integrationConfigJson, "customerId", secretKey) - expectedCookieValue = + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|PureUrl=http://test.com?event1=true|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|PureUrl=http://test.com?event1=true|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" + "|ConfigVersion=3|MatchedConfig=NULL" - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_validateRequestByIntegrationConfig_debug_invalid_config_json - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", + "x-forwarded-host" => "xfh", "x-forwarded-proto" => "xfp" } + HttpContextProvider.setHttpContext(httpContextMock) + integrationConfigJson = "{}" queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) - + expectedServerTime = Time.now.utc.iso8601 - + errorThrown = false begin - KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, - integrationConfigJson, "customerId", "secretKey", requestMock) + KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", queueitToken, integrationConfigJson, "customerId", "secretKey") rescue KnownUserError => err errorThrown = err.message.start_with? "integrationConfigJson is not valid json." end - - assert( errorThrown ) - expectedCookieValue = + assert(errorThrown) + + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + - "|Runtime=" + RUBY_VERSION.to_s + - "|PureUrl=http://test.com?event1=true" + - "|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|Runtime=" + RUBY_VERSION.to_s + + "|PureUrl=http://test.com?event1=true" + + "|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" + "|ConfigVersion=NULL" + "|Exception=integrationConfigJson is not valid json." - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_ValidateRequestByIntegrationConfig_Debug_Missing_CustomerId - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.validateRequestByIntegrationConfig( - "http://test.com?event1=true", expiredDebugToken, "{}", nil, "secretKey", - requestMock) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", expiredDebugToken, "{}", nil, "secretKey") - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ValidateRequestByIntegrationConfig_Debug_Missing_Secretkey - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.validateRequestByIntegrationConfig( - "http://test.com?event1=true", expiredDebugToken, "{}", "customerId", nil, - requestMock) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", expiredDebugToken, "{}", "customerId", nil) - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ValidateRequestByIntegrationConfig_Debug_ExpiredToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.validateRequestByIntegrationConfig( - "http://test.com?event1=true", expiredDebugToken, "{}", "customerId", "secretKey", - requestMock) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", expiredDebugToken, "{}", "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ValidateRequestByIntegrationConfig_Debug_ModifiedToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + invalidDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) + "invalid-hash" - result = KnownUser.validateRequestByIntegrationConfig( - "http://test.com?event1=true", invalidDebugToken, "{}", "customerId", "secretKey", - requestMock) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", invalidDebugToken, "{}", "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ResolveQueueRequestByLocalConfig_Debug - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) queueConfig = QueueEventConfig.new - queueConfig.cookieDomain = "cookieDomain" + queueConfig.eventId = "eventId" queueConfig.layoutName = "layoutName" queueConfig.culture = "culture" - queueConfig.eventId = "eventId" queueConfig.queueDomain = "queueDomain" queueConfig.extendCookieValidity = true queueConfig.cookieValidityMinute = 10 + queueConfig.cookieDomain = "cookieDomain" + queueConfig.isCookieHttpOnly = false + queueConfig.isCookieSecure = false queueConfig.version = 12 queueConfig.actionName = "QueueAction" - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) secretKey = "secretKey" queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", secretKey, false) - + expectedServerTime = Time.now.utc.iso8601 - KnownUser.resolveQueueRequestByLocalConfig("url", queueitToken, queueConfig, "customerId", secretKey, requestMock) - - expectedCookieValue = + KnownUser.resolveQueueRequestByLocalConfig("url", queueitToken, queueConfig, "customerId", secretKey) + + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|TargetUrl=url|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|QueueConfig=EventId:eventId&Version:12&QueueDomain:queueDomain&CookieDomain:cookieDomain&ExtendCookieValidity:true&CookieValidityMinute:10&LayoutName:layoutName&Culture:culture&ActionName:QueueAction" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|TargetUrl=url|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|QueueConfig=EventId:eventId" + + "&Version:12" + + "&QueueDomain:queueDomain" + + "&CookieDomain:cookieDomain" + + "&IsCookieHttpOnly:false" + + "&IsCookieSecure:false" + + "&ExtendCookieValidity:true" + + "&CookieValidityMinute:10" + + "&LayoutName:layoutName" + + "&Culture:culture" + + "&ActionName:QueueAction" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_ResolveQueueRequestByLocalConfig_Debug_NullConfig - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) - queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) + queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) expectedServerTime = Time.now.utc.iso8601 - + errorThrown = false begin - KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", queueitToken, - nil, "customerId", "secretKey", requestMock) + KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", queueitToken, nil, "customerId", "secretKey") rescue KnownUserError => err errmsg = err.message errorThrown = err.message.start_with? "queueConfig can not be nil." end - - assert( errorThrown ) - expectedCookieValue = + assert(errorThrown) + + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|TargetUrl=http://test.com?event1=true" + - "|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|QueueConfig=NULL" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|TargetUrl=http://test.com?event1=true" + + "|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|QueueConfig=NULL" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" + "|Exception=queueConfig can not be nil." - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_ResolveQueueRequestByLocalConfig_Debug_Missing_CustomerId - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + queueConfig = QueueEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.resolveQueueRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, queueConfig, nil, "secretKey", - requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", expiredDebugToken, queueConfig, nil, "secretKey") - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ResolveQueueRequestByLocalConfig_Debug_Missing_SecretKey - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + queueConfig = QueueEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.resolveQueueRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, queueConfig, "customerId", nil, - requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", expiredDebugToken, queueConfig, "customerId", nil) - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ResolveQueueRequestByLocalConfig_Debug_ExpiredToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + queueConfig = QueueEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) - result = KnownUser.resolveQueueRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, queueConfig, "customerId", "secretKey", - requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", expiredDebugToken, queueConfig, "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_ResolveQueueRequestByLocalConfig_Debug_ModifiedToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + queueConfig = QueueEventConfig.new invalidDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) + "invalid-hash" - result = KnownUser.resolveQueueRequestByLocalConfig( - "http://test.com?event1=true", invalidDebugToken, queueConfig, "customerId", "secretKey", - requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("http://test.com?event1=true", invalidDebugToken, queueConfig, "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_CancelRequestByLocalConfig_Debug - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - + cancelConfig = CancelEventConfig.new cancelConfig.eventId = "eventId" cancelConfig.queueDomain = "queueDomain" cancelConfig.version = 1 cancelConfig.cookieDomain = "cookieDomain" + cancelConfig.isCookieHttpOnly = false + cancelConfig.isCookieSecure = false cancelConfig.actionName = "CancelAction" - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) secretKey = "secretKey" queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", secretKey, false) - + expectedServerTime = Time.now.utc.iso8601 - KnownUser.cancelRequestByLocalConfig("url", queueitToken, cancelConfig, "customerId", secretKey, requestMock) + KnownUser.cancelRequestByLocalConfig("url", queueitToken, cancelConfig, "customerId", secretKey) - expectedCookieValue = + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|TargetUrl=url|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|CancelConfig=EventId:eventId&Version:1&QueueDomain:queueDomain&CookieDomain:cookieDomain&ActionName:" + cancelConfig.actionName + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + - "|RequestHttpHeader_XForwardedProto=xfp" - - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + "|TargetUrl=url|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|CancelConfig=EventId:eventId" + + "&Version:1" + + "&QueueDomain:queueDomain" + + "&CookieDomain:cookieDomain" + + "&IsCookieHttpOnly:false" + + "&IsCookieSecure:false" + + "&ActionName:" + cancelConfig.actionName + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + + "|RequestHttpHeader_XForwardedProto=xfp" + + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_CancelRequestByLocalConfig_Debug_NullConfig - userInQueueService = UserInQueueServiceMock.new + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) - queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) + queueitToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) expectedServerTime = Time.now.utc.iso8601 - + errorThrown = false begin - KnownUser.cancelRequestByLocalConfig("http://test.com?event1=true", queueitToken, - nil, "customerId", "secretKey", requestMock) + KnownUser.cancelRequestByLocalConfig("http://test.com?event1=true", queueitToken, nil, "customerId", "secretKey") rescue KnownUserError => err errmsg = err.message errorThrown = err.message.start_with? "cancelConfig can not be nil." end - - assert( errorThrown ) - expectedCookieValue = + assert(errorThrown) + + expectedCookieValue = "SdkVersion=" + UserInQueueService::SDK_VERSION + "|Runtime=" + RUBY_VERSION.to_s + - "|TargetUrl=http://test.com?event1=true" + - "|QueueitToken=" + queueitToken + - "|OriginalUrl=http://localhost/original_url" + - "|CancelConfig=NULL" + - "|ServerUtcTime=" + expectedServerTime + - "|RequestIP=userIP" + - "|RequestHttpHeader_Via=v" + - "|RequestHttpHeader_Forwarded=f" + - "|RequestHttpHeader_XForwardedFor=xff" + - "|RequestHttpHeader_XForwardedHost=xfh" + + "|TargetUrl=http://test.com?event1=true" + + "|QueueitToken=" + queueitToken + + "|OriginalUrl=http://localhost/original_url" + + "|CancelConfig=NULL" + + "|ServerUtcTime=" + expectedServerTime + + "|RequestIP=userIP" + + "|RequestHttpHeader_Via=v" + + "|RequestHttpHeader_Forwarded=f" + + "|RequestHttpHeader_XForwardedFor=xff" + + "|RequestHttpHeader_XForwardedHost=xfh" + "|RequestHttpHeader_XForwardedProto=xfp" + "|Exception=cancelConfig can not be nil." - assert( requestMock.cookie_jar.length == 1 ) - assert( requestMock.cookie_jar.key?(KnownUser::QUEUEIT_DEBUG_KEY.to_sym) ) - actualCookieValue = requestMock.cookie_jar[KnownUser::QUEUEIT_DEBUG_KEY.to_sym]["value".to_sym] - assert( expectedCookieValue.eql?(actualCookieValue) ) + assert(httpContextMock.cookieManager.cookieList.length == 1) + actualCookieValue = httpContextMock.cookieManager.getCookie(KnownUser::QUEUEIT_DEBUG_KEY) + assert(expectedCookieValue.eql?(actualCookieValue)) end def test_CancelRequestByLocalConfig_Debug_Missing_CustomerId - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + cancelConfig = CancelEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) result = KnownUser.cancelRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, cancelConfig, nil, "secretKey", - requestMock) + "http://test.com?event1=true", expiredDebugToken, cancelConfig, nil, "secretKey") - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_CancelRequestByLocalConfig_Debug_Missing_SecretKey - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + cancelConfig = CancelEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) result = KnownUser.cancelRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, cancelConfig, "customerId", nil, - requestMock) + "http://test.com?event1=true", expiredDebugToken, cancelConfig, "customerId", nil) - assert( "https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://api2.queue-it.net/diagnostics/connector/error/?code=setup" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_CancelRequestByLocalConfig_Debug_ExpiredToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + cancelConfig = CancelEventConfig.new expiredDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", true) result = KnownUser.cancelRequestByLocalConfig( - "http://test.com?event1=true", expiredDebugToken, cancelConfig, "customerId", "secretKey", - requestMock) + "http://test.com?event1=true", expiredDebugToken, cancelConfig, "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=timestamp" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end def test_CancelRequestByLocalConfig_Debug_ModifiedToken - requestMock = HttpRequestMock.new - requestMock.cookie_jar = {} - + httpContextMock = HttpContextMock.new + httpContextMock.cookieManager = CookieManagerMock.new + HttpContextProvider.setHttpContext(httpContextMock) + cancelConfig = CancelEventConfig.new invalidDebugToken = QueueITTokenGenerator::generateDebugToken("eventId", "secretKey", false) + "invalid-hash" result = KnownUser.cancelRequestByLocalConfig( - "http://test.com?event1=true", invalidDebugToken, cancelConfig, "customerId", "secretKey", - requestMock) + "http://test.com?event1=true", invalidDebugToken, cancelConfig, "customerId", "secretKey") - assert( "https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl ) - assert( requestMock.cookie_jar.length == 0 ) + assert("https://customerId.api2.queue-it.net/customerId/diagnostics/connector/error/?code=hash" == result.redirectUrl) + assert(httpContextMock.cookieManager.cookieList.length == 0) end - def test_CancelRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie - userInQueueService = UserInQueueServiceMock.new + def test_CancelRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - + cancelConfig = CancelEventConfig.new cancelConfig.eventId = "eventId" cancelConfig.queueDomain = "queueDomain" @@ -1773,43 +1847,46 @@ def test_CancelRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie cancelConfig.cookieDomain = "cookieDomain" cancelConfig.actionName = "CancelAction" - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } - userInQueueService.validateCancelRequestRaiseException = true + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) + + userInQueueService.validateCancelRequestRaiseException = true begin - result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey", HttpRequestMock.new) + result = KnownUser.cancelRequestByLocalConfig("targetUrl", "token", cancelConfig, "customerId", "secretKey") rescue Exception => e assert(e.message == "Exception") - end - assert( requestMock.cookie_jar.length == 0 ) - assert( userInQueueService.validateCancelRequestCalls.length > 0 ) + end + assert(httpContextMock.cookieManager.cookieList.length == 0) + assert(userInQueueService.validateCancelRequestCalls.length > 0) end - def test_ValidateRequestByIntegrationConfig_Exception_NoDebugToken_NoDebugCookie - userInQueueService = UserInQueueServiceMock.new + def test_ValidateRequestByIntegrationConfig_Exception_NoDebugToken_NoDebugCookie + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - integrationConfig = + integrationConfig = { :Description => "test", - :Integrations => + :Integrations => [ { :Name => "event1action", :ActionType => "Cancel", :EventId => "event1", :CookieDomain => ".test.com", - :Triggers => + :Triggers => [ { - :TriggerParts => + :TriggerParts => [ { :Operator => "Contains", @@ -1823,7 +1900,7 @@ def test_ValidateRequestByIntegrationConfig_Exception_NoDebugToken_NoDebugCookie :LogicalOperator => "And" } ], - :QueueDomain => "knownusertest.queue-it.net", + :QueueDomain => "knownusertest.queue-it.net", } ], :CustomerId => "knownusertest", @@ -1833,32 +1910,35 @@ def test_ValidateRequestByIntegrationConfig_Exception_NoDebugToken_NoDebugCookie :ConfigDataVersion => "1.0.0.1" } - integrationConfigJson = JSON.generate(integrationConfig) + integrationConfigJson = JSON.generate(integrationConfig) - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } - userInQueueService.validateCancelRequestRaiseException = true + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) + + userInQueueService.validateCancelRequestRaiseException = true begin - result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey", requestMock) + result = KnownUser.validateRequestByIntegrationConfig("http://test.com?event1=true", "queueIttoken", integrationConfigJson, "customerid", "secretkey") rescue Exception => e assert(e.message == "Exception") - end - assert( requestMock.cookie_jar.length == 0 ) - assert( userInQueueService.validateCancelRequestCalls.length > 0 ) + end + assert(httpContextMock.cookieManager.cookieList.length == 0) + assert(userInQueueService.validateCancelRequestCalls.length > 0) end - def test_ResolveQueueRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie - userInQueueService = UserInQueueServiceMock.new + def test_ResolveQueueRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie + userInQueueService = UserInQueueServiceMock.new KnownUser.class_variable_set(:@@userInQueueService, userInQueueService) - + queueConfig = QueueEventConfig.new queueConfig.cookieDomain = "cookieDomain" queueConfig.layoutName = "layoutName" @@ -1868,26 +1948,29 @@ def test_ResolveQueueRequestByLocalConfig_Exception_NoDebugToken_NoDebugCookie queueConfig.extendCookieValidity = true queueConfig.cookieValidityMinute = 10 queueConfig.version = 12 - queueConfig.actionName = "QueueAction" - - requestMock = HttpRequestMock.new - requestMock.setRealOriginalUrl("http", "localhost", "/original_url") - requestMock.cookie_jar = {} - requestMock.remote_ip = "userIP" - requestMock.headers = { - "via" => "v", - "forwarded" => "f", + queueConfig.actionName = "QueueAction" + + httpContextMock = HttpContextMock.new + httpContextMock.url = "http://localhost/original_url" + httpContextMock.cookieManager = CookieManagerMock.new + httpContextMock.userHostAddress = "userIP" + httpContextMock.headers = { + "via" => "v", + "forwarded" => "f", "x-forwarded-for" => "xff", - "x-forwarded-host" => "xfh", - "x-forwarded-proto" => "xfp" } - userInQueueService.validateQueueRequestRaiseException = true + "x-forwarded-host" => "xfh", + "x-forwarded-proto" => "xfp" + } + HttpContextProvider.setHttpContext(httpContextMock) + + userInQueueService.validateQueueRequestRaiseException = true begin - result = KnownUser.resolveQueueRequestByLocalConfig("target", "token", queueConfig, "id", "key", requestMock) + result = KnownUser.resolveQueueRequestByLocalConfig("target", "token", queueConfig, "id", "key") rescue Exception => e assert(e.message == "Exception") - end - assert( requestMock.cookie_jar.length == 0 ) - assert( userInQueueService.validateQueueRequestCalls.length > 0 ) + end + assert(httpContextMock.cookieManager.cookieList.length == 0) + assert(userInQueueService.validateQueueRequestCalls.length > 0) end end end diff --git a/test/queueit_knownuserv3/test_user_in_queue_service.rb b/test/queueit_knownuserv3/test_user_in_queue_service.rb index a72056c..d5b1b89 100644 --- a/test/queueit_knownuserv3/test_user_in_queue_service.rb +++ b/test/queueit_knownuserv3/test_user_in_queue_service.rb @@ -22,12 +22,14 @@ def initialize() } end - def store(eventId, queueId, fixedCookieValidityMinutes, cookieDomain, redirectType, secretKey) + def store(eventId, queueId, fixedCookieValidityMinutes, cookieDomain, isCookieHttpOnly, isCookieSecure, redirectType, secretKey) arrayFunctionCallsArgs['store'].push([ eventId, queueId, fixedCookieValidityMinutes, cookieDomain, + isCookieHttpOnly, + isCookieSecure, redirectType, secretKey ]) @@ -43,8 +45,8 @@ def getState(eventId, cookieValidityMinutes, secretKey, validateTime) return arrayReturns['getState'][arrayFunctionCallsArgs['getState'].length - 1] end - def cancelQueueCookie(eventId, cookieDomain) - arrayFunctionCallsArgs['cancelQueueCookie'].push([eventId, cookieDomain]) + def cancelQueueCookie(eventId, cookieDomain, isCookieHttpOnly, isCookieSecure) + arrayFunctionCallsArgs['cancelQueueCookie'].push([eventId, cookieDomain, isCookieHttpOnly, isCookieSecure]) end def reissueQueueCookie(eventId, cookieValidityMinutes, cookieDomain, secretKey) @@ -107,6 +109,8 @@ def test_ValidateQueueRequest_ValidState_ExtendableCookie_CookieExtensionFromCon queueConfig.eventId = "e1" queueConfig.queueDomain = "testDomain.com" queueConfig.cookieDomain = "testDomain" + queueConfig.isCookieHttpOnly = false + queueConfig.isCookieSecure = false queueConfig.cookieValidityMinute=10 queueConfig.extendCookieValidity=true queueConfig.actionName = "QueueAction" @@ -119,7 +123,7 @@ def test_ValidateQueueRequest_ValidState_ExtendableCookie_CookieExtensionFromCon assert(result.eventId == 'e1') assert(result.queueId == "queueId") assert(result.actionName == queueConfig.actionName) - assert(cookieProviderMock.expectCall('store', 1, ["e1", 'queueId', nil, 'testDomain', "disabled", "key"])) + assert(cookieProviderMock.expectCall('store', 1, ["e1", 'queueId', nil, 'testDomain', false, false, "disabled", "key"])) assert(!cookieProviderMock.expectCallAny('cancelQueueCookie')) end @@ -257,6 +261,8 @@ def test_ValidateQueueRequest_NoCookie_ValidToken_ExtendableCookie_DoNotRedirect queueConfig.queueDomain = "testDomain.com" queueConfig.cookieValidityMinute = 10 queueConfig.cookieDomain = "testDomain" + queueConfig.isCookieHttpOnly = false + queueConfig.isCookieSecure = false queueConfig.extendCookieValidity = true queueConfig.version = 11 queueConfig.actionName = "QueueAction" @@ -272,7 +278,7 @@ def test_ValidateQueueRequest_NoCookie_ValidToken_ExtendableCookie_DoNotRedirect assert(result.queueId == 'queueId') assert(result.redirectType == 'queue') assert(result.actionName == queueConfig.actionName) - assert(cookieProviderMock.expectCall('store', 1, ["e1", 'queueId', nil, 'testDomain', 'queue', key])) + assert(cookieProviderMock.expectCall('store', 1, ["e1", 'queueId', nil, 'testDomain', false, false, 'queue', key])) assert(!cookieProviderMock.expectCallAny('cancelQueueCookie')) end @@ -283,6 +289,8 @@ def test_ValidateQueueRequest_NoCookie_ValidToken_CookieValidityMinuteFromToken_ queueConfig.queueDomain = "testDomain.com" queueConfig.cookieValidityMinute = 30 queueConfig.cookieDomain = "testDomain" + queueConfig.isCookieHttpOnly = false + queueConfig.isCookieSecure = false queueConfig.extendCookieValidity = true queueConfig.version = 11 queueConfig.actionName = "QueueAction" @@ -297,7 +305,7 @@ def test_ValidateQueueRequest_NoCookie_ValidToken_CookieValidityMinuteFromToken_ assert(result.queueId == 'queueId') assert(result.redirectType == 'DirectLink') assert(result.actionName == queueConfig.actionName) - assert(cookieProviderMock.expectCall('store', 1, ["e1",'queueId', 3, 'testDomain', 'DirectLink', key])) + assert(cookieProviderMock.expectCall('store', 1, ["e1",'queueId', 3, 'testDomain', false, false, 'DirectLink', key])) assert(!cookieProviderMock.expectCallAny('cancelQueueCookie')) end @@ -463,18 +471,24 @@ def test_validateCancelRequest cancelConfig.eventId = "e1" cancelConfig.queueDomain = "testDomain.com" cancelConfig.cookieDomain = "my-cookie-domain"; + cancelConfig.isCookieHttpOnly = false + cancelConfig.isCookieSecure = false cancelConfig.version = 10 cancelConfig.actionName = "Cancel Action (._~-&) !*|'\"" url = "http://test.test.com?b=h" cookieProviderMock = UserInQueueStateRepositoryMockClass.new() cookieProviderMock.arrayReturns['getState'].push(StateInfo.new(true, true, "queueId", 3, "idle")) - expectedUrl = "https://testDomain.com/cancel/testCustomer/e1/?c=testCustomer&e=e1&ver=" + UserInQueueService::SDK_VERSION + - "&cver=10&man=" + "Cancel%20Action%20%28._~-%26%29%20%21%2A%7C%27%22" + - "&r=" + Utils.urlEncode(url); + expectedUrl = "https://testDomain.com/cancel/testCustomer/e1/queueId?" + + "c=testCustomer" + + "&e=e1" + + "&ver=" + UserInQueueService::SDK_VERSION + + "&cver=10" + + "&man=" + "Cancel%20Action%20%28._~-%26%29%20%21%2A%7C%27%22" + + "&r=" + Utils.urlEncode(url); testObject = UserInQueueService.new(cookieProviderMock) result = testObject.validateCancelRequest(url, cancelConfig, "testCustomer", "key") - assert(cookieProviderMock.expectCall('cancelQueueCookie', 1,["e1", 'my-cookie-domain'])) + assert(cookieProviderMock.expectCall('cancelQueueCookie', 1,["e1", 'my-cookie-domain', false, false])) assert(result.doRedirect()) assert(result.queueId == "queueId") assert(result.eventId == 'e1') diff --git a/test/queueit_knownuserv3/test_user_in_queue_state_cookie_repository.rb b/test/queueit_knownuserv3/test_user_in_queue_state_cookie_repository.rb index ac81f32..e1f55cc 100644 --- a/test/queueit_knownuserv3/test_user_in_queue_state_cookie_repository.rb +++ b/test/queueit_knownuserv3/test_user_in_queue_state_cookie_repository.rb @@ -2,8 +2,8 @@ require_relative '../../lib/queueit_knownuserv3' module QueueIt - class CookieManagerMockClass - attr_reader :cookieList + class CookieManagerMock + attr_accessor :cookieList attr_reader :setCookieCalls attr_reader :getCookieCalls @@ -13,22 +13,26 @@ def initialize() @getCookieCalls = Hash.new end - def setCookie(cookieName, value, expire, domain) + def setCookie(cookieName, value, expire, domain, isHttpOnly, isSecure) @cookieList[cookieName] = { "name" => cookieName, "value" => value, "expiration" => expire, - "cookieDomain" => domain + "cookieDomain" => domain, + "isHttpOnly" => isHttpOnly, + "isSecure" => isSecure } @setCookieCalls[@setCookieCalls.length] = { "name" => cookieName, "value" => value, "expiration" => expire, - "cookieDomain" => domain + "cookieDomain" => domain, + "isHttpOnly" => isHttpOnly, + "isSecure" => isSecure } end - def getCookie(cookieName) + def getCookie(cookieName) @getCookieCalls[@getCookieCalls.length] = cookieName if(!@cookieList.key?(cookieName)) return nil @@ -46,12 +50,14 @@ def test_store_hasValidState_ExtendableCookie_CookieIsSaved() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = true + isCookieSecure = true queueId = "queueId" cookieValidity = 10 cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, nil, cookieDomain, "Queue", secretKey) + testObject.store(eventId, queueId, nil, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) assert(state.queueId == queueId) @@ -59,18 +65,22 @@ def test_store_hasValidState_ExtendableCookie_CookieIsSaved() assert(state.redirectType == 'Queue') assert(((cookieManager.cookieList[cookieKey]["expiration"]).to_i - Time.now.getutc.to_i - 24 * 60 * 60).abs < 100) assert(cookieManager.cookieList[cookieKey]["cookieDomain"] == cookieDomain) + assert(cookieManager.cookieList[cookieKey]["isHttpOnly"] == isCookieHttpOnly) + assert(cookieManager.cookieList[cookieKey]["isSecure"] == isCookieSecure) end - + def test_store_hasValidState_nonExtendableCookie_CookieIsSaved() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = true + isCookieSecure = true queueId = "queueId" cookieValidity = 3 cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, cookieValidity, cookieDomain, "Idle", secretKey) + testObject.store(eventId, queueId, cookieValidity, cookieDomain, isCookieHttpOnly, isCookieSecure, "Idle", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) assert(state.queueId == queueId) @@ -79,19 +89,23 @@ def test_store_hasValidState_nonExtendableCookie_CookieIsSaved() assert(state.fixedCookieValidityMinutes == 3) oldCookieValue = cookieManager.cookieList[cookieKey]["value"] assert(((cookieManager.cookieList[cookieKey]["expiration"]).to_i - Time.now.getutc.to_i - 24 * 60 * 60).abs < 100) - assert(cookieManager.cookieList[cookieKey]["cookieDomain"] == cookieDomain) + assert(cookieManager.cookieList[cookieKey]["cookieDomain"] == cookieDomain) + assert(cookieManager.cookieList[cookieKey]["isHttpOnly"] == isCookieHttpOnly) + assert(cookieManager.cookieList[cookieKey]["isSecure"] == isCookieSecure) end - + def test_store_hasValidState_tamperedCookie_stateIsNotValid_isCookieExtendable() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieValidity = 10 cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, 3, cookieDomain, "Idle", secretKey) + testObject.store(eventId, queueId, 3, cookieDomain, isCookieHttpOnly, isCookieSecure, "Idle", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) oldCookieValue = cookieManager.cookieList[cookieKey]["value"] @@ -100,18 +114,20 @@ def test_store_hasValidState_tamperedCookie_stateIsNotValid_isCookieExtendable() assert(!state2.isValid) assert(!state2.isStateExtendable) end - + def test_store_hasValidState_tamperedCookie_stateIsNotValid_eventId() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieValidity = 10 cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - - testObject.store(eventId, queueId, 3, cookieDomain, "Idle", secretKey) + + testObject.store(eventId, queueId, 3, cookieDomain, isCookieHttpOnly, isCookieSecure, "Idle", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) @@ -121,126 +137,153 @@ def test_store_hasValidState_tamperedCookie_stateIsNotValid_eventId() assert(!state2.isValid) assert(!state2.isStateExtendable) end - + def test_store_hasValidState_expiredCookie_stateIsNotValid() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieValidity = -1 - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, nil, cookieDomain, "Idle", secretKey) + testObject.store(eventId, queueId, nil, cookieDomain, isCookieHttpOnly, isCookieSecure, "Idle", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(!state.isValid) end - + def test_store_hasValidState_differentEventId_stateIsNotValid() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieValidity = 10 - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, nil, cookieDomain, "Queue", secretKey) + testObject.store(eventId, queueId, nil, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) state2 = testObject.getState("event2", cookieValidity, secretKey, true) assert(!state2.isValid) end - + def test_hasValidState_noCookie_stateIsNotValid() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" queueId = "queueId" cookieValidity = 10 - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) state = testObject.getState(eventId, cookieValidity, secretKey, true) - assert(!state.isValid) + assert(!state.isValid) end - + def test_hasValidState_invalidCookie_stateIsNotValid() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) cookieValidity = 10 - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, 20, cookieDomain, "Queue", secretKey) + testObject.store(eventId, queueId, 20, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) cookieManager.cookieList[cookieKey]["value"] = "IsCookieExtendable=ooOOO&Expires=|||&QueueId=000&Hash=23232" state2 = testObject.getState(eventId, cookieValidity, secretKey, true) assert(!state2.isValid) end - + def test_cancelQueueCookie() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieValidity = 20 - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, 20, cookieDomain, "Queue", secretKey) + testObject.store(eventId, queueId, 20, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) state = testObject.getState(eventId, cookieValidity, secretKey, true) assert(state.isValid) - testObject.cancelQueueCookie(eventId, cookieDomain) + testObject.cancelQueueCookie(eventId, cookieDomain, isCookieHttpOnly, isCookieSecure) state2 = testObject.getState(eventId, cookieValidity, secretKey, true) assert(!state2.isValid) assert((cookieManager.setCookieCalls[1]["expiration"]).to_i == -1) assert(cookieManager.setCookieCalls[1]["cookieDomain"] == cookieDomain) assert(cookieManager.setCookieCalls[1]["value"].nil?) end - + def test_extendQueueCookie_cookieExist() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = true + isCookieSecure = true queueId = "queueId" + cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store(eventId, queueId, nil, cookieDomain, "Queue", secretKey) - testObject.reissueQueueCookie(eventId, 12, cookieDomain, secretKey) + + testObject.store(eventId, queueId, nil, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) + testObject.reissueQueueCookie(eventId, 12, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) + state = testObject.getState(eventId, 5, secretKey, true) + assert(state.isValid) assert(state.queueId == queueId) assert(state.isStateExtendable) assert(((cookieManager.cookieList[cookieKey]["expiration"]).to_i - Time.now.getutc.to_i - 24 * 60 * 60).abs < 100) assert(cookieManager.cookieList[cookieKey]["cookieDomain"] == cookieDomain) + assert(cookieManager.cookieList[cookieKey]["isHttpOnly"] == isCookieHttpOnly) + assert(cookieManager.cookieList[cookieKey]["isSecure"] == isCookieSecure) end - + def test_extendQueueCookie_cookieDoesNotExist() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - testObject.store("event2", queueId, 20, cookieDomain, "Queue", secretKey) - testObject.reissueQueueCookie(eventId, 12, cookieDomain, secretKey) + testObject.store("event2", queueId, 20, cookieDomain, isCookieHttpOnly, isCookieSecure, "Queue", secretKey) + testObject.reissueQueueCookie(eventId, 12, cookieDomain, isCookieHttpOnly, isCookieSecure, secretKey) assert(cookieManager.setCookieCalls.length == 1) end - + def test_getState_validCookieFormat_extendable() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) issueTime = Time.now.getutc.tv_sec.to_s hash = generateHash(eventId, queueId, nil, "queue", issueTime, secretKey) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - cookieManager.setCookie(cookieKey, "EventId="+eventId+"&QueueId="+queueId+"&RedirectType=queue&IssueTime="+issueTime+"&Hash="+hash, Time.now + (24*60*60), cookieDomain) + cookieManager.setCookie( + cookieKey, + "EventId="+eventId+"&QueueId="+queueId+"&RedirectType=queue&IssueTime="+issueTime+"&Hash="+hash, + Time.now + (24*60*60), + cookieDomain, + isCookieHttpOnly, + isCookieSecure) + state = testObject.getState(eventId, 10, secretKey, true) assert(state.isStateExtendable) @@ -248,56 +291,83 @@ def test_getState_validCookieFormat_extendable() assert(state.queueId == queueId) assert(state.redirectType == "queue") end - + def test_getState_oldCookie_invalid_expiredCookie_extendable() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - issueTime = (Time.now.getutc.tv_sec - (11*60)).to_s + issueTime = (Time.now.getutc.tv_sec - (11*60)).to_s hash = generateHash(eventId, queueId, nil, "queue", issueTime, secretKey) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - cookieManager.setCookie(cookieKey, "EventId="+eventId+"&QueueId="+queueId+"&RedirectType=queue&IssueTime="+issueTime+"&Hash="+hash, Time.now + (24*60*60), cookieDomain) + cookieManager.setCookie( + cookieKey, + "EventId="+eventId+"&QueueId="+queueId+"&RedirectType=queue&IssueTime="+issueTime+"&Hash="+hash, + Time.now + (24*60*60), + cookieDomain, + isCookieHttpOnly, + isCookieSecure) + state = testObject.getState(eventId, 10, secretKey, true) assert(!state.isValid) end - + def test_getState_oldCookie_invalid_expiredCookie_nonExtendable() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - issueTime = (Time.now.getutc.tv_sec - (4*60)).to_s + issueTime = (Time.now.getutc.tv_sec - (4*60)).to_s hash = generateHash(eventId, queueId, 3, "idle", issueTime, secretKey) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - cookieManager.setCookie(cookieKey, "EventId="+eventId+"&QueueId="+queueId+"&FixedValidityMins=3&RedirectType=idle&IssueTime="+issueTime+"&Hash="+hash, Time.now + (24*60*60), cookieDomain) + cookieManager.setCookie( + cookieKey, + "EventId="+eventId+"&QueueId="+queueId+"&FixedValidityMins=3&RedirectType=idle&IssueTime="+issueTime+"&Hash="+hash, + Time.now + (24*60*60), + cookieDomain, + isCookieHttpOnly, + isCookieSecure) + state = testObject.getState(eventId, 10, secretKey, true) assert(!state.isValid) end - + def test_getState_validCookieFormat_nonExtendable() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" cookieDomain = ".test.com" + isCookieHttpOnly = false + isCookieSecure = false queueId = "queueId" cookieKey = UserInQueueStateCookieRepository::getCookieKey(eventId) - issueTime = Time.now.getutc.tv_sec.to_s + issueTime = Time.now.getutc.tv_sec.to_s hash = generateHash(eventId, queueId, 3, "idle", issueTime, secretKey) - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) - cookieManager.setCookie(cookieKey, "EventId="+eventId+"&QueueId="+queueId+"&FixedValidityMins=3&RedirectType=idle&IssueTime="+issueTime+"&Hash="+hash, Time.now + (24*60*60), cookieDomain) + cookieManager.setCookie( + cookieKey, + "EventId="+eventId+"&QueueId="+queueId+"&FixedValidityMins=3&RedirectType=idle&IssueTime="+issueTime+"&Hash="+hash, + Time.now + (24*60*60), + cookieDomain, + isCookieHttpOnly, + isCookieSecure) + state = testObject.getState(eventId, 10, secretKey, true) assert(!state.isStateExtendable) @@ -310,12 +380,12 @@ def test_getState_noCookie() eventId = "event1" secretKey = "4e1deweb821-a82ew5-49da-acdqq0-5d3476f2068db" - cookieManager = CookieManagerMockClass.new() + cookieManager = CookieManagerMock.new() testObject = UserInQueueStateCookieRepository.new(cookieManager) state = testObject.getState(eventId, 10, secretKey, true) assert(!state.isFound) - assert(!state.isValid) + assert(!state.isValid) end end end \ No newline at end of file