#!/bin/bash
# Kategorie: mailaccounts
# Script zur Auffrischung der fetchmailrc-Datei fuer den Fall, dass sich Konten-
# Daten geaendert haben. Aktiviert keine neu angelegten Konten, die noch nicht
# in der aktiven .fetchmailrc Datei vorhanden sind.
# (C) 2021 Stefan Schäfer invis-server.org
# Questions: stefan@invis-server.org

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

#Konfigurationsdaten
conffile="/etc/invis/invis.conf"
passfile="/etc/invis/invis-pws.conf"
workdir="/tmp/invis/"
tmpfile="/$workdir/account"
sam="/var/lib/samba/private/sam.ldb"
wdir="/var/lib/cornaz"
buildfrcfile="$wdir/build/.fetchmailrc"
actfrcfile="$wdir/inuse/.fetchmailrc"

# PortalTempfile
iptmpfile="/srv/www/htdocs/portal/tmp/iportal.tmp"

# remove tempfiles, if exists
if [[ -f $iptmpfile ]]; then
    rm $iptmpfile
fi
if [[ -f $tmpfile ]]; then
    rm $workdir/*
fi
if [[ ! -d $workdir ]]; then
    mkdir $workdir
fi

ok=0

# Funktionen
# Werte aus Konfigurationsdatendatei extrahieren
# $1 = Konfigurationsdatei, $2 = Parameter, $3 Wert (Feld)
getconfdata() {
    cat $1 |grep "$2" | cut -d ":" -f $3
}

# LDAP Basisknoten fuer invis-Server auslesen
invisadnode=`getconfdata $conffile invisADNode 2` 
# Searchbase generieren
ldbbase="CN=AdditionalUserInformation,$invisadnode"

# Nur ausfuehren, wenn aktive fetchmailrc abzueglich der Zeile "junk" mindestens eine Zeile hat
if (( `cat $actfrcfile|grep -v " junk "|wc -l` >= 1 )); then
    rm $buildfrcfile
    # Nur "anwesende" Benutzer
    usersuncleaned=(`cat $actfrcfile |cut -d " " -f 10`)
    # Duplikate entfernen
    usersunique=($(echo "${usersuncleaned[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
    
    for user in ${usersunique[@]}; do
	# Benutzerinformationen aus AD lesen
	ldbsearch -H /var/lib/samba/private/sam.ldb -b "CN=$user,$ldbbase" -s one "(objectclass=fspFetchMailAccount)" "fspExtMailAddress" "fspExtMailProto" "fspExtMailUserName" "fspExtMailServer" "fspExtMailUserPw" "fspMailFetchOpts"|grep ":" > $tmpfile
	# Datei aufteilen
	csplit -sf $workdir/splitfile_ -z /$tmpfile /^dn:/ '{*}'
	for splitfile in `ls $workdir/splitfile_*`; do
	    if [[ ! `grep "search error" $tmpfile` ]]; then
		# Variablen generieren
		server=`grep fspExtMailServer $splitfile |cut -d " " -f2`
		proto=`grep fspExtMailProto $splitfile |cut -d " " -f2`
		extuser=`grep fspExtMailUserName $splitfile |cut -d " " -f2`
		password=`grep fspExtMailUserPW $splitfile |cut -d " " -f2`
		opts=`grep fspMailFetchOpts $splitfile |cut -d " " -f2-`

		# ggf. Passwort dekodieren
		if [[ "$password" =~ /^(?:[A-Za-z\d+/]{4})*(?:[A-Za-z\d+/]{3}=|[A-Za-z\d+/]{2}==)?$/ ]]; then
		    password=`echo "$password" | base64 -d`
		fi

		# fetchmailrc-Vorlage erzeugen
		echo "poll $server proto $proto user $extuser pass "\'$password\'" is $user $opts" >> $buildfrcfile
	    fi
	done
	# Splitfiles loeschen
        rm $workdir/splitfile_*
    done

    # fetchcopy ausfueren um echte fetchmailrc zu generieren.
    if [[ -f $actfrcfile ]]; then
	mv -f $actfrcfile $wdir/bu/fetchmailrc
    fi
    cp $buildfrcfile $actfrcfile
    sudo chown fetchmail.root $actfrcfile
    sudo chmod 0710 $actfrcfile

    (( ok=$ok+0 ))

else
    (( ok=$ok+1 ))
fi

# writing returncode to tempfile
echo $ok > $iptmpfile
# make the file writeable for apache
chown .www $iptmpfile && chmod g+w $iptmpfile

# alte Dateien loeschen
rm $tmpfile
