OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ | 5 #ifndef NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ |
6 #define NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ | 6 #define NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ |
7 | 7 |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/gtest_prod_util.h" | 10 #include "base/gtest_prod_util.h" |
(...skipping 23 matching lines...) Expand all Loading... |
34 class NET_EXPORT_PRIVATE GSSAPILibrary { | 34 class NET_EXPORT_PRIVATE GSSAPILibrary { |
35 public: | 35 public: |
36 virtual ~GSSAPILibrary() {} | 36 virtual ~GSSAPILibrary() {} |
37 | 37 |
38 // Initializes the library, including any necessary dynamic libraries. | 38 // Initializes the library, including any necessary dynamic libraries. |
39 // This is done separately from construction (which happens at startup time) | 39 // This is done separately from construction (which happens at startup time) |
40 // in order to delay work until the class is actually needed. | 40 // in order to delay work until the class is actually needed. |
41 virtual bool Init() = 0; | 41 virtual bool Init() = 0; |
42 | 42 |
43 // These methods match the ones in the GSSAPI library. | 43 // These methods match the ones in the GSSAPI library. |
44 virtual OM_uint32 import_name( | 44 virtual OM_uint32 import_name(OM_uint32* minor_status, |
45 OM_uint32* minor_status, | 45 const gss_buffer_t input_name_buffer, |
46 const gss_buffer_t input_name_buffer, | 46 const gss_OID input_name_type, |
47 const gss_OID input_name_type, | 47 gss_name_t* output_name) = 0; |
48 gss_name_t* output_name) = 0; | 48 virtual OM_uint32 release_name(OM_uint32* minor_status, |
49 virtual OM_uint32 release_name( | 49 gss_name_t* input_name) = 0; |
50 OM_uint32* minor_status, | 50 virtual OM_uint32 release_buffer(OM_uint32* minor_status, |
51 gss_name_t* input_name) = 0; | 51 gss_buffer_t buffer) = 0; |
52 virtual OM_uint32 release_buffer( | 52 virtual OM_uint32 display_name(OM_uint32* minor_status, |
53 OM_uint32* minor_status, | 53 const gss_name_t input_name, |
54 gss_buffer_t buffer) = 0; | 54 gss_buffer_t output_name_buffer, |
55 virtual OM_uint32 display_name( | 55 gss_OID* output_name_type) = 0; |
56 OM_uint32* minor_status, | 56 virtual OM_uint32 display_status(OM_uint32* minor_status, |
57 const gss_name_t input_name, | 57 OM_uint32 status_value, |
58 gss_buffer_t output_name_buffer, | 58 int status_type, |
59 gss_OID* output_name_type) = 0; | 59 const gss_OID mech_type, |
60 virtual OM_uint32 display_status( | 60 OM_uint32* message_contex, |
61 OM_uint32* minor_status, | 61 gss_buffer_t status_string) = 0; |
62 OM_uint32 status_value, | |
63 int status_type, | |
64 const gss_OID mech_type, | |
65 OM_uint32* message_contex, | |
66 gss_buffer_t status_string) = 0; | |
67 virtual OM_uint32 init_sec_context( | 62 virtual OM_uint32 init_sec_context( |
68 OM_uint32* minor_status, | 63 OM_uint32* minor_status, |
69 const gss_cred_id_t initiator_cred_handle, | 64 const gss_cred_id_t initiator_cred_handle, |
70 gss_ctx_id_t* context_handle, | 65 gss_ctx_id_t* context_handle, |
71 const gss_name_t target_name, | 66 const gss_name_t target_name, |
72 const gss_OID mech_type, | 67 const gss_OID mech_type, |
73 OM_uint32 req_flags, | 68 OM_uint32 req_flags, |
74 OM_uint32 time_req, | 69 OM_uint32 time_req, |
75 const gss_channel_bindings_t input_chan_bindings, | 70 const gss_channel_bindings_t input_chan_bindings, |
76 const gss_buffer_t input_token, | 71 const gss_buffer_t input_token, |
77 gss_OID* actual_mech_type, | 72 gss_OID* actual_mech_type, |
78 gss_buffer_t output_token, | 73 gss_buffer_t output_token, |
79 OM_uint32* ret_flags, | 74 OM_uint32* ret_flags, |
80 OM_uint32* time_rec) = 0; | 75 OM_uint32* time_rec) = 0; |
81 virtual OM_uint32 wrap_size_limit( | 76 virtual OM_uint32 wrap_size_limit(OM_uint32* minor_status, |
82 OM_uint32* minor_status, | 77 const gss_ctx_id_t context_handle, |
83 const gss_ctx_id_t context_handle, | 78 int conf_req_flag, |
84 int conf_req_flag, | 79 gss_qop_t qop_req, |
85 gss_qop_t qop_req, | 80 OM_uint32 req_output_size, |
86 OM_uint32 req_output_size, | 81 OM_uint32* max_input_size) = 0; |
87 OM_uint32* max_input_size) = 0; | 82 virtual OM_uint32 delete_sec_context(OM_uint32* minor_status, |
88 virtual OM_uint32 delete_sec_context( | 83 gss_ctx_id_t* context_handle, |
89 OM_uint32* minor_status, | 84 gss_buffer_t output_token) = 0; |
90 gss_ctx_id_t* context_handle, | 85 virtual OM_uint32 inquire_context(OM_uint32* minor_status, |
91 gss_buffer_t output_token) = 0; | 86 const gss_ctx_id_t context_handle, |
92 virtual OM_uint32 inquire_context( | 87 gss_name_t* src_name, |
93 OM_uint32* minor_status, | 88 gss_name_t* targ_name, |
94 const gss_ctx_id_t context_handle, | 89 OM_uint32* lifetime_rec, |
95 gss_name_t* src_name, | 90 gss_OID* mech_type, |
96 gss_name_t* targ_name, | 91 OM_uint32* ctx_flags, |
97 OM_uint32* lifetime_rec, | 92 int* locally_initiated, |
98 gss_OID* mech_type, | 93 int* open) = 0; |
99 OM_uint32* ctx_flags, | |
100 int* locally_initiated, | |
101 int* open) = 0; | |
102 | |
103 }; | 94 }; |
104 | 95 |
105 // GSSAPISharedLibrary class is defined here so that unit tests can access it. | 96 // GSSAPISharedLibrary class is defined here so that unit tests can access it. |
106 class NET_EXPORT_PRIVATE GSSAPISharedLibrary : public GSSAPILibrary { | 97 class NET_EXPORT_PRIVATE GSSAPISharedLibrary : public GSSAPILibrary { |
107 public: | 98 public: |
108 // If |gssapi_library_name| is empty, hard-coded default library names are | 99 // If |gssapi_library_name| is empty, hard-coded default library names are |
109 // used. | 100 // used. |
110 explicit GSSAPISharedLibrary(const std::string& gssapi_library_name); | 101 explicit GSSAPISharedLibrary(const std::string& gssapi_library_name); |
111 virtual ~GSSAPISharedLibrary(); | 102 virtual ~GSSAPISharedLibrary(); |
112 | 103 |
113 // GSSAPILibrary methods: | 104 // GSSAPILibrary methods: |
114 virtual bool Init() OVERRIDE; | 105 virtual bool Init() OVERRIDE; |
115 virtual OM_uint32 import_name( | 106 virtual OM_uint32 import_name(OM_uint32* minor_status, |
116 OM_uint32* minor_status, | 107 const gss_buffer_t input_name_buffer, |
117 const gss_buffer_t input_name_buffer, | 108 const gss_OID input_name_type, |
118 const gss_OID input_name_type, | 109 gss_name_t* output_name) OVERRIDE; |
119 gss_name_t* output_name) OVERRIDE; | 110 virtual OM_uint32 release_name(OM_uint32* minor_status, |
120 virtual OM_uint32 release_name( | 111 gss_name_t* input_name) OVERRIDE; |
121 OM_uint32* minor_status, | 112 virtual OM_uint32 release_buffer(OM_uint32* minor_status, |
122 gss_name_t* input_name) OVERRIDE; | 113 gss_buffer_t buffer) OVERRIDE; |
123 virtual OM_uint32 release_buffer( | 114 virtual OM_uint32 display_name(OM_uint32* minor_status, |
124 OM_uint32* minor_status, | 115 const gss_name_t input_name, |
125 gss_buffer_t buffer) OVERRIDE; | 116 gss_buffer_t output_name_buffer, |
126 virtual OM_uint32 display_name( | 117 gss_OID* output_name_type) OVERRIDE; |
127 OM_uint32* minor_status, | 118 virtual OM_uint32 display_status(OM_uint32* minor_status, |
128 const gss_name_t input_name, | 119 OM_uint32 status_value, |
129 gss_buffer_t output_name_buffer, | 120 int status_type, |
130 gss_OID* output_name_type) OVERRIDE; | 121 const gss_OID mech_type, |
131 virtual OM_uint32 display_status( | 122 OM_uint32* message_contex, |
132 OM_uint32* minor_status, | 123 gss_buffer_t status_string) OVERRIDE; |
133 OM_uint32 status_value, | |
134 int status_type, | |
135 const gss_OID mech_type, | |
136 OM_uint32* message_contex, | |
137 gss_buffer_t status_string) OVERRIDE; | |
138 virtual OM_uint32 init_sec_context( | 124 virtual OM_uint32 init_sec_context( |
139 OM_uint32* minor_status, | 125 OM_uint32* minor_status, |
140 const gss_cred_id_t initiator_cred_handle, | 126 const gss_cred_id_t initiator_cred_handle, |
141 gss_ctx_id_t* context_handle, | 127 gss_ctx_id_t* context_handle, |
142 const gss_name_t target_name, | 128 const gss_name_t target_name, |
143 const gss_OID mech_type, | 129 const gss_OID mech_type, |
144 OM_uint32 req_flags, | 130 OM_uint32 req_flags, |
145 OM_uint32 time_req, | 131 OM_uint32 time_req, |
146 const gss_channel_bindings_t input_chan_bindings, | 132 const gss_channel_bindings_t input_chan_bindings, |
147 const gss_buffer_t input_token, | 133 const gss_buffer_t input_token, |
148 gss_OID* actual_mech_type, | 134 gss_OID* actual_mech_type, |
149 gss_buffer_t output_token, | 135 gss_buffer_t output_token, |
150 OM_uint32* ret_flags, | 136 OM_uint32* ret_flags, |
151 OM_uint32* time_rec) OVERRIDE; | 137 OM_uint32* time_rec) OVERRIDE; |
152 virtual OM_uint32 wrap_size_limit( | 138 virtual OM_uint32 wrap_size_limit(OM_uint32* minor_status, |
153 OM_uint32* minor_status, | 139 const gss_ctx_id_t context_handle, |
154 const gss_ctx_id_t context_handle, | 140 int conf_req_flag, |
155 int conf_req_flag, | 141 gss_qop_t qop_req, |
156 gss_qop_t qop_req, | 142 OM_uint32 req_output_size, |
157 OM_uint32 req_output_size, | 143 OM_uint32* max_input_size) OVERRIDE; |
158 OM_uint32* max_input_size) OVERRIDE; | 144 virtual OM_uint32 delete_sec_context(OM_uint32* minor_status, |
159 virtual OM_uint32 delete_sec_context( | 145 gss_ctx_id_t* context_handle, |
160 OM_uint32* minor_status, | 146 gss_buffer_t output_token) OVERRIDE; |
161 gss_ctx_id_t* context_handle, | 147 virtual OM_uint32 inquire_context(OM_uint32* minor_status, |
162 gss_buffer_t output_token) OVERRIDE; | 148 const gss_ctx_id_t context_handle, |
163 virtual OM_uint32 inquire_context( | 149 gss_name_t* src_name, |
164 OM_uint32* minor_status, | 150 gss_name_t* targ_name, |
165 const gss_ctx_id_t context_handle, | 151 OM_uint32* lifetime_rec, |
166 gss_name_t* src_name, | 152 gss_OID* mech_type, |
167 gss_name_t* targ_name, | 153 OM_uint32* ctx_flags, |
168 OM_uint32* lifetime_rec, | 154 int* locally_initiated, |
169 gss_OID* mech_type, | 155 int* open) OVERRIDE; |
170 OM_uint32* ctx_flags, | |
171 int* locally_initiated, | |
172 int* open) OVERRIDE; | |
173 | 156 |
174 private: | 157 private: |
175 typedef typeof(&gss_import_name) gss_import_name_type; | 158 typedef typeof(&gss_import_name) gss_import_name_type; |
176 typedef typeof(&gss_release_name) gss_release_name_type; | 159 typedef typeof(&gss_release_name) gss_release_name_type; |
177 typedef typeof(&gss_release_buffer) gss_release_buffer_type; | 160 typedef typeof(&gss_release_buffer) gss_release_buffer_type; |
178 typedef typeof(&gss_display_name) gss_display_name_type; | 161 typedef typeof(&gss_display_name) gss_display_name_type; |
179 typedef typeof(&gss_display_status) gss_display_status_type; | 162 typedef typeof(&gss_display_status) gss_display_status_type; |
180 typedef typeof(&gss_init_sec_context) gss_init_sec_context_type; | 163 typedef typeof(&gss_init_sec_context) gss_init_sec_context_type; |
181 typedef typeof(&gss_wrap_size_limit) gss_wrap_size_limit_type; | 164 typedef typeof(&gss_wrap_size_limit) gss_wrap_size_limit_type; |
182 typedef typeof(&gss_delete_sec_context) gss_delete_sec_context_type; | 165 typedef typeof(&gss_delete_sec_context) gss_delete_sec_context_type; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
219 gss_ctx_id_t get() const { return security_context_; } | 202 gss_ctx_id_t get() const { return security_context_; } |
220 gss_ctx_id_t* receive() { return &security_context_; } | 203 gss_ctx_id_t* receive() { return &security_context_; } |
221 | 204 |
222 private: | 205 private: |
223 gss_ctx_id_t security_context_; | 206 gss_ctx_id_t security_context_; |
224 GSSAPILibrary* gssapi_lib_; | 207 GSSAPILibrary* gssapi_lib_; |
225 | 208 |
226 DISALLOW_COPY_AND_ASSIGN(ScopedSecurityContext); | 209 DISALLOW_COPY_AND_ASSIGN(ScopedSecurityContext); |
227 }; | 210 }; |
228 | 211 |
229 | |
230 // TODO(ahendrickson): Share code with HttpAuthSSPI. | 212 // TODO(ahendrickson): Share code with HttpAuthSSPI. |
231 class NET_EXPORT_PRIVATE HttpAuthGSSAPI { | 213 class NET_EXPORT_PRIVATE HttpAuthGSSAPI { |
232 public: | 214 public: |
233 HttpAuthGSSAPI(GSSAPILibrary* library, | 215 HttpAuthGSSAPI(GSSAPILibrary* library, |
234 const std::string& scheme, | 216 const std::string& scheme, |
235 const gss_OID gss_oid); | 217 const gss_OID gss_oid); |
236 ~HttpAuthGSSAPI(); | 218 ~HttpAuthGSSAPI(); |
237 | 219 |
238 bool Init(); | 220 bool Init(); |
239 | 221 |
240 bool NeedsIdentity() const; | 222 bool NeedsIdentity() const; |
241 | 223 |
242 bool AllowsExplicitCredentials() const; | 224 bool AllowsExplicitCredentials() const; |
243 | 225 |
244 HttpAuth::AuthorizationResult ParseChallenge( | 226 HttpAuth::AuthorizationResult ParseChallenge(HttpAuthChallengeTokenizer* tok); |
245 HttpAuthChallengeTokenizer* tok); | |
246 | 227 |
247 // Generates an authentication token. | 228 // Generates an authentication token. |
248 // The return value is an error code. If it's not |OK|, the value of | 229 // The return value is an error code. If it's not |OK|, the value of |
249 // |*auth_token| is unspecified. | 230 // |*auth_token| is unspecified. |
250 // |spn| is the Service Principal Name of the server that the token is | 231 // |spn| is the Service Principal Name of the server that the token is |
251 // being generated for. | 232 // being generated for. |
252 // If this is the first round of a multiple round scheme, credentials are | 233 // If this is the first round of a multiple round scheme, credentials are |
253 // obtained using |*credentials|. If |credentials| is NULL, the default | 234 // obtained using |*credentials|. If |credentials| is NULL, the default |
254 // credentials are used instead. | 235 // credentials are used instead. |
255 int GenerateAuthToken(const AuthCredentials* credentials, | 236 int GenerateAuthToken(const AuthCredentials* credentials, |
(...skipping 14 matching lines...) Expand all Loading... |
270 gss_OID gss_oid_; | 251 gss_OID gss_oid_; |
271 GSSAPILibrary* library_; | 252 GSSAPILibrary* library_; |
272 std::string decoded_server_auth_token_; | 253 std::string decoded_server_auth_token_; |
273 ScopedSecurityContext scoped_sec_context_; | 254 ScopedSecurityContext scoped_sec_context_; |
274 bool can_delegate_; | 255 bool can_delegate_; |
275 }; | 256 }; |
276 | 257 |
277 } // namespace net | 258 } // namespace net |
278 | 259 |
279 #endif // NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ | 260 #endif // NET_HTTP_HTTP_AUTH_GSSAPI_POSIX_H_ |
OLD | NEW |