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