synapse-admin/src/synapse/authProvider.ts
Manuel Stahl dbcb4f92dc Use central defintion of storage system
Change-Id: Ibf31c650b08920bf82827607c3421556ac90ae61
2024-08-17 10:50:29 +02:00

94 lines
2.8 KiB
TypeScript

import { AuthProvider, Options, fetchUtils } from "react-admin";
import storage from "../storage";
const authProvider: AuthProvider = {
// called when the user attempts to log in
login: async ({
base_url,
username,
password,
loginToken,
}: {
base_url: string;
username: string;
password: string;
loginToken: string;
}) => {
console.log("login ");
const options: Options = {
method: "POST",
body: JSON.stringify(
Object.assign(
{
device_id: storage.getItem("device_id"),
initial_device_display_name: "Synapse Admin",
},
loginToken
? {
type: "m.login.token",
token: loginToken,
}
: {
type: "m.login.password",
user: username,
password: password,
}
)
),
};
// use the base_url from login instead of the well_known entry from the
// server, since the admin might want to access the admin API via some
// private address
base_url = base_url.replace(/\/+$/g, "");
storage.setItem("base_url", base_url);
const decoded_base_url = window.decodeURIComponent(base_url);
const login_api_url = decoded_base_url + "/_matrix/client/r0/login";
const { json } = await fetchUtils.fetchJson(login_api_url, options);
storage.setItem("home_server", json.home_server);
storage.setItem("user_id", json.user_id);
storage.setItem("access_token", json.access_token);
storage.setItem("device_id", json.device_id);
},
// called when the user clicks on the logout button
logout: async () => {
console.log("logout");
const logout_api_url = storage.getItem("base_url") + "/_matrix/client/r0/logout";
const access_token = storage.getItem("access_token");
const options: Options = {
method: "POST",
user: {
authenticated: true,
token: `Bearer ${access_token}`,
},
};
if (typeof access_token === "string") {
await fetchUtils.fetchJson(logout_api_url, options);
storage.removeItem("access_token");
}
},
// called when the API returns an error
checkError: ({ status }: { status: number }) => {
console.log("checkError " + status);
if (status === 401 || status === 403) {
return Promise.reject();
}
return Promise.resolve();
},
// called when the user navigates to a new location, to check for authentication
checkAuth: () => {
const access_token = storage.getItem("access_token");
console.log("checkAuth " + access_token);
return typeof access_token === "string" ? Promise.resolve() : Promise.reject();
},
// called when the user navigates to a new location, to check for permissions / roles
getPermissions: () => Promise.resolve(),
};
export default authProvider;