OLD | NEW |
| (Empty) |
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 | |
3 # found in the LICENSE file. | |
4 import logging | |
5 import json | |
6 import os | |
7 | |
8 from telemetry import facebook_credentials_backend | |
9 from telemetry import google_credentials_backend | |
10 from telemetry import options_for_unittests | |
11 | |
12 class BrowserCredentials(object): | |
13 def __init__(self, backends = None): | |
14 self._credentials = {} | |
15 self._credentials_path = None | |
16 self._extra_credentials = {} | |
17 | |
18 if backends is None: | |
19 backends = [ | |
20 facebook_credentials_backend.FacebookCredentialsBackend(), | |
21 google_credentials_backend.GoogleCredentialsBackend()] | |
22 | |
23 self._backends = {} | |
24 for backend in backends: | |
25 self._backends[backend.credentials_type] = backend | |
26 | |
27 def AddBackend(self, backend): | |
28 assert backend.credentials_type not in self._backends | |
29 self._backends[backend.credentials_type] = backend | |
30 | |
31 def IsLoggedIn(self, credentials_type): | |
32 if credentials_type not in self._backends: | |
33 raise Exception('Unrecognized credentials type: %s', credentials_type) | |
34 if credentials_type not in self._credentials: | |
35 return False | |
36 return self._backends[credentials_type].IsLoggedIn() | |
37 | |
38 def CanLogin(self, credentials_type): | |
39 if credentials_type not in self._backends: | |
40 raise Exception('Unrecognized credentials type: %s', credentials_type) | |
41 return credentials_type in self._credentials | |
42 | |
43 def LoginNeeded(self, tab, credentials_type): | |
44 if credentials_type not in self._backends: | |
45 raise Exception('Unrecognized credentials type: %s', credentials_type) | |
46 if credentials_type not in self._credentials: | |
47 return False | |
48 return self._backends[credentials_type].LoginNeeded( | |
49 tab, self._credentials[credentials_type]) | |
50 | |
51 def LoginNoLongerNeeded(self, tab, credentials_type): | |
52 assert credentials_type in self._backends | |
53 self._backends[credentials_type].LoginNoLongerNeeded(tab) | |
54 | |
55 @property | |
56 def credentials_path(self): | |
57 return self._credentials_path | |
58 | |
59 @credentials_path.setter | |
60 def credentials_path(self, credentials_path): | |
61 self._credentials_path = credentials_path | |
62 self._RebuildCredentials() | |
63 | |
64 def Add(self, credentials_type, data): | |
65 if credentials_type not in self._extra_credentials: | |
66 self._extra_credentials[credentials_type] = {} | |
67 for k, v in data.items(): | |
68 assert k not in self._extra_credentials[credentials_type] | |
69 self._extra_credentials[credentials_type][k] = v | |
70 self._RebuildCredentials() | |
71 | |
72 def _ResetLoggedInState(self): | |
73 """Makes the backends think we're not logged in even though we are. | |
74 Should only be used in unit tests to simulate --dont-override-profile. | |
75 """ | |
76 for backend in self._backends.keys(): | |
77 self._backends[backend]._ResetLoggedInState() # pylint: disable=W0212 | |
78 | |
79 def _RebuildCredentials(self): | |
80 credentials = {} | |
81 if self._credentials_path == None: | |
82 pass | |
83 elif os.path.exists(self._credentials_path): | |
84 with open(self._credentials_path, 'r') as f: | |
85 credentials = json.loads(f.read()) | |
86 | |
87 # TODO(nduca): use system keychain, if possible. | |
88 homedir_credentials_path = os.path.expanduser('~/.telemetry-credentials') | |
89 homedir_credentials = {} | |
90 | |
91 if (not options_for_unittests.GetCopy() and | |
92 os.path.exists(homedir_credentials_path)): | |
93 logging.info("Found ~/.telemetry-credentials. Its contents will be used " | |
94 "when no other credentials can be found.") | |
95 with open(homedir_credentials_path, 'r') as f: | |
96 homedir_credentials = json.loads(f.read()) | |
97 | |
98 self._credentials = {} | |
99 all_keys = set(credentials.keys()).union( | |
100 homedir_credentials.keys()).union( | |
101 self._extra_credentials.keys()) | |
102 | |
103 for k in all_keys: | |
104 if k in credentials: | |
105 self._credentials[k] = credentials[k] | |
106 if k in homedir_credentials: | |
107 logging.info("Will use ~/.telemetry-credentials for %s logins." % k) | |
108 self._credentials[k] = homedir_credentials[k] | |
109 if k in self._extra_credentials: | |
110 self._credentials[k] = self._extra_credentials[k] | |
111 | |
112 def WarnIfMissingCredentials(self, page_set): | |
113 num_pages_missing_login = 0 | |
114 missing_credentials = set() | |
115 for page in page_set: | |
116 if (page.credentials | |
117 and not self.CanLogin(page.credentials)): | |
118 num_pages_missing_login += 1 | |
119 missing_credentials.add(page.credentials) | |
120 | |
121 if num_pages_missing_login > 0: | |
122 files_to_tweak = [] | |
123 if page_set.credentials_path: | |
124 files_to_tweak.append( | |
125 os.path.relpath(os.path.join(os.path.dirname(page_set.file_path), | |
126 page_set.credentials_path))) | |
127 files_to_tweak.append('~/.telemetry-credentials') | |
128 | |
129 example_credentials_file = ( | |
130 os.path.relpath( | |
131 os.path.join( | |
132 os.path.dirname(__file__), | |
133 '..', 'examples', 'credentials_example.json'))) | |
134 | |
135 logging.warning(""" | |
136 Credentials for %s were not found. %i pages will not be benchmarked. | |
137 | |
138 To fix this, either add svn-internal to your .gclient using | |
139 http://goto/read-src-internal, or add your own credentials to: | |
140 %s | |
141 An example credentials file you can copy from is here: | |
142 %s\n""" % (', '.join(missing_credentials), | |
143 num_pages_missing_login, | |
144 ' or '.join(files_to_tweak), | |
145 example_credentials_file)) | |
OLD | NEW |