token_cache_service.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/token_cache/token_cache_service.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_notification_types.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_source.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::Time; 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using base::TimeDelta; 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TokenCacheService::TokenCacheService(Profile* profile) : profile_(profile) { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registrar_.Add(this, 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chrome::NOTIFICATION_GOOGLE_SIGNED_OUT, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::Source<Profile>(profile_)); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TokenCacheService::~TokenCacheService() { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TokenCacheService::StoreToken(const std::string& token_name, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& token_value, 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_to_live) { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TokenCacheData token_data; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the current time, and make sure that the token has not already expired. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time expiration_time; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TimeDelta zero_delta; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Negative time deltas are meaningless to this function. 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(time_to_live >= zero_delta); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (zero_delta < time_to_live) { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_time = Time::Now(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expiration_time += time_to_live; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_data.token = token_value; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_data.expiration_time = expiration_time; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Add the token to our cache, overwriting any existing token with this name. 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_cache_[token_name] = token_data; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Retrieve a token for the currently logged in user. This returns an empty 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// string if the token was not found or timed out. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string TokenCacheService::RetrieveToken(const std::string& token_name) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<std::string, TokenCacheData>::iterator it = 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_cache_.find(token_name); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it != token_cache_.end()) { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Time now = Time::Now(); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (it->second.expiration_time.is_null() || 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) now < it->second.expiration_time) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return it->second.token; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Remove this entry if it is expired. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_cache_.erase(it); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::string(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::string(); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Inherited from NotificationObserver. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TokenCacheService::Observe(int type, 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationSource& source, 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::NotificationDetails& details) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(chrome::NOTIFICATION_GOOGLE_SIGNED_OUT == type); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) token_cache_.clear(); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 79