mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 09:26:29 +03:00
Fix(jsonrpc): Do not error on missign webxdc info (#6866)
When an invalid webxdc is set as draft, json-rpc's `get_draft` fails, because `get_webxdc_info` which it calls, fails because the zip reader can not read a non-zip file. With this change, any error occurring in `get_webxdc_info` is ignored and the None-variant is returned instead. I also added a test, that setting invalid xdcs is draft is fine core-wise and checked that the input field stays responsive when a fake.xdc produced like in #6826 is added to draft close #6826
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -53,3 +53,4 @@ result
|
|||||||
# direnv
|
# direnv
|
||||||
.envrc
|
.envrc
|
||||||
.direnv
|
.direnv
|
||||||
|
.aider*
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use deltachat::chat::ChatVisibility;
|
|||||||
use deltachat::contact::Contact;
|
use deltachat::contact::Contact;
|
||||||
use deltachat::context::Context;
|
use deltachat::context::Context;
|
||||||
use deltachat::download;
|
use deltachat::download;
|
||||||
|
use deltachat::log::LogExt as _;
|
||||||
use deltachat::message::Message;
|
use deltachat::message::Message;
|
||||||
use deltachat::message::MsgId;
|
use deltachat::message::MsgId;
|
||||||
use deltachat::message::Viewtype;
|
use deltachat::message::Viewtype;
|
||||||
@@ -143,7 +144,10 @@ impl MessageObject {
|
|||||||
let override_sender_name = message.get_override_sender_name();
|
let override_sender_name = message.get_override_sender_name();
|
||||||
|
|
||||||
let webxdc_info = if message.get_viewtype() == Viewtype::Webxdc {
|
let webxdc_info = if message.get_viewtype() == Viewtype::Webxdc {
|
||||||
Some(WebxdcMessageInfo::get_for_message(context, msg_id).await?)
|
WebxdcMessageInfo::get_for_message(context, msg_id)
|
||||||
|
.await
|
||||||
|
.log_err(context)
|
||||||
|
.ok()
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@deltachat/tiny-emitter": "3.0.0",
|
"@deltachat/tiny-emitter": "3.0.0",
|
||||||
"isomorphic-ws": "^4.0.1",
|
"isomorphic-ws": "^4.0.1",
|
||||||
|
"tmp": "^0.2.3",
|
||||||
"yerpc": "^0.6.2"
|
"yerpc": "^0.6.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { strictEqual } from "assert";
|
|
||||||
import chai, { assert, expect } from "chai";
|
import chai, { assert, expect } from "chai";
|
||||||
import chaiAsPromised from "chai-as-promised";
|
import chaiAsPromised from "chai-as-promised";
|
||||||
|
import { fileSync } from "tmp";
|
||||||
chai.use(chaiAsPromised);
|
chai.use(chaiAsPromised);
|
||||||
import { StdioDeltaChat as DeltaChat } from "../deltachat.js";
|
import { StdioDeltaChat as DeltaChat } from "../deltachat.js";
|
||||||
|
|
||||||
@@ -100,6 +100,32 @@ describe("basic tests", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("webxdc", function () {
|
||||||
|
let invalidXdcPath: string;
|
||||||
|
let accountId: number;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
const tmpFile = fileSync({ postfix: ".xdc" });
|
||||||
|
invalidXdcPath = tmpFile.name;
|
||||||
|
accountId = await dc.rpc.addAccount();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should be able to draft set an invalid xdc", async function () {
|
||||||
|
const chat = await dc.rpc.createGroupChat(accountId, "xdc", false);
|
||||||
|
await expect(
|
||||||
|
dc.rpc.miscSetDraft(
|
||||||
|
accountId,
|
||||||
|
chat,
|
||||||
|
"",
|
||||||
|
invalidXdcPath,
|
||||||
|
"invalid.xdc",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
)
|
||||||
|
).to.be.eventually.rejectedWith("Invalid xdc");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("configuration", function () {
|
describe("configuration", function () {
|
||||||
let accountId: number;
|
let accountId: number;
|
||||||
before(async () => {
|
before(async () => {
|
||||||
|
|||||||
@@ -124,6 +124,23 @@ async fn test_send_invalid_webxdc() -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
|
async fn test_set_draft_invalid_webxdc() -> Result<()> {
|
||||||
|
let t = TestContext::new_alice().await;
|
||||||
|
let chat_id = create_group_chat(&t, ProtectionStatus::Unprotected, "foo").await?;
|
||||||
|
|
||||||
|
let mut instance = create_webxdc_instance(
|
||||||
|
&t,
|
||||||
|
"invalid-no-zip-but-7z.xdc",
|
||||||
|
include_bytes!("../../test-data/webxdc/invalid-no-zip-but-7z.xdc"),
|
||||||
|
)?;
|
||||||
|
|
||||||
|
// draft should not fail
|
||||||
|
chat_id.set_draft(&t, Some(&mut instance)).await?;
|
||||||
|
chat_id.get_draft(&t).await.unwrap();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||||
async fn test_send_special_webxdc_format() -> Result<()> {
|
async fn test_send_special_webxdc_format() -> Result<()> {
|
||||||
let t = TestContext::new_alice().await;
|
let t = TestContext::new_alice().await;
|
||||||
|
|||||||
Reference in New Issue
Block a user