Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  md-d2d-sync.proto   Sprache: unbekannt

 
Spracherkennung für: .proto vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

// ## Data Synchronisation Messages
//
// All strings are UTF-8 encoded.
//
// ### General Information
//
// When creating a sync message, only provide fields which are required and
// fields whose values have changed (i.e. delta updates). Fields that are
// required will be explicitly marked. For any other field within a sync
// message, assume that it is optional.
//
// When receiving a sync message, only handle fields whose values have been
// provided. As a rule of thumb, if a field is not present it means that the
// value has not changed.
//
// If more specific rules are needed in order to handle a field correctly,
// a description will be provided for the specific field.
//
// ### Validation
//
// A sync message should be validated by the following general rules:
//
// - Strictly validate enums, i.e. unknown values are not allowed and no
//   silent fallbacks are allowed.
// - Empty strings/lists have a different semantic than an omitted string/list.
//   The field should have a concise description on whether emptiness is
//   allowed, and, if so, the meaning of _empty_.
// - Follow the description of each field for more specific validation.
//
// If any of these rules is violated, the message should be discarded and logged
// as an error (but still acknowledged, if necessary).

syntax = "proto3";

package sync;

option java_package = "ch.threema.protobuf.d2d.sync";

import "common.proto";

// _Read_ receipt policy (when an unread message has been read)
enum ReadReceiptPolicy {
  // Send _read_ receipt when an unread message has been read
  SEND_READ_RECEIPT = 0;
  // Don't send _read_ receipts
  DONT_SEND_READ_RECEIPT = 1;
}

// Typing indicator policy (signal _currently typing_)
enum TypingIndicatorPolicy {
  // Send _typing_ indicator when a message is being composed
  SEND_TYPING_INDICATOR = 0;
  // Don't send _typing_ indicators
  DONT_SEND_TYPING_INDICATOR = 1;
}

// Notification sound policy.
enum NotificationSoundPolicy {
  // Do not emit a sound when notifying of a _conversation_ message.
  MUTED = 0;
}

// Visibility of a conversation.
enum ConversationVisibility {
  // Appears normally in the list of conversations
  NORMAL = 0;
  // Appears pinned in the list of conversations
  PINNED = 2;
  // Appears in the archived list of conversations
  ARCHIVED = 1;
}

// Category of a conversation.
enum ConversationCategory {
  // No specific (default) category
  DEFAULT = 0;
  // Protected conversation (_private chat_)
  PROTECTED = 1;
}

// Application configuration parameters shared across Threema Work devices.
//
// See [mdm-parameters.md](./md-parameters.md) for documentation of possible
// parameter values and associated steps to apply when a parameter has been set
// for the first time, modified, or removed.
//
// Note: MDM parameters are always transmitted fully, not as delta updates.
message MdmParameters {
  // A single MDM parameter.
  message Parameter {
    oneof value {
      // String parameter
      string string_value = 1;
      // Integer parameter
      uint64 integer_value = 3;
      // Boolean parameter
      bool boolean_value = 2;
    }
  }

  // A map of MDM parameters, originating from an external MDM system. The map
  // key is the identifier of the MDM parameter (e.g. `th_nickname`).
  map<string, Parameter> external_parameters = 1;

  // A map of MDM parameters, originating from Threema App Configuration. The
  // map key is the identifier of the MDM parameter (e.g. `th_nickname`).
  map<string, Parameter> threema_parameters = 2;

  enum ParameterPrecedence {
    // On conflict, parameters defined by Threema App Configuration take
    // precedence
    THREEMA = 0;
    // On conflict, parameters defined by an external MDM take precedence
    EXTERNAL = 1;
  }
  // The parameter precedence defines how to resolve conflicting parameters
  // between an external MDM and the Threema App Configuration.
  ParameterPrecedence parameter_precedence = 3;
}

// Threema Work credentials for authentication towards Work APIs.
message ThreemaWorkCredentials {
  // Work username.
  string username = 1;
  // Work password.
  string password = 2;
}

// The user's profile.
message UserProfile {
  // Nickname
  //
  // Required towards a new device. Optional otherwise.
  //
  // When the user cleared its nickname, send an empty string. Do not send the
  // user's Threema ID (i.e. process data).
  //
  // When an empty string was received, store the empty string as-is and fall
  // back to the users Threema ID when sending an end-to-end encrypted message.
  optional string nickname = 1;

  // Profile picture
  //
  // Always optional.
  common.DeltaImage profile_picture = 2;

  // Profile picture share policy
  //
  // Required towards a new device. Optional otherwise.
  message ProfilePictureShareWith {
    oneof policy {
      // Don't share
      common.Unit nobody = 1;
      // Share with everyone
      common.Unit everyone = 2;
      // Share only with explicitly listed contacts
      //
      // When the user selected _allow list_ but did not select any contacts,
      // send an empty list. Do not fall back to `nobody`.
      common.Identities allow_list = 3;
    }
  }
  ProfilePictureShareWith profile_picture_share_with = 3;

  // External entities linked with the identity
  //
  // Required towards a new device. Optional otherwise.
  //
  // When the user has cleared all of its identity links, this message is
  // present but `links` contains zero items.
  message IdentityLinks {
    // Threema ID link.
    message IdentityLink {
      // Identity link type
      oneof type {
        // Linked with a verified telephone number (E.164 format without leading
        // `+`)
        string phone_number = 1;
        // Linked with a verified email address
        string email = 2;
      }

      // Identity link description
      string description = 3;
    }

    // List of identity links
    repeated IdentityLink links = 1;
  }
  IdentityLinks identity_links = 4;
}

// Threema contact.
message Contact {
  // Threema ID of the contact
  //
  // Always required.
  string identity = 1;

  // Public key of the contact
  //
  // Required towards a new device and for a new contact. Should not be set
  // for existing contacts and must be ignored (a public key for an identity
  // cannot be changed).
  optional bytes public_key = 2;

  // Unix-ish timestamp in milliseconds when the contact has been created
  // (added) locally.
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  optional uint64 created_at = 3;

  // First name of the contact
  //
  // Always optional.
  //
  // An empty string is valid. When both `first_name` and `last_name` are
  // empty string, the `nickname` should be used as display name.
  optional string first_name = 4;

  // Last name of the contact
  //
  // Always optional.
  //
  // An empty string is valid. When both `first_name` and `last_name` are
  // empty string, the `nickname` should be used as display name.
  optional string last_name = 5;

  // Nickname of the contact (without `~` prefix)
  //
  // Always optional.
  //
  // An empty string is valid. If `first_name`, `last_name` and `nickname` are
  // empty string, the Threema ID should be used as display name.
  optional string nickname = 6;

  // Verification level of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  //
  // Note: When applying logic depending on the verification level, a
  // `WorkVerificationLevel` of `WORK_SUBSCRIPTION_VERIFIED` virtually raises
  // the verification level to `SERVER_VERIFIED`. However, the contact
  // verification level takes precedence if it is `FULLY_VERIFIED`.
  enum VerificationLevel {
    // Unverified, public key has been obtained from the server
    UNVERIFIED = 0;
    // Verified with one of the account links via the server, or the contact
    // has been obtained via the Work API.
    SERVER_VERIFIED = 1;
    // Verified, public key has been obtained via a secure channel
    FULLY_VERIFIED = 2;
  }
  optional VerificationLevel verification_level = 7;

  // Threema Work verification level of the contact.
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  //
  // Note: When not using a Threema Work client, the Threema Work verification
  // level must always be `NONE`.
  enum WorkVerificationLevel {
    // The user does not use Threema Work or the contact is not in the same
    // Threema Work subscription.
    NONE = 0;
    // The contact is in the same Threema Work subscription.
    WORK_SUBSCRIPTION_VERIFIED = 1;
  }
  optional WorkVerificationLevel work_verification_level = 21;

  // Identity type of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  enum IdentityType {
    // Regular contact (uses the regular Threema app)
    REGULAR = 0;
    // Work contact (uses the Threema work app)
    WORK = 1;
  }
  optional IdentityType identity_type = 8;

  // Acquaintance level of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  enum AcquaintanceLevel {
    // The contact was explicitly added by the user, the Work subscription
    // administrator or a 1:1 conversation with the contact has been initiated.
    DIRECT = 0;
    // This level covers the following cases:
    //
    // - The contact is part of a group the user is also part of. The contact
    //   was not explicitly added and no 1:1 conversation has been initiated.
    // - The contact was part of a group the user was/is also part of before but
    //   either of them has since been removed from all common groups.
    // - The contact has been explicitly removed by the user.
    //
    // The protocol refers to contacts with this level as either acquaintance
    // level _group_ or _deleted_. They are interchangeable and there's no
    // semantic difference between them beyond the context in which they are
    // referred to.
    GROUP_OR_DELETED = 1;
  }
  optional AcquaintanceLevel acquaintance_level = 9;

  // Activity state of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  enum ActivityState {
    // The ID is active (used recently and not deleted).
    ACTIVE = 0;
    // The ID has not been used for a prolonged time (typically 3 months) and
    // may have been abandoned. Such IDs can be marked as "inactive" in the
    // client's contact database, and the user may be alerted to the fact that
    // messages to this ID may not arrive (e.g. alert box, gray color in
    // contact list etc.). An inactive ID can become active again at any time,
    // so the client should keep checking it.
    INACTIVE = 1;
    // ID has never been assigned, or it has been permanently deleted. Such IDs
    // should be marked as "deleted" in the client's contact database, and no
    // further messages should be sent or received from them. Since deletion is
    // permanent, once an ID has been reported as invalid by the server, it
    // should not be checked again in the future.
    INVALID = 2;
  }
  optional ActivityState activity_state = 10;

  // Features available for the contact (64 bit mask,
  // `common.CspFeatureMaskFlag` logically or-ed).
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  optional uint64 feature_mask = 18;

  // Contact synchronisation state
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  //
  // These states are strict monotonic. When a downgrade is being detected,
  // log the incident and ignore the update.
  enum SyncState {
    // The contact data has not been imported and has not been edited by the
    // user either.
    INITIAL = 0;
    // The contact data has been imported (e.g. via a local address book and an
    // identity link). In this state, subsequent contact synchronisations must
    // not alter the contact's data.
    IMPORTED = 1;
    // The contact data has been edited by the user. In this state, subsequent
    // contact synchronisations must not alter the contact's data.
    CUSTOM = 2;
  }
  optional SyncState sync_state = 13;

  // _Read_ receipt policy override for this contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  message ReadReceiptPolicyOverride {
    oneof override {
      // Apply the _read_ receipt policy specified in the settings
      common.Unit default = 1;
      // Apply the following _read_ receipt policy
      ReadReceiptPolicy policy = 2;
    }
  }
  ReadReceiptPolicyOverride read_receipt_policy_override = 16;

  // Typing indicator policy override for this contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  message TypingIndicatorPolicyOverride {
    oneof override {
      // Apply the typing indicator policy specified in the settings
      common.Unit default = 1;
      // Apply the following typing indicator policy
      TypingIndicatorPolicy policy = 2;
    }
  }
  TypingIndicatorPolicyOverride typing_indicator_policy_override = 17;

  // Notification trigger policy for the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  message NotificationTriggerPolicyOverride {
    message Policy {
      // Apply the following notification trigger policy
      enum NotificationTriggerPolicy {
        // Never trigger a notification message.
        NEVER = 0;
      }
      NotificationTriggerPolicy policy = 1;

      // Unix-ish timestamp in milliseconds when the provided policy should
      // expire and fall back to the default. If not provided, the policy does
      // not expire.
      optional uint64 expires_at = 2;
    }

    oneof override {
      // Apply the trigger policy specified in the settings (i.e. trigger on
      // every _conversation_ message).
      common.Unit default = 1;
      // Apply the following notification trigger policy
      Policy policy = 2;
    }
  }
  NotificationTriggerPolicyOverride notification_trigger_policy_override = 19;

  // Notification sound policy for the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  //
  // Custom sounds are not reflected but are to be (re-)applied in case the
  // policy is _default_.
  message NotificationSoundPolicyOverride {
    oneof override {
      // Apply the notification sound policy specified in the settings (i.e.
      // always emit a sound when notifying of a _conversation_ message).
      common.Unit default = 1;
      // Apply the following notification sound policy
      NotificationSoundPolicy policy = 2;
    }
  }
  NotificationSoundPolicyOverride notification_sound_policy_override = 20;

  // Contact-defined profile picture as received from the contact in a
  // `set-profile-picture` message.
  //
  // Always optional.
  common.DeltaImage contact_defined_profile_picture = 14;

  // User-defined profile picture set by the user or imported from the address
  // book.
  //
  // Always optional.
  common.DeltaImage user_defined_profile_picture = 15;

  // Conversation category of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  optional ConversationCategory conversation_category = 11;

  // Conversation visibility of the contact
  //
  // Required towards a new device and for a new contact. Optional for an
  // existing contact.
  optional ConversationVisibility conversation_visibility = 12;
}

// Threema contacts associated to a group.
message Group {
  // Unique group identity
  //
  // Always required.
  common.GroupIdentity group_identity = 1;

  // Name of the group
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  //
  // An empty string is valid. In such a case, the display name of the
  // group is the list of its members.
  optional string name = 2;

  // Unix-ish timestamp in milliseconds when the group has been created locally
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  optional uint64 created_at = 3;

  // The user's state within the group
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  enum UserState {
    // The user is a member (or creator) of the group.
    MEMBER = 0;
    // The user has been kicked from the group. Implies that the group has been
    // marked as _left_.
    KICKED = 1;
    // The user left the group. Implies that the group has been marked as
    // _left_. If the user is the creator, this implies that the group has been
    // disbanded.
    LEFT = 2;
  }
  optional UserState user_state = 6;

  // Group's profile picture as received from the group's creator
  //
  // Always optional.
  common.DeltaImage profile_picture = 7;

  // Group members (**NOT** including the creator and the user itself)
  //
  // Required towards a new device and for a new group. Optional for an existing
  // group.
  //
  // The concrete semantic of this list depends on the current `user_state`:
  //
  // - `MEMBER`: It contains a list of all **current** group members (with the
  //   user itself implicitly added).
  // - `KICKED`/`LEFT`: It contains a list of all **previous** group members up
  //   to that event. If the list is empty, the group must not be visible in the
  //   UI.
  //
  // An empty list is valid.
  common.Identities member_identities = 8;

  // Notification trigger policy for the group
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  message NotificationTriggerPolicyOverride {
    message Policy {
      // Apply the following notification trigger policy
      enum NotificationTriggerPolicy {
        // Only trigger a notification if mentioned in a _conversation_ message.
        MENTIONED = 0;
        // Never trigger a notification message.
        NEVER = 1;
      }
      NotificationTriggerPolicy policy = 1;

      // Unix-ish timestamp in milliseconds when the provided policy should
      // expire and fall back to the default. If not provided, the policy does
      // not expire.
      optional uint64 expires_at = 2;
    }

    oneof override {
      // Apply the trigger policy specified in the settings (i.e. trigger on
      // every _conversation_ message).
      common.Unit default = 1;
      // Apply the following notification trigger policy
      Policy policy = 2;
    }
  }
  NotificationTriggerPolicyOverride notification_trigger_policy_override = 9;

  // Notification sound policy for the group
  //
  // Required towards a new device and for a new group. Optional for an existing
  // group.
  //
  // Custom sounds are not reflected but are to be (re-)applied in case the
  // policy is _default_.
  message NotificationSoundPolicyOverride {
    oneof override {
      // Apply the notification sound policy specified in the settings (i.e.
      // always emit a sound when notifying of a _conversation_ message).
      common.Unit default = 1;
      // Apply the following notification sound policy
      NotificationSoundPolicy policy = 2;
    }
  }
  NotificationSoundPolicyOverride notification_sound_policy_override = 10;

  // Conversation category of the group
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  optional ConversationCategory conversation_category = 4;

  // Conversation visibility of the group
  //
  // Required towards a new device and for a new group. Optional for an
  // existing group.
  optional ConversationVisibility conversation_visibility = 5;
}

// Threema contacts associated to a distribution list.
message DistributionList {
  // Unique ID of the distribution list
  //
  // Always required.
  fixed64 distribution_list_id = 1;

  // Name of the distribution list
  //
  // Required towards a new device and for a new distribution list. Optional
  // for an existing distribution list.
  //
  // An empty string is valid. In such a case, the display name of the
  // distribution list is the list of its members.
  optional string name = 2;

  // Unix-ish timestamp in milliseconds when the group has been created
  //
  // Required towards a new device and for a new distribution list. Optional
  // for an existing distribution list.
  optional uint64 created_at = 3;

  // Distribution list members
  //
  // Required towards a new device and for a new distribution list. Optional
  // for an existing distribution list.
  //
  // An empty list is **not** valid. Clearing all members should be prevented
  // by the UI.
  common.Identities member_identities = 6;

  // Conversation category of the distribution list
  //
  // Required towards a new device and for a new distribution list. Optional
  // for an existing distribution list.
  optional ConversationCategory conversation_category = 4;

  // Conversation visibility of the distribution list
  //
  // Required towards a new device and for a new distribution list. Optional
  // for an existing distribution list.
  optional ConversationVisibility conversation_visibility = 5;
}

// App settings
//
// When the user changes one or more settings:
//
// 1. Begin a transaction (scope: `SETTINGS_SYNC`, precondition: none).
// 2. For each setting that has been modified, run the associated steps of the
//    setting and include the modified settings.
// 3. Reflect this message and commit the transaction.
// 4. Apply the modified settings locally.
//
// When reflected from another device:
//
// 1. For each setting that is being included by this message, run the
//    associated steps of the setting and apply the modified setting.
message Settings {
  // Contact synchronisation policy
  //
  // Required towards a new device. Optional otherwise.
  enum ContactSyncPolicy {
    // Not synced
    NOT_SYNCED = 0;
    // Synced
    SYNC = 1;
  }
  optional ContactSyncPolicy contact_sync_policy = 1;

  // Unknown contacts policy
  //
  // Required towards a new device. Optional otherwise.
  enum UnknownContactPolicy {
    // Allowed to contact the user
    ALLOW_UNKNOWN = 0;
    // Will be blocked by the user
    BLOCK_UNKNOWN = 1;
  }
  optional UnknownContactPolicy unknown_contact_policy = 2;

  // _Read_ receipt policy (when an unread message has been read)
  //
  // Required towards a new device. Optional otherwise.
  optional ReadReceiptPolicy read_receipt_policy = 3;

  // Typing indicator policy (signal _currently typing_)
  //
  // Required towards a new device. Optional otherwise.
  optional TypingIndicatorPolicy typing_indicator_policy = 4;

  // Threema 1:1 Call policy
  //
  // Required towards a new device. Optional otherwise.
  enum O2oCallPolicy {
    // Allow creating/receiving Threema 1:1 Calls
    ALLOW_O2O_CALL = 0;
    // Denied from creating/receiving any Threema 1:1 Calls
    DENY_O2O_CALL = 1;
  }
  optional O2oCallPolicy o2o_call_policy = 5;

  // Threema 1:1 Call connection policy.
  //
  // Required towards a new device. Optional otherwise.
  //
  // Note: This is only relevant for 1:1 calls.
  enum O2oCallConnectionPolicy {
    // Allow direct (peer-to-peer) connections for Threema 1:1 Calls
    ALLOW_DIRECT_CONNECTION = 0;
    // Require relayed connections for Threema 1:1 Calls
    REQUIRE_RELAYED_CONNECTION = 1;
  }
  optional O2oCallConnectionPolicy o2o_call_connection_policy = 6;

  // Threema 1:1 Call video (stream) policy.
  //
  // Required towards a new device. Optional otherwise.
  enum O2oCallVideoPolicy {
    // Allow sending and receiving video streams in Threema 1:1 Calls.
    ALLOW_VIDEO = 0;
    // Reject and don't send video streams in Threema 1:1 Calls.
    DENY_VIDEO = 1;
  }
  optional O2oCallVideoPolicy o2o_call_video_policy = 12;

  // Threema Group Call policy
  //
  // Required towards a new device. Optional otherwise.
  enum GroupCallPolicy {
    // Allow creating/receiving Threema Group Calls
    ALLOW_GROUP_CALL = 0;
    // Denied from creating/receiving any Threema Group Calls
    DENY_GROUP_CALL = 1;
  }
  optional GroupCallPolicy group_call_policy = 11;

  // Screenshot policy
  //
  // Required towards a new device. Optional otherwise.
  enum ScreenshotPolicy {
    // Allow taking screenshots
    ALLOW_SCREENSHOT = 0;
    // Deny taking screenshots, if possible
    DENY_SCREENSHOT = 1;
  }
  optional ScreenshotPolicy screenshot_policy = 7;

  // Keyboard data collection policy (e.g. for personalised suggestions)
  //
  // Required towards a new device. Optional otherwise.
  enum KeyboardDataCollectionPolicy {
    // Allow keyboard input data to be collected
    ALLOW_DATA_COLLECTION = 0;
    // Deny collecting of keyboard input data
    DENY_DATA_COLLECTION = 1;
  }
  optional KeyboardDataCollectionPolicy keyboard_data_collection_policy = 8;

  // List of Threema IDs whose messages are blocked
  //
  // Required towards a new device. Optional otherwise.
  //
  // An empty list is valid.
  common.Identities blocked_identities = 9;

  // Threema IDs to be excluded when syncing the contact list
  //
  // Required towards a new device. Optional otherwise.
  //
  // An empty list is valid.
  common.Identities exclude_from_sync_identities = 10;
}

[Dauer der Verarbeitung: 0.4 Sekunden, vorverarbeitet 2026-04-27]

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge