@@ -167,7 +189,7 @@
aria-controls="nav-missing" aria-selected="false">Missing
-
+
-
-
-
-
- IP Addresses
-
-
- | IP Address |
- Last Seen |
-
-
-
- {% for addr in addrs %}
-
- | {{ addr.ip }} |
-
-
- |
-
- {% endfor %}
-
-
-
-
-
{% endblock %}
diff --git a/CTFd/utils/initialization/__init__.py b/CTFd/utils/initialization/__init__.py
index 19aff5d9..8118c06d 100644
--- a/CTFd/utils/initialization/__init__.py
+++ b/CTFd/utils/initialization/__init__.py
@@ -7,7 +7,7 @@ from flask import abort, redirect, render_template, request, session, url_for
from sqlalchemy.exc import IntegrityError, InvalidRequestError
from werkzeug.wsgi import DispatcherMiddleware
-from CTFd.cache import clear_user_ips
+from CTFd.cache import clear_user_recent_ips
from CTFd.exceptions import UserNotFoundException, UserTokenExpiredException
from CTFd.models import Tracking, db
from CTFd.utils import config, get_config, markdown
@@ -42,7 +42,7 @@ from CTFd.utils.security.csrf import generate_nonce
from CTFd.utils.user import (
authed,
get_current_user_attrs,
- get_current_user_ips,
+ get_current_user_recent_ips,
get_current_team_attrs,
get_ip,
is_admin,
@@ -181,18 +181,20 @@ def init_request_processors(app):
return
if authed():
- user_ips = get_current_user_ips()
+ user_ips = get_current_user_recent_ips()
ip = get_ip()
+
track = None
if ip not in user_ips:
- track = Tracking(ip=get_ip(), user_id=session["id"])
- db.session.add(track)
- else:
- if request.method != "GET":
- track = Tracking.query.filter_by(
- ip=get_ip(), user_id=session["id"]
- ).first()
+ track = Tracking.query.filter_by(
+ ip=get_ip(), user_id=session["id"]
+ ).first()
+
+ if track:
track.date = datetime.datetime.utcnow()
+ else:
+ track = Tracking(ip=get_ip(), user_id=session["id"])
+ db.session.add(track)
if track:
try:
@@ -200,7 +202,7 @@ def init_request_processors(app):
except (InvalidRequestError, IntegrityError):
db.session.rollback()
logout_user()
- clear_user_ips(user_id=session["id"])
+ clear_user_recent_ips(user_id=session["id"])
@app.before_request
def banned():
diff --git a/CTFd/utils/user/__init__.py b/CTFd/utils/user/__init__.py
index 5186e2b0..7f21dcab 100644
--- a/CTFd/utils/user/__init__.py
+++ b/CTFd/utils/user/__init__.py
@@ -120,21 +120,22 @@ def get_ip(req=None):
return remote_addr
-def get_current_user_ips():
+def get_current_user_recent_ips():
if authed():
- return get_user_ips(user_id=session["id"])
+ return get_user_recent_ips(user_id=session["id"])
else:
return None
@cache.memoize(timeout=60)
-def get_user_ips(user_id):
+def get_user_recent_ips(user_id):
+ hour_ago = datetime.datetime.now() - datetime.timedelta(hours=1)
addrs = (
Tracking.query.with_entities(Tracking.ip.distinct())
- .filter_by(user_id=user_id)
+ .filter(Tracking.user_id == user_id, Tracking.date >= hour_ago)
.all()
)
- return [ip for ip, in addrs]
+ return set([ip for (ip,) in addrs])
def get_wrong_submissions_per_minute(account_id):