Merge pull request 'Testing' (#4) from Testing into main

Reviewed-on: #4
This commit is contained in:
fedir 2025-03-18 09:53:25 +01:00
commit 730d6bc27d
5 changed files with 157 additions and 17 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
build/*
.clang-tidy
.cache
test/protected/*

View File

@ -1,13 +1,34 @@
SHELL=/bin/bash
# configurable options
SOURCES_DIR := ./src
TESTS_DIR := ./tests
BUILD_DIR := ./build
CC := gcc
CXX := g++
CFLAGS := -I/usr/include/fuse -D_FILE_OFFSET_BITS=64
LDFLAGS := -lfuse3 -pthread
ifdef DEBUG
CFLAGS += -O0 -pedantic -Wall -Wextra -Wcast-align \
# dependencies
PACKAGE_NAMES := fuse3
ifeq ($(TEST), 1)
# PACKAGE_NAMES += check # TODO: use check?
endif
# set up cflags and libs
CFLAGS := -D_FILE_OFFSET_BITS=64
LDFLAGS :=
CFLAGS += $(shell pkg-config --cflags $(PACKAGE_NAMES))
LDFLAGS += $(shell pkg-config --libs $(PACKAGE_NAMES))
ifeq ($(DEBUG),1)
CFLAGS += -O0 -pedantic -g -Wall -Wextra -Wcast-align \
-Wcast-qual -Wdisabled-optimization -Wformat=2 \
-Winit-self -Wlogical-op -Wmissing-declarations \
-Wmissing-include-dirs -Wredundant-decls -Wshadow \
@ -19,12 +40,32 @@ else
LDFLAGS +=
endif
SOURCES_DIR := ./src
BUILD_DIR := ./build
build: $(BUILD_DIR)/main.o $(BUILD_DIR)/fuse_operations.o $(BUILD_DIR)/sourcefs.o $(BUILD_DIR)/ui-socket.o
# set up targets
TARGETS := icfs
ifeq ($(TEST), 1)
TARGETS += icfs_test
endif
# build!
default: $(TARGETS)
.PHONY: clean
icfs: $(BUILD_DIR)/main.o $(BUILD_DIR)/fuse_operations.o $(BUILD_DIR)/sourcefs.o $(BUILD_DIR)/ui-socket.o
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $(BUILD_DIR)/icfs
icfs_test: $(BUILD_DIR)/main.o $(BUILD_DIR)/fuse_operations.o $(BUILD_DIR)/sourcefs.o $(BUILD_DIR)/ui-socket.o
$(CC) $(CFLAGS) $^ $(LDFLAGS) -o $(BUILD_DIR)/icfs_test
# $(BUILD_DIR)/icfs_test # TODO: implement testing
$(BUILD_DIR)/test_access_control.o: $(TESTS_DIR)/test_access_control.c
$(CC) $(CFLAGS) -c $< $(LDFLAGS) -o $@
$(BUILD_DIR)/main.o: $(SOURCES_DIR)/main.c
$(CC) $(CFLAGS) -c $< $(LDFLAGS) -o $(BUILD_DIR)/main.o
@ -38,4 +79,4 @@ $(BUILD_DIR)/ui-socket.o: $(SOURCES_DIR)/ui-socket.c $(SOURCES_DIR)/ui-socket.h
$(CC) $(CFLAGS) -c $< $(LDFLAGS) -o $@
clean:
rm $(BUILD_DIR)/*
rm $(BUILD_DIR)/*.o $(BUILD_DIR)/icfs*

View File

@ -12,15 +12,17 @@ Traditional access control mechanisms in operating systems allow the same level
## Building
* Install dependencies
+ fuse, libfuse (v3 or later)
- Install dependencies
- libfuse3
- Debian: `sudo apt install fuse3 libfuse3-dev`
+ zenity
- zenity
- Debian: `sudo apt install zenity`
* Build using `make`:
+ In the project directory: `make`
+ Use `make DEBUG=1` for testing.
* Resulting binaries should appear in the `build` directory.
- Build tools
- Debian: `sudo apt install gcc make pkg-config`
- Build using `make`:
- In the project directory: `make`
- Use `make DEBUG=1` for testing.
- Resulting binaries should appear in the `build` directory.
## Usage

23
test/mock/zenity Executable file
View File

@ -0,0 +1,23 @@
#!/bin/bash
# fake-zenity: script that mocks the behavior of zenity based on the ./.fake-zenity-response file
if [[ $1 == "--set-fake-response" ]]; then
#someone knows we are fake :)
echo $2 >~/.fake_zenity_response
else
if [ -f ~/.fake_zenity_response ]; then
FAKE_ZENITY_RESPONSE=$(cat ~/.fake_zenity_response)
if [[ $FAKE_ZENITY_RESPONSE == "yes_tmp" ]]; then
printf "Allow this time\n"
exit 1
elif [[ $FAKE_ZENITY_RESPONSE == "no" ]]; then
exit 1
elif [[ $FAKE_ZENITY_RESPONSE == "yes" ]]; then
exit 0
fi
fi
fi
exit -1 # TODO: call actual zenity here

73
test/test.bash Executable file
View File

@ -0,0 +1,73 @@
#!/bin/bash
# clean what was left from previous tests
rm -rf ./protected
mkdir protected
touch ./protected/do-not-remove ./protected/should-be-removed
echo "Free code, free world." >./protected/this-only
# set up the fake-zenity
PATH="$(realpath ./mock/):$PATH"
# mount the filesystem
echo "Run $(date -u +%Y-%m-%dT%H:%M:%S) "
valgrind -s ../build/icfs -o default_permissions ./protected &
sleep 1
# Try to touch files in the directory
#echo \"manual\" >./protected/manual
zenity --set-fake-response no
echo "first" >./protected/first 2>/dev/null &&
echo "[ICFS-TEST]: echo can create protected/first despite access being denied!" ||
echo "[ICFS-TEST]: OK" # EACCESS
zenity --set-fake-response yes_tmp
echo "second" >./protected/second 2>/dev/null &&
echo "[ICFS-TEST]: OK" ||
echo "[ICFS-TEST]: echo cannot create protected/second despite access being permitted!" # OK
# Test whether permissons work
zenity --set-fake-response yes_tmp
cat ./protected/first >/dev/null 2>/dev/null &&
echo "[ICFS-TEST]: cat can read a non-existant file ./protected/first!" ||
echo "[ICFS-TEST]: OK" # ENOENT
zenity --set-fake-response yes_tmp
cat ./protected/second >/dev/null 2>/dev/null &&
echo "[ICFS-TEST]: OK" ||
echo "[ICFS-TEST]: cat cannot open protected/second despite access being permitted!" # "second"
zenity --set-fake-response yes_tmp
cat ./protected/this-only >/dev/null 2>/dev/null &&
echo "[ICFS-TEST]: OK" ||
echo "[ICFS-TEST]: echo cannot create protected/second despite access being permitted!" # "Free code, free world."
#parallel ::: "cat ./protected/sudo-only > /dev/null 2> /dev/null \
# && echo \"[ICFS-TEST]: cat can access files owned by root!\" \
# || echo \"[ICFS-TEST]: OK\"" # EACCESS
# test the removal
zenity --set-fake-response no
rm ./protected/do-not-remove >/dev/null 2>/dev/null &&
echo "[ICFS-TEST]: rm can unlink protected/do-not-remove despite access being denied!" ||
echo "[ICFS-TEST]: OK" # EACCESS
zenity --set-fake-response yes_tmp
rm ./protected/should-be-removed >/dev/null 2>/dev/null &&
echo "[ICFS-TEST]: OK" ||
echo "[ICFS-TEST]: rm cannot unlink protected/should-be-removed despite access being permitted!" # OK
# unmount
sleep 0.5
#lsof +f -- $(realpath ./protected)
umount $(realpath ./protected)
sleep 0.5