#!/bin/bash
# info: change domain owner
# options: DOMAIN USER
#
# The function of changing domain ownership.


#----------------------------------------------------------#
#                    Variable&Function                     #
#----------------------------------------------------------#

# Argument definition
domain=$1
user=$2

# Includes
source $HESTIA/func/ip.sh
source $HESTIA/func/main.sh
source $HESTIA/conf/hestia.conf


#----------------------------------------------------------#
#                    Verifications                         #
#----------------------------------------------------------#

check_args '2' "$#" 'DOMAIN USER'
is_format_valid 'domain' 'user'
is_object_valid 'user' 'USER' "$user"
is_object_unsuspended 'user' 'USER' "$user"
owner=$($BIN/v-search-domain-owner $domain)
if [ -z "$owner" ]; then
    check_result $E_NOTEXIST "domain $domain doesn't exist"
fi
if [ "$owner" = "$user" ]; then
    echo "ERROR: $domain is already owned by $user."
    exit
fi

# Perform verification if read-only mode is enabled
check_hestia_demo_mode


#----------------------------------------------------------#
#                       Action                             #
#----------------------------------------------------------#

echo "Moving $domain from $owner to $user, please wait..."

# WEB domain
web_data=$(grep "DOMAIN='$domain'" $HESTIA/data/users/$owner/web.conf)
if [ ! -z "$web_data" ]; then
    echo "[*] Moving web domain..."
    $BIN/v-suspend-web-domain $owner $domain >> /dev/null 2>&1
    parse_object_kv_list "$web_data"

    # Change IP
    if [ ! -z "$ip" ]; then
        web_data=$(echo "$web_data" | sed "s/IP='$IP'/IP='$ip'/")
    fi

    # Check SSL
    if [ "$SSL" = 'yes' ]; then
        ssl_crt=$HESTIA/data/users/$owner/ssl/$domain.crt
        ssl_key=$HESTIA/data/users/$owner/ssl/$domain.key
        ssl_ca=$HESTIA/data/users/$owner/ssl/$domain.ca
        ssl_pem=$HESTIA/data/users/$owner/ssl/$domain.pem
        mv $ssl_crt $HESTIA/data/users/$user/ssl/
        mv $ssl_key $HESTIA/data/users/$user/ssl/
        mv $ssl_ca $HESTIA/data/users/$user/ssl/ >> /dev/null 2>&1
        mv $ssl_pem $HESTIA/data/users/$user/ssl/ >> /dev/null 2>&1
        rm -f $HOMEDIR/$owner/conf/web/ssl.$domain.*
    fi

    # Check ftp user account
    if [ ! -z "$FTP_USER" ]; then
        /usr/sbin/userdel -f  $FTP_USER >> /dev/null 2>&1
        old_str="FTP_USER='$FTP_USER'"
        new_str=$(echo "$old_str" | sed "s/${owner}_/${user}_/")
        web_data=$(echo "$web_data" | sed "s/$old_str/$new_str/")
    fi

    # Move config
    sed -i "/DOMAIN='$domain'/d" $HESTIA/data/users/$owner/web.conf
    echo "$web_data" >> $HESTIA/data/users/$user/web.conf

    # Move data
    mv $HOMEDIR/$owner/web/$domain $HOMEDIR/$user/web/

    # Change ownership
    find $HOMEDIR/$user/web/$domain -user $owner \
        -exec chown -h $user:$user {} \;

    # Rebuild config
    $BIN/v-unsuspend-web-domain $user $domain no >> /dev/null 2>&1
    $BIN/v-rebuild-web-domains $owner no
    $BIN/v-rebuild-web-domains $user
fi

# DNS domain
dns_data=$(grep "DOMAIN='$domain'" $HESTIA/data/users/$owner/dns.conf)
if [ ! -z "$dns_data" ]; then
    echo "[*] Moving DNS zone and records..."
    parse_object_kv_list "$dns_data"

    # Change IP
    if [ ! -z "$ip" ]; then
        dns_data=$(echo "$dns_data" | sed "s/IP='$IP'/IP='$ip'/")
        sed -i "s/$IP/$ip/g" $HESTIA/data/users/$owner/dns/$domain.conf
    fi

    # Move config
    sed -i "/DOMAIN='$domain'/d" $HESTIA/data/users/$owner/dns.conf
    echo "$dns_data" >> $HESTIA/data/users/$user/dns.conf

    # Move dns records
    mv $HESTIA/data/users/$owner/dns/$domain.conf \
        $HESTIA/data/users/$user/dns/

    # Rebuild config
    $BIN/v-unsuspend-dns-domain $user $domain no >> /dev/null 2>&1
    $BIN/v-rebuild-dns-domains $owner no
    $BIN/v-rebuild-dns-domains $user

    # Resync dns cluster
    if [ ! -z "$DNS_CLUSTER" ]; then
        v-sync-dns-cluster
    fi
fi

# MAIL domain
mail_data=$(grep "DOMAIN='$domain'" $HESTIA/data/users/$owner/mail.conf)
if [ ! -z "$mail_data" ]; then
    echo "[*] Moving mail domain and accounts..."

    parse_object_kv_list "$mail_data"

    # Ensure mail configuration directory exists for receiving user
    if [ ! -e "$HOMEDIR/$user/conf/mail/$domain/" ]; then
        mkdir -p $HOMEDIR/$user/conf/mail/$domain/
    fi

    # Move config
    sed -i "/DOMAIN='$domain'/d" $HESTIA/data/users/$owner/mail.conf
    echo "$mail_data" >> $HESTIA/data/users/$user/mail.conf
    mv -f $HESTIA/data/users/$owner/mail/$domain.conf \
        $HESTIA/data/users/$user/mail/

    # Move DKIM
    if [ -e "$HESTIA/data/users/$owner/mail/$domain.pem" ]; then
        mv -f $HESTIA/data/users/$owner/mail/$domain.pem \
            $HESTIA/data/users/$user/mail/
        mv -f $HESTIA/data/users/$owner/mail/$domain.pub \
            $HESTIA/data/users/$user/mail/
    fi

    # Move SSL certificates
    if [ "$SSL" = 'yes' ]; then
         # Ensure that SSL directory exists and move certificates
        mkdir -p $HESTIA/data/users/$user/ssl/
        mkdir -p $HOMEDIR/$user/conf/mail/$domain/ssl/
        
        ssl_crt=$HESTIA/data/users/$owner/ssl/mail.$domain.crt
        ssl_key=$HESTIA/data/users/$owner/ssl/mail.$domain.key
        ssl_ca=$HESTIA/data/users/$owner/ssl/mail.$domain.ca
        ssl_pem=$HESTIA/data/users/$owner/ssl/mail.$domain.pem
        mv $ssl_crt $HESTIA/data/users/$user/ssl/
        mv $ssl_key $HESTIA/data/users/$user/ssl/
        mv $ssl_ca $HESTIA/data/users/$user/ssl/ >> /dev/null 2>&1
        mv $ssl_pem $HESTIA/data/users/$user/ssl/ >> /dev/null 2>&1     
        
        # Add certificate to user home directory
        cp -f $HESTIA/data/users/$user/ssl/mail.$domain.crt $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.crt
        cp -f $HESTIA/data/users/$user/ssl/mail.$domain.key $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.key
        cp -f $HESTIA/data/users/$user/ssl/mail.$domain.pem $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.pem
        if [ -e "$HESTIA/data/users/$user/ssl/mail.$domain.ca" ]; then
            cp -f $HESTIA/data/users/$user/ssl/mail.$domain.ca $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.ca
        fi

        # Add domain SSL configuration to dovecot
        if [ -f /etc/dovecot/conf.d/domains/$domain.conf ]; then
            rm -f /etc/dovecot/conf.d/domains/$domain.conf
        fi
        
        echo "" >> /etc/dovecot/conf.d/domains/$domain.conf
        echo "local_name mail.$domain {" >> /etc/dovecot/conf.d/domains/$domain.conf
        echo "  ssl_cert = <$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.pem" >> /etc/dovecot/conf.d/domains/$domain.conf
        echo "  ssl_key = <$HOMEDIR/$user/conf/mail/$domain/ssl/$domain.key" >> /etc/dovecot/conf.d/domains/$domain.conf
        echo "}" >> /etc/dovecot/conf.d/domains/$domain.conf

        # Add domain SSL configuration to exim4
        # Cleanup symlinks
        find /usr/local/hestia/ssl/mail -xtype l -delete

        ln -s -f $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.pem /usr/local/hestia/ssl/mail/mail.$domain.crt
        ln -s -f $HOMEDIR/$user/conf/mail/$domain/ssl/$domain.key /usr/local/hestia/ssl/mail/mail.$domain.key

        # Set correct permissions on certificates
        chmod 750 $HOMEDIR/$user/conf/mail/$domain/ssl
        chown -R $MAIL_USER:mail $HOMEDIR/$user/conf/mail/$domain/ssl
        chmod 0644 $HOMEDIR/$user/conf/mail/$domain/ssl/*
        chown -h $user:mail $HOMEDIR/$user/conf/mail/$domain/ssl/*
        chmod -R 0644 /usr/local/hestia/ssl/mail/*
        chown -h $user:mail /usr/local/hestia/ssl/mail/*
    fi

    # Move data
    mv $HOMEDIR/$owner/mail/$domain $HOMEDIR/$user/mail/

    # Change ownership
    find $HOMEDIR/$user/mail/$domain -user $owner \
        -exec chown -h $user {} \;

    # Checking exim username for later chowning
    exim_user="exim";
    check_exim_username=$(grep -c '^Debian-exim:' /etc/passwd)
    if [ "$check_exim_username" -eq 1 ]; then
        exim_user="Debian-exim"
    fi
    # Chowning mail conf files to exim user
    if [ -d "$HOMEDIR/$user/conf/mail/$domain" ]; then
        find $HOMEDIR/$user/conf/mail/$domain -user root \
            -exec chown $exim_user {} \;
    fi

    # Remove old mail directory from original owner
    if [ -e "$HOMEDIR/$owner/mail/$domain" ]; then
        rm -rf "$HOMEDIR/$owner/mail/$domain"
    fi

    # Remove old mail configuration directory from original owner
    if [ -e "$HOMEDIR/$owner/conf/mail/$domain" ]; then
        rm -rf "$HOMEDIR/$owner/conf/mail/$domain"
    fi
    if [ -e "$HESTIA/data/users/$owner/mail/$domain.conf" ]; then
        rm -f "$HESTIA/data/users/$owner/mail/$domain.conf"
    fi

    # Rebuild config
    $BIN/v-unsuspend-mail-domain $user $domain no >> /dev/null 2>&1
    $BIN/v-rebuild-mail-domains $owner no
    $BIN/v-rebuild-mail-domains $user
fi

# Update counters
$BIN/v-update-user-counters $owner
$BIN/v-update-user-counters $user

# Send notification to panel
if [ ! -z "$web_data" ] || [ ! -z "$dns_data" ] || [ ! -z "$mail_data" ]; then
    $HESTIA/bin/v-add-user-notification "$user" "$domain has been added to your account" ''
fi

#----------------------------------------------------------#
#                       Hestia                             #
#----------------------------------------------------------#

# Logging
log_history "moved domain $domain from $owner to $user" '' "admin"
log_history "$domain was added to your account" '' "$user"
log_history "$domain was removed from your account" '' "$owner"
log_event "$OK" "$ARGUMENTS"

exit
