Skip to content

Commit 123c8aa

Browse files
committed
Harden credential validation and optimize tunnel list caching
- Add pipe | validation for all do_manage_users credential inputs - Add whitespace trimming on all 8 credential input points - Fix ssh_enabled default from empty to "0" for slipnet URL consistency - Cache dnstm tunnel list in do_remove_tunnel (6+N calls reduced to 1)
1 parent 1141427 commit 123c8aa

1 file changed

Lines changed: 31 additions & 7 deletions

File tree

dnstm-setup.sh

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ generate_slipnet_url() {
796796
local name="${subdomain}.${DOMAIN}"
797797
local ns_domain="${subdomain}.${DOMAIN}"
798798
local resolver="8.8.8.8:53:0"
799-
local ssh_enabled="" ssh_port="22" ssh_host="127.0.0.1"
799+
local ssh_enabled="0" ssh_port="22" ssh_host="127.0.0.1"
800800
local auth_mode="0"
801801

802802
if [[ -n "$ssh_user" && -n "$ssh_pass" ]]; then
@@ -1055,18 +1055,22 @@ do_remove_tunnel() {
10551055
exit 1
10561056
fi
10571057

1058+
# Cache tunnel list output (reused throughout)
1059+
local tunnel_output
1060+
tunnel_output=$(dnstm tunnel list 2>/dev/null || true)
1061+
10581062
# Show current tunnels
10591063
print_header "Remove Tunnel"
10601064
echo ""
10611065
print_info "Current tunnels:"
10621066
echo ""
1063-
dnstm tunnel list 2>/dev/null || true
1067+
echo "$tunnel_output"
10641068
echo ""
10651069

10661070
# If no tag given, ask interactively
10671071
if [[ -z "$target_tag" ]]; then
10681072
local tags
1069-
tags=$(dnstm tunnel list 2>/dev/null | grep -o 'tag=[^ ]*' | sed 's/tag=//' || true)
1073+
tags=$(echo "$tunnel_output" | grep -o 'tag=[^ ]*' | sed 's/tag=//' || true)
10701074
if [[ -z "$tags" ]]; then
10711075
print_warn "No tunnels found."
10721076
exit 0
@@ -1077,7 +1081,7 @@ do_remove_tunnel() {
10771081
local tag_arr=()
10781082
for tag in $tags; do
10791083
local domain_info
1080-
domain_info=$(dnstm tunnel list 2>/dev/null | awk -v t="tag=${tag}" '{for(i=1;i<=NF;i++) if($i==t){print;next}}' | grep -o 'domain=[^ ]*' | sed 's/domain=//' || true)
1084+
domain_info=$(echo "$tunnel_output" | awk -v t="tag=${tag}" '{for(i=1;i<=NF;i++) if($i==t){print;next}}' | grep -o 'domain=[^ ]*' | sed 's/domain=//' || true)
10811085
echo -e " ${BOLD}${i})${NC} ${tag} ${DIM}(${domain_info})${NC}"
10821086
tag_arr+=("$tag")
10831087
i=$((i + 1))
@@ -1100,16 +1104,16 @@ do_remove_tunnel() {
11001104
fi
11011105

11021106
# Verify tunnel exists
1103-
if ! dnstm tunnel list 2>/dev/null | grep -o 'tag=[^ ]*' | grep -qxF "tag=${target_tag}"; then
1107+
if ! echo "$tunnel_output" | grep -o 'tag=[^ ]*' | grep -qxF "tag=${target_tag}"; then
11041108
print_fail "Tunnel '${target_tag}' not found."
11051109
echo ""
11061110
print_info "Available tunnels:"
1107-
dnstm tunnel list 2>/dev/null | grep -o 'tag=[^ ]*' | sed 's/tag=/ /' || true
1111+
echo "$tunnel_output" | grep -o 'tag=[^ ]*' | sed 's/tag=/ /' || true
11081112
exit 1
11091113
fi
11101114

11111115
local domain_info
1112-
domain_info=$(dnstm tunnel list 2>/dev/null | awk -v t="tag=${target_tag}" '{for(i=1;i<=NF;i++) if($i==t){print;next}}' | grep -o 'domain=[^ ]*' | sed 's/domain=//' || true)
1116+
domain_info=$(echo "$tunnel_output" | awk -v t="tag=${target_tag}" '{for(i=1;i<=NF;i++) if($i==t){print;next}}' | grep -o 'domain=[^ ]*' | sed 's/domain=//' || true)
11131117

11141118
echo ""
11151119
if ! prompt_yn "Remove tunnel '${target_tag}' (${domain_info})?" "n"; then
@@ -1588,6 +1592,7 @@ do_manage_users() {
15881592
echo ""
15891593
local new_user new_pass
15901594
new_user=$(prompt_input "Enter username for new tunnel user")
1595+
new_user=$(echo "$new_user" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
15911596
if [[ -z "$new_user" ]]; then
15921597
print_fail "Username cannot be empty"
15931598
continue
@@ -1597,6 +1602,11 @@ do_manage_users() {
15971602
continue
15981603
fi
15991604
new_pass=$(prompt_input "Enter password (leave blank to auto-generate)")
1605+
new_pass=$(echo "$new_pass" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
1606+
if [[ "$new_pass" == *"|"* ]]; then
1607+
print_fail "Password cannot contain the | character"
1608+
continue
1609+
fi
16001610
echo ""
16011611
if [[ -n "$new_pass" ]]; then
16021612
if sshtun-user create "$new_user" --insecure-password "$new_pass" 2>&1; then
@@ -1616,15 +1626,25 @@ do_manage_users() {
16161626
echo ""
16171627
local upd_user upd_pass
16181628
upd_user=$(prompt_input "Enter username to update")
1629+
upd_user=$(echo "$upd_user" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
16191630
if [[ -z "$upd_user" ]]; then
16201631
print_fail "Username cannot be empty"
16211632
continue
16221633
fi
1634+
if [[ "$upd_user" == *"|"* ]]; then
1635+
print_fail "Username cannot contain the | character"
1636+
continue
1637+
fi
16231638
upd_pass=$(prompt_input "Enter new password")
1639+
upd_pass=$(echo "$upd_pass" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
16241640
if [[ -z "$upd_pass" ]]; then
16251641
print_fail "Password cannot be empty"
16261642
continue
16271643
fi
1644+
if [[ "$upd_pass" == *"|"* ]]; then
1645+
print_fail "Password cannot contain the | character"
1646+
continue
1647+
fi
16281648
echo ""
16291649
if sshtun-user update "$upd_user" --insecure-password "$upd_pass" 2>&1; then
16301650
print_ok "Password updated for '${upd_user}'"
@@ -2428,6 +2448,7 @@ step_verify_microsocks() {
24282448
if prompt_yn "Enable SOCKS5 authentication for the proxy?" "y"; then
24292449
echo ""
24302450
SOCKS_USER=$(prompt_input "Enter SOCKS proxy username" "proxy")
2451+
SOCKS_USER=$(echo "$SOCKS_USER" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
24312452
if [[ -z "$SOCKS_USER" ]]; then
24322453
print_fail "Username cannot be empty"
24332454
SOCKS_USER="proxy"
@@ -2438,6 +2459,7 @@ step_verify_microsocks() {
24382459
SOCKS_USER="proxy"
24392460
fi
24402461
SOCKS_PASS=$(prompt_input "Enter SOCKS proxy password")
2462+
SOCKS_PASS=$(echo "$SOCKS_PASS" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
24412463
if [[ -z "$SOCKS_PASS" ]]; then
24422464
print_fail "Password cannot be empty — disabling SOCKS auth"
24432465
SOCKS_USER=""
@@ -2574,6 +2596,7 @@ step_ssh_user() {
25742596

25752597
# Get username
25762598
SSH_USER=$(prompt_input "Enter username for SSH tunnel user" "tunnel")
2599+
SSH_USER=$(echo "$SSH_USER" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
25772600
if [[ -z "$SSH_USER" ]]; then
25782601
print_fail "Username cannot be empty"
25792602
return
@@ -2585,6 +2608,7 @@ step_ssh_user() {
25852608

25862609
# Get password
25872610
SSH_PASS=$(prompt_input "Enter password for SSH tunnel user")
2611+
SSH_PASS=$(echo "$SSH_PASS" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
25882612
if [[ -z "$SSH_PASS" ]]; then
25892613
print_fail "Password cannot be empty"
25902614
return

0 commit comments

Comments
 (0)