mirror of
https://github.com/jupyterhub/jupyterhub.git
synced 2025-10-15 14:03:02 +00:00
cookie_secret is no longer bytes
add utils.random_hex for generating a unicode object with random hex bytes
This commit is contained in:
@@ -25,7 +25,7 @@ from tornado.log import LogFormatter
|
|||||||
from tornado import gen, web
|
from tornado import gen, web
|
||||||
|
|
||||||
from IPython.utils.traitlets import (
|
from IPython.utils.traitlets import (
|
||||||
Unicode, Integer, Dict, TraitError, List, Bool, Bytes, Any,
|
Unicode, Integer, Dict, TraitError, List, Bool, Any,
|
||||||
DottedObjectName, Set,
|
DottedObjectName, Set,
|
||||||
)
|
)
|
||||||
from IPython.config import Application, catch_config_error
|
from IPython.config import Application, catch_config_error
|
||||||
@@ -37,7 +37,7 @@ from . import handlers, apihandlers
|
|||||||
|
|
||||||
from . import orm
|
from . import orm
|
||||||
from ._data import DATA_FILES_PATH
|
from ._data import DATA_FILES_PATH
|
||||||
from .utils import url_path_join
|
from .utils import url_path_join, random_hex, TimeoutError
|
||||||
|
|
||||||
# classes for config
|
# classes for config
|
||||||
from .auth import Authenticator, PAMAuthenticator
|
from .auth import Authenticator, PAMAuthenticator
|
||||||
@@ -190,9 +190,13 @@ class JupyterHubApp(Application):
|
|||||||
if newnew != new:
|
if newnew != new:
|
||||||
self.hub_prefix = newnew
|
self.hub_prefix = newnew
|
||||||
|
|
||||||
cookie_secret = Bytes(config=True)
|
cookie_secret = Unicode(config=True,
|
||||||
|
help="""The cookie secret to use to encrypt cookies.
|
||||||
|
Loaded from the JPY_COOKIE_SECRET env variable by default.
|
||||||
|
"""
|
||||||
|
)
|
||||||
def _cookie_secret_default(self):
|
def _cookie_secret_default(self):
|
||||||
return b'secret!'
|
return os.environ.get('JPY_COOKIE_SECRET', random_hex(64))
|
||||||
|
|
||||||
authenticator = DottedObjectName("jupyterhub.auth.PAMAuthenticator", config=True,
|
authenticator = DottedObjectName("jupyterhub.auth.PAMAuthenticator", config=True,
|
||||||
help="""Class for authenticating users.
|
help="""Class for authenticating users.
|
||||||
|
@@ -71,7 +71,7 @@ class Server(Base):
|
|||||||
ip = Column(Unicode, default=u'localhost')
|
ip = Column(Unicode, default=u'localhost')
|
||||||
port = Column(Integer, default=random_port)
|
port = Column(Integer, default=random_port)
|
||||||
base_url = Column(Unicode, default=u'/')
|
base_url = Column(Unicode, default=u'/')
|
||||||
cookie_secret = Column(Binary, default=b'secret')
|
cookie_secret = Column(Unicode, default=u'')
|
||||||
cookie_name = Column(Unicode, default=u'cookie')
|
cookie_name = Column(Unicode, default=u'cookie')
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
@@ -60,7 +60,7 @@ class Spawner(LoggingConfigurable):
|
|||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
for key in ['HOME', 'USER', 'USERNAME', 'LOGNAME', 'LNAME']:
|
for key in ['HOME', 'USER', 'USERNAME', 'LOGNAME', 'LNAME']:
|
||||||
env.pop(key, None)
|
env.pop(key, None)
|
||||||
self._env_key(env, 'COOKIE_SECRET', self.user.server.cookie_secret.decode('ascii'))
|
self._env_key(env, 'COOKIE_SECRET', self.user.server.cookie_secret)
|
||||||
self._env_key(env, 'API_TOKEN', self.api_token)
|
self._env_key(env, 'API_TOKEN', self.api_token)
|
||||||
return env
|
return env
|
||||||
|
|
||||||
|
@@ -21,7 +21,7 @@ def test_server(db):
|
|||||||
assert server.proto == 'http'
|
assert server.proto == 'http'
|
||||||
assert isinstance(server.port, int)
|
assert isinstance(server.port, int)
|
||||||
assert isinstance(server.cookie_name, unicode)
|
assert isinstance(server.cookie_name, unicode)
|
||||||
assert isinstance(server.cookie_secret, bytes)
|
assert isinstance(server.cookie_secret, unicode)
|
||||||
assert server.url == 'http://localhost:%i/' % server.port
|
assert server.url == 'http://localhost:%i/' % server.port
|
||||||
|
|
||||||
|
|
||||||
|
@@ -3,7 +3,9 @@
|
|||||||
# Copyright (c) Jupyter Development Team.
|
# Copyright (c) Jupyter Development Team.
|
||||||
# Distributed under the terms of the Modified BSD License.
|
# Distributed under the terms of the Modified BSD License.
|
||||||
|
|
||||||
|
import binascii
|
||||||
import errno
|
import errno
|
||||||
|
import os
|
||||||
import socket
|
import socket
|
||||||
from tornado import web, gen, ioloop
|
from tornado import web, gen, ioloop
|
||||||
from tornado.log import app_log
|
from tornado.log import app_log
|
||||||
@@ -11,7 +13,8 @@ from tornado.log import app_log
|
|||||||
from IPython.html.utils import url_path_join
|
from IPython.html.utils import url_path_join
|
||||||
|
|
||||||
try:
|
try:
|
||||||
TimeoutError
|
# make TimeoutError importable on Python >= 3.3
|
||||||
|
TimeoutError = TimeoutError
|
||||||
except NameError:
|
except NameError:
|
||||||
# python < 3.3
|
# python < 3.3
|
||||||
class TimeoutError(Exception):
|
class TimeoutError(Exception):
|
||||||
@@ -25,6 +28,12 @@ def random_port():
|
|||||||
sock.close()
|
sock.close()
|
||||||
return port
|
return port
|
||||||
|
|
||||||
|
def random_hex(nbytes):
|
||||||
|
"""Return nbytes random bytes as a unicode hex string
|
||||||
|
|
||||||
|
It will have length nbytes * 2
|
||||||
|
"""
|
||||||
|
return binascii.hexlify(os.urandom(nbytes)).decode('ascii')
|
||||||
|
|
||||||
@gen.coroutine
|
@gen.coroutine
|
||||||
def wait_for_server(ip, port, timeout=10):
|
def wait_for_server(ip, port, timeout=10):
|
||||||
|
Reference in New Issue
Block a user