[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 メーリングリストの案内