1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
|
// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef NET_HTTP_HTTP_AUTH_HANDLER_NTLM_H_
#define NET_HTTP_HTTP_AUTH_HANDLER_NTLM_H_
#include <stddef.h>
#include <stdint.h>
#include "build/build_config.h"
// This contains the portable and the SSPI implementations for NTLM.
// We use NTLM_SSPI for Windows, and NTLM_PORTABLE for other platforms.
#if defined(OS_WIN)
#define NTLM_SSPI
#else
#define NTLM_PORTABLE
#endif
#if defined(NTLM_SSPI)
#define SECURITY_WIN32 1
#include <windows.h>
#include <security.h>
#include "net/http/http_auth_sspi_win.h"
#elif defined(NTLM_PORTABLE)
#include "net/ntlm/ntlm_client.h"
#endif
#include <string>
#include <vector>
#include "base/containers/span.h"
#include "base/strings/string16.h"
#include "net/base/completion_once_callback.h"
#include "net/base/net_export.h"
#include "net/http/http_auth_handler.h"
#include "net/http/http_auth_handler_factory.h"
namespace net {
class HttpAuthPreferences;
// Code for handling HTTP NTLM authentication.
class NET_EXPORT_PRIVATE HttpAuthHandlerNTLM : public HttpAuthHandler {
public:
class Factory : public HttpAuthHandlerFactory {
public:
Factory();
~Factory() override;
int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge,
HttpAuth::Target target,
const SSLInfo& ssl_info,
const GURL& origin,
CreateReason reason,
int digest_nonce_count,
const NetLogWithSource& net_log,
std::unique_ptr<HttpAuthHandler>* handler) override;
#if defined(NTLM_SSPI)
// Set the SSPILibrary to use. Typically the only callers which need to use
// this are unit tests which pass in a mocked-out version of the SSPI
// library. After the call |sspi_library| will be owned by this Factory and
// will be destroyed when the Factory is destroyed.
void set_sspi_library(SSPILibrary* sspi_library) {
sspi_library_.reset(sspi_library);
}
#endif // defined(NTLM_SSPI)
private:
#if defined(NTLM_SSPI)
ULONG max_token_length_;
bool is_unsupported_;
std::unique_ptr<SSPILibrary> sspi_library_;
#endif // defined(NTLM_SSPI)
};
#if defined(NTLM_PORTABLE)
// A function that returns the time as the number of 100 nanosecond ticks
// since Jan 1, 1601 (UTC).
typedef uint64_t (*GetMSTimeProc)();
// A function that generates n random bytes in the output buffer.
typedef void (*GenerateRandomProc)(uint8_t* output, size_t n);
// A function that returns the local host name. Returns an empty string if
// the local host name is not available.
typedef std::string (*HostNameProc)();
// For unit tests to override and restore the GenerateRandom and
// GetHostName functions.
class ScopedProcSetter {
public:
ScopedProcSetter(GetMSTimeProc ms_time_proc,
GenerateRandomProc random_proc,
HostNameProc host_name_proc) {
old_ms_time_proc_ = SetGetMSTimeProc(ms_time_proc);
old_random_proc_ = SetGenerateRandomProc(random_proc);
old_host_name_proc_ = SetHostNameProc(host_name_proc);
}
~ScopedProcSetter() {
SetGetMSTimeProc(old_ms_time_proc_);
SetGenerateRandomProc(old_random_proc_);
SetHostNameProc(old_host_name_proc_);
}
private:
GetMSTimeProc old_ms_time_proc_;
GenerateRandomProc old_random_proc_;
HostNameProc old_host_name_proc_;
};
#endif
#if defined(NTLM_PORTABLE)
explicit HttpAuthHandlerNTLM(
const HttpAuthPreferences* http_auth_preferences);
#endif
#if defined(NTLM_SSPI)
HttpAuthHandlerNTLM(SSPILibrary* sspi_library,
ULONG max_token_length,
const HttpAuthPreferences* http_auth_preferences);
#endif
bool NeedsIdentity() override;
bool AllowsDefaultCredentials() override;
HttpAuth::AuthorizationResult HandleAnotherChallenge(
HttpAuthChallengeTokenizer* challenge) override;
protected:
// This function acquires a credentials handle in the SSPI implementation.
// It does nothing in the portable implementation.
int InitializeBeforeFirstChallenge();
bool Init(HttpAuthChallengeTokenizer* tok, const SSLInfo& ssl_info) override;
int GenerateAuthTokenImpl(const AuthCredentials* credentials,
const HttpRequestInfo* request,
CompletionOnceCallback callback,
std::string* auth_token) override;
private:
~HttpAuthHandlerNTLM() override;
#if defined(NTLM_PORTABLE)
// For unit tests to override the GetMSTime, GenerateRandom and GetHostName
// functions. Returns the old function.
static GetMSTimeProc SetGetMSTimeProc(GetMSTimeProc proc);
static GenerateRandomProc SetGenerateRandomProc(GenerateRandomProc proc);
static HostNameProc SetHostNameProc(HostNameProc proc);
// Given an input token received from the server, generate the next output
// token to be sent to the server.
std::vector<uint8_t> GetNextToken(base::span<const uint8_t> in_token);
#endif
// Parse the challenge, saving the results into this instance.
HttpAuth::AuthorizationResult ParseChallenge(
HttpAuthChallengeTokenizer* tok, bool initial_challenge);
// Create an NTLM SPN to identify the |origin| server.
static std::string CreateSPN(const GURL& origin);
#if defined(NTLM_SSPI)
HttpAuthSSPI auth_sspi_;
#elif defined(NTLM_PORTABLE)
ntlm::NtlmClient ntlm_client_;
#endif
#if defined(NTLM_PORTABLE)
static GetMSTimeProc get_ms_time_proc_;
static GenerateRandomProc generate_random_proc_;
static HostNameProc get_host_name_proc_;
#endif
base::string16 domain_;
AuthCredentials credentials_;
std::string channel_bindings_;
// The base64-encoded string following "NTLM" in the "WWW-Authenticate" or
// "Proxy-Authenticate" response header.
std::string auth_data_;
#if defined(NTLM_SSPI)
const HttpAuthPreferences* http_auth_preferences_;
#endif
};
} // namespace net
#endif // NET_HTTP_HTTP_AUTH_HANDLER_NTLM_H_
|