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