From c395a61625d8a9b26d709d1a7a1aea89be6ca97b Mon Sep 17 00:00:00 2001 From: bjarne Date: Fri, 30 Aug 2024 15:55:19 +0000 Subject: [PATCH] added sudo link --- app/components/GrantSudoLink.jsx | 119 +++++++++++++++++++++++++++++++ app/dhcp/configure/page.js | 80 ++------------------- app/page.js | 7 +- app/tftp/files/page.js | 8 ++- package-lock.json | 40 +---------- package.json | 1 - 6 files changed, 139 insertions(+), 116 deletions(-) create mode 100644 app/components/GrantSudoLink.jsx diff --git a/app/components/GrantSudoLink.jsx b/app/components/GrantSudoLink.jsx new file mode 100644 index 0000000..5b87022 --- /dev/null +++ b/app/components/GrantSudoLink.jsx @@ -0,0 +1,119 @@ +'use client'; + +import { useState } from 'react'; +import Link from "next/link"; + +const GrantSudoLink = ({ text, isCard }) => { + const [isHovered, setIsHovered] = useState(false); + const [showDialog, setShowDialog] = useState(false); + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + + // hover over eeffect + const handleMouseEnter = () => { + setIsHovered(true); + }; + const handleMouseLeave = () => { + setIsHovered(false); + }; + const cardStyle = { + boxShadow: isHovered ? '0 4px 20px rgba(0, 0, 0, 0.2)' : '0 1px 3px rgba(0, 0, 0, 0.1)', + transition: 'box-shadow 0.3s ease-in-out', + }; + + // username dialog box + const openDialog = () => { + setShowDialog(true); + }; + const closeDialog = () => { + setShowDialog(false); + }; + const handleGrantSudoRights = async () => { + try { + const response = await fetch('/api/grant-sudo', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ username, password }), + }); + const data = await response.json(); + if (response.ok) { + alert('Sudo rights granted successfully.'); + } else { + alert(data.error); + } + closeDialog(); + } catch (error) { + alert('Error granting sudo rights'); + } + }; + + return ( +
+ {isCard ? ( + +
+
+
{text}
+

You need to do this once

+
+
+ + ) : ( + + {text} + + )} + + {showDialog && ( +
+
+
+
+
Grant Sudo Rights
+ +
+
+
+ + setUsername(e.target.value)} + /> +
+
+ + setPassword(e.target.value)} + /> +
+
+
+ + +
+
+
+
+ )} +
+ ); +}; + +export default GrantSudoLink; diff --git a/app/dhcp/configure/page.js b/app/dhcp/configure/page.js index a680931..b6152a9 100644 --- a/app/dhcp/configure/page.js +++ b/app/dhcp/configure/page.js @@ -2,6 +2,7 @@ import { useState, useEffect } from 'react'; import { useNotification } from '@/app/context/NotificationContext'; +import GrantSudoLink from '@/app/components/GrantSudoLink'; export default function ConfigurePage() { const [config, setConfig] = useState(''); @@ -53,35 +54,6 @@ export default function ConfigurePage() { } }; - // automatically add webserver to sudo - const openDialog = () => { - setShowDialog(true); - }; - - const closeDialog = () => { - setShowDialog(false); - }; - - const handleGrantSudoRights = async () => { - try { - const response = await fetch('/api/grant-sudo', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ username, password }), - }); - const data = await response.json(); - if (response.ok) { - showNotification('Sudo rights granted successfully.', 'success'); - } else { - showNotification(data.error, 'error'); - } - closeDialog(); - } catch (error) { - showNotification('Error granting sudo rights', 'error'); - } - }; - - return (

Configure DHCP Options

@@ -101,53 +73,11 @@ export default function ConfigurePage() { - - {showDialog && ( -
-
-
-
-
Grant Sudo Rights
- -
-
-
- - setUsername(e.target.value)} - /> -
-
- - setPassword(e.target.value)} - /> -
-
-
- - -
-
-
-
- )} +
+ +
+
); } diff --git a/app/page.js b/app/page.js index 9862318..fd0a921 100644 --- a/app/page.js +++ b/app/page.js @@ -1,10 +1,15 @@ -import Card from './components/Card'; +import Card from '@/app/components/Card'; +import GrantSudoLink from '@/app/components/GrantSudoLink'; export default function Home() { return (
+
+
+ +
TFTP Server Files
-
- +
+
+ If upload fails: +
+
diff --git a/package-lock.json b/package-lock.json index a39a8cc..5c268f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "0.1.0", "dependencies": { "bootstrap": "^5.3.3", - "formidable": "^3.5.1", "fs": "^0.0.1-security", "next": "14.2.7", "react": "^18", @@ -762,11 +761,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -1115,15 +1109,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1925,19 +1910,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, "node_modules/fs": { "version": "0.0.1-security", "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", @@ -2246,14 +2218,6 @@ "node": ">= 0.4" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "engines": { - "node": ">=8" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3146,6 +3110,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -4360,7 +4325,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index ca95948..88f0b0c 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,6 @@ }, "dependencies": { "bootstrap": "^5.3.3", - "formidable": "^3.5.1", "fs": "^0.0.1-security", "next": "14.2.7", "react": "^18",