#!/bin/sh #------------------------------------------------------------------------------ # /var/install/config.d/automx-check-account - check email/caldav/carddav # account details # # Copyright (c) 2015-2021 The Eisfair Team, team(at)eisfair(dot)org # # Creation : 2015-09-08 jed # Last Update: $Id$ # # Usage: automx-check-mail-account.sh [--interactive] email-address # - return login account details # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #------------------------------------------------------------------------------ # read eislib etc. . /var/install/include/eislib . /var/install/include/jedlib # debug mode: true/false #debug=true if ${debug:-false} then exec 2>/tmp/$(basename ${0})-trace$$.log set -x ask_debug=true export ask_debug fi EXEC_CMD="$0 $*" pgmname=`basename $0` module_name=`echo "${pgmname}" | cut -d- -f1` automxrunpath=/var/lib/${module_name} automxrunfile=${automxrunpath}/${module_name} owncloud_apache_user='wwwrun' curr_user=`whoami` . ${automxrunfile} case ${AUTOMX_CALDAV_CARDDAV_SERVER} in nextcloud ) if [ -z "${NEXTCLOUD_DOCUMENT_ROOT}" ] then if [ -n "${APACHE2_DOCUMENT_ROOT}" ] then # use value from configuration file CLOUD_DOCUMENT_ROOT="`echo "${APACHE2_DOCUMENT_ROOT}" | sed 's#/ *$##'`/${module_name}" else # use default value CLOUD_DOCUMENT_ROOT="/var/www/htdocs/nextcloud" fi else CLOUD_DOCUMENT_ROOT="${NEXTCLOUD_DOCUMENT_ROOT}" fi ;; owncloud ) if [ -z "${OWNCLOUD_DOCUMENT_ROOT}" ] then if [ -n "${APACHE2_DOCUMENT_ROOT}" ] then # use value from configuration file CLOUD_DOCUMENT_ROOT="`echo "${APACHE2_DOCUMENT_ROOT}" | sed 's#/ *$##'`/${module_name}" else # use default value CLOUD_DOCUMENT_ROOT="/var/www/htdocs/owncloud" fi else CLOUD_DOCUMENT_ROOT="${OWNCLOUD_DOCUMENT_ROOT}" fi ;; esac local_part='' first_name='' last_name='' user_name='' user_desc='' smtpuser_name='' interactive=0 if [ $# -ge 1 ] then if [ "$1" = '--interactive' ] then interactive=1 clrhome mecho --info "Check email account data" echo if [ -z "$2" ] then _ask_file=$(/bin/mktemp -t ${pgmname}-ask.XXXXXXXXX) /var/install/bin/ask "Enter valid email address, ENTER=Return, 0=Exit)" "" "*" > ${_ask_file} rc=$? email_addr="`cat ${_ask_file} | head -n1 | sed 's/\/$//' | tr '[:upper:]' '[:lower:]'`" rm -f ${_ask_file} else rc=0 email_addr="`echo "$2" | tr '[:upper:]' '[:lower:]'`" fi if [ ${rc} = 255 ] then exit 4 fi case "${email_addr}" in '' ) # quit program exit 0 ;; 0 ) exit 3 ;; * ) # go on... if [ -z "$2" ] then echo fi ;; esac else email_addr="`echo "$1" | tr '[:upper:]' '[:lower:]'`" fi ### EMAIL ### # extract local part local.part@domain.lan echo "${email_addr}" | grep -q '@' if [ $? -eq 0 ] then exit_code=0 local_part="`echo "${email_addr}" | cut -d'@' -f1`" # extract first and last name echo "${local_part}" | grep -q '\.' if [ $? -eq 0 ] then first_name="`echo "${local_part}" | cut -d'.' -f1`" last_name="`echo "${local_part}" | cut -d'.' -f2-`" fi found_flag=0 if [ "${MAIL_USER_USE_MAILONLY_PASSWORDS}" = 'yes' ] then # use separate mail passwords idx=1 while [ ${idx} -le ${MAIL_USER_N} ] do user_name='' eval active='$MAIL_USER_'${idx}'_ACTIVE' if [ "${active}" = 'yes' ] then eval user_name='$MAIL_USER_'${idx}'_USER' user_name="`echo "${user_name}" | tr '[:upper:]' '[:lower:]'`" if [ "${local_part}" = "${user_name}" ] then # match found found_flag=1 break fi fi idx=`expr ${idx} + 1` done else # check passwd file for match getent passwd | grep "^.*:x:2[0-9][0-9][0-9]:.*" | grep -q "^${local_part}:" if [ $? -eq 0 ] then # match found found_flag=1 user_name="${local_part}" fi fi if [ ${found_flag} -eq 0 ] then # check alias names for match for ALIAS in ${local_part} ${first_name} ${last_name} do user_name=`getent aliases ${ALIAS} | cut -d: -f2 | sed 's/ *//g'` if [ -n "${user_name}" ] then # match found found_flag=1 break fi done if [ -n "${user_name}" ] then # get description user_desc="`getent passwd | grep "^.*:x:2[0-9][0-9][0-9]:.*" | grep "^${user_name}:" | cut -d':' -f5`" fi else if [ -n "${user_name}" ] then # get description user_desc="`getent passw | grep "^.*:x:2[0-9][0-9][0-9]:.*" | grep "^${local_part}:" | cut -d':' -f5`" fi fi if [ -z "${user_desc}" ] then user_desc='no description found' fi case ${SMTP_AUTH_TYPE} in none ) smtpuser_name='' ;; server* ) smtpuser_name="${SMTP_AUTH_USER}" ;; *|user* ) smtpuser_name="${user_name}" ;; esac ### CalDAV/CardDAV user ### davuserlist_tmp=$(/bin/mktemp -t ${pgmname}-dav.XXXXXXXXX) davsearch_str="${email_addr}|${local_part}|${first_name}" if [ -n "${last_name}" ] then davsearch_str="${davsearch_str}|${last_name}" fi if [ "${curr_user}" != "${owncloud_apache_user}" ] then # not 'wwwrun', switch user ... su ${owncloud_apache_user} -c "${CLOUD_DOCUMENT_ROOT}/occ user:list --no-ansi" | \ grep -E -i "${davsearch_str}" | sed -e 's/^[ -]*//g' -e 's/ *: */:/g' > ${davuserlist_tmp} else ${CLOUD_DOCUMENT_ROOT}/occ user:list --no-ansi | grep -E -i "${davsearch_str}" | \ sed -e 's/^[ -]*//g' -e 's/ *: */:/g' > ${davuserlist_tmp} fi while read USER do dav_login=`echo "${USER}" | cut -d: -f1` dav_name=`echo "${USER}" | cut -d: -f2` if [ "${curr_user}" != "${owncloud_apache_user}" ] then # not 'wwwrun', switch user ... dav_details=`su ${owncloud_apache_user} -c "${CLOUD_DOCUMENT_ROOT}/occ user:info --no-ansi ${dav_login}" | \ sed -e '/groups:/{:a N;/quota:/b; s/\n[ -]*/,/; s/:,/: /; ba}' | tr '\t' ' ' | sed -e 's/^[ -]*//g' -e 's/ *: */:/g'` else dav_details=`${CLOUD_DOCUMENT_ROOT}/occ user:info --no-ansi ${dav_login} | \ sed -e '/groups:/{:a N;/quota:/b; s/\n[ -]*/,/; s/:,/: /; ba}' | tr '\t' ' ' | sed -e 's/^[ -]*//g' -e 's/ *: */:/g'` fi # - enabled: true if [ "`echo "${dav_details}" | grep "enabled:" | cut -d: -f2`" = 'true' ] then dav_active='yes' else dav_active='no' fi # - email: john.doe@nowhere.com dav_email=`echo "${dav_details}" | grep "email:" | cut -d: -f2` dav_found=0 for INFO in `echo "${davsearch_str}" | sed 's/|/ /g'` do # echo ":$INFO:" case ${INFO} in ${dav_email}|${dav_login}|"${dav_name}" ) dav_found=1 break ;; esac done # if [ ${dav_found} -eq 1 ] # then # echo '### FOUND ###' # fi # echo "user active: ${dav_active}" # echo "login .....: ${dav_login}" # echo "full name .: ${dav_name}" # echo "email addr.: ${dav_email}" if [ ${dav_found} -eq 1 ] then if [ "${dav_active}" = 'no' ] then dav_login='' fi break fi done < ${davuserlist_tmp} rm -f ${davuserlist_tmp} # output results if [ ${interactive} -eq 1 ] then mecho --info "email address: ${email_addr}" echo echo "description : ${user_desc}" echo "local part : ${local_part}" echo "first name : ${first_name}" echo "last name : ${last_name}" echo "pop3/imap user: ${user_name}" echo "smtp user : ${smtpuser_name}" echo echo "caldav user : ${dav_login}" echo "carddav user : ${dav_login}" echo anykey else # echo "E-${email_addr}:D-${user_desc}:L-${local_part}:F-${first_name}:L-${last_name}:U-${user_name}:S-${smtpuser_name}:CAL:${caldavuser_name}:CAL:${carddavuser_name}" echo "${email_addr}:${user_desc}:${local_part}:${first_name}:${last_name}:${user_name}:${smtpuser_name}:${dav_login}:${dav_login}" fi else # error exit_code=2 echo "Error: Invalid email address given!" fi else # error exit_code=1 echo "Error: Email address missing!" fi exit ${exit_code}