commit fb58f9082cf6b823978badf3d0dcf552412edb6c
parent ee055bb641d8b61cc6cfe73b79ad96061174f6a9
Author: Jaromil <jaromil@dyne.org>
Date: Mon, 18 Jun 2012 14:48:13 +0200
small zlib reorganization
Diffstat:
M | src/jaro | | | 23 | +++++++++++------------ |
M | src/zlibs/accounts | | | 342 | ++++++++++++++++++++++++++++++------------------------------------------------- |
A | src/zlibs/filters | | | 246 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
D | src/zlibs/password | | | 166 | ------------------------------------------------------------------------------- |
4 files changed, 388 insertions(+), 389 deletions(-)
diff --git a/src/jaro b/src/jaro
@@ -122,19 +122,18 @@ ${=mkdir} $WORKDIR
chmod 700 $WORKDIR
PATH=$WORKDIR/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/opt/local/bin
-{ test -r $WORKDIR/zlibs/accounts } && {
+
# load our ZLibs
-. $WORKDIR/zlibs/accounts
-. $WORKDIR/zlibs/addressbook
-. $WORKDIR/zlibs/cmdline
-. $WORKDIR/zlibs/email
-. $WORKDIR/zlibs/helpers
-. $WORKDIR/zlibs/locking
-. $WORKDIR/zlibs/maildirs
-. $WORKDIR/zlibs/password
-. $WORKDIR/zlibs/search
-. $WORKDIR/zlibs/stats
-}
+if [ -d $WORKDIR/zlibs ]; then
+ for z in `find $WORKDIR/zlibs/ -type f | grep -v '.zwc$'`; do
+ func "Loading zlib: ${z}"
+ . ${z}
+ done
+else
+ error "No ZLibs found in $WORKDIR/zlibs"
+ error "This installation of Jaro Mail is broken."
+ exit 1
+fi
# temporary directory
TMPDIR=$WORKDIR/tmp
diff --git a/src/zlibs/accounts b/src/zlibs/accounts
@@ -20,6 +20,8 @@
# this source code; if not, write to:
# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+
switch_identity() {
if [ "$name" != "" ]; then
act "switch to identity: $name <$login>"
@@ -130,227 +132,145 @@ read_account() {
}
-update() {
- notice "Updating all configurations and filters"
- # this function should:
- # parse all filters
- # generate procmailrc
- # generate muttrc
- # backup what's too old in the maildirs
- # ...
-
- # debug configuration
- func "MAILDIRS: $MAILDIRS"
- func "WORKDIR: $WORKDIR"
- func "MUTTDIR: $MUTTDIR"
- func "PROCMAILDIR: $PROCMAILDIR"
-
- # make sure maildirs where to put mails exist
- ${=mkdir} $MAILDIRS
- maildirmake $MAILDIRS/known
- maildirmake $MAILDIRS/sent
- maildirmake $MAILDIRS/priv
- maildirmake $MAILDIRS/postponed
- maildirmake $MAILDIRS/unsorted
- maildirmake $MAILDIRS/ml.unsorted
- ${=mkdir} $MAILDIRS/outbox
-
- ######
- # MUTT
- ${=mkdir} $MUTTDIR
- rm -f $MUTTDIR/rc
- cat<<EOF > $MUTTDIR/rc
-# mutt config generated by Jaro Mail
-unset use_domain
-set folder = $MAILDIRS
-set spoolfile = $MAILDIRS/known/
-set record = $MAILDIRS/sent/
-set postponed= $MAILDIRS/postponed/
-set tmpdir = $WORKDIR/cache
-set sendmail = "$WORKDIR/bin/jaro queue"
-set header_cache= $WORKDIR/cache
-set maildir_header_cache_verify=no
-set editor = "$WORKDIR/bin/jaro edit"
-set mailcap_path = "$WORKDIR/.mutt/mailcap:$WORKDIR/mailcap:$HOME/.mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap"
-
-# Little Brother Database
-set query_command = "$WORKDIR/bin/jaro -q addr '%s'"
-macro index,pager a "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q learn from:<enter>" "add to whitelist everyone in the message"
-macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q forget from:<enter>" "remove sender from whitelist
-macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q learn from:<enter>" "add sender to blacklist"
-macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q forget from:<enter>" "remove sender from blacklist
-
-# mailboxes in order of priority
-source $MUTTDIR/mboxes
-
-# specific configuration files
-source $MUTTDIR/crypto
-source $MUTTDIR/general
-source $MUTTDIR/formats
-source $MUTTDIR/keybindings
-source $MUTTDIR/identity
-source $MUTTDIR/password
-source $MUTTDIR/colors
-source $WORKDIR/Mutt.txt
-## end of Jaro Mail generated muttrc
-####################################
-
-EOF
-
- # making sure we have the minimum mailcap necessary
-wwwtext=w3m
-{ which lynx > /dev/null } && { wwwtext=lynx }
-{ which elinks > /dev/null } && { wwwtext=elinks }
-cat <<EOF > $MUTTDIR/mailcap
-text/html; ${wwwtext} -dump %s; nametemplate=%s.html; copiousoutput
-application/*; a=$WORKDIR/tmp/attach-$RANDOM$RANDOM && cp %s \$a && jaro open \$a
-text/plain; iconv -f iso-8859-1 -t utf-8; test=charset=%{charset} \
- && test x`echo \"$charset\" | tr a-z A-Z` = xISO-8859-1; copiousoutput
-text/plain; cat %s
+# we use pinentry
+# comes from gpg project and is secure
+# it also conveniently uses the right toolkit
+pin_entry() {
+ cat <<EOF | pinentry 2>/dev/null | awk '/^D / { sub(/^D /, ""); print }'
+OPTION ttyname=$TTY
+OPTION lc-ctype=$LANG
+SETTITLE Type your password
+SETDESC Type the password for $1 @ $2
+SETPROMPT Password:
+GETPIN
EOF
-
- # this one is empty and sources files in temp when necessary
- touch $MUTTDIR/password
-
- # just the header, will be completed later in procmail loop
- rm -f $MUTTDIR/mboxes
- echo -n "mailboxes +priv" > $MUTTDIR/mboxes
-
- # update identity with default
- read_account imap
-
- switch_identity
-
- ##########
- # PROCMAIL
- act "generating procmail filters"
- ${=mkdir} $PROCMAILDIR
- rm -f $PROCMAILDIR/rc
- touch $PROCMAILDIR/rc
- cat<<EOF >> $PROCMAILDIR/rc
-# procmail configuration file generated by Jaro Mail
-MAILDIR=$MAILDIRS
-JARO=$WORKDIR/bin/jaro
-DEFAULT=unsorted/
-VERBOSE=off
-LOGFILE=$WORKDIR/log/procmail.log
-SHELL = /bin/sh # VERY IMPORTANT
-UMASK = 007 # James Bond :-)
-LINEBUF = 8192 # avoid procmail choke
-
-# Using Procmail Module Library http://sf.net/projects/pm-lib
-PMSRC = $PROCMAILDIR
-# Load the central initial startup code.
-INCLUDERC = \$PMSRC/pm-javar.rc
-PF_DEST = "" # clear these vars
-PF_FROM = ""
-PF_RECURSE = yes
-
-# blacklist filters
-:0 w:
-* ? \$JARO -l blacklist -q query from:
-zz.blacklist/
-
-# filters generated from Filters.txt
-:0
-* ? test \$PMSRC/pf-chkto.rc
-{
-EOF
-
- #######
- echo "# filters generated from Filters.txt" >> $PROCMAILDIR/rc
-
- for f in `cat $WORKDIR/Filters.txt | awk '/^#/ {next} /^./ { print $1 ";" $2 ";" $3 ";" $4 }'`; do
- header="${f[(ws:;:)1]}"
- address="${f[(ws:;:)2]}"
- action="${f[(ws:;:)3]}"
- destination="${f[(ws:;:)4]}"
- case $header in
- to)
- print "ADDR=${address}\tDEST=${destination}/\tINCLUDERC=\$PMSRC/pf-chkto.rc" \
- >> $PROCMAILDIR/rc
- func "messages to <${address}> in folder: ${destination}"
- maildirmake $MAILDIRS/$destination
- ;;
- from)
- print "ADDR=${address}\tDEST=${destination}/\tINCLUDERC=\$PMSRC/pf-check.rc" \
- >> $PROCMAILDIR/rc
- func "messages from <${address}> in folder: {$destination}"
- maildirmake $MAILDIRS/$destination
- ;;
- *)
- error "unsupported filter: $header (skipped)"
- ;;
- esac
- # MUTT (generate mailboxes priority this parser)
- echo " \\" >> $MUTTDIR/mboxes
- echo -n " +${destination} " >> $MUTTDIR/mboxes
- done
-
- # if the sender is known (ldbd recognizes it) then put mail in high priority 'known'
- cat <<EOF >> $PROCMAILDIR/rc
}
-:0
-* PF_DEST ?? .
-* ? test \$PMSRC/pf-save.rc
-{ INCLUDERC=\$PMSRC/pf-save.rc }
-
-# whitelisting filters
-:0 w:
-* ? \$JARO -l whitelist -q query from:
-known/
-
-
-EOF
-
- #######
-cat <<EOF >> $PROCMAILDIR/rc
-# filters generated from Accounts
-:0
-* ? test \$PMSRC/pf-chkto.rc
-{
-EOF
- for f in `cat $WORKDIR/Accounts/* | awk '/^email/ { print $2 }'`; do
- echo "ADDR=${f}\tDEST=priv/\tINCLUDERC=\$PMSRC/pf-chkto.rc" >> $PROCMAILDIR/rc
- func "private account: <${f}>"
- done
-
- cat <<EOF >> $PROCMAILDIR/rc
+# retrieve a password for user @ domain
+# put it in variable password
+# up to the caller to unset it after use
+ask_password() {
+ func "Looking for password in keyring: $name"
+ case $OS in
+ MAC)
+ security find-internet-password \
+ -c JARO -a $email -s $host \
+ -p $transport -P $port > /dev/null
+ if [ $? != 0 ]; then # its a new password
+ new_password
+ { test $? != 0 } && {
+ error "Password input aborted."
+ return 1 }
+ else
+ password=`security find-internet-password -c JARO -a $email -s $host -p $transport -P $port -g 2>&1| awk '/^password:/ { print $2 }' | sed -e 's/"//g'`
+ fi
+ return 0
+ ;;
+ #####################################
+ GNU)
+ func "Looking for password in keyring: $name"
+ ###################
+ # USE GNOME KEYRING
+ { test $GNOMEKEY = 1 } && {
+ echo "protocol=${type}\npath=jaromail/${email}\nusername=${login}\nhost=${host}\n\n" \
+ | $WORKDIR/bin/jaro-gnome-keyring check
+ if [ $? != 0 ]; then # its a new password
+ new_password
+ { test $? != 0 } && {
+ error "Password input aborted."
+ return 1 }
+ else # password found into gnome keyring
+ act "Using saved password for $1 @ $2"
+ password=`echo "protocol=${type}\npath=jaromail/${email}\nusername=${login}\nhost=${host}\n\n" | $WORKDIR/bin/jaro-gnome-keyring get`
+ fi
+ return 0
+ }
+ ####################
+ # USE PINENTRY ALONE
+ new_password
+ { test $? != 0 } && {
+ error "Password input aborted."
+ return 1 }
+ return 0
+ ;;
+ *)
+ error "Unknown system, can't figure out how to handle passwords"
+ return 1
+ esac
}
-:0
-* PF_DEST ?? .
-* ? test \$PMSRC/pf-save.rc
-{ INCLUDERC=\$PMSRC/pf-save.rc }
-
-# if its an unknown mailinglist, save it into ml.unsorted
-:0
-* ^(List-Id|X-(Mailing-)?List):
-ml.unsorted/
-
+new_password() {
+ notice "Setting a new password for $name"
+ password=`pin_entry $login $host`
+ res=0
+ case $OS in
+ MAC)
+ if [ "$password" != "" ]; then
+ security add-internet-password \
+ -c JARO -a $email -s $host \
+ -p $transport -P $port -w "${password}"
+ if [ $? != 0 ]; then
+ error "Error adding password to keyring."
+ else
+ act "New password saved in keyring"
+ fi
+ return 0
+ else
+ security delete-internet-password \
+ -c JARO -a $email -s $host \
+ -p $transport -P $port > /dev/null
+ res=$?; unset password
+ { test $res != 0 } && {
+ error "Error deleting password from keyring."
+ return 1 }
+ act "No new password given, old password erased."
+ return 0
+ fi
+ ;;
+ GNU)
+ if [ "$password" != "" ]; then # password was written
+
+ # USE GNOME KEYRING
+ { test $GNOMEKEY = 1 } && {
+
+ cat <<EOF | $WORKDIR/bin/jaro-gnome-keyring store
+protocol=${type}
+path=jaromail/${email}
+username=${login}
+host=${host}
+password=${password}
EOF
+ { test $? != 0 } && { error "Error saving password in Gnome keyring" }
+ return 0
+ }
- # MUTT (generate mailboxes priority this parser)
- echo " \\" >> $MUTTDIR/mboxes
- echo " +ml.unsorted +unsorted" >> $MUTTDIR/mboxes
-
- uniq $MUTTDIR/mboxes > $TMPDIR/mboxes
- mv $TMPDIR/mboxes $MUTTDIR/mboxes
- rm -f $TMPDIR/mboxes
+ return 0
- # conclude
- cat <<EOF >> $PROCMAILDIR/rc
+ else # password is blank or aborted
-# if got here, go to unsorted
-:0:
-\$DEFAULT
+ # USE GNOME KEYRING
+ { test $GNOMEKEY = 1 } && {
-#
-# End of generated procmail rc
-#
+ cat <<EOF | $WORKDIR/bin/jaro-gnome-keyring erase
+protocol=${type}
+path=jaromail/${email}
+username=${login}
+host=${host}
EOF
- return 0
-} # end of update()
+ { test $? != 0 } && {
+ error "Error accessing password in Gnome keyring"
+ return 1 }
+ act "No new password given, old password erased."
+ return 0
+ }
+ return 1
+
+ fi
+ ;;
+ *)
+ error "Unknown system, can't figure out how to handle passwords"
+ return 1
+ esac
+}
diff --git a/src/zlibs/filters b/src/zlibs/filters
@@ -0,0 +1,246 @@
+#!/usr/bin/env zsh
+#
+# Jaro Mail, your humble and faithful electronic postman
+#
+# a tool to easily and privately handle your e-mail communication
+#
+# Copyleft (C) 2010-2012 Denis Roio <jaromil@dyne.org>
+#
+# This source code is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This source code is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# Please refer to the GNU Public License for more details.
+#
+# You should have received a copy of the GNU Public License along with
+# this source code; if not, write to:
+# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+update() {
+ notice "Updating all configurations and filters"
+ # this function should:
+ # parse all filters
+ # generate procmailrc
+ # generate muttrc
+ # backup what's too old in the maildirs
+ # ...
+
+ # debug configuration
+ func "MAILDIRS: $MAILDIRS"
+ func "WORKDIR: $WORKDIR"
+ func "MUTTDIR: $MUTTDIR"
+ func "PROCMAILDIR: $PROCMAILDIR"
+
+ # make sure maildirs where to put mails exist
+ ${=mkdir} $MAILDIRS
+ maildirmake $MAILDIRS/known
+ maildirmake $MAILDIRS/sent
+ maildirmake $MAILDIRS/priv
+ maildirmake $MAILDIRS/postponed
+ maildirmake $MAILDIRS/unsorted
+ maildirmake $MAILDIRS/ml.unsorted
+ ${=mkdir} $MAILDIRS/outbox
+
+ ######
+ # MUTT
+ ${=mkdir} $MUTTDIR
+ rm -f $MUTTDIR/rc
+ cat<<EOF > $MUTTDIR/rc
+# mutt config generated by Jaro Mail
+unset use_domain
+set folder = $MAILDIRS
+set spoolfile = $MAILDIRS/known/
+set record = $MAILDIRS/sent/
+set postponed= $MAILDIRS/postponed/
+set tmpdir = $WORKDIR/cache
+set sendmail = "$WORKDIR/bin/jaro queue"
+set header_cache= $WORKDIR/cache
+set maildir_header_cache_verify=no
+set editor = "$WORKDIR/bin/jaro edit"
+set mailcap_path = "$WORKDIR/.mutt/mailcap:$WORKDIR/mailcap:$HOME/.mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap"
+
+# Little Brother Database
+set query_command = "$WORKDIR/bin/jaro -q addr '%s'"
+macro index,pager a "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q learn from:<enter>" "add to whitelist everyone in the message"
+macro index,pager A "<pipe-message>$WORKDIR/bin/jaro -l whitelist -q forget from:<enter>" "remove sender from whitelist
+macro index,pager z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q learn from:<enter>" "add sender to blacklist"
+macro index,pager Z "<pipe-message>$WORKDIR/bin/jaro -l blacklist -q forget from:<enter>" "remove sender from blacklist
+
+# mailboxes in order of priority
+source $MUTTDIR/mboxes
+
+# specific configuration files
+source $MUTTDIR/crypto
+source $MUTTDIR/general
+source $MUTTDIR/formats
+source $MUTTDIR/keybindings
+source $MUTTDIR/identity
+source $MUTTDIR/password
+source $MUTTDIR/colors
+source $WORKDIR/Mutt.txt
+## end of Jaro Mail generated muttrc
+####################################
+
+EOF
+
+ # making sure we have the minimum mailcap necessary
+wwwtext=w3m
+{ which lynx > /dev/null } && { wwwtext=lynx }
+{ which elinks > /dev/null } && { wwwtext=elinks }
+cat <<EOF > $MUTTDIR/mailcap
+text/html; ${wwwtext} -dump %s; nametemplate=%s.html; copiousoutput
+application/*; a=$WORKDIR/tmp/attach-$RANDOM$RANDOM && cp %s \$a && jaro open \$a
+text/plain; iconv -f iso-8859-1 -t utf-8; test=charset=%{charset} \
+ && test x`echo \"$charset\" | tr a-z A-Z` = xISO-8859-1; copiousoutput
+text/plain; cat %s
+EOF
+
+ # this one is empty and sources files in temp when necessary
+ touch $MUTTDIR/password
+
+ # just the header, will be completed later in procmail loop
+ rm -f $MUTTDIR/mboxes
+ echo -n "mailboxes +priv" > $MUTTDIR/mboxes
+
+ # update identity with default
+ read_account imap
+
+ switch_identity
+
+ ##########
+ # PROCMAIL
+ act "generating procmail filters"
+ ${=mkdir} $PROCMAILDIR
+ rm -f $PROCMAILDIR/rc
+ touch $PROCMAILDIR/rc
+ cat<<EOF >> $PROCMAILDIR/rc
+# procmail configuration file generated by Jaro Mail
+MAILDIR=$MAILDIRS
+JARO=$WORKDIR/bin/jaro
+DEFAULT=unsorted/
+VERBOSE=off
+LOGFILE=$WORKDIR/log/procmail.log
+SHELL = /bin/sh # VERY IMPORTANT
+UMASK = 007 # James Bond :-)
+LINEBUF = 8192 # avoid procmail choke
+
+# Using Procmail Module Library http://sf.net/projects/pm-lib
+PMSRC = $PROCMAILDIR
+# Load the central initial startup code.
+INCLUDERC = \$PMSRC/pm-javar.rc
+PF_DEST = "" # clear these vars
+PF_FROM = ""
+PF_RECURSE = yes
+
+# blacklist filters
+:0 w:
+* ? \$JARO -l blacklist -q query from:
+zz.blacklist/
+
+# filters generated from Filters.txt
+:0
+* ? test \$PMSRC/pf-chkto.rc
+{
+EOF
+
+ #######
+ echo "# filters generated from Filters.txt" >> $PROCMAILDIR/rc
+
+ for f in `cat $WORKDIR/Filters.txt | awk '/^#/ {next} /^./ { print $1 ";" $2 ";" $3 ";" $4 }'`; do
+ header="${f[(ws:;:)1]}"
+ address="${f[(ws:;:)2]}"
+ action="${f[(ws:;:)3]}"
+ destination="${f[(ws:;:)4]}"
+ case $header in
+ to)
+ print "ADDR=${address}\tDEST=${destination}/\tINCLUDERC=\$PMSRC/pf-chkto.rc" \
+ >> $PROCMAILDIR/rc
+ func "messages to <${address}> in folder: ${destination}"
+ maildirmake $MAILDIRS/$destination
+ ;;
+ from)
+ print "ADDR=${address}\tDEST=${destination}/\tINCLUDERC=\$PMSRC/pf-check.rc" \
+ >> $PROCMAILDIR/rc
+ func "messages from <${address}> in folder: {$destination}"
+ maildirmake $MAILDIRS/$destination
+ ;;
+ *)
+ error "unsupported filter: $header (skipped)"
+ ;;
+ esac
+ # MUTT (generate mailboxes priority this parser)
+ echo " \\" >> $MUTTDIR/mboxes
+ echo -n " +${destination} " >> $MUTTDIR/mboxes
+ done
+
+ # if the sender is known (ldbd recognizes it) then put mail in high priority 'known'
+ cat <<EOF >> $PROCMAILDIR/rc
+}
+
+:0
+* PF_DEST ?? .
+* ? test \$PMSRC/pf-save.rc
+{ INCLUDERC=\$PMSRC/pf-save.rc }
+
+
+# whitelisting filters
+:0 w:
+* ? \$JARO -l whitelist -q query from:
+known/
+
+
+EOF
+
+ #######
+cat <<EOF >> $PROCMAILDIR/rc
+# filters generated from Accounts
+:0
+* ? test \$PMSRC/pf-chkto.rc
+{
+EOF
+ for f in `cat $WORKDIR/Accounts/* | awk '/^email/ { print $2 }'`; do
+ echo "ADDR=${f}\tDEST=priv/\tINCLUDERC=\$PMSRC/pf-chkto.rc" >> $PROCMAILDIR/rc
+ func "private account: <${f}>"
+ done
+
+ cat <<EOF >> $PROCMAILDIR/rc
+}
+
+:0
+* PF_DEST ?? .
+* ? test \$PMSRC/pf-save.rc
+{ INCLUDERC=\$PMSRC/pf-save.rc }
+
+# if its an unknown mailinglist, save it into ml.unsorted
+:0
+* ^(List-Id|X-(Mailing-)?List):
+ml.unsorted/
+
+EOF
+
+ # MUTT (generate mailboxes priority this parser)
+ echo " \\" >> $MUTTDIR/mboxes
+ echo " +ml.unsorted +unsorted" >> $MUTTDIR/mboxes
+
+ uniq $MUTTDIR/mboxes > $TMPDIR/mboxes
+ mv $TMPDIR/mboxes $MUTTDIR/mboxes
+ rm -f $TMPDIR/mboxes
+
+ # conclude
+ cat <<EOF >> $PROCMAILDIR/rc
+
+# if got here, go to unsorted
+:0:
+\$DEFAULT
+
+#
+# End of generated procmail rc
+#
+EOF
+ return 0
+} # end of update()
+
diff --git a/src/zlibs/password b/src/zlibs/password
@@ -1,166 +0,0 @@
-#!/usr/bin/env zsh
-#
-# Jaro Mail, your humble and faithful electronic postman
-#
-# a tool to easily and privately handle your e-mail communication
-#
-# Copyleft (C) 2010-2012 Denis Roio <jaromil@dyne.org>
-#
-# This source code is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Public License as published by
-# the Free Software Foundation; either version 3 of the License, or
-# (at your option) any later version.
-#
-# This source code is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# Please refer to the GNU Public License for more details.
-#
-# You should have received a copy of the GNU Public License along with
-# this source code; if not, write to:
-# Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-
-
-# we use pinentry
-# comes from gpg project and is secure
-# it also conveniently uses the right toolkit
-pin_entry() {
- cat <<EOF | pinentry 2>/dev/null | awk '/^D / { sub(/^D /, ""); print }'
-OPTION ttyname=$TTY
-OPTION lc-ctype=$LANG
-SETTITLE Type your password
-SETDESC Type the password for $1 @ $2
-SETPROMPT Password:
-GETPIN
-EOF
-}
-
-
-# retrieve a password for user @ domain
-# put it in variable password
-# up to the caller to unset it after use
-ask_password() {
- func "Looking for password in keyring: $name"
- case $OS in
- MAC)
- security find-internet-password \
- -c JARO -a $email -s $host \
- -p $transport -P $port > /dev/null
- if [ $? != 0 ]; then # its a new password
- new_password
- { test $? != 0 } && {
- error "Password input aborted."
- return 1 }
- else
- password=`security find-internet-password -c JARO -a $email -s $host -p $transport -P $port -g 2>&1| awk '/^password:/ { print $2 }' | sed -e 's/"//g'`
- fi
- return 0
- ;;
- #####################################
- GNU)
- func "Looking for password in keyring: $name"
- ###################
- # USE GNOME KEYRING
- { test $GNOMEKEY = 1 } && {
- echo "protocol=${type}\npath=jaromail/${email}\nusername=${login}\nhost=${host}\n\n" \
- | $WORKDIR/bin/jaro-gnome-keyring check
- if [ $? != 0 ]; then # its a new password
- new_password
- { test $? != 0 } && {
- error "Password input aborted."
- return 1 }
- else # password found into gnome keyring
- act "Using saved password for $1 @ $2"
- password=`echo "protocol=${type}\npath=jaromail/${email}\nusername=${login}\nhost=${host}\n\n" | $WORKDIR/bin/jaro-gnome-keyring get`
- fi
- return 0
- }
- ####################
- # USE PINENTRY ALONE
- new_password
- { test $? != 0 } && {
- error "Password input aborted."
- return 1 }
- return 0
- ;;
- *)
- error "Unknown system, can't figure out how to handle passwords"
- return 1
- esac
-}
-
-new_password() {
- notice "Setting a new password for $name"
- password=`pin_entry $login $host`
- res=0
- case $OS in
- MAC)
- if [ "$password" != "" ]; then
- security add-internet-password \
- -c JARO -a $email -s $host \
- -p $transport -P $port -w "${password}"
- if [ $? != 0 ]; then
- error "Error adding password to keyring."
- else
- act "New password saved in keyring"
- fi
- return 0
- else
- security delete-internet-password \
- -c JARO -a $email -s $host \
- -p $transport -P $port > /dev/null
- res=$?; unset password
- { test $res != 0 } && {
- error "Error deleting password from keyring."
- return 1 }
- act "No new password given, old password erased."
- return 0
- fi
- ;;
- GNU)
- if [ "$password" != "" ]; then # password was written
-
- # USE GNOME KEYRING
- { test $GNOMEKEY = 1 } && {
-
- cat <<EOF | $WORKDIR/bin/jaro-gnome-keyring store
-protocol=${type}
-path=jaromail/${email}
-username=${login}
-host=${host}
-password=${password}
-EOF
- { test $? != 0 } && { error "Error saving password in Gnome keyring" }
- return 0
- }
-
- return 0
-
- else # password is blank or aborted
-
- # USE GNOME KEYRING
- { test $GNOMEKEY = 1 } && {
-
- cat <<EOF | $WORKDIR/bin/jaro-gnome-keyring erase
-protocol=${type}
-path=jaromail/${email}
-username=${login}
-host=${host}
-EOF
- { test $? != 0 } && {
- error "Error accessing password in Gnome keyring"
- return 1 }
- act "No new password given, old password erased."
- return 0
- }
-
- return 1
-
- fi
- ;;
- *)
- error "Unknown system, can't figure out how to handle passwords"
- return 1
- esac
-}