diff --git a/misc/srifreq b/misc/srifreq index 431441ee..07764b80 100755 --- a/misc/srifreq +++ b/misc/srifreq @@ -2,129 +2,153 @@ # Simple SRIF compatible FREQ processor # © Copyleft Stas Degteff 2:5080/102@fidonet -version=1.0 + +SCRIPT_NAME=${0##*/} +version=1.0-modified-2021-07-12-2 ##### Configuration -PUB=/ftp/pub -if [ ${BASH_VERSINFO[1]} -ge 4 ] - then - ALIASES=( [FILES]=/ftp/pub/FILES ) -fi + +PUB=/ftp/pub/ + logfacilityinfo=local1.notice logfacilityerror=local1.err logstderr= #-s +if [ ${BASH_VERSINFO[0]} -ge 4 ] +then + declare -A ALIASES + + # Static aliases (enable if desired!) + #ALIASES=( [EXAMPLE1]=/path/to/example1 [EXAMPLE2]=/path/to/example2 ) + + # Add aliases from ifcico reqmap (enable if desired!) + #IFCICO_REQMAP=/etc/ifmail/reqmap + #[ -s "$IFCICO_REQMAP" ] && [ -r "$IFCICO_REQMAP" ] && { while read -r key value; do [ ! "$key" ] && continue; ALIASES[$key]=$value; done; } < "$IFCICO_REQMAP" + +fi + ##### Implementation -function usage () +function usage { - echo "Simple SRIF compatible Fidonet File Request processor v.${version}" - echo -e "@ copyleft Stas Degteff 2:5080/102\n" - if [ ${BASH_VERSINFO[1]} -ge 4 ] - then - Aliases are supported - fi - echo "Usage: `basename $0` " + echo "Simple SRIF compatible Fidonet File Request processor v.${version}" + echo -e "@ copyleft Stas Degteff 2:5080/102\n" + [ ${BASH_VERSINFO[0]} -ge 4 ] && echo -e "Aliases are supported\n" + echo "Usage: $SCRIPT_NAME " } -if [ ${BASH_VERSINFO[1]} -ge 4 ] - then - declare -A ALIASES -fi -function getSrifFile ( ) +function getSrifFile # read information from SRIF file # Parameters: $1 = SRIF file name { - local token value error - - logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "parse SRIF file: ${1}" - { while read -u 4 token value - do - token=${token//[\'\"\`\$]/} - value=${value//[\'\"\`\$]/} - if [ ${BASH_VERSINFO[1]} -ge 4 ] - then - token=${token,,} - fi + local token value error -# case ${token,,} in - case ${token} in -# [Ss][yY][sS][oO][pP]) -# sysop=value -# logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "sysop: ${sysop}" -# ;; -# [Aa][Kk][Aa]) -# aka=value -# logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "aka: ${aka}" -# ;; - [Rr][eE][qQ][uU][eE][sS][tT][Ll][iI][sS][tT]) -# requestlist) - requestlist=${value//\.\.\/} - logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "requestlist: ${requestlist}" - if [ ! -s ${requestlist} ] - then - error=1 - logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "broken SRIF file: RequestList" ${requestlist} "is not exist or empty!" - else - if [ ! -r ${requestlist} ] - then - error=1 - logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "Error: RequestList" ${requestlist} "is not readable!" - fi - fi - ;; - [Rr][eE][sS][pP][oO][nN][sS][eE][Ll][iI][sS][tT]) -# responselist) - responselist=${value//\.\.\/} - logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "responselist: ${responselist}" - if [ ! -w `dirname ${responselist}` ] - then - error=1 - logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "responselist ${responselist} is not writable" - fi - ;; - esac - done - } 4<$1 - if [ -z ${responselist} -o -z ${requestlist} ] - then - logger -p ${logfacilityerror} ${logstderr} -t "srifreq[$$]" "broken SRIF file: ResponseList or RequestList is not specified" + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "SRIF file: $1" + { + while read -u 4 token value + do + + # remove special characters + token=${token//[\'\"\`\$]/} + value=${value//[\'\"\`\$]/} + + case "$token" in + + [Ss][yY][sS][oO][pP]) + sysop=$value + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "Sysop: $sysop" + ;; + + [Aa][Kk][Aa]) + aka=$value + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "AKA: $aka" + ;; + + [Rr][eE][qQ][uU][eE][sS][tT][Ll][iI][sS][tT]) + + # remove any directory traversals (../) + # NOTE: Probably unnecessary, as the RequestList path is created by the receiving (local) mailer, which should be trusted! + requestlist=${value//\.\.\/} + + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "RequestList: $requestlist" + if [ ! -s "$requestlist" ] + then + error=1 + logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Broken SRIF file: RequestList $requestlist does not exist or is empty!" + else + if [ ! -r "$requestlist" ] + then + error=1 + logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: RequestList $requestlist is not readable!" + fi + fi + ;; + + [Rr][eE][sS][pP][oO][nN][sS][eE][Ll][iI][sS][tT]) + + # remove any directory traversals (../) + # NOTE: Probably unnecessary, as the ResponseList path is created by the receiving (local) mailer, which should be trusted! + responselist=${value//\.\.\/} + + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "ResponseList: $responselist" + if [ ! -w "$(dirname -- "$responselist")" ] + then + error=1 + logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Directory $(dirname -- "$responselist") is not writable, so cannot write ResponseList ${responselist}!" + fi + ;; + + esac + done + } 4< "$1" + + if [ -z "$requestlist" -o -z "$responselist" ] + then + logger -p "$logfacilityerror" $logstderr -t "${SCRIPT_NAME}[$$]" "ERROR: Broken SRIF file: RequestList and/or ResponseList not specified!" error=1 fi - if [ ${error} ] ; then exit ${error} ; fi + + [ "$error" ] && exit $error } -function processrequest () +function processrequest # Process requested file list # Parameters: $1 = request file (one requesting file in line) -# $2 = responce file (found files prefixed with "+") -{ local fname - while read -u4 fname - do +# $2 = response file (found files prefixed with "+") +{ + local fname + + while read -u 4 fname + do + + # remove special characters fname=${fname//[\'\"\`\$]} fname=${fname//$'\r'} - fname=`basename ${fname}` - logger -p ${logfacilityinfo} ${logstderr} -t "srifreq[$$]" "Find file ${fname}" - if [ ${BASH_VERSINFO[1]} -ge 4 ] - then - if [ -n ${ALIASES[${fname}]} ] - then - echo "+${ALIASES[${fname}]}" >>${2} - else - find ${PUB} -name ${fname} -printf "+%p\n" 2>/dev/null >>${2} + + # extract basename + fname=${fname##*/} + + # ignore empty lines/names + [ ! "$fname" ] && continue + + logger -p "$logfacilityinfo" $logstderr -t "${SCRIPT_NAME}[$$]" "Requested file: $fname" + + if [ ${BASH_VERSINFO[0]} -ge 4 ] + then + if [ "${ALIASES[$fname]}" ] + then + echo "+${ALIASES[$fname]}" >> "$2" + else + find "$PUB" -name "$fname" -printf "+%p\n" 2> /dev/null >> "$2" fi - else - find ${PUB} -name ${fname} -printf "+%p\n" 2>/dev/null >>${2} + else + find "$PUB" -name "$fname" -printf "+%p\n" 2> /dev/null >> "$2" fi done -} 4<${1} -#### main code -if [ $# != 1 -o ! -f "$1" ] - then - usage - exit 1 -fi - -getSrifFile $1 -processrequest ${requestlist} ${responselist} +} 4< "$1" +#### main code +[ $# != 1 ] && { usage >&2; exit 1; } +getSrifFile "$1" +processrequest "$requestlist" "$responselist" +exit 0