Skip to content

Commit c240f1d

Browse files
committed
Release 3.6.0
1 parent 53889da commit c240f1d

13 files changed

+813
-310
lines changed

SDK/_run_all_tests.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1+
import sys
12
import unittest
23

34
suite = unittest.TestLoader().discover("")
4-
unittest.TextTestRunner(verbosity=1).run(suite)
5+
result = unittest.TextTestRunner(verbosity=1).run(suite)
6+
7+
if(result.wasSuccessful()):
8+
sys.exit(0)
9+
else:
10+
sys.exit(1)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
from queue_url_params import QueueUrlParams
2+
from models import RequestValidationResult, Utils
3+
from queueit_helpers import QueueitHelpers
4+
5+
class ConnectorDiagnostics:
6+
def __init__(self):
7+
self.isEnabled = False
8+
self.hasError = False
9+
self.validationResult = RequestValidationResult(None, None, None, None, None, None)
10+
11+
def __setStateWithTokenError(self, customerId, errorCode):
12+
self.hasError = True
13+
redirectUrl = "https://{0}.api2.queue-it.net/{0}/diagnostics/connector/error/?code={1}".format(customerId, errorCode)
14+
self.validationResult = RequestValidationResult("ConnectorDiagnosticsRedirect",
15+
None, None, redirectUrl, None, None)
16+
17+
def __setStateWithSetupError(self):
18+
self.hasError = True
19+
redirectUrl = "https://api2.queue-it.net/diagnostics/connector/error/?code=setup"
20+
self.validationResult = RequestValidationResult("ConnectorDiagnosticsRedirect",
21+
None, None, redirectUrl, None, None)
22+
23+
@staticmethod
24+
def verify(customerId, secretKey, queueitToken):
25+
diagnostics = ConnectorDiagnostics()
26+
qParams = QueueUrlParams.extractQueueParams(queueitToken)
27+
28+
if(qParams == None):
29+
return diagnostics
30+
31+
if(qParams.redirectType == None):
32+
return diagnostics
33+
34+
if(qParams.redirectType != "debug"):
35+
return diagnostics
36+
37+
if(Utils.isNilOrEmpty(customerId) or Utils.isNilOrEmpty(secretKey)):
38+
diagnostics.__setStateWithSetupError()
39+
return diagnostics
40+
41+
calculatedHash = QueueitHelpers.hmacSha256Encode(qParams.queueITTokenWithoutHash, secretKey)
42+
if(qParams.hashCode != calculatedHash):
43+
diagnostics.__setStateWithTokenError(customerId, "hash")
44+
return diagnostics
45+
46+
if(qParams.timeStamp < QueueitHelpers.getCurrentTime()):
47+
diagnostics.__setStateWithTokenError(customerId, "timestamp")
48+
return diagnostics
49+
50+
diagnostics.isEnabled = True
51+
return diagnostics
52+

SDK/queueit_knownuserv3/integration_config_helpers.py

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -188,12 +188,6 @@ def evaluate(opt, isNegative, ignoreCase, value, valueToCompare,
188188
if (opt == "Contains"):
189189
return ComparisonOperatorHelper.contains(value, valueToCompare,
190190
isNegative, ignoreCase)
191-
if (opt == "StartsWith"):
192-
return ComparisonOperatorHelper.startsWith(value, valueToCompare,
193-
isNegative, ignoreCase)
194-
if (opt == "EndsWith"):
195-
return ComparisonOperatorHelper.endsWith(value, valueToCompare,
196-
isNegative, ignoreCase)
197191
if (opt == "EqualsAny"):
198192
return ComparisonOperatorHelper.equalsAny(value, valuesToCompare,
199193
isNegative, ignoreCase)
@@ -217,7 +211,7 @@ def equals(value, valueToCompare, isNegative, ignoreCase):
217211

218212
@staticmethod
219213
def contains(value, valueToCompare, isNegative, ignoreCase):
220-
if (valueToCompare == "*"):
214+
if (valueToCompare == "*" and value != ''):
221215
return True
222216

223217
if (ignoreCase):
@@ -230,30 +224,6 @@ def contains(value, valueToCompare, isNegative, ignoreCase):
230224
else:
231225
return evaluation
232226

233-
@staticmethod
234-
def startsWith(value, valueToCompare, isNegative, ignoreCase):
235-
if (ignoreCase):
236-
evaluation = value.upper().startswith(valueToCompare.upper())
237-
else:
238-
evaluation = value.startswith(valueToCompare)
239-
240-
if (isNegative):
241-
return not evaluation
242-
else:
243-
return evaluation
244-
245-
@staticmethod
246-
def endsWith(value, valueToCompare, isNegative, ignoreCase):
247-
if (ignoreCase):
248-
evaluation = value.upper().endswith(valueToCompare.upper())
249-
else:
250-
evaluation = value.endswith(valueToCompare)
251-
252-
if (isNegative):
253-
return not evaluation
254-
else:
255-
return evaluation
256-
257227
@staticmethod
258228
def equalsAny(value, valuesToCompare, isNegative, ignoreCase):
259229
for valueToCompare in valuesToCompare:

SDK/queueit_knownuserv3/known_user.py

Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
from models import Utils, KnownUserError, ActionTypes, RequestValidationResult, QueueEventConfig, CancelEventConfig
55
from integration_config_helpers import IntegrationEvaluator
66
from queue_url_params import QueueUrlParams
7-
7+
from connector_diagnostics import ConnectorDiagnostics
8+
import json
9+
import sys
810

911
class KnownUser:
1012
QUEUEIT_TOKEN_KEY = "queueittoken"
@@ -55,24 +57,6 @@ def __logMoreRequestDetails(debugEntries, httpContextProvider):
5557
"RequestHttpHeader_XForwardedProto"] = httpContextProvider.getHeader(
5658
"x-forwarded-proto")
5759

58-
@staticmethod
59-
def __getIsDebug(queueitToken, secretKey):
60-
qParams = QueueUrlParams.extractQueueParams(queueitToken)
61-
if (qParams == None):
62-
return False
63-
64-
redirectType = qParams.redirectType
65-
if (redirectType == None):
66-
return False
67-
68-
if (redirectType.upper() == "DEBUG"):
69-
calculatedHash = QueueitHelpers.hmacSha256Encode(
70-
qParams.queueITTokenWithoutHash, secretKey)
71-
valid = qParams.hashCode == calculatedHash
72-
return valid
73-
74-
return False
75-
7660
@staticmethod
7761
def __setDebugCookie(debugEntries, httpContextProvider):
7862
if (debugEntries == None or len(debugEntries) == 0):
@@ -85,13 +69,18 @@ def __setDebugCookie(debugEntries, httpContextProvider):
8569
cookieValue = cookieValue.strip('|')
8670
httpContextProvider.setCookie(KnownUser.QUEUEIT_DEBUG_KEY, cookieValue,
8771
None, None)
72+
@staticmethod
73+
def __getRunTime():
74+
return sys.version
8875

8976
@staticmethod
9077
def __resolveQueueRequestByLocalConfig(targetUrl, queueitToken,
9178
queueConfig, customerId, secretKey,
92-
httpContextProvider, debugEntries):
93-
isDebug = KnownUser.__getIsDebug(queueitToken, secretKey)
79+
httpContextProvider, debugEntries, isDebug):
9480
if (isDebug):
81+
debugEntries["SdkVersion"] = UserInQueueService.SDK_VERSION
82+
debugEntries["Connector"] = httpContextProvider.getProviderName()
83+
debugEntries["Runtime"] = KnownUser.__getRunTime()
9584
debugEntries["TargetUrl"] = targetUrl
9685
debugEntries["QueueitToken"] = queueitToken
9786
debugEntries[
@@ -141,11 +130,13 @@ def __resolveQueueRequestByLocalConfig(targetUrl, queueitToken,
141130
@staticmethod
142131
def __cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig,
143132
customerId, secretKey,
144-
httpContextProvider, debugEntries):
145-
targetUrl = KnownUser.__generateTargetUrl(targetUrl,
146-
httpContextProvider)
147-
isDebug = KnownUser.__getIsDebug(queueitToken, secretKey)
133+
httpContextProvider, debugEntries, isDebug):
134+
targetUrl = KnownUser.__generateTargetUrl(targetUrl, httpContextProvider)
135+
148136
if (isDebug):
137+
debugEntries["SdkVersion"] = UserInQueueService.SDK_VERSION
138+
debugEntries["Connector"] = httpContextProvider.getProviderName()
139+
debugEntries["Runtime"] = KnownUser.__getRunTime()
149140
debugEntries["TargetUrl"] = targetUrl
150141
debugEntries["QueueitToken"] = queueitToken
151142
debugEntries[
@@ -188,13 +179,14 @@ def __cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig,
188179
@staticmethod
189180
def __handleQueueAction(currentUrlWithoutQueueITToken, queueitToken,
190181
customerIntegration, customerId, secretKey,
191-
matchedConfig, httpContextProvider, debugEntries):
182+
matchedConfig, httpContextProvider, debugEntries, isDebug):
192183
queueConfig = QueueEventConfig()
193184
queueConfig.eventId = matchedConfig["EventId"]
194185
queueConfig.queueDomain = matchedConfig["QueueDomain"]
195186
queueConfig.layoutName = matchedConfig["LayoutName"]
196187
queueConfig.culture = matchedConfig["Culture"]
197188
queueConfig.cookieDomain = matchedConfig["CookieDomain"]
189+
queueConfig.actionName = matchedConfig["Name"]
198190
queueConfig.extendCookieValidity = matchedConfig[
199191
"ExtendCookieValidity"]
200192
queueConfig.cookieValidityMinute = matchedConfig[
@@ -213,21 +205,22 @@ def __handleQueueAction(currentUrlWithoutQueueITToken, queueitToken,
213205

214206
return KnownUser.__resolveQueueRequestByLocalConfig(
215207
targetUrl, queueitToken, queueConfig, customerId, secretKey,
216-
httpContextProvider, debugEntries)
208+
httpContextProvider, debugEntries, isDebug)
217209

218210
@staticmethod
219211
def __handleCancelAction(currentUrlWithoutQueueITToken, queueitToken,
220212
customerIntegration, customerId, secretKey,
221-
matchedConfig, httpContextProvider, debugEntries):
213+
matchedConfig, httpContextProvider, debugEntries, isDebug):
222214
cancelConfig = CancelEventConfig()
223215
cancelConfig.eventId = matchedConfig["EventId"]
224216
cancelConfig.queueDomain = matchedConfig["QueueDomain"]
225217
cancelConfig.cookieDomain = matchedConfig["CookieDomain"]
226218
cancelConfig.version = customerIntegration["Version"]
219+
cancelConfig.actionName = matchedConfig["Name"]
227220

228221
return KnownUser.__cancelRequestByLocalConfig(
229222
currentUrlWithoutQueueITToken, queueitToken, cancelConfig,
230-
customerId, secretKey, httpContextProvider, debugEntries)
223+
customerId, secretKey, httpContextProvider, debugEntries, isDebug)
231224

232225
@staticmethod
233226
def extendQueueCookie(eventId, cookieValidityMinute, cookieDomain,
@@ -253,12 +246,19 @@ def resolveQueueRequestByLocalConfig(targetUrl, queueitToken, queueConfig,
253246
customerId, secretKey,
254247
httpContextProvider):
255248
debugEntries = {}
249+
connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken)
250+
if (connectorDiagnostics.hasError):
251+
return connectorDiagnostics.validationResult
256252
try:
257253
targetUrl = KnownUser.__generateTargetUrl(targetUrl,
258254
httpContextProvider)
259255
return KnownUser.__resolveQueueRequestByLocalConfig(
260256
targetUrl, queueitToken, queueConfig, customerId, secretKey,
261-
httpContextProvider, debugEntries)
257+
httpContextProvider, debugEntries, connectorDiagnostics.isEnabled)
258+
except Exception as e:
259+
if (connectorDiagnostics.isEnabled):
260+
debugEntries["Exception"] = e.message
261+
raise e
262262
finally:
263263
KnownUser.__setDebugCookie(debugEntries, httpContextProvider)
264264

@@ -267,65 +267,67 @@ def validateRequestByIntegrationConfig(
267267
currentUrlWithoutQueueITToken, queueitToken,
268268
integrationsConfigString, customerId, secretKey,
269269
httpContextProvider):
270-
if (Utils.isNilOrEmpty(currentUrlWithoutQueueITToken)):
271-
raise KnownUserError(
272-
"currentUrlWithoutQueueITToken can not be none or empty.")
273-
274-
if (Utils.isNilOrEmpty(integrationsConfigString)):
275-
raise KnownUserError(
276-
"integrationsConfigString can not be none or empty.")
277270

278271
debugEntries = {}
272+
customerIntegration = None
273+
connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken)
274+
if (connectorDiagnostics.hasError):
275+
return connectorDiagnostics.validationResult
279276
try:
280-
customerIntegration = QueueitHelpers.jsonParse(
281-
integrationsConfigString)
282-
283-
isDebug = KnownUser.__getIsDebug(queueitToken, secretKey)
284-
if (isDebug):
285-
debugEntries["ConfigVersion"] = customerIntegration["Version"]
277+
if (connectorDiagnostics.isEnabled):
278+
debugEntries["SdkVersion"] = UserInQueueService.SDK_VERSION
279+
debugEntries["Connector"] = httpContextProvider.getProviderName()
280+
debugEntries["Runtime"] = KnownUser.__getRunTime()
286281
debugEntries["PureUrl"] = currentUrlWithoutQueueITToken
287282
debugEntries["QueueitToken"] = queueitToken
288-
debugEntries[
289-
"OriginalUrl"] = httpContextProvider.getOriginalRequestUrl(
290-
)
291-
KnownUser.__logMoreRequestDetails(debugEntries,
292-
httpContextProvider)
293-
283+
debugEntries["OriginalUrl"] = httpContextProvider.getOriginalRequestUrl()
284+
KnownUser.__logMoreRequestDetails(debugEntries, httpContextProvider)
285+
286+
customerIntegration = json.loads(integrationsConfigString)
287+
if (connectorDiagnostics.isEnabled):
288+
debugEntries["ConfigVersion"] = customerIntegration["Version"] if customerIntegration and \
289+
customerIntegration["Version"] else "NULL"
290+
if (Utils.isNilOrEmpty(currentUrlWithoutQueueITToken)):
291+
raise KnownUserError(
292+
"currentUrlWithoutQueueITToken can not be none or empty.")
293+
294+
if (not customerIntegration or not customerIntegration["Version"]):
295+
raise KnownUserError(
296+
"integrationsConfigString can not be none or empty.")
294297
matchedConfig = IntegrationEvaluator().getMatchedIntegrationConfig(
295298
customerIntegration, currentUrlWithoutQueueITToken,
296299
httpContextProvider)
297300

298-
if (isDebug):
301+
if (connectorDiagnostics.isEnabled):
299302
if (matchedConfig == None):
300303
debugEntries["MatchedConfig"] = "NULL"
301304
else:
302305
debugEntries["MatchedConfig"] = matchedConfig["Name"]
303306

304307
if (matchedConfig is None):
305-
return RequestValidationResult(None, None, None, None, None)
308+
return RequestValidationResult(None, None, None, None, None, None)
306309

307310
if (matchedConfig["ActionType"] == ActionTypes.QUEUE):
308311
return KnownUser.__handleQueueAction(
309312
currentUrlWithoutQueueITToken, queueitToken,
310313
customerIntegration, customerId, secretKey, matchedConfig,
311-
httpContextProvider, debugEntries)
314+
httpContextProvider, debugEntries, connectorDiagnostics.isEnabled)
312315
elif (matchedConfig["ActionType"] == ActionTypes.CANCEL):
313316
return KnownUser.__handleCancelAction(
314317
currentUrlWithoutQueueITToken, queueitToken,
315318
customerIntegration, customerId, secretKey, matchedConfig,
316-
httpContextProvider, debugEntries)
319+
httpContextProvider, debugEntries, connectorDiagnostics.isEnabled)
317320
else: # for all unknown types default to 'Ignore'
318321
userInQueueService = KnownUser.__getUserInQueueService(
319-
httpContextProvider)
320-
result = userInQueueService.getIgnoreActionResult()
322+
httpContextProvider)
323+
result = userInQueueService.getIgnoreActionResult(matchedConfig['Name'])
321324
result.isAjaxResult = KnownUser.__isQueueAjaxCall(
322325
httpContextProvider)
323326
return result
324-
325-
except StandardError as stdErr:
326-
raise KnownUserError(
327-
"integrationConfiguration text was not valid: " +
328-
stdErr.message)
327+
except Exception as e:
328+
if (connectorDiagnostics.isEnabled):
329+
debugEntries["Exception"] = e.message
330+
raise e
329331
finally:
330332
KnownUser.__setDebugCookie(debugEntries, httpContextProvider)
331333
pass
@@ -334,9 +336,16 @@ def validateRequestByIntegrationConfig(
334336
def cancelRequestByLocalConfig(targetUrl, queueitToken, cancelConfig,
335337
customerId, secretKey, httpContextProvider):
336338
debugEntries = {}
339+
connectorDiagnostics = ConnectorDiagnostics.verify(customerId, secretKey, queueitToken)
340+
if (connectorDiagnostics.hasError):
341+
return connectorDiagnostics.validationResult
337342
try:
338343
return KnownUser.__cancelRequestByLocalConfig(
339344
targetUrl, queueitToken, cancelConfig, customerId, secretKey,
340-
httpContextProvider, debugEntries)
345+
httpContextProvider, debugEntries, connectorDiagnostics.isEnabled)
346+
except Exception as e:
347+
if (connectorDiagnostics.isEnabled):
348+
debugEntries["Exception"] = e.message
349+
raise e
341350
finally:
342351
KnownUser.__setDebugCookie(debugEntries, httpContextProvider)

0 commit comments

Comments
 (0)