Skip to content

Commit

Permalink
Merge pull request ipython#4575 from minrk/encode_paths
Browse files Browse the repository at this point in the history
make sure to encode URL components for API requests
  • Loading branch information
minrk committed Dec 19, 2013
2 parents c3933f1 + 9672bbd commit 0bf721d
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 64 deletions.
15 changes: 15 additions & 0 deletions IPython/html/static/base/js/utils.js
Expand Up @@ -419,6 +419,19 @@ IPython.utils = (function (IPython) {
}
return url;
};


var encode_uri_components = function (uri) {
// encode just the components of a multi-segment uri,
// leaving '/' separators
return uri.split('/').map(encodeURIComponent).join('/');
}

var url_join_encode = function () {
// join a sequence of url components with '/',
// encoding each component with encodeURIComponent
return encode_uri_components(url_path_join.apply(null, arguments));
};


var splitext = function (filename) {
Expand Down Expand Up @@ -458,6 +471,8 @@ IPython.utils = (function (IPython) {
autoLinkUrls : autoLinkUrls,
points_to_pixels : points_to_pixels,
url_path_join : url_path_join,
url_join_encode : url_join_encode,
encode_uri_components : encode_uri_components,
splitext : splitext,
always_new : always_new,
browser : browser
Expand Down
4 changes: 2 additions & 2 deletions IPython/html/static/notebook/js/menubar.js
Expand Up @@ -77,7 +77,7 @@ var IPython = (function (IPython) {
IPython.notebook.new_notebook();
});
this.element.find('#open_notebook').click(function () {
window.open(utils.url_path_join(
window.open(utils.url_join_encode(
that.baseProjectUrl(),
'tree',
that.notebookPath()
Expand All @@ -93,7 +93,7 @@ var IPython = (function (IPython) {
IPython.notebook.save_notebook({async : false});
}

var url = utils.url_path_join(
var url = utils.url_join_encode(
that.baseProjectUrl(),
'files',
that.notebookPath(),
Expand Down
82 changes: 40 additions & 42 deletions IPython/html/static/notebook/js/notebook.js
Expand Up @@ -79,15 +79,11 @@ var IPython = (function (IPython) {
};

Notebook.prototype.notebookName = function() {
var name = $('body').data('notebookName');
name = decodeURIComponent(name);
return name;
return $('body').data('notebookName');
};

Notebook.prototype.notebookPath = function() {
var path = $('body').data('notebookPath');
path = decodeURIComponent(path);
return path
return $('body').data('notebookPath');
};

/**
Expand Down Expand Up @@ -1689,10 +1685,10 @@ var IPython = (function (IPython) {
}
}
$([IPython.events]).trigger('notebook_saving.Notebook');
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_path,
this.notebook_name
);
$.ajax(url, settings);
Expand Down Expand Up @@ -1743,15 +1739,15 @@ var IPython = (function (IPython) {
* @method save_notebook_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} status Description of response status
* @param {String} error_msg HTTP error message
* @param {String} error HTTP error message
*/
Notebook.prototype.save_notebook_error = function (xhr, status, error_msg) {
$([IPython.events]).trigger('notebook_save_failed.Notebook');
Notebook.prototype.save_notebook_error = function (xhr, status, error) {
$([IPython.events]).trigger('notebook_save_failed.Notebook', [xhr, status, error]);
};

Notebook.prototype.new_notebook = function(){
var path = this.notebookPath();
var base_project_url = this.baseProjectUrl();
var path = this.notebook_path;
var base_project_url = this._baseProjectUrl;
var settings = {
processData : false,
cache : false,
Expand All @@ -1761,7 +1757,7 @@ var IPython = (function (IPython) {
success : function (data, status, xhr){
var notebook_name = data.name;
window.open(
utils.url_path_join(
utils.url_join_encode(
base_project_url,
'notebooks',
path,
Expand All @@ -1771,7 +1767,7 @@ var IPython = (function (IPython) {
);
}
};
var url = utils.url_path_join(
var url = utils.url_join_encode(
base_project_url,
'api/notebooks',
path
Expand All @@ -1781,8 +1777,8 @@ var IPython = (function (IPython) {


Notebook.prototype.copy_notebook = function(){
var path = this.notebookPath();
var base_project_url = this.baseProjectUrl();
var path = this.notebook_path;
var base_project_url = this._baseProjectUrl;
var settings = {
processData : false,
cache : false,
Expand All @@ -1791,15 +1787,15 @@ var IPython = (function (IPython) {
data : JSON.stringify({copy_from : this.notebook_name}),
async : false,
success : function (data, status, xhr) {
window.open(utils.url_path_join(
window.open(utils.url_join_encode(
base_project_url,
'notebooks',
data.path,
data.name
), '_blank');
}
};
var url = utils.url_path_join(
var url = utils.url_join_encode(
base_project_url,
'api/notebooks',
path
Expand All @@ -1821,30 +1817,31 @@ var IPython = (function (IPython) {
error : $.proxy(that.rename_error, this)
};
$([IPython.events]).trigger('rename_notebook.Notebook', data);
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_path,
this.notebook_name
);
$.ajax(url, settings);
};


Notebook.prototype.rename_success = function (json, status, xhr) {
this.notebook_name = json.name
var name = this.notebook_name
var path = json.path
this.notebook_name = json.name;
var name = this.notebook_name;
var path = json.path;
this.session.rename_notebook(name, path);
$([IPython.events]).trigger('notebook_renamed.Notebook', json);
}

Notebook.prototype.rename_error = function (json, status, xhr) {
Notebook.prototype.rename_error = function (xhr, status, error) {
var that = this;
var dialog = $('<div/>').append(
$("<p/>").addClass("rename-message")
.html('This notebook name already exists.')
)
$([IPython.events]).trigger('notebook_rename_failed.Notebook', [xhr, status, error]);
IPython.dialog.modal({
title: "Notebook Rename Error!",
body: dialog,
Expand Down Expand Up @@ -1889,10 +1886,10 @@ var IPython = (function (IPython) {
error : $.proxy(this.load_notebook_error,this),
};
$([IPython.events]).trigger('notebook_loading.Notebook');
var url = utils.url_path_join(
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_path,
this.notebook_name
);
$.ajax(url, settings);
Expand Down Expand Up @@ -1974,12 +1971,13 @@ var IPython = (function (IPython) {
*
* @method load_notebook_error
* @param {jqXHR} xhr jQuery Ajax object
* @param {String} textStatus Description of response status
* @param {String} errorThrow HTTP error message
* @param {String} status Description of response status
* @param {String} error HTTP error message
*/
Notebook.prototype.load_notebook_error = function (xhr, textStatus, errorThrow) {
Notebook.prototype.load_notebook_error = function (xhr, status, error) {
$([IPython.events]).trigger('notebook_load_failed.Notebook', [xhr, status, error]);
if (xhr.status === 400) {
var msg = errorThrow;
var msg = error;
} else if (xhr.status === 500) {
var msg = "An unknown error occurred while loading this notebook. " +
"This version can load notebook formats " +
Expand Down Expand Up @@ -2034,10 +2032,10 @@ var IPython = (function (IPython) {
* @method list_checkpoints
*/
Notebook.prototype.list_checkpoints = function () {
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_path,
this.notebook_name,
'checkpoints'
);
Expand Down Expand Up @@ -2085,8 +2083,8 @@ var IPython = (function (IPython) {
* @method create_checkpoint
*/
Notebook.prototype.create_checkpoint = function () {
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_name,
Expand Down Expand Up @@ -2172,8 +2170,8 @@ var IPython = (function (IPython) {
*/
Notebook.prototype.restore_checkpoint = function (checkpoint) {
$([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint);
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_name,
Expand Down Expand Up @@ -2220,8 +2218,8 @@ var IPython = (function (IPython) {
*/
Notebook.prototype.delete_checkpoint = function (checkpoint) {
$([IPython.events]).trigger('notebook_restoring.Notebook', checkpoint);
var url = utils.url_path_join(
this.baseProjectUrl(),
var url = utils.url_join_encode(
this._baseProjectUrl,
'api/notebooks',
this.notebookPath(),
this.notebook_name,
Expand Down
4 changes: 2 additions & 2 deletions IPython/html/static/notebook/js/savewidget.js
Expand Up @@ -128,8 +128,8 @@ var IPython = (function (IPython) {
SaveWidget.prototype.update_address_bar = function(){
var nbname = IPython.notebook.notebook_name;
var path = IPython.notebook.notebookPath();
var state = {path : utils.url_path_join(path,nbname)};
window.history.replaceState(state, "", utils.url_path_join(
var state = {path : utils.url_join_encode(path, nbname)};
window.history.replaceState(state, "", utils.url_join_encode(
"/notebooks",
path,
nbname)
Expand Down
4 changes: 2 additions & 2 deletions IPython/html/static/services/kernels/js/kernel.js
Expand Up @@ -113,7 +113,7 @@ var IPython = (function (IPython) {
$([IPython.events]).trigger('status_restarting.Kernel', {kernel: this});
if (this.running) {
this.stop_channels();
var url = utils.url_path_join(this.kernel_url, "restart");
var url = utils.url_join_encode(this.kernel_url, "restart");
$.post(url,
$.proxy(this._kernel_started, this),
'json'
Expand All @@ -133,7 +133,7 @@ var IPython = (function (IPython) {
ws_url = prot + location.host + ws_url;
}
this.ws_url = ws_url;
this.kernel_url = utils.url_path_join(this.base_url, this.kernel_id);
this.kernel_url = utils.url_join_encode(this.base_url, this.kernel_id);
this.start_channels();
};

Expand Down
6 changes: 3 additions & 3 deletions IPython/html/static/services/sessions/js/session.js
Expand Up @@ -44,7 +44,7 @@ var IPython = (function (IPython) {
}
},
};
var url = utils.url_path_join(this._baseProjectUrl, 'api/sessions');
var url = utils.url_join_encode(this._baseProjectUrl, 'api/sessions');
$.ajax(url, settings);
};

Expand All @@ -64,7 +64,7 @@ var IPython = (function (IPython) {
data: JSON.stringify(model),
dataType : "json",
};
var url = utils.url_path_join(this._baseProjectUrl, 'api/sessions', this.id);
var url = utils.url_join_encode(this._baseProjectUrl, 'api/sessions', this.id);
$.ajax(url, settings);
};

Expand All @@ -76,7 +76,7 @@ var IPython = (function (IPython) {
dataType : "json",
};
this.kernel.running = false;
var url = utils.url_path_join(this._baseProjectUrl, 'api/sessions', this.id);
var url = utils.url_join_encode(this._baseProjectUrl, 'api/sessions', this.id);
$.ajax(url, settings);
};

Expand Down
6 changes: 3 additions & 3 deletions IPython/html/static/tree/js/clusterlist.js
Expand Up @@ -51,7 +51,7 @@ var IPython = (function (IPython) {
dataType : "json",
success : $.proxy(this.load_list_success, this)
};
var url = utils.url_path_join(this.baseProjectUrl(), 'clusters');
var url = utils.url_join_encode(this.baseProjectUrl(), 'clusters');
$.ajax(url, settings);
};

Expand Down Expand Up @@ -137,7 +137,7 @@ var IPython = (function (IPython) {
}
};
status_col.html('starting');
var url = utils.url_path_join(
var url = utils.url_join_encode(
that.baseProjectUrl(),
'clusters',
that.data.profile,
Expand Down Expand Up @@ -179,7 +179,7 @@ var IPython = (function (IPython) {
}
};
status_col.html('stopping');
var url = utils.url_path_join(
var url = utils.url_join_encode(
that.baseProjectUrl(),
'clusters',
that.data.profile,
Expand Down

0 comments on commit 0bf721d

Please sign in to comment.