mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 21324b748f | |||
| b7bf36443b | |||
| d72192aa32 | |||
| 38ecc41780 | |||
| 7ae958bb03 | |||
| f676fa53f1 | |||
| 978bdc6466 | |||
| 7c741e62cf | |||
| 12aecf8091 | |||
| 19372f0b15 | |||
| a66b90cb3d | |||
| 7234ce6cbe | |||
| beb0c2ad9a |
@@ -64,6 +64,7 @@ runs:
|
|||||||
uses: docker/metadata-action@v5
|
uses: docker/metadata-action@v5
|
||||||
with:
|
with:
|
||||||
flavor: |
|
flavor: |
|
||||||
|
latest=auto
|
||||||
suffix=${{ inputs.tag_suffix }},onlatest=true
|
suffix=${{ inputs.tag_suffix }},onlatest=true
|
||||||
tags: |
|
tags: |
|
||||||
type=semver,pattern={{version}},prefix=v
|
type=semver,pattern={{version}},prefix=v
|
||||||
@@ -72,7 +73,6 @@ runs:
|
|||||||
type=ref,event=branch,prefix=${{ format('refs/heads/{0}', github.event.repository.default_branch) != github.ref && 'branch-' || '' }},
|
type=ref,event=branch,prefix=${{ format('refs/heads/{0}', github.event.repository.default_branch) != github.ref && 'branch-' || '' }},
|
||||||
type=ref,event=pr
|
type=ref,event=pr
|
||||||
type=sha,format=short
|
type=sha,format=short
|
||||||
type=raw,value=latest${{ inputs.tag_suffix }},enable=${{ startsWith(github.ref, 'refs/tags/v') }},priority=1100
|
|
||||||
images: ${{ inputs.images }}
|
images: ${{ inputs.images }}
|
||||||
# default labels & annotations: https://github.com/docker/metadata-action/blob/master/src/meta.ts#L509
|
# default labels & annotations: https://github.com/docker/metadata-action/blob/master/src/meta.ts#L509
|
||||||
env:
|
env:
|
||||||
|
|||||||
@@ -59,10 +59,9 @@ jobs:
|
|||||||
# Aggressive GC since cache restores don't increment counter
|
# Aggressive GC since cache restores don't increment counter
|
||||||
echo "CARGO_INCREMENTAL_GC_TRIGGER=5" >> $GITHUB_ENV
|
echo "CARGO_INCREMENTAL_GC_TRIGGER=5" >> $GITHUB_ENV
|
||||||
|
|
||||||
- name: Setup Rust nightly
|
- name: Setup Rust
|
||||||
uses: ./.forgejo/actions/setup-rust
|
uses: ./.forgejo/actions/setup-rust
|
||||||
with:
|
with:
|
||||||
rust-version: nightly
|
|
||||||
github-token: ${{ secrets.GH_PUBLIC_RO }}
|
github-token: ${{ secrets.GH_PUBLIC_RO }}
|
||||||
|
|
||||||
- name: Get package version and component
|
- name: Get package version and component
|
||||||
|
|||||||
@@ -24,3 +24,4 @@ extend-ignore-re = [
|
|||||||
"continuwuity" = "continuwuity"
|
"continuwuity" = "continuwuity"
|
||||||
"continuwity" = "continuwuity"
|
"continuwity" = "continuwuity"
|
||||||
"execuse" = "execuse"
|
"execuse" = "execuse"
|
||||||
|
"oltp" = "OTLP"
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Continuwuity 0.5.0 (2025-12-30)
|
||||||
|
|
||||||
|
**This release contains a CRITICAL vulnerability patch, and you must update as soon as possible**
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Enabled the OTLP exporter in default builds, and allow configuring the exporter protocol. (@Jade). (#1251)
|
||||||
|
|
||||||
|
## Bug Fixes
|
||||||
|
|
||||||
|
- Don't allow admin room upgrades, as this can break the admin room (@timedout) (#1245)
|
||||||
|
- Fix invalid creators in power levels during upgrade to v12 (@timedout) (#1245)
|
||||||
Generated
+12
-12
@@ -940,7 +940,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit"
|
name = "conduwuit"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"conduwuit_admin",
|
"conduwuit_admin",
|
||||||
@@ -972,7 +972,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_admin"
|
name = "conduwuit_admin"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"conduwuit_api",
|
"conduwuit_api",
|
||||||
@@ -994,7 +994,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_api"
|
name = "conduwuit_api"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
@@ -1027,14 +1027,14 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_build_metadata"
|
name = "conduwuit_build_metadata"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"built",
|
"built",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_core"
|
name = "conduwuit_core"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"argon2",
|
"argon2",
|
||||||
"arrayvec",
|
"arrayvec",
|
||||||
@@ -1095,7 +1095,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_database"
|
name = "conduwuit_database"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-channel",
|
"async-channel",
|
||||||
"conduwuit_core",
|
"conduwuit_core",
|
||||||
@@ -1114,7 +1114,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_macros"
|
name = "conduwuit_macros"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
@@ -1124,7 +1124,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_router"
|
name = "conduwuit_router"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
"axum-client-ip",
|
"axum-client-ip",
|
||||||
@@ -1159,7 +1159,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_service"
|
name = "conduwuit_service"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"base64 0.22.1",
|
"base64 0.22.1",
|
||||||
@@ -1200,7 +1200,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "conduwuit_web"
|
name = "conduwuit_web"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"askama",
|
"askama",
|
||||||
"axum 0.7.9",
|
"axum 0.7.9",
|
||||||
@@ -6206,7 +6206,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask"
|
name = "xtask"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"serde",
|
"serde",
|
||||||
@@ -6215,7 +6215,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xtask-generate-commands"
|
name = "xtask-generate-commands"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap-markdown",
|
"clap-markdown",
|
||||||
"clap_builder",
|
"clap_builder",
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ license = "Apache-2.0"
|
|||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
repository = "https://forgejo.ellis.link/continuwuation/continuwuity"
|
repository = "https://forgejo.ellis.link/continuwuation/continuwuity"
|
||||||
rust-version = "1.86.0"
|
rust-version = "1.86.0"
|
||||||
version = "0.5.0"
|
version = "0.5.1"
|
||||||
|
|
||||||
[workspace.metadata.crane]
|
[workspace.metadata.crane]
|
||||||
name = "conduwuit"
|
name = "conduwuit"
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
The `console` feature is now enabled by default, allowing the server console to be used for running admin commands directly.
|
||||||
@@ -1 +0,0 @@
|
|||||||
Enabled the OLTP exporter in default builds, and allow configuring the exporter protocol. (@Jade).
|
|
||||||
+1
-1
@@ -48,7 +48,7 @@ EOF
|
|||||||
|
|
||||||
# Developer tool versions
|
# Developer tool versions
|
||||||
# renovate: datasource=github-releases depName=cargo-bins/cargo-binstall
|
# renovate: datasource=github-releases depName=cargo-bins/cargo-binstall
|
||||||
ENV BINSTALL_VERSION=1.16.2
|
ENV BINSTALL_VERSION=1.16.6
|
||||||
# renovate: datasource=github-releases depName=psastras/sbom-rs
|
# renovate: datasource=github-releases depName=psastras/sbom-rs
|
||||||
ENV CARGO_SBOM_VERSION=0.9.1
|
ENV CARGO_SBOM_VERSION=0.9.1
|
||||||
# renovate: datasource=crate depName=lddtree
|
# renovate: datasource=crate depName=lddtree
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ RUN --mount=type=cache,target=/etc/apk/cache apk add \
|
|||||||
|
|
||||||
# Developer tool versions
|
# Developer tool versions
|
||||||
# renovate: datasource=github-releases depName=cargo-bins/cargo-binstall
|
# renovate: datasource=github-releases depName=cargo-bins/cargo-binstall
|
||||||
ENV BINSTALL_VERSION=1.16.2
|
ENV BINSTALL_VERSION=1.16.6
|
||||||
# renovate: datasource=github-releases depName=psastras/sbom-rs
|
# renovate: datasource=github-releases depName=psastras/sbom-rs
|
||||||
ENV CARGO_SBOM_VERSION=0.9.1
|
ENV CARGO_SBOM_VERSION=0.9.1
|
||||||
# renovate: datasource=crate depName=lddtree
|
# renovate: datasource=crate depName=lddtree
|
||||||
|
|||||||
@@ -6,10 +6,10 @@
|
|||||||
"message": "Welcome to Continuwuity! Important announcements about the project will appear here."
|
"message": "Welcome to Continuwuity! Important announcements about the project will appear here."
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 6,
|
"id": 7,
|
||||||
"mention_room": true,
|
"mention_room": true,
|
||||||
"date": "2025-12-22",
|
"date": "2025-12-30",
|
||||||
"message": "Continuwuity v0.5.0 has been released. **The release contains a fix for the critical vulnerability [GHSA-22fw-4jq7-g8r8](https://github.com/continuwuity/continuwuity/security/advisories/GHSA-22fw-4jq7-g8r8). Update as soon as possible.**\n\nThis has been *actively exploited* to create fake leave events in the Continuwuity rooms. Please leave and rejoin the rooms to fix any issues this may have caused. \n\n - [Continuwuity (space)](https://matrix.to/#/!PxtzompFuodlyzdCDtV5lzjXs10XIHeOOaq_FYodHyk?via=ellis.link&via=gingershaped.computer&via=continuwuity.org)\n - [Continuwuity](https://matrix.to/#/!kn3VQSLcgWGUFm0FFRid4MinJ_aeZPjHQ0irXbHa3bU?via=ellis.link&via=gingershaped.computer&via=continuwuity.org)\n - [Continuwuity Announcements](https://matrix.to/#/!d7zDZg1Vu5nhkCi50jNfOIObD5fpfGhfl48SZWZek7k?via=ellis.link)\n - [Continuwuity Offtopic](https://matrix.to/#/!QlOomq-suHC9rJHfDFVdbcGg4HS2ojSQ0bo4W2JOGMM?via=ellis.link&via=gingershaped.computer&via=continuwuity.org)\n - [Continuwuity Development](https://matrix.to/#/!aAvealFbgiKTJGzumNbjuwDgt1tOkBKwiyfYqE3ouk0?via=ellis.link&via=explodie.org&via=continuwuity.org)\n"
|
"message": "Continuwuity v0.5.1 has been released. **The release contains a fix for the critical vulnerability [GHSA-m5p2-vccg-8c9v](https://github.com/continuwuity/continuwuity/security/advisories/GHSA-m5p2-vccg-8c9v) (embargoed) affecting all Conduit-derived servers. Update as soon as possible.**\n\nThis has been *actively exploited* to attempt account takeover and forge events bricking the Continuwuity rooms. The new space is accessible at [Continuwuity (room list)](https://matrix.to/#/!8cR4g-i9ucof69E4JHNg9LbPVkGprHb3SzcrGBDDJgk?via=continuwuity.org&via=starstruck.systems&via=gingershaped.computer)\n"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
tag-message = "chore: Release v{{version}}"
|
||||||
@@ -48,7 +48,7 @@ use service::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::banned_room_check;
|
use super::{banned_room_check, validate_remote_member_event_stub};
|
||||||
use crate::Ruma;
|
use crate::Ruma;
|
||||||
|
|
||||||
/// # `POST /_matrix/client/r0/rooms/{roomId}/join`
|
/// # `POST /_matrix/client/r0/rooms/{roomId}/join`
|
||||||
@@ -837,6 +837,13 @@ async fn join_room_by_id_helper_local(
|
|||||||
err!(BadServerResponse("Invalid make_join event json received from server: {e:?}"))
|
err!(BadServerResponse("Invalid make_join event json received from server: {e:?}"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
validate_remote_member_event_stub(
|
||||||
|
&MembershipState::Join,
|
||||||
|
sender_user,
|
||||||
|
room_id,
|
||||||
|
&join_event_stub,
|
||||||
|
)?;
|
||||||
|
|
||||||
let join_authorized_via_users_server = join_event_stub
|
let join_authorized_via_users_server = join_event_stub
|
||||||
.get("content")
|
.get("content")
|
||||||
.map(|s| {
|
.map(|s| {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ use service::{
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{banned_room_check, join::join_room_by_id_helper};
|
use super::{banned_room_check, join::join_room_by_id_helper, validate_remote_member_event_stub};
|
||||||
use crate::Ruma;
|
use crate::Ruma;
|
||||||
|
|
||||||
/// # `POST /_matrix/client/*/knock/{roomIdOrAlias}`
|
/// # `POST /_matrix/client/*/knock/{roomIdOrAlias}`
|
||||||
@@ -408,6 +408,13 @@ async fn knock_room_helper_local(
|
|||||||
err!(BadServerResponse("Invalid make_knock event json received from server: {e:?}"))
|
err!(BadServerResponse("Invalid make_knock event json received from server: {e:?}"))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
validate_remote_member_event_stub(
|
||||||
|
&MembershipState::Knock,
|
||||||
|
sender_user,
|
||||||
|
room_id,
|
||||||
|
&knock_event_stub,
|
||||||
|
)?;
|
||||||
|
|
||||||
knock_event_stub.insert(
|
knock_event_stub.insert(
|
||||||
"origin".to_owned(),
|
"origin".to_owned(),
|
||||||
CanonicalJsonValue::String(services.globals.server_name().as_str().to_owned()),
|
CanonicalJsonValue::String(services.globals.server_name().as_str().to_owned()),
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ use ruma::{
|
|||||||
};
|
};
|
||||||
use service::Services;
|
use service::Services;
|
||||||
|
|
||||||
|
use super::validate_remote_member_event_stub;
|
||||||
use crate::Ruma;
|
use crate::Ruma;
|
||||||
|
|
||||||
/// # `POST /_matrix/client/v3/rooms/{roomId}/leave`
|
/// # `POST /_matrix/client/v3/rooms/{roomId}/leave`
|
||||||
@@ -324,6 +325,13 @@ pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
|
|||||||
)))
|
)))
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
validate_remote_member_event_stub(
|
||||||
|
&MembershipState::Leave,
|
||||||
|
user_id,
|
||||||
|
room_id,
|
||||||
|
&leave_event_stub,
|
||||||
|
)?;
|
||||||
|
|
||||||
// TODO: Is origin needed?
|
// TODO: Is origin needed?
|
||||||
leave_event_stub.insert(
|
leave_event_stub.insert(
|
||||||
"origin".to_owned(),
|
"origin".to_owned(),
|
||||||
|
|||||||
@@ -13,7 +13,14 @@ use std::net::IpAddr;
|
|||||||
use axum::extract::State;
|
use axum::extract::State;
|
||||||
use conduwuit::{Err, Result, warn};
|
use conduwuit::{Err, Result, warn};
|
||||||
use futures::{FutureExt, StreamExt};
|
use futures::{FutureExt, StreamExt};
|
||||||
use ruma::{OwnedRoomId, RoomId, ServerName, UserId, api::client::membership::joined_rooms};
|
use ruma::{
|
||||||
|
CanonicalJsonObject, OwnedRoomId, RoomId, ServerName, UserId,
|
||||||
|
api::client::membership::joined_rooms,
|
||||||
|
events::{
|
||||||
|
StaticEventContent,
|
||||||
|
room::member::{MembershipState, RoomMemberEventContent},
|
||||||
|
},
|
||||||
|
};
|
||||||
use service::Services;
|
use service::Services;
|
||||||
|
|
||||||
pub(crate) use self::{
|
pub(crate) use self::{
|
||||||
@@ -153,3 +160,80 @@ pub(crate) async fn banned_room_check(
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Validates that an event returned from a remote server by `/make_*`
|
||||||
|
/// actually is a membership event with the expected fields.
|
||||||
|
///
|
||||||
|
/// Without checking this, the remote server could use the remote membership
|
||||||
|
/// mechanism to trick our server into signing arbitrary malicious events.
|
||||||
|
pub(crate) fn validate_remote_member_event_stub(
|
||||||
|
membership: &MembershipState,
|
||||||
|
user_id: &UserId,
|
||||||
|
room_id: &RoomId,
|
||||||
|
event_stub: &CanonicalJsonObject,
|
||||||
|
) -> Result<()> {
|
||||||
|
let Some(event_type) = event_stub.get("type") else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing type field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
if event_type != &RoomMemberEventContent::TYPE {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with invalid event type"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(sender) = event_stub.get("sender") else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing sender field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
if sender != &user_id.as_str() {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with incorrect sender"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(state_key) = event_stub.get("state_key") else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing state_key field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
if state_key != &user_id.as_str() {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with incorrect state_key"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(event_room_id) = event_stub.get("room_id") else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing room_id field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
if event_room_id != &room_id.as_str() {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with incorrect room_id"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let Some(content) = event_stub
|
||||||
|
.get("content")
|
||||||
|
.and_then(|content| content.as_object())
|
||||||
|
else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing content field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
let Some(event_membership) = content.get("membership") else {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with missing membership field"
|
||||||
|
));
|
||||||
|
};
|
||||||
|
if event_membership != &membership.as_str() {
|
||||||
|
return Err!(BadServerResponse(
|
||||||
|
"Remote server returned member event with incorrect room_id"
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@@ -558,12 +558,19 @@ where
|
|||||||
// If type is m.room.power_levels
|
// If type is m.room.power_levels
|
||||||
if *incoming_event.event_type() == TimelineEventType::RoomPowerLevels {
|
if *incoming_event.event_type() == TimelineEventType::RoomPowerLevels {
|
||||||
debug!("starting m.room.power_levels check");
|
debug!("starting m.room.power_levels check");
|
||||||
|
let mut creators = BTreeSet::new();
|
||||||
|
if room_version.explicitly_privilege_room_creators {
|
||||||
|
creators.insert(create_event.sender().to_owned());
|
||||||
|
for creator in room_create_content.additional_creators.iter().flatten() {
|
||||||
|
creators.insert(creator.deserialize()?);
|
||||||
|
}
|
||||||
|
}
|
||||||
match check_power_levels(
|
match check_power_levels(
|
||||||
room_version,
|
room_version,
|
||||||
incoming_event,
|
incoming_event,
|
||||||
power_levels_event.as_ref(),
|
power_levels_event.as_ref(),
|
||||||
sender_power_level,
|
sender_power_level,
|
||||||
|
&creators,
|
||||||
) {
|
) {
|
||||||
| Some(required_pwr_lvl) =>
|
| Some(required_pwr_lvl) =>
|
||||||
if !required_pwr_lvl {
|
if !required_pwr_lvl {
|
||||||
@@ -1221,8 +1228,8 @@ fn check_power_levels(
|
|||||||
power_event: &impl Event,
|
power_event: &impl Event,
|
||||||
previous_power_event: Option<&impl Event>,
|
previous_power_event: Option<&impl Event>,
|
||||||
user_level: Int,
|
user_level: Int,
|
||||||
|
creators: &BTreeSet<OwnedUserId>,
|
||||||
) -> Option<bool> {
|
) -> Option<bool> {
|
||||||
// TODO(hydra): This function does not care about creators!
|
|
||||||
match power_event.state_key() {
|
match power_event.state_key() {
|
||||||
| Some("") => {},
|
| Some("") => {},
|
||||||
| Some(key) => {
|
| Some(key) => {
|
||||||
@@ -1287,6 +1294,10 @@ fn check_power_levels(
|
|||||||
for user in user_levels_to_check {
|
for user in user_levels_to_check {
|
||||||
let old_level = old_state.users.get(user);
|
let old_level = old_state.users.get(user);
|
||||||
let new_level = new_state.users.get(user);
|
let new_level = new_state.users.get(user);
|
||||||
|
if new_level.is_some() && creators.contains(user) {
|
||||||
|
warn!("creators cannot appear in the users list of m.room.power_levels");
|
||||||
|
return Some(false); // cannot alter creator power level
|
||||||
|
}
|
||||||
if old_level.is_some() && new_level.is_some() && old_level == new_level {
|
if old_level.is_some() && new_level.is_some() && old_level == new_level {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -64,15 +64,15 @@ standard = [
|
|||||||
"url_preview",
|
"url_preview",
|
||||||
"zstd_compression",
|
"zstd_compression",
|
||||||
"sentry_telemetry",
|
"sentry_telemetry",
|
||||||
"otlp_telemetry"
|
"otlp_telemetry",
|
||||||
|
"console",
|
||||||
]
|
]
|
||||||
full = [
|
full = [
|
||||||
"standard",
|
"standard",
|
||||||
# "hardened_malloc", # Conflicts with jemalloc
|
# "hardened_malloc", # Conflicts with jemalloc
|
||||||
"jemalloc_prof",
|
"jemalloc_prof",
|
||||||
"perf_measurements",
|
"perf_measurements",
|
||||||
"tokio_console"
|
"tokio_console",
|
||||||
# sentry_telemetry
|
|
||||||
]
|
]
|
||||||
|
|
||||||
blurhashing = [
|
blurhashing = [
|
||||||
|
|||||||
Reference in New Issue
Block a user