| Index: components/resource_provider/file_utils.cc
|
| diff --git a/components/resource_provider/file_utils.cc b/components/resource_provider/file_utils.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..468d27ef87a7a3c7e08a41c3b54c1dd81999103d
|
| --- /dev/null
|
| +++ b/components/resource_provider/file_utils.cc
|
| @@ -0,0 +1,66 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "components/resource_provider/file_utils.h"
|
| +
|
| +#include "base/files/file_path.h"
|
| +#include "base/path_service.h"
|
| +#include "base/strings/string_util.h"
|
| +#include "url/gurl.h"
|
| +
|
| +namespace resource_provider {
|
| +namespace {
|
| +
|
| +bool IsPathNameValid(const std::string& name) {
|
| + if (name.empty() || name == "." || name == "..")
|
| + return false;
|
| +
|
| + for (auto c : name) {
|
| + if (!IsAsciiAlpha(c) && !IsAsciiDigit(c) && c != '_' && c != '.')
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +base::FilePath GetPathForApplicationUrl(const GURL& application_url) {
|
| + if (application_url.scheme() != "mojo")
|
| + return base::FilePath();
|
| +
|
| + std::string path = application_url.path();
|
| + base::TrimString(path, "/", &path);
|
| +
|
| + if (!IsPathNameValid(path))
|
| + return base::FilePath();
|
| +
|
| + base::FilePath base_path;
|
| + PathService::Get(base::DIR_EXE, &base_path);
|
| + return base_path.AppendASCII(path).AppendASCII("resources");
|
| +}
|
| +
|
| +base::FilePath GetPathForResourceNamed(const base::FilePath& app_path,
|
| + const std::string& resource_path) {
|
| + CHECK(!app_path.empty());
|
| +
|
| + if (resource_path.empty() || resource_path[0] == '/' ||
|
| + resource_path.back() == '/' ||
|
| + resource_path.find("//") != std::string::npos)
|
| + return base::FilePath();
|
| +
|
| + std::vector<std::string> path_components;
|
| + Tokenize(resource_path, "/", &path_components);
|
| + if (path_components.empty())
|
| + return base::FilePath();
|
| +
|
| + base::FilePath result(app_path);
|
| + for (const auto& path_component : path_components) {
|
| + if (!IsPathNameValid(path_component))
|
| + return base::FilePath();
|
| + result = result.AppendASCII(path_component);
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +} // namespace resource_provider
|
|
|