OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 // | 4 // |
5 // This file defines functions that integrate Chrome in Windows shell. These | 5 // This file defines functions that integrate Chrome in Windows shell. These |
6 // functions can be used by Chrome as well as Chrome installer. All of the | 6 // functions can be used by Chrome as well as Chrome installer. All of the |
7 // work is done by the local functions defined in anonymous namespace in | 7 // work is done by the local functions defined in anonymous namespace in |
8 // this class. | 8 // this class. |
9 | 9 |
10 #include "chrome/installer/util/shell_util.h" | 10 #include "chrome/installer/util/shell_util.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 #include "chrome/installer/util/browser_distribution.h" | 50 #include "chrome/installer/util/browser_distribution.h" |
51 #include "chrome/installer/util/install_util.h" | 51 #include "chrome/installer/util/install_util.h" |
52 #include "chrome/installer/util/installer_util_strings.h" | 52 #include "chrome/installer/util/installer_util_strings.h" |
53 #include "chrome/installer/util/l10n_string_util.h" | 53 #include "chrome/installer/util/l10n_string_util.h" |
54 #include "chrome/installer/util/master_preferences.h" | 54 #include "chrome/installer/util/master_preferences.h" |
55 #include "chrome/installer/util/master_preferences_constants.h" | 55 #include "chrome/installer/util/master_preferences_constants.h" |
56 #include "chrome/installer/util/registry_entry.h" | 56 #include "chrome/installer/util/registry_entry.h" |
57 #include "chrome/installer/util/scoped_user_protocol_entry.h" | 57 #include "chrome/installer/util/scoped_user_protocol_entry.h" |
58 #include "chrome/installer/util/util_constants.h" | 58 #include "chrome/installer/util/util_constants.h" |
59 #include "chrome/installer/util/work_item.h" | 59 #include "chrome/installer/util/work_item.h" |
| 60 #include "components/base32/base32.h" |
60 | 61 |
61 using base::win::RegKey; | 62 using base::win::RegKey; |
62 | 63 |
63 namespace { | 64 namespace { |
64 | 65 |
65 // An enum used to tell QuickIsChromeRegistered() which level of registration | 66 // An enum used to tell QuickIsChromeRegistered() which level of registration |
66 // the caller wants to confirm. | 67 // the caller wants to confirm. |
67 enum RegistrationConfirmationLevel { | 68 enum RegistrationConfirmationLevel { |
68 // Only look for Chrome's ProgIds. | 69 // Only look for Chrome's ProgIds. |
69 // This is sufficient when we are trying to determine the suffix of the | 70 // This is sufficient when we are trying to determine the suffix of the |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 UserSpecificRegistrySuffix::UserSpecificRegistrySuffix() { | 130 UserSpecificRegistrySuffix::UserSpecificRegistrySuffix() { |
130 base::string16 user_sid; | 131 base::string16 user_sid; |
131 if (!base::win::GetUserSidString(&user_sid)) { | 132 if (!base::win::GetUserSidString(&user_sid)) { |
132 NOTREACHED(); | 133 NOTREACHED(); |
133 return; | 134 return; |
134 } | 135 } |
135 static_assert(sizeof(base::MD5Digest) == 16, "size of MD5 not as expected"); | 136 static_assert(sizeof(base::MD5Digest) == 16, "size of MD5 not as expected"); |
136 base::MD5Digest md5_digest; | 137 base::MD5Digest md5_digest; |
137 std::string user_sid_ascii(base::UTF16ToASCII(user_sid)); | 138 std::string user_sid_ascii(base::UTF16ToASCII(user_sid)); |
138 base::MD5Sum(user_sid_ascii.c_str(), user_sid_ascii.length(), &md5_digest); | 139 base::MD5Sum(user_sid_ascii.c_str(), user_sid_ascii.length(), &md5_digest); |
139 const base::string16 base32_md5( | 140 std::string base32_md5 = base32::Base32Encode( |
140 ShellUtil::ByteArrayToBase32(md5_digest.a, arraysize(md5_digest.a))); | 141 base::StringPiece(reinterpret_cast<char*>(md5_digest.a), |
141 // The value returned by the base32 algorithm above must never change and | 142 arraysize(md5_digest.a)), |
142 // must always be 26 characters long (i.e. if someone ever moves this to | 143 base32::Base32EncodePolicy::OMIT_PADDING); |
143 // base and implements the full base32 algorithm (i.e. with appended '=' | 144 // The value returned by the base32 algorithm above must never change. |
144 // signs in the output), they must provide a flag to allow this method to | |
145 // still request the output with no appended '=' signs). | |
146 DCHECK_EQ(base32_md5.length(), 26U); | 145 DCHECK_EQ(base32_md5.length(), 26U); |
147 suffix_.reserve(base32_md5.length() + 1); | 146 suffix_.reserve(base32_md5.length() + 1); |
148 suffix_.assign(1, L'.'); | 147 suffix_.assign(1, L'.'); |
149 suffix_.append(base32_md5); | 148 suffix_.append(base::ASCIIToUTF16(base32_md5)); |
150 } | 149 } |
151 | 150 |
152 bool UserSpecificRegistrySuffix::GetSuffix(base::string16* suffix) { | 151 bool UserSpecificRegistrySuffix::GetSuffix(base::string16* suffix) { |
153 if (suffix_.empty()) { | 152 if (suffix_.empty()) { |
154 NOTREACHED(); | 153 NOTREACHED(); |
155 return false; | 154 return false; |
156 } | 155 } |
157 suffix->assign(suffix_); | 156 suffix->assign(suffix_); |
158 return true; | 157 return true; |
159 } | 158 } |
(...skipping 2102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2262 if (::GetUserName(user_name, &size) == 0 || size < 1) { | 2261 if (::GetUserName(user_name, &size) == 0 || size < 1) { |
2263 NOTREACHED(); | 2262 NOTREACHED(); |
2264 return false; | 2263 return false; |
2265 } | 2264 } |
2266 suffix->reserve(size); | 2265 suffix->reserve(size); |
2267 suffix->assign(1, L'.'); | 2266 suffix->assign(1, L'.'); |
2268 suffix->append(user_name, size - 1); | 2267 suffix->append(user_name, size - 1); |
2269 return true; | 2268 return true; |
2270 } | 2269 } |
2271 | 2270 |
2272 base::string16 ShellUtil::ByteArrayToBase32(const uint8_t* bytes, size_t size) { | |
2273 static const char kEncoding[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; | |
2274 | |
2275 // Eliminate special cases first. | |
2276 if (size == 0) { | |
2277 return base::string16(); | |
2278 } else if (size == 1) { | |
2279 base::string16 ret; | |
2280 ret.push_back(kEncoding[(bytes[0] & 0xf8) >> 3]); | |
2281 ret.push_back(kEncoding[(bytes[0] & 0x07) << 2]); | |
2282 return ret; | |
2283 } else if (size >= std::numeric_limits<size_t>::max() / 8) { | |
2284 // If |size| is too big, the calculation of |encoded_length| below will | |
2285 // overflow. | |
2286 NOTREACHED(); | |
2287 return base::string16(); | |
2288 } | |
2289 | |
2290 // Overestimate the number of bits in the string by 4 so that dividing by 5 | |
2291 // is the equivalent of rounding up the actual number of bits divided by 5. | |
2292 const size_t encoded_length = (size * 8 + 4) / 5; | |
2293 | |
2294 base::string16 ret; | |
2295 ret.reserve(encoded_length); | |
2296 | |
2297 // A bit stream which will be read from the left and appended to from the | |
2298 // right as it's emptied. | |
2299 uint16_t bit_stream = (bytes[0] << 8) + bytes[1]; | |
2300 size_t next_byte_index = 2; | |
2301 int free_bits = 0; | |
2302 while (free_bits < 16) { | |
2303 // Extract the 5 leftmost bits in the stream | |
2304 ret.push_back(kEncoding[(bit_stream & 0xf800) >> 11]); | |
2305 bit_stream <<= 5; | |
2306 free_bits += 5; | |
2307 | |
2308 // If there is enough room in the bit stream, inject another byte (if there | |
2309 // are any left...). | |
2310 if (free_bits >= 8 && next_byte_index < size) { | |
2311 free_bits -= 8; | |
2312 bit_stream += bytes[next_byte_index++] << free_bits; | |
2313 } | |
2314 } | |
2315 | |
2316 DCHECK_EQ(ret.length(), encoded_length); | |
2317 return ret; | |
2318 } | |
2319 | |
2320 // static | 2271 // static |
2321 bool ShellUtil::AddFileAssociations( | 2272 bool ShellUtil::AddFileAssociations( |
2322 const base::string16& prog_id, | 2273 const base::string16& prog_id, |
2323 const base::CommandLine& command_line, | 2274 const base::CommandLine& command_line, |
2324 const base::string16& file_type_name, | 2275 const base::string16& file_type_name, |
2325 const base::FilePath& icon_path, | 2276 const base::FilePath& icon_path, |
2326 const std::set<base::string16>& file_extensions) { | 2277 const std::set<base::string16>& file_extensions) { |
2327 ScopedVector<RegistryEntry> entries; | 2278 ScopedVector<RegistryEntry> entries; |
2328 | 2279 |
2329 // Create a class for this app. | 2280 // Create a class for this app. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2380 itr != entries.end(); ++itr) | 2331 itr != entries.end(); ++itr) |
2381 (*itr)->AddToWorkItemList(root, items.get()); | 2332 (*itr)->AddToWorkItemList(root, items.get()); |
2382 | 2333 |
2383 // Apply all the registry changes and if there is a problem, rollback | 2334 // Apply all the registry changes and if there is a problem, rollback |
2384 if (!items->Do()) { | 2335 if (!items->Do()) { |
2385 items->Rollback(); | 2336 items->Rollback(); |
2386 return false; | 2337 return false; |
2387 } | 2338 } |
2388 return true; | 2339 return true; |
2389 } | 2340 } |
OLD | NEW |