v0.7.18 - Fixed duplicate login modal bug and improved header layout
This commit is contained in:
@@ -76,6 +76,15 @@ RUN git submodule update --init --recursive
|
|||||||
# Copy nostr_core_lib source files (cached unless nostr_core_lib changes)
|
# Copy nostr_core_lib source files (cached unless nostr_core_lib changes)
|
||||||
COPY nostr_core_lib /build/nostr_core_lib/
|
COPY nostr_core_lib /build/nostr_core_lib/
|
||||||
|
|
||||||
|
# Copy c_utils_lib source files (cached unless c_utils_lib changes)
|
||||||
|
COPY c_utils_lib /build/c_utils_lib/
|
||||||
|
|
||||||
|
# Build c_utils_lib with MUSL-compatible flags (cached unless c_utils_lib changes)
|
||||||
|
RUN cd c_utils_lib && \
|
||||||
|
sed -i 's/CFLAGS = -Wall -Wextra -std=c99 -O2 -g/CFLAGS = -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 -Wall -Wextra -std=c99 -O2 -g/' Makefile && \
|
||||||
|
make clean && \
|
||||||
|
make
|
||||||
|
|
||||||
# Build nostr_core_lib with required NIPs (cached unless nostr_core_lib changes)
|
# Build nostr_core_lib with required NIPs (cached unless nostr_core_lib changes)
|
||||||
# Disable fortification in build.sh to prevent __*_chk symbol issues
|
# Disable fortification in build.sh to prevent __*_chk symbol issues
|
||||||
# NIPs: 001(Basic), 006(Keys), 013(PoW), 017(DMs), 019(Bech32), 044(Encryption), 059(Gift Wrap - required by NIP-17)
|
# NIPs: 001(Basic), 006(Keys), 013(PoW), 017(DMs), 019(Bech32), 044(Encryption), 059(Gift Wrap - required by NIP-17)
|
||||||
@@ -93,12 +102,13 @@ COPY Makefile /build/Makefile
|
|||||||
# Disable fortification to avoid __*_chk symbols that don't exist in MUSL
|
# Disable fortification to avoid __*_chk symbols that don't exist in MUSL
|
||||||
RUN gcc -static -g -O0 -DDEBUG -Wall -Wextra -std=c99 \
|
RUN gcc -static -g -O0 -DDEBUG -Wall -Wextra -std=c99 \
|
||||||
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \
|
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 \
|
||||||
-I. -Inostr_core_lib -Inostr_core_lib/nostr_core \
|
-I. -Ic_utils_lib/src -Inostr_core_lib -Inostr_core_lib/nostr_core \
|
||||||
-Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket \
|
-Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket \
|
||||||
src/main.c src/config.c src/debug.c src/dm_admin.c src/request_validator.c \
|
src/main.c src/config.c src/dm_admin.c src/request_validator.c \
|
||||||
src/nip009.c src/nip011.c src/nip013.c src/nip040.c src/nip042.c \
|
src/nip009.c src/nip011.c src/nip013.c src/nip040.c src/nip042.c \
|
||||||
src/websockets.c src/subscriptions.c src/api.c src/embedded_web_content.c \
|
src/websockets.c src/subscriptions.c src/api.c src/embedded_web_content.c \
|
||||||
-o /build/c_relay_static \
|
-o /build/c_relay_static \
|
||||||
|
c_utils_lib/libc_utils.a \
|
||||||
nostr_core_lib/libnostr_core_x64.a \
|
nostr_core_lib/libnostr_core_x64.a \
|
||||||
-lwebsockets -lssl -lcrypto -lsqlite3 -lsecp256k1 \
|
-lwebsockets -lssl -lcrypto -lsqlite3 -lsecp256k1 \
|
||||||
-lcurl -lz -lpthread -lm -ldl
|
-lcurl -lz -lpthread -lm -ldl
|
||||||
|
|||||||
27
Makefile
27
Makefile
@@ -2,15 +2,16 @@
|
|||||||
|
|
||||||
CC = gcc
|
CC = gcc
|
||||||
CFLAGS = -Wall -Wextra -std=c99 -g -O2
|
CFLAGS = -Wall -Wextra -std=c99 -g -O2
|
||||||
INCLUDES = -I. -Inostr_core_lib -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket
|
INCLUDES = -I. -Ic_utils_lib/src -Inostr_core_lib -Inostr_core_lib/nostr_core -Inostr_core_lib/cjson -Inostr_core_lib/nostr_websocket
|
||||||
LIBS = -lsqlite3 -lwebsockets -lz -ldl -lpthread -lm -L/usr/local/lib -lsecp256k1 -lssl -lcrypto -L/usr/local/lib -lcurl
|
LIBS = -lsqlite3 -lwebsockets -lz -ldl -lpthread -lm -L/usr/local/lib -lsecp256k1 -lssl -lcrypto -L/usr/local/lib -lcurl -Lc_utils_lib -lc_utils
|
||||||
|
|
||||||
# Build directory
|
# Build directory
|
||||||
BUILD_DIR = build
|
BUILD_DIR = build
|
||||||
|
|
||||||
# Source files
|
# Source files
|
||||||
MAIN_SRC = src/main.c src/config.c src/debug.c src/dm_admin.c src/request_validator.c src/nip009.c src/nip011.c src/nip013.c src/nip040.c src/nip042.c src/websockets.c src/subscriptions.c src/api.c src/embedded_web_content.c
|
MAIN_SRC = src/main.c src/config.c src/dm_admin.c src/request_validator.c src/nip009.c src/nip011.c src/nip013.c src/nip040.c src/nip042.c src/websockets.c src/subscriptions.c src/api.c src/embedded_web_content.c
|
||||||
NOSTR_CORE_LIB = nostr_core_lib/libnostr_core_x64.a
|
NOSTR_CORE_LIB = nostr_core_lib/libnostr_core_x64.a
|
||||||
|
C_UTILS_LIB = c_utils_lib/libc_utils.a
|
||||||
|
|
||||||
# Architecture detection
|
# Architecture detection
|
||||||
ARCH = $(shell uname -m)
|
ARCH = $(shell uname -m)
|
||||||
@@ -38,6 +39,11 @@ $(NOSTR_CORE_LIB):
|
|||||||
@echo "Building nostr_core_lib with required NIPs (including NIP-44 for encryption)..."
|
@echo "Building nostr_core_lib with required NIPs (including NIP-44 for encryption)..."
|
||||||
cd nostr_core_lib && ./build.sh --nips=1,6,13,17,19,44,59
|
cd nostr_core_lib && ./build.sh --nips=1,6,13,17,19,44,59
|
||||||
|
|
||||||
|
# Check if c_utils_lib is built
|
||||||
|
$(C_UTILS_LIB):
|
||||||
|
@echo "Building c_utils_lib..."
|
||||||
|
cd c_utils_lib && ./build.sh lib
|
||||||
|
|
||||||
# Update main.h version information (requires main.h to exist)
|
# Update main.h version information (requires main.h to exist)
|
||||||
src/main.h:
|
src/main.h:
|
||||||
@if [ ! -f src/main.h ]; then \
|
@if [ ! -f src/main.h ]; then \
|
||||||
@@ -75,18 +81,18 @@ force-version:
|
|||||||
@$(MAKE) src/main.h
|
@$(MAKE) src/main.h
|
||||||
|
|
||||||
# Build the relay
|
# Build the relay
|
||||||
$(TARGET): $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
|
$(TARGET): $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB) $(C_UTILS_LIB)
|
||||||
@echo "Compiling C-Relay for architecture: $(ARCH)"
|
@echo "Compiling C-Relay for architecture: $(ARCH)"
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(TARGET) $(NOSTR_CORE_LIB) $(LIBS)
|
$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(TARGET) $(NOSTR_CORE_LIB) $(C_UTILS_LIB) $(LIBS)
|
||||||
@echo "Build complete: $(TARGET)"
|
@echo "Build complete: $(TARGET)"
|
||||||
|
|
||||||
# Build for specific architectures
|
# Build for specific architectures
|
||||||
x86: $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
|
x86: $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB) $(C_UTILS_LIB)
|
||||||
@echo "Building C-Relay for x86_64..."
|
@echo "Building C-Relay for x86_64..."
|
||||||
$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_x86 $(NOSTR_CORE_LIB) $(LIBS)
|
$(CC) $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_x86 $(NOSTR_CORE_LIB) $(C_UTILS_LIB) $(LIBS)
|
||||||
@echo "Build complete: $(BUILD_DIR)/c_relay_x86"
|
@echo "Build complete: $(BUILD_DIR)/c_relay_x86"
|
||||||
|
|
||||||
arm64: $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
|
arm64: $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB) $(C_UTILS_LIB)
|
||||||
@echo "Cross-compiling C-Relay for ARM64..."
|
@echo "Cross-compiling C-Relay for ARM64..."
|
||||||
@if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then \
|
@if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then \
|
||||||
echo "ERROR: ARM64 cross-compiler not found."; \
|
echo "ERROR: ARM64 cross-compiler not found."; \
|
||||||
@@ -110,7 +116,7 @@ arm64: $(BUILD_DIR) src/main.h src/sql_schema.h $(MAIN_SRC) $(NOSTR_CORE_LIB)
|
|||||||
fi
|
fi
|
||||||
@echo "Using aarch64-linux-gnu-gcc with ARM64 libraries..."
|
@echo "Using aarch64-linux-gnu-gcc with ARM64 libraries..."
|
||||||
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
|
PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig:/usr/share/pkgconfig \
|
||||||
aarch64-linux-gnu-gcc $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_arm64 $(NOSTR_CORE_LIB) \
|
aarch64-linux-gnu-gcc $(CFLAGS) $(INCLUDES) $(MAIN_SRC) -o $(BUILD_DIR)/c_relay_arm64 $(NOSTR_CORE_LIB) $(C_UTILS_LIB) \
|
||||||
-L/usr/lib/aarch64-linux-gnu $(LIBS)
|
-L/usr/lib/aarch64-linux-gnu $(LIBS)
|
||||||
@echo "Build complete: $(BUILD_DIR)/c_relay_arm64"
|
@echo "Build complete: $(BUILD_DIR)/c_relay_arm64"
|
||||||
|
|
||||||
@@ -161,9 +167,10 @@ clean:
|
|||||||
rm -rf $(BUILD_DIR)
|
rm -rf $(BUILD_DIR)
|
||||||
@echo "Clean complete"
|
@echo "Clean complete"
|
||||||
|
|
||||||
# Clean everything including nostr_core_lib
|
# Clean everything including nostr_core_lib and c_utils_lib
|
||||||
clean-all: clean
|
clean-all: clean
|
||||||
cd nostr_core_lib && make clean 2>/dev/null || true
|
cd nostr_core_lib && make clean 2>/dev/null || true
|
||||||
|
cd c_utils_lib && make clean 2>/dev/null || true
|
||||||
|
|
||||||
# Install dependencies (Ubuntu/Debian)
|
# Install dependencies (Ubuntu/Debian)
|
||||||
install-deps:
|
install-deps:
|
||||||
|
|||||||
58
api/embedded.html
Normal file
58
api/embedded.html
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Embedded NOSTR_LOGIN_LITE</title>
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 40px;
|
||||||
|
background: white;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
max-width: 400px;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#login-container {
|
||||||
|
/* No styling - let embedded modal blend seamlessly */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="container">
|
||||||
|
<div id="login-container"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="../lite/nostr.bundle.js"></script>
|
||||||
|
<script src="../lite/nostr-lite.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', async () => {
|
||||||
|
await window.NOSTR_LOGIN_LITE.init({
|
||||||
|
theme:'default',
|
||||||
|
methods: {
|
||||||
|
extension: true,
|
||||||
|
local: true,
|
||||||
|
seedphrase: true,
|
||||||
|
readonly: true,
|
||||||
|
connect: true,
|
||||||
|
remote: true,
|
||||||
|
otp: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
window.NOSTR_LOGIN_LITE.embed('#login-container', {
|
||||||
|
seamless: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
245
api/index.css
245
api/index.css
@@ -33,11 +33,142 @@ body {
|
|||||||
background-color: var(--secondary-color);
|
background-color: var(--secondary-color);
|
||||||
color: var(--primary-color);
|
color: var(--primary-color);
|
||||||
/* line-height: 1.4; */
|
/* line-height: 1.4; */
|
||||||
padding: 20px;
|
padding: 0;
|
||||||
|
max-width: none;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Header Styles */
|
||||||
|
.main-header {
|
||||||
|
background-color: var(--secondary-color);
|
||||||
|
border-bottom: var(--border-width) solid var(--border-color);
|
||||||
|
padding: 15px 20px;
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 100;
|
||||||
max-width: 1200px;
|
max-width: 1200px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-content {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: normal;
|
||||||
|
color: var(--primary-color);
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-user-name {
|
||||||
|
display: block;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--primary-color);
|
||||||
|
font-size: 10px;
|
||||||
|
text-align: center;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-area {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
position: relative;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px 12px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-area:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.profile-info {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-user-image {
|
||||||
|
width: 48px; /* 50% larger than 32px */
|
||||||
|
height: 48px; /* 50% larger than 32px */
|
||||||
|
border-radius: var(--border-radius); /* Curved corners like other elements */
|
||||||
|
object-fit: cover;
|
||||||
|
border: 2px solid transparent; /* Invisible border */
|
||||||
|
background-color: var(--secondary-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.logout-dropdown {
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
right: 0;
|
||||||
|
background-color: var(--secondary-color);
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||||
|
min-width: 120px;
|
||||||
|
z-index: 200;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logout-btn {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px 15px;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
color: var(--primary-color);
|
||||||
|
text-align: left;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: var(--font-family);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
transition: background-color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logout-btn:hover {
|
||||||
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Login Modal Styles */
|
||||||
|
.login-modal-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background-color: rgba(0, 0, 0, 0.8);
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
z-index: 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-modal-content {
|
||||||
|
background-color: var(--secondary-color);
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
padding: 30px;
|
||||||
|
max-width: 400px;
|
||||||
|
width: 90%;
|
||||||
|
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
border-bottom: var(--border-width) solid var(--border-color);
|
border-bottom: var(--border-width) solid var(--border-color);
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
@@ -130,6 +261,40 @@ button:disabled {
|
|||||||
border-color: #ccc;
|
border-color: #ccc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Flash animation for refresh button */
|
||||||
|
@keyframes flash-red {
|
||||||
|
0% { border-color: var(--border-color); }
|
||||||
|
50% { border-color: var(--accent-color); }
|
||||||
|
100% { border-color: var(--border-color); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.flash-red {
|
||||||
|
animation: flash-red 0.5s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Flash animation for updated statistics values */
|
||||||
|
@keyframes flash-value {
|
||||||
|
0% { color: var(--primary-color); }
|
||||||
|
50% { color: var(--accent-color); }
|
||||||
|
100% { color: var(--primary-color); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.flash-value {
|
||||||
|
animation: flash-value 0.5s ease-in-out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Npub links styling */
|
||||||
|
.npub-link {
|
||||||
|
color: var(--primary-color);
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: normal;
|
||||||
|
transition: color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.npub-link:hover {
|
||||||
|
color: var(--accent-color);
|
||||||
|
}
|
||||||
|
|
||||||
.status {
|
.status {
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
@@ -286,12 +451,21 @@ button:disabled {
|
|||||||
|
|
||||||
.user-info-container {
|
.user-info-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
flex-direction: column;
|
||||||
gap: 20px;
|
gap: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-details {
|
.user-details {
|
||||||
flex: 1;
|
order: -1; /* Show user details first when logged in */
|
||||||
|
}
|
||||||
|
|
||||||
|
.login-section {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logout-section {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-logout-btn {
|
.login-logout-btn {
|
||||||
@@ -338,6 +512,31 @@ button:disabled {
|
|||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* User profile header with image */
|
||||||
|
.user-profile-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-image-container {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-profile-image {
|
||||||
|
width: 60px;
|
||||||
|
height: 60px;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
object-fit: cover;
|
||||||
|
border: 2px solid var(--border-color);
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-text-info {
|
||||||
|
flex: 1;
|
||||||
|
min-width: 0; /* Allow text to wrap */
|
||||||
|
}
|
||||||
|
|
||||||
.hidden {
|
.hidden {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@@ -351,6 +550,40 @@ button:disabled {
|
|||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.countdown-btn {
|
||||||
|
width: auto;
|
||||||
|
min-width: 40px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
background: var(--secondary-color);
|
||||||
|
color: var(--primary-color);
|
||||||
|
border: var(--border-width) solid var(--border-color);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
font-family: var(--font-family);
|
||||||
|
font-size: 10px;
|
||||||
|
/* font-weight: bold; */
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all 0.2s ease;
|
||||||
|
margin-left: auto;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.countdown-btn:hover::after {
|
||||||
|
content: "countdown";
|
||||||
|
position: absolute;
|
||||||
|
top: -30px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
background: var(--primary-color);
|
||||||
|
color: var(--secondary-color);
|
||||||
|
padding: 4px 8px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: normal;
|
||||||
|
white-space: nowrap;
|
||||||
|
z-index: 1000;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
.auth-rules-controls {
|
.auth-rules-controls {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
@@ -464,10 +697,12 @@ button:disabled {
|
|||||||
|
|
||||||
/* Main Sections Wrapper */
|
/* Main Sections Wrapper */
|
||||||
.main-sections-wrapper {
|
.main-sections-wrapper {
|
||||||
|
max-width: 1200px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 20px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: var(--border-width);
|
gap: var(--border-width);
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.flex-section {
|
.flex-section {
|
||||||
|
|||||||
@@ -4,38 +4,37 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>C-Relay Admin API</title>
|
<title>C-Relay Admin</title>
|
||||||
<link rel="stylesheet" href="/api/index.css">
|
<link rel="stylesheet" href="/api/index.css">
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>C-RELAY ADMIN API</h1>
|
<!-- Header with title and profile display -->
|
||||||
|
<header class="main-header">
|
||||||
<!-- Main Sections Wrapper -->
|
<div class="header-content">
|
||||||
<div class="main-sections-wrapper">
|
<div class="header-title">RELAY</div>
|
||||||
|
<div class="profile-area" id="profile-area" style="display: none;">
|
||||||
<!-- Persistent Authentication Header - Always Visible -->
|
<div class="profile-container">
|
||||||
<div id="persistent-auth-container" class="section flex-section">
|
<img id="header-user-image" class="header-user-image" alt="Profile" style="display: none;">
|
||||||
<div class="user-info-container">
|
<span id="header-user-name" class="header-user-name">Loading...</span>
|
||||||
<button type="button" id="login-logout-btn" class="login-logout-btn">LOGIN</button>
|
</div>
|
||||||
<div class="user-details" id="persistent-user-details" style="display: none;">
|
<!-- Logout dropdown -->
|
||||||
<div><strong>Name:</strong> <span id="persistent-user-name">Loading...</span></div>
|
<div class="logout-dropdown" id="logout-dropdown" style="display: none;">
|
||||||
<div><strong>Public Key:</strong>
|
<button type="button" id="logout-btn" class="logout-btn">LOGOUT</button>
|
||||||
<div class="user-pubkey" id="persistent-user-pubkey">Loading...</div>
|
|
||||||
</div>
|
|
||||||
<div><strong>About:</strong> <span id="persistent-user-about">Loading...</span></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
<!-- Login Section -->
|
<!-- Login Modal Overlay -->
|
||||||
<div id="login-section" class="flex-section">
|
<div id="login-modal" class="login-modal-overlay" style="display: none;">
|
||||||
<div class="section">
|
<div class="login-modal-content">
|
||||||
<h2>NOSTR AUTHENTICATION</h2>
|
<div id="login-modal-container"></div>
|
||||||
<p id="login-instructions">Please login with your Nostr identity to access the admin interface.</p>
|
|
||||||
<!-- nostr-lite login UI will be injected here -->
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Main Sections Wrapper -->
|
||||||
|
<div class="main-sections-wrapper">
|
||||||
|
|
||||||
<!-- Relay Connection Section -->
|
<!-- Relay Connection Section -->
|
||||||
<div id="relay-connection-section" class="flex-section">
|
<div id="relay-connection-section" class="flex-section">
|
||||||
@@ -90,6 +89,7 @@
|
|||||||
<div class="section flex-section" id="databaseStatisticsSection" style="display: none;">
|
<div class="section flex-section" id="databaseStatisticsSection" style="display: none;">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<h2>DATABASE STATISTICS</h2>
|
<h2>DATABASE STATISTICS</h2>
|
||||||
|
<button type="button" id="refresh-stats-btn" class="countdown-btn"></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
@@ -207,10 +207,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Refresh Button -->
|
|
||||||
<div class="input-group">
|
|
||||||
<button type="button" id="refresh-stats-btn">REFRESH STATISTICS</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Testing Section -->
|
<!-- Testing Section -->
|
||||||
|
|||||||
6749
api/index.js
6749
api/index.js
File diff suppressed because it is too large
Load Diff
Submodule c_utils_lib updated: 3fd5d0911a...442facd7e3
457
docs/c_utils_lib_architecture.md
Normal file
457
docs/c_utils_lib_architecture.md
Normal file
@@ -0,0 +1,457 @@
|
|||||||
|
# c_utils_lib Architecture Plan
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
`c_utils_lib` is a standalone C utility library designed to provide reusable, general-purpose functions for C projects. It serves as a learning repository and a practical toolkit for common C programming tasks.
|
||||||
|
|
||||||
|
## Design Philosophy
|
||||||
|
|
||||||
|
1. **Zero External Dependencies**: Only standard C library dependencies
|
||||||
|
2. **Modular Design**: Each utility is independent and can be used separately
|
||||||
|
3. **Learning-Oriented**: Well-documented code suitable for learning C
|
||||||
|
4. **Production-Ready**: Battle-tested utilities from real projects
|
||||||
|
5. **Cross-Platform**: Works on Linux, macOS, and other POSIX systems
|
||||||
|
|
||||||
|
## Repository Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
c_utils_lib/
|
||||||
|
├── README.md # Main documentation
|
||||||
|
├── LICENSE # MIT License
|
||||||
|
├── VERSION # Current version (e.g., v0.1.0)
|
||||||
|
├── build.sh # Build script
|
||||||
|
├── Makefile # Build system
|
||||||
|
├── .gitignore # Git ignore rules
|
||||||
|
│
|
||||||
|
├── include/ # Public headers
|
||||||
|
│ ├── c_utils.h # Main header (includes all utilities)
|
||||||
|
│ ├── debug.h # Debug/logging system
|
||||||
|
│ ├── version.h # Version utilities
|
||||||
|
│ ├── string_utils.h # String utilities (future)
|
||||||
|
│ └── memory_utils.h # Memory utilities (future)
|
||||||
|
│
|
||||||
|
├── src/ # Implementation files
|
||||||
|
│ ├── debug.c # Debug system implementation
|
||||||
|
│ ├── version.c # Version utilities implementation
|
||||||
|
│ ├── string_utils.c # String utilities (future)
|
||||||
|
│ └── memory_utils.c # Memory utilities (future)
|
||||||
|
│
|
||||||
|
├── examples/ # Usage examples
|
||||||
|
│ ├── debug_example.c # Debug system example
|
||||||
|
│ ├── version_example.c # Version utilities example
|
||||||
|
│ └── Makefile # Examples build system
|
||||||
|
│
|
||||||
|
├── tests/ # Unit tests
|
||||||
|
│ ├── test_debug.c # Debug system tests
|
||||||
|
│ ├── test_version.c # Version utilities tests
|
||||||
|
│ ├── run_tests.sh # Test runner
|
||||||
|
│ └── Makefile # Tests build system
|
||||||
|
│
|
||||||
|
└── docs/ # Additional documentation
|
||||||
|
├── API.md # Complete API reference
|
||||||
|
├── INTEGRATION.md # How to integrate into projects
|
||||||
|
├── VERSIONING.md # Versioning system guide
|
||||||
|
└── CONTRIBUTING.md # Contribution guidelines
|
||||||
|
```
|
||||||
|
|
||||||
|
## Initial Utilities (v0.1.0)
|
||||||
|
|
||||||
|
### 1. Debug System (`debug.h`, `debug.c`)
|
||||||
|
|
||||||
|
**Purpose**: Unified logging and debugging system with configurable verbosity levels.
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- 5 debug levels: NONE, ERROR, WARN, INFO, DEBUG, TRACE
|
||||||
|
- Timestamp formatting
|
||||||
|
- File/line information at TRACE level
|
||||||
|
- Macro-based API for zero-cost when disabled
|
||||||
|
- Thread-safe (future enhancement)
|
||||||
|
|
||||||
|
**API**:
|
||||||
|
```c
|
||||||
|
// Initialization
|
||||||
|
void debug_init(int level);
|
||||||
|
|
||||||
|
// Logging macros
|
||||||
|
DEBUG_ERROR(format, ...);
|
||||||
|
DEBUG_WARN(format, ...);
|
||||||
|
DEBUG_INFO(format, ...);
|
||||||
|
DEBUG_LOG(format, ...);
|
||||||
|
DEBUG_TRACE(format, ...);
|
||||||
|
|
||||||
|
// Global debug level
|
||||||
|
extern debug_level_t g_debug_level;
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Example**:
|
||||||
|
```c
|
||||||
|
#include <c_utils/debug.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
debug_init(DEBUG_LEVEL_INFO);
|
||||||
|
DEBUG_INFO("Application started");
|
||||||
|
DEBUG_ERROR("Critical error: %s", error_msg);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Version Utilities (`version.h`, `version.c`)
|
||||||
|
|
||||||
|
**Purpose**: Reusable versioning system for C projects using git tags.
|
||||||
|
|
||||||
|
**Features**:
|
||||||
|
- Automatic version extraction from git tags
|
||||||
|
- Semantic versioning support (MAJOR.MINOR.PATCH)
|
||||||
|
- Version comparison functions
|
||||||
|
- Header file generation for embedding version info
|
||||||
|
- Build number tracking
|
||||||
|
|
||||||
|
**API**:
|
||||||
|
```c
|
||||||
|
// Version structure
|
||||||
|
typedef struct {
|
||||||
|
int major;
|
||||||
|
int minor;
|
||||||
|
int patch;
|
||||||
|
char* git_hash;
|
||||||
|
char* build_date;
|
||||||
|
} version_info_t;
|
||||||
|
|
||||||
|
// Get version from git
|
||||||
|
int version_get_from_git(version_info_t* version);
|
||||||
|
|
||||||
|
// Generate version header file
|
||||||
|
int version_generate_header(const char* output_path, const char* prefix);
|
||||||
|
|
||||||
|
// Compare versions
|
||||||
|
int version_compare(version_info_t* v1, version_info_t* v2);
|
||||||
|
|
||||||
|
// Format version string
|
||||||
|
char* version_to_string(version_info_t* version);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Usage Example**:
|
||||||
|
```c
|
||||||
|
#include <c_utils/version.h>
|
||||||
|
|
||||||
|
// In your build system:
|
||||||
|
version_generate_header("src/version.h", "MY_APP");
|
||||||
|
|
||||||
|
// In your code:
|
||||||
|
#include "version.h"
|
||||||
|
printf("Version: %s\n", MY_APP_VERSION);
|
||||||
|
```
|
||||||
|
|
||||||
|
**Integration with Projects**:
|
||||||
|
```bash
|
||||||
|
# In project Makefile
|
||||||
|
version.h:
|
||||||
|
c_utils_lib/bin/generate_version src/version.h MY_PROJECT
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
### Static Library Output
|
||||||
|
|
||||||
|
```
|
||||||
|
libc_utils.a # Static library for linking
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Targets
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make # Build static library
|
||||||
|
make examples # Build examples
|
||||||
|
make test # Run tests
|
||||||
|
make install # Install to system (optional)
|
||||||
|
make clean # Clean build artifacts
|
||||||
|
```
|
||||||
|
|
||||||
|
### Build Script (`build.sh`)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Simplified build script similar to nostr_core_lib
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
lib|"")
|
||||||
|
make
|
||||||
|
;;
|
||||||
|
examples)
|
||||||
|
make examples
|
||||||
|
;;
|
||||||
|
test)
|
||||||
|
make test
|
||||||
|
;;
|
||||||
|
clean)
|
||||||
|
make clean
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
make install
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: ./build.sh [lib|examples|test|clean|install]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
## Versioning System Design
|
||||||
|
|
||||||
|
### How It Works
|
||||||
|
|
||||||
|
1. **Git Tags as Source of Truth**
|
||||||
|
- Version tags: `v0.1.0`, `v0.2.0`, etc.
|
||||||
|
- Follows semantic versioning
|
||||||
|
|
||||||
|
2. **Automatic Header Generation**
|
||||||
|
- Script reads git tags
|
||||||
|
- Generates header with version macros
|
||||||
|
- Includes build date and git hash
|
||||||
|
|
||||||
|
3. **Reusable Across Projects**
|
||||||
|
- Each project calls `version_generate_header()`
|
||||||
|
- Customizable prefix (e.g., `C_RELAY_VERSION`, `NOSTR_CORE_VERSION`)
|
||||||
|
- No hardcoded version numbers in source
|
||||||
|
|
||||||
|
### Example Generated Header
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Auto-generated by c_utils_lib version system
|
||||||
|
#ifndef MY_PROJECT_VERSION_H
|
||||||
|
#define MY_PROJECT_VERSION_H
|
||||||
|
|
||||||
|
#define MY_PROJECT_VERSION "v0.1.0"
|
||||||
|
#define MY_PROJECT_VERSION_MAJOR 0
|
||||||
|
#define MY_PROJECT_VERSION_MINOR 1
|
||||||
|
#define MY_PROJECT_VERSION_PATCH 0
|
||||||
|
#define MY_PROJECT_GIT_HASH "a1b2c3d"
|
||||||
|
#define MY_PROJECT_BUILD_DATE "2025-10-15"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
```
|
||||||
|
|
||||||
|
### Integration Pattern
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# In consuming project's Makefile
|
||||||
|
VERSION_SCRIPT = c_utils_lib/bin/generate_version
|
||||||
|
|
||||||
|
src/version.h: .git/refs/tags/*
|
||||||
|
$(VERSION_SCRIPT) src/version.h MY_PROJECT
|
||||||
|
|
||||||
|
my_app: src/version.h src/main.c
|
||||||
|
$(CC) src/main.c -o my_app -Ic_utils_lib/include -Lc_utils_lib -lc_utils
|
||||||
|
```
|
||||||
|
|
||||||
|
## Future Utilities (Roadmap)
|
||||||
|
|
||||||
|
### String Utilities (`string_utils.h`)
|
||||||
|
- Safe string operations (bounds checking)
|
||||||
|
- String trimming, splitting, joining
|
||||||
|
- Case conversion
|
||||||
|
- Pattern matching helpers
|
||||||
|
|
||||||
|
### Memory Utilities (`memory_utils.h`)
|
||||||
|
- Safe allocation wrappers
|
||||||
|
- Memory pool management
|
||||||
|
- Leak detection helpers (debug builds)
|
||||||
|
- Arena allocators
|
||||||
|
|
||||||
|
### Configuration Utilities (`config_utils.h`)
|
||||||
|
- INI file parsing
|
||||||
|
- JSON configuration (using cJSON)
|
||||||
|
- Environment variable helpers
|
||||||
|
- Command-line argument parsing
|
||||||
|
|
||||||
|
### File Utilities (`file_utils.h`)
|
||||||
|
- Safe file operations
|
||||||
|
- Directory traversal
|
||||||
|
- Path manipulation
|
||||||
|
- File watching (inotify wrapper)
|
||||||
|
|
||||||
|
### Time Utilities (`time_utils.h`)
|
||||||
|
- Timestamp formatting
|
||||||
|
- Duration calculations
|
||||||
|
- Timer utilities
|
||||||
|
- Rate limiting helpers
|
||||||
|
|
||||||
|
## Integration Guide
|
||||||
|
|
||||||
|
### As Git Submodule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# In your project
|
||||||
|
git submodule add https://github.com/yourusername/c_utils_lib.git
|
||||||
|
git submodule update --init --recursive
|
||||||
|
|
||||||
|
# Build the library
|
||||||
|
cd c_utils_lib && ./build.sh lib && cd ..
|
||||||
|
|
||||||
|
# Update your Makefile
|
||||||
|
INCLUDES += -Ic_utils_lib/include
|
||||||
|
LIBS += -Lc_utils_lib -lc_utils
|
||||||
|
```
|
||||||
|
|
||||||
|
### In Your Makefile
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# Check if c_utils_lib is built
|
||||||
|
c_utils_lib/libc_utils.a:
|
||||||
|
cd c_utils_lib && ./build.sh lib
|
||||||
|
|
||||||
|
# Link against it
|
||||||
|
my_app: c_utils_lib/libc_utils.a src/main.c
|
||||||
|
$(CC) src/main.c -o my_app \
|
||||||
|
-Ic_utils_lib/include \
|
||||||
|
-Lc_utils_lib -lc_utils
|
||||||
|
```
|
||||||
|
|
||||||
|
### In Your Code
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Option 1: Include everything
|
||||||
|
#include <c_utils/c_utils.h>
|
||||||
|
|
||||||
|
// Option 2: Include specific utilities
|
||||||
|
#include <c_utils/debug.h>
|
||||||
|
#include <c_utils/version.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
debug_init(DEBUG_LEVEL_INFO);
|
||||||
|
DEBUG_INFO("Starting application version %s", MY_APP_VERSION);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Migration Plan for c-relay
|
||||||
|
|
||||||
|
### Phase 1: Extract Debug System
|
||||||
|
1. Create `c_utils_lib` repository
|
||||||
|
2. Move [`debug.c`](../src/debug.c) and [`debug.h`](../src/debug.h)
|
||||||
|
3. Create build system
|
||||||
|
4. Add basic tests
|
||||||
|
|
||||||
|
### Phase 2: Add Versioning System
|
||||||
|
1. Extract version generation logic from c-relay
|
||||||
|
2. Create reusable version utilities
|
||||||
|
3. Update c-relay to use new system
|
||||||
|
4. Update nostr_core_lib to use new system
|
||||||
|
|
||||||
|
### Phase 3: Add as Submodule
|
||||||
|
1. Add `c_utils_lib` as submodule to c-relay
|
||||||
|
2. Update c-relay Makefile
|
||||||
|
3. Update includes in c-relay source files
|
||||||
|
4. Remove old debug files from c-relay
|
||||||
|
|
||||||
|
### Phase 4: Documentation & Examples
|
||||||
|
1. Create comprehensive README
|
||||||
|
2. Add usage examples
|
||||||
|
3. Write integration guide
|
||||||
|
4. Document API
|
||||||
|
|
||||||
|
## Benefits
|
||||||
|
|
||||||
|
### For c-relay
|
||||||
|
- Cleaner separation of concerns
|
||||||
|
- Reusable utilities across projects
|
||||||
|
- Easier to maintain and test
|
||||||
|
- Consistent logging across codebase
|
||||||
|
|
||||||
|
### For Learning C
|
||||||
|
- Real-world utility implementations
|
||||||
|
- Best practices examples
|
||||||
|
- Modular design patterns
|
||||||
|
- Build system examples
|
||||||
|
|
||||||
|
### For Future Projects
|
||||||
|
- Drop-in utility library
|
||||||
|
- Proven, tested code
|
||||||
|
- Consistent patterns
|
||||||
|
- Time savings
|
||||||
|
|
||||||
|
## Testing Strategy
|
||||||
|
|
||||||
|
### Unit Tests
|
||||||
|
- Test each utility independently
|
||||||
|
- Mock external dependencies
|
||||||
|
- Edge case coverage
|
||||||
|
- Memory leak detection (valgrind)
|
||||||
|
|
||||||
|
### Integration Tests
|
||||||
|
- Test with real projects (c-relay, nostr_core_lib)
|
||||||
|
- Cross-platform testing
|
||||||
|
- Performance benchmarks
|
||||||
|
|
||||||
|
### Continuous Integration
|
||||||
|
- GitHub Actions for automated testing
|
||||||
|
- Multiple compiler versions (gcc, clang)
|
||||||
|
- Multiple platforms (Linux, macOS)
|
||||||
|
- Static analysis (cppcheck, clang-tidy)
|
||||||
|
|
||||||
|
## Documentation Standards
|
||||||
|
|
||||||
|
### Code Documentation
|
||||||
|
- Doxygen-style comments
|
||||||
|
- Function purpose and parameters
|
||||||
|
- Return value descriptions
|
||||||
|
- Usage examples in comments
|
||||||
|
|
||||||
|
### API Documentation
|
||||||
|
- Complete API reference in `docs/API.md`
|
||||||
|
- Usage examples for each function
|
||||||
|
- Common patterns and best practices
|
||||||
|
- Migration guides
|
||||||
|
|
||||||
|
### Learning Resources
|
||||||
|
- Detailed explanations of implementations
|
||||||
|
- Links to relevant C standards
|
||||||
|
- Common pitfalls and how to avoid them
|
||||||
|
- Performance considerations
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License - permissive and suitable for learning and commercial use.
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
- **v0.1.0** (Planned)
|
||||||
|
- Initial release
|
||||||
|
- Debug system
|
||||||
|
- Version utilities
|
||||||
|
- Basic documentation
|
||||||
|
|
||||||
|
- **v0.2.0** (Future)
|
||||||
|
- String utilities
|
||||||
|
- Memory utilities
|
||||||
|
- Enhanced documentation
|
||||||
|
|
||||||
|
- **v0.3.0** (Future)
|
||||||
|
- Configuration utilities
|
||||||
|
- File utilities
|
||||||
|
- Time utilities
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
1. ✅ Successfully integrated into c-relay
|
||||||
|
2. ✅ Successfully integrated into nostr_core_lib
|
||||||
|
3. ✅ All tests passing
|
||||||
|
4. ✅ Documentation complete
|
||||||
|
5. ✅ Examples working
|
||||||
|
6. ✅ Zero external dependencies (except standard library)
|
||||||
|
7. ✅ Cross-platform compatibility verified
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. Create repository structure
|
||||||
|
2. Implement debug system
|
||||||
|
3. Implement version utilities
|
||||||
|
4. Create build system
|
||||||
|
5. Write tests
|
||||||
|
6. Create documentation
|
||||||
|
7. Integrate into c-relay
|
||||||
|
8. Publish to GitHub
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Note**: This is a living document. Update as the library evolves and new utilities are added.
|
||||||
621
docs/c_utils_lib_implementation_plan.md
Normal file
621
docs/c_utils_lib_implementation_plan.md
Normal file
@@ -0,0 +1,621 @@
|
|||||||
|
# c_utils_lib Implementation Plan
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
This document provides a step-by-step implementation plan for creating the `c_utils_lib` library and integrating it into the c-relay project.
|
||||||
|
|
||||||
|
## Phase 1: Repository Setup & Structure
|
||||||
|
|
||||||
|
### Step 1.1: Create Repository Structure
|
||||||
|
|
||||||
|
**Location**: Create outside c-relay project (sibling directory)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Create directory structure
|
||||||
|
mkdir -p c_utils_lib/{include,src,examples,tests,docs,bin}
|
||||||
|
cd c_utils_lib
|
||||||
|
|
||||||
|
# Create subdirectories
|
||||||
|
mkdir -p include/c_utils
|
||||||
|
mkdir -p tests/results
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 1.2: Initialize Git Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd c_utils_lib
|
||||||
|
git init
|
||||||
|
git branch -M main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 1.3: Create Core Files
|
||||||
|
|
||||||
|
**Files to create**:
|
||||||
|
1. `README.md` - Main documentation
|
||||||
|
2. `LICENSE` - MIT License
|
||||||
|
3. `VERSION` - Version file (v0.1.0)
|
||||||
|
4. `.gitignore` - Git ignore rules
|
||||||
|
5. `Makefile` - Build system
|
||||||
|
6. `build.sh` - Build script
|
||||||
|
|
||||||
|
## Phase 2: Debug System Implementation
|
||||||
|
|
||||||
|
### Step 2.1: Move Debug Files
|
||||||
|
|
||||||
|
**Source files** (from c-relay):
|
||||||
|
- `src/debug.c` → `c_utils_lib/src/debug.c`
|
||||||
|
- `src/debug.h` → `c_utils_lib/include/c_utils/debug.h`
|
||||||
|
|
||||||
|
**Modifications needed**:
|
||||||
|
1. Update header guard in `debug.h`:
|
||||||
|
```c
|
||||||
|
#ifndef C_UTILS_DEBUG_H
|
||||||
|
#define C_UTILS_DEBUG_H
|
||||||
|
```
|
||||||
|
|
||||||
|
2. No namespace changes needed (keep simple API)
|
||||||
|
|
||||||
|
3. Add header documentation:
|
||||||
|
```c
|
||||||
|
/**
|
||||||
|
* @file debug.h
|
||||||
|
* @brief Debug and logging system with configurable verbosity levels
|
||||||
|
*
|
||||||
|
* Provides a simple, efficient logging system with 5 levels:
|
||||||
|
* - ERROR: Critical errors
|
||||||
|
* - WARN: Warnings
|
||||||
|
* - INFO: Informational messages
|
||||||
|
* - DEBUG: Debug messages
|
||||||
|
* - TRACE: Detailed trace with file:line info
|
||||||
|
*/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2.2: Create Main Header
|
||||||
|
|
||||||
|
**File**: `include/c_utils/c_utils.h`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifndef C_UTILS_H
|
||||||
|
#define C_UTILS_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file c_utils.h
|
||||||
|
* @brief Main header for c_utils_lib - includes all utilities
|
||||||
|
*
|
||||||
|
* Include this header to access all c_utils_lib functionality.
|
||||||
|
* Alternatively, include specific headers for modular usage.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Version information
|
||||||
|
#define C_UTILS_VERSION "v0.1.0"
|
||||||
|
#define C_UTILS_VERSION_MAJOR 0
|
||||||
|
#define C_UTILS_VERSION_MINOR 1
|
||||||
|
#define C_UTILS_VERSION_PATCH 0
|
||||||
|
|
||||||
|
// Include all utilities
|
||||||
|
#include "debug.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
#endif /* C_UTILS_H */
|
||||||
|
```
|
||||||
|
|
||||||
|
## Phase 3: Version Utilities Implementation
|
||||||
|
|
||||||
|
### Step 3.1: Design Version API
|
||||||
|
|
||||||
|
**File**: `include/c_utils/version.h`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifndef C_UTILS_VERSION_H
|
||||||
|
#define C_UTILS_VERSION_H
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Version information structure
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
int major;
|
||||||
|
int minor;
|
||||||
|
int patch;
|
||||||
|
char git_hash[41]; // SHA-1 hash (40 chars + null)
|
||||||
|
char build_date[32]; // ISO 8601 format
|
||||||
|
char version_string[64]; // "vX.Y.Z" format
|
||||||
|
} version_info_t;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Extract version from git tags
|
||||||
|
* @param version Output version structure
|
||||||
|
* @return 0 on success, -1 on error
|
||||||
|
*/
|
||||||
|
int version_get_from_git(version_info_t* version);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Generate version header file for a project
|
||||||
|
* @param output_path Path to output header file
|
||||||
|
* @param prefix Prefix for macros (e.g., "MY_APP")
|
||||||
|
* @return 0 on success, -1 on error
|
||||||
|
*/
|
||||||
|
int version_generate_header(const char* output_path, const char* prefix);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Compare two versions
|
||||||
|
* @return -1 if v1 < v2, 0 if equal, 1 if v1 > v2
|
||||||
|
*/
|
||||||
|
int version_compare(const version_info_t* v1, const version_info_t* v2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Format version as string
|
||||||
|
* @param version Version structure
|
||||||
|
* @param buffer Output buffer
|
||||||
|
* @param buffer_size Size of output buffer
|
||||||
|
* @return Number of characters written
|
||||||
|
*/
|
||||||
|
int version_to_string(const version_info_t* version, char* buffer, size_t buffer_size);
|
||||||
|
|
||||||
|
#endif /* C_UTILS_VERSION_H */
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3.2: Implement Version Utilities
|
||||||
|
|
||||||
|
**File**: `src/version.c`
|
||||||
|
|
||||||
|
Key functions to implement:
|
||||||
|
1. `version_get_from_git()` - Execute `git describe --tags` and parse
|
||||||
|
2. `version_generate_header()` - Generate header file with macros
|
||||||
|
3. `version_compare()` - Semantic version comparison
|
||||||
|
4. `version_to_string()` - Format version string
|
||||||
|
|
||||||
|
### Step 3.3: Create Version Generation Script
|
||||||
|
|
||||||
|
**File**: `bin/generate_version`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Generate version header for a project
|
||||||
|
|
||||||
|
OUTPUT_FILE="$1"
|
||||||
|
PREFIX="$2"
|
||||||
|
|
||||||
|
if [ -z "$OUTPUT_FILE" ] || [ -z "$PREFIX" ]; then
|
||||||
|
echo "Usage: $0 <output_file> <prefix>"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get version from git
|
||||||
|
if [ -d .git ]; then
|
||||||
|
VERSION=$(git describe --tags --always 2>/dev/null || echo "v0.0.0")
|
||||||
|
GIT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
|
||||||
|
else
|
||||||
|
VERSION="v0.0.0"
|
||||||
|
GIT_HASH="unknown"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parse version
|
||||||
|
CLEAN_VERSION=$(echo "$VERSION" | sed 's/^v//' | cut -d- -f1)
|
||||||
|
MAJOR=$(echo "$CLEAN_VERSION" | cut -d. -f1)
|
||||||
|
MINOR=$(echo "$CLEAN_VERSION" | cut -d. -f2)
|
||||||
|
PATCH=$(echo "$CLEAN_VERSION" | cut -d. -f3)
|
||||||
|
BUILD_DATE=$(date -u +"%Y-%m-%d %H:%M:%S UTC")
|
||||||
|
|
||||||
|
# Generate header
|
||||||
|
cat > "$OUTPUT_FILE" << EOF
|
||||||
|
/* Auto-generated by c_utils_lib version system */
|
||||||
|
/* DO NOT EDIT - This file is automatically generated */
|
||||||
|
|
||||||
|
#ifndef ${PREFIX}_VERSION_H
|
||||||
|
#define ${PREFIX}_VERSION_H
|
||||||
|
|
||||||
|
#define ${PREFIX}_VERSION "v${CLEAN_VERSION}"
|
||||||
|
#define ${PREFIX}_VERSION_MAJOR ${MAJOR}
|
||||||
|
#define ${PREFIX}_VERSION_MINOR ${MINOR}
|
||||||
|
#define ${PREFIX}_VERSION_PATCH ${PATCH}
|
||||||
|
#define ${PREFIX}_GIT_HASH "${GIT_HASH}"
|
||||||
|
#define ${PREFIX}_BUILD_DATE "${BUILD_DATE}"
|
||||||
|
|
||||||
|
#endif /* ${PREFIX}_VERSION_H */
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Generated $OUTPUT_FILE with version v${CLEAN_VERSION}"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Phase 4: Build System
|
||||||
|
|
||||||
|
### Step 4.1: Create Makefile
|
||||||
|
|
||||||
|
**File**: `Makefile`
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# c_utils_lib Makefile
|
||||||
|
|
||||||
|
CC = gcc
|
||||||
|
AR = ar
|
||||||
|
CFLAGS = -Wall -Wextra -std=c99 -O2 -g
|
||||||
|
INCLUDES = -Iinclude
|
||||||
|
|
||||||
|
# Directories
|
||||||
|
SRC_DIR = src
|
||||||
|
INCLUDE_DIR = include
|
||||||
|
BUILD_DIR = build
|
||||||
|
EXAMPLES_DIR = examples
|
||||||
|
TESTS_DIR = tests
|
||||||
|
|
||||||
|
# Source files
|
||||||
|
SOURCES = $(wildcard $(SRC_DIR)/*.c)
|
||||||
|
OBJECTS = $(SOURCES:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
|
||||||
|
|
||||||
|
# Output library
|
||||||
|
LIBRARY = libc_utils.a
|
||||||
|
|
||||||
|
# Default target
|
||||||
|
all: $(LIBRARY)
|
||||||
|
|
||||||
|
# Create build directory
|
||||||
|
$(BUILD_DIR):
|
||||||
|
mkdir -p $(BUILD_DIR)
|
||||||
|
|
||||||
|
# Compile source files
|
||||||
|
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
|
||||||
|
$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
|
||||||
|
|
||||||
|
# Create static library
|
||||||
|
$(LIBRARY): $(OBJECTS)
|
||||||
|
$(AR) rcs $@ $^
|
||||||
|
@echo "Built $(LIBRARY)"
|
||||||
|
|
||||||
|
# Build examples
|
||||||
|
examples: $(LIBRARY)
|
||||||
|
$(MAKE) -C $(EXAMPLES_DIR)
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
test: $(LIBRARY)
|
||||||
|
$(MAKE) -C $(TESTS_DIR)
|
||||||
|
$(TESTS_DIR)/run_tests.sh
|
||||||
|
|
||||||
|
# Install to system (optional)
|
||||||
|
install: $(LIBRARY)
|
||||||
|
install -d /usr/local/lib
|
||||||
|
install -m 644 $(LIBRARY) /usr/local/lib/
|
||||||
|
install -d /usr/local/include/c_utils
|
||||||
|
install -m 644 $(INCLUDE_DIR)/c_utils/*.h /usr/local/include/c_utils/
|
||||||
|
@echo "Installed to /usr/local"
|
||||||
|
|
||||||
|
# Uninstall from system
|
||||||
|
uninstall:
|
||||||
|
rm -f /usr/local/lib/$(LIBRARY)
|
||||||
|
rm -rf /usr/local/include/c_utils
|
||||||
|
@echo "Uninstalled from /usr/local"
|
||||||
|
|
||||||
|
# Clean build artifacts
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILD_DIR) $(LIBRARY)
|
||||||
|
$(MAKE) -C $(EXAMPLES_DIR) clean 2>/dev/null || true
|
||||||
|
$(MAKE) -C $(TESTS_DIR) clean 2>/dev/null || true
|
||||||
|
|
||||||
|
# Help
|
||||||
|
help:
|
||||||
|
@echo "c_utils_lib Build System"
|
||||||
|
@echo ""
|
||||||
|
@echo "Targets:"
|
||||||
|
@echo " all Build static library (default)"
|
||||||
|
@echo " examples Build examples"
|
||||||
|
@echo " test Run tests"
|
||||||
|
@echo " install Install to /usr/local"
|
||||||
|
@echo " uninstall Remove from /usr/local"
|
||||||
|
@echo " clean Clean build artifacts"
|
||||||
|
@echo " help Show this help"
|
||||||
|
|
||||||
|
.PHONY: all examples test install uninstall clean help
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4.2: Create Build Script
|
||||||
|
|
||||||
|
**File**: `build.sh`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# c_utils_lib build script
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
lib|"")
|
||||||
|
echo "Building c_utils_lib..."
|
||||||
|
make
|
||||||
|
;;
|
||||||
|
examples)
|
||||||
|
echo "Building examples..."
|
||||||
|
make examples
|
||||||
|
;;
|
||||||
|
test)
|
||||||
|
echo "Running tests..."
|
||||||
|
make test
|
||||||
|
;;
|
||||||
|
clean)
|
||||||
|
echo "Cleaning..."
|
||||||
|
make clean
|
||||||
|
;;
|
||||||
|
install)
|
||||||
|
echo "Installing..."
|
||||||
|
make install
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: ./build.sh [lib|examples|test|clean|install]"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "Done!"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Phase 5: Examples & Tests
|
||||||
|
|
||||||
|
### Step 5.1: Create Debug Example
|
||||||
|
|
||||||
|
**File**: `examples/debug_example.c`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <c_utils/debug.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
// Initialize with INFO level
|
||||||
|
debug_init(DEBUG_LEVEL_INFO);
|
||||||
|
|
||||||
|
DEBUG_INFO("Application started");
|
||||||
|
DEBUG_WARN("This is a warning");
|
||||||
|
DEBUG_ERROR("This is an error");
|
||||||
|
|
||||||
|
// This won't print (level too high)
|
||||||
|
DEBUG_LOG("This debug message won't show");
|
||||||
|
|
||||||
|
// Change level to DEBUG
|
||||||
|
g_debug_level = DEBUG_LEVEL_DEBUG;
|
||||||
|
DEBUG_LOG("Now debug messages show");
|
||||||
|
|
||||||
|
// Change to TRACE to see file:line info
|
||||||
|
g_debug_level = DEBUG_LEVEL_TRACE;
|
||||||
|
DEBUG_TRACE("Trace with file:line information");
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5.2: Create Version Example
|
||||||
|
|
||||||
|
**File**: `examples/version_example.c`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <c_utils/version.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
version_info_t version;
|
||||||
|
|
||||||
|
// Get version from git
|
||||||
|
if (version_get_from_git(&version) == 0) {
|
||||||
|
char version_str[64];
|
||||||
|
version_to_string(&version, version_str, sizeof(version_str));
|
||||||
|
|
||||||
|
printf("Version: %s\n", version_str);
|
||||||
|
printf("Git Hash: %s\n", version.git_hash);
|
||||||
|
printf("Build Date: %s\n", version.build_date);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5.3: Create Test Suite
|
||||||
|
|
||||||
|
**File**: `tests/test_debug.c`
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <c_utils/debug.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
int test_debug_init() {
|
||||||
|
debug_init(DEBUG_LEVEL_INFO);
|
||||||
|
return (g_debug_level == DEBUG_LEVEL_INFO) ? 0 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int test_debug_levels() {
|
||||||
|
// Test that higher levels don't print at lower settings
|
||||||
|
debug_init(DEBUG_LEVEL_ERROR);
|
||||||
|
// Would need to capture stdout to verify
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
int failed = 0;
|
||||||
|
|
||||||
|
printf("Running debug tests...\n");
|
||||||
|
|
||||||
|
if (test_debug_init() != 0) {
|
||||||
|
printf("FAIL: test_debug_init\n");
|
||||||
|
failed++;
|
||||||
|
} else {
|
||||||
|
printf("PASS: test_debug_init\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (test_debug_levels() != 0) {
|
||||||
|
printf("FAIL: test_debug_levels\n");
|
||||||
|
failed++;
|
||||||
|
} else {
|
||||||
|
printf("PASS: test_debug_levels\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return failed;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Phase 6: Documentation
|
||||||
|
|
||||||
|
### Step 6.1: Create README.md
|
||||||
|
|
||||||
|
Key sections:
|
||||||
|
1. Overview and purpose
|
||||||
|
2. Quick start guide
|
||||||
|
3. Installation instructions
|
||||||
|
4. Usage examples
|
||||||
|
5. API reference (brief)
|
||||||
|
6. Integration guide
|
||||||
|
7. Contributing guidelines
|
||||||
|
8. License
|
||||||
|
|
||||||
|
### Step 6.2: Create API Documentation
|
||||||
|
|
||||||
|
**File**: `docs/API.md`
|
||||||
|
|
||||||
|
Complete API reference with:
|
||||||
|
- Function signatures
|
||||||
|
- Parameter descriptions
|
||||||
|
- Return values
|
||||||
|
- Usage examples
|
||||||
|
- Common patterns
|
||||||
|
|
||||||
|
### Step 6.3: Create Integration Guide
|
||||||
|
|
||||||
|
**File**: `docs/INTEGRATION.md`
|
||||||
|
|
||||||
|
How to integrate into projects:
|
||||||
|
1. As git submodule
|
||||||
|
2. Makefile integration
|
||||||
|
3. Code examples
|
||||||
|
4. Migration from standalone utilities
|
||||||
|
|
||||||
|
## Phase 7: Integration with c-relay
|
||||||
|
|
||||||
|
### Step 7.1: Add as Submodule
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /path/to/c-relay
|
||||||
|
git submodule add <repo-url> c_utils_lib
|
||||||
|
git submodule update --init --recursive
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 7.2: Update c-relay Makefile
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# Add to c-relay Makefile
|
||||||
|
C_UTILS_LIB = c_utils_lib/libc_utils.a
|
||||||
|
|
||||||
|
# Update includes
|
||||||
|
INCLUDES += -Ic_utils_lib/include
|
||||||
|
|
||||||
|
# Update libs
|
||||||
|
LIBS += -Lc_utils_lib -lc_utils
|
||||||
|
|
||||||
|
# Add dependency
|
||||||
|
$(C_UTILS_LIB):
|
||||||
|
cd c_utils_lib && ./build.sh lib
|
||||||
|
|
||||||
|
# Update main target
|
||||||
|
$(TARGET): $(C_UTILS_LIB) ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 7.3: Update c-relay Source Files
|
||||||
|
|
||||||
|
**Changes needed**:
|
||||||
|
|
||||||
|
1. Update includes:
|
||||||
|
```c
|
||||||
|
// Old
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
// New
|
||||||
|
#include <c_utils/debug.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Remove old debug files:
|
||||||
|
```bash
|
||||||
|
git rm src/debug.c src/debug.h
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Update all files that use debug system:
|
||||||
|
- `src/main.c`
|
||||||
|
- `src/config.c`
|
||||||
|
- `src/dm_admin.c`
|
||||||
|
- `src/websockets.c`
|
||||||
|
- `src/subscriptions.c`
|
||||||
|
- Any other files using DEBUG_* macros
|
||||||
|
|
||||||
|
### Step 7.4: Test Integration
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd c-relay
|
||||||
|
make clean
|
||||||
|
make
|
||||||
|
./make_and_restart_relay.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify:
|
||||||
|
- Compilation succeeds
|
||||||
|
- Debug output works correctly
|
||||||
|
- No functionality regressions
|
||||||
|
|
||||||
|
## Phase 8: Version System Integration
|
||||||
|
|
||||||
|
### Step 8.1: Update c-relay Makefile for Versioning
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
# Add version generation
|
||||||
|
src/version.h: .git/refs/tags/*
|
||||||
|
c_utils_lib/bin/generate_version src/version.h C_RELAY
|
||||||
|
|
||||||
|
# Add dependency
|
||||||
|
$(TARGET): src/version.h ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 8.2: Update c-relay to Use Generated Version
|
||||||
|
|
||||||
|
Replace hardcoded version in `src/main.h` with:
|
||||||
|
```c
|
||||||
|
#include "version.h"
|
||||||
|
// Use C_RELAY_VERSION instead of hardcoded VERSION
|
||||||
|
```
|
||||||
|
|
||||||
|
## Timeline Estimate
|
||||||
|
|
||||||
|
- **Phase 1**: Repository Setup - 1 hour
|
||||||
|
- **Phase 2**: Debug System - 2 hours
|
||||||
|
- **Phase 3**: Version Utilities - 4 hours
|
||||||
|
- **Phase 4**: Build System - 2 hours
|
||||||
|
- **Phase 5**: Examples & Tests - 3 hours
|
||||||
|
- **Phase 6**: Documentation - 3 hours
|
||||||
|
- **Phase 7**: c-relay Integration - 2 hours
|
||||||
|
- **Phase 8**: Version Integration - 2 hours
|
||||||
|
|
||||||
|
**Total**: ~19 hours
|
||||||
|
|
||||||
|
## Success Criteria
|
||||||
|
|
||||||
|
- [ ] c_utils_lib builds successfully
|
||||||
|
- [ ] All tests pass
|
||||||
|
- [ ] Examples compile and run
|
||||||
|
- [ ] c-relay integrates successfully
|
||||||
|
- [ ] Debug output works in c-relay
|
||||||
|
- [ ] Version generation works
|
||||||
|
- [ ] Documentation complete
|
||||||
|
- [ ] No regressions in c-relay functionality
|
||||||
|
|
||||||
|
## Next Steps
|
||||||
|
|
||||||
|
1. Review this plan with stakeholders
|
||||||
|
2. Create repository structure
|
||||||
|
3. Implement debug system
|
||||||
|
4. Implement version utilities
|
||||||
|
5. Create build system
|
||||||
|
6. Write tests and examples
|
||||||
|
7. Create documentation
|
||||||
|
8. Integrate into c-relay
|
||||||
|
9. Test thoroughly
|
||||||
|
10. Publish to GitHub
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Keep the API simple and intuitive
|
||||||
|
- Focus on zero external dependencies
|
||||||
|
- Prioritize learning value in code comments
|
||||||
|
- Make integration as easy as possible
|
||||||
|
- Document everything thoroughly
|
||||||
51
src/debug.c
51
src/debug.c
@@ -1,51 +0,0 @@
|
|||||||
#include "debug.h"
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
// Global debug level (default: no debug output)
|
|
||||||
debug_level_t g_debug_level = DEBUG_LEVEL_NONE;
|
|
||||||
|
|
||||||
void debug_init(int level) {
|
|
||||||
if (level < 0) level = 0;
|
|
||||||
if (level > 5) level = 5;
|
|
||||||
g_debug_level = (debug_level_t)level;
|
|
||||||
}
|
|
||||||
|
|
||||||
void debug_log(debug_level_t level, const char* file, int line, const char* format, ...) {
|
|
||||||
// Get timestamp
|
|
||||||
time_t now = time(NULL);
|
|
||||||
struct tm* tm_info = localtime(&now);
|
|
||||||
char timestamp[32];
|
|
||||||
strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", tm_info);
|
|
||||||
|
|
||||||
// Get level string
|
|
||||||
const char* level_str = "UNKNOWN";
|
|
||||||
switch (level) {
|
|
||||||
case DEBUG_LEVEL_ERROR: level_str = "ERROR"; break;
|
|
||||||
case DEBUG_LEVEL_WARN: level_str = "WARN "; break;
|
|
||||||
case DEBUG_LEVEL_INFO: level_str = "INFO "; break;
|
|
||||||
case DEBUG_LEVEL_DEBUG: level_str = "DEBUG"; break;
|
|
||||||
case DEBUG_LEVEL_TRACE: level_str = "TRACE"; break;
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print prefix with timestamp and level
|
|
||||||
printf("[%s] [%s] ", timestamp, level_str);
|
|
||||||
|
|
||||||
// Print source location when debug level is TRACE (5) or higher
|
|
||||||
if (file && g_debug_level >= DEBUG_LEVEL_TRACE) {
|
|
||||||
// Extract just the filename (not full path)
|
|
||||||
const char* filename = strrchr(file, '/');
|
|
||||||
filename = filename ? filename + 1 : file;
|
|
||||||
printf("[%s:%d] ", filename, line);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Print message
|
|
||||||
va_list args;
|
|
||||||
va_start(args, format);
|
|
||||||
vprintf(format, args);
|
|
||||||
va_end(args);
|
|
||||||
|
|
||||||
printf("\n");
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
43
src/debug.h
43
src/debug.h
@@ -1,43 +0,0 @@
|
|||||||
#ifndef DEBUG_H
|
|
||||||
#define DEBUG_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
// Debug levels
|
|
||||||
typedef enum {
|
|
||||||
DEBUG_LEVEL_NONE = 0,
|
|
||||||
DEBUG_LEVEL_ERROR = 1,
|
|
||||||
DEBUG_LEVEL_WARN = 2,
|
|
||||||
DEBUG_LEVEL_INFO = 3,
|
|
||||||
DEBUG_LEVEL_DEBUG = 4,
|
|
||||||
DEBUG_LEVEL_TRACE = 5
|
|
||||||
} debug_level_t;
|
|
||||||
|
|
||||||
// Global debug level (set at runtime via CLI)
|
|
||||||
extern debug_level_t g_debug_level;
|
|
||||||
|
|
||||||
// Initialize debug system
|
|
||||||
void debug_init(int level);
|
|
||||||
|
|
||||||
// Core logging function
|
|
||||||
void debug_log(debug_level_t level, const char* file, int line, const char* format, ...);
|
|
||||||
|
|
||||||
// Convenience macros that check level before calling
|
|
||||||
// Note: TRACE level (5) and above include file:line information for ALL messages
|
|
||||||
#define DEBUG_ERROR(...) \
|
|
||||||
do { if (g_debug_level >= DEBUG_LEVEL_ERROR) debug_log(DEBUG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__); } while(0)
|
|
||||||
|
|
||||||
#define DEBUG_WARN(...) \
|
|
||||||
do { if (g_debug_level >= DEBUG_LEVEL_WARN) debug_log(DEBUG_LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__); } while(0)
|
|
||||||
|
|
||||||
#define DEBUG_INFO(...) \
|
|
||||||
do { if (g_debug_level >= DEBUG_LEVEL_INFO) debug_log(DEBUG_LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__); } while(0)
|
|
||||||
|
|
||||||
#define DEBUG_LOG(...) \
|
|
||||||
do { if (g_debug_level >= DEBUG_LEVEL_DEBUG) debug_log(DEBUG_LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__); } while(0)
|
|
||||||
|
|
||||||
#define DEBUG_TRACE(...) \
|
|
||||||
do { if (g_debug_level >= DEBUG_LEVEL_TRACE) debug_log(DEBUG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__); } while(0)
|
|
||||||
|
|
||||||
#endif /* DEBUG_H */
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,18 +0,0 @@
|
|||||||
2025-10-11 13:46:17 - ==========================================
|
|
||||||
2025-10-11 13:46:17 - C-Relay Comprehensive Test Suite Runner
|
|
||||||
2025-10-11 13:46:17 - ==========================================
|
|
||||||
2025-10-11 13:46:17 - Relay URL: ws://127.0.0.1:8888
|
|
||||||
2025-10-11 13:46:17 - Log file: test_results_20251011_134617.log
|
|
||||||
2025-10-11 13:46:17 - Report file: test_report_20251011_134617.html
|
|
||||||
2025-10-11 13:46:17 -
|
|
||||||
2025-10-11 13:46:17 - Checking relay status at ws://127.0.0.1:8888...
|
|
||||||
2025-10-11 13:46:17 - \033[0;32m✓ Relay HTTP endpoint is accessible\033[0m
|
|
||||||
2025-10-11 13:46:17 -
|
|
||||||
2025-10-11 13:46:17 - Starting comprehensive test execution...
|
|
||||||
2025-10-11 13:46:17 -
|
|
||||||
2025-10-11 13:46:17 - \033[0;34m=== SECURITY TEST SUITES ===\033[0m
|
|
||||||
2025-10-11 13:46:17 - ==========================================
|
|
||||||
2025-10-11 13:46:17 - Running Test Suite: SQL Injection Tests
|
|
||||||
2025-10-11 13:46:17 - Description: Comprehensive SQL injection vulnerability testing
|
|
||||||
2025-10-11 13:46:17 - ==========================================
|
|
||||||
2025-10-11 13:46:17 - \033[0;31mERROR: Test script tests/sql_injection_tests.sh not found\033[0m
|
|
||||||
@@ -1,629 +0,0 @@
|
|||||||
2025-10-11 13:48:07 - ==========================================
|
|
||||||
2025-10-11 13:48:07 - C-Relay Comprehensive Test Suite Runner
|
|
||||||
2025-10-11 13:48:07 - ==========================================
|
|
||||||
2025-10-11 13:48:07 - Relay URL: ws://127.0.0.1:8888
|
|
||||||
2025-10-11 13:48:07 - Log file: test_results_20251011_134807.log
|
|
||||||
2025-10-11 13:48:07 - Report file: test_report_20251011_134807.html
|
|
||||||
2025-10-11 13:48:07 -
|
|
||||||
2025-10-11 13:48:07 - Checking relay status at ws://127.0.0.1:8888...
|
|
||||||
2025-10-11 13:48:07 - \033[0;32m✓ Relay HTTP endpoint is accessible\033[0m
|
|
||||||
2025-10-11 13:48:07 -
|
|
||||||
2025-10-11 13:48:07 - Starting comprehensive test execution...
|
|
||||||
2025-10-11 13:48:07 -
|
|
||||||
2025-10-11 13:48:07 - \033[0;34m=== SECURITY TEST SUITES ===\033[0m
|
|
||||||
2025-10-11 13:48:07 - ==========================================
|
|
||||||
2025-10-11 13:48:07 - Running Test Suite: SQL Injection Tests
|
|
||||||
2025-10-11 13:48:07 - Description: Comprehensive SQL injection vulnerability testing
|
|
||||||
2025-10-11 13:48:07 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay SQL Injection Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - Valid query works
|
|
||||||
|
|
||||||
=== Authors Filter SQL Injection Tests ===
|
|
||||||
Testing Authors filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== IDs Filter SQL Injection Tests ===
|
|
||||||
Testing IDs filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Kinds Filter SQL Injection Tests ===
|
|
||||||
Testing Kinds filter with string injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Kinds filter with negative value... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Kinds filter with very large value... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Search Filter SQL Injection Tests ===
|
|
||||||
Testing Search filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Tag Filter SQL Injection Tests ===
|
|
||||||
Testing #e tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
|
|
||||||
=== Timestamp Filter SQL Injection Tests ===
|
|
||||||
Testing Since parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Until parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Limit Parameter SQL Injection Tests ===
|
|
||||||
Testing Limit parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Limit with UNION... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Complex Multi-Filter SQL Injection Tests ===
|
|
||||||
Testing Multi-filter with authors injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Multi-filter with search injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Multi-filter with tag injection... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
|
|
||||||
=== COUNT Message SQL Injection Tests ===
|
|
||||||
Testing COUNT with authors payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Edge Case SQL Injection Tests ===
|
|
||||||
Testing Empty string injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Null byte injection... [0;32mPASSED[0m - SQL injection blocked (silently rejected)
|
|
||||||
Testing Unicode injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Very long injection payload... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Subscription ID SQL Injection Tests ===
|
|
||||||
Testing Subscription ID injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Subscription ID with quotes... [0;32mPASSED[0m - SQL injection blocked (silently rejected)
|
|
||||||
|
|
||||||
=== CLOSE Message SQL Injection Tests ===
|
|
||||||
Testing CLOSE with injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 318
|
|
||||||
Passed: [0;32m318[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32m✓ All SQL injection tests passed![0m
|
|
||||||
The relay appears to be protected against SQL injection attacks.
|
|
||||||
2025-10-11 13:48:30 - \033[0;32m✓ SQL Injection Tests PASSED\033[0m (Duration: 23s)
|
|
||||||
2025-10-11 13:48:30 - ==========================================
|
|
||||||
2025-10-11 13:48:30 - Running Test Suite: Filter Validation Tests
|
|
||||||
2025-10-11 13:48:30 - Description: Input validation for REQ and COUNT messages
|
|
||||||
2025-10-11 13:48:30 - ==========================================
|
|
||||||
=== C-Relay Filter Validation Tests ===
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
Testing Valid REQ message... [0;32mPASSED[0m
|
|
||||||
Testing Valid COUNT message... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Filter Array Validation ===
|
|
||||||
Testing Non-object filter... [0;32mPASSED[0m
|
|
||||||
Testing Too many filters... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Authors Validation ===
|
|
||||||
Testing Invalid author type... [0;32mPASSED[0m
|
|
||||||
Testing Invalid author hex... [0;32mPASSED[0m
|
|
||||||
Testing Too many authors... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing IDs Validation ===
|
|
||||||
Testing Invalid ID type... [0;32mPASSED[0m
|
|
||||||
Testing Invalid ID hex... [0;32mPASSED[0m
|
|
||||||
Testing Too many IDs... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Kinds Validation ===
|
|
||||||
Testing Invalid kind type... [0;32mPASSED[0m
|
|
||||||
Testing Negative kind... [0;32mPASSED[0m
|
|
||||||
Testing Too large kind... [0;32mPASSED[0m
|
|
||||||
Testing Too many kinds... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Timestamp Validation ===
|
|
||||||
Testing Invalid since type... [0;32mPASSED[0m
|
|
||||||
Testing Negative since... [0;32mPASSED[0m
|
|
||||||
Testing Invalid until type... [0;32mPASSED[0m
|
|
||||||
Testing Negative until... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Limit Validation ===
|
|
||||||
Testing Invalid limit type... [0;32mPASSED[0m
|
|
||||||
Testing Negative limit... [0;32mPASSED[0m
|
|
||||||
Testing Too large limit... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Search Validation ===
|
|
||||||
Testing Invalid search type... [0;32mPASSED[0m
|
|
||||||
Testing Search too long... [0;32mPASSED[0m
|
|
||||||
Testing Search SQL injection... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Tag Filter Validation ===
|
|
||||||
Testing Invalid tag filter type... [0;32mPASSED[0m
|
|
||||||
Testing Too many tag values... [0;32mPASSED[0m
|
|
||||||
Testing Tag value too long... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Rate Limiting ===
|
|
||||||
Testing rate limiting with malformed requests... [1;33mUNCERTAIN[0m - Rate limiting may not have triggered (this could be normal)
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 28
|
|
||||||
Passed: [0;32m28[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32mAll tests passed![0m
|
|
||||||
2025-10-11 13:48:35 - \033[0;32m✓ Filter Validation Tests PASSED\033[0m (Duration: 5s)
|
|
||||||
2025-10-11 13:48:35 - ==========================================
|
|
||||||
2025-10-11 13:48:35 - Running Test Suite: Subscription Validation Tests
|
|
||||||
2025-10-11 13:48:35 - Description: Subscription ID and message validation
|
|
||||||
2025-10-11 13:48:35 - ==========================================
|
|
||||||
Testing subscription ID validation fixes...
|
|
||||||
Testing malformed subscription IDs...
|
|
||||||
Valid ID test: Success
|
|
||||||
Testing CLOSE message validation...
|
|
||||||
CLOSE valid ID test: Success
|
|
||||||
Subscription validation tests completed.
|
|
||||||
2025-10-11 13:48:36 - \033[0;32m✓ Subscription Validation Tests PASSED\033[0m (Duration: 1s)
|
|
||||||
2025-10-11 13:48:36 - ==========================================
|
|
||||||
2025-10-11 13:48:36 - Running Test Suite: Memory Corruption Tests
|
|
||||||
2025-10-11 13:48:36 - Description: Buffer overflow and memory safety testing
|
|
||||||
2025-10-11 13:48:36 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Memory Corruption Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
Note: These tests may cause the relay to crash if vulnerabilities exist
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - No memory corruption detected
|
|
||||||
|
|
||||||
=== Subscription ID Memory Corruption Tests ===
|
|
||||||
Testing Empty subscription ID... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long subscription ID (1KB)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long subscription ID (10KB)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with null bytes... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with special chars... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Unicode subscription ID... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with path traversal... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Filter Array Memory Corruption Tests ===
|
|
||||||
Testing Too many filters (50)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Concurrent Access Memory Tests ===
|
|
||||||
Testing Concurrent subscription creation... ["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760204917502714788", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
[0;32mPASSED[0m - Concurrent access handled safely
|
|
||||||
Testing Concurrent CLOSE operations...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[0;32mPASSED[0m - Concurrent access handled safely
|
|
||||||
|
|
||||||
=== Malformed JSON Memory Tests ===
|
|
||||||
Testing Unclosed JSON object... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Mismatched brackets... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Extra closing brackets... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Null bytes in JSON... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Large Message Memory Tests ===
|
|
||||||
Testing Very large filter array... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long search term... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 17
|
|
||||||
Passed: [0;32m17[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32m✓ All memory corruption tests passed![0m
|
|
||||||
The relay appears to handle memory safely.
|
|
||||||
2025-10-11 13:48:38 - \033[0;32m✓ Memory Corruption Tests PASSED\033[0m (Duration: 2s)
|
|
||||||
2025-10-11 13:48:38 - ==========================================
|
|
||||||
2025-10-11 13:48:38 - Running Test Suite: Input Validation Tests
|
|
||||||
2025-10-11 13:48:38 - Description: Comprehensive input boundary testing
|
|
||||||
2025-10-11 13:48:38 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Input Validation Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Message Type Validation ===
|
|
||||||
Testing Invalid message type - string... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - number... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - null... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - object... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Empty message type... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Very long message type... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Message Structure Validation ===
|
|
||||||
Testing Too few arguments... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Too many arguments... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Non-array message... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Empty array... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Nested arrays incorrectly... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Subscription ID Boundary Tests ===
|
|
||||||
Testing Valid subscription ID... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with spaces... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with newlines... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with tabs... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with control chars... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Unicode subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Very long subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Filter Object Validation ===
|
|
||||||
Testing Valid empty filter... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-object filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Null filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Array filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Filter with invalid keys... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Authors Field Validation ===
|
|
||||||
Testing Valid authors array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty authors array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid hex in authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Short pubkey in authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== IDs Field Validation ===
|
|
||||||
Testing Valid ids array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty ids array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array ids... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Kinds Field Validation ===
|
|
||||||
Testing Valid kinds array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty kinds array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array kinds... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing String in kinds... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Timestamp Field Validation ===
|
|
||||||
Testing Valid since timestamp... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Valid until timestamp... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing String since timestamp... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Negative timestamp... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Limit Field Validation ===
|
|
||||||
Testing Valid limit... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Zero limit... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing String limit... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Negative limit... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Multiple Filters ===
|
|
||||||
Testing Two valid filters... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Many filters... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 47
|
|
||||||
Passed: 47
|
|
||||||
Failed: 0
|
|
||||||
[0;32m✓ All input validation tests passed![0m
|
|
||||||
The relay properly validates input.
|
|
||||||
2025-10-11 13:48:42 - \033[0;32m✓ Input Validation Tests PASSED\033[0m (Duration: 4s)
|
|
||||||
2025-10-11 13:48:42 -
|
|
||||||
2025-10-11 13:48:42 - \033[0;34m=== PERFORMANCE TEST SUITES ===\033[0m
|
|
||||||
2025-10-11 13:48:42 - ==========================================
|
|
||||||
2025-10-11 13:48:42 - Running Test Suite: Subscription Limit Tests
|
|
||||||
2025-10-11 13:48:42 - Description: Subscription limit enforcement testing
|
|
||||||
2025-10-11 13:48:42 - ==========================================
|
|
||||||
=== Subscription Limit Test ===
|
|
||||||
[INFO] Testing relay at: ws://127.0.0.1:8888
|
|
||||||
[INFO] Note: This test assumes default subscription limits (max 25 per client)
|
|
||||||
|
|
||||||
=== Test 1: Basic Connectivity ===
|
|
||||||
[INFO] Testing basic WebSocket connection...
|
|
||||||
[PASS] Basic connectivity works
|
|
||||||
|
|
||||||
=== Test 2: Subscription Limit Enforcement ===
|
|
||||||
[INFO] Testing subscription limits by creating multiple subscriptions...
|
|
||||||
[INFO] Creating multiple subscriptions within a single connection...
|
|
||||||
[INFO] Hit subscription limit at subscription 26
|
|
||||||
[PASS] Subscription limit enforcement working (limit hit after 25 subscriptions)
|
|
||||||
|
|
||||||
=== Test Complete ===
|
|
||||||
2025-10-11 13:48:42 - \033[0;32m✓ Subscription Limit Tests PASSED\033[0m (Duration: 0s)
|
|
||||||
2025-10-11 13:48:42 - ==========================================
|
|
||||||
2025-10-11 13:48:42 - Running Test Suite: Load Testing
|
|
||||||
2025-10-11 13:48:42 - Description: High concurrent connection testing
|
|
||||||
2025-10-11 13:48:42 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Load Testing Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
[0;31m✗ Cannot connect to relay. Aborting tests.[0m
|
|
||||||
2025-10-11 13:48:47 - \033[0;31m✗ Load Testing FAILED\033[0m (Duration: 5s)
|
|
||||||
@@ -1,728 +0,0 @@
|
|||||||
2025-10-11 14:11:34 - ==========================================
|
|
||||||
2025-10-11 14:11:34 - C-Relay Comprehensive Test Suite Runner
|
|
||||||
2025-10-11 14:11:34 - ==========================================
|
|
||||||
2025-10-11 14:11:34 - Relay URL: ws://127.0.0.1:8888
|
|
||||||
2025-10-11 14:11:34 - Log file: test_results_20251011_141134.log
|
|
||||||
2025-10-11 14:11:34 - Report file: test_report_20251011_141134.html
|
|
||||||
2025-10-11 14:11:34 -
|
|
||||||
2025-10-11 14:11:34 - Checking relay status at ws://127.0.0.1:8888...
|
|
||||||
2025-10-11 14:11:34 - \033[0;32m✓ Relay HTTP endpoint is accessible\033[0m
|
|
||||||
2025-10-11 14:11:34 -
|
|
||||||
2025-10-11 14:11:34 - Starting comprehensive test execution...
|
|
||||||
2025-10-11 14:11:34 -
|
|
||||||
2025-10-11 14:11:34 - \033[0;34m=== SECURITY TEST SUITES ===\033[0m
|
|
||||||
2025-10-11 14:11:34 - ==========================================
|
|
||||||
2025-10-11 14:11:34 - Running Test Suite: SQL Injection Tests
|
|
||||||
2025-10-11 14:11:34 - Description: Comprehensive SQL injection vulnerability testing
|
|
||||||
2025-10-11 14:11:34 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay SQL Injection Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - Valid query works
|
|
||||||
|
|
||||||
=== Authors Filter SQL Injection Tests ===
|
|
||||||
Testing Authors filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Authors filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== IDs Filter SQL Injection Tests ===
|
|
||||||
Testing IDs filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing IDs filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Kinds Filter SQL Injection Tests ===
|
|
||||||
Testing Kinds filter with string injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Kinds filter with negative value... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Kinds filter with very large value... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Search Filter SQL Injection Tests ===
|
|
||||||
Testing Search filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing Search filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Search filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Tag Filter SQL Injection Tests ===
|
|
||||||
Testing #e tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #e tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #p tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #t tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #r tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: /*... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: */... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: /**/... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing #d tag filter with payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
|
|
||||||
=== Timestamp Filter SQL Injection Tests ===
|
|
||||||
Testing Since parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Until parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Limit Parameter SQL Injection Tests ===
|
|
||||||
Testing Limit parameter injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Limit with UNION... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Complex Multi-Filter SQL Injection Tests ===
|
|
||||||
Testing Multi-filter with authors injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Multi-filter with search injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Multi-filter with tag injection... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
|
|
||||||
=== COUNT Message SQL Injection Tests ===
|
|
||||||
Testing COUNT with authors payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' OR '1'='1... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1; SELECT * FROM sqlite_master; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' OR 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: admin'--... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' UNION SELECT password FROM users --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND SLEEP(5) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=1 WAITFOR DELAY '0:0:5' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=CAST((SELECT version()) AS INT) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 1' AND 1=CONVERT(INT, (SELECT @@VERSION)) --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION SELECT 1,2,3 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' UNION ALL SELECT NULL,NULL,NULL --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; SELECT * FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DELETE FROM events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; UPDATE events SET content='hacked' WHERE 1=1; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: /*... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: */... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: /**/... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: #... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: #... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: 0x53514C5F494E4A454354494F4E... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: J1NSTCBJTkpFQ1RJT04gLS0=... [0;32mPASSED[0m - SQL injection blocked (query sanitized)
|
|
||||||
Testing COUNT with authors payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '))); DROP TABLE events; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ')) UNION SELECT NULL; --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND 1=1 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND 1=2 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: ' AND (SELECT COUNT(*) FROM events) > 0 --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; EXEC master..xp_cmdshell 'net user' --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with authors payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing COUNT with search payload: '; DECLARE @host varchar(1024); SELECT @host=(SELECT TOP 1 master..sys.fn_varbintohexstr(password_hash) FROM sys.sql_logins WHERE name='sa'); --... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Edge Case SQL Injection Tests ===
|
|
||||||
Testing Empty string injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Null byte injection... [0;32mPASSED[0m - SQL injection blocked (silently rejected)
|
|
||||||
Testing Unicode injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Very long injection payload... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Subscription ID SQL Injection Tests ===
|
|
||||||
Testing Subscription ID injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
Testing Subscription ID with quotes... [0;32mPASSED[0m - SQL injection blocked (silently rejected)
|
|
||||||
|
|
||||||
=== CLOSE Message SQL Injection Tests ===
|
|
||||||
Testing CLOSE with injection... [0;32mPASSED[0m - SQL injection blocked (rejected with error)
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 318
|
|
||||||
Passed: [0;32m318[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32m✓ All SQL injection tests passed![0m
|
|
||||||
The relay appears to be protected against SQL injection attacks.
|
|
||||||
2025-10-11 14:11:56 - \033[0;32m✓ SQL Injection Tests PASSED\033[0m (Duration: 22s)
|
|
||||||
2025-10-11 14:11:56 - ==========================================
|
|
||||||
2025-10-11 14:11:56 - Running Test Suite: Filter Validation Tests
|
|
||||||
2025-10-11 14:11:56 - Description: Input validation for REQ and COUNT messages
|
|
||||||
2025-10-11 14:11:56 - ==========================================
|
|
||||||
=== C-Relay Filter Validation Tests ===
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
Testing Valid REQ message... [0;32mPASSED[0m
|
|
||||||
Testing Valid COUNT message... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Filter Array Validation ===
|
|
||||||
Testing Non-object filter... [0;32mPASSED[0m
|
|
||||||
Testing Too many filters... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Authors Validation ===
|
|
||||||
Testing Invalid author type... [0;32mPASSED[0m
|
|
||||||
Testing Invalid author hex... [0;32mPASSED[0m
|
|
||||||
Testing Too many authors... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing IDs Validation ===
|
|
||||||
Testing Invalid ID type... [0;32mPASSED[0m
|
|
||||||
Testing Invalid ID hex... [0;32mPASSED[0m
|
|
||||||
Testing Too many IDs... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Kinds Validation ===
|
|
||||||
Testing Invalid kind type... [0;32mPASSED[0m
|
|
||||||
Testing Negative kind... [0;32mPASSED[0m
|
|
||||||
Testing Too large kind... [0;32mPASSED[0m
|
|
||||||
Testing Too many kinds... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Timestamp Validation ===
|
|
||||||
Testing Invalid since type... [0;32mPASSED[0m
|
|
||||||
Testing Negative since... [0;32mPASSED[0m
|
|
||||||
Testing Invalid until type... [0;32mPASSED[0m
|
|
||||||
Testing Negative until... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Limit Validation ===
|
|
||||||
Testing Invalid limit type... [0;32mPASSED[0m
|
|
||||||
Testing Negative limit... [0;32mPASSED[0m
|
|
||||||
Testing Too large limit... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Search Validation ===
|
|
||||||
Testing Invalid search type... [0;32mPASSED[0m
|
|
||||||
Testing Search too long... [0;32mPASSED[0m
|
|
||||||
Testing Search SQL injection... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Tag Filter Validation ===
|
|
||||||
Testing Invalid tag filter type... [0;32mPASSED[0m
|
|
||||||
Testing Too many tag values... [0;32mPASSED[0m
|
|
||||||
Testing Tag value too long... [0;32mPASSED[0m
|
|
||||||
|
|
||||||
=== Testing Rate Limiting ===
|
|
||||||
Testing rate limiting with malformed requests... [1;33mUNCERTAIN[0m - Rate limiting may not have triggered (this could be normal)
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 28
|
|
||||||
Passed: [0;32m28[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32mAll tests passed![0m
|
|
||||||
2025-10-11 14:12:02 - \033[0;32m✓ Filter Validation Tests PASSED\033[0m (Duration: 6s)
|
|
||||||
2025-10-11 14:12:02 - ==========================================
|
|
||||||
2025-10-11 14:12:02 - Running Test Suite: Subscription Validation Tests
|
|
||||||
2025-10-11 14:12:02 - Description: Subscription ID and message validation
|
|
||||||
2025-10-11 14:12:02 - ==========================================
|
|
||||||
Testing subscription ID validation fixes...
|
|
||||||
Testing malformed subscription IDs...
|
|
||||||
Valid ID test: Success
|
|
||||||
Testing CLOSE message validation...
|
|
||||||
CLOSE valid ID test: Success
|
|
||||||
Subscription validation tests completed.
|
|
||||||
2025-10-11 14:12:02 - \033[0;32m✓ Subscription Validation Tests PASSED\033[0m (Duration: 0s)
|
|
||||||
2025-10-11 14:12:02 - ==========================================
|
|
||||||
2025-10-11 14:12:02 - Running Test Suite: Memory Corruption Tests
|
|
||||||
2025-10-11 14:12:02 - Description: Buffer overflow and memory safety testing
|
|
||||||
2025-10-11 14:12:02 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Memory Corruption Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
Note: These tests may cause the relay to crash if vulnerabilities exist
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - No memory corruption detected
|
|
||||||
|
|
||||||
=== Subscription ID Memory Corruption Tests ===
|
|
||||||
Testing Empty subscription ID... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long subscription ID (1KB)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long subscription ID (10KB)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with null bytes... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with special chars... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Unicode subscription ID... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Subscription ID with path traversal... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Filter Array Memory Corruption Tests ===
|
|
||||||
Testing Too many filters (50)... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Concurrent Access Memory Tests ===
|
|
||||||
Testing Concurrent subscription creation... ["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
["EVENT", "concurrent_1760206323991056473", { "id": "b3a2a79b768c304a8ad315a97319e3c6fd9d521844fc9f1e4228c75c453dd882", "pubkey": "aa4fc8665f5696e33db7e1a572e3b0f5b3d615837b0f362dcb1c8068b098c7b4", "created_at": 1760196143, "kind": 30001, "content": "Updated addressable event", "sig": "795671a831de31fbbdd6282585529f274f61bb6e8c974e597560d70989355f24c8ecfe70caf043e8fbc24ce65d9b0d562297c682af958cfcdd2ee137dd9bccb4", "tags": [["d", "test-article"], ["type", "addressable"], ["updated", "true"]] }]
|
|
||||||
[0;32mPASSED[0m - Concurrent access handled safely
|
|
||||||
Testing Concurrent CLOSE operations...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[0;32mPASSED[0m - Concurrent access handled safely
|
|
||||||
|
|
||||||
=== Malformed JSON Memory Tests ===
|
|
||||||
Testing Unclosed JSON object... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Mismatched brackets... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Extra closing brackets... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Null bytes in JSON... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Large Message Memory Tests ===
|
|
||||||
Testing Very large filter array... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
Testing Very long search term... [1;33mUNCERTAIN[0m - Expected error but got normal response
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 17
|
|
||||||
Passed: [0;32m17[0m
|
|
||||||
Failed: [0;31m0[0m
|
|
||||||
[0;32m✓ All memory corruption tests passed![0m
|
|
||||||
The relay appears to handle memory safely.
|
|
||||||
2025-10-11 14:12:05 - \033[0;32m✓ Memory Corruption Tests PASSED\033[0m (Duration: 3s)
|
|
||||||
2025-10-11 14:12:05 - ==========================================
|
|
||||||
2025-10-11 14:12:05 - Running Test Suite: Input Validation Tests
|
|
||||||
2025-10-11 14:12:05 - Description: Comprehensive input boundary testing
|
|
||||||
2025-10-11 14:12:05 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Input Validation Test Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
Testing Basic connectivity... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Message Type Validation ===
|
|
||||||
Testing Invalid message type - string... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - number... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - null... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid message type - object... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Empty message type... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Very long message type... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Message Structure Validation ===
|
|
||||||
Testing Too few arguments... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Too many arguments... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Non-array message... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Empty array... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Nested arrays incorrectly... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Subscription ID Boundary Tests ===
|
|
||||||
Testing Valid subscription ID... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with spaces... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with newlines... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with tabs... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Subscription ID with control chars... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Unicode subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Very long subscription ID... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Filter Object Validation ===
|
|
||||||
Testing Valid empty filter... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-object filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Null filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Array filter... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Filter with invalid keys... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Authors Field Validation ===
|
|
||||||
Testing Valid authors array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty authors array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Invalid hex in authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Short pubkey in authors... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== IDs Field Validation ===
|
|
||||||
Testing Valid ids array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty ids array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array ids... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Kinds Field Validation ===
|
|
||||||
Testing Valid kinds array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Empty kinds array... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Non-array kinds... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing String in kinds... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Timestamp Field Validation ===
|
|
||||||
Testing Valid since timestamp... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Valid until timestamp... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing String since timestamp... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Negative timestamp... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Limit Field Validation ===
|
|
||||||
Testing Valid limit... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Zero limit... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing String limit... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
Testing Negative limit... [0;32mPASSED[0m - Invalid input properly rejected
|
|
||||||
|
|
||||||
=== Multiple Filters ===
|
|
||||||
Testing Two valid filters... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
Testing Many filters... [0;32mPASSED[0m - Input accepted correctly
|
|
||||||
|
|
||||||
=== Test Results ===
|
|
||||||
Total tests: 47
|
|
||||||
Passed: 47
|
|
||||||
Failed: 0
|
|
||||||
[0;32m✓ All input validation tests passed![0m
|
|
||||||
The relay properly validates input.
|
|
||||||
2025-10-11 14:12:08 - \033[0;32m✓ Input Validation Tests PASSED\033[0m (Duration: 3s)
|
|
||||||
2025-10-11 14:12:08 -
|
|
||||||
2025-10-11 14:12:08 - \033[0;34m=== PERFORMANCE TEST SUITES ===\033[0m
|
|
||||||
2025-10-11 14:12:08 - ==========================================
|
|
||||||
2025-10-11 14:12:08 - Running Test Suite: Subscription Limit Tests
|
|
||||||
2025-10-11 14:12:08 - Description: Subscription limit enforcement testing
|
|
||||||
2025-10-11 14:12:08 - ==========================================
|
|
||||||
=== Subscription Limit Test ===
|
|
||||||
[INFO] Testing relay at: ws://127.0.0.1:8888
|
|
||||||
[INFO] Note: This test assumes default subscription limits (max 25 per client)
|
|
||||||
|
|
||||||
=== Test 1: Basic Connectivity ===
|
|
||||||
[INFO] Testing basic WebSocket connection...
|
|
||||||
[PASS] Basic connectivity works
|
|
||||||
|
|
||||||
=== Test 2: Subscription Limit Enforcement ===
|
|
||||||
[INFO] Testing subscription limits by creating multiple subscriptions...
|
|
||||||
[INFO] Creating multiple subscriptions within a single connection...
|
|
||||||
[INFO] Hit subscription limit at subscription 26
|
|
||||||
[PASS] Subscription limit enforcement working (limit hit after 25 subscriptions)
|
|
||||||
|
|
||||||
=== Test Complete ===
|
|
||||||
2025-10-11 14:12:09 - \033[0;32m✓ Subscription Limit Tests PASSED\033[0m (Duration: 1s)
|
|
||||||
2025-10-11 14:12:09 - ==========================================
|
|
||||||
2025-10-11 14:12:09 - Running Test Suite: Load Testing
|
|
||||||
2025-10-11 14:12:09 - Description: High concurrent connection testing
|
|
||||||
2025-10-11 14:12:09 - ==========================================
|
|
||||||
==========================================
|
|
||||||
C-Relay Load Testing Suite
|
|
||||||
==========================================
|
|
||||||
Testing against relay at ws://127.0.0.1:8888
|
|
||||||
|
|
||||||
=== Basic Connectivity Test ===
|
|
||||||
[0;32m✓ Relay is accessible[0m
|
|
||||||
|
|
||||||
==========================================
|
|
||||||
Load Test: Light Load Test
|
|
||||||
Description: Basic load test with moderate concurrent connections
|
|
||||||
Concurrent clients: 10
|
|
||||||
Messages per client: 5
|
|
||||||
==========================================
|
|
||||||
Launching 10 clients...
|
|
||||||
All clients completed. Processing results...
|
|
||||||
|
|
||||||
=== Load Test Results ===
|
|
||||||
Test duration: 1s
|
|
||||||
Total connections attempted: 10
|
|
||||||
Successful connections: 10
|
|
||||||
Failed connections: 0
|
|
||||||
Connection success rate: 100%
|
|
||||||
Messages expected: 50
|
|
||||||
Messages sent: 50
|
|
||||||
Messages received: 260
|
|
||||||
[0;32m✓ EXCELLENT: High connection success rate[0m
|
|
||||||
|
|
||||||
Checking relay responsiveness... [0;32m✓ Relay is still responsive[0m
|
|
||||||
|
|
||||||
==========================================
|
|
||||||
Load Test: Medium Load Test
|
|
||||||
Description: Moderate load test with higher concurrency
|
|
||||||
Concurrent clients: 25
|
|
||||||
Messages per client: 10
|
|
||||||
==========================================
|
|
||||||
Launching 25 clients...
|
|
||||||
All clients completed. Processing results...
|
|
||||||
|
|
||||||
=== Load Test Results ===
|
|
||||||
Test duration: 3s
|
|
||||||
Total connections attempted: 35
|
|
||||||
Successful connections: 25
|
|
||||||
Failed connections: 0
|
|
||||||
Connection success rate: 71%
|
|
||||||
Messages expected: 250
|
|
||||||
Messages sent: 250
|
|
||||||
Messages received: 1275
|
|
||||||
[0;31m✗ POOR: Low connection success rate[0m
|
|
||||||
|
|
||||||
Checking relay responsiveness... [0;32m✓ Relay is still responsive[0m
|
|
||||||
|
|
||||||
==========================================
|
|
||||||
Load Test: Heavy Load Test
|
|
||||||
Description: Heavy load test with high concurrency
|
|
||||||
Concurrent clients: 50
|
|
||||||
Messages per client: 20
|
|
||||||
==========================================
|
|
||||||
Launching 50 clients...
|
|
||||||
All clients completed. Processing results...
|
|
||||||
|
|
||||||
=== Load Test Results ===
|
|
||||||
Test duration: 13s
|
|
||||||
Total connections attempted: 85
|
|
||||||
Successful connections: 50
|
|
||||||
Failed connections: 0
|
|
||||||
Connection success rate: 58%
|
|
||||||
Messages expected: 1000
|
|
||||||
Messages sent: 1000
|
|
||||||
Messages received: 5050
|
|
||||||
[0;31m✗ POOR: Low connection success rate[0m
|
|
||||||
|
|
||||||
Checking relay responsiveness... [0;32m✓ Relay is still responsive[0m
|
|
||||||
|
|
||||||
==========================================
|
|
||||||
Load Test: Stress Test
|
|
||||||
Description: Maximum load test to find breaking point
|
|
||||||
Concurrent clients: 100
|
|
||||||
Messages per client: 50
|
|
||||||
==========================================
|
|
||||||
Launching 100 clients...
|
|
||||||
All clients completed. Processing results...
|
|
||||||
|
|
||||||
=== Load Test Results ===
|
|
||||||
Test duration: 63s
|
|
||||||
Total connections attempted: 185
|
|
||||||
Successful connections: 100
|
|
||||||
Failed connections: 0
|
|
||||||
Connection success rate: 54%
|
|
||||||
Messages expected: 5000
|
|
||||||
Messages sent: 5000
|
|
||||||
Messages received: 15100
|
|
||||||
[0;31m✗ POOR: Low connection success rate[0m
|
|
||||||
|
|
||||||
Checking relay responsiveness... [0;32m✓ Relay is still responsive[0m
|
|
||||||
|
|
||||||
==========================================
|
|
||||||
Load Testing Complete
|
|
||||||
==========================================
|
|
||||||
All load tests completed. Check individual test results above.
|
|
||||||
If any tests failed, the relay may need optimization or have resource limits.
|
|
||||||
2025-10-11 14:13:31 - \033[0;32m✓ Load Testing PASSED\033[0m (Duration: 82s)
|
|
||||||
2025-10-11 14:13:31 - ==========================================
|
|
||||||
2025-10-11 14:13:31 - Running Test Suite: Stress Testing
|
|
||||||
2025-10-11 14:13:31 - Description: Resource usage and stability testing
|
|
||||||
2025-10-11 14:13:31 - ==========================================
|
|
||||||
2025-10-11 14:13:31 - \033[0;31mERROR: Test script stress_tests.sh not found\033[0m
|
|
||||||
Reference in New Issue
Block a user