New exception style; split long lines in php

This commit is contained in:
Marcin Kurczewski 2014-04-27 14:42:39 +02:00
parent cc51d943e2
commit f495774be4
17 changed files with 192 additions and 80 deletions

View file

@ -84,7 +84,9 @@ class CommentController
$comment = CommentModel::findById($id); $comment = CommentModel::findById($id);
$this->context->transport->comment = $comment; $this->context->transport->comment = $comment;
PrivilegesHelper::confirmWithException(Privilege::EditComment, PrivilegesHelper::getIdentitySubPrivilege($comment->getCommenter())); PrivilegesHelper::confirmWithException(
Privilege::EditComment,
PrivilegesHelper::getIdentitySubPrivilege($comment->getCommenter()));
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
@ -113,7 +115,10 @@ class CommentController
{ {
$comment = CommentModel::findById($id); $comment = CommentModel::findById($id);
PrivilegesHelper::confirmWithException(Privilege::DeleteComment, PrivilegesHelper::getIdentitySubPrivilege($comment->getCommenter())); PrivilegesHelper::confirmWithException(
Privilege::DeleteComment,
PrivilegesHelper::getIdentitySubPrivilege($comment->getCommenter()));
CommentModel::remove($comment); CommentModel::remove($comment);
LogHelper::log('{user} removed comment from {post}', ['post' => TextHelper::reprPost($comment->getPost())]); LogHelper::log('{user} removed comment from {post}', ['post' => TextHelper::reprPost($comment->getPost())]);

View file

@ -14,7 +14,9 @@ class IndexController
{ {
$this->context->featuredPost = $featuredPost; $this->context->featuredPost = $featuredPost;
$this->context->featuredPostDate = PropertyModel::get(PropertyModel::FeaturedPostDate); $this->context->featuredPostDate = PropertyModel::get(PropertyModel::FeaturedPostDate);
$this->context->featuredPostUser = UserModel::findByNameOrEmail(PropertyModel::get(PropertyModel::FeaturedPostUserName), false); $this->context->featuredPostUser = UserModel::findByNameOrEmail(
PropertyModel::get(PropertyModel::FeaturedPostUserName),
false);
} }
} }

View file

@ -63,7 +63,12 @@ class LogController
$lines = array_reverse($lines); $lines = array_reverse($lines);
if (!empty($filter)) if (!empty($filter))
$lines = array_filter($lines, function($line) use ($filter) { return stripos($line, $filter) !== false; }); {
$lines = array_filter($lines, function($line) use ($filter)
{
return stripos($line, $filter) !== false;
});
}
$lineCount = count($lines); $lineCount = count($lines);
$logsPerPage = intval($this->config->browsing->logsPerPage); $logsPerPage = intval($this->config->browsing->logsPerPage);

View file

@ -7,20 +7,28 @@ class PostController
{ {
case UPLOAD_ERR_OK: case UPLOAD_ERR_OK:
break; break;
case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_INI_SIZE:
throw new SimpleException('File is too big (maximum size allowed: ' . ini_get('upload_max_filesize') . ')'); throw new SimpleException('File is too big (maximum size: %s)', ini_get('upload_max_filesize'));
case UPLOAD_ERR_FORM_SIZE: case UPLOAD_ERR_FORM_SIZE:
throw new SimpleException('File is too big than it was allowed in HTML form'); throw new SimpleException('File is too big than it was allowed in HTML form');
case UPLOAD_ERR_PARTIAL: case UPLOAD_ERR_PARTIAL:
throw new SimpleException('File transfer was interrupted'); throw new SimpleException('File transfer was interrupted');
case UPLOAD_ERR_NO_FILE: case UPLOAD_ERR_NO_FILE:
throw new SimpleException('No file was uploaded'); throw new SimpleException('No file was uploaded');
case UPLOAD_ERR_NO_TMP_DIR: case UPLOAD_ERR_NO_TMP_DIR:
throw new SimpleException('Server misconfiguration error: missing temporary folder'); throw new SimpleException('Server misconfiguration error: missing temporary folder');
case UPLOAD_ERR_CANT_WRITE: case UPLOAD_ERR_CANT_WRITE:
throw new SimpleException('Server misconfiguration error: cannot write to disk'); throw new SimpleException('Server misconfiguration error: cannot write to disk');
case UPLOAD_ERR_EXTENSION: case UPLOAD_ERR_EXTENSION:
throw new SimpleException('Server misconfiguration error: upload was canceled by an extension'); throw new SimpleException('Server misconfiguration error: upload was canceled by an extension');
default: default:
throw new SimpleException('Generic file upload error (id: ' . $file['error'] . ')'); throw new SimpleException('Generic file upload error (id: ' . $file['error'] . ')');
} }
@ -57,7 +65,11 @@ class PostController
$this->context->transport->lastSearchQuery = $formQuery; $this->context->transport->lastSearchQuery = $formQuery;
if (strpos($formQuery, '/') !== false) if (strpos($formQuery, '/') !== false)
throw new SimpleException('Search query contains invalid characters'); throw new SimpleException('Search query contains invalid characters');
$url = \Chibi\UrlHelper::route('post', 'list', ['source' => $source, 'additionalInfo' => $additionalInfo, 'query' => $formQuery]);
$url = \Chibi\UrlHelper::route('post', 'list', [
'source' => $source,
'additionalInfo' => $additionalInfo,
'query' => $formQuery]);
\Chibi\UrlHelper::forward($url); \Chibi\UrlHelper::forward($url);
return; return;
} }
@ -107,7 +119,9 @@ class PostController
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
PrivilegesHelper::confirmWithException(Privilege::MassTag, PrivilegesHelper::getIdentitySubPrivilege($post->getUploader())); PrivilegesHelper::confirmWithException(
Privilege::MassTag,
PrivilegesHelper::getIdentitySubPrivilege($post->getUploader()));
$tags = $post->getTags(); $tags = $post->getTags();
@ -116,7 +130,10 @@ class PostController
foreach ($tags as $i => $tag) foreach ($tags as $i => $tag)
if ($tag->name == $tagName) if ($tag->name == $tagName)
unset($tags[$i]); unset($tags[$i]);
LogHelper::log('{user} untagged {post} with {tag}', ['post' => TextHelper::reprPost($post), 'tag' => TextHelper::reprTag($tag)]);
LogHelper::log('{user} untagged {post} with {tag}', [
'post' => TextHelper::reprPost($post),
'tag' => TextHelper::reprTag($tag)]);
} }
elseif ($enable) elseif ($enable)
{ {
@ -129,7 +146,9 @@ class PostController
} }
$tags []= $tag; $tags []= $tag;
LogHelper::log('{user} tagged {post} with {tag}', ['post' => TextHelper::reprPost($post), 'tag' => TextHelper::reprTag($tag)]); LogHelper::log('{user} tagged {post} with {tag}', [
'post' => TextHelper::reprPost($post),
'tag' => TextHelper::reprTag($tag)]);
} }
$post->setTags($tags); $post->setTags($tags);

View file

@ -111,7 +111,10 @@ class TagController
TagModel::merge($suppliedSourceTag, $suppliedTargetTag); TagModel::merge($suppliedSourceTag, $suppliedTargetTag);
LogHelper::log('{user} merged {source} with {target}', ['source' => TextHelper::reprTag($suppliedSourceTag), 'target' => TextHelper::reprTag($suppliedTargetTag)]); LogHelper::log('{user} merged {source} with {target}', [
'source' => TextHelper::reprTag($suppliedSourceTag),
'target' => TextHelper::reprTag($suppliedTargetTag)]);
StatusHelper::success('Tags merged successfully.'); StatusHelper::success('Tags merged successfully.');
} }
} }
@ -137,7 +140,10 @@ class TagController
TagModel::rename($suppliedSourceTag, $suppliedTargetTag); TagModel::rename($suppliedSourceTag, $suppliedTargetTag);
LogHelper::log('{user} renamed {source} to {target}', ['source' => TextHelper::reprTag($suppliedSourceTag), 'target' => TextHelper::reprTag($suppliedTargetTag)]); LogHelper::log('{user} renamed {source} to {target}', [
'source' => TextHelper::reprTag($suppliedSourceTag),
'target' => TextHelper::reprTag($suppliedTargetTag)]);
StatusHelper::success('Tag renamed successfully.'); StatusHelper::success('Tag renamed successfully.');
} }
} }

View file

@ -43,11 +43,13 @@ class UserController
if (empty($recipientEmail)) if (empty($recipientEmail))
throw new SimpleException('Destination e-mail address was not found'); throw new SimpleException('Destination e-mail address was not found');
$messageId = $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['HTTP_HOST'];
$headers = []; $headers = [];
$headers []= sprintf('MIME-Version: 1.0'); $headers []= sprintf('MIME-Version: 1.0');
$headers []= sprintf('Content-Transfer-Encoding: 7bit'); $headers []= sprintf('Content-Transfer-Encoding: 7bit');
$headers []= sprintf('Date: %s', date('r', $_SERVER['REQUEST_TIME'])); $headers []= sprintf('Date: %s', date('r', $_SERVER['REQUEST_TIME']));
$headers []= sprintf('Message-ID: <%s>', $_SERVER['REQUEST_TIME'] . md5($_SERVER['REQUEST_TIME']) . '@' . $_SERVER['HTTP_HOST']); $headers []= sprintf('Message-ID: <%s>', $messageId);
$headers []= sprintf('From: %s <%s>', $senderName, $senderEmail); $headers []= sprintf('From: %s <%s>', $senderName, $senderEmail);
$headers []= sprintf('Reply-To: %s', $senderEmail); $headers []= sprintf('Reply-To: %s', $senderEmail);
$headers []= sprintf('Return-Path: %s', $senderEmail); $headers []= sprintf('Return-Path: %s', $senderEmail);
@ -58,7 +60,9 @@ class UserController
$encodedSubject = '=?UTF-8?B?' . base64_encode($subject) . '?='; $encodedSubject = '=?UTF-8?B?' . base64_encode($subject) . '?=';
mail($recipientEmail, $encodedSubject, $body, implode("\r\n", $headers), '-f' . $senderEmail); mail($recipientEmail, $encodedSubject, $body, implode("\r\n", $headers), '-f' . $senderEmail);
LogHelper::log('Sending e-mail with subject "{subject}" to {mail}', ['subject' => $subject, 'mail' => $recipientEmail]); LogHelper::log('Sending e-mail with subject "{subject}" to {mail}', [
'subject' => $subject,
'mail' => $recipientEmail]);
} }
private static function sendEmailChangeConfirmation($user) private static function sendEmailChangeConfirmation($user)
@ -107,7 +111,8 @@ class UserController
*/ */
public function listAction($filter, $page) public function listAction($filter, $page)
{ {
PrivilegesHelper::confirmWithException(Privilege::ListUsers); PrivilegesHelper::confirmWithException(
Privilege::ListUsers);
$suppliedFilter = $filter ?: InputHelper::get('filter') ?: 'order:alpha,asc'; $suppliedFilter = $filter ?: InputHelper::get('filter') ?: 'order:alpha,asc';
$page = max(1, intval($page)); $page = max(1, intval($page));
@ -137,7 +142,9 @@ class UserController
public function flagAction($name) public function flagAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::FlagUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::FlagUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
@ -149,7 +156,9 @@ class UserController
$flagged []= $key; $flagged []= $key;
SessionHelper::set('flagged', $flagged); SessionHelper::set('flagged', $flagged);
LogHelper::log('{user} flagged {subject} for moderator attention', ['subject' => TextHelper::reprUser($user)]); LogHelper::log('{user} flagged {subject} for moderator attention', [
'subject' => TextHelper::reprUser($user)]);
StatusHelper::success(); StatusHelper::success();
} }
} }
@ -163,7 +172,9 @@ class UserController
public function banAction($name) public function banAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::BanUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::BanUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
@ -184,7 +195,9 @@ class UserController
public function unbanAction($name) public function unbanAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::BanUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::BanUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
@ -205,7 +218,9 @@ class UserController
public function acceptRegistrationAction($name) public function acceptRegistrationAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::AcceptUserRegistration); PrivilegesHelper::confirmWithException(
Privilege::AcceptUserRegistration);
if (InputHelper::get('submit')) if (InputHelper::get('submit'))
{ {
$user->staffConfirmed = true; $user->staffConfirmed = true;
@ -224,8 +239,12 @@ class UserController
public function deleteAction($name) public function deleteAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::ViewUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
PrivilegesHelper::confirmWithException(Privilege::DeleteUser, PrivilegesHelper::getIdentitySubPrivilege($user)); Privilege::ViewUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
PrivilegesHelper::confirmWithException(
Privilege::DeleteUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
$this->loadUserView($user); $this->loadUserView($user);
$this->context->transport->tab = 'delete'; $this->context->transport->tab = 'delete';
@ -262,8 +281,12 @@ class UserController
public function settingsAction($name) public function settingsAction($name)
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::ViewUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
PrivilegesHelper::confirmWithException(Privilege::ChangeUserSettings, PrivilegesHelper::getIdentitySubPrivilege($user)); Privilege::ViewUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
PrivilegesHelper::confirmWithException(
Privilege::ChangeUserSettings,
PrivilegesHelper::getIdentitySubPrivilege($user));
$this->loadUserView($user); $this->loadUserView($user);
$this->context->transport->tab = 'settings'; $this->context->transport->tab = 'settings';
@ -300,7 +323,9 @@ class UserController
try try
{ {
$user = UserModel::findByNameOrEmail($name); $user = UserModel::findByNameOrEmail($name);
PrivilegesHelper::confirmWithException(Privilege::ViewUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ViewUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
$this->loadUserView($user); $this->loadUserView($user);
$this->context->transport->tab = 'edit'; $this->context->transport->tab = 'edit';
@ -320,16 +345,24 @@ class UserController
if ($suppliedName != '' and $suppliedName != $user->name) if ($suppliedName != '' and $suppliedName != $user->name)
{ {
PrivilegesHelper::confirmWithException(Privilege::ChangeUserName, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ChangeUserName,
PrivilegesHelper::getIdentitySubPrivilege($user));
$suppliedName = UserModel::validateUserName($suppliedName); $suppliedName = UserModel::validateUserName($suppliedName);
$oldName = $user->name; $oldName = $user->name;
$user->name = $suppliedName; $user->name = $suppliedName;
LogHelper::log('{user} renamed {old} to {new}', ['old' => TextHelper::reprUser($oldName), 'new' => TextHelper::reprUser($suppliedName)]); LogHelper::log('{user} renamed {old} to {new}', [
'old' => TextHelper::reprUser($oldName),
'new' => TextHelper::reprUser($suppliedName)]);
} }
if ($suppliedPassword1 != '') if ($suppliedPassword1 != '')
{ {
PrivilegesHelper::confirmWithException(Privilege::ChangeUserPassword, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ChangeUserPassword,
PrivilegesHelper::getIdentitySubPrivilege($user));
if ($suppliedPassword1 != $suppliedPassword2) if ($suppliedPassword1 != $suppliedPassword2)
throw new SimpleException('Specified passwords must be the same'); throw new SimpleException('Specified passwords must be the same');
$suppliedPassword = UserModel::validatePassword($suppliedPassword1); $suppliedPassword = UserModel::validatePassword($suppliedPassword1);
@ -339,7 +372,10 @@ class UserController
if ($suppliedEmail != '' and $suppliedEmail != $user->emailConfirmed) if ($suppliedEmail != '' and $suppliedEmail != $user->emailConfirmed)
{ {
PrivilegesHelper::confirmWithException(Privilege::ChangeUserEmail, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ChangeUserEmail,
PrivilegesHelper::getIdentitySubPrivilege($user));
$suppliedEmail = UserModel::validateEmail($suppliedEmail); $suppliedEmail = UserModel::validateEmail($suppliedEmail);
if ($this->context->user->id == $user->id) if ($this->context->user->id == $user->id)
{ {
@ -352,16 +388,23 @@ class UserController
{ {
$user->emailUnconfirmed = null; $user->emailUnconfirmed = null;
$user->emailConfirmed = $suppliedEmail; $user->emailConfirmed = $suppliedEmail;
LogHelper::log('{user} changed {subject}\'s e-mail to {mail}', ['subject' => TextHelper::reprUser($user), 'mail' => $suppliedEmail]); LogHelper::log('{user} changed {subject}\'s e-mail to {mail}', [
'subject' => TextHelper::reprUser($user),
'mail' => $suppliedEmail]);
} }
} }
if ($suppliedAccessRank != '' and $suppliedAccessRank != $user->accessRank) if ($suppliedAccessRank != '' and $suppliedAccessRank != $user->accessRank)
{ {
PrivilegesHelper::confirmWithException(Privilege::ChangeUserAccessRank, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ChangeUserAccessRank,
PrivilegesHelper::getIdentitySubPrivilege($user));
$suppliedAccessRank = UserModel::validateAccessRank($suppliedAccessRank); $suppliedAccessRank = UserModel::validateAccessRank($suppliedAccessRank);
$user->accessRank = $suppliedAccessRank; $user->accessRank = $suppliedAccessRank;
LogHelper::log('{user} changed {subject}\'s access rank to {rank}', ['subject' => TextHelper::reprUser($user), 'rank' => AccessRank::toString($suppliedAccessRank)]); LogHelper::log('{user} changed {subject}\'s access rank to {rank}', [
'subject' => TextHelper::reprUser($user),
'rank' => AccessRank::toString($suppliedAccessRank)]);
} }
if ($this->context->user->id == $user->id) if ($this->context->user->id == $user->id)
@ -409,7 +452,10 @@ class UserController
if ($page === null) if ($page === null)
$page = 1; $page = 1;
PrivilegesHelper::confirmWithException(Privilege::ViewUser, PrivilegesHelper::getIdentitySubPrivilege($user)); PrivilegesHelper::confirmWithException(
Privilege::ViewUser,
PrivilegesHelper::getIdentitySubPrivilege($user));
$this->loadUserView($user); $this->loadUserView($user);
$query = ''; $query = '';
@ -443,7 +489,9 @@ class UserController
*/ */
public function toggleSafetyAction($safety) public function toggleSafetyAction($safety)
{ {
PrivilegesHelper::confirmWithException(Privilege::ChangeUserSettings, PrivilegesHelper::getIdentitySubPrivilege($this->context->user)); PrivilegesHelper::confirmWithException(
Privilege::ChangeUserSettings,
PrivilegesHelper::getIdentitySubPrivilege($this->context->user));
if (!in_array($safety, PostSafety::getAll())) if (!in_array($safety, PostSafety::getAll()))
throw new SimpleExcetpion('Invalid safety'); throw new SimpleExcetpion('Invalid safety');

View file

@ -34,7 +34,7 @@ abstract class AbstractCrudModel implements IModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid ' . static::getTableName() . ' ID "' . $key . '"'); throw new SimpleNotFoundException('Invalid %s ID "%s"', static::getTableName(), $key);
return null; return null;
} }

View file

@ -93,10 +93,10 @@ class CommentModel extends AbstractCrudModel
$config = \Chibi\Registry::getConfig(); $config = \Chibi\Registry::getConfig();
if (strlen($text) < $config->comments->minLength) if (strlen($text) < $config->comments->minLength)
throw new SimpleException(sprintf('Comment must have at least %d characters', $config->comments->minLength)); throw new SimpleException('Comment must have at least %d characters', $config->comments->minLength);
if (strlen($text) > $config->comments->maxLength) if (strlen($text) > $config->comments->maxLength)
throw new SimpleException(sprintf('Comment must have at most %d characters', $config->comments->maxLength)); throw new SimpleException('Comment must have at most %d characters', $config->comments->maxLength);
return $text; return $text;
} }

View file

@ -115,7 +115,7 @@ class PostEntity extends AbstractEntity
continue; continue;
if (count($relatedPosts) > $config->browsing->maxRelatedPosts) if (count($relatedPosts) > $config->browsing->maxRelatedPosts)
throw new SimpleException('Too many related posts (maximum: ' . $config->browsing->maxRelatedPosts . ')'); throw new SimpleException('Too many related posts (maximum: %d)', $config->browsing->maxRelatedPosts);
$relatedPosts []= PostModel::findById($relatedId); $relatedPosts []= PostModel::findById($relatedId);
} }
@ -219,13 +219,13 @@ class PostEntity extends AbstractEntity
$mimeType = mime_content_type($srcPath); $mimeType = mime_content_type($srcPath);
if (!in_array($mimeType, ['image/gif', 'image/png', 'image/jpeg'])) if (!in_array($mimeType, ['image/gif', 'image/png', 'image/jpeg']))
throw new SimpleException('Invalid thumbnail type "' . $mimeType . '"'); throw new SimpleException('Invalid thumbnail type "%s"', $mimeType);
list ($imageWidth, $imageHeight) = getimagesize($srcPath); list ($imageWidth, $imageHeight) = getimagesize($srcPath);
if ($imageWidth != $config->browsing->thumbWidth) if ($imageWidth != $config->browsing->thumbWidth)
throw new SimpleException('Invalid thumbnail width (should be ' . $config->browsing->thumbWidth . ')'); throw new SimpleException('Invalid thumbnail width (should be %d)', $config->browsing->thumbWidth);
if ($imageHeight != $config->browsing->thumbHeight) if ($imageHeight != $config->browsing->thumbHeight)
throw new SimpleException('Invalid thumbnail height (should be ' . $config->browsing->thumbHeight . ')'); throw new SimpleException('Invalid thumbnail height (should be %d)', $config->browsing->thumbHeight);
$dstPath = $this->getThumbCustomPath(); $dstPath = $this->getThumbCustomPath();
@ -264,7 +264,13 @@ class PostEntity extends AbstractEntity
case 'application/x-shockwave-flash': case 'application/x-shockwave-flash':
$srcImage = null; $srcImage = null;
$tmpPath = tempnam(sys_get_temp_dir(), 'thumb') . '.png'; $tmpPath = tempnam(sys_get_temp_dir(), 'thumb') . '.png';
exec('dump-gnash --screenshot last --screenshot-file "' . $tmpPath . '" -1 -r1 --max-advances 15 "' . $srcPath . '"');
$cmd = sprintf(
'dump-gnash --screenshot last --screenshot-file "%s" -1 -r1 --max-advances 15 "%s"',
$tmpPath,
$srcPath);
exec($cmd);
if (file_exists($tmpPath)) if (file_exists($tmpPath))
$srcImage = imagecreatefrompng($tmpPath); $srcImage = imagecreatefrompng($tmpPath);
@ -285,13 +291,24 @@ class PostEntity extends AbstractEntity
case 'video/3gpp': case 'video/3gpp':
$srcImage = null; $srcImage = null;
$tmpPath = tempnam(sys_get_temp_dir(), 'thumb') . '.png'; $tmpPath = tempnam(sys_get_temp_dir(), 'thumb') . '.png';
exec('ffmpegthumbnailer -i"' . $srcPath . '" -o"' . $tmpPath . '" -s0 -t"12%"');
$cmd = sprintf(
'ffmpegthumbnailer -i"%s" -o"%s" -s0 -t"12%"',
$srcPath,
$tmpPath);
exec($cmd);
if (file_exists($tmpPath)) if (file_exists($tmpPath))
$srcImage = imagecreatefrompng($tmpPath); $srcImage = imagecreatefrompng($tmpPath);
if (!$srcImage) if (!$srcImage)
{ {
exec('ffmpeg -i "' . $srcPath . '" -vframes 1 "' . $tmpPath . '"'); exec($cmd);
$cmd = sprintf(
'ffmpeg -i "%s" -vframes 1 "%s"',
$srcPath,
$tmpPath);
if (file_exists($tmpPath)) if (file_exists($tmpPath))
$srcImage = imagecreatefrompng($tmpPath); $srcImage = imagecreatefrompng($tmpPath);
} }
@ -365,12 +382,12 @@ class PostEntity extends AbstractEntity
$this->imageHeight = $imageHeight; $this->imageHeight = $imageHeight;
break; break;
default: default:
throw new SimpleException('Invalid file type "' . $this->mimeType . '"'); throw new SimpleException('Invalid file type "%s"', $this->mimeType);
} }
$duplicatedPost = PostModel::findByHash($this->fileHash, false); $duplicatedPost = PostModel::findByHash($this->fileHash, false);
if ($duplicatedPost !== null and (!$this->id or $this->id != $duplicatedPost->id)) if ($duplicatedPost !== null and (!$this->id or $this->id != $duplicatedPost->id))
throw new SimpleException('Duplicate upload: @' . $duplicatedPost->id); throw new SimpleException('Duplicate upload: %s', TextHelper::reprPost($duplicatedPost));
$dstPath = $this->getFullPath(); $dstPath = $this->getFullPath();
@ -387,7 +404,7 @@ class PostEntity extends AbstractEntity
public function setContentFromUrl($srcUrl) public function setContentFromUrl($srcUrl)
{ {
if (!preg_match('/^https?:\/\//', $srcUrl)) if (!preg_match('/^https?:\/\//', $srcUrl))
throw new SimpleException('Invalid URL "' . $srcUrl . '"'); throw new SimpleException('Invalid URL "%s"', $srcUrl);
if (preg_match('/youtube.com\/watch.*?=([a-zA-Z0-9_-]+)/', $srcUrl, $matches)) if (preg_match('/youtube.com\/watch.*?=([a-zA-Z0-9_-]+)/', $srcUrl, $matches))
{ {
@ -405,7 +422,7 @@ class PostEntity extends AbstractEntity
$duplicatedPost = PostModel::findByHash($youtubeId, false); $duplicatedPost = PostModel::findByHash($youtubeId, false);
if ($duplicatedPost !== null and (!$this->id or $this->id != $duplicatedPost->id)) if ($duplicatedPost !== null and (!$this->id or $this->id != $duplicatedPost->id))
throw new SimpleException('Duplicate upload: @' . $duplicatedPost->id); throw new SimpleException('Duplicate upload: %s' . TextHelper::reprPost($duplicatedPost));
return; return;
} }
@ -434,7 +451,7 @@ class PostEntity extends AbstractEntity
throw new SimpleException('Cannot write into file'); throw new SimpleException('Cannot write into file');
fflush($srcFP); fflush($srcFP);
if (ftell($srcFP) > $maxBytes) if (ftell($srcFP) > $maxBytes)
throw new SimpleException('File is too big (maximum allowed size: ' . TextHelper::useBytesUnits($maxBytes) . ')'); throw new SimpleException('File is too big (maximum size: %s)', TextHelper::useBytesUnits($maxBytes));
} }
} }
finally finally

View file

@ -146,7 +146,7 @@ class PostModel extends AbstractCrudModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid post name "' . $key . '"'); throw new SimpleNotFoundException('Invalid post name "%s"', $key);
return null; return null;
} }
@ -171,7 +171,7 @@ class PostModel extends AbstractCrudModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid post hash "' . $hash . '"'); throw new SimpleNotFoundException('Invalid post hash "%s"', $hash);
return null; return null;
} }
@ -267,7 +267,7 @@ class PostModel extends AbstractCrudModel
$safety = intval($safety); $safety = intval($safety);
if (!in_array($safety, PostSafety::getAll())) if (!in_array($safety, PostSafety::getAll()))
throw new SimpleException('Invalid safety type "' . $safety . '"'); throw new SimpleException('Invalid safety type "%s"', $safety);
return $safety; return $safety;
} }
@ -278,7 +278,7 @@ class PostModel extends AbstractCrudModel
$maxLength = 200; $maxLength = 200;
if (strlen($source) > $maxLength) if (strlen($source) > $maxLength)
throw new SimpleException('Source must have at most ' . $maxLength . ' characters'); throw new SimpleException('Source must have at most %d characters', $maxLength);
return $source; return $source;
} }

View file

@ -35,13 +35,13 @@ abstract class AbstractSearchParser
else else
{ {
if (!$this->processComplexToken($key, $value, $neg)) if (!$this->processComplexToken($key, $value, $neg))
throw new SimpleException('Invalid search token: ' . $key); throw new SimpleException('Invalid search token "%s"', $key);
} }
} }
else else
{ {
if (!$this->processSimpleToken($token, $neg)) if (!$this->processSimpleToken($token, $neg))
throw new SimpleException('Invalid search token: ' . $token); throw new SimpleException('Invalid search token "%s"', $token);
} }
} }
$this->processTeardown(); $this->processTeardown();
@ -62,7 +62,7 @@ abstract class AbstractSearchParser
$arr []= 'desc'; $arr []= 'desc';
if (count($arr) != 2) if (count($arr) != 2)
throw new SimpleException('Invalid search order token: ' . $orderToken); throw new SimpleException('Invalid search order token "%s"', $orderToken);
$orderByString = strtolower(array_shift($arr)); $orderByString = strtolower(array_shift($arr));
$orderDirString = strtolower(array_shift($arr)); $orderDirString = strtolower(array_shift($arr));
@ -71,7 +71,7 @@ abstract class AbstractSearchParser
elseif ($orderDirString == 'desc') elseif ($orderDirString == 'desc')
$orderDir = Sql\SelectStatement::ORDER_DESC; $orderDir = Sql\SelectStatement::ORDER_DESC;
else else
throw new SimpleException('Invalid search order direction: ' . $searchOrderDir); throw new SimpleException('Invalid search order direction "%s"', $searchOrderDir);
if ($neg) if ($neg)
{ {
@ -81,7 +81,7 @@ abstract class AbstractSearchParser
} }
if (!$this->processOrderToken($orderByString, $orderDir)) if (!$this->processOrderToken($orderByString, $orderDir))
throw new SimpleException('Invalid search order type: ' . $orderByString); throw new SimpleException('Invalid search order type "%s"', $orderByString);
} }
protected function processComplexToken($key, $value, $neg) protected function processComplexToken($key, $value, $neg)

View file

@ -6,13 +6,15 @@ class CommentSearchParser extends AbstractSearchParser
protected function processSetup(&$tokens) protected function processSetup(&$tokens)
{ {
$this->statement->addInnerJoin('post', new Sql\EqualsFunctor('post_id', 'post.id')); $this->statement->addInnerJoin('post', new Sql\EqualsFunctor('post_id', 'post.id'));
$crit = new Sql\ConjunctionFunctor();
$allowedSafety = PrivilegesHelper::getAllowedSafety(); $allowedSafety = PrivilegesHelper::getAllowedSafety();
$this->statement->setCriterion(new Sql\ConjunctionFunctor()); $crit->add(Sql\InFunctor::fromArray('post.safety', Sql\Binding::fromArray($allowedSafety)));
$this->statement->getCriterion()->add(Sql\InFunctor::fromArray('post.safety', Sql\Binding::fromArray($allowedSafety)));
if (!PrivilegesHelper::confirm(Privilege::ListPosts, 'hidden'))
$this->statement->getCriterion()->add(new Sql\NegationFunctor(new Sql\StringExpression('hidden')));
if (!PrivilegesHelper::confirm(Privilege::ListPosts, 'hidden'))
$crit->add(new Sql\NegationFunctor(new Sql\StringExpression('hidden')));
$this->statement->setCriterion($crit);
$this->statement->addOrderBy('comment.id', Sql\SelectStatement::ORDER_DESC); $this->statement->addOrderBy('comment.id', Sql\SelectStatement::ORDER_DESC);
} }
} }

View file

@ -12,13 +12,14 @@ class PostSearchParser extends AbstractSearchParser
$config = \Chibi\Registry::getConfig(); $config = \Chibi\Registry::getConfig();
$this->tags = []; $this->tags = [];
$this->statement->setCriterion(new Sql\ConjunctionFunctor()); $crit = new Sql\ConjunctionFunctor();
$allowedSafety = PrivilegesHelper::getAllowedSafety(); $allowedSafety = PrivilegesHelper::getAllowedSafety();
$this->statement->getCriterion()->add(Sql\InFunctor::fromArray('safety', Sql\Binding::fromArray($allowedSafety))); $crit->add(Sql\InFunctor::fromArray('safety', Sql\Binding::fromArray($allowedSafety)));
$this->statement->setCriterion($crit);
if (count($tokens) > $config->browsing->maxSearchTokens) if (count($tokens) > $config->browsing->maxSearchTokens)
throw new SimpleException('Too many search tokens (maximum: ' . $config->browsing->maxSearchTokens . ')'); throw new SimpleException('Too many search tokens (maximum: %d)', $config->browsing->maxSearchTokens);
} }
protected function processTeardown() protected function processTeardown()
@ -182,7 +183,7 @@ class PostSearchParser extends AbstractSearchParser
} }
else else
throw new SimpleException('Invalid special token: ' . $value); throw new SimpleException('Invalid special token "%s"', $value);
} }
elseif ($key == 'type') elseif ($key == 'type')
@ -197,7 +198,7 @@ class PostSearchParser extends AbstractSearchParser
elseif ($value == 'yt' or $value == 'youtube') elseif ($value == 'yt' or $value == 'youtube')
$type = PostType::Youtube; $type = PostType::Youtube;
else else
throw new SimpleException('Invalid post type: ' . $value); throw new SimpleException('Invalid post type "%s"', $value);
return new Sql\EqualsFunctor('type', new Sql\Binding($type)); return new Sql\EqualsFunctor('type', new Sql\Binding($type));
} }

View file

@ -9,7 +9,8 @@ class TagSearchParser extends AbstractSearchParser
$this->statement $this->statement
->addInnerJoin('post_tag', new Sql\EqualsFunctor('tag.id', 'post_tag.tag_id')) ->addInnerJoin('post_tag', new Sql\EqualsFunctor('tag.id', 'post_tag.tag_id'))
->addInnerJoin('post', new Sql\EqualsFunctor('post.id', 'post_tag.post_id')) ->addInnerJoin('post', new Sql\EqualsFunctor('post.id', 'post_tag.post_id'))
->setCriterion((new Sql\ConjunctionFunctor)->add(Sql\InFunctor::fromArray('safety', Sql\Binding::fromArray($allowedSafety)))) ->setCriterion((new Sql\ConjunctionFunctor)
->add(Sql\InFunctor::fromArray('safety', Sql\Binding::fromArray($allowedSafety))))
->setGroupBy('tag.id'); ->setGroupBy('tag.id');
} }
@ -22,7 +23,9 @@ class TagSearchParser extends AbstractSearchParser
$value = '%' . $value; $value = '%' . $value;
$value .= '%'; $value .= '%';
$this->statement->getCriterion()->add(new Sql\NoCaseFunctor(new Sql\LikeFunctor('tag.name', new Sql\Binding($value)))); $this->statement->getCriterion()
->add(new Sql\NoCaseFunctor(new Sql\LikeFunctor('tag.name', new Sql\Binding($value))));
return true; return true;
} }

View file

@ -130,7 +130,7 @@ class TagModel extends AbstractCrudModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid tag name "' . $key . '"'); throw new SimpleNotFoundException('Invalid tag name "%s"', $key);
return null; return null;
} }
@ -158,15 +158,15 @@ class TagModel extends AbstractCrudModel
$minLength = 1; $minLength = 1;
$maxLength = 64; $maxLength = 64;
if (strlen($tag) < $minLength) if (strlen($tag) < $minLength)
throw new SimpleException('Tag must have at least ' . $minLength . ' characters'); throw new SimpleException('Tag must have at least %d characters', $minLength);
if (strlen($tag) > $maxLength) if (strlen($tag) > $maxLength)
throw new SimpleException('Tag must have at most ' . $maxLength . ' characters'); throw new SimpleException('Tag must have at most %d characters', $maxLength);
if (!preg_match('/^[()\[\]a-zA-Z0-9_.-]+$/i', $tag)) if (!preg_match('/^[()\[\]a-zA-Z0-9_.-]+$/i', $tag))
throw new SimpleException('Invalid tag "' . $tag . '"'); throw new SimpleException('Invalid tag "%s"', $tag);
if (preg_match('/^\.\.?$/', $tag)) if (preg_match('/^\.\.?$/', $tag))
throw new SimpleException('Invalid tag "' . $tag . '"'); throw new SimpleException('Invalid tag "%s"', $tag);
return $tag; return $tag;
} }

View file

@ -100,7 +100,7 @@ class UserModel extends AbstractCrudModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid user name "' . $key . '"'); throw new SimpleNotFoundException('Invalid user name "%s"', $key);
return null; return null;
} }
@ -118,7 +118,7 @@ class UserModel extends AbstractCrudModel
return self::convertRow($row); return self::convertRow($row);
if ($throw) if ($throw)
throw new SimpleNotFoundException('Invalid user name "' . $key . '"'); throw new SimpleNotFoundException('Invalid user name "%s"', $key);
return null; return null;
} }
@ -197,10 +197,10 @@ class UserModel extends AbstractCrudModel
$userNameRegex = \Chibi\Registry::getConfig()->registration->userNameRegex; $userNameRegex = \Chibi\Registry::getConfig()->registration->userNameRegex;
if (strlen($userName) < $userNameMinLength) if (strlen($userName) < $userNameMinLength)
throw new SimpleException(sprintf('User name must have at least %d characters', $userNameMinLength)); throw new SimpleException('User name must have at least %d characters', $userNameMinLength);
if (strlen($userName) > $userNameMaxLength) if (strlen($userName) > $userNameMaxLength)
throw new SimpleException(sprintf('User name must have at most %d characters', $userNameMaxLength)); throw new SimpleException('User name must have at most %d characters', $userNameMaxLength);
if (!preg_match($userNameRegex, $userName)) if (!preg_match($userNameRegex, $userName))
throw new SimpleException('User name contains invalid characters'); throw new SimpleException('User name contains invalid characters');
@ -214,7 +214,7 @@ class UserModel extends AbstractCrudModel
$passRegex = \Chibi\Registry::getConfig()->registration->passRegex; $passRegex = \Chibi\Registry::getConfig()->registration->passRegex;
if (strlen($password) < $passMinLength) if (strlen($password) < $passMinLength)
throw new SimpleException(sprintf('Password must have at least %d characters', $passMinLength)); throw new SimpleException('Password must have at least %d characters', $passMinLength);
if (!preg_match($passRegex, $password)) if (!preg_match($passRegex, $password))
throw new SimpleException('Password contains invalid characters'); throw new SimpleException('Password contains invalid characters');
@ -237,10 +237,10 @@ class UserModel extends AbstractCrudModel
$accessRank = intval($accessRank); $accessRank = intval($accessRank);
if (!in_array($accessRank, AccessRank::getAll())) if (!in_array($accessRank, AccessRank::getAll()))
throw new SimpleException('Invalid access rank type "' . $accessRank . '"'); throw new SimpleException('Invalid access rank type "%s"', $accessRank);
if ($accessRank == AccessRank::Nobody) if ($accessRank == AccessRank::Nobody)
throw new SimpleException('Cannot set special accesss rank "' . $accessRank . '"'); throw new SimpleException('Cannot set special accesss rank "%s"', $accessRank);
return $accessRank; return $accessRank;
} }

View file

@ -1,4 +1,8 @@
<?php <?php
class SimpleException extends Exception class SimpleException extends Exception
{ {
public function __construct()
{
parent::__construct(call_user_func_array('sprintf', func_get_args()));
}
} }