Testing #4
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
build/*
|
build/*
|
||||||
.clang-tidy
|
.clang-tidy
|
||||||
.cache
|
.cache
|
||||||
|
test/protected/*
|
||||||
|
57
Makefile
57
Makefile
@ -1,13 +1,34 @@
|
|||||||
SHELL=/bin/bash
|
SHELL=/bin/bash
|
||||||
|
|
||||||
|
# configurable options
|
||||||
|
|
||||||
|
SOURCES_DIR := ./src
|
||||||
|
TESTS_DIR := ./tests
|
||||||
|
BUILD_DIR := ./build
|
||||||
|
|
||||||
CC := gcc
|
CC := gcc
|
||||||
CXX := g++
|
CXX := g++
|
||||||
|
|
||||||
CFLAGS := -I/usr/include/fuse -D_FILE_OFFSET_BITS=64
|
|
||||||
LDFLAGS := -lfuse3 -pthread
|
|
||||||
|
|
||||||
ifdef DEBUG
|
# dependencies
|
||||||
CFLAGS += -O0 -pedantic -Wall -Wextra -Wcast-align \
|
|
||||||
|
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 \
|
-Wcast-qual -Wdisabled-optimization -Wformat=2 \
|
||||||
-Winit-self -Wlogical-op -Wmissing-declarations \
|
-Winit-self -Wlogical-op -Wmissing-declarations \
|
||||||
-Wmissing-include-dirs -Wredundant-decls -Wshadow \
|
-Wmissing-include-dirs -Wredundant-decls -Wshadow \
|
||||||
@ -19,12 +40,32 @@ else
|
|||||||
LDFLAGS +=
|
LDFLAGS +=
|
||||||
endif
|
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
|
$(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
|
$(BUILD_DIR)/main.o: $(SOURCES_DIR)/main.c
|
||||||
$(CC) $(CFLAGS) -c $< $(LDFLAGS) -o $(BUILD_DIR)/main.o
|
$(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 $@
|
$(CC) $(CFLAGS) -c $< $(LDFLAGS) -o $@
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm $(BUILD_DIR)/*
|
rm $(BUILD_DIR)/*.o $(BUILD_DIR)/icfs*
|
||||||
|
20
README.md
20
README.md
@ -12,15 +12,17 @@ Traditional access control mechanisms in operating systems allow the same level
|
|||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
* Install dependencies
|
- Install dependencies
|
||||||
+ fuse, libfuse (v3 or later)
|
- libfuse3
|
||||||
- Debian: `sudo apt install fuse3 libfuse3-dev`
|
- Debian: `sudo apt install fuse3 libfuse3-dev`
|
||||||
+ zenity
|
- zenity
|
||||||
- Debian: `sudo apt install zenity`
|
- Debian: `sudo apt install zenity`
|
||||||
* Build using `make`:
|
- Build tools
|
||||||
+ In the project directory: `make`
|
- Debian: `sudo apt install gcc make pkg-config`
|
||||||
+ Use `make DEBUG=1` for testing.
|
- Build using `make`:
|
||||||
* Resulting binaries should appear in the `build` directory.
|
- In the project directory: `make`
|
||||||
|
- Use `make DEBUG=1` for testing.
|
||||||
|
- Resulting binaries should appear in the `build` directory.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
23
test/mock/zenity
Executable file
23
test/mock/zenity
Executable 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
73
test/test.bash
Executable 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
|
Loading…
x
Reference in New Issue
Block a user