From 559a9927be8a8590b6684d814ea04823f6cb8c61 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 10 Jul 2010 22:38:47 +0100 Subject: [PATCH] First proof-of-concept scripts --- autodiscover.sh | 35 +++++++++++++++ syncfolder.sh | 117 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100755 autodiscover.sh create mode 100755 syncfolder.sh diff --git a/autodiscover.sh b/autodiscover.sh new file mode 100755 index 0000000..e96bd94 --- /dev/null +++ b/autodiscover.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +EMAIL="$1" +DOMAIN=${EMAIL##*@} + +QUERYFILE=$(mktemp /tmp/ewsqueryXXXXXX) +RESULTFILE=$(mktemp /tmp/ewsresultXXXXXX) +trap 'rm $QUERYFILE $RESULTFILE' EXIT + +cat > $QUERYFILE < + + $EMAIL + http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a + + +EOF + +for ATTEMPT in $DOMAIN autodiscover.$DOMAIN; do + if [ -n $EWSURL ]; then + echo Trying $ATTEMPT... + if curl --negotiate -u dummy: -L -H "Content-Type: text/xml" \ + https://$ATTEMPT/autodiscover/autodiscover.xml \ + -d @$QUERYFILE > $RESULTFILE; then + EWSURL="$(sed -n -e '/EwsUrl/{s/.*\(.*\)<\/EwsUrl>.*/\1/p;q}' $RESULTFILE)" + if [ "$EWSURL" != "" ]; then + echo "Found EWS URL: $EWSURL" + exit 0 + fi + fi + fi +done + +echo "Failed to discover EWS URL" +exit 1 diff --git a/syncfolder.sh b/syncfolder.sh new file mode 100755 index 0000000..7055a8d --- /dev/null +++ b/syncfolder.sh @@ -0,0 +1,117 @@ +#!/bin/sh + +CURLAUTH="--negotiate -u dummy:" +# NTLM is faster, but requires your password + +if [ "$3" != "" ]; then + CURLAUTH="--ntlm -u $2:$3" +fi + +EWSURL="$1" + +mkdir -p ~/ews-sync || exit 1 + +OLDSYNCSTATE=$(cat ~/.ews-syncstate) + +QUERYFILE=$(mktemp /tmp/ewsqueryXXXXXX) +RESULTFILE=$(mktemp /tmp/ewsresultXXXXXX) +CHANGELIST=$(mktemp /tmp/ewsclistXXXXXX) +trap 'rm $QUERYFILE $RESULTFILE $CHANGELIST' EXIT + +cat > $QUERYFILE < + + + + + AllProperties + + + + +EOF +if [ "$OLDSYNCSTATE" != "" ]; then + echo "$OLDSYNCSTATE" >> $QUERYFILE +fi +cat >> $QUERYFILE <50 + + + +EOF + +MORETOCOME=false + +if ! curl $CURLAUTH -L -H "Content-Type: text/xml" \ + $EWSURL -d @$QUERYFILE > $RESULTFILE; then + exit 1 +fi + +# I'm far too lazy to do proper XML parsing for a proof-of-concept +(sed 's/\(<[^/]\)/\n\1/g' $RESULTFILE; echo) | while read LINE; do + case $LINE in + ""*) + TYPE=CREATE + ;; + ""*) + TYPE=UPDATE + ;; + ""*) + TYPE=DELETE + ;; + "> $CHANGELIST + ;; + *) + ;; + esac +done + +if grep -q 'false/{s/.*\(.*\)<\/m:SyncState>.*/\1/p}' $RESULTFILE) + + +cat $CHANGELIST | while read TYPE ITEMID ITEMCHANGEKEY; do + ITEMFILENAME=~/ews-sync/$(echo $ITEMID | sed s^/^%2f^g) + echo $TYPE $ITEMID + case $TYPE in + DELETE) + rm "$ITEMFILENAME" + ;; + UPDATE|CREATE) + cat > $QUERYFILE < + + + + + AllProperties + + + + + + + +EOF + if ! curl $CURLAUTH -L -H "Content-Type: text/xml" \ + $EWSURL -d @$QUERYFILE > $RESULTFILE; then + exit 1 + fi + sed 's/\(<[^/]\)/\n\1/g' $RESULTFILE > "$ITEMFILENAME" + ;; + esac +done +echo $NEWSYNCSTATE > ~/.ews-syncstate +if [ "$MORETOCOME" == "true" ]; then + echo Restarting to fetch more items + exec "$0" "$1" +fi -- 2.50.1