Port Brave Sync server to Rust
Use SQLite for persistence and generate Rust protobuf bindings at build time. Add Docker image support for containerized deployment. Co-Authored-By: codex <[email protected]>
This commit is contained in:
commit
28826af88d
93 files changed
+11666
No files matched your search
@@ -0,0 +1,505 @@
|
||||
// Copyright 2012 The Chromium Authors
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
//
|
||||
// Sync protocol for communication between sync client and server.
|
||||
|
||||
// If you change or add any fields in this file, update proto_visitors.h and
|
||||
// potentially proto_enum_conversions.{h, cc}. If you add new Specifics proto,
|
||||
// also update proto_value_conversions.{h, cc}.
|
||||
|
||||
syntax = "proto2";
|
||||
|
||||
option go_package = "./sync_pb";
|
||||
|
||||
option java_multiple_files = true;
|
||||
option java_package = "org.chromium.components.sync.protocol";
|
||||
|
||||
option optimize_for = LITE_RUNTIME;
|
||||
|
||||
package sync_pb;
|
||||
|
||||
import "client_commands.proto";
|
||||
import "client_debug_info.proto";
|
||||
import "data_type_progress_marker.proto";
|
||||
import "get_updates_caller_info.proto";
|
||||
import "password_sharing_invitation_specifics.proto";
|
||||
import "sync_entity.proto";
|
||||
import "sync_enums.proto";
|
||||
import "sharing_message_specifics.proto";
|
||||
|
||||
// This message contains diagnostic information used to correlate
|
||||
// commit-related traffic with extensions-related mutations to the
|
||||
// data models in chromium. It plays no functional role in
|
||||
// processing this CommitMessage.
|
||||
message ChromiumExtensionsActivity {
|
||||
// The human-readable ID identifying the extension responsible
|
||||
// for the traffic reported in this ChromiumExtensionsActivity.
|
||||
optional string extension_id = 1;
|
||||
|
||||
// How many times the extension successfully invoked a write
|
||||
// operation through the bookmarks API since the last CommitMessage.
|
||||
optional uint32 bookmark_writes_since_last_commit = 2;
|
||||
}
|
||||
|
||||
// Client specific configuration information.
|
||||
message ClientConfigParams {
|
||||
// The set of data types this client has enabled. Note that this does not
|
||||
// include proxy types, as they do not have protocol field numbers and are
|
||||
// placeholder types that implicitly enable protocol types.
|
||||
repeated int32 enabled_type_ids = 1;
|
||||
|
||||
// Whether the PROXY_TABS proxy datatype is enabled on this client.
|
||||
// Deprecated and not populated anymore since M120.
|
||||
optional bool tabs_datatype_enabled = 2 [deprecated = true];
|
||||
|
||||
// Whether the account(s) present in the content area's cookie jar match the
|
||||
// chrome account. If multiple accounts are present in the cookie jar, a
|
||||
// mismatch implies all of them are different from the chrome account.
|
||||
optional bool cookie_jar_mismatch = 3;
|
||||
|
||||
// Indicates that the client is not aware of any other active clients
|
||||
// interested in the committed data types. This flag shows that it is not
|
||||
// necessary to send invalidations for the committed data. A client is
|
||||
// considered active if it's DeviceInfo has updated recent enough. This flag
|
||||
// does not take into account whether standalone invalidations are enabled (as
|
||||
// opposed to |single_client_with_standalone_invalidations|). However, it's
|
||||
// set depending on interested data types of other devices, e.g. if there are
|
||||
// other devices but they are not interested in SESSION data type, and current
|
||||
// commit request contains only SESSION, it will be set to true.
|
||||
// Introduced in M88.
|
||||
optional bool single_client = 4;
|
||||
|
||||
// A list of FCM registration tokens which are obtained from other clients.
|
||||
// This list is used by the server to send invalidations to all other clients.
|
||||
// If the list is empty, the server should treat this as "there is no
|
||||
// information about other clients". In practice, this happens by the next
|
||||
// causes:
|
||||
// 1. This is the old client which doesn't set this field.
|
||||
// 2. There are too many active devices and the list would have too many
|
||||
// items.
|
||||
// 3. An empty list could also mean that the current client is the only
|
||||
// client. This case should be covered by the
|
||||
// |single_client_with_standalone_invalidations| field instead (otherwise it
|
||||
// could be mixed up with older clients). The server doesn't have to use this
|
||||
// field and can ignore it. Note that this list does not take into account
|
||||
// interested data types from the other clients.
|
||||
// Introduced in M89.
|
||||
repeated string devices_fcm_registration_tokens = 5;
|
||||
|
||||
// Similar to |single_client| but takes into account only clients with enabled
|
||||
// sync standalone invalidations. When set to true, there are no other clients
|
||||
// with sync standalone invalidations interested in the committing types and
|
||||
// hence it's not necessary to send out standalone invalidations (it may still
|
||||
// be necessary to send out invalidations using the legacy system, see
|
||||
// |single_client| instead).
|
||||
// Introduced in M105.
|
||||
optional bool single_client_with_standalone_invalidations = 6;
|
||||
|
||||
// Similar to |devices_fcm_registration_tokens| but takes into account clients
|
||||
// which are subscribed to the data types which are committed in current
|
||||
// commit request.
|
||||
// A list of FCM registration tokens which are obtained from other clients.
|
||||
// This list is used by the server to send invalidations to all other clients.
|
||||
// If the list is empty, the server should treat this as "there is no
|
||||
// information about other clients". In practice, this happens by the next
|
||||
// causes:
|
||||
// 1. This is the old client which doesn't set this field.
|
||||
// 2. There are too many active devices and the list would have too many
|
||||
// items.
|
||||
// 3. An empty list could also mean that the current client is the only
|
||||
// client. This case should be covered by the
|
||||
// |single_client_with_standalone_invalidations| field instead (otherwise it
|
||||
// could be mixed up with older clients). The server doesn't have to use this
|
||||
// field and can ignore it.
|
||||
// Introduced in M105.
|
||||
repeated string fcm_registration_tokens_for_interested_clients = 7;
|
||||
|
||||
// Similar to |single_client| but takes into account only clients which are
|
||||
// subscribed to old invalidations (i.e. not subscribed to sync standalone
|
||||
// invalidations). When set to true, there are no other clients subscribed to
|
||||
// old invalidations. Note that opposed to |single_client|, this flag does not
|
||||
// always take into account the list of interested data types (because
|
||||
// interested data types were introduced in M89). When the list is empty, a
|
||||
// client is considered to be subscribed to all data types. Note that "single
|
||||
// client" is a bit misleading since this will also be true if there are no
|
||||
// clients with old invalidations at all.
|
||||
// Introduced in M110.
|
||||
optional bool single_client_with_old_invalidations = 8;
|
||||
}
|
||||
|
||||
message CommitMessage {
|
||||
repeated SyncEntity entries = 1;
|
||||
|
||||
// A GUID that identifies the committing sync client. This value will be
|
||||
// returned as originator_cache_guid for any new items.
|
||||
optional string cache_guid = 2;
|
||||
|
||||
repeated ChromiumExtensionsActivity extensions_activity = 3;
|
||||
|
||||
// The configuration of this client at commit time. Used by the server to
|
||||
// make commit-time decisions about how to process datatypes that might
|
||||
// involve server-side interaction, and e.g require explicit user intent for
|
||||
// syncing a particular data type regardless of whether a commit for that
|
||||
// datatype is currently being sent up.
|
||||
optional ClientConfigParams config_params = 4;
|
||||
|
||||
// Set of optional per-client datatype contexts.
|
||||
repeated DataTypeContext client_contexts = 5;
|
||||
|
||||
// This field need to be 256 bytes if set. This attempts to mitigate CRIME
|
||||
// attacks when sync communicate from client to server with compression. So if
|
||||
// compression is used, this need to set a 256 random ASCII bytes. If no
|
||||
// compression, this field should not be set. The server can ignore the
|
||||
// padding.
|
||||
optional string padding = 6;
|
||||
}
|
||||
|
||||
message GetUpdatesMessage {
|
||||
// Indicates the reason for the GetUpdatesMessage.
|
||||
// This was *mostly* deprecated in M29. GetUpdatesOrigin is the new way to
|
||||
// encode the reason for the GetUpdates request, but some parts of the server
|
||||
// still rely on this field. It also still contains the
|
||||
// "notifications_enabled" flag which needs to be moved elsewhere before this
|
||||
// can be fully removed. See https://crbug.com/510165.
|
||||
optional GetUpdatesCallerInfo caller_info = 2;
|
||||
|
||||
// Indicates whether related folders should be fetched.
|
||||
optional bool fetch_folders = 3 [default = true];
|
||||
|
||||
// Per-datatype progress marker.
|
||||
//
|
||||
// With the exception of certain configuration or initial sync requests, the
|
||||
// client should include one instance of this field for each enabled data
|
||||
// type.
|
||||
repeated DataTypeProgressMarker from_progress_marker = 6;
|
||||
|
||||
// Indicates whether the response should be sent in chunks. This may be
|
||||
// needed for devices with limited memory resources. If true, the response
|
||||
// will include one or more ClientToServerResponses, with the first one
|
||||
// containing GetUpdatesMetadataResponse, and the remaining ones, if any,
|
||||
// containing GetUpdatesStreamingResponse. These ClientToServerResponses are
|
||||
// delimited by a length prefix, which is encoded as a varint.
|
||||
optional bool streaming = 7 [default = false];
|
||||
|
||||
// Whether the client needs the server to provide an encryption key for this
|
||||
// account.
|
||||
// Note: this should typically only be set on the first GetUpdates a client
|
||||
// requests. Clients are expected to persist the encryption key from then on.
|
||||
// The allowed frequency for requesting encryption keys is much lower than
|
||||
// other datatypes, so repeated usage will likely result in throttling.
|
||||
optional bool need_encryption_key = 8 [default = false];
|
||||
|
||||
// This value is an updated version of the GetUpdatesCallerInfo's
|
||||
// GetUpdatesSource. It describes the reason for the GetUpdate request.
|
||||
// Introduced in M29.
|
||||
optional SyncEnums.GetUpdatesOrigin get_updates_origin = 9;
|
||||
|
||||
// Whether this GU also serves as a retry GU. Any GU that happens after
|
||||
// retry timer timeout is a retry GU effectively.
|
||||
optional bool is_retry = 10 [default = false];
|
||||
|
||||
// Set of optional per-client datatype contexts.
|
||||
repeated DataTypeContext client_contexts = 11;
|
||||
|
||||
reserved 1;
|
||||
reserved "from_timestamp";
|
||||
reserved 4;
|
||||
reserved "requested_types";
|
||||
reserved 5;
|
||||
reserved "batch_size";
|
||||
reserved 1000;
|
||||
reserved "create_mobile_bookmarks_folder";
|
||||
}
|
||||
|
||||
// Message from a client asking the server to clear its data. This causes the
|
||||
// server to generate a new store birthday, which allows dealing reliably with
|
||||
// in-flight requests (in particular commits) from other clients.
|
||||
message ClearServerDataMessage {
|
||||
// No arguments needed as the store birthday and user identifier are part of
|
||||
// an enclosing message.
|
||||
}
|
||||
|
||||
// Response to a ClearServerData request.
|
||||
message ClearServerDataResponse {
|
||||
// No result fields necessary. Success/failure is indicated in
|
||||
// ClientToServerResponse.
|
||||
}
|
||||
|
||||
// The client must preserve, store, and resend the chip bag with
|
||||
// every request. The server depends on the chip bag in order
|
||||
// to precisely choreograph a client-server state machines.
|
||||
//
|
||||
// Because the client stores and sends this data on every request,
|
||||
// the contents of the chip bag should be kept relatively small.
|
||||
//
|
||||
// If the server does not return a chip bag, the client must assume
|
||||
// that there has been no change to the chip bag. The client must
|
||||
// resend the bag of chips it had prior on the next request.
|
||||
//
|
||||
// The client must make the chip bag durable if and only if it
|
||||
// processes the response from the server.
|
||||
message ChipBag {
|
||||
// Server chips are deliberately oqaque, allowing the server
|
||||
// to encapsulate its state machine logic.
|
||||
optional bytes server_chips = 1;
|
||||
}
|
||||
|
||||
// Information about the syncer's state.
|
||||
message ClientStatus {
|
||||
// Flag to indicate if the client has detected hierarchy conflcits. The flag
|
||||
// is left unset if update application has not been attempted yet.
|
||||
//
|
||||
// The server should attempt to resolve any hierarchy conflicts when this flag
|
||||
// is set. The client may not assume that any particular action will be
|
||||
// taken. There is no guarantee the problem will be addressed in a reasonable
|
||||
// amount of time.
|
||||
// TODO(crbug.com/1315573): Deprecated in M103.
|
||||
optional bool hierarchy_conflict_detected = 1 [deprecated = true];
|
||||
|
||||
// Whether the client has full sync (or, sync the feature) enabled or not.
|
||||
optional bool is_sync_feature_enabled = 2;
|
||||
}
|
||||
|
||||
message ClientToServerMessage {
|
||||
// |share| field is only used on the server for logging and can sometimes
|
||||
// contain empty string. It is still useful for logging username when it can't
|
||||
// be derived from access token in case of auth error.
|
||||
required string share = 1;
|
||||
|
||||
optional int32 protocol_version = 2 [default = 99];
|
||||
enum Contents {
|
||||
COMMIT = 1;
|
||||
GET_UPDATES = 2;
|
||||
DEPRECATED_3 = 3;
|
||||
DEPRECATED_4 = 4;
|
||||
CLEAR_SERVER_DATA = 5;
|
||||
}
|
||||
|
||||
// Each ClientToServerMessage contains one request defined by the
|
||||
// message_contents. Each type has a corresponding message field that will be
|
||||
// present iff the message is of that type. E.g. a commit message will have a
|
||||
// message_contents of COMMIT and its commit field will be present.
|
||||
required Contents message_contents = 3;
|
||||
optional CommitMessage commit = 4;
|
||||
optional GetUpdatesMessage get_updates = 5;
|
||||
reserved 6;
|
||||
reserved "authenticate";
|
||||
|
||||
// Opaque server-provided ID representing an "epoch" of the server-side data.
|
||||
// Clients must hand this opaque ID back to the server as part of all requests
|
||||
// within the same sync session (i.e. for all requests to the server except
|
||||
// the very first GetUpdates request). See analogous field
|
||||
// ClientToServerResponse.store_birthday for more details about its lifetime.
|
||||
optional string store_birthday = 7;
|
||||
|
||||
reserved 8;
|
||||
reserved "sync_problem_detected";
|
||||
reserved 9;
|
||||
|
||||
// Client side state information for debugging purpose.
|
||||
// This is only sent on the first getupdates of every sync cycle,
|
||||
// as an optimization to save bandwidth.
|
||||
optional DebugInfo debug_info = 10;
|
||||
|
||||
// Per-client state for use by the server. Sent with every message sent to the
|
||||
// server.
|
||||
optional ChipBag bag_of_chips = 11;
|
||||
|
||||
// Google API key.
|
||||
optional string api_key = 12;
|
||||
|
||||
// Client's self-reported state.
|
||||
// The client should set this on every message sent to the server, though its
|
||||
// member fields may often be unset.
|
||||
optional ClientStatus client_status = 13;
|
||||
|
||||
// The ID that our invalidation client used to identify itself to the server.
|
||||
// Sending the ID here allows the server to not send notifications of our own
|
||||
// changes to our invalidator.
|
||||
// The field was deprecated in M117 and is no longer populated.
|
||||
optional string invalidator_client_id = 14 [deprecated = true];
|
||||
|
||||
// Identifies this ClientToServerMessage as a clear server data request. This
|
||||
// field is present when message_contents is CLEAR_SERVER_DATA.
|
||||
optional ClearServerDataMessage clear_server_data = 15;
|
||||
}
|
||||
|
||||
message CommitResponse {
|
||||
enum ResponseType {
|
||||
SUCCESS = 1;
|
||||
CONFLICT = 2; // You're out of date; update and check your data
|
||||
// TODO(ncarter): What's the difference between RETRY and TRANSIENT_ERROR?
|
||||
RETRY = 3; // Someone has a conflicting, non-expired session open
|
||||
INVALID_MESSAGE = 4; // What the client sent was invalid, and trying again
|
||||
// won't help.
|
||||
OVER_QUOTA = 5; // This operation would put you, or you are, over quota
|
||||
TRANSIENT_ERROR = 6; // Something went wrong; try again in a bit
|
||||
}
|
||||
repeated group EntryResponse = 1 {
|
||||
required ResponseType response_type = 2;
|
||||
|
||||
// Sync servers may also return a new ID for an existing item, indicating
|
||||
// a new entry's been created to hold the data the client's sending up.
|
||||
optional string id_string = 3;
|
||||
|
||||
reserved 4;
|
||||
reserved "parent_id_string";
|
||||
|
||||
reserved 5;
|
||||
reserved "position_in_parent";
|
||||
|
||||
// The item's current version.
|
||||
optional int64 version = 6;
|
||||
|
||||
reserved 7;
|
||||
reserved "name";
|
||||
|
||||
reserved 8;
|
||||
reserved "non_unique_name";
|
||||
|
||||
optional string error_message = 9;
|
||||
|
||||
// Last modification time (in milliseconds since Unix epoch). Allows the
|
||||
// server to override the client-supplied mtime during a commit operation.
|
||||
// TODO(crbug.com/1182252): Delete this field too.
|
||||
optional int64 mtime = 10 [deprecated = true];
|
||||
|
||||
message DatatypeSpecificError {
|
||||
oneof datatype_error {
|
||||
SharingMessageCommitError sharing_message_error = 1;
|
||||
OutgoingPasswordSharingInvitationCommitError
|
||||
outgoing_password_sharing_invitation_error = 2;
|
||||
}
|
||||
}
|
||||
// Datatype specific error (if any).
|
||||
optional DatatypeSpecificError datatype_specific_error = 11;
|
||||
}
|
||||
}
|
||||
|
||||
message GetUpdatesResponse {
|
||||
// New sync entries that the client should apply.
|
||||
repeated SyncEntity entries = 1;
|
||||
|
||||
reserved 2;
|
||||
reserved "new_timestamp";
|
||||
|
||||
reserved 3;
|
||||
reserved "newest_timestamp";
|
||||
|
||||
// Approximate count of changes remaining - use this for UI feedback.
|
||||
// If present and zero, this estimate is firm: the server has no changes
|
||||
// after the current batch.
|
||||
optional int64 changes_remaining = 4;
|
||||
|
||||
// Opaque, per-datatype timestamp-like tokens. Clients should retain and
|
||||
// persist the values returned in this field, and present them back to the
|
||||
// server to indicate the starting point for future update requests.
|
||||
//
|
||||
// This will be sent only if the client provided |from_progress_marker|
|
||||
// in the update request.
|
||||
//
|
||||
// The server may provide a new progress marker even if this is the end of
|
||||
// the batch, or if there were no new updates on the server; and the client
|
||||
// must save these. If the server does not provide a |new_progress_marker|
|
||||
// value for a particular datatype, when the request provided a
|
||||
// |from_progress_marker| value for that datatype, the client should
|
||||
// interpret this to mean "no change from the previous state" and retain its
|
||||
// previous progress-marker value for that datatype.
|
||||
repeated DataTypeProgressMarker new_progress_marker = 5;
|
||||
|
||||
// The current encryption keys associated with this account. Will be set if
|
||||
// the GetUpdatesMessage in the request had need_encryption_key == true or
|
||||
// the server has updated the set of encryption keys (e.g. due to a key
|
||||
// rotation).
|
||||
repeated bytes encryption_keys = 6;
|
||||
|
||||
// Set of optional datatype contexts server mutations.
|
||||
repeated DataTypeContext context_mutations = 7;
|
||||
}
|
||||
|
||||
message ClientToServerResponse {
|
||||
optional CommitResponse commit = 1;
|
||||
optional GetUpdatesResponse get_updates = 2;
|
||||
reserved 3;
|
||||
reserved "authenticate";
|
||||
|
||||
// Up until protocol_version 24, the default was SUCCESS which made it
|
||||
// impossible to add new enum values since older clients would parse any
|
||||
// out-of-range value as SUCCESS. Starting with 25, unless explicitly set,
|
||||
// the error_code will be UNKNOWN so that clients know when they're
|
||||
// out-of-date. Note also that when using protocol_version < 25,
|
||||
// TRANSIENT_ERROR is not supported. Instead, the server sends back a HTTP
|
||||
// 400 error code. This is deprecated now.
|
||||
optional SyncEnums.ErrorType error_code = 4 [default = UNKNOWN];
|
||||
optional string error_message = 5;
|
||||
|
||||
// Opaque server-provided ID representing an "epoch" of the server-side data,
|
||||
// referred to as "birthday" or "store birthday". This ID remains fixed until
|
||||
// server-side data gets cleared/reset (e.g. via ClearServerDataMessage),
|
||||
// which clients experience as NOT_MY_BIRTHDAY error, and involves clearing
|
||||
// all local sync metadata including the cached store birthday.
|
||||
//
|
||||
// This mechanism allows the server to implement clear-data/reset
|
||||
// functionality that reliably identifies and deletes sync entities uploaded
|
||||
// before the clear-data/reset event (e.g. via ClearServerDataMessage).
|
||||
// Furthermore, it allows the server to deal reliably with in-flight changes
|
||||
// from other clients upon clear-data event, because all writes issued with an
|
||||
// outdated birthday (which in-flight writes would use) can be detected by the
|
||||
// server.
|
||||
optional string store_birthday = 6;
|
||||
|
||||
optional ClientCommand client_command = 7;
|
||||
reserved 8;
|
||||
reserved "profiling_data";
|
||||
reserved 9;
|
||||
reserved 10;
|
||||
reserved "stream_metadata";
|
||||
reserved 11;
|
||||
reserved "stream_data";
|
||||
|
||||
// The data types whose storage has been migrated. Present when the value of
|
||||
// error_code is MIGRATION_DONE.
|
||||
repeated int32 migrated_data_type_id = 12;
|
||||
|
||||
message Error {
|
||||
optional SyncEnums.ErrorType error_type = 1 [default = UNKNOWN];
|
||||
optional string error_description = 2;
|
||||
reserved 3;
|
||||
reserved "url";
|
||||
optional SyncEnums.Action action = 4 [default = UNKNOWN_ACTION];
|
||||
|
||||
// Currently meaningful if |error_type| is throttled or partial_failure.
|
||||
// In the throttled case, if this field is absent then the whole client
|
||||
// (all datatypes) is throttled.
|
||||
// In the partial_failure case, this field denotes partial failures. The
|
||||
// client should retry those datatypes with exponential backoff.
|
||||
repeated int32 error_data_type_ids = 5;
|
||||
}
|
||||
optional Error error = 13;
|
||||
|
||||
// The new per-client state for this client. If set, should be persisted and
|
||||
// sent with any subsequent ClientToServerMessages.
|
||||
optional ChipBag new_bag_of_chips = 14;
|
||||
|
||||
// Present if this ClientToServerResponse is in response to a ClearServerData
|
||||
// request.
|
||||
optional ClearServerDataResponse clear_server_data = 15;
|
||||
}
|
||||
|
||||
// A message to notify the server of certain sync events. Idempotent. Send these
|
||||
// to the /event endpoint.
|
||||
message EventRequest {
|
||||
optional SyncDisabledEvent sync_disabled = 1;
|
||||
}
|
||||
|
||||
message EventResponse {}
|
||||
|
||||
// A message indicating that the sync engine has been disabled on a client.
|
||||
message SyncDisabledEvent {
|
||||
// The GUID that identifies the sync client.
|
||||
optional string cache_guid = 1;
|
||||
|
||||
// The store birthday that the client was using before disabling sync.
|
||||
optional string store_birthday = 2;
|
||||
}
|
||||
Reference in new issue
Block a user