15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 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)// Defines common functionality used by the implementation of the Chrome 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Extensions Cookies API implemented in 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// chrome/browser/extensions/api/cookies/cookies_api.cc. This separate interface 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exposes pieces of the API implementation mainly for unit testing purposes. 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_HELPERS_H_ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_HELPERS_H_ 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/api/cookies.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/cookie_monster.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/cookies/canonical_cookie.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ListValue; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CanonicalCookie; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace cookies_helpers { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<linked_ptr<extensions::api::cookies::Cookie> > 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LinkedCookieVec; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns either the original profile or the incognito profile, based on the 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given store ID. Returns NULL if the profile doesn't exist or is not allowed 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (e.g. if incognito mode is not enabled for the extension). 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* ChooseProfileFromStoreId(const std::string& store_id, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool include_incognito); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the store ID for a particular user profile. 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* GetStoreIdFromProfile(Profile* profile); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocates and construct a new Cookie object representing a cookie as defined 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the cookies API. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<extensions::api::cookies::Cookie> CreateCookie( 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cookie, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& store_id); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Allocates and constructs a new CookieStore object as defined by the cookies 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<extensions::api::cookies::CookieStore> CreateCookieStore( 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ListValue* tab_ids); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Retrieves all cookies from the given cookie store corresponding to the given 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// URL. If the URL is empty, all cookies in the cookie store are retrieved. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This can only be called on the IO thread. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetCookieListFromStore( 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieStore* cookie_store, const GURL& url, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieMonster::GetCookieListCallback& callback); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Constructs a URL from a cookie's information for use in checking 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a cookie against the extension's host permissions. The Secure 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// property of the cookie defines the URL scheme, and the cookie's 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// domain becomes the URL host. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetURLFromCanonicalCookie( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CanonicalCookie& cookie); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Looks through all cookies in the given cookie store, and appends to the 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// match vector all the cookies that both match the given URL and cookie details 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and are allowed by extension host permissions. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendMatchingCookiesToVector( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& all_cookies, const GURL& url, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::api::cookies::GetAll::Params::Details* details, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension, LinkedCookieVec* match_vector); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Appends the IDs of all tabs belonging to the given browser to the 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// given list. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AppendToTabIdList(Browser* browser, base::ListValue* tab_ids); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A class representing the cookie filter parameters passed into 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cookies.getAll(). 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is essentially a convenience wrapper for the details dictionary 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// passed into the cookies.getAll() API by the user. If the dictionary contains 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no filter parameters, the MatchFilter will always trivially 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// match all cookies. 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MatchFilter { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes the details dictionary argument given by the user as input. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This class does not take ownership of the lifetime of the Details 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit MatchFilter( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::api::cookies::GetAll::Params::Details* details); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the given cookie matches the properties in the match 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filter. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool MatchesCookie(const net::CanonicalCookie& cookie); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the given cookie domain string matches the filter's 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // domain. Any cookie domain which is equal to or is a subdomain of the 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // filter's domain will be matched; leading '.' characters indicating 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // host-only domains have no meaning in the match filter domain (for 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // instance, a match filter domain of 'foo.bar.com' will be treated the same 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as '.foo.bar.com', and both will match cookies with domain values of 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 'foo.bar.com', '.foo.bar.com', and 'baz.foo.bar.com'. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool MatchesDomain(const std::string& domain); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::api::cookies::GetAll::Params::Details* details_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace cookies_helpers 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_API_COOKIES_COOKIES_HELPERS_H_ 126