summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorkyak2015-06-08 16:48:16 +0300
committerkyak2015-06-08 16:48:16 +0300
commit81ca3c8264865c96327f184d75f608614d307f8b (patch)
tree5a736f5439eeb72ecb8a21a34ebfe645c1f8fe6d
downloadaur-81ca3c8264865c96327f184d75f608614d307f8b.tar.gz
Initial import
-rw-r--r--.SRCINFO32
-rw-r--r--PKGBUILD58
-rw-r--r--topal-1.patch466
-rw-r--r--topal-2.patch45
4 files changed, 601 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..6de355578048
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,32 @@
+# Generated by makepkg 4.2.1
+# Sun Mar 29 02:18:34 UTC 2015
+pkgbase = alpine
+ pkgdesc = Apache licensed PINE mail user agent
+ pkgver = 2.20
+ pkgrel = 1
+ url = http://patches.freeiz.com/alpine/
+ arch = i686
+ arch = x86_64
+ license = APACHE
+ depends = libldap
+ depends = krb5
+ depends = gettext
+ optdepends = aspell: for spell-checking support
+ optdepends = hunspell: for spell-checking support
+ optdepends = topal: glue program that links GnuPG and alpine
+ provides = pine
+ conflicts = pine
+ conflicts = re-alpine
+ replaces = pine
+ options = !makeflags
+ source = http://patches.freeiz.com/alpine/release/src/alpine-2.20.tar.xz
+ source = http://patches.freeiz.com/alpine/patches/alpine-2.20/all.patch.gz
+ source = topal-1.patch
+ source = topal-2.patch
+ md5sums = 043b67666af73b26f9627ad97e2aaf92
+ md5sums = d2c2576b58f65566ccf1a9d5add0f14a
+ md5sums = ce47b232339b251c74dc56de73513101
+ md5sums = e53177e123ec68fc77d55f60cd9eba9f
+
+pkgname = alpine
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..06cf513759cd
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,58 @@
+# -*- shell-script -*-
+#
+# Contributor: Adrian C. <anrxc..sysphere.org>
+
+pkgname=alpine
+pkgver=2.20
+pkgrel=1
+arch=("i686" "x86_64")
+pkgdesc="Apache licensed PINE mail user agent"
+url="http://patches.freeiz.com/alpine/"
+license=("APACHE")
+depends=("libldap" "krb5" "gettext")
+optdepends=("aspell: for spell-checking support"
+ "hunspell: for spell-checking support"
+ "topal: glue program that links GnuPG and alpine")
+provides=("pine")
+conflicts=("pine" "re-alpine")
+replaces=("pine")
+options=("!makeflags")
+source=(http://patches.freeiz.com/${pkgname}/release/src/${pkgname}-${pkgver}.tar.xz
+ #ftp://ftp.cac.washington.edu/${pkgname}/${pkgname}.tar.bz2
+ http://patches.freeiz.com/${pkgname}/patches/${pkgname}-${pkgver}/all.patch.gz
+ topal-1.patch
+ topal-2.patch)
+md5sums=("043b67666af73b26f9627ad97e2aaf92"
+ "d2c2576b58f65566ccf1a9d5add0f14a"
+ "ce47b232339b251c74dc56de73513101"
+ "e53177e123ec68fc77d55f60cd9eba9f")
+
+
+build() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+
+# User compile time patches
+# - Eduardo Chappa patches
+ patch -p1 < ../all.patch
+# - Phil Brooke patches (optional topal support)
+ #patch -p1 < ../topal-1.patch
+ #patch -p1 < ../topal-2.patch
+
+
+# Configure Alpine
+ LIBS+="-lpam -lkrb5 -lcrypto" ./configure --prefix=/usr \
+ --without-passfile --without-tcl --disable-shared \
+ --with-system-pinerc=/etc/${pkgname}.d/pine.conf \
+ --with-system-fixed-pinerc=/etc/${pkgname}.d/pine.conf.fixed
+
+# Build Alpine
+ make
+}
+
+
+package() {
+ cd "${srcdir}/${pkgname}-${pkgver}"
+
+# Install Alpine
+ make DESTDIR="${pkgdir}" install
+}
diff --git a/topal-1.patch b/topal-1.patch
new file mode 100644
index 000000000000..4c83b33f1db6
--- /dev/null
+++ b/topal-1.patch
@@ -0,0 +1,466 @@
+diff -cr alpine-2.00.orig/alpine/send.c alpine-2.00.new/alpine/send.c
+*** alpine-2.00.orig/alpine/send.c 2008-06-30 23:03:35.000000000 +0100
+--- alpine-2.00.new/alpine/send.c 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 4039,4044 ****
+--- 4039,4061 ----
+ pbf = save_previous_pbuf;
+ g_rolenick = NULL;
+
++ /* Topal: Unmangle the body types. */
++ if ((*body)->type == TYPEMULTIPART
++ && (*body)->topal_hack == 1) {
++ /* This was a single part message which Topal mangled. */
++ dprint((9, "Topal: unmangling single part message\n"));
++ (*body)->type = TYPETEXT;
++ }
++ if ((*body)->type == TYPEMULTIPART
++ && (*body)->topal_hack != 1
++ && (*body)->nested.part->body.type == TYPEMULTIPART
++ && (*body)->nested.part->body.topal_hack == 1) {
++ /* Topal mangled a multipart message. So the first nested part
++ is really TYPETEXT. */
++ dprint((9, "Topal: unmangling first part of multipart message\n"));
++ (*body)->nested.part->body.type = TYPETEXT;
++ }
++
+ dprint((4, "=== send returning ===\n"));
+ }
+
+***************
+*** 5365,5386 ****
+
+ rfc822_parse_content_header(nb,
+ (char *) ucase((unsigned char *) buf+8),s);
+ if(nb->type == TYPETEXT
+ && nb->subtype
+ && (!b->subtype
+ || strucmp(b->subtype, nb->subtype))){
+! if(b->subtype)
+! fs_give((void **) &b->subtype);
+!
+ b->subtype = nb->subtype;
+ nb->subtype = NULL;
+!
+ mail_free_body_parameter(&b->parameter);
+ b->parameter = nb->parameter;
+ nb->parameter = NULL;
+ mail_free_body_parameter(&nb->parameter);
+ }
+!
+ mail_free_body(&nb);
+ }
+
+--- 5382,5431 ----
+
+ rfc822_parse_content_header(nb,
+ (char *) ucase((unsigned char *) buf+8),s);
++ /* Topal: We're working on the first
++ text segment of the message. If
++ the filter returns something that
++ isn't TYPETEXT, then we need to
++ pretend (later on) that this is in
++ fact a TYPETEXT, because Topal has
++ already encoded it....
++
++ Original code path first, then an
++ alternate path.
++ */
+ if(nb->type == TYPETEXT
+ && nb->subtype
+ && (!b->subtype
+ || strucmp(b->subtype, nb->subtype))){
+! if(b->subtype)
+! fs_give((void **) &b->subtype);
+!
+! b->subtype = nb->subtype;
+! nb->subtype = NULL;
+!
+! mail_free_body_parameter(&b->parameter);
+! b->parameter = nb->parameter;
+! nb->parameter = NULL;
+! mail_free_body_parameter(&nb->parameter);
+! }
+! else if(F_ON(F_ENABLE_TOPAL_HACK, ps_global)){
+! /* Perhaps the type isn't TYPETEXT,
+! and the hack is requested. So,
+! let's mess with the types. */
+! if(nb->type != TYPETEXT){
+! b->type = nb->type;
+ b->subtype = nb->subtype;
+ nb->subtype = NULL;
+!
+! dprint((9, "Topal: mangling body!\n"));
+ mail_free_body_parameter(&b->parameter);
+ b->parameter = nb->parameter;
+ nb->parameter = NULL;
+ mail_free_body_parameter(&nb->parameter);
++ b->topal_hack = 1;
++ }
+ }
+! /* Topal: end */
+ mail_free_body(&nb);
+ }
+
+diff -cr alpine-2.00.orig/imap/src/c-client/mail.h alpine-2.00.new/imap/src/c-client/mail.h
+*** alpine-2.00.orig/imap/src/c-client/mail.h 2008-08-08 18:34:22.000000000 +0100
+--- alpine-2.00.new/imap/src/c-client/mail.h 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 775,780 ****
+--- 775,781 ----
+ unsigned long bytes; /* size of text in octets */
+ } size;
+ char *md5; /* MD5 checksum */
++ unsigned short topal_hack; /* set to 1 if topal has wrecked the sending */
+ void *sparep; /* spare pointer reserved for main program */
+ };
+
+diff -cr alpine-2.00.orig/pith/conf.c alpine-2.00.new/pith/conf.c
+*** alpine-2.00.orig/pith/conf.c 2008-08-23 01:07:05.000000000 +0100
+--- alpine-2.00.new/pith/conf.c 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 2794,2799 ****
+--- 2794,2801 ----
+ F_SEND_WO_CONFIRM, h_config_send_wo_confirm, PREF_SEND, 0},
+ {"strip-whitespace-before-send", "Strip Whitespace Before Sending",
+ F_STRIP_WS_BEFORE_SEND, h_config_strip_ws_before_send, PREF_SEND, 0},
++ {"enable-topal-hack", "Enable Topal hack for OpenPGP/MIME messages",
++ F_ENABLE_TOPAL_HACK, h_config_enable_topal_hack, PREF_HIDDEN, 0},
+ {"warn-if-blank-fcc", "Warn if Blank Fcc",
+ F_WARN_ABOUT_NO_FCC, h_config_warn_if_fcc_blank, PREF_SEND, 0},
+ {"warn-if-blank-subject", "Warn if Blank Subject",
+diff -cr alpine-2.00.orig/pith/conftype.h alpine-2.00.new/pith/conftype.h
+*** alpine-2.00.orig/pith/conftype.h 2008-08-20 01:27:11.000000000 +0100
+--- alpine-2.00.new/pith/conftype.h 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 503,508 ****
+--- 503,509 ----
+ F_MARK_FCC_SEEN,
+ F_MULNEWSRC_HOSTNAMES_AS_TYPED,
+ F_STRIP_WS_BEFORE_SEND,
++ F_ENABLE_TOPAL_HACK,
+ F_QUELL_FLOWED_TEXT,
+ F_COMPOSE_ALWAYS_DOWNGRADE,
+ F_SORT_DEFAULT_FCC_ALPHA,
+diff -cr alpine-2.00.orig/pith/pine.hlp alpine-2.00.new/pith/pine.hlp
+*** alpine-2.00.orig/pith/pine.hlp 2008-08-23 01:07:05.000000000 +0100
+--- alpine-2.00.new/pith/pine.hlp 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 3205,3211 ****
+ <li><a href="h_config_always_spell_check">FEATURE: <!--#echo var="FEAT_spell-check-before-sending"--></a>
+ <li><a href="h_config_winpos_in_config">FEATURE: <!--#echo var="FEAT_store-window-position-in-config"--></a>
+ <li><a href="h_config_strip_sigdashes">FEATURE: <!--#echo var="FEAT_strip-from-sigdashes-on-reply"--></a>
+! <li><a href="h_config_strip_ws_before_send">FEATURE: <!--#echo var="FEAT_strip-whitespace-before-send"--></a>
+ <li><a href="h_config_quells_asterisks">FEATURE: <!--#echo var="FEAT_suppress-asterisks-in-password-prompt"--></a>
+ <li><a href="h_config_quell_attach_ext_warn">FEATURE: <!--#echo var="FEAT_quell-attachment-extension-warn"--></a>
+ <li><a href="h_config_quell_attach_extra_prompt">FEATURE: <!--#echo var="FEAT_quell-attachment-extra-prompt"--></a>
+--- 3205,3212 ----
+ <li><a href="h_config_always_spell_check">FEATURE: <!--#echo var="FEAT_spell-check-before-sending"--></a>
+ <li><a href="h_config_winpos_in_config">FEATURE: <!--#echo var="FEAT_store-window-position-in-config"--></a>
+ <li><a href="h_config_strip_sigdashes">FEATURE: <!--#echo var="FEAT_strip-from-sigdashes-on-reply"--></a>
+! <li><a href="h_config_strip_ws_before_send">FEATURE: <!--#echo var="FEAT_strip-whitespace-before-send"--></a>
+! <li><a href="h_config_enable_topal_hack">FEATURE: <!--#echo var="FEAT_enable-topal-hack"--></a>
+ <li><a href="h_config_quells_asterisks">FEATURE: <!--#echo var="FEAT_suppress-asterisks-in-password-prompt"--></a>
+ <li><a href="h_config_quell_attach_ext_warn">FEATURE: <!--#echo var="FEAT_quell-attachment-extension-warn"--></a>
+ <li><a href="h_config_quell_attach_extra_prompt">FEATURE: <!--#echo var="FEAT_quell-attachment-extra-prompt"--></a>
+***************
+*** 28297,28302 ****
+--- 28298,28318 ----
+ &lt;End of help on this topic&gt;
+ </BODY>
+ </HTML>
++ ====== h_config_enable_topal_hack =====
++ <HTML>
++ <HEAD>
++ <TITLE>FEATURE: <!--#echo var="FEAT_enable-topal-hack"--></TITLE>
++ </HEAD>
++ <BODY>
++ <H1>FEATURE: <!--#echo var="FEAT_enable-topal-hack"--></H1>
++ <P>
++ This feature allows Topal (and other sending-filters) to change the
++ MIME type of the email. This is potentially dangerous because it
++ pretends that multipart emails are plain emails.
++ <P>
++ &lt;End of help on this topic&gt;
++ </BODY>
++ </HTML>
+ ====== h_config_del_from_dot =====
+ <HTML>
+ <HEAD>
+diff -cr alpine-2.00.orig/pith/send.c alpine-2.00.new/pith/send.c
+*** alpine-2.00.orig/pith/send.c 2008-08-06 19:25:58.000000000 +0100
+--- alpine-2.00.new/pith/send.c 2009-05-01 13:40:37.000000000 +0100
+***************
+*** 107,113 ****
+ int l_flush_net(int);
+ int l_putc(int);
+ int pine_write_header_line(char *, char *, STORE_S *);
+! int pine_write_params(PARAMETER *, STORE_S *);
+ char *tidy_smtp_mess(char *, char *, char *, size_t);
+ int lmc_body_header_line(char *, int);
+ int lmc_body_header_finish(void);
+--- 107,113 ----
+ int l_flush_net(int);
+ int l_putc(int);
+ int pine_write_header_line(char *, char *, STORE_S *);
+! int pine_write_params(PARAMETER *, STORE_S *, BODY *);
+ char *tidy_smtp_mess(char *, char *, char *, size_t);
+ int lmc_body_header_line(char *, int);
+ int lmc_body_header_finish(void);
+***************
+*** 1783,1789 ****
+--- 1783,1791 ----
+ /* set up counts and such to keep track sent percentage */
+ send_bytes_sent = 0;
+ gf_filter_init(); /* zero piped byte count, 'n */
++ dprint((1, "Topal: HERE 1!\n"));
+ send_bytes_to_send = send_body_size(body); /* count body bytes */
++ dprint((1, "Topal: HERE 2!\n"));
+ ps_global->c_client_error[0] = error_buf[0] = '\0';
+ we_cancel = busy_cue(_("Sending mail"),
+ send_bytes_to_send ? sent_percent : NULL, 0);
+***************
+*** 1800,1805 ****
+--- 1802,1810 ----
+
+ #endif
+
++ dprint((1, "Topal: HERE 3!\n"));
++
++
+ /*
+ * If the user's asked for it, and we find that the first text
+ * part (attachments all get b64'd) is non-7bit, ask for 8BITMIME.
+***************
+*** 1807,1812 ****
+--- 1812,1818 ----
+ if(F_ON(F_ENABLE_8BIT, ps_global) && (bp = first_text_8bit(body)))
+ smtp_opts |= SOP_8BITMIME;
+
++ dprint((1, "Topal: HERE 3.1!\n"));
+ #ifdef DEBUG
+ #ifndef DEBUGJOURNAL
+ if(debug > 5 || (flags & CM_VERBOSE))
+***************
+*** 1870,1886 ****
+--- 1876,1896 ----
+ }
+ }
+
++ dprint((1, "Topal: HERE 4!\n"));
++
+ /*
+ * Install our rfc822 output routine
+ */
+ sending_hooks.rfc822_out = mail_parameters(NULL, GET_RFC822OUTPUT, NULL);
+ (void)mail_parameters(NULL, SET_RFC822OUTPUT, (void *)post_rfc822_output);
++ dprint((1, "Topal: HERE 5!\n"));
+
+ /*
+ * Allow for verbose posting
+ */
+ (void) mail_parameters(NULL, SET_SMTPVERBOSE,
+ (void *) pine_smtp_verbose_out);
++ dprint((1, "Topal: HERE 6!\n"));
+
+ /*
+ * We do this because we want mm_log to put the error message into
+***************
+*** 1924,1929 ****
+--- 1934,1940 ----
+
+ ps_global->noshow_error = 0;
+
++ dprint((1, "Topal: HERE 7!\n"));
+ TIME_STAMP("smtp open", 1);
+ if(sending_stream){
+ unsigned short save_encoding, added_encoding;
+***************
+*** 2504,2512 ****
+ BODY *
+ first_text_8bit(struct mail_bodystruct *body)
+ {
+! if(body->type == TYPEMULTIPART) /* advance to first contained part */
+ body = &body->nested.part->body;
+
+ return((body->type == TYPETEXT && body->encoding != ENC7BIT)
+ ? body : NULL);
+ }
+--- 2515,2526 ----
+ BODY *
+ first_text_8bit(struct mail_bodystruct *body)
+ {
+! /* Be careful of Topal changes... */
+! if(body->type == TYPEMULTIPART
+! && body->topal_hack != 1) /* advance to first contained part */
+ body = &body->nested.part->body;
+
++ /* Topal: this bit might not be correct, now. */
+ return((body->type == TYPETEXT && body->encoding != ENC7BIT)
+ ? body : NULL);
+ }
+***************
+*** 2879,2884 ****
+--- 2893,2899 ----
+ char *freethis;
+
+ case TYPEMULTIPART: /* multi-part */
++ if (body->topal_hack != 1) { /* But only if Topal hasn't touched it! */
+ if(!(freethis=parameter_val(body->parameter, "BOUNDARY"))){
+ char tmp[MAILTMPLEN]; /* make cookie not in BASE64 or QUOTEPRINT*/
+
+***************
+*** 2894,2899 ****
+--- 2909,2915 ----
+ part = body->nested.part; /* encode body parts */
+ do pine_encode_body (&part->body);
+ while ((part = part->next) != NULL); /* until done */
++ }
+ break;
+
+ case TYPETEXT :
+***************
+*** 4252,4258 ****
+
+ dprint((4, "-- pine_rfc822_output_body: %d\n",
+ body ? body->type : 0));
+! if(body->type == TYPEMULTIPART) { /* multipart gets special handling */
+ part = body->nested.part; /* first body part */
+ /* find cookie */
+ for (param = body->parameter; param && !cookie; param = param->next)
+--- 4268,4276 ----
+
+ dprint((4, "-- pine_rfc822_output_body: %d\n",
+ body ? body->type : 0));
+! if(body->type == TYPEMULTIPART
+! && body->topal_hack != 1) { /* multipart gets special handling,
+! unless Topal messed with it */
+ part = body->nested.part; /* first body part */
+ /* find cookie */
+ for (param = body->parameter; param && !cookie; param = param->next)
+***************
+*** 4342,4351 ****
+ * BEFORE applying any encoding (rfc1341: appendix G)...
+ * NOTE: almost all filters expect CRLF newlines
+ */
+! if(body->type == TYPETEXT
+! && body->encoding != ENCBASE64
+ && !so_attr((STORE_S *) body->contents.text.data, "rawbody", NULL)){
+! gf_link_filter(gf_local_nvtnl, NULL);
+ }
+
+ switch (body->encoding) { /* all else needs filtering */
+--- 4360,4373 ----
+ * BEFORE applying any encoding (rfc1341: appendix G)...
+ * NOTE: almost all filters expect CRLF newlines
+ */
+! if(((body->type == TYPETEXT
+! && body->encoding != ENCBASE64)
+! /* Or if Topal mucked with it... */
+! | (body->type == TYPEMULTIPART && body->topal_hack == 1))
+ && !so_attr((STORE_S *) body->contents.text.data, "rawbody", NULL)){
+! if(body->topal_hack == 1)
+! dprint((9, "Topal: Canonical conversion, although Topal has mangled...\n"));
+! gf_link_filter(gf_local_nvtnl, NULL);
+ }
+
+ switch (body->encoding) { /* all else needs filtering */
+***************
+*** 4447,4453 ****
+ return(pwbh_finish(0, so));
+
+ if(body->parameter){
+! if(!pine_write_params(body->parameter, so))
+ return(pwbh_finish(0, so));
+ }
+ else if(!so_puts(so, "; CHARSET=US-ASCII"))
+--- 4469,4475 ----
+ return(pwbh_finish(0, so));
+
+ if(body->parameter){
+! if(!pine_write_params(body->parameter, so, body))
+ return(pwbh_finish(0, so));
+ }
+ else if(!so_puts(so, "; CHARSET=US-ASCII"))
+***************
+*** 4526,4532 ****
+ && so_puts(so, body->disposition.type)))
+ return(pwbh_finish(0, so));
+
+! if(!pine_write_params(body->disposition.parameter, so))
+ return(pwbh_finish(0, so));
+
+ if(!so_puts(so, "\015\012"))
+--- 4548,4554 ----
+ && so_puts(so, body->disposition.type)))
+ return(pwbh_finish(0, so));
+
+! if(!pine_write_params(body->disposition.parameter, so, body))
+ return(pwbh_finish(0, so));
+
+ if(!so_puts(so, "\015\012"))
+***************
+*** 4588,4594 ****
+ * pine_write_param - convert, encode and write MIME header-field parameters
+ */
+ int
+! pine_write_params(PARAMETER *param, STORE_S *so)
+ {
+ for(; param; param = param->next){
+ int rv;
+--- 4610,4616 ----
+ * pine_write_param - convert, encode and write MIME header-field parameters
+ */
+ int
+! pine_write_params(PARAMETER *param, STORE_S *so, BODY *body)
+ {
+ for(; param; param = param->next){
+ int rv;
+***************
+*** 4597,4605 ****
+
+ cs = posting_characterset(param->value, NULL, HdrText);
+ cv = utf8_to_charset(param->value, cs, 0);
+! rv = (so_puts(so, "; ")
+! && rfc2231_output(so, param->attribute, cv, (char *) tspecials, cs));
+!
+ if(cv && cv != param->value)
+ fs_give((void **) &cv);
+
+--- 4619,4635 ----
+
+ cs = posting_characterset(param->value, NULL, HdrText);
+ cv = utf8_to_charset(param->value, cs, 0);
+! if (body->topal_hack == 1
+! && !struncmp(param->attribute, "protocol", 9)) {
+! /* Did Topal introduce more parameters? */
+! dprint((9, "Topal: parameter encoding of protocol, with Topal hack\n"));
+! rv = (so_puts(so, "; \015\012\011")
+! && rfc2231_output(so, param->attribute, cv, (char *) tspecials, cs));
+! }
+! else
+! rv = (so_puts(so, "; ")
+! && rfc2231_output(so, param->attribute, cv, (char *) tspecials, cs));
+!
+ if(cv && cv != param->value)
+ fs_give((void **) &cv);
+
+***************
+*** 4706,4712 ****
+ long l = 0L;
+ PART *part;
+
+! if(body->type == TYPEMULTIPART) { /* multipart gets special handling */
+ part = body->nested.part; /* first body part */
+ do /* for each part */
+ l += send_body_size(&part->body);
+--- 4736,4744 ----
+ long l = 0L;
+ PART *part;
+
+! if(body->type == TYPEMULTIPART
+! && body->topal_hack != 1) { /* multipart gets special handling
+! but again, be careful of Topal */
+ part = body->nested.part; /* first body part */
+ do /* for each part */
+ l += send_body_size(&part->body);
diff --git a/topal-2.patch b/topal-2.patch
new file mode 100644
index 000000000000..3c7949e3041a
--- /dev/null
+++ b/topal-2.patch
@@ -0,0 +1,45 @@
+diff -cr alpine-2.00.orig/imap/src/c-client/mail.c alpine-2.00.new/imap/src/c-client/mail.c
+*** alpine-2.00.orig/imap/src/c-client/mail.c 2008-06-04 19:39:54.000000000 +0100
+--- alpine-2.00.new/imap/src/c-client/mail.c 2009-04-30 22:34:13.000000000 +0100
+***************
+*** 2712,2717 ****
+--- 2712,2719 ----
+ BODY *b = NIL;
+ PART *pt;
+ unsigned long i;
++ /* Topal hack 2 */
++ mail_fetchstructure (stream,msgno,&b);
+ /* make sure have a body */
+ if (section && *section && mail_fetchstructure (stream,msgno,&b) && b)
+ while (*section) { /* find desired section */
+diff -cr alpine-2.00.orig/pith/mailcap.c alpine-2.00.new/pith/mailcap.c
+*** alpine-2.00.orig/pith/mailcap.c 2008-03-18 17:24:31.000000000 +0000
+--- alpine-2.00.new/pith/mailcap.c 2009-04-30 22:35:47.000000000 +0100
+***************
+*** 582,589 ****
+ * typically two scans through the check_extension
+ * mechanism, the mailcap entry now takes precedence.
+ */
+! if((fname = get_filename_parameter(NULL, 0, body, &e2b.from.ext)) != NULL
+! && e2b.from.ext && e2b.from.ext[0]){
+ if(strlen(e2b.from.ext) < sizeof(tmp_ext) - 2){
+ strncpy(ext = tmp_ext, e2b.from.ext - 1, sizeof(tmp_ext)); /* remember it */
+ tmp_ext[sizeof(tmp_ext)-1] = '\0';
+--- 582,598 ----
+ * typically two scans through the check_extension
+ * mechanism, the mailcap entry now takes precedence.
+ */
+! /* Topal hack 2 */
+! fname = get_filename_parameter(NULL, 0, body, &e2b.from.ext);
+! if (fname == NULL) {
+! if (body->type == TYPEMULTIPART &&
+! ((body->subtype && !strucmp(body->subtype, "signed"))
+! ||(body->subtype && !strucmp(body->subtype, "encrypted"))))
+! fname = cpystr("openpgp.msg");
+! }
+!
+! if(fname != NULL
+! && e2b.from.ext && e2b.from.ext[0]){
+ if(strlen(e2b.from.ext) < sizeof(tmp_ext) - 2){
+ strncpy(ext = tmp_ext, e2b.from.ext - 1, sizeof(tmp_ext)); /* remember it */
+ tmp_ext[sizeof(tmp_ext)-1] = '\0';