Implement Set_Kernelstub and attempt to elevate to sudo using STDIN and then attempt to remove the password from the program memory

This commit is contained in:
HikariKnight 2023-04-11 01:03:59 +02:00
parent ca992bf864
commit 7081bfa8d7
5 changed files with 81 additions and 13 deletions

View file

@ -4,6 +4,7 @@ import (
"fmt"
"strings"
"github.com/HikariKnight/quickpassthrough/internal/logger"
"github.com/HikariKnight/quickpassthrough/pkg/command"
"github.com/HikariKnight/quickpassthrough/pkg/fileio"
"github.com/klauspost/cpuid/v2"
@ -63,5 +64,15 @@ func Set_Cmdline(gpu_IDs []string) {
// TODO2: look into grubby
// TODO3: if unknown bootloader, tell user what to add a kernel arguments
func Set_KernelStub() {
// Get the config
config := GetConfig()
// Get the kernel args
kernel_args := fileio.ReadFile(config.Path.CMDLINE)
// Write to logger
logger.Printf("Running command:\nsudo kernelstub -a \"%s\"", kernel_args)
// Run the command
command.Run("sudo", "kernelstub", "-a", kernel_args)
}

View file

@ -1,6 +1,10 @@
package internal
import tea "github.com/charmbracelet/bubbletea"
import (
"encoding/base64"
tea "github.com/charmbracelet/bubbletea"
)
func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
var cmd tea.Cmd
@ -8,7 +12,7 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case tea.KeyMsg:
// If we are not done
if m.focused != DONE {
if m.focused != INSTALL {
// Setup keybindings
switch msg.String() {
case "ctrl+c", "q":
@ -19,7 +23,7 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
if m.width != 0 {
// Process the selected item, if the return value is true then exit the application
if m.processSelection() {
return m, tea.Quit
return m, tea.ExitAltScreen
}
}
case "ctrl+z", "backspace":
@ -45,13 +49,20 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, tea.Quit
case "enter":
if m.width != 0 {
// Process the selected item, if the return value is true then exit the application
if m.processSelection() {
return m, tea.Quit
}
}
// Start installation and send the password to the command
m.install(
base64.StdEncoding.EncodeToString(
[]byte(
m.authDialog.Value(),
),
),
)
// Blank the password field
m.authDialog.SetValue("")
}
// Issue an UI update
m.authDialog, cmd = m.authDialog.Update(msg)
return m, cmd
}

View file

@ -1,10 +1,13 @@
package internal
import (
"fmt"
"os"
"regexp"
"github.com/HikariKnight/quickpassthrough/internal/configs"
"github.com/HikariKnight/quickpassthrough/internal/logger"
"github.com/HikariKnight/quickpassthrough/pkg/command"
"github.com/HikariKnight/quickpassthrough/pkg/fileio"
)
@ -115,7 +118,8 @@ func (m *model) processSelection() bool {
//m.focused++
// Because we have no QuickEmu support yet, just skip USB Controller configuration
m.focused = DONE
m.focused = INSTALL
return true
case INTRO:
// This is an OK Dialog
@ -133,3 +137,34 @@ func (m *model) processSelection() bool {
// Return false as we are not done
return false
}
// This function starts the install process
// It takes 1 auth string as variable
func (m *model) install(auth string) {
// Get the config
config := configs.GetConfig()
// Write to logger
logger.Printf("Getting authentication token by elevating with sudo once")
// Elevate to sudo
command.Elevate(auth)
// Write to logger
logger.Printf("Attempting to free hash from memory")
// Blank out the variable
auth = ""
// Based on the bootloader, setup the configuration
if config.Bootloader == "kernelstub" {
// Write to logger
logger.Printf("Configuring systemd-boot using kernelstub")
// Configure kernelstub
configs.Set_KernelStub()
} else if config.Bootloader == "unknown" {
kernel_args := fileio.ReadFile(config.Path.CMDLINE)
fmt.Printf("Unsupported bootloader, please add the below line to your bootloaders kernel arguments\n%s", kernel_args)
}
}

View file

@ -115,7 +115,7 @@ func (m model) View() string {
view = listStyle.Render(m.lists[m.focused].View())
case DONE:
case INSTALL:
title = dialogStyle.Render(
fmt.Sprint(
"The configuration files have been generated and are\n",

View file

@ -46,6 +46,8 @@ const (
VIDEO
USB
USB_GROUP
INSTALL
UNKNOWN_BOOTLOADER
DONE
)
@ -95,14 +97,16 @@ func (m *model) initLists(width, height int) {
defaultList,
defaultList,
choiceList,
choiceList,
choiceList,
}
// Configure offsets for sizing
m.offsetx = []int{
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
}
m.offsety = []int{
18, 2, 3, 13, 5, 2, 3, 12,
18, 2, 3, 13, 5, 2, 3, 12, 0, 0,
}
// Update the styles with the correct width
@ -169,4 +173,11 @@ func (m *model) initLists(width, height int) {
}
m.lists[DONE].SetItems(items)
m.lists[DONE].SetSize(m.width-m.offsetx[DONE], m.height-m.offsety[DONE])
// Init DONE choises
items = []list.Item{
item{title: "FINISH"},
}
m.lists[UNKNOWN_BOOTLOADER].SetItems(items)
m.lists[UNKNOWN_BOOTLOADER].SetSize(m.width-m.offsetx[UNKNOWN_BOOTLOADER], m.height-m.offsety[UNKNOWN_BOOTLOADER])
}