1
0
mirror of https://github.com/home-assistant/frontend.git synced 2026-02-28 05:35:28 +00:00
Files
frontend/src/data/auth.ts
Wendelin abe8899f9b Update ts-eslint (#23723)
* Update ts-eslint

* Remove comments

* Remove unused ts-ignore

* Add undefined generic type instead of unknown

* Remove unused undefined type

* Fix type issues

* Use undefined instead of void for subscribed return type
2025-01-14 11:24:02 +01:00

162 lines
3.6 KiB
TypeScript

import type { HaFormSchema } from "../components/ha-form/types";
import type { HomeAssistant } from "../types";
import type { RefreshTokenType } from "./refresh_token";
export interface AuthUrlSearchParams {
client_id?: string;
redirect_uri?: string;
state?: string;
}
export interface AuthProvider {
name: string;
id: string;
type: string;
users?: Record<string, string>;
}
export interface Credential {
type: string;
}
export interface SignedPath {
path: string;
}
export const hassUrl = __HASS_URL__;
export const autocompleteLoginFields = (schema: HaFormSchema[]) =>
schema.map((field) => {
if (field.type !== "string") return field;
switch (field.name) {
case "username":
return { ...field, autocomplete: "username", autofocus: true };
case "password":
return { ...field, autocomplete: "current-password" };
case "code":
return { ...field, autocomplete: "one-time-code", autofocus: true };
default:
return field;
}
});
export const getSignedPath = (
hass: HomeAssistant,
path: string
): Promise<SignedPath> => hass.callWS({ type: "auth/sign_path", path });
export const fetchAuthProviders = () =>
fetch("/auth/providers", {
credentials: "same-origin",
});
export const createLoginFlow = (
client_id: string | undefined,
redirect_uri: string | undefined,
handler: (string | null)[]
) =>
fetch("/auth/login_flow", {
method: "POST",
credentials: "same-origin",
body: JSON.stringify({
client_id,
handler,
redirect_uri,
}),
});
export const submitLoginFlow = (flow_id: string, data: Record<string, any>) =>
fetch(`/auth/login_flow/${flow_id}`, {
method: "POST",
credentials: "same-origin",
body: JSON.stringify(data),
});
export const deleteLoginFlow = (flow_id) =>
fetch(`/auth/login_flow/${flow_id}`, {
method: "DELETE",
credentials: "same-origin",
});
export const redirectWithAuthCode = (
url: string,
authCode: string,
oauth2State: string | undefined,
storeToken: boolean
) => {
// OAuth 2: 3.1.2 we need to retain query component of a redirect URI
if (!url.includes("?")) {
url += "?";
} else if (!url.endsWith("&")) {
url += "&";
}
url += `code=${encodeURIComponent(authCode)}`;
if (oauth2State) {
url += `&state=${encodeURIComponent(oauth2State)}`;
}
if (storeToken) {
url += `&storeToken=true`;
}
document.location.assign(url);
};
export const createAuthForUser = async (
hass: HomeAssistant,
userId: string,
username: string,
password: string
) =>
hass.callWS({
type: "config/auth_provider/homeassistant/create",
user_id: userId,
username,
password,
});
export const changePassword = (
hass: HomeAssistant,
current_password: string,
new_password: string
) =>
hass.callWS({
type: "config/auth_provider/homeassistant/change_password",
current_password,
new_password,
});
export const adminChangePassword = (
hass: HomeAssistant,
userId: string,
password: string
) =>
hass.callWS<undefined>({
type: "config/auth_provider/homeassistant/admin_change_password",
user_id: userId,
password,
});
export const adminChangeUsername = (
hass: HomeAssistant,
userId: string,
username: string
) =>
hass.callWS<undefined>({
type: "config/auth_provider/homeassistant/admin_change_username",
user_id: userId,
username,
});
export const deleteAllRefreshTokens = (
hass: HomeAssistant,
token_type?: RefreshTokenType,
delete_current_token?: boolean
) =>
hass.callWS({
type: "auth/delete_all_refresh_tokens",
token_type,
delete_current_token,
});