diff options
Diffstat (limited to 'netwerk/protocol/http/nsHttpAuthManager.cpp')
-rw-r--r-- | netwerk/protocol/http/nsHttpAuthManager.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/netwerk/protocol/http/nsHttpAuthManager.cpp b/netwerk/protocol/http/nsHttpAuthManager.cpp new file mode 100644 index 000000000..a2f1b7c5e --- /dev/null +++ b/netwerk/protocol/http/nsHttpAuthManager.cpp @@ -0,0 +1,151 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* 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/. */ + +// HttpLog.h should generally be included first +#include "HttpLog.h" + +#include "nsHttpHandler.h" +#include "nsHttpAuthManager.h" +#include "nsNetUtil.h" +#include "nsIPrincipal.h" + +namespace mozilla { +namespace net { + +NS_IMPL_ISUPPORTS(nsHttpAuthManager, nsIHttpAuthManager) + +nsHttpAuthManager::nsHttpAuthManager() +{ +} + +nsresult nsHttpAuthManager::Init() +{ + // get reference to the auth cache. we assume that we will live + // as long as gHttpHandler. instantiate it if necessary. + + if (!gHttpHandler) { + nsresult rv; + nsCOMPtr<nsIIOService> ios = do_GetIOService(&rv); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr<nsIProtocolHandler> handler; + rv = ios->GetProtocolHandler("http", getter_AddRefs(handler)); + if (NS_FAILED(rv)) + return rv; + + // maybe someone is overriding our HTTP handler implementation? + NS_ENSURE_TRUE(gHttpHandler, NS_ERROR_UNEXPECTED); + } + + mAuthCache = gHttpHandler->AuthCache(false); + mPrivateAuthCache = gHttpHandler->AuthCache(true); + NS_ENSURE_TRUE(mAuthCache, NS_ERROR_FAILURE); + NS_ENSURE_TRUE(mPrivateAuthCache, NS_ERROR_FAILURE); + return NS_OK; +} + +nsHttpAuthManager::~nsHttpAuthManager() +{ +} + +NS_IMETHODIMP +nsHttpAuthManager::GetAuthIdentity(const nsACString & aScheme, + const nsACString & aHost, + int32_t aPort, + const nsACString & aAuthType, + const nsACString & aRealm, + const nsACString & aPath, + nsAString & aUserDomain, + nsAString & aUserName, + nsAString & aUserPassword, + bool aIsPrivate, + nsIPrincipal* aPrincipal) +{ + nsHttpAuthCache* auth_cache = aIsPrivate ? mPrivateAuthCache : mAuthCache; + nsHttpAuthEntry * entry = nullptr; + nsresult rv; + + nsAutoCString originSuffix; + if (aPrincipal) { + BasePrincipal::Cast(aPrincipal)->OriginAttributesRef().CreateSuffix(originSuffix); + } + + if (!aPath.IsEmpty()) + rv = auth_cache->GetAuthEntryForPath(PromiseFlatCString(aScheme).get(), + PromiseFlatCString(aHost).get(), + aPort, + PromiseFlatCString(aPath).get(), + originSuffix, + &entry); + else + rv = auth_cache->GetAuthEntryForDomain(PromiseFlatCString(aScheme).get(), + PromiseFlatCString(aHost).get(), + aPort, + PromiseFlatCString(aRealm).get(), + originSuffix, + &entry); + + if (NS_FAILED(rv)) + return rv; + if (!entry) + return NS_ERROR_UNEXPECTED; + + aUserDomain.Assign(entry->Domain()); + aUserName.Assign(entry->User()); + aUserPassword.Assign(entry->Pass()); + return NS_OK; +} + +NS_IMETHODIMP +nsHttpAuthManager::SetAuthIdentity(const nsACString & aScheme, + const nsACString & aHost, + int32_t aPort, + const nsACString & aAuthType, + const nsACString & aRealm, + const nsACString & aPath, + const nsAString & aUserDomain, + const nsAString & aUserName, + const nsAString & aUserPassword, + bool aIsPrivate, + nsIPrincipal* aPrincipal) +{ + nsHttpAuthIdentity ident(PromiseFlatString(aUserDomain).get(), + PromiseFlatString(aUserName).get(), + PromiseFlatString(aUserPassword).get()); + + nsAutoCString originSuffix; + if (aPrincipal) { + BasePrincipal::Cast(aPrincipal)->OriginAttributesRef().CreateSuffix(originSuffix); + } + + + nsHttpAuthCache* auth_cache = aIsPrivate ? mPrivateAuthCache : mAuthCache; + return auth_cache->SetAuthEntry(PromiseFlatCString(aScheme).get(), + PromiseFlatCString(aHost).get(), + aPort, + PromiseFlatCString(aPath).get(), + PromiseFlatCString(aRealm).get(), + nullptr, // credentials + nullptr, // challenge + originSuffix, + &ident, + nullptr); // metadata +} + +NS_IMETHODIMP +nsHttpAuthManager::ClearAll() +{ + nsresult rv = mAuthCache->ClearAll(); + nsresult rv2 = mPrivateAuthCache->ClearAll(); + if (NS_FAILED(rv)) + return rv; + if (NS_FAILED(rv2)) + return rv2; + return NS_OK; +} + +} // namespace net +} // namespace mozilla |