aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian <sebasjm@gmail.com>2023-03-15 07:21:26 -0300
committerSebastian <sebasjm@gmail.com>2023-03-15 07:22:03 -0300
commit41339c1db25306d8135084d24b1452a3ddd75dbb (patch)
tree930421098405de341162ff70bd390e666869c934
parent64c3cbc1dbc94c207bece0b9f6a399cdacd8dc22 (diff)
check credetials on login
-rw-r--r--packages/merchant-backoffice-ui/src/components/exception/login.tsx22
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/backend.ts19
-rw-r--r--packages/merchant-backoffice-ui/src/hooks/index.ts3
3 files changed, 34 insertions, 10 deletions
diff --git a/packages/merchant-backoffice-ui/src/components/exception/login.tsx b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
index 9a0411642..435ff1d6a 100644
--- a/packages/merchant-backoffice-ui/src/components/exception/login.tsx
+++ b/packages/merchant-backoffice-ui/src/components/exception/login.tsx
@@ -24,6 +24,7 @@ import { h, VNode } from "preact";
import { useState } from "preact/hooks";
import { useBackendContext } from "../../context/backend.js";
import { useInstanceContext } from "../../context/instance.js";
+import { useCredentialsChecker } from "../../hooks/backend.js";
import { Notification } from "../../utils/types.js";
interface Props {
@@ -31,15 +32,15 @@ interface Props {
onConfirm: (backend: string, token?: string) => void;
}
-function getTokenValuePart(t?: string): string | undefined {
+function getTokenValuePart(t: string): string {
if (!t) return t;
const match = /secret-token:(.*)/.exec(t);
- if (!match || !match[1]) return undefined;
+ if (!match || !match[1]) return "";
return match[1];
}
-function normalizeToken(r: string | undefined): string | undefined {
- return r ? `secret-token:${encodeURIComponent(r)}` : undefined;
+function normalizeToken(r: string): string {
+ return `secret-token:${encodeURIComponent(r)}`;
}
function cleanUp(s: string): string {
@@ -53,8 +54,9 @@ function cleanUp(s: string): string {
export function LoginModal({ onConfirm, withMessage }: Props): VNode {
const { url: backendUrl, token: baseToken } = useBackendContext();
const { admin, token: instanceToken } = useInstanceContext();
+ const testLogin = useCredentialsChecker();
const currentToken = getTokenValuePart(
- !admin ? baseToken : instanceToken || "",
+ (!admin ? baseToken : instanceToken) ?? "",
);
const [token, setToken] = useState(currentToken);
@@ -137,8 +139,14 @@ export function LoginModal({ onConfirm, withMessage }: Props): VNode {
>
<button
class="button is-info"
- onClick={(): void => {
- onConfirm(url, normalizeToken(token));
+ onClick={async () => {
+ const secretToken = normalizeToken(token);
+ const isOk = await testLogin(url, secretToken);
+ if (isOk) {
+ onConfirm(url, secretToken);
+ } else {
+ onConfirm(url);
+ }
}}
>
<i18n.Translate>Confirm</i18n.Translate>
diff --git a/packages/merchant-backoffice-ui/src/hooks/backend.ts b/packages/merchant-backoffice-ui/src/hooks/backend.ts
index 6c4e5c176..93e95934e 100644
--- a/packages/merchant-backoffice-ui/src/hooks/backend.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/backend.ts
@@ -139,6 +139,25 @@ interface useBackendBaseRequestType {
type YesOrNo = "yes" | "no";
+export function useCredentialsChecker() {
+ const { request } = useApiContext();
+ //check against instance details endpoint
+ //while merchant backend doesn't have a login endpoint
+ return async function testLogin(
+ instance: string,
+ token: string,
+ ): Promise<boolean> {
+ try {
+ const response = await request(instance, `/private/`, {
+ token,
+ });
+ return true;
+ } catch (e) {
+ return false;
+ }
+ };
+}
+
/**
*
* @param root the request is intended to the base URL and no the instance URL
diff --git a/packages/merchant-backoffice-ui/src/hooks/index.ts b/packages/merchant-backoffice-ui/src/hooks/index.ts
index bb210c9ba..316620cf7 100644
--- a/packages/merchant-backoffice-ui/src/hooks/index.ts
+++ b/packages/merchant-backoffice-ui/src/hooks/index.ts
@@ -59,7 +59,6 @@ export function useBackendDefaultToken(
export function useBackendInstanceToken(
id: string,
): [string | undefined, StateUpdater<string | undefined>] {
- const [random, setRandom] = useState(0);
const [token, setToken] = useLocalStorage(`backend-token-${id}`);
const [defaultToken, defaultSetToken] = useBackendDefaultToken();
@@ -74,8 +73,6 @@ export function useBackendInstanceToken(
): void {
setToken((p) => {
const toStore = value instanceof Function ? value(p) : value;
- // setToken(value)
- setRandom(new Date().getTime());
return toStore;
});
}