// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
syntax = "proto2";
option java_multiple_files = true;
option java_package = "org.chromium.components.sync.protocol";
option optimize_for = LITE_RUNTIME;
package sync_pb;
import "components/sync/protocol/deletion_origin.proto";
import "components/sync/protocol/entity_specifics.proto";
import "components/sync/protocol/unique_position.proto";
message SyncEntity {
// This item's identifier. In a commit of a new item, this will be a
// client-generated ID. If the commit succeeds, the server will generate
// a globally unique ID and return it to the committing client in the
// CommitResponse.EntryResponse. In the context of a GetUpdatesResponse,
// |id_string| is always the server generated ID. The original
// client-generated ID is preserved in the |originator_client_id| field.
// Present in both GetUpdatesResponse and CommitMessage.
// Prior to M123, this field was empty for commit-only types.
optional string id_string = 1;
// An id referencing this item's parent in the hierarchy. In a
// CommitMessage, it is accepted for this to be a client-generated temporary
// ID if there was a new created item with that ID appearing earlier
// in the message. In all other situations, it is a server ID.
// Present in both GetUpdatesResponse and CommitMessage.
//
// Starting with M99, this field is optional and used for legacy bookmarks
// only:
// 1. When processing GetUpdatesResponse, it is unused for modern data created
// or reuploaded by M94 or above, which populates the parent's GUID in
// BookmarkSpecifics (which is sufficient).
// 2. When issuing CommitMessage, the field is populated for compatibility
// with clients before M99.
optional string parent_id_string = 2;
reserved 3;
reserved "old_parent_id";
// The version of this item -- a monotonically increasing value that is
// maintained by for each item. If zero in a CommitMessage, the server
// will interpret this entity as a newly-created item and generate a
// new server ID and an initial version number. If nonzero in a
// CommitMessage, this item is treated as an update to an existing item, and
// the server will use |id_string| to locate the item. Then, if the item's
// current version on the server does not match |version|, the commit will
// fail for that item. The server will not update it, and will return
// a result code of CONFLICT. In a GetUpdatesResponse, |version| is
// always positive and indentifies the revision of the item data being sent
// to the client.
// Present in both GetUpdatesResponse and CommitMessage.
// WARNING: This field used to be required before M60. Any client before this
// will fail to deserialize if this field is missing.
optional int64 version = 4;
// Last modification time, in milliseconds since Unix epoch.
// Present in both GetUpdatesResponse and CommitMessage.
optional int64 mtime = 5;
// Creation time, in milliseconds since Unix epoch.
// Present in both GetUpdatesResponse and CommitMessage.
optional int64 ctime = 6;
// The name of this item.
// Historical note:
// Since November 2010, this value is no different from non_unique_name.
// Before then, server implementations would maintain a unique-within-parent
// value separate from its base, "non-unique" value. Clients had not
// depended on the uniqueness of the property since November 2009; it was
// removed from Chromium by http://codereview.chromium.org/371029 .
// Present in both GetUpdatesResponse and CommitMessage.
// WARNING: This field used to be required before M60. Any client before this
// will fail to deserialize if this field is missing.
optional string name = 7;
// The name of this item. Same as |name|.
// |non_unique_name| should take precedence over the |name| value if both
// are supplied. For efficiency, clients and servers should avoid setting
// this redundant value.
// Present in both GetUpdatesResponse and CommitMessage.
optional string non_unique_name = 8;
reserved 9;
reserved "sync_timestamp";
// If present, this tag identifies this item as being a uniquely
// instanced item. The server ensures that there is never more
// than one entity in a user's store with the same tag value.
// This value is used to identify and find e.g. the "Bookmark Bar" folder
// without relying on a particular ID or name.
//
// This variant of the tag is created by the server, so clients can't create
// an item with a tag using this field.
//
// Use client_tag_hash if you want to create one from the client.
//
// An item can't have both a client_tag_hash and
// a server_defined_unique_tag.
//
// Present only in GetUpdatesResponse.
optional string server_defined_unique_tag = 10;
reserved 11;
reserved "BookmarkData";
reserved 12;
reserved "bookmark_folder";
reserved 13;
reserved "bookmark_url";
reserved 14;
reserved "bookmark_favicon";
// Ancient fields, predecessors for |unique_position|, deprecated with M26 and
// still supported to deal with old incoming data. See field |unique_position|
// for details as well as the data-upgrading implementation in
// GetUniquePositionFromSyncEntity().
optional int64 position_in_parent = 15 [deprecated = true];
optional string insert_after_item_id = 16 [deprecated = true];
reserved 17;
reserved "extended_attributes";
// If true, indicates that this item has been (or should be) deleted.
// Present in both GetUpdatesResponse and CommitMessage.
optional bool deleted = 18 [default = false];
// A unique ID that identifies the the sync client who initially committed
// this entity. This value corresponds to |cache_guid| in CommitMessage.
// This field, along with |originator_client_item_id|, can be used to
// reunite the original with its official committed version in the case
// where a client does not receive or process the commit response for
// some reason.
//
// Present only in GetUpdatesResponse.
//
// This field is also used in determining the unique identifier used in
// bookmarks' unique_position field.
optional string originator_cache_guid = 19;
// Item ID as generated by the client that initially created this entity. Used
// exclusively for bookmarks (other datatypes use client_tag_hash).
// There are three generation of bookmarks that have populated this field
// differently, depending on which version of the browser created the
// bookmark:
// 1. For bookmarks created before M44 (2015), the field got populated with an
// ID that is locally unique, but not globally unique (usually a negative
// number).
// 2. For bookmarks created between M45 and M51, both inclusive, the field got
// populated with a globally unique GUID in uppercase form.
// 3. For bookmarks created with M52 or above, the field gets populated with
// a globally unique GUID in lowercase form.
//
// Present only in GetUpdatesResponse.
optional string originator_client_item_id = 20;
// Extensible container for datatype-specific data.
// This became available in version 23 of the protocol.
optional EntitySpecifics specifics = 21;
// Indicate whether this is a folder or not. Available in version 23+.
optional bool folder = 22 [default = false];
// A client defined unique hash for this entity.
// Analogous to server_defined_unique_tag, but allows the client to determine
// an immutable attribute of the entity in hashed form that makes it unique
// per user (i.e. at most one entity may exist per client tag hash).
//
// This value must be of the form base64(SHA1(client_tag)) where the
// client_tag is a value derived from the contents of an entity in a
// type-specific way. Since the hashed contents of the client_tag are exposed
// to the server via this field, take care when defining it that there is
// enough entropy to mask any secrets that the server shouldn't learn.
//
// The difference between server_defined_unique_tag and
// client_tag_hash is the creator of the entity. Server defined
// tags are entities created by the server at account creation,
// while client defined tags are entities created by the client at any time.
//
// During GetUpdates, a sync entity update will come back with ONE of:
// a) Originator item and cache id - for bookmarks created using old versions
// of the browser (latest M93, before https://crrev.com/c/2945119).
// b) Server tag - If server committed the item as unique
// c) Client tag - If client committed the item as unique
//
// May be present in CommitMessages for the initial creation of an entity.
// If present in Commit updates for the entity, it will be ignored.
//
// May be returned in GetUpdatesMessage and sent up in CommitMessage.
optional string client_tag_hash = 23;
// Field 23 was previously named client_defined_unique_tag, avoid reuse.
reserved "client_defined_unique_tag";
reserved 24;
reserved "ordinal_in_parent";
// Introduced in M26, represents ordering among entities, in practice used for
// bookmarks only. Clients should not assume it is always populated in
// GetUpdatesMessage due to the following caveats:
// 1. Tombstones and permanent folders do not populate it (ordering is
// irrelevant).
// 2. It may remain unset by future versions of the client, as long as the
// field with the same name is populated inside BookmarkSpecifics. M94 and
// above populate both for backward compatibility reasons, but when support
// for M93 is retired, modern clients at the time may stop populating this
// field.
// 3. Very old data (last committed by M25 or below, before the field was
// introduced) does not include this field, and in that case the legacy
// fields |position_in_parent| or |insert_after_item_id| must be honored
// instead.
//
// May be returned in GetUpdatesMessage and sent up in CommitMessage.
optional UniquePosition unique_position = 25;
// This used to be a list of sync attachment IDs, but it was never launched
// and the code has been removed as of M66.
reserved 26;
reserved "attachment_id";
// Metadata used for shared data types. Must not be present for regular data
// types.
// Introduced in M124.
message CollaborationMetadata {
// Collaboration ID which the current entity belongs to.
optional string collaboration_id = 1;
// Stores information about the creation and modification of a shared data
// type.
message AttributionMetadata {
// Details about a single attribution event (creation or modification).
message Attribution {
// Information about who the change should be attributed to.
message AttributionUserInfo {
// The obfuscated GAIA ID of the user.
optional string gaia_id = 1;
}
// Information about the user.
optional AttributionUserInfo user_info = 1;
}
// Information about when the specifics was created.
optional Attribution created = 1;
// Information about when the specifics was last updated.
optional Attribution updated = 2;
}
// Stores information who created or updated the entity.
optional AttributionMetadata attribution_metadata = 2;
}
optional CollaborationMetadata collaboration = 27;
// Optionally present in CommitMessage for committed deletions (but may remain
// unset if the origin is unspecified), it represents which piece of code
// triggered a deletion. It is a debug-only field with no compatibility
// guarantees, subject to change over time. The main purpose is to help with
// investigating and mitigating user reports or incidents that cause data
// deletion. Introduced in M126.
optional DeletionOrigin deletion_origin = 28;
}