1
0
Fork 0
ruma/crates/ruma-common/tests/it/canonical_json/redaction.rs
Kévin Commaille 4c68191496 canonical-json: Improve redaction tests
Move unit tests as integration tests, and add more of them.
2026-04-03 09:30:21 +02:00

523 lines
16 KiB
Rust

use assert_matches2::assert_let;
use ruma_common::{
canonical_json::{CanonicalJsonValue, assert_to_canonical_json_eq, redact},
room_version_rules::RedactionRules,
};
use serde_json::json;
#[test]
fn redact_power_levels() {
let original_event = json!({
"content": {
"ban": 50,
"events": {
"m.room.avatar": 50,
"m.room.canonical_alias": 50,
"m.room.history_visibility": 100,
"m.room.name": 50,
"m.room.power_levels": 100
},
"events_default": 0,
"invite": 0,
"kick": 50,
"redact": 50,
"state_default": 50,
"users": {
"@example:localhost": 100
},
"users_default": 0
},
"event_id": "$15139375512JaHAW:localhost",
"origin_server_ts": 45,
"sender": "@example:localhost",
"room_id": "!room:localhost",
"state_key": "",
"type": "m.room.power_levels",
"unsigned": {
"age": 45
}
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In room v1, most of the content keys are kept except `invite`.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"ban": 50,
"events": {
"m.room.avatar": 50,
"m.room.canonical_alias": 50,
"m.room.history_visibility": 100,
"m.room.name": 50,
"m.room.power_levels": 100
},
"events_default": 0,
"kick": 50,
"redact": 50,
"state_default": 50,
"users": {
"@example:localhost": 100
},
"users_default": 0
},
"event_id": "$15139375512JaHAW:localhost",
"origin_server_ts": 45,
"sender": "@example:localhost",
"room_id": "!room:localhost",
"state_key": "",
"type": "m.room.power_levels",
})
);
// In room v11, the `invite` key is also kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"ban": 50,
"events": {
"m.room.avatar": 50,
"m.room.canonical_alias": 50,
"m.room.history_visibility": 100,
"m.room.name": 50,
"m.room.power_levels": 100
},
"events_default": 0,
"invite": 0,
"kick": 50,
"redact": 50,
"state_default": 50,
"users": {
"@example:localhost": 100
},
"users_default": 0
},
"event_id": "$15139375512JaHAW:localhost",
"origin_server_ts": 45,
"sender": "@example:localhost",
"room_id": "!room:localhost",
"state_key": "",
"type": "m.room.power_levels",
})
);
}
#[test]
fn redact_room_aliases() {
let original_event = json!({
"content": {
"aliases": ["#somewhere:localhost"]
},
"event_id": "$152037280074GZeOm:localhost",
"origin_server_ts": 1,
"sender": "@example:localhost",
"state_key": "room.com",
"room_id": "!room:room.com",
"type": "m.room.aliases",
"unsigned": {
"age": 1
}
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In room v1, the aliases are kept.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"aliases": ["#somewhere:localhost"]
},
"event_id": "$152037280074GZeOm:localhost",
"origin_server_ts": 1,
"sender": "@example:localhost",
"state_key": "room.com",
"room_id": "!room:room.com",
"type": "m.room.aliases",
})
);
// In room v11, all the content keys are removed.
let redacted = redact(original_object, &RedactionRules::V9, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {},
"event_id": "$152037280074GZeOm:localhost",
"origin_server_ts": 1,
"sender": "@example:localhost",
"state_key": "room.com",
"room_id": "!room:room.com",
"type": "m.room.aliases",
})
);
}
#[test]
fn redact_room_create() {
let original_event = json!({
"content": {
"creator": "@example:example.org",
"m.federate": true,
"predecessor": {
"event_id": "$something",
"room_id": "!oldroom:example.org"
},
"room_version": "11",
"local.custom.key": "foo",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.create",
"unsigned": {
"age": 1234,
},
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In room v1, only the creator is kept.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"creator": "@example:example.org",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.create",
})
);
// In room v11, all the content keys are kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"creator": "@example:example.org",
"m.federate": true,
"predecessor": {
"event_id": "$something",
"room_id": "!oldroom:example.org"
},
"room_version": "11",
"local.custom.key": "foo",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.create",
})
);
}
#[test]
fn redact_room_member_third_party_invite() {
let original_event = json!({
"content": {
"membership": "invite",
"displayname": "Example",
"third_party_invite": {
"display_name": "example",
"signed": {
"mxid": "@alice:example.org",
"signatures": {
"magic.forest": {
"ed25519:3": "fQpGIW1Snz+pwLZu6sTy2aHy/DYWWTspTJRPyNp0PKkymfIsNffysMl6ObMMFdIJhk6g6pwlIqZ54rxo8SLmAg"
}
},
"token": "abc123"
}
}
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@alice:example.org",
"type": "m.room.member",
"unsigned": {
"age": 1234,
},
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In room v1, only `membership` is kept.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"membership": "invite",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@alice:example.org",
"type": "m.room.member",
})
);
// In room v11, `membership` and `third_party_invite.signed` are kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"membership": "invite",
"third_party_invite": {
"signed": {
"mxid": "@alice:example.org",
"signatures": {
"magic.forest": {
"ed25519:3": "fQpGIW1Snz+pwLZu6sTy2aHy/DYWWTspTJRPyNp0PKkymfIsNffysMl6ObMMFdIJhk6g6pwlIqZ54rxo8SLmAg"
}
},
"token": "abc123"
}
}
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@alice:example.org",
"type": "m.room.member",
})
);
}
#[test]
fn redact_room_member_join_authorised_via_users_server() {
let original_event = json!({
"content": {
"membership": "join",
"displayname": "Example",
"join_authorised_via_users_server": "@alice:example.org",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@example:example.org",
"type": "m.room.member",
"unsigned": {
"age": 1234,
},
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In room v1, only `membership` is kept.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"membership": "join",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@example:example.org",
"type": "m.room.member",
})
);
// In room v11, `membership` and `join_authorised_via_users_server` are kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"membership": "join",
"join_authorised_via_users_server": "@alice:example.org",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "@example:example.org",
"type": "m.room.member",
})
);
}
#[test]
fn redact_room_join_rules() {
let original_event = json!({
"content": {
"join_rule": "restricted",
"allow": [
{
"room_id": "!other:example.org",
"type": "m.room_membership",
},
],
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.join_rules",
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In v1, only `join_rule` is kept.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"join_rule": "restricted",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.join_rules",
})
);
// In v11, `join_rule` and `allow` are kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"join_rule": "restricted",
"allow": [
{
"room_id": "!other:example.org",
"type": "m.room_membership",
},
],
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.join_rules",
})
);
}
#[test]
fn redact_room_history_visibility() {
let original_event = json!({
"content": {
"history_visibility": "invited",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.history_visibility",
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// `history_visibility` is kept.
let redacted = redact(original_object, &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"history_visibility": "invited",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.history_visibility",
})
);
}
#[test]
fn redact_room_redaction() {
let original_event = json!({
"content": {
"reason": "Spamming",
"redacts": "$fukweghifu23",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"type": "m.room.redaction",
"redacts": "$fukweghifu23",
});
assert_let!(
Ok(CanonicalJsonValue::Object(original_object)) =
CanonicalJsonValue::try_from(original_event)
);
// In v1, all content keys are redacted.
let redacted = redact(original_object.clone(), &RedactionRules::V1, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"type": "m.room.redaction",
})
);
// In v11, the `redacts` key is kept.
let redacted = redact(original_object, &RedactionRules::V11, None).unwrap();
assert_to_canonical_json_eq!(
redacted,
json!({
"content": {
"redacts": "$fukweghifu23",
},
"event_id": "$143273582443PhrSn",
"origin_server_ts": 1_432_735,
"room_id": "!jEsUZKDJdhlrceRyVU:example.org",
"sender": "@example:example.org",
"type": "m.room.redaction",
})
);
}