#!/bin/sh #------------------------------------------------------------------------------ # /var/install/bin/capi2text-test-carddav - test lcarddav access # # Copyright (c) 2008-2024 The Eisfair Team, team(at)eisfair(dot)org # # Creation : 2015-03-06 jed # Last Update: $Id$ # # 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 . /var/install/include/eislib #debug=true if ${debug:-false} then exec 2>/tmp/$(basename ${0})-trace$$.log set -x ask_debug=true export ask_debug fi #------------------------------------------------------------------------------ # print debug message # input : $1 - text string # output: debug message #------------------------------------------------------------------------------ print_debug () { if [ "${CAPI2TEXT_DO_DEBUG}" = "yes" ] then echo "$1" fi } #------------------------------------------------------------------------------ # count number of CardDAV shares # # input : $1 - WebDAV URLs # output: number of URLs #------------------------------------------------------------------------------ count_carddav_urls () { # find out how many address books should be searched _ccu_ifs=${IFS} IFS=\| _ccu_count=0 for URL in ${CAPI2TEXT_CARDDAV_URL} do _ccu_count=`expr ${_ccu_count} + 1` done IFS=${_ccu_ifs} echo ${_ccu_count} } #------------------------------------------------------------------------------ # Mount WebDAV share # # input : $1 - WebDAV URLs # $2 - WebDAV mount point # output: mount result #------------------------------------------------------------------------------ mount_webdav_share () { local _mws_urllist="$1" local _mws_mpoint="$2" local _mws_ret=1 local _mws_idx local _mws_url local _mws_host local _mws_config local _mws_options # check if mount.davfs program exists which mount.davfs >/dev/null 2>/dev/null if [ $? -eq 0 ] then # check if webdav share has been mounted _mws_idx=1 while [ ${_mws_idx} -le ${carddav_url_count} ] do # on /root/.davfs2/capi2text-mnt-1 type davfs ... # on /root/.davfs2/capi2text-mnt-1 type fuse ... helper=davfs ... mount | grep -E -q "on ${_mws_mpoint}-${_mws_idx} type davfs |on ${_mws_mpoint}-${_mws_idx} type fuse .*helper=davfs" if [ $? -ne 0 ] then # mount webdav share if [ ! -d ${_mws_mpoint}-${_mws_idx} ] then # create mount-point if it doesn't exist mkdir -p ${_mws_mpoint}-${_mws_idx} fi # mount share _mws_url="`echo "${_mws_urllist}" | cut -d'|' -f ${_mws_idx} | sed -e 's/^ *//' -e 's/ *$//'`" _mws_host="`echo "${_mws_url}" | sed 's#http[s]*://\(.[^/]*\).*$#\1#'`" _mws_config=${davfs2_path}/capi2text-davfs2-${_mws_host}.conf _mws_options=conf="${_mws_config},ro" if [ "${CAPI2TEXT_DO_DEBUG}" = 'yes' ] then mount -t davfs -o ${_mws_options} "${_mws_url}" ${_mws_mpoint}-${_mws_idx} else # suppress output, like e.g. '/sbin/mount.davfs: warning: # the server does not support locks' mount -t davfs -o ${_mws_options} "${_mws_url}" ${_mws_mpoint}-${_mws_idx} >/dev/null 2>/dev/null fi # check if webdav share has been mounted # on /root/.davfs2/capi2text-mnt-1 type davfs ... # on /root/.davfs2/capi2text-mnt-1 type fuse ... helper=davfs ... mount | grep -E -q "on ${_mws_mpoint}-${_mws_idx} type davfs |on ${_mws_mpoint}-${_mws_idx} type fuse .*helper=davfs" if [ $? -eq 0 ] then # webdav share successfully been mounted _mws_ret=0 # make sure that the webdav cache is in sync by # executing a command which should match all files grep -q "BEGIN:VCARD" ${_mws_mpoint}-${_mws_idx}/*\.vcf fi else # webdav share already mounted _mws_ret=0 fi _mws_idx=`expr ${_mws_idx} + 1` done fi return ${_mws_ret} } #------------------------------------------------------------------------------ # Umount WebDAV share # # input : $1 - WebDAV mount point # output: mount result #------------------------------------------------------------------------------ umount_webdav_share () { local _uws_mpoint="$1" local _uws_ret=1 # check if mount.davfs program exists which umount.davfs >/dev/null 2>/dev/null if [ $? -eq 0 ] then _uws_idx=1 while [ ${_uws_idx} -le ${carddav_url_count} ] do # check if webdav share has been mounted # on /root/.davfs2/capi2text-mnt-1 type davfs ... # on /root/.davfs2/capi2text-mnt-1 type fuse ... helper=davfs ... mount | grep -E -q "on ${_uws_mpoint}-${_uws_idx} type davfs |on ${_uws_mpoint}-${_uws_idx} type fuse .*helper=davfs" if [ $? -eq 0 ] then # umount webdav share if [ "${CAPI2TEXT_DO_DEBUG}" = 'yes' ] then umount ${_uws_mpoint}-${_uws_idx} else # suppress output, like e.g. '/sbin/umount.davfs: waiting # while mount.davfs (pid 16433) synchronizes the cache .. OK' umount ${_uws_mpoint}-${_uws_idx} >/dev/null fi if [ $? -eq 0 ] then _uws_ret=0 fi else # webdav share not mounted _uws_ret=0 fi _uws_idx=`expr ${_uws_idx} + 1` done fi return ${_uws_ret} } #============================================================================== # main #============================================================================== configfile=/etc/config.d/capi2text davfs2_path=/root/.davfs2 davfs2_mount_path=${davfs2_path}/capi2text-mnt tmpfile=/tmp/capi2text-carddav-search.$$ CAPI2TEXT_DO_DEBUG='no' #CAPI2TEXT_DO_DEBUG="yes" if [ -f ${configfile} ] then . ${configfile} clrhome mecho --info "test CardDAV access" mecho if [ "${CAPI2TEXT_CARDDAV_SEARCH}" = "yes" ] then mecho "Input example: 0221 112233" mecho " 0049 221 112233" mecho # search for: # PHONENBR=0221334455 # PHONENBR=0049221334455 /var/install/bin/ask "Enter phone number (e.g. format: [country-code] area-code number)" '' '*' > /tmp/ask.$$ rc=$? num2=`sed -e 's# \+# #g' -e 's/ -* //g' -e 's/[+) (]/ /g' \ -e 's/^.* \([0-9]*\)/\1/' /tmp/ask.$$` num1=`sed -e 's# \+# #g' -e 's/ -* //g' -e 's/[+) (]/ /g' \ -e "s/^\(.*\) ${num2}/\1/" -e 's/^ *//' -e 's/^[0 ]*/.\*/' \ -e 's/ /.\*/g' /tmp/ask.$$` # search pattern (to match phone numbers where the extension is # separated by 'x' or '-'): # PHONENBR=.*49.*221[ -x]*3[ -x]*3[ -x]*4[ -x]*4[ -x]*5[ -x]*5 PHONENBR="${num1}`echo "${num2}" | sed 's#\(.\)#[ -x]\*\1#g'`" rm -f /tmp/ask.$$ if [ ${rc} = 255 ] then exit 1 fi echo echo "CAPI2TEXT_DO_DEBUG='${CAPI2TEXT_DO_DEBUG}'" echo "CAPI2TEXT_CARDDAV_URL='${CAPI2TEXT_CARDDAV_URL}'" echo "CAPI2TEXT_CARDDAV_AUTH='${CAPI2TEXT_CARDDAV_AUTH}'" if [ "${CAPI2TEXT_CARDDAV_AUTH}" = 'yes' ] then echo "CAPI2TEXT_CARDDAV_USER='${CAPI2TEXT_CARDDAV_USER}'" echo "CAPI2TEXT_CARDDAV_PASS='****'" fi echo # find out how many address books should be searched carddav_url_count=`count_carddav_urls "${CAPI2TEXT_CARDDAV_URL}"` if mount_webdav_share "${CAPI2TEXT_CARDDAV_URL}" "${davfs2_mount_path}" then # check if webdav share has been mounted # run carddav search in each CardDAV address book # TEL;TYPE=HOME\,VOICE:+49 ... # PVLBDL.TEL;TYPE=HOME\,VOICE:+49 ... echo "CardDAV-SEARCH:^TEL([A-Za-z;=])*:${PHONENBR}|^[A-Z0-9]*\.TEL([\A-Za-z;,=])*:${PHONENBR}" echo idx=1 carddav_success=0 while [ ${idx} -le ${carddav_url_count} ] do echo "CardDAV-PATH:${davfs2_mount_path}-${idx}" number_tmp=`grep -E -i "^TEL([A-Za-z;=])*:${PHONENBR}|^[A-Z0-9]*\.TEL([\A-Za-z;,=])*:${PHONENBR}" ${davfs2_mount_path}-${idx}/*.vcf` vcf_file=`echo "${number_tmp}" | cut -d: -f1` number_type=`echo "${number_tmp}" | cut -d: -f2 | sed -e 's/TEL;TYPE=\(.*\)/\1/' -e 's/;TYPE=/,/g' | head -n1 | tr 'A-Z' 'a-z'` if [ -n "${vcf_file}" -a $? -eq 0 ] then # print out file name(s), indent all entries except for the first line echo "CardDAV-FILE:`echo "${vcf_file}" | sed -e 's#^/# /#g' -e '1s/^ *//'`" # entry found, take only the first one vcf_file=`echo "${vcf_file}" | head -n1` echo echo "Phone-TYPE:${number_type}" # N:Lastname;First Name;Middle Name;Title; # ADR;TYPE=home;TYPE=pref:;;Street name;City;;ZIP-Code;Country # ITEM1.ADR;TYPE=home;TYPE=pref:;;Street name;City;;ZIP-Code;Country # UZ3JU.ADR;TYPE=home;TYPE=pref:;;Street name;City;;ZIP-Code;Country # # ITEM1.ADR;TYPE=work\,pref:;;Street name;City;;ZIP-Code;Cou # ntry # - append line which starts with a whitespace to the previous # line and remove whitespace grep -A 1 -E -i "^N:|^ADR;TYPE=|^[A-Z0-9]*\.ADR;TYPE=" ${vcf_file} | \ sed -e :a -e '$!N;s/\n //;ta' -e 'P;D' | sed -e :a -e '$!N;s/\r\n //;ta' -e 'P;D'> ${tmpfile} 2> /dev/null carddav_res=$? if [ ${carddav_res} -eq 0 -a -s ${tmpfile} ] then # fetch carddav name of caller # - switch last name and first name # - remove leading and trailing white spaces # 'last-name;first-name;;title;' -> 'first-name last-name' name_tmp=`grep "^N:" ${tmpfile} | sed -e 's/^N[A-Za-z;=]*: *//' -e 's#\\\n##' | tr -d '\n\r'` name_tmp="`echo "${name_tmp}" | cut -d';' -f2` `echo "${name_tmp}" | cut -d';' -f1`" NAME="`echo "${name_tmp}" | sed -e 's/^ *//' -e 's/ *$//'`" # fetch carddav name of caller if [ -n "${NAME}" ] then # result found carddav_success=1 print_debug "- Request successful" # fetch carddav details of caller - private address details_tmp=`grep -E -i "^ADR;TYPE=home|^[A-Z0-9]*\.ADR;TYPE=home" ${tmpfile} | \ sed -e 's/^ADR[\A-Za-z;,=]*: *//' -e 's/^[A-Z0-9]*\.ADR[\A-Za-z;,=]*: *//' -e 's#\\\n##' | \ tr -d '\n\r'` if [ -z "${details_tmp}" ] then # fetch carddav details of caller - work address details_tmp=`grep -E -i "^ADR;TYPE=work|^[A-Z0-9]*\.ADR;TYPE=work" ${tmpfile} | \ sed -e 's/^ADR[\A-Za-z;,=]*: *//' -e 's/^[A-Z0-9]*\.ADR[\A-Za-z;,=]*: *//' -e 's#\\\n##' | \ tr -d '\n\r'` fi if [ -n "${details_tmp}" ] then s_street=`echo "${details_tmp}" | cut -d';' -f3` s_city=`echo "${details_tmp}" | cut -d';' -f4` s_zipcode=`echo "${details_tmp}" | cut -d';' -f6` s_country=`echo "${details_tmp}" | cut -d';' -f7` DETAILS="${s_street}, ${s_zipcode} ${s_city}, ${s_country}" else DETAILS='' fi echo mecho -n --info "Result: "; echo "${NAME}, ${DETAILS}" echo break else # error print_debug "- Request unsuccessful (3)" fi else # error print_debug "- Request unsuccessful (2)" fi else # error print_debug "- Request unsuccessful (1)" fi idx=`expr ${idx} + 1` done umount_webdav_share "${davfs2_mount_path}" else # mount unsuccessful print_debug "- Unable to mount CardDAV share" fi if [ "${CAPI2TEXT_DO_DEBUG}" = "no" ] then rm -f ${tmpfile} fi else echo "Error: CAPI2TEXT_CARDDAV_SEARCH='no' has been set!" fi else echo "Error: No configuration file '${configfile}' found!" fi anykey exit 0