blob: 5b8eac5f6f4fc8ca86f1a72909c99d6fa0d363a0 [file] [log] [blame]
// 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_split.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 (!base::IsAsciiAlpha(c) && !base::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;
#if defined(OS_ANDROID)
PathService::Get(base::DIR_ANDROID_APP_DATA, &base_path);
// |base_path| on android has an additional path, need to go up a level to get
// at other apps resources.
base_path = base_path.DirName();
base_path = base_path.AppendASCII("app_cached_apps");
#else
PathService::Get(base::DIR_EXE, &base_path);
#endif
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[resource_path.size() - 1] == '/' ||
resource_path.find("//") != std::string::npos)
return base::FilePath();
std::vector<std::string> path_components = base::SplitString(
resource_path, "/", base::KEEP_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
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