@@ -71,7 +71,12 @@ def test_validate_username_with_user(self):
71
71
assert user_service .find_userid .calls == [pretend .call ("my_username" )]
72
72
73
73
def test_validate_password_no_user (self ):
74
- request = pretend .stub ()
74
+ request = pretend .stub (
75
+ remote_addr = "1.2.3.4" ,
76
+ banned = pretend .stub (
77
+ by_ip = lambda ip_address : False ,
78
+ ),
79
+ )
75
80
user_service = pretend .stub (
76
81
find_userid = pretend .call_recorder (lambda userid : None )
77
82
)
@@ -92,7 +97,9 @@ def test_validate_password_no_user(self):
92
97
]
93
98
94
99
def test_validate_password_disabled_for_compromised_pw (self , db_session ):
95
- request = pretend .stub ()
100
+ request = pretend .stub (
101
+ remote_addr = "1.2.3.4" , banned = pretend .stub (by_ip = lambda ip_address : False )
102
+ )
96
103
user_service = pretend .stub (
97
104
find_userid = pretend .call_recorder (lambda userid : 1 ),
98
105
is_disabled = pretend .call_recorder (
@@ -115,7 +122,12 @@ def test_validate_password_disabled_for_compromised_pw(self, db_session):
115
122
assert user_service .is_disabled .calls == [pretend .call (1 )]
116
123
117
124
def test_validate_password_ok (self ):
118
- request = pretend .stub (remote_addr = "1.2.3.4" )
125
+ request = pretend .stub (
126
+ remote_addr = "1.2.3.4" ,
127
+ banned = pretend .stub (
128
+ by_ip = lambda ip_address : False ,
129
+ ),
130
+ )
119
131
user_service = pretend .stub (
120
132
find_userid = pretend .call_recorder (lambda userid : 1 ),
121
133
check_password = pretend .call_recorder (
@@ -150,7 +162,12 @@ def test_validate_password_ok(self):
150
162
]
151
163
152
164
def test_validate_password_notok (self , db_session ):
153
- request = pretend .stub (remote_addr = "127.0.0.1" )
165
+ request = pretend .stub (
166
+ remote_addr = "1.2.3.4" ,
167
+ banned = pretend .stub (
168
+ by_ip = lambda ip_address : False ,
169
+ ),
170
+ )
154
171
user_service = pretend .stub (
155
172
find_userid = pretend .call_recorder (lambda userid : 1 ),
156
173
check_password = pretend .call_recorder (
@@ -186,7 +203,12 @@ def test_validate_password_notok(self, db_session):
186
203
]
187
204
188
205
def test_validate_password_too_many_failed (self ):
189
- request = pretend .stub (remote_addr = "1.2.3.4" )
206
+ request = pretend .stub (
207
+ remote_addr = "1.2.3.4" ,
208
+ banned = pretend .stub (
209
+ by_ip = lambda ip_address : False ,
210
+ ),
211
+ )
190
212
user_service = pretend .stub (
191
213
find_userid = pretend .call_recorder (lambda userid : 1 ),
192
214
check_password = pretend .call_recorder (
@@ -218,7 +240,12 @@ def test_password_breached(self, monkeypatch):
218
240
monkeypatch .setattr (forms , "send_password_compromised_email_hibp" , send_email )
219
241
220
242
user = pretend .stub (id = 1 )
221
- request = pretend .stub (remote_addr = "1.2.3.4" )
243
+ request = pretend .stub (
244
+ remote_addr = "1.2.3.4" ,
245
+ banned = pretend .stub (
246
+ by_ip = lambda ip_address : False ,
247
+ ),
248
+ )
222
249
user_service = pretend .stub (
223
250
find_userid = lambda _ : 1 ,
224
251
get_user = lambda _ : user ,
@@ -247,6 +274,72 @@ def test_password_breached(self, monkeypatch):
247
274
]
248
275
assert send_email .calls == [pretend .call (request , user )]
249
276
277
+ def test_validate_password_ok_ip_banned (self ):
278
+ request = pretend .stub (
279
+ remote_addr = "1.2.3.4" ,
280
+ banned = pretend .stub (
281
+ by_ip = lambda ip_address : True ,
282
+ ),
283
+ )
284
+ user_service = pretend .stub (
285
+ find_userid = pretend .call_recorder (lambda userid : 1 ),
286
+ check_password = pretend .call_recorder (
287
+ lambda userid , password , tags = None : True
288
+ ),
289
+ is_disabled = pretend .call_recorder (lambda userid : (False , None )),
290
+ )
291
+ breach_service = pretend .stub (
292
+ check_password = pretend .call_recorder (lambda pw , tags : False )
293
+ )
294
+ form = forms .LoginForm (
295
+ data = {"username" : "my_username" },
296
+ request = request ,
297
+ user_service = user_service ,
298
+ breach_service = breach_service ,
299
+ check_password_metrics_tags = ["bar" ],
300
+ )
301
+ field = pretend .stub (data = "pw" )
302
+
303
+ with pytest .raises (wtforms .validators .ValidationError ):
304
+ form .validate_password (field )
305
+
306
+ assert user_service .find_userid .calls == []
307
+ assert user_service .is_disabled .calls == []
308
+ assert user_service .check_password .calls == []
309
+ assert breach_service .check_password .calls == []
310
+
311
+ def test_validate_password_notok_ip_banned (self , db_session ):
312
+ request = pretend .stub (
313
+ remote_addr = "1.2.3.4" ,
314
+ banned = pretend .stub (
315
+ by_ip = lambda ip_address : True ,
316
+ ),
317
+ )
318
+ user_service = pretend .stub (
319
+ find_userid = pretend .call_recorder (lambda userid : 1 ),
320
+ check_password = pretend .call_recorder (
321
+ lambda userid , password , tags = None : False
322
+ ),
323
+ is_disabled = pretend .call_recorder (lambda userid : (False , None )),
324
+ record_event = pretend .call_recorder (lambda * a , ** kw : None ),
325
+ )
326
+ breach_service = pretend .stub ()
327
+ form = forms .LoginForm (
328
+ data = {"username" : "my_username" },
329
+ request = request ,
330
+ user_service = user_service ,
331
+ breach_service = breach_service ,
332
+ )
333
+ field = pretend .stub (data = "pw" )
334
+
335
+ with pytest .raises (wtforms .validators .ValidationError ):
336
+ form .validate_password (field )
337
+
338
+ assert user_service .find_userid .calls == []
339
+ assert user_service .is_disabled .calls == []
340
+ assert user_service .check_password .calls == []
341
+ assert user_service .record_event .calls == []
342
+
250
343
251
344
class TestRegistrationForm :
252
345
def test_create (self ):
0 commit comments