'Toegewezen aan',
'subject' => 'Onderwerp',
];
function userupload($input, $target = NULL, $filename = NULL)
{
switch ($input['error']) {
case UPLOAD_ERR_OK:
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
throw new Exception('bestand te groot');
break;
case UPLOAD_ERR_NO_FILE:
return; # current
default:
throw new Exception('bestand niet goed ontvangen: '.$input['error']);
}
if (isset($target)) {
if (!file_exists($target) and !@mkdir($target, 0777, TRUE)) {
throw new Exception("bestand kon niet geplaatst worden in $target");
}
$target .= '/';
}
if (isset($filename)) {
$target .= $filename;
}
else {
$target .= $input['name'];
}
if (file_exists($target)) {
throw new Exception("bestandsnaam al aanwezig op $target");
}
if (!@move_uploaded_file($input['tmp_name'], $target)) {
throw new Exception("bestand kon niet worden opgeslagen in $target");
}
foreach (@glob('thumb/*/') as $thumbres) {
# attempt to remove old derivations
@unlink($thumbres . '/' . $target);
}
return $target;
}
function messagehtml($input)
{
# convert user textarea post to formatted html
global $User;
if (empty($input)) {
return;
}
if ($User and $User->admin and preg_match('/\A<[a-z][^>]*>/', $input)) {
return $input; # allow html input as is if privileged
}
$markup = [
'{<((?:\w+:|/).+?)>}' => '<$1>', # unescape link entities
'{<(?:https?://)?([^>\s|]+)>}' => '<$1 $1>', # unnamed link
'{<([^>\s|]+)[\s|]([^>]+)>}' => '$2', # hyperlink
"/\r\n?/" => "\n", # unix newlines
"/ +\n/" => "
", # trailing spaces for hard line break
"/^[-*] (.*)$\n?/m" => '
$1
\n", # paragraph "{^(
$1
', # monospace
];
return preg_replace(array_keys($markup), array_values($markup), htmlspecialchars($input));
}
function createcomment($input, &$Issue = NULL)
{
# insert user message as database issue/reply
global $User, $Db, $Page, $journalcol;
$reply = [];
if (isset($input['reply']) and $body = $input['reply']) {
$reply['raw'] = $body;
$reply['message'] = messagehtml($body);
}
if (isset($input['announce'])) {
$reply['announced'] = !!$input['announce'];
}
if ($_FILES and !empty($_FILES['image'])) {
$target = 'data/upload';
if (!file_exists($target)) {
throw new Exception("er is geen uploadmap aanwezig op $target");
}
$target .= '/' . $User->login;
if ($result = userupload($_FILES['image'], $target)) {
$reply['raw'] .= "/$result";
if (preg_match('(^image/)', $_FILES['image']['type'])) {
$reply['message'] .= sprintf('', $result);
}
else {
$reply['message'] .= sprintf('',
$result, basename($result)
);
}
}
}
$query = $Db->set('comments', $reply + [
'page' => "{$Page->handler}/{$Issue->id}",
'author' => $User->login,
]);
if (!$query->rowCount()) {
throw new Exception('Fout bij opslaan');
}
$newcomment = $Db->dbh->lastInsertId('comments_id_seq');
if (isset($Issue)) {
$row = [];
foreach (array_keys($journalcol) as $col) {
if (!isset($input[$col])) continue;
$row[$col] = $input[$col] ?: NULL;
}
if (isset($input['status'])) {
$reset = !empty($input['status']);
if (isset($Issue->closed) !== $reset) {
$row['closed'] = $reset ? ['now()'] : NULL;
}
}
$derived = ['updated' => ['now()']];
$filter = ['id = ? RETURNING *', $Issue->id];
$subquery = $Db->set('issues', $row + $derived, $filter);
if ($updated = $subquery->fetch()) {
foreach (array_keys($row) as $col) {
if ($updated->$col === $Issue->$col) continue; # unaltered
$Db->set('journal', [
'comment_id' => $newcomment,
'property' => 'attr',
'col' => $col,
'old_value' => $Issue->$col,
'value' => $updated->$col,
]);
}
$Issue = $updated;
}
}
return $newcomment;
}