/**
 * Copyright (C) 2019 Open Whisper Systems
 *
 * Licensed according to the LICENSE file in this repository.
 */
syntax = "proto3";

package signalservice;

option java_package        = "org.signal.storageservice.protos.groups";
option java_multiple_files = true;

message AvatarUploadAttributes {
  string key        = 1;
  string credential = 2;
  string acl        = 3;
  string algorithm  = 4;
  string date       = 5;
  string policy     = 6;
  string signature  = 7;
}

message Member {
  enum Role {
    UNKNOWN       = 0;
    DEFAULT       = 1;
    ADMINISTRATOR = 2;
  }

  bytes  userId           = 1;
  Role   role             = 2;
  bytes  profileKey       = 3;
  bytes  presentation     = 4;
  uint32 joinedAtRevision = 5;
}

message PendingMember {
  Member member        = 1;
  bytes  addedByUserId = 2;
  uint64 timestamp     = 3;
}

message RequestingMember {
    bytes  userId       = 1;
    bytes  profileKey   = 2;
    bytes  presentation = 3;
    uint64 timestamp    = 4;
}

message AccessControl {
  enum AccessRequired {
    UNKNOWN       = 0;
    ANY           = 1;
    MEMBER        = 2;
    ADMINISTRATOR = 3;
    UNSATISFIABLE = 4;
  }

  AccessRequired attributes        = 1;
  AccessRequired members           = 2;
  AccessRequired addFromInviteLink = 3;
}

message Group {
           bytes            publicKey                 = 1;
           bytes            title                     = 2;
           string           avatar                    = 3;
           bytes            disappearingMessagesTimer = 4;
           AccessControl    accessControl             = 5;
           uint32           revision                  = 6;
  repeated Member           members                   = 7;
  repeated PendingMember    pendingMembers            = 8;
  repeated RequestingMember requestingMembers         = 9;
           bytes            inviteLinkPassword        = 10;
           bytes            description               = 11;
}

message GroupChange {

  message Actions {

    message AddMemberAction {
      Member added              = 1;
      bool   joinFromInviteLink = 2;
    }

    message DeleteMemberAction {
      bytes deletedUserId = 1;
    }

    message ModifyMemberRoleAction {
      bytes       userId = 1;
      Member.Role role   = 2;
    }

    message ModifyMemberProfileKeyAction {
      bytes presentation = 1;
    }

    message AddPendingMemberAction {
      PendingMember added = 1;
    }

    message DeletePendingMemberAction {
      bytes deletedUserId = 1;
    }

    message PromotePendingMemberAction {
      bytes presentation = 1;
    }

    message AddRequestingMemberAction {
      RequestingMember added = 1;
    }

    message DeleteRequestingMemberAction {
      bytes deletedUserId = 1;
    }

    message PromoteRequestingMemberAction {
      bytes       userId = 1;
      Member.Role role   = 2;
    }

    message ModifyTitleAction {
      bytes title = 1;
    }

    message ModifyDescriptionAction {
      bytes description = 1;
    }

    message ModifyAvatarAction {
      string avatar = 1;
    }

    message ModifyDisappearingMessagesTimerAction {
      bytes timer = 1;
    }

    message ModifyAttributesAccessControlAction {
      AccessControl.AccessRequired attributesAccess = 1;
    }

    message ModifyMembersAccessControlAction {
      AccessControl.AccessRequired membersAccess = 1;
    }

    message ModifyAddFromInviteLinkAccessControlAction {
        AccessControl.AccessRequired addFromInviteLinkAccess = 1;
    }

    message ModifyInviteLinkPasswordAction {
        bytes inviteLinkPassword = 1;
    }

             bytes                                      sourceUuid                      = 1;
             uint32                                     revision                        = 2;
    repeated AddMemberAction                            addMembers                      = 3;
    repeated DeleteMemberAction                         deleteMembers                   = 4;
    repeated ModifyMemberRoleAction                     modifyMemberRoles               = 5;
    repeated ModifyMemberProfileKeyAction               modifyMemberProfileKeys         = 6;
    repeated AddPendingMemberAction                     addPendingMembers               = 7;
    repeated DeletePendingMemberAction                  deletePendingMembers            = 8;
    repeated PromotePendingMemberAction                 promotePendingMembers           = 9;
             ModifyTitleAction                          modifyTitle                     = 10;
             ModifyAvatarAction                         modifyAvatar                    = 11;
             ModifyDisappearingMessagesTimerAction      modifyDisappearingMessagesTimer = 12;
             ModifyAttributesAccessControlAction        modifyAttributesAccess          = 13;
             ModifyMembersAccessControlAction           modifyMemberAccess              = 14;
             ModifyAddFromInviteLinkAccessControlAction modifyAddFromInviteLinkAccess   = 15;
    repeated AddRequestingMemberAction                  addRequestingMembers            = 16;
    repeated DeleteRequestingMemberAction               deleteRequestingMembers         = 17;
    repeated PromoteRequestingMemberAction              promoteRequestingMembers        = 18;
             ModifyInviteLinkPasswordAction             modifyInviteLinkPassword        = 19;
             ModifyDescriptionAction                    modifyDescription               = 20;
  }

  bytes  actions         = 1;
  bytes  serverSignature = 2;
  uint32 changeEpoch     = 3;
}

message GroupChanges {
  message GroupChangeState {
    GroupChange groupChange = 1;
    Group       groupState  = 2;
  }

  repeated GroupChangeState groupChanges = 1;
}

message GroupAttributeBlob {
  oneof content {
    string title                        = 1;
    bytes  avatar                       = 2;
    uint32 disappearingMessagesDuration = 3;
    string description                  = 4;
  }
}

message GroupInviteLink {
  message GroupInviteLinkContentsV1 {
      bytes groupMasterKey     = 1;
      bytes inviteLinkPassword = 2;
  }

  oneof contents {
    GroupInviteLinkContentsV1 v1Contents = 1;
  }
}

message GroupJoinInfo {
  bytes                        publicKey            = 1;
  bytes                        title                = 2;
  string                       avatar               = 3;
  uint32                       memberCount          = 4;
  AccessControl.AccessRequired addFromInviteLink    = 5;
  uint32                       revision             = 6;
  bool                         pendingAdminApproval = 7;
  bytes                        description          = 8;
}

message GroupExternalCredential {
  string token = 1;
}
