|
5 | 5 |
|
6 | 6 | import logging
|
7 | 7 | import mock
|
| 8 | +import os |
8 | 9 | import structlog
|
9 | 10 | import unittest
|
10 | 11 |
|
@@ -66,7 +67,7 @@ def test_non_allowlisted_ip(self):
|
66 | 67 | assert not self.handler.called, "handler should not be called"
|
67 | 68 | self.assertEqual(len(tweens_handler.records), 1)
|
68 | 69 | self.assertEqual(
|
69 |
| - "Denied Herokuapp access for Host foo.herokuapp.com and IP 6.6.6.6", # noqa |
| 70 | + "Denied Herokuapp access for Host foo.herokuapp.com and IP 6.6.6.6", |
70 | 71 | tweens_handler.records[0].msg,
|
71 | 72 | )
|
72 | 73 | self.assertEqual(response.status_code, 403)
|
@@ -101,3 +102,46 @@ def test_herokuapp_allowlist_empty(self):
|
101 | 102 |
|
102 | 103 | HerokuappAccess(self.handler, self.request.registry)(self.request)
|
103 | 104 | assert not self.handler.called, "handler should not be called"
|
| 105 | + |
| 106 | + @mock.patch.dict(os.environ, {"HEROKUAPP_ACCESS_BYPASS": "foo"}) |
| 107 | + def test_herokuapp_access_bypass(self): |
| 108 | + "The IP check can be bypassed by setting a correct header." |
| 109 | + from pyramid_heroku.herokuapp_access import HerokuappAccess |
| 110 | + |
| 111 | + self.request.client_addr = "6.6.6.6" |
| 112 | + self.request.headers = { |
| 113 | + "Host": "foo.herokuapp.com", |
| 114 | + "HEROKUAPP_ACCESS_BYPASS": "foo", |
| 115 | + } |
| 116 | + |
| 117 | + # structlog version |
| 118 | + HerokuappAccess(self.handler, self.request.registry)(self.request) |
| 119 | + self.handler.assert_called_with(self.request) |
| 120 | + self.assertEqual(len(tweens_handler.records), 1) |
| 121 | + self.assertEqual("Herokuapp access bypassed", tweens_handler.records[0].msg) |
| 122 | + |
| 123 | + # standard logging version |
| 124 | + self.request.registry.settings["pyramid_heroku.structlog"] = False |
| 125 | + tweens_handler.clear() |
| 126 | + HerokuappAccess(self.handler, self.request.registry)(self.request) |
| 127 | + self.handler.assert_called_with(self.request) |
| 128 | + self.assertEqual(len(tweens_handler.records), 1) |
| 129 | + self.assertEqual( |
| 130 | + "Herokuapp access bypassed by 6.6.6.6", |
| 131 | + tweens_handler.records[0].msg, |
| 132 | + ) |
| 133 | + |
| 134 | + @mock.patch.dict(os.environ, {"HEROKUAPP_ACCESS_BYPASS": "foo"}) |
| 135 | + def test_herokuapp_access_bypass_invalid(self): |
| 136 | + "Invalid bypass code is rejected." |
| 137 | + from pyramid_heroku.herokuapp_access import HerokuappAccess |
| 138 | + |
| 139 | + self.request.client_addr = "6.6.6.6" |
| 140 | + self.request.headers = { |
| 141 | + "Host": "foo.herokuapp.com", |
| 142 | + "HEROKUAPP_ACCESS_BYPASS": "bar", |
| 143 | + } |
| 144 | + self.request.registry.settings = {} |
| 145 | + |
| 146 | + HerokuappAccess(self.handler, self.request.registry)(self.request) |
| 147 | + assert not self.handler.called, "handler should not be called" |
0 commit comments