#!/bin/sh
# Prints the user's email address, with confirmation from the user.
#
# Copyright (C) 2001-2026 Free Software Foundation, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program 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.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
#
# Written by Bruno Haible.

# Prerequisites for using ${exec_prefix}/libexec and ${datarootdir}/locale.
prefix="/usr/pkg"
exec_prefix="${prefix}"
datarootdir="${prefix}/share"
datadir="${datarootdir}"
# Set variables libexecdir, localedir.
libexecdir="${exec_prefix}/libexec"
localedir="${datarootdir}/locale"

# Support for relocatability.
if test "no" = yes; then
  orig_installdir="$libexecdir"/gettext # see Makefile.am's install rule
  # Determine curr_installdir without caring for symlinked callers.
  curr_installdir=`echo "$0" | sed -e 's,/[^/]*$,,'`
  curr_installdir=`cd "$curr_installdir" && pwd`
  # Compute the original/current installation prefixes by stripping the
  # trailing directories off the original/current installation directories.
  while true; do
    orig_last=`echo "$orig_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
    curr_last=`echo "$curr_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
    if test -z "$orig_last" || test -z "$curr_last"; then
      break
    fi
    if test "$orig_last" != "$curr_last"; then
      break
    fi
    orig_installdir=`echo "$orig_installdir" | sed -e 's,/[^/]*$,,'`
    curr_installdir=`echo "$curr_installdir" | sed -e 's,/[^/]*$,,'`
  done
  # Now relocate the directory variables that we use.
  libexecdir=`echo "$libexecdir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
  localedir=`echo "$localedir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
fi

# Internationalization.
. gettext.sh
TEXTDOMAIN=gettext-tools
export TEXTDOMAIN
TEXTDOMAINDIR="$localedir"
export TEXTDOMAINDIR

# Redirect fileno 3 to interactive I/O.
exec 3>/dev/tty

# Output a prompt.
if test $# != 0; then
  echo "$1" 1>&3
fi

# Find the user name on the local machine.
user=`id -u -n 2>/dev/null`
if test -z "$user"; then
  user="$USER"
  if test -z "$user"; then
    user="$LOGNAME"
    if test -z "$user"; then
      user=unknown
    fi
  fi
fi

# Find the hostname.
# hostname on some systems (SVR3.2, old Linux) returns a bogus exit status,
# so uname gets run too, so we keep only the first line of output.
#host=`(hostname || uname -n) 2>/dev/null | sed 1q`
host=`"$libexecdir"/gettext/hostname --short 2>/dev/null | sed 1q`

# Find the hostname.
hostfqdn=`"$libexecdir"/gettext/hostname --fqdn 2>/dev/null | sed 1q`

# Find a list of email addresses from various mailer configuration files.
# All mailers use configuration files under $HOME. We handle them in a
# last-modified - first-priority order.
cd $HOME
files=""

# ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------

# Mozilla Thunderbird addresses
files="$files .thunderbird/*/prefs.js"

# Mozilla addresses
files="$files .mozilla/*/prefs.js"

# Netscape 4 addresses
files="$files .netscape/liprefs.js .netscape/preferences.js"

# Netscape 3 addresses
files="$files .netscape/preferences"

# Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
# XEmacs mew addresses
files="$files .emacs .emacs.el"

# KDE2 addresses
files="$files .kde2/share/config/emaildefaults"

# KDE kmail addresses
files="$files .kde2/share/config/kmailrc"

# GNOME evolution 2 addresses
files="$files .gconf/apps/evolution/mail/%gconf.xml"

# GNOME evolution 1 addresses
files="$files evolution/config.xmldb"

# GNOME balsa addresses
files="$files .gnome/balsa"

# StarOffice and OpenOffice addresses
sed_dos2unix='s/\r$//'
sed_soffice51='s,StarOffice 5\.1=\(.*\)$,\1/sofficerc,p'
sed_soffice52='s,StarOffice 5\.2=\(.*\)$,\1/user/sofficerc,p'
sed_ooffice='s,^OpenOffice[^=]*=\(.*\)$,\1/user/config/registry/instance/org/openoffice/UserProfile.xml,p'
files="$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://*,/,'`

# mutt addresses
files="$files .muttrc"

# pine addresses
files="$files .pinerc"

# xfmail addresses
files="$files .xfmail/.xfmailrc"

# tkrat addresses
files="$files .ratatosk/ratatoskrc"

# ----------------------- END MAILER SPECIFIC CODE -----------------------

# Expand wildcards and remove nonexistent files from the list.
nfiles=""
for file in $files; do
  if test -r "$file" && test ! -d "$file"; then
    nfiles="$nfiles $file"
  fi
done
files="$nfiles"

addresses=""

if test -n "$files"; then

  for file in `ls -t $files`; do

    case "$file" in

# ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------

      # Mozilla and Mozilla Thunderbird addresses
      .mozilla/*/prefs.js | .thunderbird/*/prefs.js)
        addresses="$addresses "`grep -h '^user_pref("mail\.identity\..*\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\..*\.useremail", "\(.*\)");$/\1/'`
        ;;

      # Netscape 4 addresses
      .netscape/liprefs.js | .netscape/preferences.js)
        addresses="$addresses "`grep -h '^user_pref("mail\.identity\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\.useremail", "\(.*\)");$/\1/'`
        ;;

      # Netscape 3 addresses
      .netscape/preferences)
        addresses="$addresses "`grep -h '^EMAIL_ADDRESS:' $file 2>/dev/null | sed -e 's/^EMAIL_ADDRESS:[ 	]*//'`
        ;;

      .emacs | .emacs.el)
        # Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
        addresses="$addresses "`grep -h '[ (]user-mail-address "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]user-mail-address "\([^"]*\)".*$/\1/'`
        # XEmacs mew addresses
        domains=`grep -h '[ (]mew-mail-domain "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]mew-mail-domain "\([^"]*\)".*$/\1/'`
        if test -n "$domains"; then
          for domain in $domains; do
            addresses="$addresses ${user}@$domain"
          done
        fi
        ;;

      # KDE2 addresses
      .kde2/share/config/emaildefaults)
        addresses="$addresses "`grep -h '^EmailAddress=' $file 2>/dev/null | sed -e 's/^EmailAddress=//'`
        ;;

      # KDE kmail addresses
      .kde2/share/config/kmailrc)
        addresses="$addresses "`grep -h '^Email Address=' $file 2>/dev/null | sed -e 's/^Email Address=//'`
        ;;

      # GNOME evolution 2 addresses
      .gconf/apps/evolution/mail/%gconf.xml)
        sedexpr0='s,^.*&lt;addr-spec&gt;\(.*\)&lt;/addr-spec&gt;.*$,\1,p'
        addresses="$addresses "`sed -n -e "$sedexpr0" < $file`
        ;;

      # GNOME evolution 1 addresses
      evolution/config.xmldb)
        sedexpr0='s/^.*<entry name="identity_address_[0-9]*" type="string" value="\([^"]*\)".*$/\1/p'
        sedexpr1='s/\(..\)/\\x\1/g'
        sedexpr2='s,$,\\n,'
        addresses="$addresses "`sed -n -e "$sedexpr0" < $file | while read hexstring; do printf \`echo "$hexstring" | sed -e "$sedexpr1" -e "$sedexpr2"\`; done`
        ;;

      # GNOME balsa addresses
      .gnome/balsa)
        addresses="$addresses "`grep -h '^Address=' $file 2>/dev/null | sed -e 's/^Address=//'`
        ;;

      # OpenOffice addresses
      */UserProfile.xml)
        addresses="$addresses "`sed -n -e 's,^.*<mail cfg:type="string">\(.*\)</mail>.*$,\1,p' $file 2>/dev/null`
        ;;

      # StarOffice addresses
      # Not a typo. They really write "Adress" with a single d.
      # German orthography...
      */sofficerc)
        addresses="$addresses "`grep -h '^User-Adress=' $file 2>/dev/null | sed -e 's/#[^#]*$//' -e 's/^.*#//'`
        ;;

      # mutt addresses
      .muttrc)
        mutt_addresses=`grep -h '^set from="[^"]*"[ 	]*$' $file 2>/dev/null | sed -e 's/^set from="\([^"]*\)"[ 	]*$/\1/'`
        if test -n "$mutt_addresses"; then
          addresses="$addresses $mutt_addresses"
        else
          # mutt uses $EMAIL as fallback.
          if test -n "$EMAIL"; then
            addresses="$addresses $EMAIL"
          fi
        fi
        ;;

      # pine addresses
      .pinerc)
        domains=`grep -h '^user-domain=' $file 2>/dev/null | sed -e 's/^user-domain=//'`
        if test -n "$domains"; then
          for domain in $domains; do
            addresses="$addresses ${user}@$domain"
          done
        else
          # The use-only-domain-name option is only used if the user-domain option is not present.
          domains=`grep -h '^use-only-domain-name=' $file 2>/dev/null | sed -e 's/^use-only-domain-name=//'`
          if test "Yes" = "$domains"; then
            addresses="$addresses ${user}@"`echo "$hostfqdn" | sed -e 's/^[^.]*\.//'`
          fi
        fi
        ;;

      # xfmail addresses
      .xfmail/.xfmailrc)
        addresses="$addresses "`grep -h '^from=.*<.*>' $file 2>/dev/null | sed -e 's/^.*<\([^<>]*\)>.*$/\1/'`
        ;;

      # tkrat addresses
      .ratatosk/ratatoskrc)
        domains=`grep -h '^set option(masquerade_as) ' $file 2>/dev/null | sed -e 's/^set option(masquerade_as) //'`
        if test -n "$domains"; then
          for domain in $domains; do
            addresses="$addresses ${user}@$domain"
          done
        else
          # The domain option is used only if the masquerade_as option is not present.
          domains=`grep -h '^set option(domain) ' $file 2>/dev/null | sed -e 's/^set option(domain) //'`
          if test -n "$domains"; then
            for domain in $domains; do
              addresses="$addresses ${user}@${host}.$domain"
            done
          fi
        fi
        ;;

# ----------------------- END MAILER SPECIFIC CODE -----------------------

    esac

  done

fi

# Some Debian systems have a file /etc/mailname.
if test -r /etc/mailname; then
  hostmailname=`cat /etc/mailname`
  if test -n "$hostmailname"; then
    addresses="$addresses ${user}@$hostmailname"
  fi
fi

# SuSE Linux >= 8.0 systems have a file /etc/sysconfig/mail.
if test -r /etc/sysconfig/mail; then
  hostmailname=`. /etc/sysconfig/mail && echo "$FROM_HEADER"`
  if test -n "$hostmailname"; then
    addresses="$addresses ${user}@$hostmailname"
  fi
fi

# elm has no user-defined addresses.
# mailx has no user-defined addresses.
# mh has no user-defined addresses.
# They use the system default.
addresses="$addresses ${user}@$hostfqdn"

# Normalize addresses: remove addresses without @, lowercase the part after @,
# and remove duplicates.
lowercase_sed='{
h
s/^[^@]*@\(.*\)$/\1/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
x
s/^\([^@]*\)@.*/\1@/
G
s/\n//
p
}'
naddresses=""
for addr in $addresses; do
  case "$addr" in
    "<"*">") addr=`echo "$addr" | sed -e 's/^<//' -e 's/>$//'` ;;
  esac
  case "$addr" in
    *@*)
      addr=`echo "$addr" | sed -n -e "$lowercase_sed"`
      case " $naddresses " in
        *" $addr "*) ;;
        *) naddresses="$naddresses $addr" ;;
      esac
      ;;
  esac
done
addresses="$naddresses"

# Now it's time to ask the user.
case "$addresses" in
  " "*" "*)
    # At least two addresses.
    lines=""
    i=0
    for addr in $addresses; do
      i=`expr $i + 1`
      lines="${lines}${i} ${addr}
"
    done
    while true; do
      { gettext "Which is your email address?"; echo; } 1>&3
      echo "$lines" 1>&3
      { gettext "Please choose the number, or enter your email address."; echo; } 1>&3
      read answer < /dev/tty
      case "$answer" in
        *@*) ;;
        [0-9]*)
          i=0
          for addr in $addresses; do
            i=`expr $i + 1`
            if test "$i" = "$answer"; then
              break 2
            fi
          done
          ;;
      esac
      case "$answer" in
        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
      esac
      case "$answer" in
        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
        *@*.*) ;;
        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
      esac
      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
      break
    done
    ;;
  " "*)
    # One address.
    while true; do
      { gettext "Is the following your email address?"; echo; } 1>&3
      echo " $addresses" 1>&3
      { gettext "Please confirm by pressing Return, or enter your email address."; echo; } 1>&3
      read answer < /dev/tty
      if test -z "$answer"; then
        addr=`echo "$addresses" | sed -e 's/^ //'`
        break
      fi
      case "$answer" in
        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
      esac
      case "$answer" in
        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
        *@*.*) ;;
        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
      esac
      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
      break
    done
    ;;
  "")
    # No address.
    { gettext "Couldn't find out about your email address."; echo; } 1>&3
    while true; do
      { gettext "Please enter your email address."; echo; } 1>&3
      read answer < /dev/tty
      case "$answer" in
        "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
      esac
      case "$answer" in
        *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
        *@*.*) ;;
        *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
        *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
      esac
      addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
      break
    done
    ;;
  *) echo "internal error" 1>&3 ; exit 1 ;;
esac

# Print to standard output.
echo "$addr"
