1
0
Fork 0

Try to join space rooms in link flow

This commit is contained in:
Cadence Ember 2025-02-18 01:30:28 +13:00
parent 6b919d2a82
commit 438714b67e
2 changed files with 83 additions and 81 deletions

View file

@ -7,7 +7,9 @@ const DiscordTypes = require("discord-api-types/v10")
const {discord, db, as, sync, select, from} = require("../../passthrough") const {discord, db, as, sync, select, from} = require("../../passthrough")
/** @type {import("../auth")} */ /** @type {import("../auth")} */
const auth = require("../auth") const auth = sync.require("../auth")
/** @type {import("../../matrix/mreq")} */
const mreq = sync.require("../../matrix/mreq")
const {reg} = require("../../matrix/read-registration") const {reg} = require("../../matrix/read-registration")
/** /**
@ -74,21 +76,23 @@ as.router.post("/api/link-space", defineEventHandler(async event => {
if (existing) throw createError({status: 400, message: "Bad Request", data: `Guild ID ${guildID} or space ID ${spaceID} are already bridged and cannot be reused`}) if (existing) throw createError({status: 400, message: "Bad Request", data: `Guild ID ${guildID} or space ID ${spaceID} are already bridged and cannot be reused`})
// Check space exists and bridge is joined // Check space exists and bridge is joined
const self = `@${reg.sender_localpart}:${reg.ooye.server_name}`
/** @type {Ty.Event.M_Room_Member?} */
let memberEvent = null
try { try {
memberEvent = await api.getStateEvent(spaceID, "m.room.member", self) await api.joinRoom(parsedBody.space_id)
} catch (e) {} } catch (e) {
if (memberEvent?.membership !== "join") throw createError({status: 400, message: "Bad Request", data: "Matrix space does not exist"}) if (e instanceof mreq.MatrixServerError) {
throw createError({status: 403, message: e.errcode, data: `${e.errcode} - ${e.message}`})
}
throw e
}
// Check bridge has PL 100 // Check bridge has PL 100
const me = `@${reg.sender_localpart}:${reg.ooye.server_name}`
/** @type {Ty.Event.M_Power_Levels?} */ /** @type {Ty.Event.M_Power_Levels?} */
let powerLevelsStateContent = null let powerLevelsStateContent = null
try { try {
powerLevelsStateContent = await api.getStateEvent(spaceID, "m.room.power_levels", "") powerLevelsStateContent = await api.getStateEvent(spaceID, "m.room.power_levels", "")
} catch (e) {} } catch (e) {}
const selfPowerLevel = powerLevelsStateContent?.users?.[self] || powerLevelsStateContent?.users_default || 0 const selfPowerLevel = powerLevelsStateContent?.users?.[me] || powerLevelsStateContent?.users_default || 0
if (selfPowerLevel < (powerLevelsStateContent?.state_default || 50) || selfPowerLevel < 100) throw createError({status: 400, message: "Bad Request", data: "OOYE needs power level 100 (admin) in the target Matrix space"}) if (selfPowerLevel < (powerLevelsStateContent?.state_default || 50) || selfPowerLevel < 100) throw createError({status: 400, message: "Bad Request", data: "OOYE needs power level 100 (admin) in the target Matrix space"})
// Check inviting user is a moderator in the space // Check inviting user is a moderator in the space
@ -141,21 +145,23 @@ as.router.post("/api/link", defineEventHandler(async event => {
if (!Array.isArray(spaceChildEvent?.via)) throw createError({status: 400, message: "Bad Request", data: "Matrix room needs to be part of the bridged space"}) if (!Array.isArray(spaceChildEvent?.via)) throw createError({status: 400, message: "Bad Request", data: "Matrix room needs to be part of the bridged space"})
// Check room exists and bridge is joined // Check room exists and bridge is joined
const self = `@${reg.sender_localpart}:${reg.ooye.server_name}`
/** @type {Ty.Event.M_Room_Member?} */
let memberEvent = null
try { try {
memberEvent = await api.getStateEvent(parsedBody.matrix, "m.room.member", self) await api.joinRoom(parsedBody.matrix)
} catch (e) {} } catch (e) {
if (memberEvent?.membership !== "join") throw createError({status: 400, message: "Bad Request", data: "Matrix room does not exist"}) if (e instanceof mreq.MatrixServerError) {
throw createError({status: 403, message: e.errcode, data: `${e.errcode} - ${e.message}`})
}
throw e
}
// Check bridge has PL 100 // Check bridge has PL 100
const me = `@${reg.sender_localpart}:${reg.ooye.server_name}`
/** @type {Ty.Event.M_Power_Levels?} */ /** @type {Ty.Event.M_Power_Levels?} */
let powerLevelsStateContent = null let powerLevelsStateContent = null
try { try {
powerLevelsStateContent = await api.getStateEvent(parsedBody.matrix, "m.room.power_levels", "") powerLevelsStateContent = await api.getStateEvent(parsedBody.matrix, "m.room.power_levels", "")
} catch (e) {} } catch (e) {}
const selfPowerLevel = powerLevelsStateContent?.users?.[self] || powerLevelsStateContent?.users_default || 0 const selfPowerLevel = powerLevelsStateContent?.users?.[me] || powerLevelsStateContent?.users_default || 0
if (selfPowerLevel < (powerLevelsStateContent?.state_default || 50) || selfPowerLevel < 100) throw createError({status: 400, message: "Bad Request", data: "OOYE needs power level 100 (admin) in the target Matrix room"}) if (selfPowerLevel < (powerLevelsStateContent?.state_default || 50) || selfPowerLevel < 100) throw createError({status: 400, message: "Bad Request", data: "OOYE needs power level 100 (admin) in the target Matrix room"})
// Insert database entry // Insert database entry

View file

@ -71,16 +71,13 @@ test("web link space: check that OOYE is joined", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async getStateEvent(roomID, type, key) { async joinRoom(roomID) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") throw new MatrixServerError({errcode: "M_FORBIDDEN", error: "not allowed to join I guess"})
t.equal(type, "m.room.member")
t.equal(key, "@_ooye_bot:cadence.moe")
throw new MatrixServerError({errcode: "M_NOT_FOUND", error: "join the room or something"})
} }
} }
})) }))
t.equal(error.data, "Matrix space does not exist") t.equal(error.data, "M_FORBIDDEN - not allowed to join I guess")
t.equal(called, 1) t.equal(called, 1)
}) })
@ -96,17 +93,17 @@ test("web link space: check that OOYE has PL 100 (not missing)", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
if (type === "m.room.member") { t.equal(type, "m.room.power_levels")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
throw new MatrixServerError({errcode: "M_NOT_FOUND", error: "what if I told you that power levels never existed"}) throw new MatrixServerError({errcode: "M_NOT_FOUND", error: "what if I told you that power levels never existed"})
} }
} }
}
})) }))
t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space") t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space")
t.equal(called, 2) t.equal(called, 2)
@ -124,18 +121,18 @@ test("web link space: check that OOYE has PL 100 (not users_default)", async t =
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
if (type === "m.room.member") { t.equal(type, "m.room.power_levels")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
t.equal(key, "") t.equal(key, "")
return {} return {}
} }
} }
}
})) }))
t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space") t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space")
t.equal(called, 2) t.equal(called, 2)
@ -153,18 +150,18 @@ test("web link space: check that OOYE has PL 100 (not 50)", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
if (type === "m.room.member") { t.equal(type, "m.room.power_levels")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
t.equal(key, "") t.equal(key, "")
return {users: {"@_ooye_bot:cadence.moe": 50}} return {users: {"@_ooye_bot:cadence.moe": 50}}
} }
} }
}
})) }))
t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space") t.equal(error.data, "OOYE needs power level 100 (admin) in the target Matrix space")
t.equal(called, 2) t.equal(called, 2)
@ -182,18 +179,18 @@ test("web link space: check that inviting user has PL 50", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
if (type === "m.room.member") { t.equal(type, "m.room.power_levels")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
t.equal(key, "") t.equal(key, "")
return {users: {"@_ooye_bot:cadence.moe": 100}} return {users: {"@_ooye_bot:cadence.moe": 100}}
} }
} }
}
})) }))
t.equal(error.data, "You need to be at least power level 50 (moderator) in the target Matrix space to set up OOYE, but you are currently power level 0.") t.equal(error.data, "You need to be at least power level 50 (moderator) in the target Matrix space to set up OOYE, but you are currently power level 0.")
t.equal(called, 2) t.equal(called, 2)
@ -211,18 +208,18 @@ test("web link space: successfully adds entry to database and loads page", async
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
if (type === "m.room.member") { t.equal(type, "m.room.power_levels")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
t.equal(key, "") t.equal(key, "")
return {users: {"@_ooye_bot:cadence.moe": 100, "@cadence:cadence.moe": 50}} return {users: {"@_ooye_bot:cadence.moe": 100, "@cadence:cadence.moe": 50}}
} }
} }
}
}) })
t.equal(called, 2) t.equal(called, 2)
@ -397,7 +394,7 @@ test("web link room: check that room is part of space (event empty)", async t =>
t.equal(called, 1) t.equal(called, 1)
}) })
test("web link room: check that bridge is joined to room", async t => { test("web link room: check that bridge can join room", async t => {
let called = 0 let called = 0
const [error] = await tryToCatch(() => router.test("post", "/api/link", { const [error] = await tryToCatch(() => router.test("post", "/api/link", {
sessionData: { sessionData: {
@ -409,21 +406,20 @@ test("web link room: check that bridge is joined to room", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
throw new MatrixServerError({errcode: "M_FORBIDDEN", error: "not allowed to join I guess"})
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
if (type === "m.room.member") { t.equal(type, "m.space.child")
t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
t.equal(key, "@_ooye_bot:cadence.moe")
throw new MatrixServerError({errcode: "M_NOT_FOUND", error: "not in the room I guess"})
} else if (type === "m.space.child") {
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe") t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
return {via: ["cadence.moe"]} return {via: ["cadence.moe"]}
} }
} }
}
})) }))
t.equal(error.data, "Matrix room does not exist") t.equal(error.data, "M_FORBIDDEN - not allowed to join I guess")
t.equal(called, 2) t.equal(called, 2)
}) })
@ -439,13 +435,13 @@ test("web link room: check that bridge has PL 100 in target room (event missing)
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
if (type === "m.room.member") { if (type === "m.space.child") {
t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.space.child") {
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe") t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
return {via: ["cadence.moe"]} return {via: ["cadence.moe"]}
@ -473,13 +469,13 @@ test("web link room: check that bridge has PL 100 in target room (users default)
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
if (type === "m.room.member") { if (type === "m.space.child") {
t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.space.child") {
t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe") t.equal(roomID, "!zTMspHVUBhFLLSdmnS:cadence.moe")
t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe") t.equal(key, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
return {via: ["cadence.moe"]} return {via: ["cadence.moe"]}
@ -507,13 +503,13 @@ test("web link room: successfully calls createRoom", async t => {
guild_id: "665289423482519565" guild_id: "665289423482519565"
}, },
api: { api: {
async joinRoom(roomID) {
called++
return roomID
},
async getStateEvent(roomID, type, key) { async getStateEvent(roomID, type, key) {
called++ called++
if (type === "m.room.member") { if (type === "m.room.power_levels") {
t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
t.equal(key, "@_ooye_bot:cadence.moe")
return {membership: "join"}
} else if (type === "m.room.power_levels") {
t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe") t.equal(roomID, "!NDbIqNpJyPvfKRnNcr:cadence.moe")
t.equal(key, "") t.equal(key, "")
return {users: {"@_ooye_bot:cadence.moe": 100}} return {users: {"@_ooye_bot:cadence.moe": 100}}