Skip to content

Commit 8e6602c

Browse files
committed
fix: Use fallback ICE servers if server can't IMAP METADATA (#7382)
1 parent 76b7034 commit 8e6602c

File tree

2 files changed

+29
-27
lines changed

2 files changed

+29
-27
lines changed

src/imap.rs

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ struct OAuth2 {
123123
access_token: String,
124124
}
125125

126-
#[derive(Debug)]
126+
#[derive(Debug, Default)]
127127
pub(crate) struct ServerMetadata {
128128
/// IMAP METADATA `/shared/comment` as defined in
129129
/// <https://www.rfc-editor.org/rfc/rfc5464#section-6.2.1>.
@@ -1546,17 +1546,17 @@ impl Session {
15461546
Ok(())
15471547
}
15481548

1549-
/// Retrieves server metadata if it is supported.
1549+
/// Retrieves server metadata if it is supported, otherwise uses fallback one.
15501550
///
15511551
/// We get [`/shared/comment`](https://www.rfc-editor.org/rfc/rfc5464#section-6.2.1)
15521552
/// and [`/shared/admin`](https://www.rfc-editor.org/rfc/rfc5464#section-6.2.2)
15531553
/// metadata.
1554-
pub(crate) async fn fetch_metadata(&mut self, context: &Context) -> Result<()> {
1554+
pub(crate) async fn update_metadata(&mut self, context: &Context) -> Result<()> {
1555+
let mut lock = context.metadata.write().await;
1556+
15551557
if !self.can_metadata() {
1556-
return Ok(());
1558+
*lock = Some(Default::default());
15571559
}
1558-
1559-
let mut lock = context.metadata.write().await;
15601560
if let Some(ref mut old_metadata) = *lock {
15611561
let now = time();
15621562

@@ -1565,31 +1565,33 @@ impl Session {
15651565
return Ok(());
15661566
}
15671567

1568-
info!(context, "ICE servers expired, requesting new credentials.");
1569-
let mailbox = "";
1570-
let options = "";
1571-
let metadata = self
1572-
.get_metadata(mailbox, options, "(/shared/vendor/deltachat/turn)")
1573-
.await?;
15741568
let mut got_turn_server = false;
1575-
for m in metadata {
1576-
if m.entry == "/shared/vendor/deltachat/turn"
1577-
&& let Some(value) = m.value
1578-
{
1579-
match create_ice_servers_from_metadata(context, &value).await {
1580-
Ok((parsed_timestamp, parsed_ice_servers)) => {
1581-
old_metadata.ice_servers_expiration_timestamp = parsed_timestamp;
1582-
old_metadata.ice_servers = parsed_ice_servers;
1583-
got_turn_server = true;
1584-
}
1585-
Err(err) => {
1586-
warn!(context, "Failed to parse TURN server metadata: {err:#}.");
1569+
if self.can_metadata() {
1570+
info!(context, "ICE servers expired, requesting new credentials.");
1571+
let mailbox = "";
1572+
let options = "";
1573+
let metadata = self
1574+
.get_metadata(mailbox, options, "(/shared/vendor/deltachat/turn)")
1575+
.await?;
1576+
for m in metadata {
1577+
if m.entry == "/shared/vendor/deltachat/turn"
1578+
&& let Some(value) = m.value
1579+
{
1580+
match create_ice_servers_from_metadata(context, &value).await {
1581+
Ok((parsed_timestamp, parsed_ice_servers)) => {
1582+
old_metadata.ice_servers_expiration_timestamp = parsed_timestamp;
1583+
old_metadata.ice_servers = parsed_ice_servers;
1584+
got_turn_server = true;
1585+
}
1586+
Err(err) => {
1587+
warn!(context, "Failed to parse TURN server metadata: {err:#}.");
1588+
}
15871589
}
15881590
}
15891591
}
15901592
}
1591-
15921593
if !got_turn_server {
1594+
info!(context, "Will use fallback ICE servers.");
15931595
// Set expiration timestamp 7 days in the future so we don't request it again.
15941596
old_metadata.ice_servers_expiration_timestamp = time() + 3600 * 24 * 7;
15951597
old_metadata.ice_servers = create_fallback_ice_servers(context).await?;

src/scheduler.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,9 +536,9 @@ async fn inbox_fetch_idle(ctx: &Context, imap: &mut Imap, mut session: Session)
536536
.await
537537
.context("Failed to download messages")?;
538538
session
539-
.fetch_metadata(ctx)
539+
.update_metadata(ctx)
540540
.await
541-
.context("Failed to fetch metadata")?;
541+
.context("update_metadata")?;
542542
session
543543
.register_token(ctx)
544544
.await

0 commit comments

Comments
 (0)