mirror of
https://github.com/chatmail/core.git
synced 2026-05-02 04:46:29 +03:00
show an error when a webxdc is written for a newer (future) api (#3206)
* add min_api to manifest.toml, define WEBXDC_API_VERSION * return an error instead of index.html if the webxdc requires a newer api * add a test with an webxdc requiring a newer api * update CHANGELOG
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
- `dc_receive_imf` refactorings #3154 #3156
|
- `dc_receive_imf` refactorings #3154 #3156
|
||||||
- add index to speedup deletion of expired ephemeral messages #3155
|
- add index to speedup deletion of expired ephemeral messages #3155
|
||||||
- muted chats stay archived on new messages #3184
|
- muted chats stay archived on new messages #3184
|
||||||
|
- support `min_api` from Webxdc manifests #3206
|
||||||
|
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|||||||
@@ -19,6 +19,12 @@ use std::fs::File;
|
|||||||
use std::io::{Read, Seek, SeekFrom};
|
use std::io::{Read, Seek, SeekFrom};
|
||||||
use zip::ZipArchive;
|
use zip::ZipArchive;
|
||||||
|
|
||||||
|
/// The current API version.
|
||||||
|
/// If `min_api` in manifest.toml is set to a larger value,
|
||||||
|
/// the Webxdc's index.html is replaced by an error message.
|
||||||
|
/// In the future, that may be useful to avoid new Webxdc being loaded on old Delta Chats.
|
||||||
|
const WEBXDC_API_VERSION: u32 = 1;
|
||||||
|
|
||||||
pub const WEBXDC_SUFFIX: &str = "xdc";
|
pub const WEBXDC_SUFFIX: &str = "xdc";
|
||||||
const WEBXDC_DEFAULT_ICON: &str = "__webxdc__/default-icon.png";
|
const WEBXDC_DEFAULT_ICON: &str = "__webxdc__/default-icon.png";
|
||||||
|
|
||||||
@@ -44,6 +50,7 @@ const WEBXDC_RECEIVING_LIMIT: u64 = 4194304;
|
|||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
struct WebxdcManifest {
|
struct WebxdcManifest {
|
||||||
name: Option<String>,
|
name: Option<String>,
|
||||||
|
min_api: Option<u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parsed information from WebxdcManifest and fallbacks.
|
/// Parsed information from WebxdcManifest and fallbacks.
|
||||||
@@ -499,6 +506,21 @@ impl Message {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let mut archive = self.get_webxdc_archive(context).await?;
|
let mut archive = self.get_webxdc_archive(context).await?;
|
||||||
|
|
||||||
|
if name == "index.html" {
|
||||||
|
if let Ok(bytes) = get_blob(&mut archive, "manifest.toml").await {
|
||||||
|
if let Ok(manifest) = parse_webxdc_manifest(&bytes).await {
|
||||||
|
if let Some(min_api) = manifest.min_api {
|
||||||
|
if min_api > WEBXDC_API_VERSION {
|
||||||
|
return Ok(Vec::from(
|
||||||
|
"<!DOCTYPE html>This Webxdc requires a newer Delta Chat version.",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
get_blob(&mut archive, name).await
|
get_blob(&mut archive, name).await
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,10 +533,16 @@ impl Message {
|
|||||||
if let Ok(manifest) = parse_webxdc_manifest(&bytes).await {
|
if let Ok(manifest) = parse_webxdc_manifest(&bytes).await {
|
||||||
manifest
|
manifest
|
||||||
} else {
|
} else {
|
||||||
WebxdcManifest { name: None }
|
WebxdcManifest {
|
||||||
|
name: None,
|
||||||
|
min_api: None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
WebxdcManifest { name: None }
|
WebxdcManifest {
|
||||||
|
name: None,
|
||||||
|
min_api: None,
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(ref name) = manifest.name {
|
if let Some(ref name) = manifest.name {
|
||||||
@@ -1295,6 +1323,38 @@ sth_for_the = "future""#
|
|||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
assert_eq!(manifest.name, Some("foz".to_string()));
|
assert_eq!(manifest.name, Some("foz".to_string()));
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn test_parse_webxdc_manifest_min_api() -> Result<()> {
|
||||||
|
let manifest = parse_webxdc_manifest(r#"min_api = 3"#.as_bytes()).await?;
|
||||||
|
assert_eq!(manifest.min_api, Some(3));
|
||||||
|
|
||||||
|
let result = parse_webxdc_manifest(r#"min_api = "1""#.as_bytes()).await;
|
||||||
|
assert!(result.is_err());
|
||||||
|
|
||||||
|
let result = parse_webxdc_manifest(r#"min_api = 1.2"#.as_bytes()).await;
|
||||||
|
assert!(result.is_err());
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[async_std::test]
|
||||||
|
async fn test_webxdc_min_api_too_large() -> Result<()> {
|
||||||
|
let t = TestContext::new_alice().await;
|
||||||
|
let chat_id = create_group_chat(&t, ProtectionStatus::Unprotected, "chat").await?;
|
||||||
|
let mut instance = create_webxdc_instance(
|
||||||
|
&t,
|
||||||
|
"with-min-api-1001.xdc",
|
||||||
|
include_bytes!("../test-data/webxdc/with-min-api-1001.xdc"),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
send_msg(&t, chat_id, &mut instance).await?;
|
||||||
|
|
||||||
|
let instance = t.get_last_msg().await;
|
||||||
|
let html = instance.get_webxdc_blob(&t, "index.html").await?;
|
||||||
|
assert!(String::from_utf8_lossy(&*html).contains("requires a newer Delta Chat version"));
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
test-data/webxdc/with-min-api-1001.xdc
Normal file
BIN
test-data/webxdc/with-min-api-1001.xdc
Normal file
Binary file not shown.
Reference in New Issue
Block a user