15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/util/google_update_settings.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 8e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/lazy_instance.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 12e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#include "base/synchronization/lock.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochnamespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::LazyInstance<std::string>::Leaky g_posix_client_id = 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LAZY_INSTANCE_INITIALIZER; 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbase::LazyInstance<base::Lock>::Leaky g_posix_client_id_lock = 20e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch LAZY_INSTANCE_INITIALIZER; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// File name used in the user data dir to indicate consent. 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochconst char kConsentToSendStats[] = "Consent To Send Stats"; 24e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 2503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void SetConsentFilePermissionIfNeeded(const base::FilePath& consent_file) { 2603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(OS_CHROMEOS) 2703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // The consent file needs to be world readable. See http://crbug.com/383003 2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int permissions; 2903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (base::GetPosixFilePermissions(consent_file, &permissions) && 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) (permissions & base::FILE_PERMISSION_READ_BY_OTHERS) == 0) { 3103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) permissions |= base::FILE_PERMISSION_READ_BY_OTHERS; 3203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::SetPosixFilePermissions(consent_file, permissions); 3303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 3403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif 3503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 3603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} // namespace 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleUpdateSettings::GetCollectStatsConsent() { 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath consent_file; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DATA, &consent_file); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) consent_file = consent_file.Append(kConsentToSendStats); 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!base::DirectoryExists(consent_file.DirName())) 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string tmp_guid; 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool consented = base::ReadFileToString(consent_file, &tmp_guid); 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch if (consented) { 5103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetConsentFilePermissionIfNeeded(consent_file); 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::AutoLock lock(g_posix_client_id_lock.Get()); 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_posix_client_id.Get().assign(tmp_guid); 55e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return consented; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleUpdateSettings::SetCollectStatsConsent(bool consented) { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath consent_dir; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PathService::Get(chrome::DIR_USER_DATA, &consent_dir); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!base::DirectoryExists(consent_dir)) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::AutoLock lock(g_posix_client_id_lock.Get()); 67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath consent_file = consent_dir.AppendASCII(kConsentToSendStats); 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (!consented) { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch g_posix_client_id.Get().clear(); 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return base::DeleteFile(consent_file, false); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const std::string& client_id = g_posix_client_id.Get(); 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (base::PathExists(consent_file) && client_id.empty()) 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return true; 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int size = client_id.size(); 7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool write_success = 8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::WriteFile(consent_file, client_id.c_str(), size) == size; 8103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (write_success) 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetConsentFilePermissionIfNeeded(consent_file); 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return write_success; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(gab): Implement storing/loading for all ClientInfo fields on POSIX. 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)scoped_ptr<metrics::ClientInfo> GoogleUpdateSettings::LoadMetricsClientInfo() { 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<metrics::ClientInfo> client_info(new metrics::ClientInfo); 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::AutoLock lock(g_posix_client_id_lock.Get()); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (g_posix_client_id.Get().empty()) 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scoped_ptr<metrics::ClientInfo>(); 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) client_info->client_id = g_posix_client_id.Get(); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return client_info.Pass(); 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// static 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// TODO(gab): Implement storing/loading for all ClientInfo fields on POSIX. 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void GoogleUpdateSettings::StoreMetricsClientInfo( 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const metrics::ClientInfo& client_info) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure that user has consented to send crashes. 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!GoogleUpdateSettings::GetCollectStatsConsent()) 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch { 108e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch // Since user has consented, write the metrics id to the file. 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::AutoLock lock(g_posix_client_id_lock.Get()); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) g_posix_client_id.Get() = client_info.client_id; 111e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch } 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GoogleUpdateSettings::SetCollectStatsConsent(true); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GetLastRunTime and SetLastRunTime are not implemented for posix. Their 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// current return values signal failure which the caller is designed to 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// handle. 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GoogleUpdateSettings::GetLastRunTime() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GoogleUpdateSettings::SetLastRunTime() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 128