#!/bin/bash
# v1.08
# 2025-08-06

# Defaults

. /etc/ntools/mail-config

function usage() {
cat << EOF
usage $0 [options] [username | mail@address]

This script delete a mail user in LDAP

OPTIONS
  -h         Show this message
  -u <name>  System username (forexample: <user_domain>)
  -d <dom>   Domain
  -D <dn>    LDAP Manager DN
  -w <pass>  LDAP Manager password
  -U <dn>    LDAP Users DN
  -G <dn>    LDAP Groups DN
  -M <dn>    LDAP Domains DN
  -b         Run in non-interactive mode
  -v         Verbose
EOF
	exit
}

function delete_user() {
	local SYS_USER_NAME
	SYS_USER_NAME="$1"

	local RESULT
	RESULT=$(cat <<EOF | ldapmodify -x -w "${LDAP_BIND_PASSWORD}" -D "${LDAP_BIND_DN}"
dn: uid=${SYS_USER_NAME},${LDAP_USERS_DN}
changetype: delete
EOF
	)
	[ "$IS_VERBOSE" ] && echo "$RESULT"
	unset LDAP_BIND_PASSWORD
}

while getopts ":hu:d:D:w:U:G:M:bv" OPTION; do
	case $OPTION in
		h)
			usage
		;;
		u)
			SYS_USER_NAME=$OPTARG
		;;
		d)
			MAIL_DOMAIN=$OPTARG
		;;
		D)
			LDAP_BIND_DN=$OPTARG
		;;
		w)
			LDAP_BIND_PASSWORD=$OPTARG
		;;
		U)
			LDAP_USERS_DN=$OPTARG
		;;
		G)
			LDAP_GROUPS_DN=$OPTARG
		;;
		M)
			LDAP_DOMAINS_DN=$OPTARG
		;;
		b)
			IS_NIMODE=1
		;;
		v)
			IS_VERBOSE=1
		;;
		\?)
			echo "Invalid option: -$OPTARG" >&2
			usage
		;;
		:)
			echo "Option -$OPTARG requires an argument." >&2
			usage
		;;
	esac
done

shift $((OPTIND -1))

MAIL_ADDRESS="$1"

[ -z "$2" ] || usage

while [ -z "$LDAP_BIND_DN" ]; do
	[ "$IS_NIMODE" ] && { echo "Error! LDAP Bind DN missed.";exit 1; }
	read -rp "LDAP Manager dn: " LDAP_BIND_DN
done

if [ -z "$LDAP_BIND_PASSWORD" ]; then
	read -rp "LDAP Manager Password: " -s LDAP_BIND_PASSWORD
	echo
fi

while [ -z "$LDAP_USERS_DN" ]; do
	[ "$IS_NIMODE" ] && { echo "Error! LDAP Users DN missed.";exit 1; }
	read -rp "LDAP Users dn: " LDAP_USERS_DN
done

while [ -z "$LDAP_GROUPS_DN" ]; do
	[ "$IS_NIMODE" ] && { echo "Error! LDAP Users DN missed.";exit 1; }
	read -rp "LDAP Groups dn: " LDAP_GROUPS_DN
done

while [ -z "$LDAP_DOMAINS_DN" ]; do
	[ "$IS_NIMODE" ] && { echo "Error! LDAP Domains DN missed.";exit 1; }
	read -rp "LDAP Domains dn: " LDAP_DOMAINS_DN
done

if [ -n "$MAIL_ADDRESS" ]; then
	USER_NAME=$(echo "$MAIL_ADDRESS" | cut -d@ -f1)
	[ -z "$USER_NAME" ] && { echo "Error! $MAIL_ADDRESS - wrong email address.";exit 1; }
	[ -z "$MAIL_DOMAIN" ] && MAIL_DOMAIN=$(echo "$MAIL_ADDRESS" | cut -s -d@ -f2)
	[ -z "$MAIL_DOMAIN" ] && MAIL_ADDRESS=''
fi

DOMAINS=$(ldapsearch -x -w "$LDAP_BIND_PASSWORD" -b "${LDAP_DOMAINS_DN}" -D "${LDAP_BIND_DN}" -LLL "(objectClass=mailDomain)" mailDomain | grep -e '^mail' | cut -d':' -f2 | sort)

if [ -z "$DOMAINS" ]; then
	echo "Mail domains not found. Please run 'maildomain add ...' first."
	exit 1
fi

if [ -n "$MAIL_DOMAIN" ]; then
	for cdom in $DOMAINS; do
		[ "$cdom" == "$MAIL_DOMAIN" ] && { DOMAINEXISTS=1; break; }
	done
	[ "$DOMAINEXISTS" ] || { echo "Error! Domain $MAIL_DOMAIN not exists.";exit 1; }
else
	while [ -z "$MAIL_DOMAIN" ]; do
		[ "$IS_NIMODE" ] && { echo "Error! Mail Domain missed.";exit 1; }
		echo "Select mail domain from list:"
		DOMARR=()
		for cdom in $DOMAINS; do
			echo "${#DOMARR[*]}: $cdom"
			DOMARR+=("$cdom")
		done
		read -rp "Enter number of domain [0]: " MAIL_DOMAIN_NUMBER
		[ -z "$MAIL_DOMAIN_NUMBER" ] && MAIL_DOMAIN_NUMBER=0
		MAIL_DOMAIN="${DOMARR[$MAIL_DOMAIN_NUMBER]}"
	done
fi

while [ -z "$USER_NAME" ]; do
	[ "$IS_NIMODE" ] && { echo "Error! User name missed.";exit 1; }
	read -rp "User name for @${MAIL_DOMAIN}: " USER_NAME
done

[ -z "$SYS_USER_NAME" ] && SYS_USER_NAME="${USER_NAME}_${MAIL_DOMAIN}"

FINDNAME=$(ldapsearch -x -w "$LDAP_BIND_PASSWORD" -b "${LDAP_USERS_DN}" -D "${LDAP_BIND_DN}" -LLL "(&(objectClass=mailAccount)(uid=$SYS_USER_NAME))" uid | grep -e '^uid')
[ -z "$FINDNAME" ] && { echo "Error! User $SYS_USER_NAME not exists."; exit 1; }

delete_user "$SYS_USER_NAME"
