diff --git a/jupyterhub/apihandlers/users.py b/jupyterhub/apihandlers/users.py index e6066513..6ff84529 100644 --- a/jupyterhub/apihandlers/users.py +++ b/jupyterhub/apihandlers/users.py @@ -68,6 +68,7 @@ class UserAPIHandler(BaseUserHandler): self.write(json.dumps(self.user_model(user))) @admin_only + @gen.coroutine def post(self, name): data = self.get_json_body() user = self.find_user(name) @@ -82,7 +83,7 @@ class UserAPIHandler(BaseUserHandler): self.db.commit() try: - self.authenticator.add_user(user) + yield gen.maybe_future(self.authenticator.add_user(user)) except Exception: self.log.error("Failed to create user: %s" % name, exc_info=True) self.db.delete(user) @@ -103,7 +104,7 @@ class UserAPIHandler(BaseUserHandler): if user.spawner is not None: yield self.stop_single_user(user) - self.authenticator.delete_user(user) + yield gen.maybe_future(self.authenticator.delete_user(user)) # remove from the db self.db.delete(user) diff --git a/jupyterhub/auth.py b/jupyterhub/auth.py index 5461e8b0..c8b0fd58 100644 --- a/jupyterhub/auth.py +++ b/jupyterhub/auth.py @@ -84,6 +84,7 @@ class LocalAuthenticator(Authenticator): """ ) + @gen.coroutine def add_user(self, user): """Add a new user @@ -92,13 +93,14 @@ class LocalAuthenticator(Authenticator): Subclasses may do more extensive things, such as adding actual unix users. """ - if not self.system_user_exists(user): + user_exists = yield gen.maybe_future(self.system_user_exists(user)) + if not user_exists: if self.create_system_users: - self.add_system_user(user) + yield gen.maybe_future(self.add_system_user(user)) else: raise KeyError("User %s does not exist." % user.name) - super(LocalAuthenticator, self).add_user(user) + yield gen.maybe_future(super().add_user(user)) @staticmethod def system_user_exists(user):