%define name elm %define versionbase 2.4 %define versiontag ME+ %define minor 108 %define release 1 %define ver_full %{versionbase}%{versiontag}%{minor} %define fix_prefix /usr/local Summary: ELM mail client version %{versionbase}%{versiontag} PL%{minor} Name: %{name} Version: %{ver_full} Release: %{release} Source0: http://www.ozone.fmi.fi/KEH/%{name}-%{ver_full}.tar.gz License: The Elm(tm) Mail System General Public License Group: Applications/Communications BuildRoot: %{_tmppath}/%{name}-buildroot Docdir: %{fix_prefix}/doc AutoReqProv: no %description Elm %{versionbase}%{versiontag} is based on Elm 2.4. It contains enhanced MIME and character set support. It can read mail from POP or IMAP folders and can pass mail to the PGP or GPG programs. %prep %setup -n %{name}%{versionbase}.%{versiontag}.%{minor} # Temporary patch --- elmregister was not fixing protections on replay phase patch -N utils/elmregister.c <<'__EOF__' Index: utils/elmregister.c =================================================================== RCS file: /data/cvsroot/mail/elmme+/utils/elmregister.c,v retrieving revision 1.9 retrieving revision 1.12 diff -u -r1.9 -r1.12 --- elmregister.c 2003/05/26 15:19:04 1.9 +++ elmregister.c 2003/10/19 10:46:40 1.12 @@ -1,7 +1,7 @@ -static char rcsid[] = "@(#)$Id: elmregister.c,v 1.9 2003/05/26 15:19:04 hurtta Exp $"; +static char rcsid[] = "@(#)$Id: elmregister.c,v 1.12 2003/10/19 10:46:40 hurtta Exp $"; /****************************************************************************** - * The Elm (ME+) Mail System - $Revision: 1.9 $ $State: Exp $ + * The Elm (ME+) Mail System - $Revision: 1.12 $ $State: Exp $ * * Author: Kari Hurtta *****************************************************************************/ @@ -1009,7 +1009,7 @@ #ifdef S_ISDIR ! S_ISDIR(X.st_mode) #else - S_IFDIR != (buf.st_mode & S_IFMT) + S_IFDIR != (X.st_mode & S_IFMT) #endif ) { fprintf(stderr,"%s: -R %s invalid (not a directory)\n", @@ -2453,7 +2453,7 @@ if (ptr->group_ptr && 0 != strcmp(ptr->group_ptr,"-")) { g = getgrnam(ptr->group_ptr); - if (!p) + if (!g) fprintf(stderr, "%s: [pick_one] '%c' Group %s not found\n", program_name,ptr->command_letter, @@ -3387,6 +3387,168 @@ } } + /* Fixing permissions */ + for (ptr = entry->log; + ptr < entry->log + entry->log_count; + ptr++) { + + switch (ptr->command_letter) { + char *X; + struct passwd * p; + struct group * g; + struct stat X1; + int mode; + uid_t user; + gid_t group; + + + case 'M': + case 'F': + case 'C': + + p = NULL; + g = NULL; + mode = -1; + user = (uid_t)-1; + group = (gid_t)-1; + + if (!ptr->arg_ptrs || !ptr->arg_ptrs[0]) { + + fprintf(stderr, + "%s: [replay_list] '%c' no arg 0 \n", + program_name,ptr->command_letter); + exit(1); /* FAILURE */ + } + X = make_rooted(ptr,ptr->arg_ptrs[0],"/"); + + if (ptr->user_ptr && 0 != strcmp(ptr->user_ptr,"-")) { + p = getpwnam(ptr->user_ptr); + + if (!p) + fprintf(stderr, + "%s: [replay_list] '%c' User %s not found\n", + program_name,ptr->command_letter, + ptr->user_ptr); + else { + user = p->pw_uid; + group = p->pw_gid; + } + } + + if (ptr->group_ptr && 0 != strcmp(ptr->group_ptr,"-")) { + g = getgrnam(ptr->group_ptr); + + if (!g) + fprintf(stderr, + "%s: [replay_list] '%c' Group %s not found\n", + program_name,ptr->command_letter, + ptr->group_ptr); + else + group = g->gr_gid; + + } + + if (ptr->mode_ptr && 0 != strcmp(ptr->mode_ptr,"-") && + 0 != strcmp(ptr->mode_ptr,"0")) { + char * x; + mode = strtol(ptr->mode_ptr,&x,8); + + if (*x || 0 == mode) + mode = -1; + } + + if (stat(X,&X1) < 0) { + fprintf(stderr, + "%s: (note) %s : %s not accessible\n", + program_name, + ptr->arg_ptrs[0],X); + + Exit_status = 1; /* FAILURE */ + + goto failure1; + } + + + if ( +#ifdef S_ISDIR + S_ISDIR(X1.st_mode) +#else + S_IFDIR == (X1.st_mode & S_IFMT) +#endif + ) { + + if (ptr->command_letter != 'M') { + fprintf(stderr, + "%s: (note) %s : %s is directory when should not\n", + program_name, + ptr->arg_ptrs[0],X); + + Exit_status = 1; /* FAILURE */ + + goto failure1; + } + + } else { + if (ptr->command_letter == 'M') { + fprintf(stderr, + "%s: (note) %s : %s is not a directory\n", + program_name, + ptr->arg_ptrs[0],X); + + Exit_status = 1; /* FAILURE */ + goto failure1; + } + } + + if (user != (uid_t)-1 || group != (gid_t)-1) { + if (X1.st_uid != user || X1.st_gid != group) { + if (-1 == chown(X,user,group)) { + fprintf(stderr,"%s: Failed to set owner/group of %s\n", + program_name,X); + Exit_status = 1; /* FAILURE */ + goto failure1; + } + } else { + fprintf(stderr,"%s: Fixed owner/group of %s\n", + program_name,X); + } + + /* Recheck mode */ + if (stat(X,&X1) < 0) { + fprintf(stderr, + "%s: (note) %s : %s not accessible\n", + program_name, + ptr->arg_ptrs[0],X); + + Exit_status = 1; /* FAILURE */ + + goto failure1; + } + } + + if (mode > 0) { + + if ((X1.st_mode & 0777) != mode) { + if (-1 == chmod(X,mode)) { + fprintf(stderr,"%s: Failed to set mode of %s\n", + program_name,X); + Exit_status = 1; /* FAILURE */ + } else { + fprintf(stderr,"%s: Mode of %s fixed\n", + program_name,X); + } + } + + } + + failure1: + free(X); X = 0; + break; + default: + break; + } + } + return Exit_status; } @@ -3568,7 +3730,7 @@ last = & LI_source.entries[LI_source.entries_count-1]; } - /* EXECUTE commands */ + /* EXECUTE commands and fix permissions */ r = replay_list(&LI_source.entries[LI_source.entries_count-1], &LI_source,target,last); __EOF__ %build cat >config.rpm <$RPM_BUILD_ROOT%{fix_prefix}/lib/elm.filelist.rpm") || die "Oops 2"; while () { chomp; @a=split(/\0/); if (\$a[4] !~ m!^/!) { \$a[4] = '/' . \$a[4] } if ('M' eq \$a[0]) { print Y "%dir \$a[4]\\n"; } if ('F' eq \$a[0]) { if (\$a[4] =~ m!/man/! ) { print Y "%doc \$a[4]\\n"; } else { print Y "\$a[4]\\n"; } } if ('s' eq \$a[0]) { print Y "\$a[4]\\n"; } if (\$a[0] =~ /^{/ ) { print Y "\$a[4]\\n" if -f "$RPM_BUILD_ROOT/\$a[4]"; } if ('C' eq \$a[0]) { print Y "%config \$a[4]\\n"; } } close(X) || die "Oops 3"; close(Y) || die "Oops 4"; exit 0; EOM sort $RPM_BUILD_ROOT%{fix_prefix}/lib/elm.filelist.rpm | uniq > XXtmp cp XXtmp $RPM_BUILD_ROOT%{fix_prefix}/lib/elm.filelist.rpm XX=$RPM_BUILD_ROOT%{_docdir}/%{name}-%{ver_full} # We can not let %doc macro to install dogumentation # because it install all to one level and clears directory # beginning mkdir -p $XX install -m 644 README.ME+ $XX/README.ME+ install -m 644 ANNOUNCE.ME $XX/ANNOUNCE.ME install -m 644 ChangeLog.ME $XX/ChangeLog.ME install -m 644 Changes $XX/Changes install -m 644 Configure $XX/Configure install -m 644 Instruct $XX/Instruct install -m 644 MANIFEST $XX/MANIFEST install -m 644 NOTICE $XX/NOTICE install -m 644 Overview $XX/Overview install -m 644 Patchlist $XX/Patchlist install -m 644 README $XX/README mkdir -p $XX/doc install -m 644 doc/Alias.guide $XX/doc/Alias.guide install -m 644 doc/Config.guid $XX/doc/Config.guid install -m 644 doc/Form.guide $XX/doc/Form.guide install -m 644 doc/Ref.guide $XX/doc/Ref.guide install -m 644 doc/Users.guide $XX/doc/Users.guide install -m 644 doc/Users.guide $XX/doc/elmrc.samp install -m 644 doc/mime.types $XX/doc/mime.types install -m 644 doc/terminal.info $XX/doc/terminal.info mkdir -p $XX/shared_libs/tls install -m 644 shared_libs/tls/README.ME+ $XX/shared_libs/tls/README.ME+ mkdir -p $XX/shared_libs/iconv install -m 644 shared_libs/iconv/README.ME+ $XX/shared_libs/iconv/README.ME+ mkdir -p $XX/shared_libs/smtp install -m 644 shared_libs/smtp/README.ME+ $XX/shared_libs/smtp/README.ME+ %clean if [ "$RPM_BUILD_ROOT" != "/" ] ; then rm -rf $RPM_BUILD_ROOT fi %post # Following files created or rebuild on replay stage F=%{fix_prefix}/lib/elm.mimecharsets if [ -f $F ] ; then cp -p $F $F.rpmsave fi F=%{fix_prefix}/lib/elm.terminalinfo if [ -f $F ] ; then cp -p $F $F.rpmsave fi F=%{fix_prefix}/lib/elm.rc if [ -f $F ] ; then cp -p $F $F.rpmsave fi %{fix_prefix}/lib/elmregister replay %{fix_prefix}/lib/elmregister unstage %preun %{fix_prefix}/lib/elmregister uninstall %postun # We return these files to original places, so that # these are used when elm is re-installed F=%{fix_prefix}/lib/elm.mimecharsets if [ -f $F.rpmsave -a ! -f $F ] ; then cp -p $F.rpmsave $F fi F=%{fix_prefix}/lib/elm.terminalinfo if [ -f $F.rpmsave -a ! -f $F ] ; then cp -p $F.rpmsave $F fi F=%{fix_prefix}/lib/elm.rc if [ -f $F.rpmsave -a ! -f $F ] ; then cp -p $F.rpmsave $F fi %files -f %{buildroot}%{fix_prefix}/lib/elm.filelist.rpm %defattr(-,root,root) %{fix_prefix}/lib/elm.filelist %dir %{_docdir}/%{name}-%{ver_full} %doc %{_docdir}/%{name}-%{ver_full}/README.ME+ %doc %{_docdir}/%{name}-%{ver_full}/ANNOUNCE.ME %doc %{_docdir}/%{name}-%{ver_full}/ChangeLog.ME %doc %{_docdir}/%{name}-%{ver_full}/Changes %doc %{_docdir}/%{name}-%{ver_full}/Configure %doc %{_docdir}/%{name}-%{ver_full}/Instruct %doc %{_docdir}/%{name}-%{ver_full}/MANIFEST %doc %{_docdir}/%{name}-%{ver_full}/NOTICE %doc %{_docdir}/%{name}-%{ver_full}/Overview %doc %{_docdir}/%{name}-%{ver_full}/Patchlist %doc %{_docdir}/%{name}-%{ver_full}/README %dir %{_docdir}/%{name}-%{ver_full}/doc %doc %{_docdir}/%{name}-%{ver_full}/doc/Alias.guide %doc %{_docdir}/%{name}-%{ver_full}/doc/Config.guid %doc %{_docdir}/%{name}-%{ver_full}/doc/Form.guide %doc %{_docdir}/%{name}-%{ver_full}/doc/Ref.guide %doc %{_docdir}/%{name}-%{ver_full}/doc/Users.guide %doc %{_docdir}/%{name}-%{ver_full}/doc/elmrc.samp %doc %{_docdir}/%{name}-%{ver_full}/doc/mime.types %doc %{_docdir}/%{name}-%{ver_full}/doc/terminal.info %dir %{_docdir}/%{name}-%{ver_full}/shared_libs/tls %doc %{_docdir}/%{name}-%{ver_full}/shared_libs/tls/README.ME+ %dir %{_docdir}/%{name}-%{ver_full}/shared_libs/iconv %doc %{_docdir}/%{name}-%{ver_full}/shared_libs/iconv/README.ME+ %dir %{_docdir}/%{name}-%{ver_full}/shared_libs/smtp %doc %{_docdir}/%{name}-%{ver_full}//shared_libs/smtp/README.ME+ %changelog # end of file