diff --git a/deltachat-jsonrpc/src/api/mod.rs b/deltachat-jsonrpc/src/api/mod.rs index e00db7217..a8c2daa09 100644 --- a/deltachat-jsonrpc/src/api/mod.rs +++ b/deltachat-jsonrpc/src/api/mod.rs @@ -47,7 +47,7 @@ use types::provider_info::ProviderInfo; use types::webxdc::WebxdcMessageInfo; use self::types::{ - chat::{BasicChat, JSONRPCChatVisibility, MuteDuration}, + chat::{BasicChat, JSONRPCChatVisibility, JSONRPCEncryptionModus, MuteDuration}, location::JsonrpcLocation, message::{ JSONRPCMessageListItem, MessageNotificationInfo, MessageSearchResult, MessageViewtype, @@ -528,6 +528,8 @@ impl CommandApi { ChatId::new(chat_id).get_encryption_info(&ctx).await } + + /// Get QR code (text and SVG) that will offer an Setup-Contact or Verified-Group invitation. /// The QR code is compatible to the OPENPGP4FPR format /// so that a basic fingerprint comparison also works e.g. with OpenKeychain. @@ -557,6 +559,32 @@ impl CommandApi { )) } + async fn set_chat_encryption_modus( + &self, + account_id: u32, + chat_id: u32, + encryption_modus: JSONRPCEncryptionModus + ) -> Result<()> { + let ctx = self.get_context(account_id).await?; + let chat = ChatId::new(chat_id); + Ok(chat.set_encryption_modus(&ctx, encryption_modus.into_core_type()).await?) + } + + async fn get_chat_encryption_modus( + &self, + account_id: u32, + chat_id: u32 + ) -> Result> { + let ctx = self.get_context(account_id).await?; + let chat = ChatId::new(chat_id); + Ok( + match chat.encryption_modus(&ctx).await? { + Some(encryption_modus) => Some(JSONRPCEncryptionModus::from_core_type(encryption_modus)), + None => None, + } + ) + } + /// Continue a Setup-Contact or Verified-Group-Invite protocol /// started on another device with `get_chat_securejoin_qr_code_svg()`. /// This function is typically called when `check_qr()` returns diff --git a/deltachat-jsonrpc/src/api/types/chat.rs b/deltachat-jsonrpc/src/api/types/chat.rs index f5a5c3bcd..cce026108 100644 --- a/deltachat-jsonrpc/src/api/types/chat.rs +++ b/deltachat-jsonrpc/src/api/types/chat.rs @@ -2,7 +2,7 @@ use std::time::{Duration, SystemTime}; use anyhow::{anyhow, bail, Result}; use deltachat::chat::{self, get_chat_contacts, ChatVisibility}; -use deltachat::chat::{Chat, ChatId}; +use deltachat::chat::{Chat, ChatId, EncryptionModus}; use deltachat::constants::Chattype; use deltachat::contact::{Contact, ContactId}; use deltachat::context::Context; @@ -211,3 +211,33 @@ impl JSONRPCChatVisibility { } } } + + +#[derive(Clone, Serialize, Deserialize, TypeDef)] +#[serde(rename = "EncryptionModus")] +pub enum JSONRPCEncryptionModus { + Opportunistic = 0, + ForcePlaintext = 1, + ForceEncrypted = 2, + ForceVerified = 3, +} + +impl JSONRPCEncryptionModus { + pub fn into_core_type(self) -> EncryptionModus { + match self { + JSONRPCEncryptionModus::Opportunistic => EncryptionModus::Opportunistic, + JSONRPCEncryptionModus::ForcePlaintext => EncryptionModus::ForcePlaintext, + JSONRPCEncryptionModus::ForceEncrypted => EncryptionModus::ForceEncrypted, + JSONRPCEncryptionModus::ForceVerified => EncryptionModus::ForceVerified + } + } + + pub fn from_core_type(core_encryption_modus: EncryptionModus) -> Self { + match core_encryption_modus { + EncryptionModus::Opportunistic => JSONRPCEncryptionModus::Opportunistic, + EncryptionModus::ForcePlaintext => JSONRPCEncryptionModus::ForcePlaintext, + EncryptionModus::ForceEncrypted => JSONRPCEncryptionModus::ForceEncrypted, + EncryptionModus::ForceVerified => JSONRPCEncryptionModus::ForceVerified + } + } +} diff --git a/deltachat-jsonrpc/typescript/generated/client.ts b/deltachat-jsonrpc/typescript/generated/client.ts index bb207be81..d8fb5a5fd 100644 --- a/deltachat-jsonrpc/typescript/generated/client.ts +++ b/deltachat-jsonrpc/typescript/generated/client.ts @@ -331,6 +331,16 @@ export class RawClient { return (this._transport.request('get_chat_securejoin_qr_code_svg', [accountId, chatId] as RPC.Params)) as Promise<[string,string]>; } + + public setChatEncryptionModus(accountId: T.U32, chatId: T.U32, encryptionModus: T.EncryptionModus): Promise { + return (this._transport.request('set_chat_encryption_modus', [accountId, chatId, encryptionModus] as RPC.Params)) as Promise; + } + + + public getChatEncryptionModus(accountId: T.U32, chatId: T.U32): Promise<(T.EncryptionModus|null)> { + return (this._transport.request('get_chat_encryption_modus', [accountId, chatId] as RPC.Params)) as Promise<(T.EncryptionModus|null)>; + } + /** * Continue a Setup-Contact or Verified-Group-Invite protocol * started on another device with `get_chat_securejoin_qr_code_svg()`. @@ -730,8 +740,8 @@ export class RawClient { } - public deleteContact(accountId: T.U32, contactId: T.U32): Promise { - return (this._transport.request('delete_contact', [accountId, contactId] as RPC.Params)) as Promise; + public deleteContact(accountId: T.U32, contactId: T.U32): Promise { + return (this._transport.request('delete_contact', [accountId, contactId] as RPC.Params)) as Promise; } diff --git a/deltachat-jsonrpc/typescript/generated/types.ts b/deltachat-jsonrpc/typescript/generated/types.ts index e3a3055a2..471df8a19 100644 --- a/deltachat-jsonrpc/typescript/generated/types.ts +++ b/deltachat-jsonrpc/typescript/generated/types.ts @@ -50,6 +50,7 @@ export type BasicChat= * used when you only need the basic metadata of a chat like type, name, profile picture */ {"id":U32;"name":string;"isProtected":boolean;"profileImage":(string|null);"archived":boolean;"chatType":U32;"isUnpromoted":boolean;"isSelfTalk":boolean;"color":string;"isContactRequest":boolean;"isDeviceChat":boolean;"isMuted":boolean;}; +export type EncryptionModus=("Opportunistic"|"ForcePlaintext"|"ForceEncrypted"|"ForceVerified"); export type ChatVisibility=("Normal"|"Archived"|"Pinned"); export type MuteDuration=("NotMuted"|"Forever"|{"Until":I64;}); export type MessageListItem=(({"kind":"message";}&{"msg_id":U32;})|({ @@ -195,4 +196,4 @@ export type MessageNotificationInfo={"id":U32;"chatId":U32;"accountId":U32;"imag export type MessageSearchResult={"id":U32;"authorProfileImage":(string|null);"authorName":string;"authorColor":string;"chatName":(string|null);"message":string;"timestamp":I64;}; export type F64=number; export type Location={"locationId":U32;"isIndependent":boolean;"latitude":F64;"longitude":F64;"accuracy":F64;"timestamp":I64;"contactId":U32;"msgId":U32;"chatId":U32;"marker":(string|null);}; -export type __AllTyps=[string,boolean,Record,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],null,null,U32,null,U32,null,U32,Account,U32,U64,U32,string,(ProviderInfo|null),U32,boolean,U32,Record,U32,string,(string|null),null,U32,Record,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record,Record,null,U32,null,U32,null,U32,string,(string|null),null,U32,string,(string|null),null,U32,(U32)[],U32,U32,Usize,U32,boolean,I64,Usize,U32,string,U32,U32,string,null,U32,(U32|null),(string|null),(U32|null),(ChatListEntry)[],U32,(ChatListEntry)[],Record,U32,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,string,U32,U32,U32,null,U32,U32,U32,null,U32,U32,U32,null,U32,U32,(U32)[],U32,string,boolean,U32,U32,U32,U32,U32,string,null,U32,U32,(string|null),null,U32,U32,ChatVisibility,null,U32,U32,U32,null,U32,U32,U32,U32,string,string,U32,U32,U32,null,U32,U32,(U32|null),U32,U32,MuteDuration,null,U32,U32,boolean,U32,(U32)[],null,U32,U32,U32,(U32)[],U32,U32,U32,(MessageListItem)[],U32,U32,Message,U32,U32,(string|null),U32,(U32)[],Record,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record,U32,U32,Contact,U32,string,(string|null),U32,U32,U32,U32,U32,U32,null,U32,U32,null,U32,(Contact)[],U32,U32,(string|null),(U32)[],U32,U32,(string|null),(Contact)[],U32,(U32)[],Record,U32,U32,boolean,U32,U32,string,null,U32,U32,string,U32,string,(U32|null),U32,(U32|null),Viewtype,(Viewtype|null),(Viewtype|null),(U32)[],U32,U32,Viewtype,(Viewtype|null),(Viewtype|null),[(U32|null),(U32|null)],U32,string,(string|null),null,U32,string,(string|null),null,null,U32,U32,U32,string,U32,(U32|null),(U32|null),I64,I64,(Location)[],U32,U32,string,string,null,U32,U32,U32,string,U32,U32,WebxdcMessageInfo,U32,(U32)[],U32,null,U32,U32,string,U32,U32,U32,(string)[],U32,U32,U32,null,U32,U32,(Message|null),U32,U32,U32,U32,string,U32,U32,string,null,U32,Record,U32,U32,string,U32,U32,U32,(string|null),(string|null),([F64,F64]|null),(U32|null),[U32,Message],U32,U32,(string|null),(string|null),(U32|null),null]; +export type __AllTyps=[string,boolean,Record,U32,U32,null,(U32)[],U32,null,(U32|null),(Account)[],null,null,U32,null,U32,null,U32,Account,U32,U64,U32,string,(ProviderInfo|null),U32,boolean,U32,Record,U32,string,(string|null),null,U32,Record,null,U32,string,null,U32,string,Qr,U32,string,(string|null),U32,(string)[],Record,Record,null,U32,null,U32,null,U32,string,(string|null),null,U32,string,(string|null),null,U32,(U32)[],U32,U32,Usize,U32,boolean,I64,Usize,U32,string,U32,U32,string,null,U32,(U32|null),(string|null),(U32|null),(ChatListEntry)[],U32,(ChatListEntry)[],Record,U32,U32,FullChat,U32,U32,BasicChat,U32,U32,null,U32,U32,null,U32,U32,null,U32,U32,string,U32,(U32|null),[string,string],U32,U32,EncryptionModus,null,U32,U32,(EncryptionModus|null),U32,string,U32,U32,U32,null,U32,U32,U32,null,U32,U32,U32,null,U32,U32,(U32)[],U32,string,boolean,U32,U32,U32,U32,U32,string,null,U32,U32,(string|null),null,U32,U32,ChatVisibility,null,U32,U32,U32,null,U32,U32,U32,U32,string,string,U32,U32,U32,null,U32,U32,(U32|null),U32,U32,MuteDuration,null,U32,U32,boolean,U32,(U32)[],null,U32,U32,U32,(U32)[],U32,U32,U32,(MessageListItem)[],U32,U32,Message,U32,U32,(string|null),U32,(U32)[],Record,U32,U32,MessageNotificationInfo,U32,(U32)[],null,U32,U32,string,U32,U32,null,U32,string,(U32|null),(U32)[],U32,(U32)[],Record,U32,U32,Contact,U32,string,(string|null),U32,U32,U32,U32,U32,U32,null,U32,U32,null,U32,(Contact)[],U32,U32,(string|null),(U32)[],U32,U32,(string|null),(Contact)[],U32,(U32)[],Record,U32,U32,null,U32,U32,string,null,U32,U32,string,U32,string,(U32|null),U32,(U32|null),Viewtype,(Viewtype|null),(Viewtype|null),(U32)[],U32,U32,Viewtype,(Viewtype|null),(Viewtype|null),[(U32|null),(U32|null)],U32,string,(string|null),null,U32,string,(string|null),null,null,U32,U32,U32,string,U32,(U32|null),(U32|null),I64,I64,(Location)[],U32,U32,string,string,null,U32,U32,U32,string,U32,U32,WebxdcMessageInfo,U32,(U32)[],U32,null,U32,U32,string,U32,U32,U32,(string)[],U32,U32,U32,null,U32,U32,(Message|null),U32,U32,U32,U32,string,U32,U32,string,null,U32,Record,U32,U32,string,U32,U32,U32,(string|null),(string|null),([F64,F64]|null),(U32|null),[U32,Message],U32,U32,(string|null),(string|null),(U32|null),null];