Commit Graph

243 Commits

Author SHA1 Message Date
Min RK
2d99b3943f enable pessimistic connection handling
from the sqlalchemy docs

checks if a connection is valid via `SELECT 1` prior to using it.

Since we have long-running connections, this helps us survive database restarts, disconnects, etc.
2018-05-21 22:14:11 +02:00
Min RK
58c91e3fd4 implement API token expiry 2018-05-07 13:00:37 +02:00
Chico Venancio
f215adcfa2 move check after engine creation 2018-05-06 04:39:26 +00:00
Chico Venancio
1549af6f56 move large_prefix_check to previous mysql if 2018-05-06 04:29:37 +00:00
Chico Venancio
c553f82580 add comment 2018-05-06 04:27:16 +00:00
Chico Venancio
196b4ebc9f fix py syntax 2018-05-06 04:27:16 +00:00
Chico Venancio
8710ce1687 fixing py syntax 2018-05-06 04:27:16 +00:00
Chico Venancio
f65e8d7369 add ROW_FORMAT=DYNAMIC if server is configured to need it for large collums 2018-05-06 04:27:16 +00:00
Min RK
a021f910c8 expose expire_on_commit option
conservative deployments may set

    c.JupyterHub.db_kwargs['expire_on_commit'] = True

as an escape if the optimization is causing problems.
2018-04-23 12:54:22 +02:00
Min RK
b1840e8be7 use relationships everywhere
in order to use sqlalchemy's expire_on_commit=False optimization,
we need to make sure that objects are kept up to date.

This means we cannot rely on ForeignKey ondelete/onupdate behavior,
we must use sqlalchemy's local relationship cascades

The main key here is that we must use relationships to set foreign-key relations,
e.g. APIToken.user = user instead of APIToken.user_id = user.id.

It also means that we cannot use passive_deletes,
which allows sqlalchemy to defer to the database's more efficient ON DELETE behavior.

This makes deletions more expensive in particular,
but should improve db performance overall.
2018-04-23 12:53:38 +02:00
yuvipanda
15e4b1ad8b Don't expire objects on commit 2018-04-23 12:53:38 +02:00
Min RK
30280cc6a4 add token.api_id
id key used in rest api
2018-04-20 15:34:52 +02:00
Min RK
8dc73a852d add oauth client description 2018-04-20 15:34:42 +02:00
Min RK
1ac47d2bb0 consolidate stale client_id check to AccessToken.find 2018-04-13 21:49:57 +02:00
Min RK
c49fc14528 move oauth token relation to user
for symmetry with APIToken
2018-04-13 21:26:18 +02:00
Min RK
078bd8c627 fix and test deletion cascades
- ensure foreign keys are enabled on sqlite
- fix deletion cascades where relationships were causing dissociation instead of deletion
2018-04-13 21:23:58 +02:00
Min RK
33ba9fb5cf ensure foreign keys are enabled on sqlite 2018-04-13 21:23:58 +02:00
Min RK
9dc24c0995 add user.created, spawner.started
- alembic revision
- in user/spawner models
2018-04-03 15:14:47 +02:00
Min RK
8973dea33e add user.created and start last_activity as None
need to handle last_activity being None throughout
2018-04-03 15:14:47 +02:00
Min RK
22c3064ec4 pass note arg in User.new_api_token 2018-02-22 15:10:13 +01:00
Min RK
aa23b01a57 add notes on API tokens when they are allocated 2018-02-22 15:06:01 +01:00
Min RK
7df8597484 cleanup oauth clients at startup
avoids leaving stale oauth clients in db

- cascade oauth access token, code deletion on delete of oauth client
2018-02-22 15:06:01 +01:00
Min RK
d16461052b track activity of individual tokens 2018-02-22 15:05:18 +01:00
Min RK
b29f19e206 add session_id for OAuth tokens
allows tracking and revoking tokens for a login session
2017-12-11 12:15:36 +01:00
Min RK
f002c67343 add dbutil.upgrade_if_needed
so it's reusable now that we want to use it in more than one place
2017-10-27 15:35:17 +02:00
Min RK
f11705ee26 delete service.server from db when they stop
same ondelete='SET NULL' as on spawner.server
2017-09-14 13:30:38 +02:00
Min RK
78ac5abf23 test restoring and deleting spawners while the Hub is down
- set ONDELETE='set null' on spawner->server relation (fixes error when deleting servers that stopped)
- set `spawner.server = None`, which is not triggered when deleting orm_spawner.server
2017-09-14 13:16:29 +02:00
Min RK
3955a8c1d0 limit unique columns to 255 chars
for MySQL key size limits (767 = 256 * 3 - 1 for utf8)
2017-08-07 13:18:27 +02:00
Carol Willing
5c64c88d5a Merge pull request #1312 from minrk/reverse-generated-token
reverse generated-tokens default logic
2017-08-06 08:57:27 -07:00
Carol Willing
924d095c68 Merge pull request #1311 from minrk/oauth-token-no-service
handle OAuthAccessTokens with no user
2017-08-06 08:49:37 -07:00
Min RK
25d19732e0 keep salting generated tokens
all the savings are in rounds, but keep salt because it still prevents the ability to hash a token once and check it against the whole db
2017-08-06 14:16:47 +02:00
Min RK
f0b8d56e9f fix oauth hashed column sizes 2017-08-06 13:28:06 +02:00
Min RK
a27765f7d5 reverse generated-tokens default logic
user-provided tokens are added in exactly one place,
so switch default handling of tokens to generated=True
and explicitly distrust user tokens.

Add JupyterHub.trust_user_provided_tokens flag so that users can avoid the extra hashing
if they know they are providing good keys.
2017-08-05 15:36:03 +02:00
Min RK
2726648982 typo in OAuthAccessToken.service
Token.session doesn’t exist

OAuthAccessTokens are never associated with services
2017-08-05 14:58:41 +02:00
Min RK
275a4ce18d remove last_activity from server
and put it on individual spawners
2017-08-05 14:55:09 +02:00
Min RK
bde37ba9c2 Merge pull request #1299 from minrk/hash-auto
only apply reduced hash+salt to internally generated tokens
2017-08-03 11:13:25 +02:00
Min RK
4a5f914a62 only apply reduced hash+salt to internally generated tokens
don't trust any user-provided tokens to have decent entropy, regardless of size
2017-08-02 11:14:18 +02:00
Min RK
5ad77df04f check database revision on launch
fail with informative error if version mismatches

Since we weren't always tagging before,
we have to handle no tag being present:

- database empty (use latest because we are about to create everything anew)
- if 'spawners' is present, assume 0.8.dev
- if 'services' is present, assume 0.7.x
- else: assume base revision when we started tracking this stuff
2017-07-31 16:18:58 +02:00
Min RK
90e8e1a8aa move auth_state encryption outside the ORM
privy is used for encryption

- db only has blob column, no knowledge of encryption
- add CryptKeeper for handling encryption
- use privy for encryption, so we have fewer choices to make
- storing/loading encrypted auth_state runs in a ThreadPool
2017-07-28 16:08:12 +02:00
Min RK
32a9b38d26 use HKDF on auth keys
if the given tokens aren't already the right shape, pass through a proper KDF
2017-07-28 16:08:12 +02:00
Min RK
5714f56083 encrypt auth_state with MultiFernet
- MultFernet allows key rotation via `AUTH_STATE_KEY=secret2;secret1;secret0`
- Failure to decrypt results in cleared state
- Attempting to set auth_state without encryption is a hard failure
- Absent encryption, auth_state will always be None
2017-07-28 16:08:12 +02:00
yuvipanda
f765fde6c1 Add OptionalEncrypted type 2017-07-28 16:08:12 +02:00
Min RK
e15a6bb758 Merge branch 'master' into named_servers 2017-07-25 16:56:16 +02:00
Min RK
639ccf5582 index prefix column 2017-07-24 17:27:19 +02:00
Min RK
2654794968 don't salt & extra hash uuids
They have enough entropy on their own,
so use just the hash and no salt.

ref: https://security.stackexchange.com/a/151262/155114
2017-07-24 17:03:04 +02:00
Min RK
a2e94b8493 create Spawners table
for named servers

removes User.servers
2017-07-18 14:28:31 +02:00
Min RK
33a37ffa25 User has no single .server anymore 2017-05-08 11:07:35 +02:00
Min RK
5e55753baa various cleanup to get most tests passing (yay!) 2017-05-04 12:16:47 +02:00
Min RK
acc31b8441 remove Hub, Proxy from database
These are in-memory-only objects, no need for a table with one row
2017-05-04 11:05:58 +02:00
YuviPanda
a98bab8b5e Mock of how the proxy base class will be used 2017-05-04 11:02:33 +02:00