107 lines
2.5 KiB
Go
107 lines
2.5 KiB
Go
package utils
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
"regexp"
|
|
"strings"
|
|
)
|
|
|
|
// DockerAvailable checks if Docker is available on the system
|
|
func DockerAvailable() bool {
|
|
cmd := exec.Command("docker", "--version")
|
|
if err := cmd.Run(); err != nil {
|
|
log.Printf("Docker not available: %v", err)
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// PullDockerImage pulls a Docker image if it doesn't exist
|
|
func PullDockerImage(image string) error {
|
|
// Check if image exists
|
|
checkCmd := exec.Command("docker", "image", "inspect", image)
|
|
if err := checkCmd.Run(); err == nil {
|
|
// Image exists
|
|
return nil
|
|
}
|
|
|
|
// Pull the image
|
|
log.Printf("Pulling Docker image: %s", image)
|
|
pullCmd := exec.Command("docker", "pull", image)
|
|
pullCmd.Stdout = os.Stdout
|
|
pullCmd.Stderr = os.Stderr
|
|
return pullCmd.Run()
|
|
}
|
|
|
|
// ExtractJavaClassName extracts the class name from Java code
|
|
func ExtractJavaClassName(code string) string {
|
|
// Default class name as fallback
|
|
defaultClass := "Solution"
|
|
|
|
// Look for public class
|
|
re := regexp.MustCompile(`public\s+class\s+(\w+)`)
|
|
matches := re.FindStringSubmatch(code)
|
|
if len(matches) > 1 {
|
|
return matches[1]
|
|
}
|
|
|
|
// Look for any class if no public class
|
|
re = regexp.MustCompile(`class\s+(\w+)`)
|
|
matches = re.FindStringSubmatch(code)
|
|
if len(matches) > 1 {
|
|
return matches[1]
|
|
}
|
|
|
|
return defaultClass
|
|
}
|
|
|
|
// IsInputPrompt determines if a string is likely an input prompt
|
|
func IsInputPrompt(text string) bool {
|
|
// Early exit for empty or very long text
|
|
text = strings.TrimSpace(text)
|
|
if text == "" || len(text) > 100 {
|
|
return false
|
|
}
|
|
|
|
// Common prompt endings
|
|
if strings.HasSuffix(text, ":") || strings.HasSuffix(text, ">") ||
|
|
strings.HasSuffix(text, "?") || strings.HasSuffix(text, "...") {
|
|
return true
|
|
}
|
|
|
|
// Common prompt words
|
|
promptWords := []string{"input", "enter", "type", "provide"}
|
|
for _, word := range promptWords {
|
|
if strings.Contains(strings.ToLower(text), word) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// SanitizeDockerArgs ensures safe Docker command arguments
|
|
func SanitizeDockerArgs(args []string) []string {
|
|
// This is a simplified version - in production, you'd want more robust checks
|
|
sanitized := make([]string, 0, len(args))
|
|
|
|
// Disallow certain dangerous flags
|
|
dangerousFlags := map[string]bool{
|
|
"--privileged": true,
|
|
"--net=host": true,
|
|
"--pid=host": true,
|
|
"--ipc=host": true,
|
|
"--userns=host": true,
|
|
}
|
|
|
|
for _, arg := range args {
|
|
if _, isDangerous := dangerousFlags[arg]; !isDangerous {
|
|
sanitized = append(sanitized, arg)
|
|
}
|
|
}
|
|
|
|
return sanitized
|
|
}
|