Skip to content

Commit 4e7e68a

Browse files
authored
Start creating and storing UserUniqueLogin.ip_address_id (#19123)
1 parent 424b8c6 commit 4e7e68a

File tree

5 files changed

+23
-17
lines changed

5 files changed

+23
-17
lines changed

tests/unit/accounts/test_services.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2045,6 +2045,7 @@ def test_device_is_not_known(self, user_service, monkeypatch):
20452045
)
20462046
},
20472047
find_service=lambda *a, **kw: token_service,
2048+
ip_address=IpAddressFactory.create(ip_address=REMOTE_ADDR),
20482049
)
20492050

20502051
assert not user_service.device_is_known(user.id, user_service.request)
@@ -2114,6 +2115,7 @@ def test_device_is_pending_and_expired(self, user_service, monkeypatch):
21142115
)
21152116
},
21162117
find_service=lambda *a, **kw: token_service,
2118+
ip_address=IpAddressFactory.create(ip_address=REMOTE_ADDR),
21172119
)
21182120

21192121
assert not user_service.device_is_known(user.id, user_service.request)
@@ -2143,6 +2145,7 @@ def test_device_is_not_known_bad_user_agent(
21432145
remote_addr=REMOTE_ADDR,
21442146
headers=headers,
21452147
find_service=lambda *a, **kw: token_service,
2148+
ip_address=IpAddressFactory.create(ip_address=REMOTE_ADDR),
21462149
)
21472150

21482151
assert not user_service.device_is_known(user.id, user_service.request)

warehouse/accounts/services.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,8 @@ def device_is_known(self, userid, request):
764764
if not unique_login:
765765
unique_login = UserUniqueLogin(
766766
user_id=userid,
767-
ip_address=request.remote_addr,
767+
ip_address=str(request.ip_address.ip_address),
768+
ip_address_id=request.ip_address.id,
768769
status=UniqueLoginStatus.PENDING,
769770
expires=datetime.datetime.now(datetime.UTC)
770771
+ datetime.timedelta(seconds=token_service.max_age),
@@ -826,7 +827,7 @@ def device_is_known(self, userid, request):
826827
send_unrecognized_login_email(
827828
request,
828829
user,
829-
ip_address=request.remote_addr,
830+
ip_address=str(request.ip_address.ip_address),
830831
user_agent=user_agent_info.display(),
831832
token=token,
832833
)

warehouse/accounts/views.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,7 +1030,7 @@ def _error(message):
10301030
if unique_login is None:
10311031
return _error(request._("Invalid login attempt."))
10321032

1033-
if unique_login.ip_address != request.remote_addr:
1033+
if unique_login.ip_address != str(request.ip_address.ip_address):
10341034
return _error(
10351035
request._(
10361036
"Device details didn't match, please try again from the device "
@@ -1548,7 +1548,7 @@ def _login_user(request, userid, two_factor_method=None, two_factor_label=None):
15481548
request.db.query(UserUniqueLogin)
15491549
.filter(
15501550
UserUniqueLogin.user_id == userid,
1551-
UserUniqueLogin.ip_address == request.remote_addr,
1551+
UserUniqueLogin.ip_address == str(request.ip_address.ip_address),
15521552
)
15531553
.one_or_none()
15541554
)
@@ -1560,7 +1560,8 @@ def _login_user(request, userid, two_factor_method=None, two_factor_label=None):
15601560
# if this is non-phishable.
15611561
unique_login = UserUniqueLogin(
15621562
user_id=userid,
1563-
ip_address=request.remote_addr,
1563+
ip_address=str(request.ip_address.ip_address),
1564+
ip_address_id=request.ip_address.id,
15641565
status=UniqueLoginStatus.CONFIRMED,
15651566
)
15661567
request.db.add(unique_login)

warehouse/locale/messages.pot

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -333,35 +333,35 @@ msgstr ""
333333
msgid "You are now ${role} of the '${project_name}' project."
334334
msgstr ""
335335

336-
#: warehouse/accounts/views.py:1588
336+
#: warehouse/accounts/views.py:1589
337337
#, python-brace-format
338338
msgid "Please review our updated <a href=\"${tos_url}\">Terms of Service</a>."
339339
msgstr ""
340340

341-
#: warehouse/accounts/views.py:1800 warehouse/accounts/views.py:2054
341+
#: warehouse/accounts/views.py:1801 warehouse/accounts/views.py:2055
342342
#: warehouse/manage/views/oidc_publishers.py:126
343343
#: warehouse/manage/views/organizations.py:1805
344344
msgid ""
345345
"Trusted publishing is temporarily disabled. See https://pypi.org/help"
346346
"#admin-intervention for details."
347347
msgstr ""
348348

349-
#: warehouse/accounts/views.py:1821
349+
#: warehouse/accounts/views.py:1822
350350
#: warehouse/manage/views/organizations.py:1828
351351
msgid "disabled. See https://pypi.org/help#admin-intervention for details."
352352
msgstr ""
353353

354-
#: warehouse/accounts/views.py:1837
354+
#: warehouse/accounts/views.py:1838
355355
msgid ""
356356
"You must have a verified email in order to register a pending trusted "
357357
"publisher. See https://pypi.org/help#openid-connect for details."
358358
msgstr ""
359359

360-
#: warehouse/accounts/views.py:1850
360+
#: warehouse/accounts/views.py:1851
361361
msgid "You can't register more than 3 pending trusted publishers at once."
362362
msgstr ""
363363

364-
#: warehouse/accounts/views.py:1865
364+
#: warehouse/accounts/views.py:1866
365365
#: warehouse/manage/views/oidc_publishers.py:308
366366
#: warehouse/manage/views/oidc_publishers.py:423
367367
#: warehouse/manage/views/oidc_publishers.py:539
@@ -371,7 +371,7 @@ msgid ""
371371
"again later."
372372
msgstr ""
373373

374-
#: warehouse/accounts/views.py:1875
374+
#: warehouse/accounts/views.py:1876
375375
#: warehouse/manage/views/oidc_publishers.py:321
376376
#: warehouse/manage/views/oidc_publishers.py:436
377377
#: warehouse/manage/views/oidc_publishers.py:552
@@ -380,23 +380,23 @@ msgstr ""
380380
msgid "The trusted publisher could not be registered"
381381
msgstr ""
382382

383-
#: warehouse/accounts/views.py:1890
383+
#: warehouse/accounts/views.py:1891
384384
msgid ""
385385
"This trusted publisher has already been registered. Please contact PyPI's"
386386
" admins if this wasn't intentional."
387387
msgstr ""
388388

389-
#: warehouse/accounts/views.py:1924
389+
#: warehouse/accounts/views.py:1925
390390
#: warehouse/manage/views/organizations.py:1893
391391
msgid "Registered a new pending publisher to create "
392392
msgstr ""
393393

394-
#: warehouse/accounts/views.py:2067 warehouse/accounts/views.py:2080
395-
#: warehouse/accounts/views.py:2087
394+
#: warehouse/accounts/views.py:2068 warehouse/accounts/views.py:2081
395+
#: warehouse/accounts/views.py:2088
396396
msgid "Invalid publisher ID"
397397
msgstr ""
398398

399-
#: warehouse/accounts/views.py:2094
399+
#: warehouse/accounts/views.py:2095
400400
msgid "Removed trusted publisher for project "
401401
msgstr ""
402402

warehouse/utils/wsgi.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ def _ip_address(request):
154154
except NoResultFound:
155155
ip_address = IpAddress(ip_address=request.remote_addr)
156156
request.db.add(ip_address)
157+
request.db.flush() # To get the id if newly added
157158

158159
ip_address.hashed_ip_address = request.remote_addr_hashed
159160
ip_address.geoip_info = {

0 commit comments

Comments
 (0)