summaryrefslogtreecommitdiff
path: root/platform
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-12-17 14:59:05 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-12-17 14:59:05 +0100
commitb5e9998b15d8a51bdca9cdb2d0981f69629f532a (patch)
tree365a26903cd4df16fbcfe3d6f9553d1ce62b2c1a /platform
parent936e09651424f111ac2ac64e2e60e2d13b082ebf (diff)
downloadqtlocation-mapboxgl-b5e9998b15d8a51bdca9cdb2d0981f69629f532a.tar.gz
change file:// to asset:// to indicate that they aren't arbitrary files
refs #579
Diffstat (limited to 'platform')
-rw-r--r--platform/darwin/application_root.mm18
-rw-r--r--platform/default/application_root.cpp14
-rw-r--r--platform/default/asset_request_libuv.cpp (renamed from platform/default/file_request_libuv.cpp)67
3 files changed, 72 insertions, 27 deletions
diff --git a/platform/darwin/application_root.mm b/platform/darwin/application_root.mm
new file mode 100644
index 0000000000..19b872c54d
--- /dev/null
+++ b/platform/darwin/application_root.mm
@@ -0,0 +1,18 @@
+#import <Foundation/Foundation.h>
+
+#include <mbgl/platform/platform.hpp>
+
+namespace mbgl {
+namespace platform {
+
+// Returns the path to the default shader cache on this system.
+std::string applicationRoot() {
+ static const std::string root = []() -> std::string {
+ NSString *path = [[[NSBundle mainBundle] resourceURL] path];
+ return {[path cStringUsingEncoding : NSUTF8StringEncoding],
+ [path lengthOfBytesUsingEncoding:NSUTF8StringEncoding]};
+ }();
+ return root;
+}
+}
+}
diff --git a/platform/default/application_root.cpp b/platform/default/application_root.cpp
new file mode 100644
index 0000000000..e6f73e0211
--- /dev/null
+++ b/platform/default/application_root.cpp
@@ -0,0 +1,14 @@
+#include <mbgl/platform/platform.hpp>
+
+#include <mbgl/util/uv.hpp>
+
+namespace mbgl {
+namespace platform {
+
+// Returns the path to the default cache database on this system.
+std::string applicationRoot() {
+ return uv::cwd();
+}
+
+}
+}
diff --git a/platform/default/file_request_libuv.cpp b/platform/default/asset_request_libuv.cpp
index f874bed8d2..202e39967e 100644
--- a/platform/default/file_request_libuv.cpp
+++ b/platform/default/asset_request_libuv.cpp
@@ -1,5 +1,6 @@
-#include <mbgl/storage/file_request.hpp>
+#include <mbgl/storage/asset_request.hpp>
#include <mbgl/storage/response.hpp>
+#include <mbgl/platform/platform.hpp>
#include <mbgl/util/std.hpp>
#include <uv.h>
@@ -8,9 +9,9 @@
namespace mbgl {
-struct FileRequestBaton {
- FileRequestBaton(FileRequest *request_, const std::string &path, uv_loop_t *loop);
- ~FileRequestBaton();
+struct AssetRequestBaton {
+ AssetRequestBaton(AssetRequest *request_, const std::string &path, uv_loop_t *loop);
+ ~AssetRequestBaton();
void cancel();
static void file_opened(uv_fs_t *req);
@@ -21,7 +22,7 @@ struct FileRequestBaton {
static void cleanup(uv_fs_t *req);
const std::thread::id thread_id;
- FileRequest *request = nullptr;
+ AssetRequest *request = nullptr;
uv_fs_t req;
uv_file fd = -1;
bool canceled = false;
@@ -29,16 +30,16 @@ struct FileRequestBaton {
uv_buf_t buffer;
};
-FileRequestBaton::FileRequestBaton(FileRequest *request_, const std::string &path, uv_loop_t *loop)
+AssetRequestBaton::AssetRequestBaton(AssetRequest *request_, const std::string &path, uv_loop_t *loop)
: thread_id(std::this_thread::get_id()), request(request_) {
req.data = this;
uv_fs_open(loop, &req, path.c_str(), O_RDONLY, S_IRUSR, file_opened);
}
-FileRequestBaton::~FileRequestBaton() {
+AssetRequestBaton::~AssetRequestBaton() {
}
-void FileRequestBaton::cancel() {
+void AssetRequestBaton::cancel() {
canceled = true;
// uv_cancel fails frequently when the request has already been started.
@@ -47,8 +48,8 @@ void FileRequestBaton::cancel() {
uv_cancel((uv_req_t *)&req);
}
-void FileRequestBaton::notify_error(uv_fs_t *req) {
- FileRequestBaton *ptr = (FileRequestBaton *)req->data;
+void AssetRequestBaton::notify_error(uv_fs_t *req) {
+ AssetRequestBaton *ptr = (AssetRequestBaton *)req->data;
assert(ptr->thread_id == std::this_thread::get_id());
if (ptr->request && req->result < 0 && !ptr->canceled && req->result != UV_ECANCELED) {
@@ -63,8 +64,8 @@ void FileRequestBaton::notify_error(uv_fs_t *req) {
}
}
-void FileRequestBaton::file_opened(uv_fs_t *req) {
- FileRequestBaton *ptr = (FileRequestBaton *)req->data;
+void AssetRequestBaton::file_opened(uv_fs_t *req) {
+ AssetRequestBaton *ptr = (AssetRequestBaton *)req->data;
assert(ptr->thread_id == std::this_thread::get_id());
if (req->result < 0) {
@@ -78,7 +79,7 @@ void FileRequestBaton::file_opened(uv_fs_t *req) {
uv_fs_req_cleanup(req);
if (ptr->canceled || !ptr->request) {
- // Either the FileRequest object has been destructed, or the
+ // Either the AssetRequest object has been destructed, or the
// request was canceled.
uv_fs_close(req->loop, req, fd, file_closed);
} else {
@@ -88,8 +89,8 @@ void FileRequestBaton::file_opened(uv_fs_t *req) {
}
}
-void FileRequestBaton::file_stated(uv_fs_t *req) {
- FileRequestBaton *ptr = (FileRequestBaton *)req->data;
+void AssetRequestBaton::file_stated(uv_fs_t *req) {
+ AssetRequestBaton *ptr = (AssetRequestBaton *)req->data;
assert(ptr->thread_id == std::this_thread::get_id());
if (req->result != 0 || ptr->canceled || !ptr->request) {
@@ -135,8 +136,8 @@ void FileRequestBaton::file_stated(uv_fs_t *req) {
}
}
-void FileRequestBaton::file_read(uv_fs_t *req) {
- FileRequestBaton *ptr = (FileRequestBaton *)req->data;
+void AssetRequestBaton::file_read(uv_fs_t *req) {
+ AssetRequestBaton *ptr = (AssetRequestBaton *)req->data;
assert(ptr->thread_id == std::this_thread::get_id());
if (req->result < 0 || ptr->canceled || !ptr->request) {
@@ -157,8 +158,8 @@ void FileRequestBaton::file_read(uv_fs_t *req) {
uv_fs_close(req->loop, req, ptr->fd, file_closed);
}
-void FileRequestBaton::file_closed(uv_fs_t *req) {
- assert(((FileRequestBaton *)req->data)->thread_id == std::this_thread::get_id());
+void AssetRequestBaton::file_closed(uv_fs_t *req) {
+ assert(((AssetRequestBaton *)req->data)->thread_id == std::this_thread::get_id());
if (req->result < 0) {
// Closing the file failed. But there isn't anything we can do.
@@ -167,8 +168,8 @@ void FileRequestBaton::file_closed(uv_fs_t *req) {
cleanup(req);
}
-void FileRequestBaton::cleanup(uv_fs_t *req) {
- FileRequestBaton *ptr = (FileRequestBaton *)req->data;
+void AssetRequestBaton::cleanup(uv_fs_t *req) {
+ AssetRequestBaton *ptr = (AssetRequestBaton *)req->data;
assert(ptr->thread_id == std::this_thread::get_id());
if (ptr->request) {
@@ -180,17 +181,29 @@ void FileRequestBaton::cleanup(uv_fs_t *req) {
}
-FileRequest::FileRequest(const std::string &path_, uv_loop_t *loop)
- : BaseRequest(path_), ptr(new FileRequestBaton(this, path, loop)) {
+AssetRequest::AssetRequest(const std::string &path_, uv_loop_t *loop)
+ : BaseRequest(path_) {
+ if (!path.empty() && path[0] == '/') {
+ // This is an absolute path. We don't allow this. Note that this is not a way to absolutely
+ // prevent access to resources outside the application bundle; e.g. there could be symlinks
+ // in the application bundle that link to outside. We don't care about these.
+ response = util::make_unique<Response>();
+ response->code = 403;
+ response->message = "Path is outside the application bundle";
+ notify();
+ } else {
+ // Note: The AssetRequestBaton object is deleted in AssetRequestBaton::cleanup().
+ ptr = new AssetRequestBaton(this, platform::applicationRoot() + "/" + path, loop);
+ }
}
-void FileRequest::cancel() {
+void AssetRequest::cancel() {
assert(thread_id == std::this_thread::get_id());
if (ptr) {
ptr->cancel();
- // When deleting a FileRequest object with a uv_fs_* call is in progress, we are making sure
+ // When deleting a AssetRequest object with a uv_fs_* call is in progress, we are making sure
// that the callback doesn't accidentally reference this object again.
ptr->request = nullptr;
ptr = nullptr;
@@ -199,11 +212,11 @@ void FileRequest::cancel() {
notify();
}
-FileRequest::~FileRequest() {
+AssetRequest::~AssetRequest() {
assert(thread_id == std::this_thread::get_id());
cancel();
- // Note: The FileRequestBaton object is deleted in FileRequestBaton::cleanup().
+ // Note: The AssetRequestBaton object is deleted in AssetRequestBaton::cleanup().
}
}