Skip to content

Commit 2841ab6

Browse files
markchandlera-maurice
markchandler
authored andcommitted
Firebase cpp: Fixed bug where provider list on desktop is not restored properly
PiperOrigin-RevId: 270731024
1 parent 94be934 commit 2841ab6

File tree

2 files changed

+65
-2
lines changed

2 files changed

+65
-2
lines changed

auth/src/desktop/user_data.fbs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,27 @@
1717
// The namespace is defined to match the internal package.
1818
namespace firebase.auth;
1919

20+
// Data table that describes other providers for the user data
21+
table UserProviderData {
22+
// The user's ID, unique to the Firebase project.
23+
uid:string;
24+
25+
// The associated email, if any.
26+
email:string;
27+
28+
// The display name, if any.
29+
display_name:string;
30+
31+
// Associated photo url, if any.
32+
photo_url:string;
33+
34+
// A provider ID for the user e.g. "Facebook".
35+
provider_id:string;
36+
37+
// The user's phone number, if any.
38+
phone_number:string;
39+
}
40+
2041
// LINT.IfChange
2142
// Data table that maps UserData struct in user_desktop.h
2243
table UserDataDesktop {
@@ -64,6 +85,9 @@ table UserDataDesktop {
6485

6586
// The Firebase user creation UTC timestamp in milliseconds.
6687
creation_timestamp:ulong;
88+
89+
// other providers for current user
90+
provider_data:[UserProviderData];
6791
}
6892
// LINT.ThenChange(//depot_firebase_cpp/auth/client/cpp/src/desktop/user_desktop.h)
6993

auth/src/desktop/user_desktop.cc

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,26 @@ void AssignLoadedData(const Future<std::string>& future, AuthData* auth_data) {
485485
loaded_user.last_sign_in_timestamp = userData->last_sign_in_timestamp();
486486
loaded_user.creation_timestamp = userData->creation_timestamp();
487487

488-
UserView::ResetUser(auth_data, loaded_user);
488+
std::vector<UserInfoImpl> loaded_provider_data;
489+
const auto& provider_data = userData->provider_data();
490+
if (provider_data) {
491+
for (size_t i = 0; i < provider_data->size(); ++i) {
492+
auto providerData = provider_data->Get(i);
493+
494+
UserInfoImpl loaded_user_info;
495+
loaded_user_info.uid = providerData->uid()->c_str();
496+
loaded_user_info.email = providerData->email()->c_str();
497+
loaded_user_info.display_name = providerData->display_name()->c_str();
498+
loaded_user_info.photo_url = providerData->photo_url()->c_str();
499+
loaded_user_info.provider_id = providerData->provider_id()->c_str();
500+
loaded_user_info.phone_number = providerData->phone_number()->c_str();
501+
502+
loaded_provider_data.push_back(loaded_user_info);
503+
}
504+
}
505+
506+
auto writer = UserView::ResetUser(auth_data, loaded_user);
507+
writer.ResetUserInfos(loaded_provider_data);
489508
}
490509

491510
void HandleLoadedData(const Future<std::string>& future, void* auth_data) {
@@ -534,6 +553,26 @@ Future<void> UserDataPersist::SaveUserData(AuthData* auth_data) {
534553
// Build up a serialized buffer algorithmically:
535554
flatbuffers::FlatBufferBuilder builder;
536555

556+
const auto& user_infos = user.GetUserInfos();
557+
558+
auto create_callback = [&builder, &user_infos](size_t index){
559+
const auto& user_info = user_infos[index];
560+
561+
auto uid = builder.CreateString(user_info->uid());
562+
auto email = builder.CreateString(user_info->email());
563+
auto display_name = builder.CreateString(user_info->display_name());
564+
auto photo_url = builder.CreateString(user_info->photo_url());
565+
auto provider_id = builder.CreateString(user_info->provider_id());
566+
auto phone_number = builder.CreateString(user_info->phone_number());
567+
568+
return CreateUserProviderData(
569+
builder, uid, email, display_name, photo_url, provider_id, phone_number);
570+
};
571+
572+
auto provider_data_list =
573+
builder.CreateVector<flatbuffers::Offset<UserProviderData>>(
574+
user_infos.size(), create_callback);
575+
537576
// Compile data using schema
538577
auto uid = builder.CreateString(user->uid);
539578
auto email = builder.CreateString(user->email);
@@ -551,7 +590,7 @@ Future<void> UserDataPersist::SaveUserData(AuthData* auth_data) {
551590
user->is_anonymous, user->is_email_verified, id_token, refresh_token,
552591
access_token, user->access_token_expiration_date,
553592
user->has_email_password_credential, user->last_sign_in_timestamp,
554-
user->creation_timestamp);
593+
user->creation_timestamp, provider_data_list);
555594
builder.Finish(desktop);
556595

557596
std::string save_string;

0 commit comments

Comments
 (0)