Skip to content

Commit c5bb329

Browse files
committed
use tornado xsrf token in API
- Cookie-authenticated API requests must use set X-XSRFToken header - add utils.ajax for making ajax requests, adding xsrf header from default location
1 parent fb8640a commit c5bb329

File tree

8 files changed

+53
-22
lines changed

8 files changed

+53
-22
lines changed

notebook/base/handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ def template_namespace(self):
359359
ignore_minified_js=self.ignore_minified_js,
360360
xsrf_form_html=self.xsrf_form_html,
361361
token=self.token,
362-
xsrf_token=self.xsrf_token,
362+
xsrf_token=self.xsrf_token.decode('utf8'),
363363
**self.jinja_template_vars
364364
)
365365

notebook/static/base/js/utils.js

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ define([
527527

528528
var to_absolute_cursor_pos = function (cm, cursor) {
529529
console.warn('`utils.to_absolute_cursor_pos(cm, pos)` is deprecated. Use `cm.indexFromPos(cursor)`');
530-
return cm.indexFromPos(cusrsor);
530+
return cm.indexFromPos(cursor);
531531
};
532532

533533
var from_absolute_cursor_pos = function (cm, cursor_pos) {
@@ -676,6 +676,29 @@ define([
676676
return wrapped_error;
677677
};
678678

679+
var ajax = function (url, settings) {
680+
// like $.ajax, but ensure Authorization header is set
681+
settings = _add_auth_header(settings);
682+
return $.ajax(url, settings);
683+
};
684+
685+
var _add_auth_header = function (settings) {
686+
/**
687+
* Adds auth header to jquery ajax settings
688+
*/
689+
settings = settings || {};
690+
if (!settings.headers) {
691+
settings.headers = {};
692+
}
693+
if (!settings.headers.Authorization) {
694+
var xsrf_token = get_body_data('xsrfToken');
695+
if (xsrf_token) {
696+
settings.headers['X-XSRFToken'] = xsrf_token;
697+
}
698+
}
699+
return settings;
700+
};
701+
679702
var promising_ajax = function(url, settings) {
680703
/**
681704
* Like $.ajax, but returning an ES6 promise. success and error settings
@@ -690,7 +713,7 @@ define([
690713
log_ajax_error(jqXHR, status, error);
691714
reject(wrap_ajax_error(jqXHR, status, error));
692715
};
693-
$.ajax(url, settings);
716+
ajax(url, settings);
694717
});
695718
};
696719

@@ -880,10 +903,11 @@ define([
880903
is_or_has : is_or_has,
881904
is_focused : is_focused,
882905
mergeopt: mergeopt,
883-
ajax_error_msg : ajax_error_msg,
884-
log_ajax_error : log_ajax_error,
885906
requireCodeMirrorMode : requireCodeMirrorMode,
886907
XHR_ERROR : XHR_ERROR,
908+
ajax : ajax,
909+
ajax_error_msg : ajax_error_msg,
910+
log_ajax_error : log_ajax_error,
887911
wrap_ajax_error : wrap_ajax_error,
888912
promising_ajax : promising_ajax,
889913
WrappedError: WrappedError,

notebook/static/services/kernels/kernel.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ define([
151151
* @param {function} [error] - functon executed on ajax error
152152
*/
153153
Kernel.prototype.list = function (success, error) {
154-
$.ajax(this.kernel_service_url, {
154+
utils.ajax(this.kernel_service_url, {
155155
processData: false,
156156
cache: false,
157157
type: "GET",
@@ -193,7 +193,7 @@ define([
193193
}
194194
};
195195

196-
$.ajax(url, {
196+
utils.ajax(url, {
197197
processData: false,
198198
cache: false,
199199
type: "POST",
@@ -217,7 +217,7 @@ define([
217217
* @param {function} [error] - functon executed on ajax error
218218
*/
219219
Kernel.prototype.get_info = function (success, error) {
220-
$.ajax(this.kernel_url, {
220+
utils.ajax(this.kernel_url, {
221221
processData: false,
222222
cache: false,
223223
type: "GET",
@@ -243,7 +243,7 @@ define([
243243
Kernel.prototype.kill = function (success, error) {
244244
this.events.trigger('kernel_killed.Kernel', {kernel: this});
245245
this._kernel_dead();
246-
$.ajax(this.kernel_url, {
246+
utils.ajax(this.kernel_url, {
247247
processData: false,
248248
cache: false,
249249
type: "DELETE",
@@ -277,7 +277,7 @@ define([
277277
};
278278

279279
var url = utils.url_path_join(this.kernel_url, 'interrupt');
280-
$.ajax(url, {
280+
utils.ajax(url, {
281281
processData: false,
282282
cache: false,
283283
type: "POST",
@@ -319,7 +319,7 @@ define([
319319
};
320320

321321
var url = utils.url_path_join(this.kernel_url, 'restart');
322-
$.ajax(url, {
322+
utils.ajax(url, {
323323
processData: false,
324324
cache: false,
325325
type: "POST",

notebook/static/services/sessions/session.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ define([
7777
* @param {function} [error] - functon executed on ajax error
7878
*/
7979
Session.prototype.list = function (success, error) {
80-
$.ajax(this.session_service_url, {
80+
utils.ajax(this.session_service_url, {
8181
processData: false,
8282
cache: false,
8383
type: "GET",
@@ -118,7 +118,7 @@ define([
118118
}
119119
};
120120

121-
$.ajax(this.session_service_url, {
121+
utils.ajax(this.session_service_url, {
122122
processData: false,
123123
cache: false,
124124
type: "POST",
@@ -140,7 +140,7 @@ define([
140140
* @param {function} [error] - functon executed on ajax error
141141
*/
142142
Session.prototype.get_info = function (success, error) {
143-
$.ajax(this.session_url, {
143+
utils.ajax(this.session_url, {
144144
processData: false,
145145
cache: false,
146146
type: "GET",
@@ -166,7 +166,7 @@ define([
166166
this.notebook_model.path = path;
167167
}
168168

169-
$.ajax(this.session_url, {
169+
utils.ajax(this.session_url, {
170170
processData: false,
171171
cache: false,
172172
type: "PATCH",
@@ -193,7 +193,7 @@ define([
193193
this.kernel._kernel_dead();
194194
}
195195

196-
$.ajax(this.session_url, {
196+
utils.ajax(this.session_url, {
197197
processData: false,
198198
cache: false,
199199
type: "DELETE",

notebook/static/tree/js/notebooklist.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -632,7 +632,7 @@ define([
632632
'api/sessions',
633633
encodeURIComponent(session.id)
634634
);
635-
$.ajax(url, settings);
635+
utils.ajax(url, settings);
636636
}
637637
};
638638

notebook/static/tree/js/sessionlist.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ define([
6363
error : utils.log_ajax_error,
6464
};
6565
var url = utils.url_path_join(this.base_url, 'api/sessions');
66-
$.ajax(url, settings);
66+
utils.ajax(url, settings);
6767
};
6868

6969
SesssionList.prototype.sessions_loaded = function(data){

notebook/static/tree/js/terminallist.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,12 +61,12 @@ define([
6161
this.base_url,
6262
'api/terminals'
6363
);
64-
$.ajax(url, settings);
64+
utils.ajax(url, settings);
6565
};
6666

6767
TerminalList.prototype.load_terminals = function() {
6868
var url = utils.url_path_join(this.base_url, 'api/terminals');
69-
$.ajax(url, {
69+
utils.ajax(url, {
7070
type: "GET",
7171
cache: false,
7272
dataType: "json",
@@ -114,7 +114,7 @@ define([
114114
};
115115
var url = utils.url_path_join(that.base_url, 'api/terminals',
116116
utils.encode_uri_components(name));
117-
$.ajax(url, settings);
117+
utils.ajax(url, settings);
118118
return false;
119119
});
120120
item.find(".item_buttons").text("").append(shutdown_button);

notebook/templates/page.html

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,14 @@
113113

114114
</head>
115115

116-
<body class="{% block bodyclasses %}{% endblock %}" {% block params %}{% endblock %}>
116+
<body class="{% block bodyclasses %}{% endblock %}"
117+
{% block params %}
118+
data-xsrf-token="{{xsrf_token | urlencode}}"
119+
{% if logged_in and token %}
120+
data-jupyter-api-token="{{token | urlencode}}"
121+
{% endif %}
122+
{% endblock params %}
123+
>
117124

118125
<noscript>
119126
<div id='noscript'>

0 commit comments

Comments
 (0)