| // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_SIGNIN_SIGNIN_INTERNALS_UTIL_H_ |
| #define CHROME_BROWSER_SIGNIN_SIGNIN_INTERNALS_UTIL_H_ |
| |
| #include <map> |
| #include <string> |
| |
| #include "base/memory/scoped_ptr.h" |
| #include "base/values.h" |
| |
| namespace signin_internals_util { |
| |
| // Preference prefixes for signin and token values. |
| extern const char kSigninPrefPrefix[]; |
| extern const char kTokenPrefPrefix[]; |
| |
| // The length of strings returned by GetTruncatedHash() below. |
| const size_t kTruncateTokenStringLength = 6; |
| |
| // Helper enums to access fields from SigninStatus (declared below). |
| enum { |
| SIGNIN_FIELDS_BEGIN = 0, |
| UNTIMED_FIELDS_BEGIN = SIGNIN_FIELDS_BEGIN |
| }; |
| |
| enum UntimedSigninStatusField { |
| USERNAME = UNTIMED_FIELDS_BEGIN, |
| SID, |
| LSID, |
| UNTIMED_FIELDS_END |
| }; |
| |
| enum { |
| UNTIMED_FIELDS_COUNT = UNTIMED_FIELDS_END - UNTIMED_FIELDS_BEGIN, |
| TIMED_FIELDS_BEGIN = UNTIMED_FIELDS_END |
| }; |
| |
| enum TimedSigninStatusField { |
| SIGNIN_TYPE = TIMED_FIELDS_BEGIN, |
| CLIENT_LOGIN_STATUS, |
| OAUTH_LOGIN_STATUS, |
| GET_USER_INFO_STATUS, |
| UBER_TOKEN_STATUS, |
| MERGE_SESSION_STATUS, |
| TIMED_FIELDS_END |
| }; |
| |
| enum { |
| TIMED_FIELDS_COUNT = TIMED_FIELDS_END - TIMED_FIELDS_BEGIN, |
| SIGNIN_FIELDS_END = TIMED_FIELDS_END, |
| SIGNIN_FIELDS_COUNT = SIGNIN_FIELDS_END - SIGNIN_FIELDS_BEGIN |
| }; |
| |
| // Encapsulates diagnostic information about tokens for different services. |
| // Note that although SigninStatus contains a map of service names to token |
| // values, we replicate the service name within this struct for a cleaner |
| // serialization (with ToValue()). |
| struct TokenInfo { |
| std::string truncated_token; // The hashed and truncated token. |
| std::string status; // Status of the last token fetch. |
| std::string time; // Timestamp of the last token fetch |
| int64 time_internal; // Same as |time|, but in base::Time internal format. |
| std::string service; // The service that this token is for. |
| |
| TokenInfo(const std::string& truncated_token, |
| const std::string& status, |
| const std::string& time, |
| const int64& time_internal, |
| const std::string& service); |
| TokenInfo(); |
| ~TokenInfo(); |
| |
| DictionaryValue* ToValue(); |
| }; |
| |
| // Associates a service name with its token information. |
| typedef std::map<std::string, TokenInfo> TokenInfoMap; |
| |
| // Returns the root preference path for the service. The path should be |
| // qualified with one of .value, .status or .time to get the respective |
| // full preference path names. |
| std::string TokenPrefPath(const std::string& service_name); |
| |
| // Many values in SigninStatus are also associated with a timestamp. |
| // This makes it easier to keep values and their associated times together. |
| typedef std::pair<std::string, std::string> TimedSigninStatusValue; |
| |
| // Returns the name of a SigninStatus field. |
| std::string SigninStatusFieldToString(UntimedSigninStatusField field); |
| std::string SigninStatusFieldToString(TimedSigninStatusField field); |
| |
| // Encapsulates both authentication and token related information. Used |
| // by SigninInternals to maintain information that needs to be shown in |
| // the about:signin-internals page. |
| struct SigninStatus { |
| std::vector<std::string> untimed_signin_fields; |
| std::vector<TimedSigninStatusValue> timed_signin_fields; |
| TokenInfoMap token_info_map; |
| |
| SigninStatus(); |
| ~SigninStatus(); |
| |
| // Returns a dictionary with the following form: |
| // { "signin_info" : |
| // [ {"title": "Basic Information", |
| // "data": [List of {"label" : "foo-field", "value" : "foo"} elems] |
| // }, |
| // { "title": "Detailed Information", |
| // "data": [List of {"label" : "foo-field", "value" : "foo"} elems] |
| // }], |
| // "token_info" : |
| // [ List of {"name": "foo-name", "token" : "foo-token", |
| // "status": "foo_stat", "time" : "foo_time"} elems] |
| // } |
| scoped_ptr<DictionaryValue> ToValue(); |
| }; |
| |
| // An Observer class for authentication and token diagnostic information. |
| class SigninDiagnosticsObserver { |
| public: |
| // Credentials and signin related changes. |
| virtual void NotifySigninValueChanged(const UntimedSigninStatusField& field, |
| const std::string& value) {} |
| virtual void NotifySigninValueChanged(const TimedSigninStatusField& field, |
| const std::string& value) {} |
| // OAuth tokens related changes. |
| virtual void NotifyTokenReceivedSuccess(const std::string& token_name, |
| const std::string& token, |
| bool update_time) {} |
| virtual void NotifyTokenReceivedFailure(const std::string& token_name, |
| const std::string& error) {} |
| virtual void NotifyClearStoredToken(const std::string& token_name) {}}; |
| |
| // Gets the first 6 hex characters of the SHA256 hash of the passed in string. |
| // These are enough to perform equality checks across a single users tokens, |
| // while preventing outsiders from reverse-engineering the actual token from |
| // the displayed value. |
| // Note that for readability (in about:signin-internals), an empty string |
| // is not hashed, but simply returned as an empty string. |
| std::string GetTruncatedHash(const std::string& str); |
| |
| } // namespace signin_internals_util |
| |
| #endif // CHROME_BROWSER_SIGNIN_SIGNIN_INTERNALS_UTIL_H_ |