diff options
| author | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:18:09 +0000 | 
|---|---|---|
| committer | Tatsuya Kinoshita <tats@vega.ocn.ne.jp> | 2011-05-04 07:18:09 +0000 | 
| commit | 5f8e0f8ef9a422691dd72e8a953a42a41478fcb4 (patch) | |
| tree | 4b2df4796a534793648b3c4fc532fc36bd0cd525 /scripts/multipart | |
| parent | Releasing debian version 0.3-2.4 (diff) | |
| download | w3m-5f8e0f8ef9a422691dd72e8a953a42a41478fcb4.tar.gz w3m-5f8e0f8ef9a422691dd72e8a953a42a41478fcb4.zip | |
Releasing debian version 0.5.1-1debian/0.5.1-1
Diffstat (limited to '')
| -rw-r--r-- | scripts/multipart/.cvsignore | 2 | ||||
| -rw-r--r-- | scripts/multipart/Makefile.in | 75 | ||||
| -rw-r--r-- | scripts/multipart/README | 24 | ||||
| -rw-r--r-- | scripts/multipart/mailcap | 1 | ||||
| -rw-r--r-- | scripts/multipart/multipart.cgi.in | 313 | 
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/\&/\&/g; +	s/\</\</g; +	s/\>/\>/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/\&/\&/g; +		s/\</\</g; +		s/\>/\>/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)), +				"&boundary=", +				&html_quote(&form_encode($boundary)), +				"&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/\&/\&/g; +		s/\</\</g; +		s/\>/\>/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) = ( +    '<', '<', +    '>', '>', +    '&', '&', +    '"', '"', +  ); +  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; +} | 
