1#!/bin/sh
2# Prints the user's email address, with confirmation from the user.
3#
4# Copyright (C) 2001-2003, 2005 Free Software Foundation, Inc.
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2, or (at your option)
9# any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software Foundation,
18# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
20# Prerequisites for using @libdir@ and @localedir@.
21prefix="@prefix@"
22exec_prefix="@exec_prefix@"
23datarootdir="@datarootdir@"
24datadir="@datadir@"
25# Set variables libdir, localedir.
26libdir="@libdir@"
27localedir="@localedir@"
28
29# Support for relocatability.
30if test "@RELOCATABLE@" = yes; then
31  orig_installdir="$libdir"/gettext # see Makefile.am's install rule
32  # Determine curr_installdir without caring for symlinked callers.
33  curr_installdir=`echo "$0" | sed -e 's,/[^/]*$,,'`
34  curr_installdir=`cd "$curr_installdir" && pwd`
35  # Compute the original/current installation prefixes by stripping the
36  # trailing directories off the original/current installation directories.
37  while true; do
38    orig_last=`echo "$orig_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
39    curr_last=`echo "$curr_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
40    if test -z "$orig_last" || test -z "$curr_last"; then
41      break
42    fi
43    if test "$orig_last" != "$curr_last"; then
44      break
45    fi
46    orig_installdir=`echo "$orig_installdir" | sed -e 's,/[^/]*$,,'`
47    curr_installdir=`echo "$curr_installdir" | sed -e 's,/[^/]*$,,'`
48  done
49  # Now relocate the directory variables that we use.
50  libdir=`echo "$libdir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
51  localedir=`echo "$localedir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
52fi
53
54# Internationalization.
55. gettext.sh
56TEXTDOMAIN=gettext-tools
57export TEXTDOMAIN
58TEXTDOMAINDIR="$localedir"
59export TEXTDOMAINDIR
60
61# Redirect fileno 3 to interactive I/O.
62exec 3>/dev/tty
63
64# Output a prompt.
65if test $# != 0; then
66  echo "$1" 1>&3
67fi
68
69# Find the user name on the local machine.
70user=`id -u -n 2>/dev/null`
71if test -z "$user"; then
72  user="$USER"
73  if test -z "$user"; then
74    user="$LOGNAME"
75    if test -z "$user"; then
76      user=unknown
77    fi
78  fi
79fi
80
81# Find the hostname.
82# hostname on some systems (SVR3.2, old Linux) returns a bogus exit status,
83# so uname gets run too, so we keep only the first line of output.
84#host=`(hostname || uname -n) 2>/dev/null | sed 1q`
85host=`"$libdir"/gettext/hostname --short 2>/dev/null | sed 1q`
86
87# Find the hostname.
88hostfqdn=`"$libdir"/gettext/hostname --fqdn 2>/dev/null | sed 1q`
89
90# Find a list of email addresses from various mailer configuration files.
91# All mailers use configuration files under $HOME. We handle them in a
92# last-modified - first-priority order.
93cd $HOME
94files=""
95
96# ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------
97
98# Mozilla Thunderbird addresses
99files="$files .thunderbird/*/prefs.js"
100
101# Mozilla addresses
102files="$files .mozilla/*/prefs.js"
103
104# Netscape 4 addresses
105files="$files .netscape/liprefs.js .netscape/preferences.js"
106
107# Netscape 3 addresses
108files="$files .netscape/preferences"
109
110# Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
111# XEmacs mew addresses
112files="$files .emacs .emacs.el"
113
114# KDE2 addresses
115files="$files .kde2/share/config/emaildefaults"
116
117# KDE kmail addresses
118files="$files .kde2/share/config/kmailrc"
119
120# GNOME evolution 2 addresses
121files="$files .gconf/apps/evolution/mail/%gconf.xml"
122
123# GNOME evolution 1 addresses
124files="$files evolution/config.xmldb"
125
126# GNOME balsa addresses
127files="$files .gnome/balsa"
128
129# StarOffice and OpenOffice addresses
130sed_dos2unix='s/\r$//'
131sed_soffice51='s,StarOffice 5\.1=\(.*\)$,\1/sofficerc,p'
132sed_soffice52='s,StarOffice 5\.2=\(.*\)$,\1/user/sofficerc,p'
133sed_ooffice='s,^OpenOffice[^=]*=\(.*\)$,\1/user/config/registry/instance/org/openoffice/UserProfile.xml,p'
134files="$files Office51/sofficerc Office52/user/sofficerc "`sed -n -e "$sed_dos2unix" -e "$sed_soffice51" -e "$sed_soffice52" -e "$sed_ooffice" .sversionrc 2>/dev/null | sed -e 's,^file://*,/,'`
135
136# mutt addresses
137files="$files .muttrc"
138
139# pine addresses
140files="$files .pinerc"
141
142# xfmail addresses
143files="$files .xfmail/.xfmailrc"
144
145# tkrat addresses
146files="$files .ratatosk/ratatoskrc"
147
148# ----------------------- END MAILER SPECIFIC CODE -----------------------
149
150# Expand wildcards and remove nonexistent files from the list.
151nfiles=""
152for file in $files; do
153  if test -r "$file" && test ! -d "$file"; then
154    nfiles="$nfiles $file"
155  fi
156done
157files="$nfiles"
158
159addresses=""
160
161if test -n "$files"; then
162
163  for file in `ls -t $files`; do
164
165    case "$file" in
166
167# ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------
168
169      # Mozilla and Mozilla Thunderbird addresses
170      .mozilla/*/prefs.js | .thunderbird/*/prefs.js)
171        addresses="$addresses "`grep -h '^user_pref("mail\.identity\..*\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\..*\.useremail", "\(.*\)");$/\1/'`
172        ;;
173
174      # Netscape 4 addresses
175      .netscape/liprefs.js | .netscape/preferences.js)
176        addresses="$addresses "`grep -h '^user_pref("mail\.identity\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\.useremail", "\(.*\)");$/\1/'`
177        ;;
178
179      # Netscape 3 addresses
180      .netscape/preferences)
181        addresses="$addresses "`grep -h '^EMAIL_ADDRESS:' $file 2>/dev/null | sed -e 's/^EMAIL_ADDRESS:[ 	]*//'`
182        ;;
183
184      .emacs | .emacs.el)
185        # Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
186        addresses="$addresses "`grep -h '[ (]user-mail-address "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]user-mail-address "\([^"]*\)".*$/\1/'`
187        # XEmacs mew addresses
188        domains=`grep -h '[ (]mew-mail-domain "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]mew-mail-domain "\([^"]*\)".*$/\1/'`
189        if test -n "$domains"; then
190          for domain in $domains; do
191            addresses="$addresses ${user}@$domain"
192          done
193        fi
194        ;;
195
196      # KDE2 addresses
197      .kde2/share/config/emaildefaults)
198        addresses="$addresses "`grep -h '^EmailAddress=' $file 2>/dev/null | sed -e 's/^EmailAddress=//'`
199        ;;
200
201      # KDE kmail addresses
202      .kde2/share/config/kmailrc)
203        addresses="$addresses "`grep -h '^Email Address=' $file 2>/dev/null | sed -e 's/^Email Address=//'`
204        ;;
205
206      # GNOME evolution 2 addresses
207      .gconf/apps/evolution/mail/%gconf.xml)
208        sedexpr0='s,^.*<addr-spec>\(.*\)</addr-spec>.*$,\1,p'
209        addresses="$addresses "`sed -n -e "$sedexpr0" < $file`
210        ;;
211
212      # GNOME evolution 1 addresses
213      evolution/config.xmldb)
214        sedexpr0='s/^.*<entry name="identity_address_[0-9]*" type="string" value="\([^"]*\)".*$/\1/p'
215        sedexpr1='s/\(..\)/\\x\1/g'
216        sedexpr2='s,$,\\n,'
217        addresses="$addresses "`sed -n -e "$sedexpr0" < $file | while read hexstring; do printf \`echo "$hexstring" | sed -e "$sedexpr1" -e "$sedexpr2"\`; done`
218        ;;
219
220      # GNOME balsa addresses
221      .gnome/balsa)
222        addresses="$addresses "`grep -h '^Address=' $file 2>/dev/null | sed -e 's/^Address=//'`
223        ;;
224
225      # OpenOffice addresses
226      */UserProfile.xml)
227        addresses="$addresses "`sed -n -e 's,^.*<mail cfg:type="string">\(.*\)</mail>.*$,\1,p' $file 2>/dev/null`
228        ;;
229
230      # StarOffice addresses
231      # Not a typo. They really write "Adress" with a single d.
232      # German orthography...
233      */sofficerc)
234        addresses="$addresses "`grep -h '^User-Adress=' $file 2>/dev/null | sed -e 's/#[^#]*$//' -e 's/^.*#//'`
235        ;;
236
237      # mutt addresses
238      .muttrc)
239        mutt_addresses=`grep -h '^set from="[^"]*"[ 	]*$' $file 2>/dev/null | sed -e 's/^set from="\([^"]*\)"[ 	]*$/\1/'`
240        if test -n "$mutt_addresses"; then
241          addresses="$addresses $mutt_addresses"
242        else
243          # mutt uses $EMAIL as fallback.
244          if test -n "$EMAIL"; then
245            addresses="$addresses $EMAIL"
246          fi
247        fi
248        ;;
249
250      # pine addresses
251      .pinerc)
252        domains=`grep -h '^user-domain=' $file 2>/dev/null | sed -e 's/^user-domain=//'`
253        if test -n "$domains"; then
254          for domain in $domains; do
255            addresses="$addresses ${user}@$domain"
256          done
257        else
258          # The use-only-domain-name option is only used if the user-domain option is not present.
259          domains=`grep -h '^use-only-domain-name=' $file 2>/dev/null | sed -e 's/^use-only-domain-name=//'`
260          if test "Yes" = "$domains"; then
261            addresses="$addresses ${user}@"`echo "$hostfqdn" | sed -e 's/^[^.]*\.//'`
262          fi
263        fi
264        ;;
265
266      # xfmail addresses
267      .xfmail/.xfmailrc)
268        addresses="$addresses "`grep -h '^from=.*<.*>' $file 2>/dev/null | sed -e 's/^.*<\([^<>]*\)>.*$/\1/'`
269        ;;
270
271      # tkrat addresses
272      .ratatosk/ratatoskrc)
273        domains=`grep -h '^set option(masquerade_as) ' $file 2>/dev/null | sed -e 's/^set option(masquerade_as) //'`
274        if test -n "$domains"; then
275          for domain in $domains; do
276            addresses="$addresses ${user}@$domain"
277          done
278        else
279          # The domain option is used only if the masquerade_as option is not present.
280          domains=`grep -h '^set option(domain) ' $file 2>/dev/null | sed -e 's/^set option(domain) //'`
281          if test -n "$domains"; then
282            for domain in $domains; do
283              addresses="$addresses ${user}@${host}.$domain"
284            done
285          fi
286        fi
287        ;;
288
289# ----------------------- END MAILER SPECIFIC CODE -----------------------
290
291    esac
292
293  done
294
295fi
296
297# Some Debian systems have a file /etc/mailname.
298if test -r /etc/mailname; then
299  hostmailname=`cat /etc/mailname`
300  if test -n "$hostmailname"; then
301    addresses="$addresses ${user}@$hostmailname"
302  fi
303fi
304
305# SuSE Linux >= 8.0 systems have a file /etc/sysconfig/mail.
306if test -r /etc/sysconfig/mail; then
307  hostmailname=`. /etc/sysconfig/mail && echo "$FROM_HEADER"`
308  if test -n "$hostmailname"; then
309    addresses="$addresses ${user}@$hostmailname"
310  fi
311fi
312
313# elm has no user-defined addresses.
314# mailx has no user-defined addresses.
315# mh has no user-defined addresses.
316# They use the system default.
317addresses="$addresses ${user}@$hostfqdn"
318
319# Normalize addresses: remove addresses without @, lowercase the part after @,
320# and remove duplicates.
321lowercase_sed='{
322h
323s/^[^@]*@\(.*\)$/\1/
324y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
325x
326s/^\([^@]*\)@.*/\1@/
327G
328s/\
329//
330p
331}'
332naddresses=""
333for addr in $addresses; do
334  case "$addr" in
335    "<"*">") addr=`echo "$addr" | sed -e 's/^<//' -e 's/>$//'` ;;
336  esac
337  case "$addr" in
338    *@*)
339      addr=`echo "$addr" | sed -n -e "$lowercase_sed"`
340      case " $naddresses " in
341        *" $addr "*) ;;
342        *) naddresses="$naddresses $addr" ;;
343      esac
344      ;;
345  esac
346done
347addresses="$naddresses"
348
349# Now it's time to ask the user.
350case "$addresses" in
351  " "*" "*)
352    # At least two addresses.
353    lines=""
354    i=0
355    for addr in $addresses; do
356      i=`expr $i + 1`
357      lines="${lines}${i} ${addr}
358"
359    done
360    while true; do
361      { gettext "Which is your email address?"; echo; } 1>&3
362      echo "$lines" 1>&3
363      { gettext "Please choose the number, or enter your email address."; echo; } 1>&3
364      read answer < /dev/tty
365      case "$answer" in
366        *@*) ;;
367        [0-9]*)
368          i=0
369          for addr in $addresses; do
370            i=`expr $i + 1`
371            if test "$i" = "$answer"; then
372              break 2
373            fi
374          done
375          ;;
376      esac
377      case "$answer" in
378        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
379      esac
380      case "$answer" in
381        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
382        *@*.*) ;;
383        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
384        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
385      esac
386      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
387      break
388    done
389    ;;
390  " "*)
391    # One address.
392    while true; do
393      { gettext "Is the following your email address?"; echo; } 1>&3
394      echo " $addresses" 1>&3
395      { gettext "Please confirm by pressing Return, or enter your email address."; echo; } 1>&3
396      read answer < /dev/tty
397      if test -z "$answer"; then
398        addr=`echo "$addresses" | sed -e 's/^ //'`
399        break
400      fi
401      case "$answer" in
402        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
403      esac
404      case "$answer" in
405        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
406        *@*.*) ;;
407        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
408        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
409      esac
410      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
411      break
412    done
413    ;;
414  "")
415    # No address.
416    { gettext "Couldn't find out about your email address."; echo; } 1>&3
417    while true; do
418      { gettext "Please enter your email address."; echo; } 1>&3
419      read answer < /dev/tty
420      case "$answer" in
421        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
422      esac
423      case "$answer" in
424        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
425        *@*.*) ;;
426        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
427        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
428      esac
429      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
430      break
431    done
432    ;;
433  *) echo "internal error" 1>&3 ; exit 1 ;;
434esac
435
436# Print to standard output.
437echo "$addr"
438