Skip to content

Commit fd1977e

Browse files
committed
Fix exception error conversion
These are supposed to return a response, not raise another exception. Also move the exc -> Response handling into routes, leaving sogs/model/exc.py much more pure.
1 parent 25f207a commit fd1977e

File tree

5 files changed

+65
-67
lines changed

5 files changed

+65
-67
lines changed

sogs/model/exc.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,3 @@
1-
from ..web import app
2-
from .. import http
3-
import flask
4-
5-
61
class NotFound(LookupError):
72
"""Base class for NoSuchRoom, NoSuchFile, etc."""
83

@@ -84,24 +79,3 @@ class PostRateLimited(PostRejected):
8479

8580
def __init__(self, msg=None):
8681
super().__init__("Rate limited" if msg is None else msg)
87-
88-
89-
# Map uncaught model exceptions into flask http exceptions
90-
@app.errorhandler(NotFound)
91-
def abort_bad_room(e):
92-
flask.abort(http.NOT_FOUND)
93-
94-
95-
@app.errorhandler(BadPermission)
96-
def abort_perm_denied(e):
97-
flask.abort(http.FORBIDDEN)
98-
99-
100-
@app.errorhandler(PostRejected)
101-
def abort_post_rejected(e):
102-
flask.abort(http.TOO_MANY_REQUESTS)
103-
104-
105-
@app.errorhandler(InvalidData)
106-
def abort_invalid_data(e):
107-
flask.abort(http.BAD_REQUEST)

sogs/routes/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from ..web import app
2+
23
from .legacy import legacy as legacy_endpoints
34
from .general import general as general_endpoints
45
from .onion_request import onion_request as onion_request_endpoints
@@ -8,6 +9,8 @@
89
from .dm import dm as dm_endpoints
910
from .views import views as views_endpoints
1011

12+
from . import exc # noqa: F401
13+
1114
app.register_blueprint(dm_endpoints)
1215
app.register_blueprint(rooms_endpoints)
1316
app.register_blueprint(messages_endpoints)

sogs/routes/exc.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from ..web import app
2+
from .. import http
3+
from ..model import exc
4+
5+
6+
# Map uncaught model exceptions into flask http exceptions
7+
@app.errorhandler(exc.NotFound)
8+
def abort_bad_room(e):
9+
return str(e), http.NOT_FOUND
10+
11+
12+
@app.errorhandler(exc.BadPermission)
13+
def abort_perm_denied(e):
14+
return str(e), http.FORBIDDEN
15+
16+
17+
@app.errorhandler(exc.PostRejected)
18+
def abort_post_rejected(e):
19+
return str(e), http.TOO_MANY_REQUESTS
20+
21+
22+
@app.errorhandler(exc.InvalidData)
23+
def abort_invalid_data(e):
24+
return str(e), http.BAD_REQUEST

tests/test_room_routes.py

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
import pytest
21
import time
32
from sogs.model.room import Room
43
from sogs.model.file import File
54
from sogs import utils, crypto
65
import sogs.config
7-
import werkzeug.exceptions as wexc
86
from util import pad64, from_now, config_override
97
from auth import x_sogs
108
from request import sogs_get, sogs_post, sogs_put, sogs_post_raw, sogs_delete
@@ -775,8 +773,8 @@ def room_json():
775773
assert room_json()['info_updates'] == 1
776774

777775
url = "/room/test-room/pin/3"
778-
with pytest.raises(wexc.Forbidden):
779-
r = sogs_post(client, url, {}, user)
776+
r = sogs_post(client, url, {}, user)
777+
assert r.status_code == 403
780778

781779
assert room_json()['info_updates'] == 1
782780

@@ -886,8 +884,8 @@ def test_whisper_to(client, room, user, user2, mod, global_mod):
886884
p = {"data": d, "signature": s, "whisper_to": user2.session_id}
887885

888886
# Regular users can't post whispers:
889-
with pytest.raises(wexc.Forbidden):
890-
r = sogs_post(client, url_post, p, user)
887+
r = sogs_post(client, url_post, p, user)
888+
assert r.status_code == 403
891889

892890
r = sogs_post(client, url_post, p, mod)
893891
assert r.status_code == 201
@@ -934,8 +932,8 @@ def test_whisper_mods(client, room, user, user2, mod, global_mod, admin):
934932
p = {"data": d, "signature": s, "whisper_mods": True}
935933

936934
# Regular users can't post mod whispers:
937-
with pytest.raises(wexc.Forbidden):
938-
r = sogs_post(client, url_post, p, user)
935+
r = sogs_post(client, url_post, p, user)
936+
assert r.status_code == 403
939937

940938
r = sogs_post(client, url_post, p, mod)
941939
assert r.status_code == 201
@@ -987,9 +985,9 @@ def test_whisper_both(client, room, user, user2, mod, admin):
987985
}
988986

989987
# Regular users can't post mod whispers:
990-
with pytest.raises(wexc.Forbidden):
991-
p = {"data": d, "signature": s, "whisper_mods": True, "whisper_to": mod.session_id}
992-
r = sogs_post(client, url_post, p, user)
988+
p = {"data": d, "signature": s, "whisper_mods": True, "whisper_to": mod.session_id}
989+
r = sogs_post(client, url_post, p, user)
990+
assert r.status_code == 403
993991

994992
d, s = (utils.encode_base64(x) for x in (b"I'm going to scare this guy", pad64("sig2")))
995993
r = sogs_post(client, url_post, {"data": d, "signature": s, "whisper_mods": True}, mod)
@@ -1086,8 +1084,8 @@ def test_edits(client, room, user, user2, mod, global_admin):
10861084

10871085
# Make sure someone else (even super admin) can't edit our message:
10881086
d, s = (utils.encode_base64(x) for x in (b"post 1no", pad64("sig 1no")))
1089-
with pytest.raises(wexc.Forbidden):
1090-
r = sogs_put(client, url_edit, {"data": d, "signature": s}, global_admin)
1087+
r = sogs_put(client, url_edit, {"data": d, "signature": s}, global_admin)
1088+
assert r.status_code == 403
10911089

10921090
r = sogs_get(client, url_get, user)
10931091
assert filter_timestamps(r.json) == filter_timestamps([p1])
@@ -1181,8 +1179,8 @@ def test_remove_self_message(client, room, user):
11811179

11821180
def test_remove_message_not_allowed(client, room, user, user2):
11831181
id = _make_dummy_post(room, user)
1184-
with pytest.raises(wexc.Forbidden):
1185-
sogs_delete(client, f'/room/{room.token}/message/{id}', user2)
1182+
r = sogs_delete(client, f'/room/{room.token}/message/{id}', user2)
1183+
assert r.status_code == 403
11861184

11871185

11881186
def test_remove_post_non_existing(client, room, user, mod):
@@ -1218,17 +1216,17 @@ def test_remove_all_posts_from_room_not_allowed(client, room, user, user2, no_ra
12181216
for _ in range(256):
12191217
_make_dummy_post(room, user)
12201218
assert len(room.get_messages_for(user, recent=True)) == 256
1221-
with pytest.raises(wexc.Forbidden):
1222-
sogs_delete(client, f'/room/{room.token}/all/{user.session_id}', user2)
1219+
r = sogs_delete(client, f'/room/{room.token}/all/{user.session_id}', user2)
1220+
assert r.status_code == 403
12231221
assert len(room.get_messages_for(user, recent=True)) == 256
12241222
assert room.check_unbanned(user) and room.check_unbanned(user2)
12251223

12261224

12271225
def test_remove_all_posts_from_room_not_allowed_for_user(client, room, mod, user, no_rate_limit):
12281226
for _ in range(256):
12291227
_make_dummy_post(room, mod)
1230-
with pytest.raises(wexc.Forbidden):
1231-
sogs_delete(client, f'/room/{room.token}/all/{mod.session_id}', user)
1228+
r = sogs_delete(client, f'/room/{room.token}/all/{mod.session_id}', user)
1229+
assert r.status_code == 403
12321230
assert len(room.get_messages_for(user, recent=True)) == 256
12331231
assert room.check_unbanned(user) and room.check_unbanned(mod)
12341232

tests/test_user_routes.py

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
import pytest
21
from sogs import db, utils
3-
import werkzeug.exceptions as wexc
42
from request import sogs_get, sogs_post
53
from util import pad64
64
import time
@@ -553,8 +551,8 @@ def test_bans(client, room, room2, user, user2, mod, global_mod):
553551
r = sogs_post(client, url_ban, {'rooms': ['test-room']}, mod)
554552
assert r.status_code == 200
555553

556-
with pytest.raises(wexc.Forbidden):
557-
sogs_post(client, "/room/test-room/message", post, user)
554+
r = sogs_post(client, "/room/test-room/message", post, user)
555+
assert r.status_code == 403
558556

559557
r = sogs_post(client, "/room/test-room/message", post, user2)
560558
assert r.status_code == 201
@@ -570,11 +568,11 @@ def test_bans(client, room, room2, user, user2, mod, global_mod):
570568
r = sogs_post(client, url_ban, {'rooms': ['*']}, global_mod)
571569
assert r.status_code == 200
572570

573-
with pytest.raises(wexc.Forbidden):
574-
sogs_post(client, "/room/test-room/message", post, user)
571+
r = sogs_post(client, "/room/test-room/message", post, user)
572+
assert r.status_code == 403
575573

576-
with pytest.raises(wexc.Forbidden):
577-
sogs_post(client, "/room/room2/message", post, user)
574+
r = sogs_post(client, "/room/room2/message", post, user)
575+
assert r.status_code == 403
578576

579577
r = sogs_post(client, "/room/test-room/message", post, user2)
580578
assert r.status_code == 201
@@ -583,8 +581,8 @@ def test_bans(client, room, room2, user, user2, mod, global_mod):
583581

584582
r = sogs_post(client, "/room/test-room/message", post, user)
585583
assert r.status_code == 201
586-
with pytest.raises(wexc.Forbidden):
587-
r = sogs_post(client, "/room/room2/message", post, user)
584+
r = sogs_post(client, "/room/room2/message", post, user)
585+
assert r.status_code == 403
588586

589587
r = sogs_post(client, url_unban, {'rooms': ['*']}, global_mod)
590588

@@ -641,11 +639,11 @@ def test_ban_timeouts(client, room, room2, user, mod, global_mod):
641639
r = sogs_post(client, url_ban, {'rooms': ['*'], 'timeout': 0.001}, global_mod)
642640
assert r.status_code == 200
643641

644-
with pytest.raises(wexc.Forbidden):
645-
sogs_post(client, "/room/test-room/message", post, user)
642+
r = sogs_post(client, "/room/test-room/message", post, user)
643+
assert r.status_code == 403
646644

647-
with pytest.raises(wexc.Forbidden):
648-
sogs_post(client, "/room/room2/message", post, user)
645+
r = sogs_post(client, "/room/room2/message", post, user)
646+
assert r.status_code == 403
649647

650648
from sogs.cleanup import cleanup
651649

@@ -660,17 +658,18 @@ def test_ban_timeouts(client, room, room2, user, mod, global_mod):
660658
r = sogs_post(client, url_ban, {'rooms': ['*'], 'timeout': 30}, mod)
661659
assert r.status_code == 200
662660

663-
with pytest.raises(wexc.Forbidden):
664-
sogs_post(client, "/room/test-room/message", post, user)
661+
r = sogs_post(client, "/room/test-room/message", post, user)
662+
assert r.status_code == 403
665663

666664
r = sogs_post(client, "/room/room2/message", post, user)
667665
assert r.status_code == 201
668666

669667
# The timed ban shouldn't expire yet:
670668
assert cleanup() == (0, 0, 0, 0, 0)
671669

672-
with pytest.raises(wexc.Forbidden):
673-
sogs_post(client, "/room/test-room/message", post, user)
670+
r = sogs_post(client, "/room/test-room/message", post, user)
671+
assert r.status_code == 403
672+
674673
r = sogs_post(client, "/room/room2/message", post, user)
675674
assert r.status_code == 201
676675

@@ -683,8 +682,8 @@ def test_ban_timeouts(client, room, room2, user, mod, global_mod):
683682
r = sogs_post(client, url_ban, {'rooms': ['*'], 'timeout': 0.001}, mod)
684683
assert r.status_code == 200
685684

686-
with pytest.raises(wexc.Forbidden):
687-
sogs_post(client, "/room/test-room/message", post, user)
685+
r = sogs_post(client, "/room/test-room/message", post, user)
686+
assert r.status_code == 403
688687

689688
time.sleep(0.002)
690689
assert cleanup() == (0, 0, 0, 1, 0)
@@ -717,8 +716,8 @@ def test_ban_timeouts(client, room, room2, user, mod, global_mod):
717716

718717
assert cleanup() == (0, 0, 0, 0, 0)
719718

720-
with pytest.raises(wexc.Forbidden):
721-
sogs_post(client, "/room/test-room/message", post, user)
719+
r = sogs_post(client, "/room/test-room/message", post, user)
720+
assert r.status_code == 403
722721

723722
# Unbanning should remove the ban future
724723
assert sogs_post(client, url_unban, {'rooms': ['*']}, mod).status_code == 200

0 commit comments

Comments
 (0)