15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_gssapi_posix.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#if defined(OS_MACOSX) && defined(MAC_OS_X_VERSION_10_9) && \ 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Including gssapi.h directly is deprecated in the 10.9 SDK. 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <GSS/gssapi.h> 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#else 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <gssapi.h> 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GssContextMockImpl { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GssContextMockImpl(); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GssContextMockImpl(const GssContextMockImpl& other); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GssContextMockImpl(const char* src_name, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* targ_name, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 lifetime_rec, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_OID_desc& mech_type, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 ctx_flags, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int locally_initiated, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int open); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~GssContextMockImpl(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Assign(const GssContextMockImpl& other); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string src_name; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string targ_name; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 lifetime_rec; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_OID_desc mech_type; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 ctx_flags; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int locally_initiated; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int open; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MockGSSAPILibrary class is intended for unit tests which want to bypass 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the system GSSAPI library calls. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockGSSAPILibrary : public GSSAPILibrary { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Unit tests need access to this. "Friend"ing didn't help. 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct SecurityContextQuery { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SecurityContextQuery(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SecurityContextQuery(const std::string& expected_package, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 response_code, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 minor_response_code, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const test::GssContextMockImpl& context_info, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* expected_input_token, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* output_token); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SecurityContextQuery(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string expected_package; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 response_code; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 minor_response_code; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test::GssContextMockImpl context_info; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_desc expected_input_token; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_desc output_token; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockGSSAPILibrary(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockGSSAPILibrary(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Establishes an expectation for a |init_sec_context()| call. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each expectation established by |ExpectSecurityContext()| must be 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // matched by a call to |init_sec_context()| during the lifetime of 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the MockGSSAPILibrary. The |expected_package| argument must equal the 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value associated with the |target_name| argument to |init_sec_context()| 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for there to be a match. The expectations also establish an explicit 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ordering. 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For example, this sequence will be successful. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockGSSAPILibrary lib; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("NTLM", ...) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("Negotiate", ...) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.init_sec_context("NTLM", ...) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.init_sec_context("Negotiate", ...) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This sequence will fail since the queries do not occur in the order 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // established by the expectations. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockGSSAPILibrary lib; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("NTLM", ...) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("Negotiate", ...) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.init_sec_context("Negotiate", ...) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.init_sec_context("NTLM", ...) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This sequence will fail because there were not enough queries. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MockGSSAPILibrary lib; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("NTLM", ...) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.ExpectSecurityContext("Negotiate", ...) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // lib.init_sec_context("NTLM", ...) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |response_code| is used as the return value for |init_sec_context()|. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |response_code| is GSS_S_COMPLETE, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |context_info| is the expected value of the |**context_handle| in after 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |init_sec_context()| returns. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpectSecurityContext(const std::string& expected_package, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 response_code, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 minor_response_code, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const test::GssContextMockImpl& context_info, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_buffer_desc& expected_input_token, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_buffer_desc& output_token); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GSSAPILibrary methods: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Initializes the library, including any necessary dynamic libraries. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is done separately from construction (which happens at startup time) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in order to delay work until the class is actually needed. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool Init() OVERRIDE; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These methods match the ones in the GSSAPI library. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 import_name( 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_buffer_t input_name_buffer, 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_OID input_name_type, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_name_t* output_name) OVERRIDE; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 release_name( 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_name_t* input_name) OVERRIDE; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 release_buffer( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_t buffer) OVERRIDE; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 display_name( 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_name_t input_name, 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_t output_name_buffer, 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_OID* output_name_type) OVERRIDE; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 display_status( 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 status_value, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int status_type, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_OID mech_type, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* message_contex, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_t status_string) OVERRIDE; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 init_sec_context( 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_cred_id_t initiator_cred_handle, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_ctx_id_t* context_handle, 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_name_t target_name, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_OID mech_type, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 req_flags, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 time_req, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_channel_bindings_t input_chan_bindings, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_buffer_t input_token, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_OID* actual_mech_type, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_t output_token, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* ret_flags, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* time_rec) OVERRIDE; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 wrap_size_limit( 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_ctx_id_t context_handle, 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int conf_req_flag, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_qop_t qop_req, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32 req_output_size, 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* max_input_size) OVERRIDE; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 delete_sec_context( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_ctx_id_t* context_handle, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_buffer_t output_token) OVERRIDE; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual OM_uint32 inquire_context( 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* minor_status, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gss_ctx_id_t context_handle, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_name_t* src_name, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_name_t* targ_name, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* lifetime_rec, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gss_OID* mech_type, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OM_uint32* ctx_flags, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* locally_initiated, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int* open) OVERRIDE; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(HttpAuthGSSAPIPOSIXTest, GSSAPICycle); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_security_queries| contains an ordered list of expected 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |init_sec_context()| calls and the return values for those 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // calls. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<SecurityContextQuery> expected_security_queries_; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace test 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_ 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 200