// Copyright (c) Tailscale Inc & AUTHORS
// SPDX-License-Identifier: BSD-3-Clause

package quarantine

import (
	"fmt"
	"os"
	"strings"
	"time"

	"github.com/google/uuid"
	"golang.org/x/sys/unix"
)

func setQuarantineAttr(f *os.File) error {
	sc, err := f.SyscallConn()
	if err != nil {
		return err
	}

	now := time.Now()

	// We uppercase the UUID to match what other applications on macOS do
	id := strings.ToUpper(uuid.New().String())

	// kLSQuarantineTypeOtherDownload; this matches what AirDrop sets when
	// receiving a file.
	quarantineType := "0001"

	// This format is under-documented, but the following links contain a
	// reasonably comprehensive overview:
	//    https://eclecticlight.co/2020/10/29/quarantine-and-the-quarantine-flag/
	//    https://nixhacker.com/security-protection-in-macos-1/
	//    https://ilostmynotes.blogspot.com/2012/06/gatekeeper-xprotect-and-quarantine.html
	attrData := fmt.Sprintf("%s;%x;%s;%s",
		quarantineType, // quarantine value
		now.Unix(),     // time in hex
		"Tailscale",    // application
		id,             // UUID
	)

	var innerErr error
	err = sc.Control(func(fd uintptr) {
		innerErr = unix.Fsetxattr(
			int(fd),
			"com.apple.quarantine", // attr
			[]byte(attrData),
			0,
		)
	})
	if err != nil {
		return err
	}
	return innerErr
}