Skip to content

Commit 57ebd9c

Browse files
committed
Cleanup and tests
1 parent 471cb71 commit 57ebd9c

File tree

2 files changed

+117
-6
lines changed

2 files changed

+117
-6
lines changed

demo.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,19 +94,15 @@ class TokenApiHandler(ForcePost):
9494
def post(self):
9595
if not session.get('logged_in', False):
9696
ret = {'message': False}
97-
if app.debug:
98-
ret['reason'] = "No login session."
9997
return ret, 403
10098

10199
username = session.get('username', '')
102100
if not username:
103101
# Shouldn't be possible to get here, but just in case
104102
ret = {'message': False}
105-
if app.debug:
106-
ret['reason'] = "No username"
107103
return ret, 403
108104

109-
valid = api.csrfHandler.token_valid_p(request.values.get('csrf', ''), username)
105+
valid = api.csrfHandler.token_valid(request.values.get('csrf', ''), username)
110106
ret = {'message': valid}
111107
return ret
112108

@@ -129,7 +125,7 @@ def get(self):
129125
if process_login():
130126
ret = {
131127
'message': 'Login success',
132-
'csrf':api.csrfHandler.generate_token(username)
128+
'csrf':api.csrfHandler.generate_token()
133129
}
134130
return ret
135131
else:

test_demo.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
import simplejson as json
2+
import requests
3+
import sys
4+
5+
# Run me with 'pytest test_demo.py'
6+
7+
# Specify a test with 'pytest -k test_foo test_demo.py'
8+
9+
def test_force_post():
10+
resp = requests.get("http://localhost:5000/api/secured_endpoint")
11+
assert(resp.status_code == 200)
12+
13+
data = json.loads(resp.text)
14+
assert(data['message'] == "Resource only available via POST. Please try again.")
15+
16+
def test_login_fail():
17+
resp = requests.get("http://localhost:5000/api/login")
18+
assert(resp.status_code == 401)
19+
20+
data = json.loads(resp.text)
21+
assert(data['message'] == "Login fail")
22+
23+
def test_login(session=None):
24+
if not session:
25+
session = requests.session()
26+
27+
params = {'username': 'admin', 'passphrase': 'secret'}
28+
resp = session.get("http://localhost:5000/api/login", params=params)
29+
assert(resp.status_code == 200)
30+
31+
data = json.loads(resp.text)
32+
assert(data['message'] == "Login success")
33+
assert(data['csrf'])
34+
35+
cookies = resp.cookies
36+
assert(cookies['session'])
37+
38+
return resp, data, cookies
39+
40+
def test_logged_in():
41+
resp = requests.get("http://localhost:5000/api/logged_in")
42+
assert(resp.status_code == 200)
43+
44+
data = json.loads(resp.text)
45+
assert(data['message'] == False)
46+
47+
# Now login and try again
48+
resp, data, cookies = test_login()
49+
session = requests.session()
50+
resp = session.get("http://localhost:5000/api/logged_in", cookies=cookies)
51+
data = json.loads(resp.text)
52+
assert(data['message'] == True)
53+
54+
def test_token_valid():
55+
# No cookie sent
56+
session = requests.session()
57+
resp = session.post("http://localhost:5000/api/token_valid")
58+
assert(resp.status_code == 403)
59+
data = json.loads(resp.text)
60+
assert(data['message'] == False)
61+
62+
# Now, log in and try again
63+
resp, data, cookies = test_login(session)
64+
params = {'csrf':data['csrf']}
65+
print(data)
66+
resp = session.post("http://localhost:5000/api/token_valid", cookies=cookies,
67+
params=params)
68+
data = json.loads(resp.text)
69+
print(data)
70+
assert(data['message'] == True)
71+
72+
# Now with the wrong cookie
73+
params = {'csrf':params['csrf']+"wrong"}
74+
resp = session.post("http://localhost:5000/api/token_valid", cookies=cookies,
75+
params=params)
76+
data = json.loads(resp.text)
77+
assert(data['message'] == False)
78+
79+
def test_csrf_return():
80+
resp, data, cookies = test_login()
81+
params = {'csrf':data['csrf']}
82+
83+
# The logged_in endpoint doesn't require a csrf, but should still return
84+
# one, since we're logged in. Let's test it.
85+
session = requests.session()
86+
resp = session.get("http://localhost:5000/api/logged_in", cookies=cookies, params=params)
87+
data = json.loads(resp.text)
88+
assert('csrf' in data)
89+
90+
def test_logout():
91+
resp, data, cookies = test_login()
92+
93+
session = requests.session()
94+
resp = session.get("http://localhost:5000/api/logout", cookies=cookies)
95+
data = json.loads(resp.text)
96+
assert(data['message'] == "Logout success")
97+
98+
def test_secured_endpoint():
99+
# Try without logging in
100+
session = requests.session()
101+
resp = session.post("http://localhost:5000/api/secured_endpoint")
102+
assert(resp.status_code == 403)
103+
data = json.loads(resp.text)
104+
assert(data['message'] == 'csrf fail')
105+
106+
107+
# Try logged in
108+
resp, data, cookies = test_login()
109+
params = {'csrf':data['csrf']}
110+
resp = session.post("http://localhost:5000/api/secured_endpoint",
111+
cookies=cookies,
112+
params=params)
113+
assert(resp.status_code == 200)
114+
data = json.loads(resp.text)
115+
assert(data['message'] == 'Secret information')

0 commit comments

Comments
 (0)