1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "xwalk/application/common/id_util.h"
7 #include "base/files/file_path.h"
8 #include "base/strings/string_util.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "crypto/sha2.h"
11 #include "xwalk/application/common/application_manifest_constants.h"
12 #include "xwalk/application/common/manifest_handlers/tizen_application_handler.h"
15 #include "xwalk/application/common/tizen/package_query.h"
17 #include "third_party/re2/re2/re2.h"
21 namespace application {
24 const char kWGTAppIdPattern[] = "\\A([0-9a-zA-Z]{10})[.][0-9a-zA-Z]{1,52}\\z";
25 const char kXPKAppIdPattern[] = "\\Axwalk[.]([a-p]{32})\\z";
26 const char kPkgIdPattern[] = "\\A([0-9a-zA-Z]{10,})\\z";
27 const std::string kAppIdPrefix("xwalk.");
29 const size_t kIdSize = 16;
32 // Converts a normal hexadecimal string into the alphabet used by applications.
33 // We use the characters 'a'-'p' instead of '0'-'f' to avoid ever having a
34 // completely numeric host, since some software interprets that as an IP
36 static void ConvertHexadecimalToIDAlphabet(std::string* id) {
37 for (size_t i = 0; i < id->size(); ++i) {
39 if (base::HexStringToInt(base::StringPiece(
40 id->begin() + i, id->begin() + i + 1), &val)) {
48 std::string GenerateId(const std::string& input) {
50 crypto::SHA256HashString(input, hash, sizeof(hash));
52 base::StringToLowerASCII(base::HexEncode(hash, sizeof(hash)));
53 ConvertHexadecimalToIDAlphabet(&output);
56 return kAppIdPrefix + output;
62 std::string GenerateIdForPath(const base::FilePath& path) {
63 std::string path_bytes =
64 std::string(reinterpret_cast<const char*>(path.value().data()),
65 path.value().size() * sizeof(base::FilePath::CharType));
66 return GenerateId(path_bytes);
70 bool IsValidWGTID(const std::string& id) {
71 return RE2::FullMatch(id, kWGTAppIdPattern);
74 bool IsValidXPKID(const std::string& id) {
75 return RE2::FullMatch(id, kXPKAppIdPattern);
78 bool IsValidPkgID(const std::string& id) {
79 return RE2::FullMatch(id, kPkgIdPattern);
82 std::string AppIdToPkgId(const std::string& id) {
83 std::string package_id;
84 if (!RE2::FullMatch(id, kWGTAppIdPattern, &package_id) &&
85 !RE2::FullMatch(id, kXPKAppIdPattern, &package_id)) {
86 LOG(ERROR) << "Cannot get package_id from invalid app id";
92 std::string PkgIdToAppId(const std::string& id) {
93 base::FilePath app_path = GetPackagePath(id);
97 return app_path.BaseName().value();
102 bool IsValidApplicationID(const std::string& id) {
103 #if defined(OS_TIZEN)
104 return (IsValidWGTID(id) || IsValidXPKID(id));
107 std::string temp = base::StringToLowerASCII(id);
108 // Verify that the id is legal.
109 if (temp.size() != (kIdSize * 2))
112 // We only support lowercase IDs, because IDs can be used as URL components
113 // (where GURL will lowercase it).
114 for (size_t i = 0; i < temp.size(); ++i)
115 if (temp[i] < 'a' || temp[i] > 'p')
121 } // namespace application