#!/usr/bin/perl -w 
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# Upload file CGI
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------

use strict;
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use utf8;
use XML::DOM;
use TF::XMLUtils;
use TF::CommonUtils;
use TF::GroupList;
use HTML::Template;
use URI::Escape;

binmode(STDOUT, ":utf8");

# global
my $LOCATION      = $ENV{'TF_LOCATION'};
my $TF_VERSION    = $ENV{'TF_VERSION'};
my $USERID        = $ENV{'REMOTE_USER'};
my $PASSWD        = $ENV{'TF_USERPLAINPASSWORD'};
my $BRAND         = $ENV{'TF_BRANDNAME'} || '';
my $LANGPARAM     = TF::CommonUtils::getLangPriority();
my $TEMPLATE_FILE = './tmpl/upload.tmpl.' . $LANGPARAM;
my $TF_TOKEN      = $ENV{'TF_TOKEN'} || '';
my %form;
my ($SCHEMA,$SERVER_PORT,$URI_PREFIX) = TF::CommonUtils::getCgiConnectInfo();
my $URL           = $URI_PREFIX . $LOCATION;

if (!$LOCATION) {
	TF::CommonUtils::showAccessDeny();
	die '';
}

main();

#
# main 
#
sub main {
	my $buf;
	my $REQUEST_METHOD = $ENV{'REQUEST_METHOD'} || '';
	my $CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'} || 0;

	if ($REQUEST_METHOD eq "POST" && $CONTENT_LENGTH >= 0) {
		read(STDIN, $buf, $CONTENT_LENGTH);
		my @pairs = split(/&/, $buf);
		foreach my $pair (@pairs) {
			my ($name, $value) = split(/=/, $pair);
			$value =~ tr/+/ /;
			$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
			$form{$name} = $value;
		}
	}

	&printHTML();
}

#
# sub
#
sub printHTML
{
	my $folder = $form{'hidCurrentFolderUri'} || '';
	my $needmail = ($form{'hidMWTriggerMethods'} =~ /PUT/);
	my @paramarray = undef;

	if (!$folder) {
		TF::CommonUtils::showAccessDeny();
		return;
	}
	my ($PARENT_URI, $seq) = split(/\?seq=/, $folder);
	my $rawuri = $PARENT_URI;
	$rawuri =~ s/$ENV{'TF_GROUPFOLDER_URI'}//g;
	$rawuri =~ s/$ENV{'TF_PRIVATEFOLDER_URI'}//g;

	my @urilist = split(/\//, $rawuri);
	my @breadcrumb = ();
	foreach my $n (@urilist) {
		my $parts = TF::CommonUtils::decode_utf8(uri_unescape($n));
		next if ($parts eq "");
		push(@breadcrumb, { name => TF::CommonUtils::escapeHTML(TF::CommonUtils::decode_utf8(uri_unescape($n)))});
	}

	my $comment = "";
	if ($PARENT_URI =~ /$ENV{'TF_GROUPFOLDER_URI'}/) {
		my @availablegrp = split(/,/, $ENV{'TF_USERAVAILABLEGROUPURI'});
		my $grpcolname = "";
		@availablegrp = reverse(sort(@availablegrp));
		foreach my $val(@availablegrp) {
			my $val_tmp = quotemeta $val;
			if (uri_unescape($PARENT_URI) =~ /$val_tmp/) {
				$grpcolname = $val;
				last;
			}
		}
		die "group name match error." if ($grpcolname eq "");

		my $glist = TF::GroupList->new();
		my $gstatus = $glist->queryGroupforcoluri($URL, $USERID, $PASSWD, $grpcolname);
		if ($gstatus == 207) {
			foreach($glist->getIDList()) {
				$comment =  $glist->getComment($_);
			}
			# 先頭に+記号があるコメントだけテンプレートに渡します
 			if ($comment) {
				unless ($comment =~ s/^\+//) {
					$comment = undef;
				}
				$comment = TF::CommonUtils::escapeHTML($comment, 1);
				$comment =~ s/\n/<br \/>/g if ($comment);
			}
		}
	}

	@paramarray = &getFilelist($PARENT_URI);

	my $parent_urijs = TF::CommonUtils::escapeHTML(TF::CommonUtils::escapeJSParam($PARENT_URI), 0);
	if (open(TEMPLATE, "<$TEMPLATE_FILE")) {
		binmode(TEMPLATE, ":utf8");
		my $htmltmpl = HTML::Template->new(	filehandle => *TEMPLATE,
											case_sensitive => 1,
											die_on_bad_params => 0);
		if ($htmltmpl) {
			$htmltmpl->param(	brandname => $BRAND,
								tfversion => $TF_VERSION,
								location  => $LOCATION,
								uid       => $USERID,
								parenturi => TF::CommonUtils::escapeHTML($PARENT_URI),
								parenturijs => $parent_urijs,
								breadcrump => \@breadcrumb,
								needmail  => $needmail,
								filelist => \@paramarray,
								comment => $comment,
								token => $TF_TOKEN,
							);
			print "Content-type: text/html; charset=UTF-8\n\n";
			print $htmltmpl->output;
		}
		close(TEMPLATE);
	}
	else {
		TF::CommonUtils::showTemplateOpenErr($LANGPARAM);
	}
}

sub getFilelist {
	my $PARENT_URI = shift || '';

	my $ua  = LWP::UserAgent->new(ssl_opts => {verify_hostname => 0});
	my $req = HTTP::Request->new;
	my @namearray = ();
	my $URI = $URI_PREFIX . $PARENT_URI || '';

	if (!$URI || !$PARENT_URI) {
		return @namearray;
	}

	#---------------
	# PROPFIND
	#---------------
	$req->uri($URI);
	$req->method("PROPFIND");
	$req->protocol("HTTP/1.1");
	$req->authorization_basic($USERID, $PASSWD);
	$req->header('Depth' => '1');
	my $content = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?><D:propfind xmlns:D=\"DAV:\" xmlns:TF=\"http://www.teamfile.com/DTD/TF/\"><D:prop><D:displayname/><D:resourcetype/></D:prop></D:propfind>";

	$req->content($content);
	$ua->agent(TF::CommonUtils::getCgiUserAgent());
	my $res = $ua->request($req);
	if ($res->is_success && $res->code == 207) {
		my $data = $res->content();
		if ($data) {
			my $xml = new XML::DOM::Parser;
			my $doc = $xml->parse($data);

			for my $elem ($doc->getElementsByTagName("D:prop"))  {
				my $displayname  = TF::XMLUtils::getText($elem, "lp1:displayname");
				my $restype = $elem->getElementsByTagName("lp1:resourcetype");
				my $collection = undef;
				if ($restype && $restype->item(0)) {
					$collection = $restype->item(0)->getFirstChild();
				}
				if($displayname && !$collection) {
					$displayname = &TF::CommonUtils::escapeHTML($displayname, 0);
					push(@namearray, { name => $displayname });
				}
			}
			$doc->dispose;
		}
	}

	return @namearray;
}

