Compare commits

..

9 Commits

4 changed files with 58 additions and 10 deletions

View File

@ -1,5 +1,5 @@
variables: variables:
- &node_image 'node:21.1.0-alpine' - &node_image 'node:20.8.1-alpine'
- &create_synapse_access_token >- - &create_synapse_access_token >-
echo '{"user_id":"ci-dummy","access_token":"ci-dummy","home_server":"ci-dummy","device_id":"ci-dummy"}' > src/config/synapse_access_token.json echo '{"user_id":"ci-dummy","access_token":"ci-dummy","home_server":"ci-dummy","device_id":"ci-dummy"}' > src/config/synapse_access_token.json

View File

@ -144,7 +144,20 @@ export async function handle(rcMessage: RcMessage): Promise<void> {
) )
return return
} }
const roomCreatorId = (
await axios.get(`/_synapse/admin/v1/rooms/${room_id}`)
).data.creator
if (!roomCreatorId) {
log.warn(
`Could not determine room creator for room ${room_id}, using admin credentials.`
)
}
if (roomCreatorId == matrixUser) {
log.warn(
`Room creator ${roomCreatorId} left rocketchat room ${room_id}, skipping to prevent being unable to rejoin.`
)
return
}
log.http(`User ${matrixUser} leaves room ${room_id}`) log.http(`User ${matrixUser} leaves room ${room_id}`)
await axios.post( await axios.post(
`/_matrix/client/v3/rooms/${room_id}/leave`, `/_matrix/client/v3/rooms/${room_id}/leave`,

View File

@ -4,7 +4,7 @@ import adminAccessToken from '../config/synapse_access_token.json'
import { IdMapping } from '../entity/IdMapping' import { IdMapping } from '../entity/IdMapping'
import log from '../helpers/logger' import log from '../helpers/logger'
import { createMembership, getUserId, save } from '../helpers/storage' import { createMembership, getUserId, save } from '../helpers/storage'
import { axios } from '../helpers/synapse' import { axios, getUserDomain } from '../helpers/synapse'
export type RcUser = { export type RcUser = {
_id: string _id: string
@ -32,6 +32,12 @@ export type AccessToken = {
user_id: string user_id: string
} }
export type UserInfo = {
admin: boolean
displayname: string
name: string
}
export function mapUser(rcUser: RcUser): MatrixUser { export function mapUser(rcUser: RcUser): MatrixUser {
return { return {
user_id: '', user_id: '',
@ -75,6 +81,13 @@ async function registerUser(user: MatrixUser): Promise<AccessToken> {
return (await axios.post('/_synapse/admin/v1/register', user)).data return (await axios.post('/_synapse/admin/v1/register', user)).data
} }
async function getUserData(user: MatrixUser): Promise<UserInfo> {
return (await axios.get('/_synapse/admin/v2/users/@' + user.username + ":" + getUserDomain())).data
}
async function loginUser(user: MatrixUser): Promise<AccessToken> {
return (await axios.post('/_synapse/admin/v1/users/@' + user.username + ":" + getUserDomain() + "/login")).data
}
async function parseUserMemberships(rcUser: RcUser): Promise<void> { async function parseUserMemberships(rcUser: RcUser): Promise<void> {
await Promise.all( await Promise.all(
rcUser.__rooms.map(async (rcRoomId: string) => { rcUser.__rooms.map(async (rcRoomId: string) => {
@ -117,12 +130,30 @@ export async function createMapping(
export async function createUser(rcUser: RcUser): Promise<MatrixUser> { export async function createUser(rcUser: RcUser): Promise<MatrixUser> {
const user = mapUser(rcUser) const user = mapUser(rcUser)
const nonce = await getUserRegistrationNonce() var user_exists = false;
const mac = generateHmac({ ...user, nonce }) try {
const accessToken = await registerUser({ ...user, nonce, mac }) await getUserData(user)
user.user_id = accessToken.user_id user_exists = true
user.access_token = accessToken.access_token } catch (error) {
log.info(`User ${rcUser.username} created:`, user) user_exists = false
}
if (user_exists) {
const userData = await getUserData(user)
user.user_id = userData.name
user.displayname = userData.displayname
user.admin = user.admin || userData.admin
const accessToken = await loginUser(user)
user.access_token = accessToken.access_token
log.info(`User ${rcUser.username} exists:`, user)
} else {
const nonce = await getUserRegistrationNonce()
const mac = generateHmac({ ...user, nonce })
const accessToken = await registerUser({ ...user, nonce, mac })
user.user_id = accessToken.user_id
user.access_token = accessToken.access_token
log.info(`User ${rcUser.username} created:`, user)
}
await parseUserMemberships(rcUser) await parseUserMemberships(rcUser)

View File

@ -3,7 +3,7 @@ import { access_token } from '../config/synapse_access_token.json'
import log from './logger' import log from './logger'
import { getAccessToken } from './storage' import { getAccessToken } from './storage'
axios.defaults.baseURL = 'http://localhost:8008' axios.defaults.baseURL = 'https://m-rc.jennett-wheeler.co.uk'
axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}` axios.defaults.headers.common['Authorization'] = `Bearer ${access_token}`
axios.defaults.headers.post['Content-Type'] = 'application/json' axios.defaults.headers.post['Content-Type'] = 'application/json'
@ -14,6 +14,10 @@ export interface SessionOptions {
[others: string]: unknown [others: string]: unknown
} }
export function getUserDomain(): string {
return "m-rc.jennett-wheeler.co.uk"
}
export { default as axios } from 'axios' export { default as axios } from 'axios'
export const whoami = () => export const whoami = () =>
new Promise<void>((resolve, reject) => { new Promise<void>((resolve, reject) => {