[mew-dist 26698] Re: MIME decode error (**B ENCODING ERROR**))
Hideyuki SHIRAI ( 白井秀行 )
shirai at example.com
2005年 11月 29日 (火) 12:24:22 JST
去年、
From: Motohiko Minakuchi <zxcv3794 at example.com> さん曰く
Subject: [mew-dist 25264] B decode 時のエラー条件緩和
Message-ID: <20040907.205720.110256132.zxcv3794 at example.com>
Date: Tue, 07 Sep 2004 20:57:20 +0900 (JST)
からはじまる話で、padding が多いとか少ないとか救うようになりまし
たよね。だから、今回の件も『あり』かも。
From: Shun-ichi TAHARA (田原 俊一) <jado at example.com> さん曰く
Subject: [mew-dist 26697] Re: MIME decode error (**B ENCODING ERROR**))
Message-ID: <20051129.110817.103172475.jado at example.com>
Date: Tue, 29 Nov 2005 11:08:17 +0900 (JST)
> > # 当然ですがデコードできないのは Mew だけじゃありません。
>
> Outlook系で試したわけじゃないのですが、アレでデコードできればOK、それ
> 以外でダメならそのソフトの責任、的ないい加減な実装がまかり通ってますか
> らね…
ふと試したら、imls ではデコードしました :-)
> 他に影響を与えず、簡単に対処できるのであれば、mew-decode-broken な処理
> の懐を広げる方向で対応する、というのも検討していいかもしれません。
>
> # 個人的にはどうでもいい :-p
最近、elisp 書いていないので、ちょっとだけ練習がてら。
こういうやりかたが OK なら、「B decode 時のエラー条件緩和」で非
常に甘くなった mew-base64-decode-string() はもともとの strict な
コードに戻して、mew-header-decode() でチェックして warning も出
す。というのがよいかもです。
## body は放っといてもよいのですよね。
--
白井秀行 (mailto:shirai at example.com)
-------------- next part --------------
Index: mew-bq.el
===================================================================
RCS file: /cvsroot/shirai/mew/mew/mew-bq.el,v
retrieving revision 1.41
diff -u -r1.41 mew-bq.el
--- mew-bq.el 2005/05/26 06:51:28 1.41
+++ mew-bq.el 2005/11/29 03:19:12
@@ -19,6 +19,9 @@
`(("B" . ,mew-error-invalid-b-encoding)
("Q" . ,mew-error-invalid-q-encoding)))
+(defvar mew-header-decode-error-padding-recover
+ `(("B" . t)))
+
(defsubst mew-header-encode-get-func (b-or-q)
(cdr (mew-assoc-case-equal b-or-q mew-header-encode-switch 0)))
@@ -28,6 +31,9 @@
(defsubst mew-header-decode-get-error-str (b-or-q)
(cdr (mew-assoc-case-equal b-or-q mew-header-decode-error-switch 0)))
+(defsubst mew-header-decode-get-error-padding-recover (b-or-q)
+ (cdr (mew-assoc-case-equal b-or-q mew-header-decode-error-padding-recover 0)))
+
(defconst mew-header-decode-regex
"=\\?\\([^? \t]+\\)\\?\\(.\\)\\?\\([^? \t]+\\)\\?=")
@@ -81,7 +87,7 @@
(let* ((estr (mew-cs-encode-string str hcs)))
(concat "=?" charset "?" b-or-q "?" (funcall fun estr) "?=")))
-(defun mew-header-decode (charset b-or-q estr)
+(defun mew-header-decode (charset b-or-q estr &optional key)
(let* ((fun (mew-header-decode-get-func b-or-q))
(cs (mew-charset-to-cs charset))
str)
@@ -93,6 +99,19 @@
mew-error-unknown-charset)
(fun ;; if cs is nil, mew-cs-decode-string does not cs-decode.
(setq str (funcall fun estr))
+ (when (and (null str)
+ mew-decode-broken
+ (mew-header-decode-get-error-padding-recover b-or-q))
+ (setq str (catch 'success
+ (when (string-match "=+$" estr)
+ (let ((padlen (- (match-end 0) (match-beginning 0))))
+ (while (not (zerop padlen))
+ (setq padlen (1- padlen))
+ (setq estr (substring estr 0 -1))
+ (setq str (funcall fun estr))
+ (when str
+ (mew-decode-warning-fields key 'padding)
+ (throw 'success str))))))))
(if (null str)
(mew-header-decode-get-error-str b-or-q)
(when (and mew-decode-broken
@@ -610,7 +629,8 @@
(end (match-end 0))
(css (mew-header-decode (mew-match-string 1)
(mew-match-string 2)
- (mew-match-string 3))))
+ (mew-match-string 3)
+ key)))
(setq css (mew-header-sanity-check-string2 css key))
(delete-region beg end)
(insert css)))
@@ -651,8 +671,11 @@
(setq level 2)
(setq wmsg (concat key " has raw text strings.\n")))
((eq err 'quoted)
+ (setq level 2)
+ (setq wmsg (concat key " has encoded-words in quoted text.\n")))
+ ((eq err 'padding)
(setq level 2)
- (setq wmsg (concat key " has encoded-words in quoted text.\n"))))
+ (setq wmsg (concat key " has illegal padding character in encoded text.\n"))))
(if (>= level mew-warning-field-level)
(mew-xinfo-set-warning (cons wmsg (mew-xinfo-get-warning)))))))
Mew-dist メーリングリストの案内