Index: net/http/http_auth_gssapi_posix.h |
diff --git a/net/http/http_auth_gssapi_posix.h b/net/http/http_auth_gssapi_posix.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..80ab1142c10aac5848da2d8126f4c4c92a4ea8af |
--- /dev/null |
+++ b/net/http/http_auth_gssapi_posix.h |
@@ -0,0 +1,186 @@ |
+// Copyright (c) 2010 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_GSSAPI_POSIX_H_ |
+#define NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ |
+ |
+#include <string> |
+ |
+#include "base/native_library.h" |
+#include "net/http/http_auth.h" |
+ |
+#define GSS_USE_FUNCTION_POINTERS |
+#include "net/third_party/gssapi/gssapi.h" |
+ |
+class GURL; |
+ |
+namespace net { |
+ |
+class HttpRequestInfo; |
+class ProxyInfo; |
+ |
+// GSSAPILibrary is introduced so unit tests can mock the calls to the GSSAPI |
+// library. The default implementation attempts to load one of the standard |
+// GSSAPI library implementations, then simply passes the arguments on to |
+// that implementation. |
+class GSSAPILibrary { |
+ public: |
+ virtual ~GSSAPILibrary() {} |
+ |
+ virtual bool Init() = 0; |
+ virtual gssapi::OM_uint32 import_name( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_buffer_t input_name_buffer, |
+ const gssapi::gss_OID input_name_type, |
+ gssapi::gss_name_t* output_name) = 0; |
+ virtual gssapi::OM_uint32 release_name( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::gss_name_t* input_name) = 0; |
+ virtual gssapi::OM_uint32 release_buffer( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::gss_buffer_t buffer) = 0; |
+ virtual gssapi::OM_uint32 display_status( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::OM_uint32 status_value, |
+ int status_type, |
+ const gssapi::gss_OID mech_type, |
+ gssapi::OM_uint32* message_contex, |
+ gssapi::gss_buffer_t status_string) = 0; |
+ virtual gssapi::OM_uint32 init_sec_context( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_cred_id_t initiator_cred_handle, |
+ gssapi::gss_ctx_id_t* context_handle, |
+ const gssapi::gss_name_t target_name, |
+ const gssapi::gss_OID mech_type, |
+ gssapi::OM_uint32 req_flags, |
+ gssapi::OM_uint32 time_req, |
+ const gssapi::gss_channel_bindings_t input_chan_bindings, |
+ const gssapi::gss_buffer_t input_token, |
+ gssapi::gss_OID* actual_mech_type, |
+ gssapi::gss_buffer_t* output_token, |
+ gssapi::OM_uint32* ret_flags, |
+ gssapi::OM_uint32* time_rec) = 0; |
+ virtual gssapi::OM_uint32 wrap_size_limit( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_ctx_id_t context_handle, |
+ int conf_req_flag, |
+ gssapi::gss_qop_t qop_req, |
+ gssapi::OM_uint32 req_output_size, |
+ gssapi::OM_uint32* max_input_size) = 0; |
+ |
+ // Get the default GSSPILibrary instance. The object returned is a singleton |
+ // instance, and the caller should not delete it. |
+ static GSSAPILibrary* GetDefault(); |
+}; |
+ |
+class GSSAPISharedLibrary : public GSSAPILibrary { |
+ public: |
+ GSSAPISharedLibrary(); |
+ virtual ~GSSAPISharedLibrary(); |
+ |
+ // GSSAPILibrary methods: |
+ virtual bool Init(); |
+ virtual gssapi::OM_uint32 import_name( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_buffer_t input_name_buffer, |
+ const gssapi::gss_OID input_name_type, |
+ gssapi::gss_name_t* output_name); |
+ virtual gssapi::OM_uint32 release_name( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::gss_name_t* input_name); |
+ virtual gssapi::OM_uint32 release_buffer( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::gss_buffer_t buffer); |
+ virtual gssapi::OM_uint32 display_status( |
+ gssapi::OM_uint32* minor_status, |
+ gssapi::OM_uint32 status_value, |
+ int status_type, |
+ const gssapi::gss_OID mech_type, |
+ gssapi::OM_uint32* message_contex, |
+ gssapi::gss_buffer_t status_string); |
+ virtual gssapi::OM_uint32 init_sec_context( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_cred_id_t initiator_cred_handle, |
+ gssapi::gss_ctx_id_t* context_handle, |
+ const gssapi::gss_name_t target_name, |
+ const gssapi::gss_OID mech_type, |
+ gssapi::OM_uint32 req_flags, |
+ gssapi::OM_uint32 time_req, |
+ const gssapi::gss_channel_bindings_t input_chan_bindings, |
+ const gssapi::gss_buffer_t input_token, |
+ gssapi::gss_OID* actual_mech_type, |
+ gssapi::gss_buffer_t* output_token, |
+ gssapi::OM_uint32* ret_flags, |
+ gssapi::OM_uint32* time_rec); |
+ virtual gssapi::OM_uint32 wrap_size_limit( |
+ gssapi::OM_uint32* minor_status, |
+ const gssapi::gss_ctx_id_t context_handle, |
+ int conf_req_flag, |
+ gssapi::gss_qop_t qop_req, |
+ gssapi::OM_uint32 req_output_size, |
+ gssapi::OM_uint32* max_input_size); |
+ |
+ private: |
+ |
+ bool InitImpl(); |
+ base::NativeLibrary LoadSharedObject(); |
+ bool BindMethods(); |
+ |
+ static const char* kLibraryNames[]; |
+ |
+ bool initialized_; |
+ bool cached_initialize_value_; |
+ |
+ // Need some way to invalidate the library. |
+ base::NativeLibrary gssapi_library_; |
+ |
+ // Function pointers |
+ gssapi::gss_import_name_type import_name_; |
+ gssapi::gss_release_name_type release_name_; |
+ gssapi::gss_release_buffer_type release_buffer_; |
+ gssapi::gss_display_status_type display_status_; |
+ gssapi::gss_init_sec_context_type init_sec_context_; |
+ gssapi::gss_wrap_size_limit_type wrap_size_limit_; |
+}; |
+ |
+// TODO(cbentzel): Share code with HttpAuthSSPI. |
+class HttpAuthGSSAPI { |
+ public: |
+ HttpAuthGSSAPI(const std::string& scheme, |
+ const gssapi::gss_OID gss_oid, |
+ GSSAPILibrary* library); |
+ ~HttpAuthGSSAPI(); |
+ |
+ bool NeedsIdentity() const; |
+ bool IsFinalRound() const; |
+ |
+ bool ParseChallenge(HttpAuth::ChallengeTokenizer* tok); |
+ |
+ int GenerateAuthToken(const std::wstring* username, |
+ const std::wstring* password, |
+ const std::wstring& origin, |
+ const HttpRequestInfo* request, |
+ const ProxyInfo* proxy, |
+ std::string* out_credentials); |
+ |
+ private: |
+ |
+ int OnFirstRound(const std::wstring* username, |
+ const std::wstring* password); |
+ int GetNextSecurityToken(const std::wstring& origin, |
+ gssapi::gss_buffer_t in_token, |
+ gssapi::gss_buffer_t* out_token); |
+ |
+ std::string scheme_; |
+ std::wstring username_; |
+ std::wstring password_; |
+ gssapi::gss_OID gss_oid_; |
+ GSSAPILibrary* library_; |
+ std::string decoded_server_auth_token_; |
+ gssapi::gss_ctx_id_t sec_context_; |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ |