Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(45)

Side by Side Diff: components/update_client/updater_state_mac.mm

Issue 2862723002: Add updater state for Mac. (Closed)
Patch Set: Added check for nil version in the info.plist. More comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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.
4
5 #import <Foundation/Foundation.h>
6 #import <OpenDirectory/OpenDirectory.h>
Sorin Jianu 2017/05/04 19:53:59 Usually, an empty line is inserted between 6 and 7
borisv 2017/05/04 22:19:27 Done.
7 #include "base/files/file_path.h"
8 #include "base/files/file_util.h"
9 #include "base/mac/foundation_util.h"
10 #include "base/strings/sys_string_conversions.h"
11 #include "base/version.h"
12 #include "components/update_client/updater_state.h"
13
14 namespace update_client {
15
16 namespace {
17 const base::FilePath::CharType kKeystonePlist[] = FILE_PATH_LITERAL(
Sorin Jianu 2017/05/04 19:53:59 Namespace formatting: please include an empty line
borisv 2017/05/04 22:19:27 Done.
18 "Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/"
19 "Contents/Info.plist");
20
21 // Gets a value from the updater settings. Returns a retained object.
22 // T should be a toll-free Foundation framework type. See Apple's
23 // documentation for tooll-free bridging.
Sorin Jianu 2017/05/04 19:53:59 toll
borisv 2017/05/04 22:19:27 Done.
24 template<class T>
25 T* CopyUpdaterSettingsValue(NSString* value_name) {
26 CFStringRef app_id = CFSTR("com.google.Keystone.Agent");
27 CFPropertyListRef plist =
28 CFPreferencesCopyAppValue(base::mac::NSToCFCast(value_name), app_id);
29 if (!plist) return nil;
30 return base::mac::ObjCCastStrict<T>(static_cast<id>(plist));
31 }
32
33 base::Version GetVersionFromPlist(const base::FilePath& info_plist) {
34 @autoreleasepool {
35 NSData* data =
36 [NSData dataWithContentsOfFile:
37 base::mac::FilePathToNSString(info_plist)];
38 if ([data length] == 0) {
39 return base::Version();
40 }
41 NSDictionary* all_keys = base::mac::ObjCCastStrict<NSDictionary>(
42 [NSPropertyListSerialization propertyListWithData:data
43 options:NSPropertyListImmutable
44 format:nil
45 error:nil]);
46 if (all_keys == nil) {
47 return base::Version();
48 }
49 CFStringRef version =
50 base::mac::GetValueFromDictionary<CFStringRef>(
51 base::mac::NSToCFCast(all_keys),
52 kCFBundleVersionKey);
53 if (version == NULL) {
54 return base::Version();
55 }
56 return base::Version(base::SysCFStringRefToUTF8(version));
57 }
58 }
59
60 } // namespace
61
62 std::string UpdaterState::GetUpdaterName() {
63 return std::string("Keystone");
64 }
65
66 base::Version UpdaterState::GetUpdaterVersion(bool /*is_machine*/) {
67 // System Keystone trumps user one, so check this one first
68 base::FilePath local_library;
69 bool success = base::mac::GetLocalDirectory(NSLibraryDirectory,
70 &local_library);
71 DCHECK(success);
72 base::FilePath system_bundle_plist = local_library.Append(kKeystonePlist);
73 base::Version systemKeystone = GetVersionFromPlist(system_bundle_plist);
74 if (systemKeystone.IsValid()) {
75 return systemKeystone;
76 }
77
78 base::FilePath user_bundle_plist =
79 base::mac::GetUserLibraryPath().Append(kKeystonePlist);
80 return GetVersionFromPlist(user_bundle_plist);
81 }
82
83 base::Time UpdaterState::GetUpdaterLastStartedAU(bool /*is_machine*/) {
84 return GetUpdaterTimeValue("lastCheckStartDate");
85 }
86
87 base::Time UpdaterState::GetUpdaterLastChecked(bool /*is_machine*/) {
88 return GetUpdaterTimeValue("lastServerCheckDate");
89 }
90
91 bool UpdaterState::IsAutoupdateCheckEnabled() {
92 // Auto-update check period override (in seconds).
93 // Applies only to older versions of Keystone.
94 NSNumber* timeInterval = CopyUpdaterSettingsValue<NSNumber>(@"checkInterval");
95 if (timeInterval == nil) return true;
96 int value = [timeInterval intValue];
97 [timeInterval release];
98
99 return 0 < value && value < (24 * 60 * 60);
100 }
101
102 base::Time UpdaterState::GetUpdaterTimeValue(const char* value_name) {
103 NSString *value = [[NSString alloc] initWithUTF8String:value_name];
104 NSDate* date = CopyUpdaterSettingsValue<NSDate>(value);
105 base::Time result =
106 base::Time::FromCFAbsoluteTime([date timeIntervalSinceReferenceDate]);
107 [date release];
108
109 return result;
110 }
111
112 int UpdaterState::GetUpdatePolicy() {
113 return -1; // Keystone does not support update policies.
114 }
115
116 bool UpdaterState::IsJoinedToDomain() {
117 @autoreleasepool {
118 ODSession* session = [ODSession defaultSession];
119 if (session == nil) {
120 DLOG(WARNING) << "ODSession defult session is nil.";
121 return false;
122 }
123
124 NSError* error = nil;
125 ODNode* node = [ODNode nodeWithSession:session
126 type:kODNodeTypeAuthentication
127 error:&error];
128 if (node == nil) {
129 DLOG(WARNING) << "ODSession cannot obtain the authentication node: "
130 << base::mac::NSToCFCast(error);
131 return false;
132 }
133
134 ODQuery* query = [ODQuery queryWithNode:node
135 forRecordTypes:kODRecordTypeUsers
136 attribute:kODAttributeTypeRecordName
137 matchType:kODMatchEqualTo
138 queryValues:NSUserName()
139 returnAttributes:kODAttributeTypeAllAttributes
140 maximumResults:0
141 error:&error];
142 if (query == nil) {
143 DLOG(WARNING) << "ODSession cannot create user query: "
144 << base::mac::NSToCFCast(error);
145 return false;
146 }
147
148 NSArray* results = [query resultsAllowingPartial:NO error:&error];
149 if (!results) {
150 DLOG(WARNING) << "ODSession cannot obtain current user node: "
151 << base::mac::NSToCFCast(error);
152 return false;
153 }
154 if (results.count != 1) {
155 DLOG(WARNING) << @"ODSession unexpected number of nodes: "
156 << results.count;
157 }
158 for (id element in results) {
159 ODRecord* record = base::mac::ObjCCastStrict<ODRecord>(element);
160 NSArray* attributes =
161 [record valuesForAttribute:kODAttributeTypeMetaRecordName
162 error:NULL];
163 for (id attribute in attributes) {
164 NSString *attributeValue =
165 base::mac::ObjCCastStrict<NSString>(attribute);
166 // Example: "uid=johnsmith,ou=People,dc=chromium,dc=org
167 NSRange dc = [attributeValue rangeOfString:@"(^|,)\\s*dc="
168 options:NSRegularExpressionSearch];
169 if (dc.length > 0) {
170 return true;
171 }
172 }
173 }
174 }
175 return false;
176 }
177
178 } // namespace update_client
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698