<?php
/*=====================================================================*\
|| ###################################################################
|| # Bugdar
|| # Copyright (c)2004-2009 Blue Static
|| #
|| # This program is free software; you can redistribute it and/or modify
|| # it under the terms of the GNU General Public License as published by
|| # the Free Software Foundation; version 2 of the License.
|| #
|| # This program is distributed in the hope that it will be useful, but
|| # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|| # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|| # more details.
|| #
|| # You should have received a copy of the GNU General Public License along
|| # with this program; if not, write to the Free Software Foundation, Inc.,
|| # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|| ###################################################################
\*=====================================================================*/

$fetchtemplates = array(
	'newattach',
	'editattach'
);


$focus['showreport'] = 'focus';

require_once('./global.php');
require_once('./includes/class_notification.php');
require_once('./includes/api_attachment.php');
require_once('./includes/api_comment.php');

if (isset($input->in['attachmentid']))
{
	$attachment = $db->queryFirst("SELECT * FROM " . TABLE_PREFIX . "attachment WHERE attachmentid = " . $input->inputClean('attachmentid', TYPE_UINT));
	if (!$attachment)
	{
		$message->error(L_INVALID_ID);
	}
}

$bug = $db->queryFirst("SELECT * FROM " . TABLE_PREFIX . "bug WHERE bugid = " . (($attachment['attachmentid']) ? $attachment['bugid'] : $input->inputClean('bugid', TYPE_UINT)));
if (!$bug)
{
	$message->error(L_INVALID_ID);
}

if (!check_bug_permissions($bug))
{
	$message->errorPermission();
}

require_once('./includes/class_logging.php');

$notif = new NotificationCenter();
$notif->setBugData($bug);

// ###################################################################

if ($_POST['do'] == 'insert')
{
	$attachapi = new AttachmentAPI();
	$attachapi->set('bugid',	$input->in['bugid']);

	if (!can_perform('canputattach', $bug['product']))
	{
		$message->errorPermission();
	}

	// max packet size
	$var = $db->queryFirst("SHOW VARIABLES LIKE 'max_allowed_packet'");
	BSApp::debug("max_allowed_packet = $var[Value]");

	// create alias
	$FILE = &$_FILES['attachment'];

	// PHP errors
	switch ($FILE['error'])
	{
		case 0: break;
		case 1: $message->addError(T('PHP said the file you uploaded was too big.')); break;
		case 2: $message->addError(T('The file exceeds the allowed upload size.')); break;
		case 3: $message->addError(T('The file was only partially uploaded.')); break;
		case 4: $message->addError(T('The file was not uploaded at all.')); break;
		case 6: $message->addError(T('PHP could not find the /tmp directory.')); break;
	}

	// did it upload?
	if (!is_uploaded_file($FILE['tmp_name']))
	{
		$message->addError(T('The file you specified did not upload.'));
	}

	// TODO - put some MIME-type validation here

	if (filesize($FILE['tmp_name']) > $var['Value'])
	{
		$message->addError(T('The file you specified exceeds MySQL\'s maximum allowed packet.'));
	}

	$attachapi->set('attachment',	file_get_contents($FILE['tmp_name']));
	$attachapi->set('filename',		$FILE['name']);
	$attachapi->set('mimetype',		$FILE['type']);
	$attachapi->set('filesize',		$FILE['size']);
	$attachapi->set('description',	$input->in['description']);
	$attachapi->set('userid',		bugdar::$userinfo['userid']);

	// insert an attachment
	if (!$message->hasErrors())
	{
		$attachapi->insert();

		$obsoletes = $input->inputClean('obsoletes', TYPE_UINT);

		$notif->sendNewAttachmentNotice($attachapi->values, $obsoletes, $attachapi->insertid);

		// mark obsoletes
		if (is_array($obsoletes) AND sizeof($obsoletes) > 0)
		{
			$db->query("UPDATE " . TABLE_PREFIX . "attachment SET obsolete = 1 WHERE attachmentid IN (" . implode(',', $obsoletes) . ") AND !obsolete AND bugid = $bug[bugid]");

			foreach ($obsoletes as $attachmentid)
			{
				$log = new Logging;
				$log->setBugId($bug['bugid']);
				$log->setAttachmentId($attachmentid);
				$log->addData(true, array('obsolete' => 0), array('obsolete'), false, 'attachment');
				$log->addData(false, array('obsolete' => 1), array('obsolete'), false, 'attachment');
				$log->updateHistory();
			}
		}

		// handle comment stuff
		if (can_perform('canpostcomments', $bug['product']) AND trim($input->in['comment']))
		{
			$comment = new CommentAPI();
			$comment->set('bugid',		$input->in['bugid']);
			$comment->set('userid',		bugdar::$userinfo['userid']);
			$comment->set('comment',	$input->in['comment']);
			$comment->set('dateline',	$attachapi->values['dateline']);
			$comment->insert();

			$notif->sendNewCommentNotice($comment->values);
		}

		// update the last post data
		$db->query("UPDATE " . TABLE_PREFIX . "bug SET lastposttime = " . $attachapi->values['dateline'] . ", hiddenlastposttime = " . $attachapi->values['dateline'] . ", lastpostby = " . bugdar::$userinfo['userid'] . ", hiddenlastpostby = " . bugdar::$userinfo['userid'] . " WHERE bugid = $bug[bugid]");

		$notif->finalize();

		$message->redirect(T('The attachment has been added to the bug.'), "showreport.php?bugid=$bug[bugid]");
	}
	else
	{
		$show['errors'] = true;
		$_REQUEST['do'] = 'add';
	}
}

// ###################################################################

if ($_REQUEST['do'] == 'add')
{
	if (!can_perform('canputattach', $bug['product']))
	{
		$message->errorPermission();
	}

	$MAXFILESIZE = BSFunctions::fetch_max_php_file_size();

	$show['addcomment'] = ((can_perform('canpostcomments', $bug['product'])) ? true : false);
	$show['obsoletes'] = false;

	$obsoletes_fetch = $db->query("SELECT * FROM " . TABLE_PREFIX . "attachment WHERE bugid = $bug[bugid] AND !obsolete");
	$obsoletes = '';
	foreach ($obsoletes_fetch as $obsolete)
	{
		$show['obsoletes'] = true;
		$obsoletes .= "<div><input name=\"obsoletes[]\" type=\"checkbox\" value=\"$obsolete[attachmentid]\"" . (is_array($input->in['obsoletes']) AND in_array($obsolete['attachmentid'], $input->in['obsoletes']) ? ' checked="checked"' : '') . " /> $obsolete[filename]" . ($obsolete['description'] ? " [$obsolete[description]]" : '') . "</div>\n";
	}

	$tpl = new BSTemplate('newattach');
	$tpl->vars = array(
		'bug'			=> $bug,
		'message'		=> $message,
		'MAXFILESIZE'	=> $MAXFILESIZE,
		'obsoletes'		=> $obsoletes,
		'input'			=> $input
	);
	$tpl->evaluate()->flush();
}

// ###################################################################

if ($_POST['do'] == 'update')
{
	if (!(can_perform('caneditattach', $bug['product']) OR ($attachment['userid'] == bugdar::$userinfo['userid'] AND can_perform('canputattach', $bug['product']))))
	{
		$message->errorPermission();
	}

	$attachapi = new AttachmentAPI();
	$attachapi->set('attachmentid',	$input->in['attachmentid']);

	if ($input->in['__delete__'] != '')
	{
		if (!(can_perform('caneditattach', $bug['product']) AND can_perform('candeletedata', $bug['productid'])))
		{
			$message->errorPermission();
		}

		$attachapi->remove();

		$message->redirect(T('The attachment was successfully deleted.'), "showreport.php?bugid=$bug[bugid]");
	}
	else
	{
		$log = new Logging();
		$log->setBugId($bug['bugid']);
		$log->setAttachmentId($input->in['attachmentid']);

		$attachapi->fetch();

		$log->addData(true, $attachapi->record, array('attachment'), true, 'attachment');

		$attachapi->set('description',	$input->in['description']);
		$attachapi->set('obsolete',		$input->in['obsolete']);
		$attachapi->update();

		$log->addData(false, $attachapi->values, array('attachment'), true, 'attachment');

		$log->updateHistory();

		$message->redirect(T('The attachment was successfully modified.'), "showreport.php?bugid=$bug[bugid]");
	}
}

// ###################################################################

if ($_REQUEST['do'] == 'edit')
{
	if (!(can_perform('caneditattach', $bug['product']) OR ($attachment['userid'] == bugdar::$userinfo['userid'] AND can_perform('canputattach', $bug['product']))))
	{
		$message->errorPermission();
	}

	$show['delete'] = (can_perform('caneditattach', $bug['product']) AND can_perform('candeletedata', $bug['productid']));

	$tpl = new BSTemplate('editattach');
	$tpl->vars = array(
		'attachment'	=> $attachment,
		'bug'			=> $bug
	);
	$tpl->evaluate()->flush();
}

?>