15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2010 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_SSPI_LIBRARY_WIN_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_sspi_win.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The MockSSPILibrary class is intended for unit tests which want to bypass
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the system SSPI library calls.
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSSPILibrary : public SSPILibrary {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockSSPILibrary();
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MockSSPILibrary();
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(cbentzel): Only QuerySecurityPackageInfo and FreeContextBuffer
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                 are properly handled currently.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SSPILibrary methods:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS AcquireCredentialsHandle(LPWSTR pszPrincipal,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   LPWSTR pszPackage,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   unsigned long fCredentialUse,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   void* pvLogonId,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   void* pvAuthData,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   SEC_GET_KEY_FN pGetKeyFn,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   void* pvGetKeyArgument,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   PCredHandle phCredential,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   PTimeStamp ptsExpiry);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS InitializeSecurityContext(PCredHandle phCredential,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    PCtxtHandle phContext,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    SEC_WCHAR* pszTargetName,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    unsigned long fContextReq,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    unsigned long Reserved1,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    unsigned long TargetDataRep,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    PSecBufferDesc pInput,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    unsigned long Reserved2,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    PCtxtHandle phNewContext,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    PSecBufferDesc pOutput,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    unsigned long* contextAttr,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                    PTimeStamp ptsExpiry);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS QuerySecurityPackageInfo(LPWSTR pszPackageName,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   PSecPkgInfoW *pkgInfo);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS FreeCredentialsHandle(PCredHandle phCredential);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS DeleteSecurityContext(PCtxtHandle phContext);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual SECURITY_STATUS FreeContextBuffer(PVOID pvContextBuffer);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Establishes an expectation for a |QuerySecurityPackageInfo()| call.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Each expectation established by |ExpectSecurityQueryPackageInfo()| must be
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matched by a call to |QuerySecurityPackageInfo()| during the lifetime of
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the MockSSPILibrary. The |expected_package| argument must equal the
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |*pszPackageName| argument to |QuerySecurityPackageInfo()| for there to be
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a match. The expectations also establish an explicit ordering.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For example, this sequence will be successful.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   MockSSPILibrary lib;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.QuerySecurityPackageInfo(L"Negotiate", ...)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This sequence will fail since the queries do not occur in the order
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // established by the expectations.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   MockSSPILibrary lib;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.QuerySecurityPackageInfo(L"Negotiate", ...)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This sequence will fail because there were not enough queries.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   MockSSPILibrary lib;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"NTLM", ...)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.ExpectQuerySecurityPackageInfo(L"Negotiate", ...)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   lib.QuerySecurityPackageInfo(L"NTLM", ...)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |response_code| is used as the return value for
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |QuerySecurityPackageInfo()|. If |response_code| is SEC_E_OK,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an expectation is also set for a call to |FreeContextBuffer()| after
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the matching |QuerySecurityPackageInfo()| is called.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |package_info| is assigned to |*pkgInfo| in |QuerySecurityPackageInfo|.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lifetime of |*package_info| should last at least until the matching
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |QuerySecurityPackageInfo()| is called.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ExpectQuerySecurityPackageInfo(const std::wstring& expected_package,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      SECURITY_STATUS response_code,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      PSecPkgInfoW package_info);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PackageQuery {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::wstring expected_package;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SECURITY_STATUS response_code;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PSecPkgInfoW package_info;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // expected_package_queries contains an ordered list of expected
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |QuerySecurityPackageInfo()| calls and the return values for those
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::list<PackageQuery> expected_package_queries_;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set of packages which should be freed.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<PSecPkgInfoW> expected_freed_packages_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_HTTP_MOCK_SSPI_LIBRARY_WIN_H_
112