mirror of
https://github.com/UA-Fediland/synapse-admin.git
synced 2025-04-19 00:44:55 +00:00
94 lines
2.8 KiB
TypeScript
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;
|