libsignal_service/push_service/
linking.rs1use libsignal_core::DeviceId;
2use reqwest::Method;
3use serde::{Deserialize, Serialize};
4use uuid::Uuid;
5
6use crate::{
7 configuration::Endpoint, utils::serde_device_id,
8 websocket::registration::DeviceActivationRequest,
9};
10
11use super::{
12 response::ReqwestExt, HttpAuth, HttpAuthOverride, PushService, ServiceError,
13};
14
15#[derive(Debug, Serialize)]
16#[serde(rename_all = "camelCase")]
17pub struct LinkAccountAttributes {
18 pub fetches_messages: bool,
19 pub name: String,
20 pub registration_id: u32,
21 pub pni_registration_id: u32,
22 pub capabilities: LinkCapabilities,
23}
24
25#[derive(Debug, Serialize)]
26#[serde(rename_all = "camelCase")]
27pub struct LinkCapabilities {
28 pub delete_sync: bool,
29 pub versioned_expiration_timer: bool,
30 pub ssre2: bool,
36 pub spqr: bool,
41}
42
43impl Default for LinkCapabilities {
45 fn default() -> Self {
46 Self {
47 delete_sync: true,
48 versioned_expiration_timer: true,
49 ssre2: true,
50 spqr: true,
51 }
52 }
53}
54
55#[derive(Debug, Deserialize)]
56#[serde(rename_all = "camelCase")]
57pub struct LinkResponse {
58 #[serde(rename = "uuid")]
59 pub aci: Uuid,
60 pub pni: Uuid,
61 #[serde(with = "serde_device_id")]
62 pub device_id: DeviceId,
63}
64
65#[derive(Debug, Serialize)]
66#[serde(rename_all = "camelCase")]
67pub struct LinkRequest {
68 pub verification_code: String,
69 pub account_attributes: LinkAccountAttributes,
70 #[serde(flatten)]
71 pub device_activation_request: DeviceActivationRequest,
72}
73
74impl PushService {
75 pub async fn link_device(
76 &mut self,
77 link_request: &LinkRequest,
78 http_auth: HttpAuth,
79 ) -> Result<LinkResponse, ServiceError> {
80 self.request(
81 Method::PUT,
82 Endpoint::service("/v1/devices/link"),
83 HttpAuthOverride::Identified(http_auth),
84 )?
85 .json(&link_request)
86 .send()
87 .await?
88 .service_error_for_status()
89 .await?
90 .json()
91 .await
92 .map_err(Into::into)
93 }
94}