From e7df98e1cc1b5fa6062460794e9222ad8e232b7a Mon Sep 17 00:00:00 2001 From: Benny Franco Date: Tue, 17 Aug 2021 16:52:34 -0700 Subject: [PATCH 1/5] Update to v142 --- .../FBWinStoreCppTests.vcxproj | 16 ++++++++-------- .../FBWinStoreCsTests/FBWinStoreCsTests.csproj | 14 +++++++++++--- .../winsdkfb_uwp/FBWinStoreCsTests/project.json | 17 ----------------- .../winsdkfb_uwp/winsdkfb_uwp.vcxproj | 16 ++++++++-------- 4 files changed, 27 insertions(+), 36 deletions(-) delete mode 100644 winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj b/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj index 40948e7..0854acc 100644 --- a/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj +++ b/winsdkfb/winsdkfb_uwp/FBWinStoreCppTests/FBWinStoreCppTests.vcxproj @@ -7,8 +7,8 @@ 14.0 true Windows Store - 10.0.10240.0 - 10.0.10240.0 + 10.0 + 10.0.19041.0 10.0 14.0 true @@ -43,37 +43,37 @@ Application true - v140 + v142 Application true - v140 + v142 Application true - v140 + v142 Application false true - v140 + v142 true Application false true - v140 + v142 true Application false true - v140 + v142 true diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj index 14aef32..7c9d638 100644 --- a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj +++ b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/FBWinStoreCsTests.csproj @@ -11,8 +11,8 @@ FBWinStoreCsTests en-US UAP - 10.0.10240.0 - 10.0.10240.0 + 10.0.17763.0 + 10.0.17763.0 14 512 {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -23,6 +23,7 @@ x86|x64|arm Never F4E6BFEE8265BFC1A3B4A18D7F46397C6891526C + win10-arm;win10-arm-aot;win10-x86;win10-x86-aot;win10-x64;win10-x64-aot true @@ -104,7 +105,6 @@ winsdkfb_testing_key.pfx - @@ -222,6 +222,14 @@ winsdkfb + + + 5.0.0 + + + 7.0.1 + + 14.0 diff --git a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json b/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json deleted file mode 100644 index f93afb3..0000000 --- a/winsdkfb/winsdkfb_uwp/FBWinStoreCsTests/project.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "dependencies": { - "Microsoft.NETCore.UniversalWindowsPlatform": "5.0.0", - "Newtonsoft.Json": "7.0.1" - }, - "frameworks": { - "uap10.0": {} - }, - "runtimes": { - "win10-arm": {}, - "win10-arm-aot": {}, - "win10-x86": {}, - "win10-x86-aot": {}, - "win10-x64": {}, - "win10-x64-aot": {} - } -} \ No newline at end of file diff --git a/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj b/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj index 6ee2d9f..55ac3df 100644 --- a/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj +++ b/winsdkfb/winsdkfb_uwp/winsdkfb_uwp/winsdkfb_uwp.vcxproj @@ -42,42 +42,42 @@ true Windows Store 8.2 - 10.0.14393.0 - 10.0.10240.0 + 10.0 + 10.0.19041.0 DynamicLibrary true - v140 + v142 DynamicLibrary true - v140 + v142 DynamicLibrary true - v140 + v142 DynamicLibrary false true - v140 + v142 DynamicLibrary false true - v140 + v142 DynamicLibrary false true - v140 + v142 From 00e882d02083d230b4f88032ece68032b6e509ce Mon Sep 17 00:00:00 2001 From: Benny Franco Date: Tue, 17 Aug 2021 19:12:18 -0700 Subject: [PATCH 2/5] Fix parsing issue --- samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp b/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp index 2c48e00..71395e1 100644 --- a/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp +++ b/samples/LoginCpp-UWP/LoginCpp/Common/SuspensionManager.cpp @@ -468,7 +468,7 @@ Object^ ObjectSerializeHelper::ReadObject(DataReader^ reader) case StreamTypes::BooleanType: return reader->ReadBoolean(); case StreamTypes::Char16Type: - return (char16_t) reader->ReadUInt16(); + return (wchar_t) reader->ReadUInt16(); case StreamTypes::GuidType: return reader->ReadGuid(); case StreamTypes::StringType: From b5f29b6a929f9cbfd6af38ebf559cecc5328c4da Mon Sep 17 00:00:00 2001 From: Benny Franco Date: Tue, 17 Aug 2021 19:15:30 -0700 Subject: [PATCH 3/5] Add gaming graph support, use api 11.0 --- .../winsdkfb/winsdkfb.Shared/FBConstants.h | 2 ++ .../FacebookAccessTokenData.cpp | 10 ++++++++++ .../winsdkfb.Shared/FacebookAccessTokenData.h | 9 +++++++++ .../winsdkfb.Shared/FacebookClient.cpp | 15 ++++++++++++++- .../winsdkfb.Shared/FacebookSession.cpp | 19 ++++++++++++++----- .../winsdkfb.Shared/GraphUriBuilder.cpp | 11 ++++++++++- .../winsdkfb.Shared/GraphUriBuilder.h | 2 +- 7 files changed, 60 insertions(+), 8 deletions(-) diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h b/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h index 63d1105..e84edf4 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FBConstants.h @@ -19,6 +19,8 @@ #define FACEBOOK_DESKTOP_SERVER_NAME L"https://www.facebook.com" #define FACEBOOK_MOBILE_SERVER_NAME L"https://m.facebook.com" #define FACEBOOK_LOGIN_SUCCESS_PATH L"/connect/login_success.html" +#define FACEBOOK_API_8_OR_ABOVE 1 + // Define the base version of the SDK. // Keep in sync with winsdkfb\build\nuget\VERSION diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp index dc2cfef..b099130 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.cpp @@ -47,6 +47,9 @@ FBAccessTokenData::FBAccessTokenData( #ifdef _DEBUG DebugPrintExpirationTime(); #endif + + std::wstring wsAccessToken(AccessToken->Data()); + _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook"; } FBAccessTokenData::FBAccessTokenData( @@ -64,6 +67,8 @@ FBAccessTokenData::FBAccessTokenData( Vector^ v = ref new Vector(0); _grantedPermissions = ref new FBPermissions(v->GetView()); _declinedPermissions = ref new FBPermissions(v->GetView()); + std::wstring wsAccessToken(AccessToken->Data()); + _graphDomain = (wsAccessToken.substr(0, 2) == L"GG") ? L"gaming" : L"facebook"; } String^ FBAccessTokenData::AccessToken::get() @@ -71,6 +76,11 @@ String^ FBAccessTokenData::AccessToken::get() return _accessToken; } +String^ FBAccessTokenData::GraphDomain::get() +{ + return _graphDomain; +} + DateTime FBAccessTokenData::ExpirationDate::get() { return _expirationDate; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h index 3df957d..adeb5a9 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookAccessTokenData.h @@ -50,6 +50,14 @@ namespace winsdkfb Platform::String^ get(); } + /** + * Graph domain should be used for current access token. + */ + property Platform::String^ GraphDomain + { + Platform::String^ get(); + } + /** * Expiration date of the access token. */ @@ -119,6 +127,7 @@ namespace winsdkfb #endif Platform::String^ _accessToken; + Platform::String^ _graphDomain; Windows::Foundation::DateTime _expirationDate; FBPermissions^ _grantedPermissions; FBPermissions^ _declinedPermissions; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp index 8d12db0..83a06af 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookClient.cpp @@ -398,8 +398,8 @@ Uri^ FBClient::PrepareRequestUri( PropertySet^ parameters ) { + String^ graphDomain = L"facebook"; FBSession^ sess = FBSession::ActiveSession; - GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path); if (parameters == nullptr) { @@ -427,11 +427,24 @@ Uri^ FBClient::PrepareRequestUri( sess->AccessTokenData->AccessToken); } + // For applications using Facebook Login for Gaming, graph API requests + // should be sent to different graph domain: graph.fb.gg + if (parametersWithoutMediaObjects->HasKey("access_token")) + { + String^ accessToken = safe_cast(parametersWithoutMediaObjects->Lookup("access_token")); + std::wstring wsAccessToken(accessToken->Data()); + if ((wsAccessToken.substr(0, 2) == L"GG")) + { + graphDomain = L"gaming"; + } + } + if (parametersWithoutMediaObjects->HasKey("format")) { parametersWithoutMediaObjects->Insert("format", "json-strings"); } + GraphUriBuilder^ uriBuilder = ref new GraphUriBuilder(path, graphDomain); SerializeParameters(parametersWithoutMediaObjects); // Add remaining parameters to query string. Note that parameters that diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp index fe30e62..ec5ea0d 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/FacebookSession.cpp @@ -98,8 +98,8 @@ FBSession::FBSession() : { login_evt = CreateEventEx(NULL, NULL, 0, DELETE | SYNCHRONIZE); } - _APIMajorVersion = 2; - _APIMinorVersion = 6; + _APIMajorVersion = 11; + _APIMinorVersion = 0; #if WINAPI_FAMILY==WINAPI_FAMILY_PHONE_APP _webViewRedirectDomain = FACEBOOK_MOBILE_SERVER_NAME; #else @@ -209,8 +209,15 @@ task FBSession::GetUserInfo( ) { PropertySet^ parameters = ref new PropertySet(); - parameters->Insert(L"fields", - L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture"); + if (TokenData->GraphDomain == L"gaming") + { + parameters->Insert(L"fields", L"link,email,name,id,picture"); + } + else + { + parameters->Insert(L"fields", + L"gender,link,first_name,last_name,locale,timezone,email,updated_time,verified,name,id,picture"); + } FBSingleValue^ value = ref new FBSingleValue( "/me", parameters, @@ -1326,7 +1333,9 @@ int FBSession::APIMinorVersion::get() void FBSession::SaveGrantedPermissions() { auto values =FBSession::DataContainer->Values; - values->Insert(GRANTED_PERMISSIONS_KEY, AccessTokenData->GrantedPermissions->ToString()); + if (AccessTokenData->GrantedPermissions != nullptr) { + values->Insert(GRANTED_PERMISSIONS_KEY, this->_AccessTokenData->GrantedPermissions->ToString()); + } } String^ FBSession::GetGrantedPermissions() diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp index 0b17f0b..95fad53 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.cpp @@ -27,11 +27,13 @@ using namespace Windows::Foundation::Collections; using namespace winsdkfb; -GraphUriBuilder::GraphUriBuilder(String^ path) +GraphUriBuilder::GraphUriBuilder(String^ path, String^ graphDomain) : _queryParams { ref new PropertySet() } { Uri^ testUri; + // New api returns partial URL, and needs to be builded after this block +#if !FACEBOOK_API_8_OR_ABOVE bool buildDomain = false; try { @@ -41,10 +43,17 @@ GraphUriBuilder::GraphUriBuilder(String^ path) { buildDomain = true; } +#else + bool buildDomain = true; +#endif if (buildDomain) { String^ domain = L"https://graph.facebook.com/"; + if (graphDomain == L"gaming") + { + domain = L"https://graph.fb.gg/"; + } testUri = ref new Uri(domain + path); } _host = testUri->Host; diff --git a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h index 18971c5..7904f3e 100644 --- a/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h +++ b/winsdkfb/winsdkfb/winsdkfb.Shared/GraphUriBuilder.h @@ -23,7 +23,7 @@ namespace winsdkfb public ref class GraphUriBuilder sealed { public: - GraphUriBuilder(Platform::String^ path); + GraphUriBuilder(Platform::String^ path, Platform::String^ graphDomain); Windows::Foundation::Uri^ MakeUri(); void AddQueryParam(Platform::String^ query, Platform::String^ param); From 16724db3a576ef10be545553cfb783460058fe1f Mon Sep 17 00:00:00 2001 From: Benny Franco Date: Tue, 17 Aug 2021 19:17:58 -0700 Subject: [PATCH 4/5] Update UWP sample --- samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj | 16 ++++++++-------- samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp | 6 ++---- samples/LoginCpp-UWP/LoginCpp/Resources.resw | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj b/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj index 4573f19..beb9db6 100644 --- a/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj +++ b/samples/LoginCpp-UWP/LoginCpp/LoginCpp.vcxproj @@ -8,8 +8,8 @@ true Windows Store 8.2 - 10.0.10240.0 - 10.0.10240.0 + 10.0 + 10.0.19041.0 @@ -41,35 +41,35 @@ Application true - v140 + v142 Application true - v140 + v142 Application true - v140 + v142 Application false true - v140 + v142 Application false true - v140 + v142 Application false true - v140 + v142 diff --git a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp index 239fb1d..369f5aa 100644 --- a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp +++ b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp @@ -54,10 +54,8 @@ using namespace Windows::Globalization::DateTimeFormatting; const wchar_t* requested_permissions[] = { - L"public_profile", + L"public_profile", // Whis works for both kind of API's L"user_friends", - L"user_likes", - L"user_location" }; MainPage::MainPage() @@ -105,7 +103,7 @@ BOOL MainPage::DidGetAllRequestedPermissions( BOOL success = FALSE; FBAccessTokenData^ data = FBSession::ActiveSession->AccessTokenData; - if (data) + if (data && data->DeclinedPermissions) { success = !data->DeclinedPermissions->Values->Size; } diff --git a/samples/LoginCpp-UWP/LoginCpp/Resources.resw b/samples/LoginCpp-UWP/LoginCpp/Resources.resw index 83ee551..f851f8c 100644 --- a/samples/LoginCpp-UWP/LoginCpp/Resources.resw +++ b/samples/LoginCpp-UWP/LoginCpp/Resources.resw @@ -118,11 +118,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 1606735379540755 + 1025365401567256 Facebook Application ID - s-1-15-2-908073630-820309149-3659463426-2390003274-961246107-3746849113-484503760 + s-1-15-2-3089487911-215249050-3399914704-2991134715-266043697-3786854407-3873117276 Facebook "Windows Store ID" - the SID for the app (from a call to WebAuthenticationBroker::GetCurrentApplicationCallbackUri From 647744243002feed1c45109dc9a9ced1acbf0141 Mon Sep 17 00:00:00 2001 From: Benny Franco Date: Wed, 18 Aug 2021 10:55:18 -0700 Subject: [PATCH 5/5] Expand permission explanation --- samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp index 369f5aa..fca3f3d 100644 --- a/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp +++ b/samples/LoginCpp-UWP/LoginCpp/MainPage.xaml.cpp @@ -52,9 +52,18 @@ using namespace Windows::Globalization::DateTimeFormatting; #define FBStoreAppIDName L"FBWindowsAppId" #define PermissionGranted L"granted" +/// +/// This array is used to ask for this specific permissions +/// public_profile permission works for graph and gaming graph api, but +/// Facebook suggest the use of gaming_profile if you call to gaming graph +/// specifically. +/// user_friends retrive friends and require an special request to Facebook team +/// if you enable gaming graph +/// const wchar_t* requested_permissions[] = { - L"public_profile", // Whis works for both kind of API's + L"public_profile", + L"email", L"user_friends", };