| 294 | } |
| 295 | |
| 296 | func getTempFile() (*os.File, error) { |
| 297 | path := filepath.Join(os.TempDir(), "cronitor") |
| 298 | |
| 299 | // Create directory with restricted permissions |
| 300 | if err := os.MkdirAll(path, 0777); err != nil { |
| 301 | return nil, fmt.Errorf("failed to create temp directory: %w", err) |
| 302 | } |
| 303 | |
| 304 | // Use more secure temp file creation |
| 305 | file, err := ioutil.TempFile(path, fmt.Sprintf("exec-%s-*.log", monitorCode)) |
| 306 | if err != nil { |
| 307 | return nil, fmt.Errorf("failed to create temp file: %w", err) |
| 308 | } |
| 309 | |
| 310 | // Set restrictive permissions |
| 311 | if err := file.Chmod(0600); err != nil { |
| 312 | file.Close() |
| 313 | os.Remove(file.Name()) |
| 314 | return nil, fmt.Errorf("failed to set file permissions: %w", err) |
| 315 | } |
| 316 | |
| 317 | return file, nil |
| 318 | } |
| 319 | |
| 320 | func getFileSize(tempFile *os.File) (int64, error) { |
| 321 | // Known reasons stat could fail here: |