Home | History | Annotate | Download | only in http
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_
      6 #define NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_
      7 
      8 #include <list>
      9 #include <string>
     10 
     11 #include "base/gtest_prod_util.h"
     12 #include "net/http/http_auth_gssapi_posix.h"
     13 
     14 #if defined(OS_MACOSX) && defined(MAC_OS_X_VERSION_10_9) && \
     15     MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_9
     16 // Including gssapi.h directly is deprecated in the 10.9 SDK.
     17 #include <GSS/gssapi.h>
     18 #else
     19 #include <gssapi.h>
     20 #endif
     21 
     22 namespace net {
     23 
     24 namespace test {
     25 
     26 class GssContextMockImpl {
     27  public:
     28   GssContextMockImpl();
     29   GssContextMockImpl(const GssContextMockImpl& other);
     30   GssContextMockImpl(const char* src_name,
     31                      const char* targ_name,
     32                      OM_uint32 lifetime_rec,
     33                      const gss_OID_desc& mech_type,
     34                      OM_uint32 ctx_flags,
     35                      int locally_initiated,
     36                      int open);
     37   ~GssContextMockImpl();
     38 
     39   void Assign(const GssContextMockImpl& other);
     40 
     41   std::string src_name;
     42   std::string targ_name;
     43   OM_uint32 lifetime_rec;
     44   gss_OID_desc mech_type;
     45   OM_uint32 ctx_flags;
     46   int locally_initiated;
     47   int open;
     48 };
     49 
     50 // The MockGSSAPILibrary class is intended for unit tests which want to bypass
     51 // the system GSSAPI library calls.
     52 class MockGSSAPILibrary : public GSSAPILibrary {
     53  public:
     54   // Unit tests need access to this. "Friend"ing didn't help.
     55   struct SecurityContextQuery {
     56     SecurityContextQuery();
     57     SecurityContextQuery(const std::string& expected_package,
     58                          OM_uint32 response_code,
     59                          OM_uint32 minor_response_code,
     60                          const test::GssContextMockImpl& context_info,
     61                          const char* expected_input_token,
     62                          const char* output_token);
     63     ~SecurityContextQuery();
     64 
     65     std::string expected_package;
     66     OM_uint32 response_code;
     67     OM_uint32 minor_response_code;
     68     test::GssContextMockImpl context_info;
     69     gss_buffer_desc expected_input_token;
     70     gss_buffer_desc output_token;
     71   };
     72 
     73   MockGSSAPILibrary();
     74   virtual ~MockGSSAPILibrary();
     75 
     76   // Establishes an expectation for a |init_sec_context()| call.
     77   //
     78   // Each expectation established by |ExpectSecurityContext()| must be
     79   // matched by a call to |init_sec_context()| during the lifetime of
     80   // the MockGSSAPILibrary. The |expected_package| argument must equal the
     81   // value associated with the |target_name| argument to |init_sec_context()|
     82   // for there to be a match. The expectations also establish an explicit
     83   // ordering.
     84   //
     85   // For example, this sequence will be successful.
     86   //   MockGSSAPILibrary lib;
     87   //   lib.ExpectSecurityContext("NTLM", ...)
     88   //   lib.ExpectSecurityContext("Negotiate", ...)
     89   //   lib.init_sec_context("NTLM", ...)
     90   //   lib.init_sec_context("Negotiate", ...)
     91   //
     92   // This sequence will fail since the queries do not occur in the order
     93   // established by the expectations.
     94   //   MockGSSAPILibrary lib;
     95   //   lib.ExpectSecurityContext("NTLM", ...)
     96   //   lib.ExpectSecurityContext("Negotiate", ...)
     97   //   lib.init_sec_context("Negotiate", ...)
     98   //   lib.init_sec_context("NTLM", ...)
     99   //
    100   // This sequence will fail because there were not enough queries.
    101   //   MockGSSAPILibrary lib;
    102   //   lib.ExpectSecurityContext("NTLM", ...)
    103   //   lib.ExpectSecurityContext("Negotiate", ...)
    104   //   lib.init_sec_context("NTLM", ...)
    105   //
    106   // |response_code| is used as the return value for |init_sec_context()|.
    107   // If |response_code| is GSS_S_COMPLETE,
    108   //
    109   // |context_info| is the expected value of the |**context_handle| in after
    110   // |init_sec_context()| returns.
    111   void ExpectSecurityContext(const std::string& expected_package,
    112                              OM_uint32 response_code,
    113                              OM_uint32 minor_response_code,
    114                              const test::GssContextMockImpl& context_info,
    115                              const gss_buffer_desc& expected_input_token,
    116                              const gss_buffer_desc& output_token);
    117 
    118   // GSSAPILibrary methods:
    119 
    120   // Initializes the library, including any necessary dynamic libraries.
    121   // This is done separately from construction (which happens at startup time)
    122   // in order to delay work until the class is actually needed.
    123   virtual bool Init() OVERRIDE;
    124 
    125   // These methods match the ones in the GSSAPI library.
    126   virtual OM_uint32 import_name(
    127       OM_uint32* minor_status,
    128       const gss_buffer_t input_name_buffer,
    129       const gss_OID input_name_type,
    130       gss_name_t* output_name) OVERRIDE;
    131   virtual OM_uint32 release_name(
    132       OM_uint32* minor_status,
    133       gss_name_t* input_name) OVERRIDE;
    134   virtual OM_uint32 release_buffer(
    135       OM_uint32* minor_status,
    136       gss_buffer_t buffer) OVERRIDE;
    137   virtual OM_uint32 display_name(
    138       OM_uint32* minor_status,
    139       const gss_name_t input_name,
    140       gss_buffer_t output_name_buffer,
    141       gss_OID* output_name_type) OVERRIDE;
    142   virtual OM_uint32 display_status(
    143       OM_uint32* minor_status,
    144       OM_uint32 status_value,
    145       int status_type,
    146       const gss_OID mech_type,
    147       OM_uint32* message_contex,
    148       gss_buffer_t status_string) OVERRIDE;
    149   virtual OM_uint32 init_sec_context(
    150       OM_uint32* minor_status,
    151       const gss_cred_id_t initiator_cred_handle,
    152       gss_ctx_id_t* context_handle,
    153       const gss_name_t target_name,
    154       const gss_OID mech_type,
    155       OM_uint32 req_flags,
    156       OM_uint32 time_req,
    157       const gss_channel_bindings_t input_chan_bindings,
    158       const gss_buffer_t input_token,
    159       gss_OID* actual_mech_type,
    160       gss_buffer_t output_token,
    161       OM_uint32* ret_flags,
    162       OM_uint32* time_rec) OVERRIDE;
    163   virtual OM_uint32 wrap_size_limit(
    164       OM_uint32* minor_status,
    165       const gss_ctx_id_t context_handle,
    166       int conf_req_flag,
    167       gss_qop_t qop_req,
    168       OM_uint32 req_output_size,
    169       OM_uint32* max_input_size) OVERRIDE;
    170   virtual OM_uint32 delete_sec_context(
    171       OM_uint32* minor_status,
    172       gss_ctx_id_t* context_handle,
    173       gss_buffer_t output_token) OVERRIDE;
    174   virtual OM_uint32 inquire_context(
    175       OM_uint32* minor_status,
    176       const gss_ctx_id_t context_handle,
    177       gss_name_t* src_name,
    178       gss_name_t* targ_name,
    179       OM_uint32* lifetime_rec,
    180       gss_OID* mech_type,
    181       OM_uint32* ctx_flags,
    182       int* locally_initiated,
    183       int* open) OVERRIDE;
    184 
    185  private:
    186   FRIEND_TEST_ALL_PREFIXES(HttpAuthGSSAPIPOSIXTest, GSSAPICycle);
    187 
    188   // |expected_security_queries| contains an ordered list of expected
    189   // |init_sec_context()| calls and the return values for those
    190   // calls.
    191   std::list<SecurityContextQuery> expected_security_queries_;
    192 };
    193 
    194 }  // namespace test
    195 
    196 }  // namespace net
    197 
    198 #endif  // NET_HTTP_MOCK_GSSAPI_LIBRARY_POSIX_H_
    199 
    200