Skip to content

Commit d5f8ce9

Browse files
committed
server/views: Handle disabled user
1 parent 061828d commit d5f8ce9

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

server/app/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def is_authenticated(self) -> bool:
3434

3535
# flask-loginmanager
3636
def is_active(self) -> bool:
37-
return True
37+
return not self.disabled
3838

3939
# flask-loginmanager
4040
def is_anonymous(self) -> bool:

server/app/views/common.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from flask import g, request
22
from flask.ext.restful import abort
3-
from flask.ext.login import current_user, login_required as login_required_decorator
3+
from flask.ext.login import current_user, login_required as login_required_decorator, logout_user
44
from functools import wraps
55

66
from app import doc_mode, test_mode
@@ -27,6 +27,10 @@ def before_request():
2727

2828
app.logger.debug(request)
2929

30+
if g.user.is_authenticated() and not g.user.is_active():
31+
logout_user()
32+
app.logger.debug("before_request: user: %s\nlogged out because is not active" % str(g.user))
33+
3034
if g.user.is_authenticated():
3135
app.logger.debug("before_request: user: %s\nauthenticated" % str(g.user))
3236
else:

server/app/views/session.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,18 @@ def get(self):
2222
login_required=False,
2323
request=ExampleUsers.ADMIN.set(["username", "password"]),
2424
response=ExampleUsers.ADMIN.get(),
25-
status_codes={401: "bad authentication data"})
25+
status_codes={401: "bad authentication data or user is disabled"})
2626
def post(self):
2727
form = SessionCreateForm()
2828
if not form.validate_on_submit():
2929
abort(422, message=form.errors)
3030

3131
user = User.get_user(form.username.data)
3232
if not user or not user.check_password(form.password.data):
33-
login_user(user)
34-
return UserSerializer(user).data, 201
35-
abort(401)
33+
abort(401)
34+
if not login_user(user):
35+
abort(401)
36+
return UserSerializer(user).data, 201
3637

3738
@api_func("Logout user", url_tail="sessions",
3839
response=None)

server/test/views/test_session.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,23 @@ def test_re_login_with_different_user(self):
6666
def test_logout(self):
6767
self.assertRequest("delete", "/sessions")
6868
self.assertRequest("get", "/sessions", expected_status_codes=401)
69+
70+
71+
class TestDisabledUser(CommonSessionTest):
72+
def setUp(self):
73+
super().setUp()
74+
self.assertRequestAsAdmin("post", "/users", data=Users.USER1.set())
75+
self.assertRequestAsAdmin("put", "/users/%d" % Users.USER1["id"],
76+
data=Users.USER1.set(change={"disabled": True}))
77+
self.assertRequestAsAdmin("post", "/users", data=Users.USER2.set())
78+
79+
def test_logging_in_with_disabled_user(self):
80+
self.assertRequest("post", "/sessions", data=Users.USER1.login(),
81+
expected_status_codes=401)
82+
83+
def test_logging_out_recently_disabled_user(self):
84+
self.assertRequest("post", "/sessions", data=Users.USER2.login(),
85+
expected_status_codes=201)
86+
self.assertRequest("put", "/users/%d" % Users.USER2["id"],
87+
data=Users.USER2.set(change={"disabled": True}))
88+
self.assertRequest("get", "/sessions", expected_status_codes=401)

0 commit comments

Comments
 (0)