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