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