move signature checking to base NotebookManager

so that subclasses have less to duplicate
This commit is contained in:
MinRK 2014-01-27 11:26:14 -08:00
parent ecfa10b3b3
commit eb208b2d77
2 changed files with 23 additions and 10 deletions

View File

@ -26,7 +26,7 @@ import shutil
from tornado import web
from .nbmanager import NotebookManager
from IPython.nbformat import current, sign
from IPython.nbformat import current
from IPython.utils.traitlets import Unicode, Dict, Bool, TraitError
from IPython.utils import tz
@ -213,11 +213,8 @@ class FileNotebookManager(NotebookManager):
nb = current.read(f, u'json')
except Exception as e:
raise web.HTTPError(400, u"Unreadable Notebook: %s %s" % (os_path, e))
self.mark_trusted_cells(nb, path, name)
model['content'] = nb
trusted = self.notary.check_signature(nb)
if not trusted:
self.log.warn("Notebook %s/%s is not trusted", model['path'], model['name'])
self.notary.mark_cells(nb, trusted)
return model
def save_notebook_model(self, model, name='', path=''):
@ -241,11 +238,7 @@ class FileNotebookManager(NotebookManager):
os_path = self.get_os_path(new_name, new_path)
nb = current.to_notebook_json(model['content'])
if self.notary.check_cells(nb):
self.notary.sign(nb)
else:
self.log.warn("Saving untrusted notebook %s/%s", new_path, new_name)
self.check_and_sign(nb, new_path, new_name)
if 'name' in nb['metadata']:
nb['metadata']['name'] = u''

View File

@ -46,6 +46,26 @@ class NotebookManager(LoggingConfigurable):
def _notary_default(self):
return sign.NotebookNotary(parent=self)
def check_and_sign(self, nb, path, name):
"""Check for trusted cells, and sign the notebook.
Called as a part of saving notebooks.
"""
if self.notary.check_cells(nb):
self.notary.sign(nb)
else:
self.log.warn("Saving untrusted notebook %s/%s", path, name)
def mark_trusted_cells(self, nb, path, name):
"""Mark cells as trusted if the notebook signature matches.
Called as a part of loading notebooks.
"""
trusted = self.notary.check_signature(nb)
if not trusted:
self.log.warn("Notebook %s/%s is not trusted", path, name)
self.notary.mark_cells(nb, trusted)
def path_exists(self, path):
"""Does the API-style path (directory) actually exist?