Skip to content

Commit de45694

Browse files
committed
Fix a few more things
1 parent a4c4eaf commit de45694

File tree

3 files changed

+51
-82
lines changed

3 files changed

+51
-82
lines changed

api/endpoints/admin/passkeyAuth.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export const handler = async (event: APIGatewayEvent): Promise<APIGatewayProxyRe
2020
}
2121

2222
const body: PasskeyAuthPayload = JSON.parse(event.body);
23+
console.error(body);
2324

2425
const challengeRecord = await getItem(PASSKEY_CHALLENGES_TABLE, body.challenge);
2526
if (!challengeRecord) {

src/components/terminal/Terminal.tsx

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ChangeEvent, KeyboardEvent, forwardRef, Ref, useEffect, useState } from
33
import { Box, Grid } from "@mui/material";
44
import { Emulator, EmulatorState } from "../../javascript-terminal";
55
import { handleAdminConsoleKeyPress } from "../../javascript-terminal/commands/console";
6-
import { handlePasswordPromptKeyPress } from "../../javascript-terminal/commands/sudo";
6+
import { authenticateWithPasskey } from "../../javascript-terminal/commands/sudo";
77
import AdminConsole from "./admin/AdminConsole";
88

99
import CommandInput from "./CommandInput";
@@ -53,6 +53,13 @@ const Terminal = (
5353
}
5454
}, [emulatorState.getPasswordPromptState(), emulatorState.getAdminConsoleMode()?.screen]);
5555

56+
useEffect(() => {
57+
const passwordPrompt = emulatorState.getPasswordPromptState();
58+
if (passwordPrompt) {
59+
authenticateWithPasskey(emulator, emulatorState);
60+
}
61+
}, [emulatorState.getPasswordPromptState()]);
62+
5663
const scrollToBottom = () => {
5764
setTimeout(() => {
5865
if (props.scrollContainerRef.current) {
@@ -85,30 +92,6 @@ const Terminal = (
8592
const onKeyDown = async (e: KeyboardEvent<HTMLInputElement>) => {
8693
const passwordPrompt = emulatorState.getPasswordPromptState();
8794
if (passwordPrompt) {
88-
if (e.metaKey) return; // Allow CMD key for Mac users
89-
90-
e.preventDefault();
91-
92-
if (e.key === "Backspace") {
93-
return setInput(input.slice(0, -1));
94-
}
95-
if (e.key.length === 1 && !e.ctrlKey) {
96-
return setInput(input + e.key);
97-
}
98-
99-
const shouldClearInput = await handlePasswordPromptKeyPress(
100-
emulator,
101-
emulatorState,
102-
input,
103-
e.key,
104-
e.ctrlKey
105-
);
106-
if (shouldClearInput) {
107-
setInput("");
108-
if (e.key === "Enter") {
109-
scrollToBottom();
110-
}
111-
}
11295
return;
11396
}
11497

src/javascript-terminal/commands/sudo.tsx

Lines changed: 42 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -44,70 +44,55 @@ const functionDef = (state: EmulatorState, commandOptions: string[]) => {
4444
return { output: "", type: "text" };
4545
};
4646

47-
export const handlePasswordPromptKeyPress = async (
47+
export const authenticateWithPasskey = async (
4848
emulator: Emulator,
49-
emulatorState: EmulatorState,
50-
_password: string,
51-
key: string,
52-
ctrlKey: boolean = false
53-
): Promise<boolean> => {
49+
emulatorState: EmulatorState
50+
): Promise<void> => {
5451
const promptState = emulatorState.getPasswordPromptState();
55-
if (!promptState) return false;
52+
if (!promptState) return;
53+
54+
try {
55+
const { data: authOptions } = await axios.post(
56+
"https://api.maxrosoff.com/admin/passkey-auth-options"
57+
);
58+
59+
const authResponse = await startAuthentication({ optionsJSON: authOptions });
60+
const { data: authResult } = await axios.post("https://api.maxrosoff.com/admin/passkey-auth", {
61+
response: authResponse,
62+
challenge: authOptions.challenge
63+
});
64+
65+
const existingAdminMode = emulatorState.getAdminConsoleMode();
66+
emulatorState.setAdminConsoleMode({
67+
...existingAdminMode,
68+
authToken: authResult.token
69+
});
70+
71+
const commandMapping = emulatorState.getCommandMapping();
72+
const result = emulator.runCommand(commandMapping, promptState.targetCommand, [
73+
emulatorState,
74+
promptState.targetOptions
75+
]);
5676

57-
if (key === "c" && ctrlKey) {
5877
emulatorState.setPasswordPromptState(undefined);
59-
return true;
60-
}
6178

62-
if (key === "Enter") {
63-
try {
64-
const { data: authOptions } = await axios.post(
65-
"https://api.maxrosoff.com/admin/passkey-auth-options"
66-
);
67-
68-
const authResponse = await startAuthentication(authOptions);
69-
70-
const { data: authResult } = await axios.post("https://api.maxrosoff.com/admin/passkey-auth", {
71-
response: authResponse,
72-
challenge: authOptions.challenge
73-
});
74-
75-
const existingAdminMode = emulatorState.getAdminConsoleMode();
76-
emulatorState.setAdminConsoleMode({
77-
...existingAdminMode,
78-
authToken: authResult.token
79-
});
80-
81-
const commandMapping = emulatorState.getCommandMapping();
82-
const result = emulator.runCommand(commandMapping, promptState.targetCommand, [
83-
emulatorState,
84-
promptState.targetOptions
85-
]);
86-
87-
emulatorState.setPasswordPromptState(undefined);
88-
89-
const outputs = emulatorState.getOutputs();
90-
if (outputs.length > 0) {
91-
const lastOutput = outputs[outputs.length - 1];
92-
lastOutput.output = [result];
93-
emulatorState.setOutputs([...outputs]);
94-
}
95-
96-
return true;
97-
} catch (err) {
98-
console.error("Authentication Failed:", err);
99-
emulatorState.setPasswordPromptState(undefined);
100-
101-
const outputs = emulatorState.getOutputs();
102-
if (outputs.length > 0) {
103-
const lastOutput = outputs[outputs.length - 1];
104-
lastOutput.output = [{ output: "Authentication Failed", type: "error" }];
105-
emulatorState.setOutputs([...outputs]);
106-
}
107-
return true;
79+
const outputs = emulatorState.getOutputs();
80+
if (outputs.length > 0) {
81+
const lastOutput = outputs[outputs.length - 1];
82+
lastOutput.output = [result];
83+
emulatorState.setOutputs([...outputs]);
84+
}
85+
} catch (err) {
86+
console.error("Authentication Failed:", err);
87+
emulatorState.setPasswordPromptState(undefined);
88+
89+
const outputs = emulatorState.getOutputs();
90+
if (outputs.length > 0) {
91+
const lastOutput = outputs[outputs.length - 1];
92+
lastOutput.output = [{ output: "Authentication Failed", type: "error" }];
93+
emulatorState.setOutputs([...outputs]);
10894
}
10995
}
110-
return false;
11196
};
11297

11398
export const manPage = `NAME

0 commit comments

Comments
 (0)