summaryrefslogtreecommitdiffstats
path: root/fog-client.sh
diff options
context:
space:
mode:
Diffstat (limited to 'fog-client.sh')
-rw-r--r--fog-client.sh304
1 files changed, 0 insertions, 304 deletions
diff --git a/fog-client.sh b/fog-client.sh
deleted file mode 100644
index a141cf1..0000000
--- a/fog-client.sh
+++ /dev/null
@@ -1,304 +0,0 @@
-#!/bin/bash
-# fog-client.sh - Interactive SMTP client for fog network
-# Selects random entry node and sends message via Tor
-
-VERSION="2.0"
-
-# Colors
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-CYAN='\033[0;36m'
-BLUE='\033[0;34m'
-MAGENTA='\033[0;35m'
-NC='\033[0m'
-
-# fog network nodes (onion SMTP addresses)
-NODES=(
- "ej5dj774rkmfxvo3jexcmyotkq6bwgmr45dmwrbmk366lcvalnrgolad.onion 2525" # kvara
- "iycr4wfrdzieogdfeo7uxrj77w2vjlrhlrv3jg2ve62oe5aceqsqu7ad.onion 2525" # dries
- "66ehoz4ir6beuovmgt4gbpdfpmy43iuouj36dylqvkwgyp2dwpcbvjqd.onion 2525" # mct8
- "y3lozzcvvxgorgfofupvfmn4j2fuu3sz2sw7ha3ifpcsxjkuafllzvyd.onion 2525" # news
- "ejdrw3ka2mjhvsuz7uxjnzjircsdpoiu3a33g2xoywlafqetptjpqryd.onion 2525" # pietro
-)
-
-NODE_NAMES=("kvara" "dries" "mct8" "news" "pietro")
-
-print_header() {
- echo -e "${CYAN}"
- echo "========================================================="
- echo " fog Network Client v${VERSION} - Anonymous SMTP Relay"
- echo "========================================================="
- echo -e "${NC}"
-}
-
-check_dependencies() {
- local missing=0
-
- if ! command -v nc &> /dev/null; then
- echo -e "${RED}[x] netcat not found (apt install netcat-openbsd)${NC}"
- missing=1
- fi
-
- if ! command -v torify &> /dev/null; then
- echo -e "${RED}[x] torify not found (apt install tor)${NC}"
- missing=1
- fi
-
- if ! pgrep -x tor > /dev/null 2>&1; then
- echo -e "${RED}[x] Tor is not running (systemctl start tor)${NC}"
- missing=1
- fi
-
- if [ $missing -eq 1 ]; then
- exit 1
- fi
-
- echo -e "${GREEN}[ok] Dependencies ready${NC}"
- echo ""
-}
-
-# CSPRNG node selection (not bash $RANDOM)
-select_random_node() {
- local count=${#NODES[@]}
- local random_index
- random_index=$(od -An -tu4 -N4 /dev/urandom | tr -d ' ')
- random_index=$((random_index % count))
-
- SELECTED_NODE="${NODES[$random_index]}"
- SELECTED_NAME="${NODE_NAMES[$random_index]}"
-
- echo -e "${CYAN}Entry node:${NC} ${MAGENTA}${SELECTED_NAME}${NC}"
- echo ""
-}
-
-read_multiline() {
- local prompt="$1"
-
- echo -e "${YELLOW}${prompt}${NC}"
- echo -e "${CYAN}(End with a single dot '.' on its own line)${NC}"
-
- MULTILINE_RESULT=""
- local line
-
- while IFS= read -r line; do
- if [ "$line" = "." ]; then
- break
- fi
- MULTILINE_RESULT="${MULTILINE_RESULT}${line}"$'\r\n'
- done
-}
-
-send_message() {
- local from="$1"
- local to="$2"
- local subject="$3"
- local extra_headers="$4"
- local body="$5"
-
- local node_host node_port
- node_host=$(echo "$SELECTED_NODE" | awk '{print $1}')
- node_port=$(echo "$SELECTED_NODE" | awk '{print $2}')
-
- echo -e "${CYAN}Connecting to ${SELECTED_NAME} via Tor...${NC}"
- echo ""
-
- # SMTP conversation
- # No Date/Message-ID/User-Agent: exit node generates sanitized ones
- local response
- response=$(
- {
- sleep 2
- echo "EHLO localhost"
- sleep 1
- echo "MAIL FROM:<${from}>"
- sleep 0.5
- echo "RCPT TO:<${to}>"
- sleep 0.5
- echo "DATA"
- sleep 0.5
- printf "From: %s\r\n" "$from"
- printf "To: %s\r\n" "$to"
- printf "Subject: %s\r\n" "$subject"
- printf "MIME-Version: 1.0\r\n"
- printf "Content-Type: text/plain; charset=utf-8\r\n"
- printf "Content-Transfer-Encoding: 8bit\r\n"
- # Extra headers (Newsgroups, References, etc.)
- if [ -n "$extra_headers" ]; then
- printf "%s" "$extra_headers"
- fi
- printf "\r\n"
- # Body - use printf to avoid escape interpretation
- printf "%s" "$body"
- printf "\r\n.\r\n"
- sleep 1
- echo "QUIT"
- } | torify nc -w 30 "$node_host" "$node_port" 2>/dev/null
- )
-
- # Show server responses
- while IFS= read -r line; do
- if [ -n "$line" ]; then
- echo -e "${BLUE} <- ${line}${NC}"
- fi
- done <<< "$response"
-
- echo ""
-
- if echo "$response" | grep -q "^250.*queued"; then
- echo -e "${GREEN}[ok] Message accepted by ${SELECTED_NAME}${NC}"
- echo -e "${CYAN} Routing through Sphinx mixnet (3-6 hops)${NC}"
- return 0
- else
- echo -e "${RED}[fail] Message not accepted${NC}"
- return 1
- fi
-}
-
-interactive_mode() {
- echo -e "${CYAN}--- Compose Email ---${NC}"
- echo ""
-
- echo -e -n "${YELLOW}From: ${NC}"
- read -r from
- [ -z "$from" ] && { echo -e "${RED}Error: From required${NC}"; exit 1; }
-
- echo -e -n "${YELLOW}To: ${NC}"
- read -r to
- [ -z "$to" ] && { echo -e "${RED}Error: To required${NC}"; exit 1; }
-
- echo -e -n "${YELLOW}Subject: ${NC}"
- read -r subject
- [ -z "$subject" ] && subject="(no subject)"
-
- echo ""
- read_multiline "Body:"
- local body="$MULTILINE_RESULT"
- [ -z "$body" ] && { echo -e "${RED}Error: Body required${NC}"; exit 1; }
-
- echo ""
- echo -e "${YELLOW}---${NC}"
- echo -e " From: ${from}"
- echo -e " To: ${to}"
- echo -e " Subject: ${subject}"
- echo -e " Via: ${SELECTED_NAME}"
- echo -e "${YELLOW}---${NC}"
- echo ""
-
- echo -e -n "${YELLOW}Send? [y/N]: ${NC}"
- read -r confirm
- [[ ! "$confirm" =~ ^[Yy]$ ]] && { echo "Cancelled"; exit 0; }
-
- echo ""
- send_message "$from" "$to" "$subject" "" "$body"
-}
-
-usenet_mode() {
- echo -e "${CYAN}--- Compose Usenet Post ---${NC}"
- echo ""
-
- echo -e -n "${YELLOW}From (name): ${NC}"
- read -r from_name
- [ -z "$from_name" ] && from_name="Anonymous"
-
- echo -e -n "${YELLOW}From (email) [noreply@fog.network]: ${NC}"
- read -r from_email
- [ -z "$from_email" ] && from_email="noreply@fog.network"
- local from="${from_name} <${from_email}>"
-
- echo -e -n "${YELLOW}Newsgroups (e.g. alt.test): ${NC}"
- read -r newsgroups
- [ -z "$newsgroups" ] && { echo -e "${RED}Error: Newsgroups required${NC}"; exit 1; }
-
- echo -e -n "${YELLOW}Subject: ${NC}"
- read -r subject
- [ -z "$subject" ] && subject="(no subject)"
-
- echo -e -n "${YELLOW}References (Message-ID to reply to, empty for new post): ${NC}"
- read -r references
-
- echo ""
- read_multiline "Post body:"
- local body="$MULTILINE_RESULT"
- [ -z "$body" ] && { echo -e "${RED}Error: Body required${NC}"; exit 1; }
-
- # Mail2news gateway - destination
- echo ""
- echo -e "${CYAN}Mail2news gateways:${NC}"
- echo -e " 1) mail2news@dizum.com (clearnet via Tor)"
- echo -e " 2) mail2news@xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion"
- echo -e " 3) Custom address"
- echo -e -n "${YELLOW}Gateway [1]: ${NC}"
- read -r gw_choice
-
- local to
- case "$gw_choice" in
- 2) to="mail2news@xilb7y4kj6u6qfo45o3yk2kilfv54ffukzei3puonuqlncy7cn2afwyd.onion" ;;
- 3)
- echo -e -n "${YELLOW}Custom gateway address: ${NC}"
- read -r to
- [ -z "$to" ] && { echo -e "${RED}Error: Address required${NC}"; exit 1; }
- ;;
- *) to="mail2news@dizum.com" ;;
- esac
-
- # Build extra headers (Newsgroups goes in email headers, NOT body)
- local extra_headers
- extra_headers=$(printf "Newsgroups: %s\r\n" "$newsgroups")
- if [ -n "$references" ]; then
- extra_headers="${extra_headers}$(printf "References: %s\r\n" "$references")"
- fi
-
- echo ""
- echo -e "${YELLOW}---${NC}"
- echo -e " From: ${from}"
- echo -e " Newsgroups: ${newsgroups}"
- echo -e " Subject: ${subject}"
- [ -n "$references" ] && echo -e " References: ${references}"
- echo -e " Gateway: ${to}"
- echo -e " Via: ${SELECTED_NAME}"
- echo -e "${YELLOW}---${NC}"
- echo ""
-
- echo -e -n "${YELLOW}Post? [y/N]: ${NC}"
- read -r confirm
- [[ ! "$confirm" =~ ^[Yy]$ ]] && { echo "Cancelled"; exit 0; }
-
- echo ""
- send_message "$from" "$to" "$subject" "$extra_headers" "$body"
-}
-
-show_help() {
- echo "Usage: $0 [OPTION]"
- echo ""
- echo " -e, --email Compose email (default)"
- echo " -u, --usenet Compose Usenet post"
- echo " -v, --version Show version"
- echo " -h, --help Show this help"
-}
-
-# Main
-main() {
- local mode="email"
-
- while [[ $# -gt 0 ]]; do
- case $1 in
- -e|--email) mode="email"; shift ;;
- -u|--usenet) mode="usenet"; shift ;;
- -v|--version) echo "fog-client v${VERSION}"; exit 0 ;;
- -h|--help) show_help; exit 0 ;;
- *) echo "Unknown: $1"; show_help; exit 1 ;;
- esac
- done
-
- print_header
- check_dependencies
- select_random_node
-
- case "$mode" in
- email) interactive_mode ;;
- usenet) usenet_mode ;;
- esac
-}
-
-main "$@"