mirror of
https://forgejo.ellis.link/continuwuation/continuwuity.git
synced 2026-05-26 20:49:55 +00:00
Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8cfdbec237 | |||
| 584284968a | |||
| 57fec44ec7 | |||
| bc8d304dbf | |||
| 7f4248a8c6 | |||
| 430200b60e |
@@ -32,12 +32,12 @@ jobs:
|
|||||||
echo "Debian distribution: $DISTRIBUTION ($VERSION)"
|
echo "Debian distribution: $DISTRIBUTION ($VERSION)"
|
||||||
|
|
||||||
- name: Checkout repository with full history
|
- name: Checkout repository with full history
|
||||||
uses: https://code.forgejo.org/actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Cache Cargo registry
|
- name: Cache Cargo registry
|
||||||
uses: https://code.forgejo.org/actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cargo/registry
|
~/.cargo/registry
|
||||||
@@ -126,7 +126,7 @@ jobs:
|
|||||||
[ -f /etc/conduwuit/conduwuit.toml ] && echo "✅ Config file installed"
|
[ -f /etc/conduwuit/conduwuit.toml ] && echo "✅ Config file installed"
|
||||||
|
|
||||||
- name: Upload deb artifact
|
- name: Upload deb artifact
|
||||||
uses: https://code.forgejo.org/actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: continuwuity-${{ steps.debian-version.outputs.distribution }}
|
name: continuwuity-${{ steps.debian-version.outputs.distribution }}
|
||||||
path: ${{ steps.cargo-deb.outputs.path }}
|
path: ${{ steps.cargo-deb.outputs.path }}
|
||||||
|
|||||||
@@ -30,13 +30,13 @@ jobs:
|
|||||||
echo "Fedora version: $VERSION"
|
echo "Fedora version: $VERSION"
|
||||||
|
|
||||||
- name: Checkout repository with full history
|
- name: Checkout repository with full history
|
||||||
uses: https://code.forgejo.org/actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
|
||||||
- name: Cache DNF packages
|
- name: Cache DNF packages
|
||||||
uses: https://code.forgejo.org/actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
/var/cache/dnf
|
/var/cache/dnf
|
||||||
@@ -46,7 +46,7 @@ jobs:
|
|||||||
dnf-fedora${{ steps.fedora.outputs.version }}-
|
dnf-fedora${{ steps.fedora.outputs.version }}-
|
||||||
|
|
||||||
- name: Cache Cargo registry
|
- name: Cache Cargo registry
|
||||||
uses: https://code.forgejo.org/actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cargo/registry
|
~/.cargo/registry
|
||||||
@@ -56,7 +56,7 @@ jobs:
|
|||||||
cargo-fedora${{ steps.fedora.outputs.version }}-
|
cargo-fedora${{ steps.fedora.outputs.version }}-
|
||||||
|
|
||||||
- name: Cache Rust build dependencies
|
- name: Cache Rust build dependencies
|
||||||
uses: https://code.forgejo.org/actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/rpmbuild/BUILD/*/target/release/deps
|
~/rpmbuild/BUILD/*/target/release/deps
|
||||||
@@ -238,13 +238,13 @@ jobs:
|
|||||||
cp $BIN_RPM upload-bin/
|
cp $BIN_RPM upload-bin/
|
||||||
|
|
||||||
- name: Upload binary RPM
|
- name: Upload binary RPM
|
||||||
uses: https://code.forgejo.org/actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: continuwuity
|
name: continuwuity
|
||||||
path: upload-bin/
|
path: upload-bin/
|
||||||
|
|
||||||
- name: Upload debug RPM artifact
|
- name: Upload debug RPM artifact
|
||||||
uses: https://code.forgejo.org/actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: continuwuity-debug
|
name: continuwuity-debug
|
||||||
path: artifacts/*debuginfo*.rpm
|
path: artifacts/*debuginfo*.rpm
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Sync repository
|
- name: Sync repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
DOCKER_MIRROR_TOKEN: ${{ secrets.DOCKER_MIRROR_TOKEN }}
|
DOCKER_MIRROR_TOKEN: ${{ secrets.DOCKER_MIRROR_TOKEN }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Prepare Docker build environment
|
- name: Prepare Docker build environment
|
||||||
@@ -97,7 +97,7 @@ jobs:
|
|||||||
needs: build-release
|
needs: build-release
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Create multi-platform manifest
|
- name: Create multi-platform manifest
|
||||||
@@ -130,7 +130,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Prepare max-perf Docker build environment
|
- name: Prepare max-perf Docker build environment
|
||||||
@@ -184,7 +184,7 @@ jobs:
|
|||||||
needs: build-maxperf
|
needs: build-maxperf
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Create max-perf manifest
|
- name: Create max-perf manifest
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ jobs:
|
|||||||
options: --tmpfs /tmp:exec
|
options: --tmpfs /tmp:exec
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
show-progress: false
|
show-progress: false
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
update-flake-hashes:
|
update-flake-hashes:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: https://code.forgejo.org/actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5
|
- uses: actions/checkout@v6
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
fetch-tags: false
|
fetch-tags: false
|
||||||
|
|||||||
+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.0
|
ENV BINSTALL_VERSION=1.16.2
|
||||||
# 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.0
|
ENV BINSTALL_VERSION=1.16.2
|
||||||
# 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
|
||||||
|
|||||||
@@ -97,6 +97,9 @@ rec {
|
|||||||
craneLib.buildPackage (
|
craneLib.buildPackage (
|
||||||
(commonAttrs commonAttrsArgs)
|
(commonAttrs commonAttrsArgs)
|
||||||
// {
|
// {
|
||||||
|
postFixup = ''
|
||||||
|
patchelf --set-rpath "$(${pkgs.patchelf}/bin/patchelf --print-rpath $out/bin/${crateInfo.pname}):${rocksdb}/lib" $out/bin/${crateInfo.pname}
|
||||||
|
'';
|
||||||
cargoArtifacts = deps;
|
cargoArtifacts = deps;
|
||||||
doCheck = true;
|
doCheck = true;
|
||||||
env = uwuenv.buildPackageEnv // rocksdbEnv;
|
env = uwuenv.buildPackageEnv // rocksdbEnv;
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
use std::{collections::BTreeMap, fmt::Write as _};
|
use std::{
|
||||||
|
collections::{BTreeMap, HashSet},
|
||||||
|
fmt::Write as _,
|
||||||
|
};
|
||||||
|
|
||||||
use api::client::{
|
use api::client::{
|
||||||
full_user_deactivate, join_room_by_id_helper, leave_all_rooms, leave_room, remote_leave_room,
|
full_user_deactivate, join_room_by_id_helper, leave_all_rooms, leave_room, remote_leave_room,
|
||||||
@@ -12,7 +15,7 @@ use conduwuit::{
|
|||||||
};
|
};
|
||||||
use futures::{FutureExt, StreamExt};
|
use futures::{FutureExt, StreamExt};
|
||||||
use ruma::{
|
use ruma::{
|
||||||
OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedUserId, UserId,
|
OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedServerName, OwnedUserId, UserId,
|
||||||
events::{
|
events::{
|
||||||
RoomAccountDataEventType, StateEventType,
|
RoomAccountDataEventType, StateEventType,
|
||||||
room::{
|
room::{
|
||||||
@@ -950,23 +953,38 @@ pub(super) async fn force_leave_remote_room(
|
|||||||
&self,
|
&self,
|
||||||
user_id: String,
|
user_id: String,
|
||||||
room_id: OwnedRoomOrAliasId,
|
room_id: OwnedRoomOrAliasId,
|
||||||
|
via: Option<String>,
|
||||||
) -> Result {
|
) -> Result {
|
||||||
let user_id = parse_local_user_id(self.services, &user_id)?;
|
let user_id = parse_local_user_id(self.services, &user_id)?;
|
||||||
let (room_id, _) = self
|
let (room_id, vias_raw) = self
|
||||||
.services
|
.services
|
||||||
.rooms
|
.rooms
|
||||||
.alias
|
.alias
|
||||||
.resolve_with_servers(&room_id, None)
|
.resolve_with_servers(
|
||||||
|
&room_id,
|
||||||
|
if let Some(v) = via.clone() {
|
||||||
|
Some(vec![OwnedServerName::parse(v)?])
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
},
|
||||||
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
assert!(
|
assert!(
|
||||||
self.services.globals.user_is_local(&user_id),
|
self.services.globals.user_is_local(&user_id),
|
||||||
"Parsed user_id must be a local user"
|
"Parsed user_id must be a local user"
|
||||||
);
|
);
|
||||||
remote_leave_room(self.services, &user_id, &room_id, None)
|
let mut vias: HashSet<OwnedServerName> = HashSet::new();
|
||||||
|
if let Some(via) = via {
|
||||||
|
vias.insert(OwnedServerName::parse(via)?);
|
||||||
|
}
|
||||||
|
for server in vias_raw {
|
||||||
|
vias.insert(server);
|
||||||
|
}
|
||||||
|
remote_leave_room(self.services, &user_id, &room_id, None, vias)
|
||||||
.boxed()
|
.boxed()
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
self.write_str(&format!("{user_id} has been joined to {room_id}.",))
|
self.write_str(&format!("{user_id} successfully left {room_id} via remote server."))
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ pub enum UserCommand {
|
|||||||
ForceLeaveRemoteRoom {
|
ForceLeaveRemoteRoom {
|
||||||
user_id: String,
|
user_id: String,
|
||||||
room_id: OwnedRoomOrAliasId,
|
room_id: OwnedRoomOrAliasId,
|
||||||
|
via: Option<String>,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// - Forces the specified user to drop their power levels to the room
|
/// - Forces the specified user to drop their power levels to the room
|
||||||
|
|||||||
@@ -131,9 +131,10 @@ pub async fn leave_room(
|
|||||||
|
|
||||||
// Ask a remote server if we don't have this room and are not knocking on it
|
// Ask a remote server if we don't have this room and are not knocking on it
|
||||||
if dont_have_room.and(not_knocked).await {
|
if dont_have_room.and(not_knocked).await {
|
||||||
if let Err(e) = remote_leave_room(services, user_id, room_id, reason.clone())
|
if let Err(e) =
|
||||||
.boxed()
|
remote_leave_room(services, user_id, room_id, reason.clone(), HashSet::new())
|
||||||
.await
|
.boxed()
|
||||||
|
.await
|
||||||
{
|
{
|
||||||
warn!(%user_id, "Failed to leave room {room_id} remotely: {e}");
|
warn!(%user_id, "Failed to leave room {room_id} remotely: {e}");
|
||||||
// Don't tell the client about this error
|
// Don't tell the client about this error
|
||||||
@@ -215,22 +216,25 @@ pub async fn leave_room(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn remote_leave_room(
|
pub async fn remote_leave_room<S: ::std::hash::BuildHasher>(
|
||||||
services: &Services,
|
services: &Services,
|
||||||
user_id: &UserId,
|
user_id: &UserId,
|
||||||
room_id: &RoomId,
|
room_id: &RoomId,
|
||||||
reason: Option<String>,
|
reason: Option<String>,
|
||||||
|
mut servers: HashSet<OwnedServerName, S>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut make_leave_response_and_server =
|
let mut make_leave_response_and_server =
|
||||||
Err!(BadServerResponse("No remote server available to assist in leaving {room_id}."));
|
Err!(BadServerResponse("No remote server available to assist in leaving {room_id}."));
|
||||||
|
|
||||||
let mut servers: HashSet<OwnedServerName> = services
|
servers.extend(
|
||||||
.rooms
|
services
|
||||||
.state_cache
|
.rooms
|
||||||
.servers_invite_via(room_id)
|
.state_cache
|
||||||
.map(ToOwned::to_owned)
|
.servers_invite_via(room_id)
|
||||||
.collect()
|
.map(ToOwned::to_owned)
|
||||||
.await;
|
.collect::<HashSet<OwnedServerName>>()
|
||||||
|
.await,
|
||||||
|
);
|
||||||
|
|
||||||
match services
|
match services
|
||||||
.rooms
|
.rooms
|
||||||
@@ -277,6 +281,11 @@ pub async fn remote_leave_room(
|
|||||||
if let Some(room_id_server_name) = room_id.server_name() {
|
if let Some(room_id_server_name) = room_id.server_name() {
|
||||||
servers.insert(room_id_server_name.to_owned());
|
servers.insert(room_id_server_name.to_owned());
|
||||||
}
|
}
|
||||||
|
if servers.is_empty() {
|
||||||
|
return Err!(BadServerResponse(warn!(
|
||||||
|
"No remote servers found to assist in leaving {room_id}."
|
||||||
|
)));
|
||||||
|
}
|
||||||
|
|
||||||
debug_info!("servers in remote_leave_room: {servers:?}");
|
debug_info!("servers in remote_leave_room: {servers:?}");
|
||||||
|
|
||||||
@@ -284,7 +293,7 @@ pub async fn remote_leave_room(
|
|||||||
let make_leave_response = services
|
let make_leave_response = services
|
||||||
.sending
|
.sending
|
||||||
.send_federation_request(
|
.send_federation_request(
|
||||||
&remote_server,
|
remote_server.as_ref(),
|
||||||
federation::membership::prepare_leave_event::v1::Request {
|
federation::membership::prepare_leave_event::v1::Request {
|
||||||
room_id: room_id.to_owned(),
|
room_id: room_id.to_owned(),
|
||||||
user_id: user_id.to_owned(),
|
user_id: user_id.to_owned(),
|
||||||
@@ -292,11 +301,21 @@ pub async fn remote_leave_room(
|
|||||||
)
|
)
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
make_leave_response_and_server = make_leave_response.map(|r| (r, remote_server));
|
let error = make_leave_response.as_ref().err().map(ToString::to_string);
|
||||||
|
make_leave_response_and_server = make_leave_response.map(|r| (r, remote_server.clone()));
|
||||||
|
|
||||||
if make_leave_response_and_server.is_ok() {
|
if make_leave_response_and_server.is_ok() {
|
||||||
|
debug_info!(
|
||||||
|
"Received make_leave_response from {} for leaving {room_id}",
|
||||||
|
remote_server
|
||||||
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
debug_warn!(
|
||||||
|
"Failed to get make_leave_response from {} for leaving {room_id}: {}",
|
||||||
|
remote_server,
|
||||||
|
error.unwrap()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (make_leave_response, remote_server) = make_leave_response_and_server?;
|
let (make_leave_response, remote_server) = make_leave_response_and_server?;
|
||||||
@@ -304,13 +323,14 @@ pub async fn remote_leave_room(
|
|||||||
let Some(room_version_id) = make_leave_response.room_version else {
|
let Some(room_version_id) = make_leave_response.room_version else {
|
||||||
return Err!(BadServerResponse(warn!(
|
return Err!(BadServerResponse(warn!(
|
||||||
"No room version was returned by {remote_server} for {room_id}, room version is \
|
"No room version was returned by {remote_server} for {room_id}, room version is \
|
||||||
likely not supported by conduwuit"
|
likely not supported by continuwuity"
|
||||||
)));
|
)));
|
||||||
};
|
};
|
||||||
|
|
||||||
if !services.server.supported_room_version(&room_version_id) {
|
if !services.server.supported_room_version(&room_version_id) {
|
||||||
return Err!(BadServerResponse(warn!(
|
return Err!(BadServerResponse(warn!(
|
||||||
"Remote room version {room_version_id} for {room_id} is not supported by conduwuit",
|
"Remote room version {room_version_id} for {room_id} is not supported by \
|
||||||
|
continuwuity",
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user