From a39d220f04e44ad2bf75191a013980cc7a490012 2014-01-29 22:37:00
From: MinRK <benjaminrk@gmail.com>
Date: 2014-01-29 22:37:00
Subject: [PATCH] move signature checking to base NotebookManager

so that subclasses have less to duplicate

---

diff --git a/IPython/html/services/notebooks/filenbmanager.py b/IPython/html/services/notebooks/filenbmanager.py
index 8bcee57..bac4de2 100644
--- a/IPython/html/services/notebooks/filenbmanager.py
+++ b/IPython/html/services/notebooks/filenbmanager.py
@@ -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''
diff --git a/IPython/html/services/notebooks/nbmanager.py b/IPython/html/services/notebooks/nbmanager.py
index 43f9b91..f86e914 100644
--- a/IPython/html/services/notebooks/nbmanager.py
+++ b/IPython/html/services/notebooks/nbmanager.py
@@ -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?