##// END OF EJS Templates
Merge pull request #1211 from minrk/localfiles...
Min RK -
r5842:a50ac36b merge
parent child Browse files
Show More
@@ -108,6 +108,7 b' def authenticate_unless_readonly(f, self, *args, **kwargs):'
108 108 @web.authenticated
109 109 def auth_f(self, *args, **kwargs):
110 110 return f(self, *args, **kwargs)
111
111 112 if self.application.read_only:
112 113 return f(self, *args, **kwargs)
113 114 else:
@@ -175,6 +176,14 b' class AuthenticatedHandler(RequestHandler):'
175 176 return "%s://%s" % (proto, self.request.host)
176 177
177 178
179 class AuthenticatedFileHandler(AuthenticatedHandler, web.StaticFileHandler):
180 """static files should only be accessible when logged in"""
181
182 @authenticate_unless_readonly
183 def get(self, path):
184 return web.StaticFileHandler.get(self, path)
185
186
178 187 class ProjectDashboardHandler(AuthenticatedHandler):
179 188
180 189 @authenticate_unless_readonly
@@ -48,7 +48,8 b' from .kernelmanager import MappingKernelManager'
48 48 from .handlers import (LoginHandler, LogoutHandler,
49 49 ProjectDashboardHandler, NewHandler, NamedNotebookHandler,
50 50 MainKernelHandler, KernelHandler, KernelActionHandler, IOPubHandler,
51 ShellHandler, NotebookRootHandler, NotebookHandler, RSTHandler
51 ShellHandler, NotebookRootHandler, NotebookHandler, RSTHandler,
52 AuthenticatedFileHandler,
52 53 )
53 54 from .notebookmanager import NotebookManager
54 55
@@ -103,7 +104,8 b' class NotebookWebApplication(web.Application):'
103 104 (r"/kernels/%s/shell" % _kernel_id_regex, ShellHandler),
104 105 (r"/notebooks", NotebookRootHandler),
105 106 (r"/notebooks/%s" % _notebook_id_regex, NotebookHandler),
106 (r"/rstservice/render", RSTHandler)
107 (r"/rstservice/render", RSTHandler),
108 (r"/files/(.*)", AuthenticatedFileHandler, {'path' : notebook_manager.notebook_dir}),
107 109 ]
108 110 settings = dict(
109 111 template_path=os.path.join(os.path.dirname(__file__), "templates"),
@@ -280,7 +282,7 b' class NotebookApp(BaseIPythonApplication):'
280 282 static_path = self.webapp_settings.get("static_path", os.path.join(os.path.dirname(__file__), "static"))
281 283 if os.path.exists(os.path.join(static_path, 'mathjax', "MathJax.js")):
282 284 self.log.info("Using local MathJax")
283 return u"static/mathjax/MathJax.js"
285 return u"/static/mathjax/MathJax.js"
284 286 else:
285 287 self.log.info("Using MathJax from CDN")
286 288 return u"http://cdn.mathjax.org/mathjax/latest/MathJax.js"
@@ -6,10 +6,10 b''
6 6
7 7 <title>{% block title %}IPython Notebook{% end %}</title>
8 8
9 <link rel="stylesheet" href="static/jquery/css/themes/aristo/jquery-wijmo.css" type="text/css" />
10 <link rel="stylesheet" href="static/css/boilerplate.css" type="text/css" />
11 <link rel="stylesheet" href="static/css/layout.css" type="text/css" />
12 <link rel="stylesheet" href="static/css/base.css" type="text/css"/>
9 <link rel="stylesheet" href="/static/jquery/css/themes/aristo/jquery-wijmo.css" type="text/css" />
10 <link rel="stylesheet" href="/static/css/boilerplate.css" type="text/css" />
11 <link rel="stylesheet" href="/static/css/layout.css" type="text/css" />
12 <link rel="stylesheet" href="/static/css/base.css" type="text/css"/>
13 13 {% block stylesheet %}
14 14 {% end %}
15 15
@@ -21,7 +21,7 b''
21 21 <body {% block params %}{% end %}>
22 22
23 23 <div id="header">
24 <span id="ipython_notebook"><h1><img src='static/ipynblogo.png' alt='IPython Notebook'/></h1></span>
24 <span id="ipython_notebook"><h1><img src='/static/ipynblogo.png' alt='IPython Notebook'/></h1></span>
25 25
26 26 {% block login_widget %}
27 27
@@ -72,11 +72,11 b''
72 72
73 73 </div>
74 74
75 <script src="static/jquery/js/jquery-1.6.2.min.js" type="text/javascript" charset="utf-8"></script>
76 <script src="static/jquery/js/jquery-ui-1.8.14.custom.min.js" type="text/javascript" charset="utf-8"></script>
77 <script src="static/js/namespace.js" type="text/javascript" charset="utf-8"></script>
78 <script src="static/js/loginmain.js" type="text/javascript" charset="utf-8"></script>
79 <script src="static/js/loginwidget.js" type="text/javascript" charset="utf-8"></script>
75 <script src="/static/jquery/js/jquery-1.6.2.min.js" type="text/javascript" charset="utf-8"></script>
76 <script src="/static/jquery/js/jquery-ui-1.8.14.custom.min.js" type="text/javascript" charset="utf-8"></script>
77 <script src="/static/js/namespace.js" type="text/javascript" charset="utf-8"></script>
78 <script src="/static/js/loginmain.js" type="text/javascript" charset="utf-8"></script>
79 <script src="/static/js/loginwidget.js" type="text/javascript" charset="utf-8"></script>
80 80 {% block script %}
81 81 {% end %}
82 82
@@ -15,20 +15,20 b''
15 15 window.mathjax_url = "{{mathjax_url}}";
16 16 </script>
17 17
18 <link rel="stylesheet" href="static/jquery/css/themes/aristo/jquery-wijmo.css" type="text/css" />
19 <link rel="stylesheet" href="static/codemirror/lib/codemirror.css">
20 <link rel="stylesheet" href="static/codemirror/mode/markdown/markdown.css">
21 <link rel="stylesheet" href="static/codemirror/mode/rst/rst.css">
22 <link rel="stylesheet" href="static/codemirror/theme/ipython.css">
23 <link rel="stylesheet" href="static/codemirror/theme/default.css">
18 <link rel="stylesheet" href="/static/jquery/css/themes/aristo/jquery-wijmo.css" type="text/css" />
19 <link rel="stylesheet" href="/static/codemirror/lib/codemirror.css">
20 <link rel="stylesheet" href="/static/codemirror/mode/markdown/markdown.css">
21 <link rel="stylesheet" href="/static/codemirror/mode/rst/rst.css">
22 <link rel="stylesheet" href="/static/codemirror/theme/ipython.css">
23 <link rel="stylesheet" href="/static/codemirror/theme/default.css">
24 24
25 <link rel="stylesheet" href="static/prettify/prettify.css"/>
25 <link rel="stylesheet" href="/static/prettify/prettify.css"/>
26 26
27 <link rel="stylesheet" href="static/css/boilerplate.css" type="text/css" />
28 <link rel="stylesheet" href="static/css/layout.css" type="text/css" />
29 <link rel="stylesheet" href="static/css/base.css" type="text/css" />
30 <link rel="stylesheet" href="static/css/notebook.css" type="text/css" />
31 <link rel="stylesheet" href="static/css/renderedhtml.css" type="text/css" />
27 <link rel="stylesheet" href="/static/css/boilerplate.css" type="text/css" />
28 <link rel="stylesheet" href="/static/css/layout.css" type="text/css" />
29 <link rel="stylesheet" href="/static/css/base.css" type="text/css" />
30 <link rel="stylesheet" href="/static/css/notebook.css" type="text/css" />
31 <link rel="stylesheet" href="/static/css/renderedhtml.css" type="text/css" />
32 32
33 33 {% comment In the notebook, the read-only flag is used to determine %}
34 34 {% comment whether to hide the side panels and switch off input %}
@@ -42,7 +42,7 b''
42 42 >
43 43
44 44 <div id="header">
45 <span id="ipython_notebook"><h1><a href='..' alt='dashboard'><img src='static/ipynblogo.png' alt='IPython Notebook'/></a></h1></span>
45 <span id="ipython_notebook"><h1><a href='..' alt='dashboard'><img src='/static/ipynblogo.png' alt='IPython Notebook'/></a></h1></span>
46 46 <span id="save_widget">
47 47 <input type="text" id="notebook_name" size="20"></textarea>
48 48 <button id="save_notebook"><u>S</u>ave</button>
@@ -258,40 +258,40 b''
258 258
259 259 </div>
260 260
261 <script src="static/jquery/js/jquery-1.6.2.min.js" type="text/javascript" charset="utf-8"></script>
262 <script src="static/jquery/js/jquery-ui-1.8.14.custom.min.js" type="text/javascript" charset="utf-8"></script>
263 <script src="static/jquery/js/jquery.autogrow.js" type="text/javascript" charset="utf-8"></script>
261 <script src="/static/jquery/js/jquery-1.6.2.min.js" type="text/javascript" charset="utf-8"></script>
262 <script src="/static/jquery/js/jquery-ui-1.8.14.custom.min.js" type="text/javascript" charset="utf-8"></script>
263 <script src="/static/jquery/js/jquery.autogrow.js" type="text/javascript" charset="utf-8"></script>
264 264
265 <script src="static/codemirror/lib/codemirror.js" charset="utf-8"></script>
266 <script src="static/codemirror/mode/python/python.js" charset="utf-8"></script>
267 <script src="static/codemirror/mode/htmlmixed/htmlmixed.js" charset="utf-8"></script>
268 <script src="static/codemirror/mode/xml/xml.js" charset="utf-8"></script>
269 <script src="static/codemirror/mode/javascript/javascript.js" charset="utf-8"></script>
270 <script src="static/codemirror/mode/css/css.js" charset="utf-8"></script>
271 <script src="static/codemirror/mode/rst/rst.js" charset="utf-8"></script>
272 <script src="static/codemirror/mode/markdown/markdown.js" charset="utf-8"></script>
265 <script src="/static/codemirror/lib/codemirror.js" charset="utf-8"></script>
266 <script src="/static/codemirror/mode/python/python.js" charset="utf-8"></script>
267 <script src="/static/codemirror/mode/htmlmixed/htmlmixed.js" charset="utf-8"></script>
268 <script src="/static/codemirror/mode/xml/xml.js" charset="utf-8"></script>
269 <script src="/static/codemirror/mode/javascript/javascript.js" charset="utf-8"></script>
270 <script src="/static/codemirror/mode/css/css.js" charset="utf-8"></script>
271 <script src="/static/codemirror/mode/rst/rst.js" charset="utf-8"></script>
272 <script src="/static/codemirror/mode/markdown/markdown.js" charset="utf-8"></script>
273 273
274 <script src="static/pagedown/Markdown.Converter.js" charset="utf-8"></script>
274 <script src="/static/pagedown/Markdown.Converter.js" charset="utf-8"></script>
275 275
276 <script src="static/prettify/prettify.js" charset="utf-8"></script>
276 <script src="/static/prettify/prettify.js" charset="utf-8"></script>
277 277
278 <script src="static/js/namespace.js" type="text/javascript" charset="utf-8"></script>
279 <script src="static/js/utils.js" type="text/javascript" charset="utf-8"></script>
280 <script src="static/js/cell.js" type="text/javascript" charset="utf-8"></script>
281 <script src="static/js/codecell.js" type="text/javascript" charset="utf-8"></script>
282 <script src="static/js/textcell.js" type="text/javascript" charset="utf-8"></script>
283 <script src="static/js/kernel.js" type="text/javascript" charset="utf-8"></script>
284 <script src="static/js/kernelstatus.js" type="text/javascript" charset="utf-8"></script>
285 <script src="static/js/layout.js" type="text/javascript" charset="utf-8"></script>
286 <script src="static/js/savewidget.js" type="text/javascript" charset="utf-8"></script>
287 <script src="static/js/quickhelp.js" type="text/javascript" charset="utf-8"></script>
288 <script src="static/js/loginwidget.js" type="text/javascript" charset="utf-8"></script>
289 <script src="static/js/pager.js" type="text/javascript" charset="utf-8"></script>
290 <script src="static/js/panelsection.js" type="text/javascript" charset="utf-8"></script>
291 <script src="static/js/printwidget.js" type="text/javascript" charset="utf-8"></script>
292 <script src="static/js/leftpanel.js" type="text/javascript" charset="utf-8"></script>
293 <script src="static/js/notebook.js" type="text/javascript" charset="utf-8"></script>
294 <script src="static/js/notebookmain.js" type="text/javascript" charset="utf-8"></script>
278 <script src="/static/js/namespace.js" type="text/javascript" charset="utf-8"></script>
279 <script src="/static/js/utils.js" type="text/javascript" charset="utf-8"></script>
280 <script src="/static/js/cell.js" type="text/javascript" charset="utf-8"></script>
281 <script src="/static/js/codecell.js" type="text/javascript" charset="utf-8"></script>
282 <script src="/static/js/textcell.js" type="text/javascript" charset="utf-8"></script>
283 <script src="/static/js/kernel.js" type="text/javascript" charset="utf-8"></script>
284 <script src="/static/js/kernelstatus.js" type="text/javascript" charset="utf-8"></script>
285 <script src="/static/js/layout.js" type="text/javascript" charset="utf-8"></script>
286 <script src="/static/js/savewidget.js" type="text/javascript" charset="utf-8"></script>
287 <script src="/static/js/quickhelp.js" type="text/javascript" charset="utf-8"></script>
288 <script src="/static/js/loginwidget.js" type="text/javascript" charset="utf-8"></script>
289 <script src="/static/js/pager.js" type="text/javascript" charset="utf-8"></script>
290 <script src="/static/js/panelsection.js" type="text/javascript" charset="utf-8"></script>
291 <script src="/static/js/printwidget.js" type="text/javascript" charset="utf-8"></script>
292 <script src="/static/js/leftpanel.js" type="text/javascript" charset="utf-8"></script>
293 <script src="/static/js/notebook.js" type="text/javascript" charset="utf-8"></script>
294 <script src="/static/js/notebookmain.js" type="text/javascript" charset="utf-8"></script>
295 295
296 296 </body>
297 297
@@ -5,7 +5,7 b' IPython Dashboard'
5 5 {% end %}
6 6
7 7 {% block stylesheet %}
8 <link rel="stylesheet" href="static/css/projectdashboard.css" type="text/css" />
8 <link rel="stylesheet" href="/static/css/projectdashboard.css" type="text/css" />
9 9 {% end %}
10 10
11 11 {% block meta %}
@@ -38,6 +38,6 b' data-base-kernel-url={{base_kernel_url}}'
38 38 {% end %}
39 39
40 40 {% block script %}
41 <script src="static/js/notebooklist.js" type="text/javascript" charset="utf-8"></script>
42 <script src="static/js/projectdashboardmain.js" type="text/javascript" charset="utf-8"></script>
41 <script src="/static/js/notebooklist.js" type="text/javascript" charset="utf-8"></script>
42 <script src="/static/js/projectdashboardmain.js" type="text/javascript" charset="utf-8"></script>
43 43 {% end %}
@@ -778,6 +778,45 b''
778 778 {
779 779 "cell_type": "markdown",
780 780 "source": [
781 "## Local Files",
782 "",
783 "The above examples embed images and video from the notebook filesystem in the output",
784 "areas of code cells. It is also possible to request these files directly in markdown cells",
785 "if they reside in the notebook directory via relative urls prefixed with `files/`:",
786 "",
787 " files/[subdirectory/]<filename>",
788 "",
789 "",
790 "For example, in the example notebook folder, we have the Python logo, addressed as:",
791 "",
792 " <img src=\"files/python-logo.svg\" />",
793 "",
794 "<img src=\"files/python-logo.svg\" />",
795 "",
796 "and a video with the HTML5 video tag:",
797 "",
798 " <video controls src=\"files/animation.m4v\" />",
799 "",
800 "<video controls src=\"files/animation.m4v\" />",
801 "",
802 "These do not embed the data into the notebook file,",
803 "and require that the files exist when you are viewing the notebook.",
804 "",
805 "### Security of local files",
806 "",
807 "Note that this means that the IPython notebook server also acts as a generic file server",
808 "for files inside the same tree as your notebooks. Access is not granted outside the",
809 "notebook folder so you have strict control over what files are visible, but for this",
810 "reason it is highly recommended that you do not run the notebook server with a notebook",
811 "directory at a high level in your filesystem (e.g. your home directory).",
812 "",
813 "When you run the notebook in a password-protected manner, local file access is restricted",
814 "to authenticated users unless read-only views are active."
815 ]
816 },
817 {
818 "cell_type": "markdown",
819 "source": [
781 820 "### External sites",
782 821 "",
783 822 "You can even embed an entire page from another site in an iframe; for example this is today's Wikipedia",
General Comments 0
You need to be logged in to leave comments. Login now