Commit 99b45fa4 authored by Roger Tawa's avatar Roger Tawa Committed by Commit Bot

The credential provider should not attempt network connection

with no internet.

Bug: 906767
Change-Id: Ib98660b4a27f6d0f5f1d5b5706813307b06bc80b
Reviewed-on: https://chromium-review.googlesource.com/c/1343286
Commit-Queue: Roger Tawa <rogerta@chromium.org>
Reviewed-by: default avatarNico Weber <thakis@chromium.org>
Reviewed-by: default avatarGreg Thompson <grt@chromium.org>
Cr-Commit-Position: refs/heads/master@{#610124}
parent c7b6d48b
......@@ -754,6 +754,7 @@ HRESULT CGaiaCredentialBase::GetSerialization(
CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION* cpcs,
wchar_t** status_text,
CREDENTIAL_PROVIDER_STATUS_ICON* status_icon) {
USES_CONVERSION;
LOGFN(INFO);
DCHECK(status_text);
DCHECK(status_icon);
......@@ -785,6 +786,18 @@ HRESULT CGaiaCredentialBase::GetSerialization(
LOGFN(INFO) << "HandleAutologon hr=" << putHR(hr);
TellOmahaDidRun();
// If there is no internet connection, just abort right away.
if (provider_->HasInternetConnection() != S_OK) {
BSTR error_message = AllocErrorString(IDS_NO_NETWORK);
::SHStrDupW(OLE2CW(error_message), status_text);
::SysFreeString(error_message);
*status_icon = CPSI_NONE;
*cpgsr = CPGSR_NO_CREDENTIAL_FINISHED;
LOGFN(INFO) << "No internet connection";
return S_OK;
}
// The account creation is async so we are not done yet.
*cpgsr = CPGSR_NO_CREDENTIAL_NOT_FINISHED;
......
......@@ -289,7 +289,7 @@ class GcpGaiaCredentialBaseTest : public ::testing::Test {
public:
GcpGaiaCredentialBaseTest();
HRESULT StartLogonProcess(ICredentialProviderCredential* cred);
HRESULT StartLogonProcess(ICredentialProviderCredential* cred, bool succeeds);
HRESULT WaitForLogonProcess(ICredentialProviderCredential* cred);
HRESULT StartLogonProcessAndWait(ICredentialProviderCredential* cred);
......@@ -315,7 +315,8 @@ GcpGaiaCredentialBaseTest::GcpGaiaCredentialBaseTest() {
}
HRESULT GcpGaiaCredentialBaseTest::StartLogonProcess(
ICredentialProviderCredential* cred) {
ICredentialProviderCredential* cred,
bool succeeds) {
BOOL auto_login;
EXPECT_EQ(S_OK, cred->SetSelected(&auto_login));
......@@ -327,9 +328,14 @@ HRESULT GcpGaiaCredentialBaseTest::StartLogonProcess(
CREDENTIAL_PROVIDER_STATUS_ICON status_icon;
EXPECT_EQ(S_OK,
cred->GetSerialization(&cpgsr, &cpcs, &status_text, &status_icon));
EXPECT_EQ(nullptr, status_text);
EXPECT_EQ(CPSI_NONE, status_icon);
EXPECT_EQ(CPGSR_NO_CREDENTIAL_NOT_FINISHED, cpgsr);
if (succeeds) {
EXPECT_EQ(nullptr, status_text);
EXPECT_EQ(CPGSR_NO_CREDENTIAL_NOT_FINISHED, cpgsr);
} else {
EXPECT_NE(nullptr, status_text);
EXPECT_EQ(CPGSR_NO_CREDENTIAL_FINISHED, cpgsr);
}
return S_OK;
}
......@@ -345,7 +351,7 @@ HRESULT GcpGaiaCredentialBaseTest::WaitForLogonProcess(
HRESULT GcpGaiaCredentialBaseTest::StartLogonProcessAndWait(
ICredentialProviderCredential* cred) {
EXPECT_EQ(S_OK, StartLogonProcess(cred));
EXPECT_EQ(S_OK, StartLogonProcess(cred, /*succeeds=*/true));
EXPECT_EQ(S_OK, WaitForLogonProcess(cred));
return S_OK;
}
......@@ -369,6 +375,22 @@ TEST_F(GcpGaiaCredentialBaseTest, SetSelected) {
ASSERT_FALSE(auto_login);
}
TEST_F(GcpGaiaCredentialBaseTest, GetSerialization_NoInternet) {
FakeGaiaCredentialProvider provider;
ASSERT_EQ(S_OK, provider.SetHasInternetConnection(kHicForceNo));
CComPtr<IGaiaCredential> gaia_cred;
CComPtr<ICredentialProviderCredential> cred;
ASSERT_EQ(S_OK, CreateCredentialWithProvider(&provider, &gaia_cred, &cred));
CComPtr<testing::ITestCredential> test;
ASSERT_EQ(S_OK, cred.QueryInterface(&test));
ASSERT_EQ(S_OK, StartLogonProcess(cred, /*succeeds=*/false));
ASSERT_EQ(S_OK, gaia_cred->Terminate());
}
TEST_F(GcpGaiaCredentialBaseTest, GetSerialization_Start) {
FakeGaiaCredentialProvider provider;
......@@ -440,7 +462,7 @@ TEST_F(GcpGaiaCredentialBaseTest, GetSerialization_MultipleCalls) {
ASSERT_EQ(S_OK, test->SetStartGlsEventName(kStartGlsEventName));
base::WaitableEvent start_event(std::move(start_event_handle));
ASSERT_EQ(S_OK, StartLogonProcess(cred));
ASSERT_EQ(S_OK, StartLogonProcess(cred, /*succeeds=*/true));
// Calling GetSerialization again while the credential is waiting for the
// logon process should yield CPGSR_NO_CREDENTIAL_NOT_FINISHED as a
......@@ -481,7 +503,7 @@ TEST_F(GcpGaiaCredentialBaseTest, GetSerialization_Cancel) {
ASSERT_EQ(S_OK, test->SetStartGlsEventName(kStartGlsEventName));
base::WaitableEvent start_event(std::move(start_event_handle));
ASSERT_EQ(S_OK, StartLogonProcess(cred));
ASSERT_EQ(S_OK, StartLogonProcess(cred, /*succeeds=*/true));
// Deselect the credential provider so that it cancels the GLS process and
// returns.
......
......@@ -4,6 +4,8 @@
#include "chrome/credential_provider/gaiacp/gaia_credential_provider.h"
#include <netlistmgr.h>
#include <iomanip>
#include <map>
......@@ -150,6 +152,34 @@ HRESULT CGaiaCredentialProvider::OnUserAuthenticated(IUnknown* credential,
return hr;
}
HRESULT CGaiaCredentialProvider::HasInternetConnection() {
if (has_internet_connection_ != kHicCheckAlways)
return has_internet_connection_ == kHicForceYes ? S_OK : S_FALSE;
// If any errors occur, return that internet connection is available. At
// worst the credential provider will try to connect and fail.
CComPtr<INetworkListManager> manager;
HRESULT hr = manager.CoCreateInstance(CLSID_NetworkListManager);
if (FAILED(hr)) {
LOGFN(ERROR) << "CoCreateInstance(NetworkListManager) hr=" << putHR(hr);
return S_OK;
}
VARIANT_BOOL is_connected;
hr = manager->get_IsConnectedToInternet(&is_connected);
if (FAILED(hr)) {
LOGFN(ERROR) << "manager->get_IsConnectedToInternet hr=" << putHR(hr);
return S_OK;
}
// Normally VARIANT_TRUE/VARIANT_FALSE are used with the type VARIANT_BOOL
// but in this case the docs explicitly say to use FALSE.
// https://docs.microsoft.com/en-us/windows/desktop/api/Netlistmgr/
// nf-netlistmgr-inetworklistmanager-get_isconnectedtointernet
return is_connected != FALSE ? S_OK : S_FALSE;
}
// IGaiaCredentialProviderForTesting //////////////////////////////////////////
HRESULT CGaiaCredentialProvider::SetReauthCheckDoneEvent(INT_PTR event) {
......@@ -158,6 +188,12 @@ HRESULT CGaiaCredentialProvider::SetReauthCheckDoneEvent(INT_PTR event) {
return S_OK;
}
HRESULT CGaiaCredentialProvider::SetHasInternetConnection(
HasInternetConnectionCheckType has_internet_connection) {
has_internet_connection_ = has_internet_connection;
return S_OK;
}
// ICredentialProvider ////////////////////////////////////////////////////////
HRESULT CGaiaCredentialProvider::SetUserArray(
......@@ -269,17 +305,26 @@ HRESULT CGaiaCredentialProvider::SetUserArray(
}
// Fire off a thread to check with Gaia if a re-auth is required. This
// sets the kUserNeedsReauth bit if needed.
unsigned wait_thread_id;
uintptr_t wait_thread = _beginthreadex(
nullptr, 0, CheckReauthStatus,
reinterpret_cast<void*>(reauth_check_done_event_), 0, &wait_thread_id);
if (wait_thread != 0) {
LOGFN(INFO) << "Started check re-auth thread id=" << wait_thread_id;
::CloseHandle(reinterpret_cast<HANDLE>(wait_thread));
// sets the kUserNeedsReauth bit if needed. If there is no internet
// connection, don't bother.
if (HasInternetConnection() == S_OK) {
unsigned wait_thread_id;
uintptr_t wait_thread = _beginthreadex(
nullptr, 0, CheckReauthStatus,
reinterpret_cast<void*>(reauth_check_done_event_), 0, &wait_thread_id);
if (wait_thread != 0) {
LOGFN(INFO) << "Started check re-auth thread id=" << wait_thread_id;
::CloseHandle(reinterpret_cast<HANDLE>(wait_thread));
} else {
HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
LOGFN(ERROR) << "Unable to start check re-auth thread hr=" << putHR(hr);
if (reauth_check_done_event_ != INVALID_HANDLE_VALUE)
::SetEvent(reauth_check_done_event_);
}
} else {
HRESULT hr = HRESULT_FROM_WIN32(::GetLastError());
LOGFN(ERROR) << "Unable to start check re-auth thread hr=" << putHR(hr);
LOGFN(INFO) << "No internet connection, not checking re-auth";
if (reauth_check_done_event_ != INVALID_HANDLE_VALUE)
::SetEvent(reauth_check_done_event_);
}
return S_OK;
......
......@@ -58,9 +58,12 @@ class ATL_NO_VTABLE CGaiaCredentialProvider
BSTR username,
BSTR password,
BSTR sid) override;
IFACEMETHODIMP HasInternetConnection() override;
// IGaiaCredentialProviderForTesting
IFACEMETHODIMP SetReauthCheckDoneEvent([in] INT_PTR event) override;
IFACEMETHODIMP SetReauthCheckDoneEvent(INT_PTR event) override;
IFACEMETHODIMP SetHasInternetConnection(
HasInternetConnectionCheckType has_internet_connection) override;
// ICredentialProviderSetUserArray
IFACEMETHODIMP SetUserArray(ICredentialProviderUserArray* users) override;
......@@ -100,7 +103,15 @@ class ATL_NO_VTABLE CGaiaCredentialProvider
// authentication.
size_t index_ = std::numeric_limits<size_t>::max();
// Handle to an event that is signaled once the background reauth checks
// are done. This is used only in unit tests to keep from polling or using
// a hardcoded wait.
HANDLE reauth_check_done_event_ = INVALID_HANDLE_VALUE;
// Used during tests to force the credential provider to believe if an
// internet connection is possible or not. In production the value is
// always set to HIC_CHECK_ALWAYS to perform a real check at runtime.
HasInternetConnectionCheckType has_internet_connection_ = kHicCheckAlways;
};
OBJECT_ENTRY_AUTO(__uuidof(GaiaCredentialProvider), CGaiaCredentialProvider)
......
......@@ -18,8 +18,15 @@ interface IGaiaCredentialProvider : IUnknown {
[in] BSTR username,
[in] BSTR password,
[in] BSTR sid);
HRESULT HasInternetConnection();
};
typedef enum {
kHicForceYes,
kHicForceNo,
kHicCheckAlways
} HasInternetConnectionCheckType;
[
object,
uuid(224CE2FB-2977-4585-BD46-1BAE8D7964DE),
......@@ -27,6 +34,7 @@ interface IGaiaCredentialProvider : IUnknown {
]
interface IGaiaCredentialProviderForTesting : IUnknown {
HRESULT SetReauthCheckDoneEvent([in] INT_PTR event);
HRESULT SetHasInternetConnection([in] HasInternetConnectionCheckType hic);
};
[
......
......@@ -159,7 +159,7 @@ TEST_F(GcpCredentialProviderTest, SetUserArray_NeedsReauth) {
}
TEST_F(GcpCredentialProviderTest, SetUserArray_PasswordChanged) {
// Create two GCPW users that are not marked as needing reauth.
// Create one GCPW user that is not marked as needing reauth.
CComBSTR sid1;
CreateGCPWUser(L"u1", L"p1", L"n1", L"c1", &sid1);
......@@ -204,6 +204,59 @@ TEST_F(GcpCredentialProviderTest, SetUserArray_PasswordChanged) {
ASSERT_EQ(1u, needs_reauth);
}
TEST_F(GcpCredentialProviderTest, SetUserArray_NoInternet) {
// Create two GCPW users: the first not marked as needing reauth and the
// second marked as needing reauth.
CComBSTR sid1;
CComBSTR sid2;
CreateGCPWUser(L"u1", L"p1", L"n1", L"c1", &sid1);
CreateGCPWUser(L"u2", L"p2", L"n2", L"c2", &sid2);
ASSERT_EQ(S_OK, SetUserProperty(OLE2CW(sid2), L"nr", 1));
CComPtr<ICredentialProviderSetUserArray> user_array;
ASSERT_EQ(
S_OK,
CComCreator<CComObject<CGaiaCredentialProvider>>::CreateInstance(
nullptr, IID_ICredentialProviderSetUserArray, (void**)&user_array));
base::WaitableEvent reauth_check_done_event;
CComPtr<IGaiaCredentialProviderForTesting> for_testing;
ASSERT_EQ(S_OK, user_array.QueryInterface(&for_testing));
ASSERT_EQ(S_OK,
for_testing->SetReauthCheckDoneEvent(
reinterpret_cast<INT_PTR>(reauth_check_done_event.handle())));
ASSERT_EQ(S_OK, for_testing->SetHasInternetConnection(kHicForceNo));
FakeCredentialProviderUserArray array;
array.AddUser(OLE2CW(sid1), L"u1");
array.AddUser(OLE2CW(sid2), L"u2");
ASSERT_EQ(S_OK, user_array->SetUserArray(&array));
CComPtr<ICredentialProvider> provider;
ASSERT_EQ(S_OK, user_array.QueryInterface(&provider));
// There should be 1 credential since only one account is marked above.
DWORD count;
DWORD default_index;
BOOL autologon;
ASSERT_EQ(S_OK,
provider->GetCredentialCount(&count, &default_index, &autologon));
ASSERT_EQ(1u, count);
EXPECT_EQ(CREDENTIAL_PROVIDER_NO_DEFAULT, default_index);
EXPECT_FALSE(autologon);
// There is no internet connection, so no network check can be performed.
// Account reauth status should remain the same.
reauth_check_done_event.Wait();
DWORD needs_reauth;
ASSERT_EQ(S_OK, GetUserProperty(OLE2CW(sid1), L"nr", &needs_reauth));
ASSERT_EQ(0u, needs_reauth);
ASSERT_EQ(S_OK, GetUserProperty(OLE2CW(sid2), L"nr", &needs_reauth));
ASSERT_EQ(1u, needs_reauth);
}
TEST_F(GcpCredentialProviderTest, CpusLogon) {
CComPtr<ICredentialProvider> provider;
ASSERT_EQ(S_OK,
......
......@@ -169,6 +169,9 @@
<message name="IDS_USER_ACCOUNT_COMMENT" desc="">
Google user
</message>
<message name="IDS_NO_NETWORK" desc="">
Make sure you have a network connection and try again.
</message>
</messages>
</release>
</grit>
9814ea3c11b59485bc0e2db58169495a281ed063
\ No newline at end of file
......@@ -2,8 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/credential_provider/gaiacp/stdafx.h"
#include "chrome/credential_provider/test/com_fakes.h"
#include "base/logging.h"
#include "chrome/credential_provider/gaiacp/stdafx.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace credential_provider {
......@@ -115,6 +117,24 @@ HRESULT FakeGaiaCredentialProvider::OnUserAuthenticated(IUnknown* credential,
return S_OK;
}
HRESULT FakeGaiaCredentialProvider::HasInternetConnection() {
return has_internet_connection_ == kHicForceYes ? S_OK : S_FALSE;
}
// IGaiaCredentialProviderForTesting //////////////////////////////////////////
HRESULT FakeGaiaCredentialProvider::SetReauthCheckDoneEvent(INT_PTR event) {
NOTREACHED();
return E_NOTIMPL;
}
HRESULT FakeGaiaCredentialProvider::SetHasInternetConnection(
HasInternetConnectionCheckType has_internet_connection) {
DCHECK(has_internet_connection != kHicCheckAlways);
has_internet_connection_ = has_internet_connection;
return S_OK;
}
IMPL_IUNKOWN_NOQI_NOREF(FakeGaiaCredentialProvider);
} // namespace credential_provider
......@@ -88,7 +88,8 @@ class FakeCredentialProviderEvents : public ICredentialProviderEvents {
///////////////////////////////////////////////////////////////////////////////
// Fake the GaiaCredentialProvider COM object.
class FakeGaiaCredentialProvider : public IGaiaCredentialProvider {
class FakeGaiaCredentialProvider : public IGaiaCredentialProvider,
public IGaiaCredentialProviderForTesting {
public:
FakeGaiaCredentialProvider();
virtual ~FakeGaiaCredentialProvider();
......@@ -97,7 +98,6 @@ class FakeGaiaCredentialProvider : public IGaiaCredentialProvider {
const CComBSTR& password() const { return password_; }
const CComBSTR& sid() const { return sid_; }
private:
// IGaiaCredentialProvider
IFACEMETHODIMP QueryInterface(REFIID riid, void** ppv) override;
ULONG STDMETHODCALLTYPE AddRef() override;
......@@ -106,10 +106,18 @@ class FakeGaiaCredentialProvider : public IGaiaCredentialProvider {
BSTR username,
BSTR password,
BSTR sid) override;
IFACEMETHODIMP HasInternetConnection() override;
// IGaiaCredentialProviderForTesting
IFACEMETHODIMP SetReauthCheckDoneEvent(INT_PTR event) override;
IFACEMETHODIMP SetHasInternetConnection(
HasInternetConnectionCheckType has_internet_connection) override;
private:
CComBSTR username_;
CComBSTR password_;
CComBSTR sid_;
HasInternetConnectionCheckType has_internet_connection_ = kHicForceYes;
};
} // namespace credential_provider
......
......@@ -82,7 +82,7 @@ MIDL_DEFINE_GUID(IID, IID_IReauthCredential,0xCC75BCEA,0xA636,0x4798,0xBF,0x8E,0
MIDL_DEFINE_GUID(IID, LIBID_GaiaCredentialProviderLib,0x4ADC3A52,0x8673,0x4CE3,0x81,0xF6,0x83,0x3D,0x18,0xBE,0xEB,0xA2);
MIDL_DEFINE_GUID(CLSID, CLSID_GaiaCredentialProvider,0x89adae71,0xaee5,0x4ee2,0xbf,0xfb,0xe8,0x42,0x4e,0x06,0xf5,0x19);
MIDL_DEFINE_GUID(CLSID, CLSID_GaiaCredentialProvider,0x0b5bfdf0,0x4594,0x47ac,0x94,0x0a,0xcf,0xc6,0x9a,0xbc,0x56,0x1c);
#undef MIDL_DEFINE_GUID
......
......@@ -115,6 +115,8 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
/* [in] */ BSTR password,
/* [in] */ BSTR sid) = 0;
virtual HRESULT STDMETHODCALLTYPE HasInternetConnection( void) = 0;
};
......@@ -143,6 +145,9 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
/* [in] */ BSTR password,
/* [in] */ BSTR sid);
HRESULT ( STDMETHODCALLTYPE *HasInternetConnection )(
IGaiaCredentialProvider * This);
END_INTERFACE
} IGaiaCredentialProviderVtbl;
......@@ -169,6 +174,9 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
#define IGaiaCredentialProvider_OnUserAuthenticated(This,credential,username,password,sid) \
( (This)->lpVtbl -> OnUserAuthenticated(This,credential,username,password,sid) )
#define IGaiaCredentialProvider_HasInternetConnection(This) \
( (This)->lpVtbl -> HasInternetConnection(This) )
#endif /* COBJMACROS */
......@@ -180,6 +188,22 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
#endif /* __IGaiaCredentialProvider_INTERFACE_DEFINED__ */
/* interface __MIDL_itf_gaia_credential_provider_0000_0001 */
/* [local] */
typedef /* [public][public] */
enum __MIDL___MIDL_itf_gaia_credential_provider_0000_0001_0001
{
kHicForceYes = 0,
kHicForceNo = ( kHicForceYes + 1 ) ,
kHicCheckAlways = ( kHicForceNo + 1 )
} HasInternetConnectionCheckType;
extern RPC_IF_HANDLE __MIDL_itf_gaia_credential_provider_0000_0001_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_gaia_credential_provider_0000_0001_v0_0_s_ifspec;
#ifndef __IGaiaCredentialProviderForTesting_INTERFACE_DEFINED__
#define __IGaiaCredentialProviderForTesting_INTERFACE_DEFINED__
......@@ -198,6 +222,9 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
virtual HRESULT STDMETHODCALLTYPE SetReauthCheckDoneEvent(
/* [in] */ INT_PTR event) = 0;
virtual HRESULT STDMETHODCALLTYPE SetHasInternetConnection(
/* [in] */ HasInternetConnectionCheckType hic) = 0;
};
......@@ -223,6 +250,10 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
IGaiaCredentialProviderForTesting * This,
/* [in] */ INT_PTR event);
HRESULT ( STDMETHODCALLTYPE *SetHasInternetConnection )(
IGaiaCredentialProviderForTesting * This,
/* [in] */ HasInternetConnectionCheckType hic);
END_INTERFACE
} IGaiaCredentialProviderForTestingVtbl;
......@@ -249,6 +280,9 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
#define IGaiaCredentialProviderForTesting_SetReauthCheckDoneEvent(This,event) \
( (This)->lpVtbl -> SetReauthCheckDoneEvent(This,event) )
#define IGaiaCredentialProviderForTesting_SetHasInternetConnection(This,hic) \
( (This)->lpVtbl -> SetHasInternetConnection(This,hic) )
#endif /* COBJMACROS */
......@@ -490,7 +524,7 @@ EXTERN_C const CLSID CLSID_GaiaCredentialProvider;
#ifdef __cplusplus
class DECLSPEC_UUID("89adae71-aee5-4ee2-bffb-e8424e06f519")
class DECLSPEC_UUID("0b5bfdf0-4594-47ac-940a-cfc69abc561c")
GaiaCredentialProvider;
#endif
#endif /* __GaiaCredentialProviderLib_LIBRARY_DEFINED__ */
......
......@@ -82,7 +82,7 @@ MIDL_DEFINE_GUID(IID, IID_IReauthCredential,0xCC75BCEA,0xA636,0x4798,0xBF,0x8E,0
MIDL_DEFINE_GUID(IID, LIBID_GaiaCredentialProviderLib,0x4ADC3A52,0x8673,0x4CE3,0x81,0xF6,0x83,0x3D,0x18,0xBE,0xEB,0xA2);
MIDL_DEFINE_GUID(CLSID, CLSID_GaiaCredentialProvider,0x89adae71,0xaee5,0x4ee2,0xbf,0xfb,0xe8,0x42,0x4e,0x06,0xf5,0x19);
MIDL_DEFINE_GUID(CLSID, CLSID_GaiaCredentialProvider,0x0b5bfdf0,0x4594,0x47ac,0x94,0x0a,0xcf,0xc6,0x9a,0xbc,0x56,0x1c);
#undef MIDL_DEFINE_GUID
......
......@@ -115,6 +115,8 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
/* [in] */ BSTR password,
/* [in] */ BSTR sid) = 0;
virtual HRESULT STDMETHODCALLTYPE HasInternetConnection( void) = 0;
};
......@@ -143,6 +145,9 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
/* [in] */ BSTR password,
/* [in] */ BSTR sid);
HRESULT ( STDMETHODCALLTYPE *HasInternetConnection )(
IGaiaCredentialProvider * This);
END_INTERFACE
} IGaiaCredentialProviderVtbl;
......@@ -169,6 +174,9 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
#define IGaiaCredentialProvider_OnUserAuthenticated(This,credential,username,password,sid) \
( (This)->lpVtbl -> OnUserAuthenticated(This,credential,username,password,sid) )
#define IGaiaCredentialProvider_HasInternetConnection(This) \
( (This)->lpVtbl -> HasInternetConnection(This) )
#endif /* COBJMACROS */
......@@ -180,6 +188,22 @@ EXTERN_C const IID IID_IGaiaCredentialProvider;
#endif /* __IGaiaCredentialProvider_INTERFACE_DEFINED__ */
/* interface __MIDL_itf_gaia_credential_provider_0000_0001 */
/* [local] */
typedef /* [public][public] */
enum __MIDL___MIDL_itf_gaia_credential_provider_0000_0001_0001
{
kHicForceYes = 0,
kHicForceNo = ( kHicForceYes + 1 ) ,
kHicCheckAlways = ( kHicForceNo + 1 )
} HasInternetConnectionCheckType;
extern RPC_IF_HANDLE __MIDL_itf_gaia_credential_provider_0000_0001_v0_0_c_ifspec;
extern RPC_IF_HANDLE __MIDL_itf_gaia_credential_provider_0000_0001_v0_0_s_ifspec;
#ifndef __IGaiaCredentialProviderForTesting_INTERFACE_DEFINED__
#define __IGaiaCredentialProviderForTesting_INTERFACE_DEFINED__
......@@ -198,6 +222,9 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
virtual HRESULT STDMETHODCALLTYPE SetReauthCheckDoneEvent(
/* [in] */ INT_PTR event) = 0;
virtual HRESULT STDMETHODCALLTYPE SetHasInternetConnection(
/* [in] */ HasInternetConnectionCheckType hic) = 0;
};
......@@ -223,6 +250,10 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
IGaiaCredentialProviderForTesting * This,
/* [in] */ INT_PTR event);
HRESULT ( STDMETHODCALLTYPE *SetHasInternetConnection )(
IGaiaCredentialProviderForTesting * This,
/* [in] */ HasInternetConnectionCheckType hic);
END_INTERFACE
} IGaiaCredentialProviderForTestingVtbl;
......@@ -249,6 +280,9 @@ EXTERN_C const IID IID_IGaiaCredentialProviderForTesting;
#define IGaiaCredentialProviderForTesting_SetReauthCheckDoneEvent(This,event) \
( (This)->lpVtbl -> SetReauthCheckDoneEvent(This,event) )
#define IGaiaCredentialProviderForTesting_SetHasInternetConnection(This,hic) \
( (This)->lpVtbl -> SetHasInternetConnection(This,hic) )
#endif /* COBJMACROS */
......@@ -490,7 +524,7 @@ EXTERN_C const CLSID CLSID_GaiaCredentialProvider;
#ifdef __cplusplus
class DECLSPEC_UUID("89adae71-aee5-4ee2-bffb-e8424e06f519")
class DECLSPEC_UUID("0b5bfdf0-4594-47ac-940a-cfc69abc561c")
GaiaCredentialProvider;
#endif
#endif /* __GaiaCredentialProviderLib_LIBRARY_DEFINED__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment