Matrix
This plugin integrates AdminJS with Matrix, enabling users to log in to the AdminJS panel using Matrix accounts through the MatrixAuthProvider.
Last updated
npm install @adminjs/matrixMATRIX_BASE_URL=http://localhost:8001
MATRIX_SERVER_DOMAIN=hhelocal.comimport 'reflect-metadata';
import express from 'express';{
sort: { sortBy: 'createdAt', direction: 'desc' },
navigation: { name: 'Matrix', icon: 'MessageSquare' },
actions: {
new: { before: [] },
},
editProperties: ['name', 'password', 'displayname', 'userType', 'emailAddress', 'isAdmin', 'avatarUrl'],
properties: {
emailAddress: {
type: 'string',
isVisible: { list: false, filter: true, show: true, edit: true },
},
},
translations: {
en: {
actions: { list: 'Matrix Users' },
properties: {
threepids: 'Addresses',
'threepids.medium': 'Type',
},
},
},
}import { DeviceAdapter, MatrixResourceEnum } from '@adminjs/matrix';
export const createMatrixDeviceResource = DeviceAdapter.buildMatrixDeviceResource({
resourceType: MatrixResourceEnum.MATRIX_DEVICE,
baseUrl: process.env.MATRIX_BASE_URL,
serverDomain: process.env.MATRIX_SERVER_DOMAIN,
eraseOnDelete: false,
});import { MatrixResourceEnum, RoomAdapter } from '@adminjs/matrix';
export const createMatrixRoomResource = RoomAdapter.buildMatrixRoomResource({
resourceType: MatrixResourceEnum.MATRIX_ROOM,
baseUrl: process.env.MATRIX_BASE_URL,
serverDomain: process.env.MATRIX_SERVER_DOMAIN,
});import { MatrixResourceEnum, UserAdapter } from '@adminjs/matrix';
export const createMatrixUserResource = UserAdapter.buildMatrixUserResource({
resourceType: MatrixResourceEnum.MATRIX_USER,
baseUrl: process.env.MATRIX_BASE_URL,
serverDomain: process.env.MATRIX_SERVER_DOMAIN,
eraseOnDelete: false,
});import AdminJS, { AdminJSOptions } from 'adminjs';
import { DeviceAdapter, UserAdapter, RoomAdapter, matrixAuthEnTranslations } from '@adminjs/matrix';
import { createMatrixUserResource } from '../resources/matrix/matrix-user.resource.js';
import { createMatrixRoomResource } from '../resources/matrix/matrix-room.resource.js';
import { createMatrixDeviceResource } from '../resources/matrix/matrix-device.resource.js';
import componentLoader from './component-loader.js';
const adapters = [
{ Resource: UserAdapter.MatrixUserResource, Database: UserAdapter.MatrixUserDatabase },
{ Resource: RoomAdapter.MatrixRoomResource, Database: RoomAdapter.MatrixRoomDatabase },
{ Resource: DeviceAdapter.MatrixDeviceResource, Database: DeviceAdapter.MatrixDeviceDatabase },
];
adapters.forEach((adapter) => AdminJS.registerAdapter(adapter));
const options: AdminJSOptions = {
componentLoader,
rootPath: '/admin',
resources: [
createMatrixUserResource,
createMatrixRoomResource,
createMatrixDeviceResource,
],
locale: {
language: 'en',
translations: {
en: {
properties: {
...matrixAuthEnTranslations.properties,
},
messages: {
...matrixAuthEnTranslations.messages,
},
},
},
},
};
export default options;import { bundleMatrixAdapterComponents } from './addons/matrix/adapters/index.js';
bundleMatrixAdapterComponents(componentLoader);import { DefaultAuthProvider } from 'adminjs';
import componentLoader from './component-loader.js';
import { DEFAULT_ADMIN } from './constants.js';
const provider = new DefaultAuthProvider({
componentLoader,
authenticate: async ({ email }) => {
if (email === DEFAULT_ADMIN.email) {
return {
email,
_auth: {
matrixAccessToken: process.env.MATRIX_ACCESS_TOKEN,
},
};
}
return null;
},
});
export default provider;curl --location 'http://localhost:8001/_matrix/client/r0/login' --header 'Content-Type: application/json' --data-raw '{ "type": "m.login.password", "user": "your_username", "password": "your_password" }'register_new_matrix_user -c /path/to/matrix-synapse/homeserver.yaml http://localhost:8008import { DefaultAuthProvider } from 'adminjs';
import componentLoader from './component-loader.js';
const provider = new DefaultAuthProvider({
componentLoader,
authenticate: async ({ email, password }) => {
// Example implementation - replace with your own authentication logic
const user = await db.users.findOne({ email });
if (user && await verifyPassword(user.password, password)) {
// Get or generate a Matrix token for this user
const matrixToken = await getMatrixTokenForUser(user);
return {
email: user.email,
_auth: {
matrixAccessToken: matrixToken
}
};
}
return null;
}
});
export default provider;