aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/multipart
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/multipart')
-rw-r--r--scripts/multipart/.cvsignore2
-rw-r--r--scripts/multipart/Makefile.in75
-rw-r--r--scripts/multipart/README24
-rw-r--r--scripts/multipart/mailcap1
-rw-r--r--scripts/multipart/multipart.cgi.in313
5 files changed, 415 insertions, 0 deletions
diff --git a/scripts/multipart/.cvsignore b/scripts/multipart/.cvsignore
new file mode 100644
index 0000000..db1dff2
--- /dev/null
+++ b/scripts/multipart/.cvsignore
@@ -0,0 +1,2 @@
+multipart.cgi
+Makefile
diff --git a/scripts/multipart/Makefile.in b/scripts/multipart/Makefile.in
new file mode 100644
index 0000000..ad472ee
--- /dev/null
+++ b/scripts/multipart/Makefile.in
@@ -0,0 +1,75 @@
+@SET_MAKE@
+SHELL=@SHELL@
+PACKAGE = @PACKAGE@
+VERSION = @VERSION@
+DOMAIN = $(PACKAGE)
+srcidr=@srcdir@
+top_srcdir=@top_srcdir@
+VPATH= $(srcdir):.
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+datadir = @datadir@
+libdir = @libdir@
+includedir = @includedir@
+infodir = @infodir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+oldincludedir = @oldincludedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+top_srcdir = @top_srcdir@
+VPATH = $(top_srcdir):.
+DESTDIR =
+
+CGIBIN_DIR = $(libexecdir)/$(PACKAGE)/cgi-bin
+AUXBIN_DIR = $(libexecdir)/$(PACKAGE)
+HELP_DIR = @HELP_DIR@
+RC_DIR = @RC_DIR@
+ETC_DIR = $(sysconfdir)
+CONF_DIR = $(sysconfdir)/$(PACKAGE)
+
+LIB_TARGETS = multipart.cgi
+
+MKDIR = mkdir -p
+INSTALL = @INSTALL@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+
+PERL = @PERL@
+NKF = @NKF@
+
+all: $(LIB_TARGETS)
+
+# do nothing
+$(LIB_TARGETS):
+
+install: $(LIB_TARGETS)
+ -$(MKDIR) $(DESTDIR)$(CGIBIN_DIR)
+ for file in $(LIB_TARGETS); \
+ do \
+ $(INSTALL_SCRIPT) $$file $(DESTDIR)$(CGIBIN_DIR); \
+ done
+
+uninstall:
+ -for file in $(LIB_TARGETS); \
+ do \
+ rm -f $(CGIBIN_DIR)/$$file; \
+ done
+
+clean:
+
+distclean:
+ -rm -f $(LIB_TARGETS)
+ -rm -f Makefile
+
+dist: all
+ @-rm -fr $(distdir)/multipart
+ $(MKDIR) $(distdir)/multipart
+ cp Makefile README multipart.cgi.in $(distdir)/multipart
+ ( cd $(distdir); tar -cf - multipart | GZIP='' gzip ) \
+ > $(distdir)/multipart.tar.gz
+ -rm -fr $(distdir)/multipart
+
diff --git a/scripts/multipart/README b/scripts/multipart/README
new file mode 100644
index 0000000..b82f585
--- /dev/null
+++ b/scripts/multipart/README
@@ -0,0 +1,24 @@
+
+Content-Type: multipart/* を扱う local-CGI
+
+ Content-Type: multipart/* なファイルを扱うための local-CGI です。
+ 主に mailx などでメールを PAGER="w3m -m" で読む場合を想定しています。
+
+インストール
+
+ * make install
+ 必要なら PERL, NKF, LIBDIR を設定してください。
+
+ * mailcap を ~/.w3m/mailcap にマージ
+ multipart.cgi のパスに注意
+
+ * w3m の Option Setting Panel で、
+ 『保存時に Content-Transfer-Encoding をデコードする』を ON
+ 添付ファイルの保存時に便利です。
+
+必要なもの
+
+ * NKF モジュールまたは nkf
+ 文字コード変換や MIME ヘッダのデコードにを使ってます。
+ 気にいらなければ変えてください。
+
diff --git a/scripts/multipart/mailcap b/scripts/multipart/mailcap
new file mode 100644
index 0000000..323ee20
--- /dev/null
+++ b/scripts/multipart/mailcap
@@ -0,0 +1 @@
+multipart/*; /usr/local/lib/w3m/multipart.cgi %s %{boundary}; htmloutput
diff --git a/scripts/multipart/multipart.cgi.in b/scripts/multipart/multipart.cgi.in
new file mode 100644
index 0000000..db8001c
--- /dev/null
+++ b/scripts/multipart/multipart.cgi.in
@@ -0,0 +1,313 @@
+#!@PERL@
+
+eval "use NKF;";
+if (! $@) {
+ $use_NKF = 1;
+ $CONV = "-e";
+ $MIME_DECODE = "-m -e";
+} else {
+ $use_NKF = 0;
+# $CONV = "w3m -dump -e";
+ $CONV = "@NKF@ -e";
+ $MIME_DECODE = "@NKF@ -m -e";
+}
+$MIME_TYPE = "$ENV{'HOME'}/.mime.types";
+
+$SCRIPT_NAME = $ENV{'SCRIPT_NAME'} || $0;
+$CGI = "file://$SCRIPT_NAME";
+
+if ($ENV{'REQUEST_METHOD'} eq 'POST') {
+ sysread(STDIN, $query, $ENV{'CONTENT_LENGTH'});
+} elsif (defined($ENV{'QUERY_STRING'})) {
+ $query = $ENV{'QUERY_STRING'};
+}
+if (defined($query)) {
+ for (split('&', $query)) {
+ s/^([^=]*)=//;
+ $v{$1} = $_;
+ }
+ $file = &form_decode($v{'file'});
+ $boundary = &form_decode($v{'boundary'});
+} else {
+ $file = $ARGV[0];
+ if (@ARGV >= 2) {
+ $boundary = $ARGV[1];
+ }
+}
+(-f $file) || exit(1);
+open(F, "< $file") || exit(1);
+$end = 0;
+$mbody = '';
+if (defined($boundary)) {
+ while(<F>) {
+ s/\r?\n$//;
+ ($_ eq "--$boundary") && last;
+ ($_ eq "--$boundary--") && ($end = 1, last);
+ $mbody .= "$_\n";
+ }
+} else {
+ while(<F>) {
+ s/\r?\n$//;
+ if (s/^\-\-//) {
+ $boundary = $_;
+ last;
+ }
+ $mbody .= "$_\n";
+ }
+}
+
+if (defined($v{'count'})) {
+ $count = 0;
+ while($count < $v{'count'}) {
+ while(<F>) {
+ s/\r?\n$//;
+ ($_ eq "--$boundary") && last;
+ }
+ eof(F) && exit;
+ $count++;
+ }
+
+ %header = ();
+ $hbody = '';
+ while(<F>) {
+ /^\s*$/ && last;
+ $x = $_;
+ s/\r?\n$//;
+ if (/=\?/) {
+ $_ = &decode($_, $MIME_DECODE);
+ }
+ if (s/^(\S+)\s*:\s*//) {
+ $h = $&;
+ if ($h =~ /^w3m-control/i) {
+ $h = "WARNING: $h";
+ }
+ $hbody .= "$h$_\n";
+ $p = $1;
+ $p =~ tr/A-Z/a-z/;
+ $header{$p} = $_;
+ } elsif (s/^\s+//) {
+ chop $hbody;
+ $hbody .= "$_\n";
+ $header{$p} .= $_;
+ }
+ }
+ $type = $header{"content-type"};
+ $dispos = $header{"content-disposition"};
+ if ($type =~ /application\/octet-stream/) {
+ if ($type =~ /type\=gzip/) {
+ print "Content-Encoding: x-gzip\n";
+ }
+ if ($type =~ /name=\"?([^\"]+)\"?/ ||
+ $dispos =~ /filename=\"?([^\"]+)\"?/) {
+ $type = &guess_type($1);
+ if ($type) {
+ print "Content-Type: $type; name=\"$1\"\n";
+ } else {
+ print "Content-Type: text/plain; name=\"$1\"\n";
+ }
+ }
+ }
+ print $hbody;
+ print "\n";
+ while(<F>) {
+ $x = $_;
+ s/\r?\n$//;
+ ($_ eq "--$boundary") && last;
+ if ($_ eq "--$boundary--") {
+ last;
+ }
+ print $x;
+ }
+ close(F);
+ exit;
+}
+
+$qcgi = &html_quote($CGI);
+$qfile = &html_quote($file);
+$qboundary = &html_quote($boundary);
+
+if ($mbody =~ /\S/) {
+ $_ = $mbody;
+ s/\&/\&amp;/g;
+ s/\</\&lt;/g;
+ s/\>/\&gt;/g;
+ print "<pre>\n";
+ print $_;
+ print "</pre>\n";
+}
+
+$count = 0;
+while(! $end) {
+ %header = ();
+ $hbody = '';
+ while(<F>) {
+ /^\s*$/ && last;
+ s/\r?\n$//;
+ if (/=\?/) {
+ $_ = &decode($_, $MIME_DECODE);
+ }
+ if (s/^(\S+)\s*:\s*//) {
+ $hbody .= "$&$_\n";
+ $p = $1;
+ $p =~ tr/A-Z/a-z/;
+ $header{$p} = $_;
+ } elsif (s/^\s+//) {
+ chop $hbody;
+ $hbody .= "$_\n";
+ $header{$p} .= $_;
+ }
+ }
+ $type = $header{"content-type"};
+ $dispos = $header{"content-disposition"};
+ $plain = 0;
+ $image = 0;
+ if (! $dispos || $dispos =~ /^inline/i) {
+ if (! $type || $type =~ /^text\/plain/i) {
+ $plain = 1;
+ } elsif ($type =~ /^image\//i) {
+ $image = 1;
+ }
+ }
+ $body = '';
+ while(<F>) {
+ s/\r?\n$//;
+ ($_ eq "--$boundary") && last;
+ if ($_ eq "--$boundary--") {
+ $end = 1;
+ last;
+ }
+ if ($plain) {
+ $body .= "$_\n";
+ }
+ }
+ $| = 1;
+ print "<hr>\n";
+ {
+ $_ = $hbody;
+ s/\&/\&amp;/g;
+ s/\</\&lt;/g;
+ s/\>/\&gt;/g;
+ print "<pre>\n";
+ print $_;
+ print "</pre>\n";
+ if ($type =~ /name=\"?([^\"]+)\"?/ ||
+ $dispos =~ /filename=\"?([^\"]+)\"?/) {
+ $name = $1;
+ } else {
+ $name = "Content";
+ }
+ print "<form action=\"$qcgi\">\n";
+ print "<input type=hidden name=file value=\"$qfile\">\n";
+ print "<input type=hidden name=boundary value=\"$qboundary\">\n";
+ print "<input type=hidden name=count value=\"$count\">\n";
+ if ($image) {
+ print "<input type=image name=submit src=\"$qcgi?file=",
+ &html_quote(&form_encode($file)),
+ "&amp;boundary=",
+ &html_quote(&form_encode($boundary)),
+ "&amp;count=$count\" alt=\"",
+ &html_quote($name), "\">\n";
+ } else {
+ print "<input type=submit name=submit value=\"",
+ &html_quote($name), "\">\n";
+ }
+ print "</form>\n"
+ }
+ if ($plain) {
+ $body = &decode($body, $CONV);
+ $_ = $body;
+ s/\&/\&amp;/g;
+ s/\</\&lt;/g;
+ s/\>/\&gt;/g;
+ print "<pre>\n\n";
+ print $_;
+ print "</pre>\n";
+ }
+ eof(F) && last;
+ $count++;
+}
+close(F);
+
+sub decode {
+if ($use_NKF) {
+ local($body, $opt) = @_;
+ return nkf($opt, $body);
+}
+ local($body, @cmd) = @_;
+ local($_);
+
+ $| = 1;
+ pipe(R, W2);
+ pipe(R2, W);
+ if (! fork()) {
+ close(F);
+ close(R);
+ close(W);
+ open(STDIN, "<&R2");
+ open(STDOUT, ">&W2");
+ exec @cmd;
+ die;
+ }
+ close(R2);
+ close(W2);
+ print W $body;
+ close(W);
+ $body = '';
+ while(<R>) {
+ $body .= $_;
+ }
+ close(R);
+ return $body;
+}
+
+sub html_quote {
+ local($_) = @_;
+ local(%QUOTE) = (
+ '<', '&lt;',
+ '>', '&gt;',
+ '&', '&amp;',
+ '"', '&quot;',
+ );
+ s/[<>&"]/$QUOTE{$&}/g;
+ return $_;
+}
+
+sub form_decode {
+ local($_) = @_;
+ s/\+/ /g;
+ s/%([\da-f][\da-f])/pack('c', hex($1))/egi;
+ return $_;
+}
+
+sub form_encode {
+ local($_) = @_;
+ s/[\000-\040\+:#?&%<>"\177-\377]/sprintf('%%%02X', unpack('C', $&))/eg;
+ return $_;
+}
+
+sub guess_type {
+ local($_) = @_;
+
+ /\.(\w+)$/ || return "";
+ $_ = $1;
+ tr/A-Z/a-z/;
+ %mime_type = &load_mime_type($MIME_TYPE);
+ $mime_type{$_};
+}
+
+sub load_mime_type {
+ local($file) = @_;
+ local(%m, $a, @b, $_);
+
+ open(M, "< $file") || return ();
+ while(<M>) {
+ /^#/ && next;
+ chop;
+ (($a, @b) = split(" ")) >= 2 || next;
+ for(@b) {
+ $m{$_} = $a;
+ }
+ }
+ close(M);
+ return %m;
+}