github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/libdokan/noexec_test.go (about)

     1  // Copyright 2019 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  //go:build windows
     6  // +build windows
     7  
     8  package libdokan
     9  
    10  import (
    11  	"errors"
    12  	"io"
    13  	"os"
    14  	"os/exec"
    15  	"path/filepath"
    16  	"strings"
    17  	"testing"
    18  
    19  	"github.com/keybase/client/go/kbfs/libcontext"
    20  	"github.com/keybase/client/go/kbfs/libkbfs"
    21  	"github.com/keybase/client/go/kbun"
    22  )
    23  
    24  func findGoExe() (string, error) {
    25  	for _, path := range []string{"go.exe",
    26  		os.Getenv("GOBIN") + "/go.exe", os.Getenv("GOROOT") + "/bin/go.exe"} {
    27  		exe, err := exec.LookPath(path)
    28  		if err == nil {
    29  			return exe, err
    30  		}
    31  
    32  	}
    33  	return "", errors.New("Cannot find go.exe")
    34  }
    35  
    36  func copyFile(from, to string) error {
    37  	src, err := Open(from)
    38  	if err != nil {
    39  		return err
    40  	}
    41  	defer src.Close()
    42  	tgt, err := Create(to)
    43  	if err != nil {
    44  		return err
    45  	}
    46  	defer tgt.Close()
    47  	_, err = io.Copy(tgt, src)
    48  	if err != nil {
    49  		return err
    50  	}
    51  	err = tgt.Sync()
    52  	if err != nil {
    53  		return err
    54  	}
    55  	return nil
    56  }
    57  
    58  func unames(uns []string) []kbun.NormalizedUsername {
    59  	res := make([]kbun.NormalizedUsername, len(uns))
    60  	for i, v := range uns {
    61  		res[i] = kbun.NormalizedUsername(v)
    62  	}
    63  	return res
    64  }
    65  
    66  func testNoExec(t *testing.T, users []string) error {
    67  	ctx := libcontext.BackgroundContextWithCancellationDelayer()
    68  	defer testCleanupDelayer(ctx, t)
    69  	config := libkbfs.MakeTestConfigOrBust(t, unames(users)...)
    70  	// Background flushed needed for large files.
    71  	config.SetDoBackgroundFlushes(true)
    72  	defer libkbfs.CheckConfigAndShutdown(ctx, t, config)
    73  	mnt, _, cancelFn := makeFS(ctx, t, config)
    74  	defer mnt.Close()
    75  	defer cancelFn()
    76  
    77  	exe, err := findGoExe()
    78  	if err != nil {
    79  		t.Fatal("Error finding go.exe: ", err)
    80  	}
    81  
    82  	tlfName := strings.Join(users, ",")
    83  	targetPath := filepath.Join(mnt.Dir, PrivateName, tlfName, "test.exe")
    84  
    85  	err = copyFile(exe, targetPath)
    86  	if err != nil {
    87  		t.Fatal("Error copying go.exe to kbfs: ", err)
    88  	}
    89  
    90  	return exec.Command(targetPath, "version").Run()
    91  
    92  }
    93  func TestNoExec(t *testing.T) {
    94  	err := testNoExec(t, []string{"jdoe", "janedoe"})
    95  	if err == nil {
    96  		t.Fatal("Unexpected success executing go on kbfs, expected fail (noexec)")
    97  	}
    98  	if !os.IsPermission(err) {
    99  		t.Fatal("Wrong error trying to execute go on kbfs: ", err)
   100  	}
   101  }
   102  
   103  func TestNoExecWhitelist(t *testing.T) {
   104  	err := testNoExec(t, []string{"jdoe"})
   105  	if err != nil {
   106  		t.Fatal("Unexpected failure executing go on kbfs, expected success (whitelist): ", err)
   107  	}
   108  }