diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2014-12-17 14:59:05 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2014-12-17 14:59:05 +0100 |
commit | b5e9998b15d8a51bdca9cdb2d0981f69629f532a (patch) | |
tree | 365a26903cd4df16fbcfe3d6f9553d1ce62b2c1a /platform | |
parent | 936e09651424f111ac2ac64e2e60e2d13b082ebf (diff) | |
download | qtlocation-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.mm | 18 | ||||
-rw-r--r-- | platform/default/application_root.cpp | 14 | ||||
-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(). } } |