Home | History | Annotate | Download | only in http
      1 // Copyright (c) 2010 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_SSPI_LIBRARY_WIN_H_
      6 #define NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_
      7 #pragma once
      8 
      9 #include <list>
     10 #include <set>
     11 
     12 #include "net/http/http_auth_sspi_win.h"
     13 
     14 namespace net {
     15 
     16 // The MockSSPILibrary class is intended for unit tests which want to bypass
     17 // the system SSPI library calls.
     18 class MockSSPILibrary : public SSPILibrary {
     19  public:
     20   MockSSPILibrary();
     21   virtual ~MockSSPILibrary();
     22 
     23   // TODO(cbentzel): Only QuerySecurityPackageInfo and FreeContextBuffer
     24   //                 are properly handled currently.
     25   // SSPILibrary methods:
     26   virtual SECURITY_STATUS AcquireCredentialsHandle(LPWSTR pszPrincipal,
     27                                                    LPWSTR pszPackage,
     28                                                    unsigned long fCredentialUse,
     29                                                    void* pvLogonId,
     30                                                    void* pvAuthData,
     31                                                    SEC_GET_KEY_FN pGetKeyFn,
     32                                                    void* pvGetKeyArgument,
     33                                                    PCredHandle phCredential,
     34                                                    PTimeStamp ptsExpiry);
     35   virtual SECURITY_STATUS InitializeSecurityContext(PCredHandle phCredential,
     36                                                     PCtxtHandle phContext,
     37                                                     SEC_WCHAR* pszTargetName,
     38                                                     unsigned long fContextReq,
     39                                                     unsigned long Reserved1,
     40                                                     unsigned long TargetDataRep,
     41                                                     PSecBufferDesc pInput,
     42                                                     unsigned long Reserved2,
     43                                                     PCtxtHandle phNewContext,
     44                                                     PSecBufferDesc pOutput,
     45                                                     unsigned long* contextAttr,
     46                                                     PTimeStamp ptsExpiry);
     47   virtual SECURITY_STATUS QuerySecurityPackageInfo(LPWSTR pszPackageName,
     48                                                    PSecPkgInfoW *pkgInfo);
     49   virtual SECURITY_STATUS FreeCredentialsHandle(PCredHandle phCredential);
     50   virtual SECURITY_STATUS DeleteSecurityContext(PCtxtHandle phContext);
     51   virtual SECURITY_STATUS FreeContextBuffer(PVOID pvContextBuffer);
     52 
     53   // Establishes an expectation for a |QuerySecurityPackageInfo()| call.
     54   //
     55   // Each expectation established by |ExpectSecurityQueryPackageInfo()| must be
     56   // matched by a call to |QuerySecurityPackageInfo()| during the lifetime of
     57   // the MockSSPILibrary. The |expected_package| argument must equal the
     58   // |*pszPackageName| argument to |QuerySecurityPackageInfo()| for there to be
     59   // a match. The expectations also establish an explicit ordering.
     60   //
     61   // For example, this sequence will be successful.
     62   //   MockSSPILibrary lib;
     63   //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
     64   //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
     65   //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
     66   //   lib.QuerySecurityPackageInfo(L"Negotiate", ...)
     67   //
     68   // This sequence will fail since the queries do not occur in the order
     69   // established by the expectations.
     70   //   MockSSPILibrary lib;
     71   //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
     72   //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
     73   //   lib.QuerySecurityPackageInfo(L"Negotiate", ...)
     74   //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
     75   //
     76   // This sequence will fail because there were not enough queries.
     77   //   MockSSPILibrary lib;
     78   //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
     79   //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
     80   //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
     81   //
     82   // |response_code| is used as the return value for
     83   // |QuerySecurityPackageInfo()|. If |response_code| is SEC_E_OK,
     84   // an expectation is also set for a call to |FreeContextBuffer()| after
     85   // the matching |QuerySecurityPackageInfo()| is called.
     86   //
     87   // |package_info| is assigned to |*pkgInfo| in |QuerySecurityPackageInfo|.
     88   // The lifetime of |*package_info| should last at least until the matching
     89   // |QuerySecurityPackageInfo()| is called.
     90   void ExpectQuerySecurityPackageInfo(const std::wstring& expected_package,
     91                                       SECURITY_STATUS response_code,
     92                                       PSecPkgInfoW package_info);
     93 
     94  private:
     95   struct PackageQuery {
     96     std::wstring expected_package;
     97     SECURITY_STATUS response_code;
     98     PSecPkgInfoW package_info;
     99   };
    100 
    101   // expected_package_queries contains an ordered list of expected
    102   // |QuerySecurityPackageInfo()| calls and the return values for those
    103   // calls.
    104   std::list<PackageQuery> expected_package_queries_;
    105 
    106   // Set of packages which should be freed.
    107   std::set<PSecPkgInfoW> expected_freed_packages_;
    108 };
    109 
    110 }  // namespace net
    111 
    112 #endif  // NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_
    113