Skip to content

Commit 0cbdf6a

Browse files
committed
Merge branch 'develop' into main
2 parents 0c309f6 + 112383f commit 0cbdf6a

5 files changed

Lines changed: 58 additions & 4 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
# Changelog
22

3+
## 0.1.2
4+
5+
- Clear the request-cached GitHubKit client on logout, so logging out
6+
takes effect immediately in the same request.
7+
- Keep request-cached clients separate for each `GitHub` extension
8+
instance.
9+
310
## 0.1.1
411

512
- `@github.login` marks the view it decorates, and an expired refresh

‎README.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ refresh and stores tokens in `flask.session`.
99
Install the release directly from GitHub:
1010

1111
```console
12-
pip install "flask-githubkit @ git+https://github.com/LJFCoding/flask-githubkit.git@v0.1.1"
12+
pip install "flask-githubkit @ git+https://github.com/LJFCoding/flask-githubkit.git@v0.1.2"
1313
```
1414

1515
It is not published on PyPI yet, so `pip install flask-githubkit` will not

‎pyproject.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "flask-githubkit"
7-
version = "0.1.1"
7+
version = "0.1.2"
88
description = "Flask extension for GitHub OAuth login, built on GitHubKit. Handles expiring-token refresh and server-side sessions."
99
readme = "README.md"
1010
requires-python = ">=3.10"

‎src/flask_githubkit/auth.py‎

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,14 @@ def client(self) -> "githubkit.GitHub[typing.Any] | None":
133133
refreshes an expired access token itself; the refreshed values
134134
are saved to the session at the end of the request.
135135
"""
136-
cached: githubkit.GitHub[typing.Any] | None = getattr(
136+
clients: dict[GitHub, githubkit.GitHub[typing.Any]] | None = getattr(
137137
flask.g, CLIENT_ATTR, None
138138
)
139+
if clients is None:
140+
clients = {}
141+
setattr(flask.g, CLIENT_ATTR, clients)
142+
143+
cached = clients.get(self)
139144
if cached is not None:
140145
return cached
141146

@@ -155,11 +160,12 @@ def _save(
155160

156161
flask.after_this_request(_save)
157162
github = githubkit.GitHub(auth=strategy)
158-
setattr(flask.g, CLIENT_ATTR, github)
163+
clients[self] = github
159164
return github
160165

161166
def logout(self) -> None:
162167
flask_githubkit.store.Token.clear()
168+
flask.g.pop(CLIENT_ATTR, None)
163169

164170
@staticmethod
165171
def _config() -> flask_githubkit.config.Config | None:

‎tests/test_auth.py‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,21 @@ def test_client_is_cached_per_request(app, github):
141141
assert github.client() is github.client()
142142

143143

144+
def test_clients_are_cached_per_extension_instance(app):
145+
first = flask_githubkit.GitHub()
146+
second = flask_githubkit.GitHub()
147+
148+
with app.test_request_context():
149+
flask.session["flask_githubkit.token"] = SAMPLE_TOKEN
150+
151+
first_client = first.client()
152+
second_client = second.client()
153+
154+
assert first_client is not second_client
155+
assert first.client() is first_client
156+
assert second.client() is second_client
157+
158+
144159
def test_invalid_stored_token_is_cleared(app, github):
145160
with app.test_request_context():
146161
flask.session["flask_githubkit.token"] = {
@@ -186,6 +201,32 @@ def test_logout_removes_stored_token(app, github):
186201
assert "flask_githubkit.token" not in flask.session
187202

188203

204+
def test_logout_invalidates_cached_client_in_the_same_request(app, github):
205+
with app.test_request_context():
206+
flask.session["flask_githubkit.token"] = SAMPLE_TOKEN
207+
client = github.client()
208+
assert client is not None
209+
210+
github.logout()
211+
212+
assert github.client() is None
213+
214+
215+
def test_logout_invalidates_all_cached_clients(app):
216+
first = flask_githubkit.GitHub()
217+
second = flask_githubkit.GitHub()
218+
219+
with app.test_request_context():
220+
flask.session["flask_githubkit.token"] = SAMPLE_TOKEN
221+
assert first.client() is not None
222+
assert second.client() is not None
223+
224+
first.logout()
225+
226+
assert first.client() is None
227+
assert second.client() is None
228+
229+
189230
def test_expired_refresh_token_clears_session_and_redirects_to_login(
190231
app, http_client
191232
):

0 commit comments

Comments
 (0)