Commit b6a3c9f3 authored by Mikel Astiz's avatar Mikel Astiz Committed by Commit Bot

Enforce lower-case use of GUIDs for sync

base::GenerateGUID() produces lower-case GUIDs and they should get
exposed to the sync protocol exclusively in this canonical form to avoid
running into issues.

This patch replaces all occurrences in sync codebase with:
git grep -l 'IsValidGUID' -- components/sync* | \
  xargs sed -i 's/IsValidGUID/IsValidGUIDOutputString/g'

In addition, the implicit GUIDs used for bookmark sync, in particular
for permanent nodes, are updated to adopt lower-case GUIDs. These are
never committed to the server so there are no backward-compatibility
considerations.

Change-Id: I0d0468f3475e1a27a161e2af15853c757f53e201
Bug: 978430
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2054154Reviewed-by: default avatarMarc Treib <treib@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Mikel Astiz <mastiz@chromium.org>
Cr-Commit-Position: refs/heads/master@{#741381}
parent f4416f6a
...@@ -48,15 +48,15 @@ std::string PermanentNodeTypeToGuid(BookmarkNode::Type type) { ...@@ -48,15 +48,15 @@ std::string PermanentNodeTypeToGuid(BookmarkNode::Type type) {
// static // static
const int64_t BookmarkNode::kInvalidSyncTransactionVersion = -1; const int64_t BookmarkNode::kInvalidSyncTransactionVersion = -1;
const char BookmarkNode::kRootNodeGuid[] = const char BookmarkNode::kRootNodeGuid[] =
"00000000-0000-4000-A000-000000000001"; "00000000-0000-4000-a000-000000000001";
const char BookmarkNode::kBookmarkBarNodeGuid[] = const char BookmarkNode::kBookmarkBarNodeGuid[] =
"00000000-0000-4000-A000-000000000002"; "00000000-0000-4000-a000-000000000002";
const char BookmarkNode::kOtherBookmarksNodeGuid[] = const char BookmarkNode::kOtherBookmarksNodeGuid[] =
"00000000-0000-4000-A000-000000000003"; "00000000-0000-4000-a000-000000000003";
const char BookmarkNode::kMobileBookmarksNodeGuid[] = const char BookmarkNode::kMobileBookmarksNodeGuid[] =
"00000000-0000-4000-A000-000000000004"; "00000000-0000-4000-a000-000000000004";
const char BookmarkNode::kManagedNodeGuid[] = const char BookmarkNode::kManagedNodeGuid[] =
"00000000-0000-4000-A000-000000000005"; "00000000-0000-4000-a000-000000000005";
std::string BookmarkNode::RootNodeGuid() { std::string BookmarkNode::RootNodeGuid() {
return BookmarkNode::kRootNodeGuid; return BookmarkNode::kRootNodeGuid;
......
...@@ -89,7 +89,7 @@ std::string ComputeGuidFromBytes(base::span<const uint8_t> bytes) { ...@@ -89,7 +89,7 @@ std::string ComputeGuidFromBytes(base::span<const uint8_t> bytes) {
std::string InferGuidForLegacyBookmark( std::string InferGuidForLegacyBookmark(
const std::string& originator_cache_guid, const std::string& originator_cache_guid,
const std::string& originator_client_item_id) { const std::string& originator_client_item_id) {
DCHECK(!base::IsValidGUID(originator_client_item_id)); DCHECK(!base::IsValidGUIDOutputString(originator_client_item_id));
const std::string unique_tag = const std::string unique_tag =
base::StrCat({originator_cache_guid, originator_client_item_id}); base::StrCat({originator_cache_guid, originator_client_item_id});
...@@ -99,7 +99,7 @@ std::string InferGuidForLegacyBookmark( ...@@ -99,7 +99,7 @@ std::string InferGuidForLegacyBookmark(
static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer GUID"); static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer GUID");
const std::string guid = ComputeGuidFromBytes(base::make_span(hash)); const std::string guid = ComputeGuidFromBytes(base::make_span(hash));
DCHECK(base::IsValidGUID(guid)); DCHECK(base::IsValidGUIDOutputString(guid));
return guid; return guid;
} }
...@@ -196,7 +196,8 @@ void AdaptGuidForBookmark(const sync_pb::SyncEntity& update_entity, ...@@ -196,7 +196,8 @@ void AdaptGuidForBookmark(const sync_pb::SyncEntity& update_entity,
// Otherwise, we leave the field empty. // Otherwise, we leave the field empty.
if (specifics->bookmark().has_guid()) { if (specifics->bookmark().has_guid()) {
LogGuidSource(BookmarkGuidSource::kSpecifics); LogGuidSource(BookmarkGuidSource::kSpecifics);
} else if (base::IsValidGUID(update_entity.originator_client_item_id())) { } else if (base::IsValidGUIDOutputString(
update_entity.originator_client_item_id())) {
specifics->mutable_bookmark()->set_guid( specifics->mutable_bookmark()->set_guid(
update_entity.originator_client_item_id()); update_entity.originator_client_item_id());
LogGuidSource(BookmarkGuidSource::kValidOCII); LogGuidSource(BookmarkGuidSource::kValidOCII);
......
...@@ -572,7 +572,8 @@ void ModelTypeWorker::DeduplicatePendingUpdatesBasedOnOriginatorClientItemId() { ...@@ -572,7 +572,8 @@ void ModelTypeWorker::DeduplicatePendingUpdatesBasedOnOriginatorClientItemId() {
// without deduplication, which is the case for all datatypes except // without deduplication, which is the case for all datatypes except
// bookmarks, as well as bookmarks created before 2015, when the item ID was // bookmarks, as well as bookmarks created before 2015, when the item ID was
// not globally unique across clients. // not globally unique across clients.
if (!base::IsValidGUID(candidate.entity.originator_client_item_id)) { if (!base::IsValidGUIDOutputString(
candidate.entity.originator_client_item_id)) {
pending_updates_.push_back(std::move(candidate)); pending_updates_.push_back(std::move(candidate));
continue; continue;
} }
......
...@@ -203,7 +203,7 @@ void BookmarkModelMerger::RemoteTreeNode::EmplaceSelfAndDescendantsByGUID( ...@@ -203,7 +203,7 @@ void BookmarkModelMerger::RemoteTreeNode::EmplaceSelfAndDescendantsByGUID(
if (entity().server_defined_unique_tag.empty()) { if (entity().server_defined_unique_tag.empty()) {
const std::string& guid = entity().specifics.bookmark().guid(); const std::string& guid = entity().specifics.bookmark().guid();
DCHECK(base::IsValidGUID(guid)); DCHECK(base::IsValidGUIDOutputString(guid));
// Duplicate GUIDs have been sorted out before. // Duplicate GUIDs have been sorted out before.
bool success = guid_to_remote_node_map->emplace(guid, this).second; bool success = guid_to_remote_node_map->emplace(guid, this).second;
...@@ -358,7 +358,7 @@ BookmarkModelMerger::FindGuidMatchesOrReassignLocal( ...@@ -358,7 +358,7 @@ BookmarkModelMerger::FindGuidMatchesOrReassignLocal(
bookmark_model->root_node()); bookmark_model->root_node());
while (iterator.has_next()) { while (iterator.has_next()) {
const bookmarks::BookmarkNode* const node = iterator.Next(); const bookmarks::BookmarkNode* const node = iterator.Next();
DCHECK(base::IsValidGUID(node->guid())); DCHECK(base::IsValidGUIDOutputString(node->guid()));
const auto remote_it = guid_to_remote_node_map.find(node->guid()); const auto remote_it = guid_to_remote_node_map.find(node->guid());
if (remote_it == guid_to_remote_node_map.end()) { if (remote_it == guid_to_remote_node_map.end()) {
...@@ -598,7 +598,7 @@ void BookmarkModelMerger::ProcessLocalCreation( ...@@ -598,7 +598,7 @@ void BookmarkModelMerger::ProcessLocalCreation(
// server id upon receiving commit response. // server id upon receiving commit response.
const bookmarks::BookmarkNode* node = parent->children()[index].get(); const bookmarks::BookmarkNode* node = parent->children()[index].get();
DCHECK(!FindMatchingRemoteNodeByGUID(node)); DCHECK(!FindMatchingRemoteNodeByGUID(node));
DCHECK(base::IsValidGUID(node->guid())); DCHECK(base::IsValidGUIDOutputString(node->guid()));
// The node's GUID cannot run into collisions because // The node's GUID cannot run into collisions because
// FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if // FindGuidMatchesOrReassignLocal() takes care of reassigning local GUIDs if
......
...@@ -1061,7 +1061,8 @@ TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingURLs) { ...@@ -1061,7 +1061,8 @@ TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingURLs) {
EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid); EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid);
EXPECT_EQ(bookmark_bar_node->children()[0]->url(), kUrl2); EXPECT_EQ(bookmark_bar_node->children()[0]->url(), kUrl2);
EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid); EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid);
EXPECT_TRUE(base::IsValidGUID(bookmark_bar_node->children()[1]->guid())); EXPECT_TRUE(
base::IsValidGUIDOutputString(bookmark_bar_node->children()[1]->guid()));
EXPECT_EQ(bookmark_bar_node->children()[1]->url(), kUrl1); EXPECT_EQ(bookmark_bar_node->children()[1]->url(), kUrl1);
} }
...@@ -1113,7 +1114,8 @@ TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingTypes) { ...@@ -1113,7 +1114,8 @@ TEST(BookmarkModelMergerTest, ShouldReplaceBookmarkGUIDWithConflictingTypes) {
EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid); EXPECT_EQ(bookmark_bar_node->children()[0]->guid(), kGuid);
EXPECT_TRUE(bookmark_bar_node->children()[0]->is_folder()); EXPECT_TRUE(bookmark_bar_node->children()[0]->is_folder());
EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid); EXPECT_NE(bookmark_bar_node->children()[1]->guid(), kGuid);
EXPECT_TRUE(base::IsValidGUID(bookmark_bar_node->children()[1]->guid())); EXPECT_TRUE(
base::IsValidGUIDOutputString(bookmark_bar_node->children()[1]->guid()));
EXPECT_FALSE(bookmark_bar_node->children()[1]->is_folder()); EXPECT_FALSE(bookmark_bar_node->children()[1]->is_folder());
} }
......
...@@ -95,7 +95,7 @@ void BookmarkModelObserverImpl::BookmarkNodeAdded( ...@@ -95,7 +95,7 @@ void BookmarkModelObserverImpl::BookmarkNodeAdded(
// https://cs.chromium.org/chromium/src/components/sync/syncable/mutable_entry.cc?l=237&gsn=CreateEntryKernel // https://cs.chromium.org/chromium/src/components/sync/syncable/mutable_entry.cc?l=237&gsn=CreateEntryKernel
// Assign a temp server id for the entity. Will be overriden by the actual // Assign a temp server id for the entity. Will be overriden by the actual
// server id upon receiving commit response. // server id upon receiving commit response.
DCHECK(base::IsValidGUID(node->guid())); DCHECK(base::IsValidGUIDOutputString(node->guid()));
// Local bookmark creations should have used a random GUID so it's safe to // Local bookmark creations should have used a random GUID so it's safe to
// use it as originator client item ID, without the risk for collision. // use it as originator client item ID, without the risk for collision.
......
...@@ -135,7 +135,8 @@ void ApplyRemoteUpdate( ...@@ -135,7 +135,8 @@ void ApplyRemoteUpdate(
// replace the entire node in order to use it, as GUIDs are immutable. Further // replace the entire node in order to use it, as GUIDs are immutable. Further
// updates are then applied to the new node instead. // updates are then applied to the new node instead.
if (update_entity.specifics.bookmark().guid() != node->guid() && if (update_entity.specifics.bookmark().guid() != node->guid() &&
base::IsValidGUID(update_entity.specifics.bookmark().guid())) { base::IsValidGUIDOutputString(
update_entity.specifics.bookmark().guid())) {
const bookmarks::BookmarkNode* old_node = node; const bookmarks::BookmarkNode* old_node = node;
node = ReplaceBookmarkNodeGUID( node = ReplaceBookmarkNodeGUID(
node, update_entity.specifics.bookmark().guid(), model); node, update_entity.specifics.bookmark().guid(), model);
...@@ -233,7 +234,7 @@ void BookmarkRemoteUpdatesHandler::Process( ...@@ -233,7 +234,7 @@ void BookmarkRemoteUpdatesHandler::Process(
if (tracked_entity && !update_entity.is_deleted() && if (tracked_entity && !update_entity.is_deleted() &&
update_entity.server_defined_unique_tag.empty() && update_entity.server_defined_unique_tag.empty() &&
!tracked_entity->final_guid_matches(remote_guid)) { !tracked_entity->final_guid_matches(remote_guid)) {
DCHECK(base::IsValidGUID(remote_guid)); DCHECK(base::IsValidGUIDOutputString(remote_guid));
bookmark_tracker_->PopulateFinalGuid(update_entity.id, remote_guid); bookmark_tracker_->PopulateFinalGuid(update_entity.id, remote_guid);
// In many cases final_guid_matches() may return false because a final // In many cases final_guid_matches() may return false because a final
// GUID is not known for sure, but actually it matches the local GUID. // GUID is not known for sure, but actually it matches the local GUID.
......
...@@ -165,7 +165,7 @@ std::string ComputeGuidFromBytes(base::span<const uint8_t> bytes) { ...@@ -165,7 +165,7 @@ std::string ComputeGuidFromBytes(base::span<const uint8_t> bytes) {
std::string InferGuidForLegacyBookmark( std::string InferGuidForLegacyBookmark(
const std::string& originator_cache_guid, const std::string& originator_cache_guid,
const std::string& originator_client_item_id) { const std::string& originator_client_item_id) {
DCHECK(!base::IsValidGUID(originator_client_item_id)); DCHECK(!base::IsValidGUIDOutputString(originator_client_item_id));
const std::string unique_tag = const std::string unique_tag =
base::StrCat({originator_cache_guid, originator_client_item_id}); base::StrCat({originator_cache_guid, originator_client_item_id});
...@@ -175,7 +175,7 @@ std::string InferGuidForLegacyBookmark( ...@@ -175,7 +175,7 @@ std::string InferGuidForLegacyBookmark(
static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer GUID"); static_assert(base::kSHA1Length >= 16, "16 bytes needed to infer GUID");
const std::string guid = ComputeGuidFromBytes(base::make_span(hash)); const std::string guid = ComputeGuidFromBytes(base::make_span(hash));
DCHECK(base::IsValidGUID(guid)); DCHECK(base::IsValidGUIDOutputString(guid));
return guid; return guid;
} }
...@@ -193,7 +193,8 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode( ...@@ -193,7 +193,8 @@ sync_pb::EntitySpecifics CreateSpecificsFromBookmarkNode(
} }
DCHECK(!node->guid().empty()); DCHECK(!node->guid().empty());
DCHECK(base::IsValidGUID(node->guid())) << "Actual: " << node->guid(); DCHECK(base::IsValidGUIDOutputString(node->guid()))
<< "Actual: " << node->guid();
if (include_guid) { if (include_guid) {
bm_specifics->set_guid(node->guid()); bm_specifics->set_guid(node->guid());
...@@ -247,7 +248,7 @@ const bookmarks::BookmarkNode* CreateBookmarkNodeFromSpecifics( ...@@ -247,7 +248,7 @@ const bookmarks::BookmarkNode* CreateBookmarkNodeFromSpecifics(
DCHECK(parent); DCHECK(parent);
DCHECK(model); DCHECK(model);
DCHECK(favicon_service); DCHECK(favicon_service);
DCHECK(base::IsValidGUID(specifics.guid())); DCHECK(base::IsValidGUIDOutputString(specifics.guid()));
bookmarks::BookmarkNode::MetaInfoMap metainfo = bookmarks::BookmarkNode::MetaInfoMap metainfo =
GetBookmarkMetaInfo(specifics); GetBookmarkMetaInfo(specifics);
...@@ -284,7 +285,7 @@ void UpdateBookmarkNodeFromSpecifics( ...@@ -284,7 +285,7 @@ void UpdateBookmarkNodeFromSpecifics(
// resolving any conflict in GUID. Either GUIDs are the same, or the GUID in // resolving any conflict in GUID. Either GUIDs are the same, or the GUID in
// specifics is invalid, and hence we can ignore it. // specifics is invalid, and hence we can ignore it.
DCHECK(specifics.guid() == node->guid() || DCHECK(specifics.guid() == node->guid() ||
!base::IsValidGUID(specifics.guid()) || !base::IsValidGUIDOutputString(specifics.guid()) ||
!base::FeatureList::IsEnabled( !base::FeatureList::IsEnabled(
switches::kUpdateBookmarkGUIDWithNodeReplacement)); switches::kUpdateBookmarkGUIDWithNodeReplacement));
...@@ -308,7 +309,7 @@ const bookmarks::BookmarkNode* ReplaceBookmarkNodeGUID( ...@@ -308,7 +309,7 @@ const bookmarks::BookmarkNode* ReplaceBookmarkNodeGUID(
return node; return node;
} }
const bookmarks::BookmarkNode* new_node; const bookmarks::BookmarkNode* new_node;
DCHECK(base::IsValidGUID(guid)); DCHECK(base::IsValidGUIDOutputString(guid));
if (node->guid() == guid) { if (node->guid() == guid) {
// Nothing to do. // Nothing to do.
...@@ -340,7 +341,7 @@ bool IsValidBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics, ...@@ -340,7 +341,7 @@ bool IsValidBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics,
LogInvalidSpecifics(InvalidBookmarkSpecificsError::kEmptySpecifics); LogInvalidSpecifics(InvalidBookmarkSpecificsError::kEmptySpecifics);
is_valid = false; is_valid = false;
} }
if (!base::IsValidGUID(specifics.guid())) { if (!base::IsValidGUIDOutputString(specifics.guid())) {
DLOG(ERROR) << "Invalid bookmark: invalid GUID in the specifics."; DLOG(ERROR) << "Invalid bookmark: invalid GUID in the specifics.";
LogInvalidSpecifics(InvalidBookmarkSpecificsError::kInvalidGUID); LogInvalidSpecifics(InvalidBookmarkSpecificsError::kInvalidGUID);
is_valid = false; is_valid = false;
...@@ -382,7 +383,7 @@ bool IsValidBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics, ...@@ -382,7 +383,7 @@ bool IsValidBookmarkSpecifics(const sync_pb::BookmarkSpecifics& specifics,
bool HasExpectedBookmarkGuid(const sync_pb::BookmarkSpecifics& specifics, bool HasExpectedBookmarkGuid(const sync_pb::BookmarkSpecifics& specifics,
const std::string& originator_cache_guid, const std::string& originator_cache_guid,
const std::string& originator_client_item_id) { const std::string& originator_client_item_id) {
DCHECK(base::IsValidGUID(specifics.guid())); DCHECK(base::IsValidGUIDOutputString(specifics.guid()));
if (originator_client_item_id.empty()) { if (originator_client_item_id.empty()) {
// This could be a future bookmark with a client tag instead of an // This could be a future bookmark with a client tag instead of an
...@@ -391,7 +392,7 @@ bool HasExpectedBookmarkGuid(const sync_pb::BookmarkSpecifics& specifics, ...@@ -391,7 +392,7 @@ bool HasExpectedBookmarkGuid(const sync_pb::BookmarkSpecifics& specifics,
return true; return true;
} }
if (base::IsValidGUID(originator_client_item_id)) { if (base::IsValidGUIDOutputString(originator_client_item_id)) {
return specifics.guid() == originator_client_item_id; return specifics.guid() == originator_client_item_id;
} }
......
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