Skip to content

Commit 19deff6

Browse files
author
Dawid Libiszewski
committed
fixes
1 parent dd25f7a commit 19deff6

6 files changed

Lines changed: 242 additions & 26 deletions

File tree

Makefile

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,11 @@ ci-lint: pre-lint lint
2020

2121
pre-lint:
2222
${PIP} install pylint
23-
${PIP} install setuptools-lint
2423
${PIP} install --upgrade pep8
2524
${PIP} install --upgrade autopep8
2625

2726
lint:
28-
${PYTHON} setup.py lint
27+
pylint --rcfile=./pylintrc castle
2928
autopep8 --in-place -r castle
3029

3130
setup:

castle/client.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from castle.api_request import APIRequest
22
from castle.commands.authenticate import CommandsAuthenticate
33
from castle.commands.filter import CommandsFilter
4-
from castle.commands.impersonate import CommandsImpersonate
54
from castle.commands.log import CommandsLog
65
from castle.commands.risk import CommandsRisk
76
from castle.commands.identify import CommandsIdentify
@@ -26,11 +25,11 @@ def from_request(cls, request, options=None):
2625
return cls(options)
2726

2827
@staticmethod
29-
def failover_response_or_raise(options, exception):
28+
def failover_response_or_raise(user_id, exception):
3029
if configuration.failover_strategy == FailoverStrategy.THROW.value:
3130
raise exception
3231
return FailoverPrepareResponse(
33-
options.get('user_id'), None, exception.__class__.__name__
32+
user_id, None, exception.__class__.__name__
3433
).call()
3534

3635
def __init__(self, options=None):
@@ -54,7 +53,7 @@ def authenticate(self, options):
5453
response.update(failover=False, failover_reason=None)
5554
return response
5655
except (RequestError, InternalServerError) as exception:
57-
return Client.failover_response_or_raise(options, exception)
56+
return Client.failover_response_or_raise(options.get('user_id'), exception)
5857
else:
5958
return FailoverPrepareResponse(
6059
options.get('user_id'),
@@ -65,50 +64,50 @@ def authenticate(self, options):
6564
def filter(self, options):
6665
if self.tracked():
6766
self._add_timestamp_if_necessary(options)
68-
command = CommandsFilter(self.context).build(options)
67+
command = CommandsFilter(self.context).call(options)
6968
try:
7069
response = self.api.call(command)
7170
response.update(failover=False, failover_reason=None)
7271
return response
7372
except (RequestError, InternalServerError) as exception:
74-
return Client.failover_response_or_raise(options, exception)
73+
return Client.failover_response_or_raise(options.get('user').get('id'), exception)
7574
else:
76-
return FailoverResponse(
77-
options.get('user_id'),
75+
return FailoverPrepareResponse(
76+
options.get('user').get('id'),
7877
'allow',
7978
'Castle set to do not track.'
8079
).call()
8180

8281
def log(self, options):
8382
if self.tracked():
8483
self._add_timestamp_if_necessary(options)
85-
command = CommandsLog(self.context).build(options)
84+
command = CommandsLog(self.context).call(options)
8685
try:
8786
response = self.api.call(command)
8887
response.update(failover=False, failover_reason=None)
8988
return response
9089
except (RequestError, InternalServerError) as exception:
91-
return Client.failover_response_or_raise(options, exception)
90+
return Client.failover_response_or_raise(options.get('user').get('id'), exception)
9291
else:
93-
return FailoverResponse(
94-
options.get('user_id'),
92+
return FailoverPrepareResponse(
93+
options.get('user').get('id'),
9594
'allow',
9695
'Castle set to do not track.'
9796
).call()
9897

9998
def risk(self, options):
10099
if self.tracked():
101100
self._add_timestamp_if_necessary(options)
102-
command = CommandsRisk(self.context).build(options)
101+
command = CommandsRisk(self.context).call(options)
103102
try:
104103
response = self.api.call(command)
105104
response.update(failover=False, failover_reason=None)
106105
return response
107106
except (RequestError, InternalServerError) as exception:
108-
return Client.failover_response_or_raise(options, exception)
107+
return Client.failover_response_or_raise(options.get('user').get('id'), exception)
109108
else:
110-
return FailoverResponse(
111-
options.get('user_id'),
109+
return FailoverPrepareResponse(
110+
options.get('user').get('id'),
112111
'allow',
113112
'Castle set to do not track.'
114113
).call()

castle/commands/filter.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
from castle.command import Command
2-
from castle.utils import timestamp
3-
from castle.context.merger import ContextMerger
4-
from castle.context.sanitizer import ContextSanitizer
2+
from castle.utils.timestamp import UtilsTimestamp as generate_timestamp
3+
from castle.context.merge import ContextMerge
4+
from castle.context.sanitize import ContextSanitize
55
from castle.validators.present import ValidatorsPresent
66

77

88
class CommandsFilter(object):
99
def __init__(self, context):
1010
self.context = context
1111

12-
def build(self, options):
12+
def call(self, options):
1313
ValidatorsPresent.call(options, 'event')
14-
context = ContextMerger.call(self.context, options.get('context'))
15-
context = ContextSanitizer.call(context)
14+
context = ContextMerge.call(self.context, options.get('context'))
15+
context = ContextSanitize.call(context)
1616
if context:
1717
options.update({'context': context})
18-
options.update({'sent_at': timestamp()})
18+
options.update({'sent_at': generate_timestamp.call()})
1919

2020
return Command(method='post', path='filter', data=options)

castle/commands/log.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from castle.command import Command
2+
from castle.utils.timestamp import UtilsTimestamp as generate_timestamp
3+
from castle.context.merge import ContextMerge
4+
from castle.context.sanitize import ContextSanitize
5+
from castle.validators.present import ValidatorsPresent
6+
7+
8+
class CommandsLog(object):
9+
def __init__(self, context):
10+
self.context = context
11+
12+
def call(self, options):
13+
ValidatorsPresent.call(options, 'event')
14+
context = ContextMerge.call(self.context, options.get('context'))
15+
context = ContextSanitize.call(context)
16+
if context:
17+
options.update({'context': context})
18+
options.update({'sent_at': generate_timestamp.call()})
19+
20+
return Command(method='post', path='log', data=options)

castle/commands/risk.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from castle.command import Command
2+
from castle.utils.timestamp import UtilsTimestamp as generate_timestamp
3+
from castle.context.merge import ContextMerge
4+
from castle.context.sanitize import ContextSanitize
5+
from castle.validators.present import ValidatorsPresent
6+
7+
8+
class CommandsRisk(object):
9+
def __init__(self, context):
10+
self.context = context
11+
12+
def call(self, options):
13+
ValidatorsPresent.call(options, 'event')
14+
context = ContextMerge.call(self.context, options.get('context'))
15+
context = ContextSanitize.call(context)
16+
if context:
17+
options.update({'context': context})
18+
options.update({'sent_at': generate_timestamp.call()})
19+
20+
return Command(method='post', path='risk', data=options)

castle/test/client_test.py

Lines changed: 179 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,184 @@ def test_track_tracked_false(self):
179179
client.disable_tracking()
180180
self.assertEqual(client.track({}), None)
181181

182+
@responses.activate
183+
def test_filter_tracked_true(self):
184+
response_text = {'action': Verdict.ALLOW.value, 'user_id': '1234'}
185+
responses.add(
186+
responses.POST,
187+
'https://api.castle.io/v1/filter',
188+
json=response_text,
189+
status=200
190+
)
191+
client = Client.from_request(request(), {})
192+
options = {
193+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
194+
'event': '$login',
195+
'status': '$succeeded',
196+
'user': {'id': '1234'}
197+
}
198+
response_text.update(failover=False, failover_reason=None)
199+
self.assertEqual(client.filter(options), response_text)
200+
201+
@responses.activate
202+
def test_filter_tracked_true_status_500(self):
203+
response_text = {
204+
'action': Verdict.ALLOW.value,
205+
'user_id': '1234',
206+
'failover': True,
207+
'failover_reason': 'InternalServerError'
208+
}
209+
responses.add(
210+
responses.POST,
211+
'https://api.castle.io/v1/filter',
212+
json='filter',
213+
status=500
214+
)
215+
client = Client.from_request(request(), {})
216+
options = {
217+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
218+
'event': '$login',
219+
'status': '$succeeded',
220+
'user': {'id': '1234'}
221+
}
222+
self.assertEqual(client.filter(options), response_text)
223+
224+
def test_filter_tracked_false(self):
225+
response_text = {
226+
'action': Verdict.ALLOW.value,
227+
'user_id': '1234',
228+
'failover': True,
229+
'failover_reason': 'Castle set to do not track.'
230+
}
231+
client = Client.from_request(request(), {})
232+
client.disable_tracking()
233+
options = {
234+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
235+
'event': '$login',
236+
'status': '$succeeded',
237+
'user': {'id': '1234'}
238+
}
239+
self.assertEqual(client.filter(options), response_text)
240+
241+
242+
@responses.activate
243+
def test_log_tracked_true(self):
244+
response_text = {'action': Verdict.ALLOW.value, 'user_id': '1234'}
245+
responses.add(
246+
responses.POST,
247+
'https://api.castle.io/v1/log',
248+
json=response_text,
249+
status=200
250+
)
251+
client = Client.from_request(request(), {})
252+
options = {
253+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
254+
'event': '$login',
255+
'status': '$succeeded',
256+
'user': {'id': '1234'}
257+
}
258+
response_text.update(failover=False, failover_reason=None)
259+
self.assertEqual(client.log(options), response_text)
260+
261+
@responses.activate
262+
def test_log_tracked_true_status_500(self):
263+
response_text = {
264+
'action': Verdict.ALLOW.value,
265+
'user_id': '1234',
266+
'failover': True,
267+
'failover_reason': 'InternalServerError'
268+
}
269+
responses.add(
270+
responses.POST,
271+
'https://api.castle.io/v1/log',
272+
json='log',
273+
status=500
274+
)
275+
client = Client.from_request(request(), {})
276+
options = {
277+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
278+
'event': '$login',
279+
'status': '$succeeded',
280+
'user': {'id': '1234'}
281+
}
282+
self.assertEqual(client.log(options), response_text)
283+
284+
def test_log_tracked_false(self):
285+
response_text = {
286+
'action': Verdict.ALLOW.value,
287+
'user_id': '1234',
288+
'failover': True,
289+
'failover_reason': 'Castle set to do not track.'
290+
}
291+
client = Client.from_request(request(), {})
292+
client.disable_tracking()
293+
options = {
294+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
295+
'event': '$login',
296+
'status': '$succeeded',
297+
'user': {'id': '1234'}
298+
}
299+
self.assertEqual(client.log(options), response_text)
300+
301+
@responses.activate
302+
def test_risk_tracked_true(self):
303+
response_text = {'action': Verdict.ALLOW.value, 'user_id': '1234'}
304+
responses.add(
305+
responses.POST,
306+
'https://api.castle.io/v1/risk',
307+
json=response_text,
308+
status=200
309+
)
310+
client = Client.from_request(request(), {})
311+
options = {
312+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
313+
'event': '$login',
314+
'status': '$succeeded',
315+
'user': {'id': '1234'}
316+
}
317+
response_text.update(failover=False, failover_reason=None)
318+
self.assertEqual(client.risk(options), response_text)
319+
320+
@responses.activate
321+
def test_risk_tracked_true_status_500(self):
322+
response_text = {
323+
'action': Verdict.ALLOW.value,
324+
'user_id': '1234',
325+
'failover': True,
326+
'failover_reason': 'InternalServerError'
327+
}
328+
responses.add(
329+
responses.POST,
330+
'https://api.castle.io/v1/risk',
331+
json='risk',
332+
status=500
333+
)
334+
client = Client.from_request(request(), {})
335+
options = {
336+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
337+
'event': '$login',
338+
'status': '$succeeded',
339+
'user': {'id': '1234'}
340+
}
341+
self.assertEqual(client.risk(options), response_text)
342+
343+
def test_risk_tracked_false(self):
344+
response_text = {
345+
'action': Verdict.ALLOW.value,
346+
'user_id': '1234',
347+
'failover': True,
348+
'failover_reason': 'Castle set to do not track.'
349+
}
350+
client = Client.from_request(request(), {})
351+
client.disable_tracking()
352+
options = {
353+
'request_token': '7e51335b-f4bc-4bc7-875d-b713fb61eb23-bf021a3022a1a302',
354+
'event': '$login',
355+
'status': '$succeeded',
356+
'user': {'id': '1234'}
357+
}
358+
self.assertEqual(client.risk(options), response_text)
359+
182360
def test_disable_tracking(self):
183361
client = Client.from_request(request(), {})
184362
client.disable_tracking()
@@ -202,7 +380,7 @@ def test_tracked_when_do_not_track_true(self):
202380
def test_failover_strategy_not_throw(self):
203381
options = {'user_id': '1234'}
204382
self.assertEqual(
205-
Client.failover_response_or_raise(options, Exception()),
383+
Client.failover_response_or_raise(options.get('user_id'), Exception()),
206384
{
207385
'action': Verdict.ALLOW.value,
208386
'user_id': '1234',

0 commit comments

Comments
 (0)