2008-11-24 21:32:04 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-06-29 14:42:59 +04:00
|
|
|
/* vim: set ts=2 sw=2 et: */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2003-03-22 04:24:51 +03:00
|
|
|
|
|
|
|
#include "nsCookiePermission.h"
|
2012-09-15 00:57:56 +04:00
|
|
|
|
|
|
|
#include "mozIThirdPartyUtil.h"
|
2003-10-11 04:06:13 +04:00
|
|
|
#include "nsICookie2.h"
|
2003-03-22 04:24:51 +03:00
|
|
|
#include "nsIServiceManager.h"
|
2003-08-02 21:20:52 +04:00
|
|
|
#include "nsICookiePromptService.h"
|
2003-10-11 04:06:13 +04:00
|
|
|
#include "nsICookieManager2.h"
|
2004-11-15 23:16:52 +03:00
|
|
|
#include "nsNetUtil.h"
|
2015-07-07 05:17:00 +03:00
|
|
|
#include "nsIInterfaceRequestorUtils.h"
|
|
|
|
#include "nsIProtocolHandler.h"
|
2003-08-02 21:20:52 +04:00
|
|
|
#include "nsIURI.h"
|
2003-10-11 01:23:44 +04:00
|
|
|
#include "nsIPrefService.h"
|
|
|
|
#include "nsIPrefBranch.h"
|
|
|
|
#include "nsIChannel.h"
|
2009-06-16 18:30:25 +04:00
|
|
|
#include "nsIHttpChannelInternal.h"
|
2003-10-11 01:23:44 +04:00
|
|
|
#include "nsIDOMWindow.h"
|
2008-03-12 10:53:50 +03:00
|
|
|
#include "nsIPrincipal.h"
|
2003-03-22 04:24:51 +03:00
|
|
|
#include "nsString.h"
|
2003-11-11 08:28:12 +03:00
|
|
|
#include "nsCRT.h"
|
2008-11-24 21:32:04 +03:00
|
|
|
#include "nsILoadContext.h"
|
|
|
|
#include "nsIScriptObjectPrincipal.h"
|
2009-01-21 10:46:28 +03:00
|
|
|
#include "nsNetCID.h"
|
2015-07-07 05:17:00 +03:00
|
|
|
#include "prtime.h"
|
2003-03-22 04:24:51 +03:00
|
|
|
|
|
|
|
/****************************************************************
|
|
|
|
************************ nsCookiePermission ********************
|
|
|
|
****************************************************************/
|
|
|
|
|
2004-03-10 09:47:49 +03:00
|
|
|
// values for mCookiesLifetimePolicy
|
|
|
|
// 0 == accept normally
|
|
|
|
// 1 == ask before accepting
|
|
|
|
// 2 == downgrade to session
|
|
|
|
// 3 == limit lifetime to N days
|
2012-08-22 19:56:38 +04:00
|
|
|
static const uint32_t ACCEPT_NORMALLY = 0;
|
|
|
|
static const uint32_t ASK_BEFORE_ACCEPT = 1;
|
|
|
|
static const uint32_t ACCEPT_SESSION = 2;
|
|
|
|
static const uint32_t ACCEPT_FOR_N_DAYS = 3;
|
2004-03-10 09:47:49 +03:00
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static const bool kDefaultPolicy = true;
|
2004-03-10 09:47:49 +03:00
|
|
|
static const char kCookiesLifetimePolicy[] = "network.cookie.lifetimePolicy";
|
2003-10-16 17:17:12 +04:00
|
|
|
static const char kCookiesLifetimeDays[] = "network.cookie.lifetime.days";
|
2004-03-10 09:47:49 +03:00
|
|
|
static const char kCookiesAlwaysAcceptSession[] = "network.cookie.alwaysAcceptSessionCookies";
|
|
|
|
|
|
|
|
static const char kCookiesPrefsMigrated[] = "network.cookie.prefsMigrated";
|
|
|
|
// obsolete pref names for migration
|
|
|
|
static const char kCookiesLifetimeEnabled[] = "network.cookie.lifetime.enabled";
|
|
|
|
static const char kCookiesLifetimeBehavior[] = "network.cookie.lifetime.behavior";
|
|
|
|
static const char kCookiesAskPermission[] = "network.cookie.warnAboutCookies";
|
|
|
|
|
2003-10-11 01:23:44 +04:00
|
|
|
static const char kPermissionType[] = "cookie";
|
2003-03-22 04:24:51 +03:00
|
|
|
|
2014-04-27 11:06:00 +04:00
|
|
|
NS_IMPL_ISUPPORTS(nsCookiePermission,
|
|
|
|
nsICookiePermission,
|
|
|
|
nsIObserver)
|
2003-10-11 01:23:44 +04:00
|
|
|
|
2010-03-26 02:02:28 +03:00
|
|
|
bool
|
2003-10-11 01:23:44 +04:00
|
|
|
nsCookiePermission::Init()
|
|
|
|
{
|
2010-03-26 02:02:28 +03:00
|
|
|
// Initialize nsIPermissionManager and fetch relevant prefs. This is only
|
|
|
|
// required for some methods on nsICookiePermission, so it should be done
|
|
|
|
// lazily.
|
2003-08-16 01:04:54 +04:00
|
|
|
nsresult rv;
|
2003-10-11 01:23:44 +04:00
|
|
|
mPermMgr = do_GetService(NS_PERMISSIONMANAGER_CONTRACTID, &rv);
|
2010-03-26 02:02:28 +03:00
|
|
|
if (NS_FAILED(rv)) return false;
|
2012-09-15 00:57:56 +04:00
|
|
|
mThirdPartyUtil = do_GetService(THIRDPARTYUTIL_CONTRACTID, &rv);
|
|
|
|
if (NS_FAILED(rv)) return false;
|
2003-10-11 01:23:44 +04:00
|
|
|
|
|
|
|
// failure to access the pref service is non-fatal...
|
2012-01-18 14:23:28 +04:00
|
|
|
nsCOMPtr<nsIPrefBranch> prefBranch =
|
2003-10-11 01:23:44 +04:00
|
|
|
do_GetService(NS_PREFSERVICE_CONTRACTID);
|
|
|
|
if (prefBranch) {
|
2011-10-17 18:59:28 +04:00
|
|
|
prefBranch->AddObserver(kCookiesLifetimePolicy, this, false);
|
|
|
|
prefBranch->AddObserver(kCookiesLifetimeDays, this, false);
|
|
|
|
prefBranch->AddObserver(kCookiesAlwaysAcceptSession, this, false);
|
2012-07-30 18:20:58 +04:00
|
|
|
PrefChanged(prefBranch, nullptr);
|
2004-03-10 09:47:49 +03:00
|
|
|
|
|
|
|
// migration code for original cookie prefs
|
2011-09-29 10:19:26 +04:00
|
|
|
bool migrated;
|
2004-03-10 09:47:49 +03:00
|
|
|
rv = prefBranch->GetBoolPref(kCookiesPrefsMigrated, &migrated);
|
|
|
|
if (NS_FAILED(rv) || !migrated) {
|
2011-09-29 10:19:26 +04:00
|
|
|
bool warnAboutCookies = false;
|
2004-03-10 09:47:49 +03:00
|
|
|
prefBranch->GetBoolPref(kCookiesAskPermission, &warnAboutCookies);
|
|
|
|
|
|
|
|
// if the user is using ask before accepting, we'll use that
|
|
|
|
if (warnAboutCookies)
|
|
|
|
prefBranch->SetIntPref(kCookiesLifetimePolicy, ASK_BEFORE_ACCEPT);
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool lifetimeEnabled = false;
|
2004-03-10 09:47:49 +03:00
|
|
|
prefBranch->GetBoolPref(kCookiesLifetimeEnabled, &lifetimeEnabled);
|
|
|
|
|
|
|
|
// if they're limiting lifetime and not using the prompts, use the
|
|
|
|
// appropriate limited lifetime pref
|
|
|
|
if (lifetimeEnabled && !warnAboutCookies) {
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t lifetimeBehavior;
|
2004-03-10 09:47:49 +03:00
|
|
|
prefBranch->GetIntPref(kCookiesLifetimeBehavior, &lifetimeBehavior);
|
|
|
|
if (lifetimeBehavior)
|
|
|
|
prefBranch->SetIntPref(kCookiesLifetimePolicy, ACCEPT_FOR_N_DAYS);
|
|
|
|
else
|
|
|
|
prefBranch->SetIntPref(kCookiesLifetimePolicy, ACCEPT_SESSION);
|
|
|
|
}
|
2011-10-17 18:59:28 +04:00
|
|
|
prefBranch->SetBoolPref(kCookiesPrefsMigrated, true);
|
2004-03-10 09:47:49 +03:00
|
|
|
}
|
2003-08-16 01:04:54 +04:00
|
|
|
}
|
|
|
|
|
2010-03-26 02:02:28 +03:00
|
|
|
return true;
|
2003-10-11 01:23:44 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2003-11-11 05:46:06 +03:00
|
|
|
nsCookiePermission::PrefChanged(nsIPrefBranch *aPrefBranch,
|
|
|
|
const char *aPref)
|
2003-10-11 01:23:44 +04:00
|
|
|
{
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t val;
|
2003-10-11 01:23:44 +04:00
|
|
|
|
2003-11-11 05:46:06 +03:00
|
|
|
#define PREF_CHANGED(_P) (!aPref || !strcmp(aPref, _P))
|
2003-10-11 01:23:44 +04:00
|
|
|
|
2004-03-10 09:47:49 +03:00
|
|
|
if (PREF_CHANGED(kCookiesLifetimePolicy) &&
|
|
|
|
NS_SUCCEEDED(aPrefBranch->GetIntPref(kCookiesLifetimePolicy, &val)))
|
|
|
|
mCookiesLifetimePolicy = val;
|
2003-10-16 17:17:12 +04:00
|
|
|
|
|
|
|
if (PREF_CHANGED(kCookiesLifetimeDays) &&
|
2003-11-11 05:46:06 +03:00
|
|
|
NS_SUCCEEDED(aPrefBranch->GetIntPref(kCookiesLifetimeDays, &val)))
|
2003-10-16 17:17:12 +04:00
|
|
|
// save cookie lifetime in seconds instead of days
|
|
|
|
mCookiesLifetimeSec = val * 24 * 60 * 60;
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool bval;
|
2004-03-10 09:47:49 +03:00
|
|
|
if (PREF_CHANGED(kCookiesAlwaysAcceptSession) &&
|
2011-07-27 10:43:37 +04:00
|
|
|
NS_SUCCEEDED(aPrefBranch->GetBoolPref(kCookiesAlwaysAcceptSession, &bval)))
|
|
|
|
mCookiesAlwaysAcceptSession = bval;
|
2003-10-11 01:23:44 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsCookiePermission::SetAccess(nsIURI *aURI,
|
|
|
|
nsCookieAccess aAccess)
|
|
|
|
{
|
2010-03-26 02:02:28 +03:00
|
|
|
// Lazily initialize ourselves
|
|
|
|
if (!EnsureInitialized())
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
|
2003-10-11 01:23:44 +04:00
|
|
|
//
|
|
|
|
// NOTE: nsCookieAccess values conveniently match up with
|
|
|
|
// the permission codes used by nsIPermissionManager.
|
|
|
|
// this is nice because it avoids conversion code.
|
|
|
|
//
|
2009-10-17 01:01:04 +04:00
|
|
|
return mPermMgr->Add(aURI, kPermissionType, aAccess,
|
|
|
|
nsIPermissionManager::EXPIRE_NEVER, 0);
|
2003-10-11 01:23:44 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsCookiePermission::CanAccess(nsIURI *aURI,
|
|
|
|
nsIChannel *aChannel,
|
|
|
|
nsCookieAccess *aResult)
|
|
|
|
{
|
2011-12-05 16:35:23 +04:00
|
|
|
// Check this protocol doesn't allow cookies
|
|
|
|
bool hasFlags;
|
|
|
|
nsresult rv =
|
|
|
|
NS_URIChainHasFlags(aURI, nsIProtocolHandler::URI_FORBIDS_COOKIE_ACCESS,
|
|
|
|
&hasFlags);
|
|
|
|
if (NS_FAILED(rv) || hasFlags) {
|
2009-09-02 12:42:53 +04:00
|
|
|
*aResult = ACCESS_DENY;
|
|
|
|
return NS_OK;
|
2003-10-11 01:23:44 +04:00
|
|
|
}
|
2010-03-26 02:02:28 +03:00
|
|
|
|
|
|
|
// Lazily initialize ourselves
|
|
|
|
if (!EnsureInitialized())
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
|
2003-10-11 01:23:44 +04:00
|
|
|
// finally, check with permission manager...
|
2012-08-22 19:56:38 +04:00
|
|
|
rv = mPermMgr->TestPermission(aURI, kPermissionType, (uint32_t *) aResult);
|
2003-10-16 17:17:12 +04:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2012-09-15 00:57:56 +04:00
|
|
|
if (*aResult == nsICookiePermission::ACCESS_SESSION) {
|
|
|
|
*aResult = nsICookiePermission::ACCESS_ALLOW;
|
2003-10-16 17:17:12 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return rv;
|
2003-10-11 01:23:44 +04:00
|
|
|
}
|
|
|
|
|
2012-09-15 00:57:56 +04:00
|
|
|
NS_IMETHODIMP
|
2003-10-11 01:23:44 +04:00
|
|
|
nsCookiePermission::CanSetCookie(nsIURI *aURI,
|
|
|
|
nsIChannel *aChannel,
|
2003-10-11 04:06:13 +04:00
|
|
|
nsICookie2 *aCookie,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool *aIsSession,
|
2012-08-22 19:56:38 +04:00
|
|
|
int64_t *aExpiry,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool *aResult)
|
2003-10-11 01:23:44 +04:00
|
|
|
{
|
|
|
|
NS_ASSERTION(aURI, "null uri");
|
|
|
|
|
|
|
|
*aResult = kDefaultPolicy;
|
|
|
|
|
2010-03-26 02:02:28 +03:00
|
|
|
// Lazily initialize ourselves
|
|
|
|
if (!EnsureInitialized())
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t perm;
|
2013-10-09 18:06:24 +04:00
|
|
|
mPermMgr->TestPermission(aURI, kPermissionType, &perm);
|
2012-09-15 00:57:56 +04:00
|
|
|
bool isThirdParty = false;
|
2003-10-16 17:17:12 +04:00
|
|
|
switch (perm) {
|
2004-04-08 03:27:02 +04:00
|
|
|
case nsICookiePermission::ACCESS_SESSION:
|
2011-10-17 18:59:28 +04:00
|
|
|
*aIsSession = true;
|
2003-10-16 17:17:12 +04:00
|
|
|
|
2012-09-15 00:57:56 +04:00
|
|
|
case nsICookiePermission::ACCESS_ALLOW:
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = true;
|
2003-10-16 17:17:12 +04:00
|
|
|
break;
|
2003-08-16 01:04:54 +04:00
|
|
|
|
2012-09-15 00:57:56 +04:00
|
|
|
case nsICookiePermission::ACCESS_DENY:
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2003-10-16 17:17:12 +04:00
|
|
|
break;
|
2003-08-02 21:20:52 +04:00
|
|
|
|
2012-09-15 00:57:56 +04:00
|
|
|
case nsICookiePermission::ACCESS_ALLOW_FIRST_PARTY_ONLY:
|
|
|
|
mThirdPartyUtil->IsThirdPartyChannel(aChannel, aURI, &isThirdParty);
|
|
|
|
// If it's third party, we can't set the cookie
|
|
|
|
if (isThirdParty)
|
|
|
|
*aResult = false;
|
|
|
|
break;
|
|
|
|
|
2013-02-22 20:16:01 +04:00
|
|
|
case nsICookiePermission::ACCESS_LIMIT_THIRD_PARTY:
|
|
|
|
mThirdPartyUtil->IsThirdPartyChannel(aChannel, aURI, &isThirdParty);
|
|
|
|
// If it's third party, check whether cookies are already set
|
|
|
|
if (isThirdParty) {
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsICookieManager2> cookieManager = do_GetService(NS_COOKIEMANAGER_CONTRACTID, &rv);
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
*aResult = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
uint32_t priorCookieCount = 0;
|
|
|
|
nsAutoCString hostFromURI;
|
|
|
|
aURI->GetHost(hostFromURI);
|
|
|
|
cookieManager->CountCookiesFromHost(hostFromURI, &priorCookieCount);
|
|
|
|
*aResult = priorCookieCount != 0;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2003-10-16 17:17:12 +04:00
|
|
|
default:
|
|
|
|
// the permission manager has nothing to say about this cookie -
|
|
|
|
// so, we apply the default prefs to it.
|
|
|
|
NS_ASSERTION(perm == nsIPermissionManager::UNKNOWN_ACTION, "unknown permission");
|
2012-09-15 00:57:56 +04:00
|
|
|
|
2004-03-10 09:47:49 +03:00
|
|
|
// now we need to figure out what type of accept policy we're dealing with
|
|
|
|
// if we accept cookies normally, just bail and return
|
|
|
|
if (mCookiesLifetimePolicy == ACCEPT_NORMALLY) {
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = true;
|
2004-03-10 09:47:49 +03:00
|
|
|
return NS_OK;
|
2003-08-02 21:20:52 +04:00
|
|
|
}
|
2012-09-15 00:57:56 +04:00
|
|
|
|
2004-03-10 09:47:49 +03:00
|
|
|
// declare this here since it'll be used in all of the remaining cases
|
2012-08-22 19:56:38 +04:00
|
|
|
int64_t currentTime = PR_Now() / PR_USEC_PER_SEC;
|
|
|
|
int64_t delta = *aExpiry - currentTime;
|
2012-09-15 00:57:56 +04:00
|
|
|
|
2003-10-16 17:17:12 +04:00
|
|
|
// check whether the user wants to be prompted
|
2004-03-10 09:47:49 +03:00
|
|
|
if (mCookiesLifetimePolicy == ASK_BEFORE_ACCEPT) {
|
|
|
|
// if it's a session cookie and the user wants to accept these
|
2009-01-21 10:46:28 +03:00
|
|
|
// without asking, or if we are in private browsing mode, just
|
|
|
|
// accept the cookie and return
|
|
|
|
if ((*aIsSession && mCookiesAlwaysAcceptSession) ||
|
2012-02-01 14:20:01 +04:00
|
|
|
(aChannel && NS_UsePrivateBrowsing(aChannel))) {
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = true;
|
2004-03-10 09:47:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-09-15 00:57:56 +04:00
|
|
|
|
2003-10-16 17:17:12 +04:00
|
|
|
// default to rejecting, in case the prompting process fails
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2003-10-16 17:17:12 +04:00
|
|
|
|
2012-09-02 06:35:17 +04:00
|
|
|
nsAutoCString hostPort;
|
2003-10-16 17:17:12 +04:00
|
|
|
aURI->GetHostPort(hostPort);
|
|
|
|
|
|
|
|
if (!aCookie) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
// If there is no host, use the scheme, and append "://",
|
|
|
|
// to make sure it isn't a host or something.
|
|
|
|
// This is done to make the dialog appear for javascript cookies from
|
|
|
|
// file:// urls, and make the text on it not too weird. (bug 209689)
|
|
|
|
if (hostPort.IsEmpty()) {
|
|
|
|
aURI->GetScheme(hostPort);
|
|
|
|
if (hostPort.IsEmpty()) {
|
|
|
|
// still empty. Just return the default.
|
|
|
|
return NS_OK;
|
2003-10-11 04:06:13 +04:00
|
|
|
}
|
2003-10-16 17:17:12 +04:00
|
|
|
hostPort = hostPort + NS_LITERAL_CSTRING("://");
|
2003-10-11 04:06:13 +04:00
|
|
|
}
|
|
|
|
|
2003-10-16 17:17:12 +04:00
|
|
|
// we don't cache the cookiePromptService - it's not used often, so not
|
|
|
|
// worth the memory.
|
2004-03-10 09:47:49 +03:00
|
|
|
nsresult rv;
|
2003-10-16 17:17:12 +04:00
|
|
|
nsCOMPtr<nsICookiePromptService> cookiePromptService =
|
|
|
|
do_GetService(NS_COOKIEPROMPTSERVICE_CONTRACTID, &rv);
|
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
// get some useful information to present to the user:
|
|
|
|
// whether a previous cookie already exists, and how many cookies this host
|
|
|
|
// has set
|
2011-09-29 10:19:26 +04:00
|
|
|
bool foundCookie = false;
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t countFromHost;
|
2003-10-16 17:17:12 +04:00
|
|
|
nsCOMPtr<nsICookieManager2> cookieManager = do_GetService(NS_COOKIEMANAGER_CONTRACTID, &rv);
|
2007-05-06 01:09:54 +04:00
|
|
|
if (NS_SUCCEEDED(rv)) {
|
2012-09-02 06:35:17 +04:00
|
|
|
nsAutoCString rawHost;
|
2007-05-06 01:09:54 +04:00
|
|
|
aCookie->GetRawHost(rawHost);
|
|
|
|
rv = cookieManager->CountCookiesFromHost(rawHost, &countFromHost);
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv) && countFromHost > 0)
|
|
|
|
rv = cookieManager->CookieExists(aCookie, &foundCookie);
|
|
|
|
}
|
2003-10-16 17:17:12 +04:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
|
|
|
|
|
|
|
// check if the cookie we're trying to set is already expired, and return;
|
|
|
|
// but only if there's no previous cookie, because then we need to delete the previous
|
|
|
|
// cookie. we need this check to avoid prompting the user for already-expired cookies.
|
2007-06-18 01:52:22 +04:00
|
|
|
if (!foundCookie && !*aIsSession && delta <= 0) {
|
2003-10-16 17:17:12 +04:00
|
|
|
// the cookie has already expired. accept it, and let the backend figure
|
|
|
|
// out it's expired, so that we get correct logging & notifications.
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = true;
|
2003-10-16 17:17:12 +04:00
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool rememberDecision = false;
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t dialogRes = nsICookiePromptService::DENY_COOKIE;
|
2012-02-01 14:20:01 +04:00
|
|
|
rv = cookiePromptService->CookieDialog(nullptr, aCookie, hostPort,
|
2003-10-16 17:17:12 +04:00
|
|
|
countFromHost, foundCookie,
|
2011-08-30 22:55:14 +04:00
|
|
|
&rememberDecision, &dialogRes);
|
2003-10-16 17:17:12 +04:00
|
|
|
if (NS_FAILED(rv)) return rv;
|
2011-08-30 22:55:14 +04:00
|
|
|
|
|
|
|
*aResult = !!dialogRes;
|
|
|
|
if (dialogRes == nsICookiePromptService::ACCEPT_SESSION_COOKIE)
|
2011-10-17 18:59:28 +04:00
|
|
|
*aIsSession = true;
|
2003-10-16 17:17:12 +04:00
|
|
|
|
|
|
|
if (rememberDecision) {
|
2011-08-30 22:55:14 +04:00
|
|
|
switch (dialogRes) {
|
2004-01-29 06:34:58 +03:00
|
|
|
case nsICookiePromptService::DENY_COOKIE:
|
2012-08-22 19:56:38 +04:00
|
|
|
mPermMgr->Add(aURI, kPermissionType, (uint32_t) nsIPermissionManager::DENY_ACTION,
|
2009-10-17 01:01:04 +04:00
|
|
|
nsIPermissionManager::EXPIRE_NEVER, 0);
|
2004-01-29 06:34:58 +03:00
|
|
|
break;
|
|
|
|
case nsICookiePromptService::ACCEPT_COOKIE:
|
2012-08-22 19:56:38 +04:00
|
|
|
mPermMgr->Add(aURI, kPermissionType, (uint32_t) nsIPermissionManager::ALLOW_ACTION,
|
2009-10-17 01:01:04 +04:00
|
|
|
nsIPermissionManager::EXPIRE_NEVER, 0);
|
2004-01-29 06:34:58 +03:00
|
|
|
break;
|
|
|
|
case nsICookiePromptService::ACCEPT_SESSION_COOKIE:
|
2009-10-17 01:01:04 +04:00
|
|
|
mPermMgr->Add(aURI, kPermissionType, nsICookiePermission::ACCESS_SESSION,
|
|
|
|
nsIPermissionManager::EXPIRE_NEVER, 0);
|
2004-01-29 06:34:58 +03:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2003-10-16 17:17:12 +04:00
|
|
|
}
|
2004-03-10 09:47:49 +03:00
|
|
|
} else {
|
|
|
|
// we're not prompting, so we must be limiting the lifetime somehow
|
|
|
|
// if it's a session cookie, we do nothing
|
2007-06-18 01:52:22 +04:00
|
|
|
if (!*aIsSession && delta > 0) {
|
2004-03-10 09:47:49 +03:00
|
|
|
if (mCookiesLifetimePolicy == ACCEPT_SESSION) {
|
|
|
|
// limit lifetime to session
|
2011-10-17 18:59:28 +04:00
|
|
|
*aIsSession = true;
|
2004-03-10 09:47:49 +03:00
|
|
|
} else if (delta > mCookiesLifetimeSec) {
|
|
|
|
// limit lifetime to specified time
|
|
|
|
*aExpiry = currentTime + mCookiesLifetimeSec;
|
|
|
|
}
|
|
|
|
}
|
2003-03-22 04:24:51 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2003-10-11 01:23:44 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsCookiePermission::Observe(nsISupports *aSubject,
|
|
|
|
const char *aTopic,
|
2014-01-04 19:02:17 +04:00
|
|
|
const char16_t *aData)
|
2003-10-11 01:23:44 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIPrefBranch> prefBranch = do_QueryInterface(aSubject);
|
2003-11-11 05:46:06 +03:00
|
|
|
NS_ASSERTION(!nsCRT::strcmp(NS_PREFBRANCH_PREFCHANGE_TOPIC_ID, aTopic),
|
|
|
|
"unexpected topic - we only deal with pref changes!");
|
|
|
|
|
2003-10-11 01:23:44 +04:00
|
|
|
if (prefBranch)
|
2003-11-11 05:46:06 +03:00
|
|
|
PrefChanged(prefBranch, NS_LossyConvertUTF16toASCII(aData).get());
|
2003-10-11 01:23:44 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|