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