#!/bin/bash
# shellcheck disable=SC1091
. /usr/share/debconf/confmodule
# Zimbra Talk - fetch domain data from ldap-host
# by Stefan Sänger <stefan.saenger@vnc.biz>
#set -x

# ToDO:
# # change from single ini file to ini files per domain in /etc/zimbra-talk/dconfig.d/$DOMAIN.cfg
# # test performance

function print_usage() {
   echo "
update / generate prosody configs from zimbra ldap
usage: update-prosody-conf

   "
   exit 1
}

function die_err() {
        echo "$0: $*" >&2
        exit 1
}

touch /etc/ztalk/domains.cfg

function initfetch() {
   [ "$(whoami)" = "root" ] || die_err "please run as root or with sudo"
   [ "$(which crudini)" ] || die_err "crudini not found in path - please install crudini (apt-get install crudini)"
   [ "$(which perl)" ] || die_err "perl not found in path - please install perl (apt-get install perl)"
   [ "$(which ldapsearch)" ] || die_err "ldapsearch not found in path - please install ldap-utils (apt-get install ldap-utils)"
   ldapproto=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPPROTO')
   [ "$ldapproto" ] || die_err "ldap protocol not configured"

   ldapport=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPPORT')
   [ "$ldapport" ] || die_err "ldap port not configured"

   ldaphost=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPHOST')
   [ "$ldaphost" ] || die_err "ldap hostname not configured"

   ldappw=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPBINDPASS')
   [ "$ldappw" ] || die_err "ldap bind password not configured"

   ldapdn=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'LDAPBINDDN')
   [ "$ldapdn" ] || die_err "ldap BIND DN not configured"

   if ! ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | grep "zimbraDefaultDomainName:"
   then
      die_err "could not connect to LDAP - aborting..."
   fi

   TURN_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_HOST')
   TURN_PORT=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_PORT')
   EXTERNAL_LOGIN_FULL_DOMAIN=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_LOGIN_FULL_DOMAIN')
   PROSODY_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_FULL_HOSTNAME')
   PROSODY_AUTH_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_AUTH_FULL_HOSTNAME')
   PROSODY_CONFERENCE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_CONFERENCE_FULL_HOSTNAME')
   PROSODY_FOCUS_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_FOCUS_FULL_HOSTNAME')
   PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME')
   MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST')
   MIDDLEWARE_ZIMBRA_ADMIN_PASSWD=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_ZIMBRA_ADMIN_PASSWD')
   MIDDLEWARE_APPNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MIDDLEWARE_APPNAME')
   PROSODY_ADMIN1=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_ADMIN1')
   PROSODY_ADMIN2=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_ADMIN2')
   EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME')
   PROSODY_MESSAGE_EXPIRY=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_MESSAGE_EXPIRY')
   if [ "$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'PROSODY_MESSAGE_EXPIRY' | grep -E -c "([0-9]+[dmwy]?|never)")" = "0" ]; then
      echo "ERROR: invalid setting for PROSODY_MESSAGE_EXPIRY found in /etc/zimbra-talk/talk.defaults.cfg - falling back to default (1m)"
      PROSODY_MESSAGE_EXPIRY="1m"
   fi

   MIDDLEWARE_URL="http://$MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST/VNCMiddleware/rest"

   TalkServerDomain=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TalkServerDomain')
   zimbraDefaultDomainName=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'zimbraDefaultDomainName')
   AUTHENTICATION_SHARED_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'AUTHENTICATION_SHARED_SECRET')
   MUC_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'MUC_COMPONENT_SECRET')
   FOCUS_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'FOCUS_COMPONENT_SECRET')
   JITSI_VIDEOBRIDGE_COMPONENT_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'JITSI_VIDEOBRIDGE_COMPONENT_SECRET')
   TURN_CREDENTIALS=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'TURN_CREDENTIALS')
   GlobalSOAPURL=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL')
   CDefaultDomain=$(crudini --get /etc/ztalk/domains.cfg "global" "$DefaultDomain")
   SOLR_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "SOLR_HOST" 2>/dev/null)
   HTTP_UPLOAD_URL=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "HTTP_UPLOAD_URL"  2>/dev/null | sed 's/\//\\\//g')
   HTTP_UPLOAD_SECRET=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "HTTP_UPLOAD_SECRET" 2>/dev/null)
   FCM_API=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "FCM_API" 2>/dev/null)
   HYBRIDAUTHHOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "HYBRIDAUTHHOST" 2>/dev/null)
   FCM_HOST=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "FCM_HOST" 2>/dev/null)

   DomainBlack=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'DOMAIN_BLACK' 2>/dev/null)
   if [ -z "$DomainBlack" ]; then
      DomainBlack="(@)"
   fi
   DomainWhite=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'DOMAIN_WHITE' 2>/dev/null)

}

function fetchDefaultDomain() {

   if ! DefaultDomain=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraDefaultDomainName:" | awk '{print $2}')
   then
      die_err "could not connect to LDAP - aborting..."
   fi
   if [ "$DefaultDomain" = "$CDefaultDomain" ]; then
      echo "dafult domain is still: $DefaultDomain"
   fi
   if [ -z "$CDefaultDomain" ]; then
      touch /etc/ztalk/domains.cfg
      crudini --set /etc/ztalk/domains.cfg "GLOBAL" "$DefaultDomain"
   fi
}

function update-ini-domains() {
   GlobalINIZURL=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL')

   zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceHostname" | awk '{print $2}')
   if [ -n "$zimbraPublicServiceHostname" ]; then
      zimbraPublicServiceProtocol=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceProtocol" | awk '{print tolower($2)}')
      [ -n "$zimbraPublicServiceProtocol" ] || zimbraPublicServiceProtocol="https"
      zimbraPublicServicePort=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraGlobalConfig)" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServicePort" | awk '{print $2}')
   else
      zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraServer)(zimbraReverseProxyHttpEnabled=TRUE))" | perl -p00e 's/\r?\n //g' | grep "^cn:" | awk '{print $2}' | head -1)
      zimbraPublicServiceProtocol="https"
   fi

   if [ -z "$zimbraPublicServicePort" ]; then
      GlobalZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname"
   else
      GlobalZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname:$zimbraPublicServicePort"
   fi

   if [ "$GlobalINIZURL" != "$GlobalZURL" ]; then
      crudini --set /etc/zimbra-talk/talk.defaults.cfg 'global' 'ZIMBRA_URL' "$GlobalZURL"
   fi

   DefaultRosterFilter=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg "global" "DefaultRosterFilter")
   # shellcheck disable=SC2012
   INIDOMAINS=$(ls -1 /etc/zimbra-talk/dconfig.d/ | sed 's/\.cfg$//g')
   LDAPDOMAINS=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(objectClass=zimbraDomain)" | perl -p00e 's/\r?\n //g' | grep "^zimbraDomainName:" |  awk '{print $2}' | cat -s | grep -E "$DomainWhite" | grep -v -E "$DomainBlack")

   for TDOMAIN in $INIDOMAINS; do
      ShouldExist=$(echo "$LDAPDOMAINS" | grep -c -E "^$TDOMAIN$" )
      #echo "$TDOMAIN should exist: $ShouldExist"
      if [ "$ShouldExist" -eq 0 ]; then
      #      #delete domain from ini file
         echo "removing config from ini for domain: $TDOMAIN"
         rm "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      else
         touch "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      fi
   done

   echo "updating domains in ini from ldap"
   echo "$LDAPDOMAINS" | cat -s  | while IFS= read -r  TDOMAIN
   do
      echo "updating settings for $TDOMAIN"
      touch "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg"
      rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterFilter" 2>/dev/null)
      if [ -z "$rosterfilter" ]; then
         rosterfilter="$DefaultRosterFilter"
      fi
      crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterFilter" "$rosterfilter"
      rosterbase=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterBase" 2>/dev/null)
      if [ -z "$rosterbase" ]; then
         rosterbase=$(echo "ou=people,dc=$TDOMAIN" | sed 's/\./,dc=/g' )
      fi
      crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" "RosterBase" "$rosterbase"
      echo "updated Rosterfilter for Domain $TDOMAIN"
      ZTEST=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "^zimbraPreAuthKey:" | awk '{print $2}')
      if [ -n "$ZTEST" ]; then
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'zimbraPreAuthKey' "$ZTEST"
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'RosterFilter' "$rosterfilter"
      else
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'zimbraPreAuthKey' ""
         crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'RosterFilter' "$rosterfilter"
      fi

      IniDomainURL=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL' 2>/dev/null)
      IniDomainURLMode=$(crudini --get "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL_MODE' 2>/dev/null)
      if [ -z "$IniDomainURLMode" ]; then
         IniDomainURLMode="auto"
      fi
      zimbraPublicServiceHostname=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceHostname" | awk '{print $2}')
      if [ -n "$zimbraPublicServiceHostname" ]; then
         zimbraPublicServiceProtocol=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServiceProtocol" | awk '{print tolower($2)}')
         if [ -z "$zimbraPublicServiceProtocol" ]; then zimbraPublicServiceProtocol="https" ; fi
         zimbraPublicServicePort=$(ldapsearch -x -D "$ldapdn" -w "$ldappw" -H "$ldapproto://$ldaphost:$ldapport" "(&(objectClass=zimbraDomain)(zimbraDomainName=$TDOMAIN))" | perl -p00e 's/\r?\n //g' | grep "zimbraPublicServicePort" | awk '{print $2}')
         if [ -n "$zimbraPublicServicePort" ]; then
            LDZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname:$zimbraPublicServicePort"
         else
            LDZURL="$zimbraPublicServiceProtocol://$zimbraPublicServiceHostname"
         fi
      else
         LDZURL="$GlobalSOAPURL"
      fi
      if [ "$IniDomainURLMode" = "auto" ]; then
         if [ "$IniDomainURL" != "$LDZURL" ]; then
            crudini --set "/etc/zimbra-talk/dconfig.d/$TDOMAIN.cfg" "domain:$TDOMAIN" 'ZIMBRA_URL' "$LDZURL"
         fi
      fi
   done
}

function update-prosody-from-ini() {
  #handle default domain
  echo "generating config for $zimbraDefaultDomainName"
  rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" "RosterFilter")
  if [ "$rosterfilter" = "manual" ]
  then
    cp /usr/share/ztalk/conf.templates/prosody-virtual-host.cfg.lua.template "/tmp/$zimbraDefaultDomainName.cfg.lua"
  else
    cp /usr/share/ztalk/conf.templates/prosody-virtual-host-auto.cfg.lua.template "/tmp/$zimbraDefaultDomainName.cfg.lua"
  fi
  rosterbase=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" "RosterBase" 2>/dev/null)
  if [ -z "$rosterbase" ]; then
     rosterbase=$(echo "ou=people,dc=$zimbraDefaultDomainName" | sed 's/\./,dc=/g' )
  fi
  sed -i "s/XMPP_FULL_DOMAIN/$zimbraDefaultDomainName/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/LDAP_SERVER/$ldaphost/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/LDAP_BINDPASS/$ldappw/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/LDAP_BINDDN/$ldapdn/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/LDAP_FILTER/$rosterfilter/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/LDAP_FILTER/\\&/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/TURN_HOST/$TURN_HOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/TURN_PORT/$TURN_PORT/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/$PROSODY_CONFERENCE_FULL_HOSTNAME/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  sed -i "s/ROSTER_BASE/$rosterbase/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  if [ "$FCM_API" ]; then
    sed -i "s/FCM_API/fcm_api_key = \"$FCM_API\"/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/USE_FCM1/\"vnc_fcm\";/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/USE_FCM2/\"vnc_fcm\",/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"  
  else
    sed -i "s/FCM_API//g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/USE_FCM1//g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/USE_FCM2//g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  fi

  if [ "$HYBRIDAUTHHOST" ]; then
    sed -i "s/HYBRIDAUTHHOST/$HYBRIDAUTHHOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  else 
    sed -i "s/HYBRIDAUTHHOST/127.0.0.1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  fi
  
  if [ "$FCM_HOST" ]; then
    sed -i "s/FCM_HOST/$FCM_HOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  else
    sed -i "s/FCM_HOST/127.0.0.1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  fi


  if [ "$HTTP_UPLOAD_URL" ]; then
    sed -i "s/USE_HTTP_UPLOAD/\"http_upload_external\";/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/HTTP_UPLOAD_URL/$HTTP_UPLOAD_URL/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    sed -i "s/HTTP_UPLOAD_SECRET/$HTTP_UPLOAD_SECRET/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  else
    sed -i "s/USE_HTTP_UPLOAD//g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
  fi
  cp "/tmp/$zimbraDefaultDomainName.cfg.lua" "/etc/prosody/conf.d/$zimbraDefaultDomainName.cfg.lua"

  cp /usr/share/ztalk/conf.templates/prosody-jitsi-meet-virtual-host.cfg.lua.template /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/TURN_HOST/$TURN_HOST/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/TURN_PORT/$TURN_PORT/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/XMPP_FULL_DOMAIN/$zimbraDefaultDomainName/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/$PROSODY_CONFERENCE_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/FOCUS_COMPONENT_SECRET/$FOCUS_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/XMPP_FULL_DOMAIN/$XMPP_FULL_DOMAIN/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME/$PROSODY_JITSIVIDEOBRIGE_FULL_HOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  sed -i "s/JITSI_VIDEOBRIDGE_COMPONENT_SECRET/$JITSI_VIDEOBRIDGE_COMPONENT_SECRET/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  EXTCONFERENCEFULLHOSTNAME=$(crudini --get /etc/zimbra-talk/talk.defaults.cfg 'global' 'EXTERNAL_PROSODY_CONFERENCE_FULL_HOSTNAME')
  sed -i "s/EXTCONFERENCEFULLHOSTNAME/$EXTCONFERENCEFULLHOSTNAME/g" /tmp/vnctalk-jitsi-meet.cfg.lua
  cp /tmp/vnctalk-jitsi-meet.cfg.lua /etc/prosody/conf.d/vnctalk-jitsi-meet.cfg.lua

 cp /usr/share/ztalk/conf.templates/vnc_hybrid_authenticator.cfg.template "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'AUTH' 'UserAuthentication_Shared_Secret' "$AUTHENTICATION_SHARED_SECRET"
 zimbraPreAuthKey=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" 'zimbraPreAuthKey') 2>/dev/null
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_preauth_key' "$zimbraPreAuthKey"
 ZURL=$(crudini --get "/etc/zimbra-talk/dconfig.d/$zimbraDefaultDomainName.cfg" "domain:$zimbraDefaultDomainName" 'ZIMBRA_URL') 2>/dev/null
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'ZIMBRA_SOAP' 'zimbra_soap_url' "$ZURL/service/soap"

 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'Server' "$ldaphost"
 DLdapBase=$(echo "ou=people,dc=$zimbraDefaultDomainName" | sed 's/\./,dc=/g' )
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'Base' "$DLdapBase"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindPass' "$ldappw"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'LDAP' 'BindDN' "$ldapdn"

 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_url' "$ZURL/VNCMiddleware/rest"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'middleware_appname' "$MIDDLEWARE_APPNAME"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_admin_passwd' "$MIDDLEWARE_ZIMBRA_ADMIN_PASSWD"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'MIDDLEWARE' 'zimbra_host' "$MIDDLEWARE_MIDDLEWARE_ZIMBRA_HOST"
 crudini --set "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" 'EXTERNAL_USER' 'external_domain' "$EXTERNAL_LOGIN_FULL_DOMAIN"
 sed -i "s/ = /=/g" "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg"
 cp "/tmp/$zimbraDefaultDomainName-vnc_hybrid_authenticator.cfg" /etc/zimbra-talk/

 # shellcheck disable=SC2012
 INIDOMAINS=$(ls -1 /etc/zimbra-talk/dconfig.d/ | sed 's/\.cfg$//g'| grep -v "^$zimbraDefaultDomainName$")
 for domain in $INIDOMAINS; do
    echo "generating configs for $domain"
    rosterfilter=$(crudini --get "/etc/zimbra-talk/dconfig.d/$domain.cfg" "domain:$domain" "RosterFilter")
    if [ "$rosterfilter" = "manual" ]
    then
      cp /usr/share/ztalk/conf.templates/prosody-virtual-host.cfg.lua.template "/tmp/$domain.cfg.lua"
    else
       cp /usr/share/ztalk/conf.templates/prosody-virtual-host-auto.cfg.lua.template "/tmp/$domain.cfg.lua"
    fi
    rosterbase=$(crudini --get "/etc/zimbra-talk/dconfig.d/$domain.cfg" "domain:$domain" "RosterBase" 2>/dev/null)
    if [ -z "$rosterbase" ]; then
       rosterbase=$(echo "ou=people,dc=$domain" | sed 's/\./,dc=/g' )
    fi
    sed -i "s/XMPP_FULL_DOMAIN/$domain/g" "/tmp/$domain.cfg.lua"
    sed -i "s/PROSODY_ADMIN1/$PROSODY_ADMIN1/g" "/tmp/$domain.cfg.lua"
    sed -i "s/PROSODY_ADMIN2/$PROSODY_ADMIN2/g" "/tmp/$domain.cfg.lua"
    sed -i "s/LDAP_SERVER/$ldaphost/g" "/tmp/$domain.cfg.lua"
    sed -i "s/LDAP_BINDPASS/$ldappw/g" "/tmp/$domain.cfg.lua"
    sed -i "s/LDAP_BINDDN/$ldapdn/g" "/tmp/$domain.cfg.lua"
    sed -i "s/LDAP_FILTER/$rosterfilter/g" "/tmp/$domain.cfg.lua"
    sed -i "s/LDAP_FILTER/\\&/g" "/tmp/$domain.cfg.lua"
    sed -i "s/TURN_CREDENTIALS/$TURN_CREDENTIALS/g" "/tmp/$domain.cfg.lua"
    sed -i "s/TURN_HOST/$TURN_HOST/g" "/tmp/$domain.cfg.lua"
    sed -i "s/TURN_PORT/$TURN_PORT/g" "/tmp/$domain.cfg.lua"
    sed -i "s/EXTERNAL_LOGIN_FULL_DOMAIN/$EXTERNAL_LOGIN_FULL_DOMAIN/g" "/tmp/$domain.cfg.lua"
    sed -i "s/PROSODY_AUTH_FULL_HOSTNAME/$PROSODY_AUTH_FULL_HOSTNAME/g" "/tmp/$domain.cfg.lua"
    sed -i "s/PROSODY_FOCUS_FULL_HOSTNAME/$PROSODY_FOCUS_FULL_HOSTNAME/g" "/tmp/$domain.cfg.lua"
    sed -i "s/PROSODY_CONFERENCE_FULL_HOSTNAME/conference.$domain/g" "/tmp/$domain.cfg.lua"
    sed -i "s/MUC_COMPONENT_SECRET/$MUC_COMPONENT_SECRET/g" "/tmp/$domain.cfg.lua"
    sed -i "s/ROSTER_BASE/$rosterbase/g" "/tmp/$domain.cfg.lua"
    if [ "$FCM_API" ]; then
      sed -i "s/FCM_API/fcm_api_key = \"$FCM_API\"/g" "/tmp/$domain.cfg.lua"
      sed -i "s/USE_FCM1/\"vnc_fcm\";/g" "/tmp/$domain.cfg.lua"
      sed -i "s/MW_HISTORY1/\"vnc_mw_history\";/g" "/tmp/$domain.cfg.lua"
      sed -i "s/USE_FCM2/\"vnc_fcm\",/g" "/tmp/$domain.cfg.lua"
      sed -i "s/MW_HISTORY2/\"vnc_mw_history\"/g" "/tmp/$domain.cfg.lua"
    else
      sed -i "s/FCM_API//g" "/tmp/$domain.cfg.lua"
      sed -i "s/USE_FCM1//g" "/tmp/$domain.cfg.lua"
      sed -i "s/MW_HISTORY1//g" "/tmp/$domain.cfg.lua"
      sed -i "s/USE_FCM2//g" "/tmp/$domain.cfg.lua"
      sed -i "s/MW_HISTORY2//g" "/tmp/$domain.cfg.lua"
    fi
    
    if [ "$HYBRIDAUTHHOST" ]; then
      sed -i "s/HYBRIDAUTHHOST/$HYBRIDAUTHHOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    else 
      sed -i "s/HYBRIDAUTHHOST/127.0.0.1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    fi
    
    if [ "$FCM_HOST" ]; then
      sed -i "s/FCM_HOST/$FCM_HOST/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    else
      sed -i "s/FCM_HOST/127.0.0.1/g" "/tmp/$zimbraDefaultDomainName.cfg.lua"
    fi
    
    if [ "$HTTP_UPLOAD_URL" ]; then
      sed -i "s/USE_HTTP_UPLOAD/\"http_upload_external\";/g" "/tmp/$domain.cfg.lua"
      sed -i "s/HTTP_UPLOAD_URL/$HTTP_UPLOAD_URL/g" "/tmp/$domain.cfg.lua"
      sed -i "s/HTTP_UPLOAD_SECRET/$HTTP_UPLOAD_SECRET/g" "/tmp/$domain.cfg.lua"
    else
      sed -i "s/USE_HTTP_UPLOAD//g" "/tmp/$domain.cfg.lua"
    fi
    cp "/tmp/$domain.cfg.lua" "/etc/prosody/conf.d/$domain.cfg.lua"

    mkdir -p /etc/zimbra-talk/dns.d

    echo "txt-record=_xmppconnect.$domain,\"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
txt-record=_xmppconnect.external.$domain,\"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
srv-host=_xmpp-client._tcp.$domain,$PROSODY_FULL_HOSTNAME,5222
srv-host=_xmpp-server._tcp.$domain,$PROSODY_FULL_HOSTNAME,5269
" > "/etc/zimbra-talk/dns.d/$domain.dnsmasq.conf"

    echo "_xmppconnect.$domain.       300     IN      TXT     \"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
_xmppconnect.external.$domain.            300     IN      TXT     \"_xmpp-client-xbosh=https://$PROSODY_FULL_HOSTNAME:443/http-bind\"
_xmpp-client._tcp.$domain.                   300     IN      SRV 0       5       5222    $PROSODY_FULL_HOSTNAME.
_xmpp-server._tcp.$domain.                   300     IN      SRV 0       5       5269    $PROSODY_FULL_HOSTNAME.
" > "/etc/zimbra-talk/dns.d/$domain.bind.conf"

  done
}

function remove_unused_configs() {
   PROSODYCFGS=$(find /etc/prosody/conf.d/ -iname "*cfg.lua" -printf '%f\n' | grep -v "vnctalk-jitsi-meet.cfg.lua" | grep -v "localhost.cfg.lua")
   echo "$PROSODYCFGS" | sed 's/\.cfg.lua//g'| while IFS= read -r cfgfiledomain
   do
      if [ ! -e "/etc/zimbra-talk/dconfig.d/$cfgfiledomain.cfg" ]; then
         echo "removing configs for undesired domain $cfgfiledomain"
         rm "/etc/prosody/conf.d/$cfgfiledomain.cfg.lua"
         rm "/etc/zimbra-talk/$cfgfiledomain-vnc_hybrid_authenticator.cfg"
         rm "/etc/zimbra-talk/dns.d/$cfgfiledomain.bind.conf"
         rm "/etc/zimbra-talk/dns.d/$cfgfiledomain.dnsmasq.conf"
      fi
   done
}

initfetch
update-ini-domains
OLD_MESSAGE_EXPIRY=$(grep "archive_expires_after" /etc/prosody/prosody.cfg.lua | awk -F "\"" '{print $2}')
OLD_MESSAGE_EXPIRYLINE=$(grep "archive_expires_after" /etc/prosody/prosody.cfg.lua)
# shellcheck disable=SC2001
NEW_MESSAGE_EXPIRYLINE=$(echo "$OLD_MESSAGE_EXPIRYLINE" | sed "s/$OLD_MESSAGE_EXPIRY/$PROSODY_MESSAGE_EXPIRY/g")
sed -i "s/$OLD_MESSAGE_EXPIRYLINE/$NEW_MESSAGE_EXPIRYLINE/g"  /etc/prosody/prosody.cfg.lua
update-prosody-from-ini
remove_unused_configs
if [ -f "/etc/security/limits.d/talk.limits.conf" ]; then
   MAXFD=$(awk '{print $4}' /etc/security/limits.d/talk.limits.conf | sort | tail -1)
fi

cat -s /etc/zimbra-talk/talk.defaults.cfg > /tmp/talk.defaults.swap
mv /tmp/talk.defaults.swap /etc/zimbra-talk/talk.defaults.cfg
