commit 0fd1d61b56cb36a90f4946cbd190385b1df3c441
parent a641f8b9e8b6e4ae64d7accfc97612cb0fcc2669
Author: Jaromil <jaromil@dyne.org>
Date:   Tue, 24 Feb 2015 18:11:59 +0100
started port to Cygwin (using babun)
Diffstat:
6 files changed, 269 insertions(+), 17 deletions(-)
diff --git a/Makefile b/Makefile
@@ -1,8 +1,8 @@
 all:
-	@cd build && ./build-gnu.sh && cd -
+	./build/auto build
 
 install:
-	@build/install-gnu.sh
+	./build/auto install
 
 clean:
 	rm -f src/*.o
diff --git a/build/auto b/build/auto
@@ -0,0 +1,21 @@
+#!/usr/bin/env zsh
+
+os=`uname -o`
+action=$1
+
+[[ "$action" = "" ]] && {
+	print "usage: auto [ build | install ]"
+	return 1
+}
+
+case $os in
+	Cygwin)
+		print "Windows $action"
+		./build/${action}-win.sh
+		;;
+	GNU/Linux)
+		print "GNU/Linux $action"
+		./build/${action}-gnu.sh
+		;;
+esac
+
diff --git a/build/build-win.sh b/build/build-win.sh
@@ -0,0 +1,100 @@
+#!/usr/bin/env zsh
+
+distro=cygwin
+
+builddir=`pwd`
+# cc="${builddir}/cc-static.zsh"
+cc="gcc -O3"
+
+pushd ..
+
+target=all
+{ test -z $1 } || { target="$1" }
+# no other distro supported atm
+
+mkdir -p build/win
+
+{ test "$target" = "deps" } || {
+    test "$target" = "all" } && {
+    # only babun's pact supported for now
+            deps=(fetchmail msmtp mutt pinentry-curses pinentry-w32)
+            deps+=(sqlite3 abook)
+            deps+=(make)
+
+        print "Building on Cygwin"
+        print "Checking software to install"
+        for d in $deps; do
+		pact install $d
+	done
+
+    print "All dependencies installed"
+}
+
+{ test "$target" = "fetchaddr" } || {
+    test "$target" = "all" } && {
+    pushd src
+    print -n "Compiling the address parser (RFC2047) ... "
+    ${=cc} -c helpers.c
+    ${=cc} -c rfc2047.c
+    ${=cc} -c rfc822.c;
+    ${=cc} -c -DHAVE_ICONV fetchaddr.c;
+    ${=cc} -o fetchaddr fetchaddr.o helpers.o rfc2047.o rfc822.o
+    popd
+    cp src/fetchaddr build/win/
+    print OK
+}
+
+{ test "$target" = "parsedate" } || {
+    test "$target" = "all" } && {
+    print -n "Compiling the date parsers (RFC822) ... "
+    pushd src
+    ${=cc} -o parsedate parsedate.c
+    popd
+    cp src/parsedate build/win/
+    print OK
+}
+
+{ test "$target" = "dotlock" } || {
+    test "$target" = "all" } && {
+    print -n "Compiling the file dotlock... "
+    pushd src
+    ${=cc} -c dotlock.c -I . -DDL_STANDALONE
+    ${=cc} -o dotlock dotlock.o
+    popd
+    cp src/dotlock build/win/
+    print OK
+}
+
+{ test "$target" = "gpgewrap" } || {
+    test "$target" = "all" } && {
+    print -n "Compiling the GnuPG wrapper... "
+    pushd src
+    ${=cc} -c gpgewrap.c -I .
+    ${=cc} -o gpgewrap gpgewrap.o
+    popd
+    cp src/gpgewrap build/win/
+    print OK
+}
+
+# build mixmaster only if specified
+{ test "$target" = "mixmaster" } && {
+    print "Compiling Mixmaster (anonymous remailer)"
+    pushd src/mixmaster-3.0/Src
+    mixmaster_sources=(main menustats mix rem rem1 rem2 chain chain1 chain2 nym)
+    mixmaster_sources+=(pgp pgpdb pgpdata pgpget pgpcreat pool mail rfc822 mime keymgt)
+    mixmaster_sources+=(compress stats crypto random rndseed util buffers maildir parsedate.tab)
+    bison parsedate.y
+    for s in ${=mixmaster_sources}; do ${=cc} -c ${s}.c; done
+    ${=cc} -o mixmaster *.o -lssl
+    popd
+    cp src/mixmaster-3.0/Src/mixmaster build/win
+}
+
+
+print
+print "Done building JaroMail!"
+print "Now run 'make install' as root to install jaromail in /usr/local"
+print "use PREFIX=/home/private/jaromail to avoid system-wide installation."
+print
+
+popd
diff --git a/build/install-win.sh b/build/install-win.sh
@@ -0,0 +1,69 @@
+#!/usr/bin/env zsh
+
+PREFIX=${PREFIX:-$HOME/Mail}
+
+# TODO: separate libexec from share
+JARO_LIBEXEC=$HOME/Mail/system
+JARO_SHARE=$HOME/Mail
+mkdir -p $HOME/Mail
+touch $JARO_SHARE || {
+    print "Error: cannot write to $JARO_SHARE"
+    print "Run as root or set PREFIX to another location"
+    return 1
+}
+
+# cleanup previous installs
+rm -rf "$JARO_SHARE"
+mkdir -p "$JARO_SHARE"
+
+{ test $? = 0 } || {
+    print "No permissions to install system-wide."; return 1 }
+
+srcdir=.
+
+{ test -r ./src/fetchaddr } || {
+    print "Error: first build, then install."; return 1 }
+
+mkdir -p $JARO_SHARE/{.mutt,.stats}
+cp -ra $srcdir/doc/* $JARO_SHARE/
+cp -ra $srcdir/src/mutt/* $JARO_SHARE/.mutt/
+cp -ra $srcdir/src/stats/* $JARO_SHARE/.stats/
+
+# copy the executables
+mkdir -p $JARO_LIBEXEC/{bin,zlibs}
+cp $srcdir/src/jaro $JARO_LIBEXEC/bin
+cp -ra $srcdir/build/win/* $JARO_LIBEXEC/bin
+cp -ra $srcdir/src/zlibs/* $JARO_LIBEXEC/zlibs/
+cp -ra $srcdir/doc/jaromail-manual.pdf $JARO_LIBEXEC/
+
+for l in `ls $JARO_LIBEXEC/zlibs/ | grep '.zwc$'`; do
+    rm -f $l
+done
+
+for l in `ls $JARO_LIBEXEC/zlibs/ | grep -v '.zwc$'`; do
+    zcompile $JARO_LIBEXEC/zlibs/$l
+done
+
+# fix pinentry w32 path
+[[ -r /usr/bin/pinentry ]] || {
+    ln -s /usr/bin/pinentry-w32 /usr/bin/pinentry
+}
+
+mkdir -p /usr/local/bin
+rm -f /usr/local/bin/jaro
+cat <<EOF > /usr/local/bin/jaro
+#!/usr/bin/env zsh
+export JAROWORKDIR=${JARO_LIBEXEC}
+export JAROMAILDIR=${PREFIX}
+${JARO_LIBEXEC}/bin/jaro \$*
+EOF
+chmod +x /usr/local/bin/jaro
+
+source ${JARO_LIBEXEC}/bin/jaro source
+
+jaro init
+
+notice "Jaro Mail succesfully installed in: $PREFIX"
+act "Executable path: /usr/local/bin/jaro"
+
+return 0
diff --git a/src/jaro b/src/jaro
@@ -112,7 +112,7 @@ typeset -aH JAROTMPFILES      # Keep track of temporary files
 _tmp_create() {
     [[ -d "$TMPPREFIX" ]] || {
         # we create the tempdir with the sticky bit on
-        sudo mkdir -m 1777 "$TMPPREFIX"
+        mkdir -m 1777 "$TMPPREFIX"
         [[ $? == 0 ]] || _failure "Fatal error creating the temporary directory: ::1 temp dir::" "$TMPPREFIX"
     }
     
@@ -170,13 +170,16 @@ if [[ ${@} == *-D* ]]; then DEBUG=1; fi
 
 # what operating system are we in? use os_detect()
 # simplifying modes of operation: GNU or MAC
-case $(uname) in
-    Linux) OS=GNU
+case $(uname -o) in
+    GNU/Linux) OS=GNU
     notice "Jaro Mail v$VERSION running on GNU/Linux"	;;
 
     Darwin) OS=MAC
     notice "Jaro Mail v$VERSION running on Mac/OSX"	;;
 
+    Cygwin) OS=WIN
+	    notice "Jaro Mail v$VERSION runing on MS/Win" ;;
+	    
     *) OS=GNU # default
     error "Running on an unknown operating system, assuming GNU" ;;
 esac
@@ -211,7 +214,7 @@ else # use GNU/Linux default
 fi
 
 # env override
-{ test "$JAROWORKDIR" = "" } || { WORKDIR="${JAROWORKDIR}" }
+[[ "$JAROWORKDIR" = "" ]] || { WORKDIR="${JAROWORKDIR}" }
 
 # default addressbook
 ADDRESSBOOK="$MAILDIRS/whitelist.abook"
@@ -245,9 +248,12 @@ if [ -d $WORKDIR/zlibs ]; then
         source ${z}
     done
     fi
+
     act "full set of auxiliary functions loaded"
 elif [[ $1 = source ]]; then
+
     act "limited set of auxiliary functions loaded"
+
 else
     error "No ZLibs found in $WORKDIR/zlibs"
     error "This installation of Jaro Mail is broken."
@@ -307,6 +313,9 @@ esac
 
 hostname=$(hostname) # gather the current hostname
 
+
+[[ "$1" = "source" ]] || { # skip checks if just sourcing
+
 # make sure we have a directory for account configurations
 { test -d "$ACCOUNTS" } || { ${=mkdir} "$ACCOUNTS" }
 
@@ -335,6 +344,8 @@ MUTTDIR="$MAILDIRS/.mutt"
     cp "$WORKDIR/Mutt.txt" "$MAILDIRS/Mutt.txt"
     notice "Default Mutt configuration template created" }
 
+} # if not sourcing
+
 _mutt() {
     for i; do _fa+=" $i "; done
     func "exec: mutt -F $MUTTDIR/rc ${=muttflags} ${_fa}"
@@ -399,9 +410,11 @@ check_bin() {
     func "Notmuch binary: `command -v notmuch`"
     func "Alot binary: `command -v alot`"
 
-    pidof gnome-keyring-daemon > /dev/null && {
+    ps ax | grep '[g]nome-keyring-daemon' > /dev/null
+    [[ $? = 0 ]] && {
         act "using gnome-keyring to store secrets"
-        GNOMEKEY=1 }
+        GNOMEKEY=1
+    }
     
     return 0
 }
@@ -712,8 +725,10 @@ main() {
         update_filters
         update_mutt
         update_sieve
+	command -v notmuch > /dev/null && {
         nm_setup
         nm new 2>&1 | grep -v '^Note: Ignoring'
+}
         ;;
 
     help) usage ;;
diff --git a/src/zlibs/keyring b/src/zlibs/keyring
@@ -90,15 +90,15 @@ ask_password() {
 		fi
 		return 0
 	    elif [ -r "$KEYRING" ]; then
-                func "Looking for password in local keyring for $email ($account)"
+                func "looking for password in local keyring for $email ($account)"
 		func "new pass hash for: $login:$host"
 		_hash=`print "$login:$host" | shasum | awk '{print $1}'`
 		lookup="`lookup_secret ${_hash}`"
 		{ test "$lookup" = "" } || {
-		    act "Saved password found for $email ($transport on $host)"
-		    notice "Type the password to unlock this keyring entry:"
-		    password="`print - $lookup | base64 -d | gpg -d --cipher-algo AES256 --openpgp --no-options`"
-		    { test "$?" = 0 } || { error "Incorrect password to unlock local keyring entry, operation aborted."; return 1 }
+		    act "saved password found for $email ($transport on $host)"
+		    notice "type the password to unlock this keyring entry:"
+		    password="`print - $lookup | base64 -d | gpg -d --cipher-algo aes256 --openpgp --no-options`"
+		    { test "$?" = 0 } || { error "incorrect password to unlock local keyring entry, operation aborted."; return 1 }
 		    return 0
 		}
 	    fi
@@ -111,8 +111,26 @@ ask_password() {
 	    return 0
 	    ;;
 	*)
-	    error "Unknown system, can't figure out how to handle passwords"
-	    return 1
+                func "looking for password in local keyring for $email ($account)"
+		func "new pass hash for: $login:$host"
+		_hash=`print "$login:$host" | shasum | awk '{print $1}'`
+		lookup="`lookup_secret ${_hash}`"
+		{ test "$lookup" = "" } || {
+		    act "saved password found for $email ($transport on $host)"
+		    notice "type the password to unlock this keyring entry:"
+		    password="`print - $lookup | base64 -d | gpg -d --cipher-algo aes256 --openpgp --no-options`"
+		    { test "$?" = 0 } || { error "incorrect password to unlock local keyring entry, operation aborted."; return 1 }
+		    return 0
+		}
+	    ####################
+	    # USE PINENTRY ALONE
+	    new_password
+	    { test $? != 0 } && {
+		error "Password input aborted."
+		return 1 }
+	    return 0
+	    ;;
+
     esac
 }
 
@@ -226,7 +244,36 @@ EOF
             
 	        ;;
 	    *)
-	        error "Unknown system, can't figure out how to handle passwords"
-	        return 1
+
+ 
+		        { test -r "$KEYRING" } || { create_keyring "$KEYRING" }
+
+                for h in "$imap" "$smtp"; do                
+		            # calculate the hash for this entry
+		            _hash=`print "$login:$host" | shasum | awk '{print $1}'`
+		            # check if the entry is already present
+		            func "new pass hash for: $login:$host"
+		            lookup="`lookup_secret ${_hash} rowid`"
+		            notice "Select the password to lock this keyring entry:"
+		            _password="`print - $password | gpg -c --cipher-algo AES256 --openpgp --no-options | base64`"
+                                        
+		            if [ "$lookup" = "" ]; then # new entry
+			            cat <<EOF | ${SQL} -batch "$KEYRING"
+INSERT INTO secrets (hash, password)
+VALUES ("${_hash}", "${_password}");
+EOF
+			            act "saved new password in local keyring"
+		            else # update entry
+			            cat <<EOF | ${SQL} -batch "$KEYRING"
+UPDATE secrets SET password="${_password}" WHERE hash LIKE "${_hash}";
+EOF
+			            act "updated local keyring with new password"
+		            fi
+                done
+
+
+
+		   
+		    ;;
     esac
 }