Also adde draw.io to attribution list.
Closes #649
*/
public function entity()
{
- if ($this->entity_type === '') $this->entity_type = null;
+ if ($this->entity_type === '') {
+ $this->entity_type = null;
+ }
return $this->morphTo('entity');
}
* @param $activityB
* @return bool
*/
- public function isSimilarTo($activityB) {
+ public function isSimilarTo($activityB)
+ {
return [$this->key, $this->entity_type, $this->entity_id] === [$activityB->key, $activityB->entity_type, $activityB->entity_id];
}
-
}
<?php namespace BookStack;
-
class Attachment extends Ownable
{
protected $fillable = ['name', 'order'];
*/
public function getFileName()
{
- if (str_contains($this->name, '.')) return $this->name;
+ if (str_contains($this->name, '.')) {
+ return $this->name;
+ }
return $this->name . '.' . $this->extension;
}
{
return baseUrl('/attachments/' . $this->id);
}
-
}
public function getBookCover($width = 440, $height = 250)
{
$default = baseUrl('/book_default_cover.png');
- if (!$this->image_id) return $default;
+ if (!$this->image_id) {
+ return $default;
+ }
try {
$cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
{
return "'BookStack\\\\Book' as entity_type, id, id as entity_id, slug, name, {$this->textField} as text,'' as html, '0' as book_id, '0' as priority, '0' as chapter_id, '0' as draft, created_by, updated_by, updated_at, created_at";
}
-
}
<?php namespace BookStack;
-
class Chapter extends Entity
{
protected $fillable = ['name', 'description', 'priority', 'book_id'];
{
return "'BookStack\\\\Chapter' as entity_type, id, id as entity_id, slug, name, {$this->textField} as text, '' as html, book_id, priority, '0' as chapter_id, '0' as draft, created_by, updated_by, updated_at, created_at";
}
-
}
use BookStack\Repos\UserRepo;
use Illuminate\Console\Command;
-class DeleteUsers extends Command{
+class DeleteUsers extends Command
+{
/**
* The name and signature of the console command.
{
$confirm = $this->ask('This will delete all users from the system that are not "admin" or system users. Are you sure you want to continue? (Type "yes" to continue)');
$numDeleted = 0;
- if (strtolower(trim($confirm)) === 'yes')
- {
+ if (strtolower(trim($confirm)) === 'yes') {
$totalUsers = $this->user->count();
$users = $this->user->where('system_name', '=', null)->with('roles')->get();
- foreach ($users as $user)
- {
- if ($user->hasSystemRole('admin'))
- {
+ foreach ($users as $user) {
+ if ($user->hasSystemRole('admin')) {
// don't delete users with "admin" role
continue;
}
++$numDeleted;
}
$this->info("Deleted $numDeleted of $totalUsers total users.");
- }
- else
- {
+ } else {
$this->info('Exiting...');
}
}
-
}
<?php namespace BookStack;
-
use Illuminate\Database\Eloquent\Relations\MorphMany;
class Entity extends Ownable
{
$matches = [get_class($this), $this->id] === [get_class($entity), $entity->id];
- if ($matches) return true;
+ if ($matches) {
+ return true;
+ }
if (($entity->isA('chapter') || $entity->isA('page')) && $this->isA('book')) {
return $entity->book_id === $this->id;
*/
public function getShortName($length = 25)
{
- if (strlen($this->name) <= $length) return $this->name;
+ if (strlen($this->name) <= $length) {
+ return $this->name;
+ }
return substr($this->name, 0, $length - 3) . '...';
}
* Return a generalised, common raw query that can be 'unioned' across entities.
* @return string
*/
- public function entityRawQuery(){return '';}
+ public function entityRawQuery()
+ {
+ return '';
+ }
/**
* Get the url of this entity
* @param $path
* @return string
*/
- public function getUrl($path){return '/';}
-
+ public function getUrl($path)
+ {
+ return '/';
+ }
}
<?php namespace BookStack;
-
class EntityPermission extends Model
{
<?php namespace BookStack\Exceptions;
+class AuthException extends PrettyException
+{
-class AuthException extends PrettyException {}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
+class ConfirmationEmailException extends NotifyException
+{
-class ConfirmationEmailException extends NotifyException {}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
+class FileUploadException extends PrettyException
+{
-class FileUploadException extends PrettyException {}
\ No newline at end of file
+}
* @param $type
* @return bool
*/
- protected function isExceptionType(Exception $e, $type) {
+ protected function isExceptionType(Exception $e, $type)
+ {
do {
- if (is_a($e, $type)) return true;
+ if (is_a($e, $type)) {
+ return true;
+ }
} while ($e = $e->getPrevious());
return false;
}
* @param Exception $e
* @return string
*/
- protected function getOriginalMessage(Exception $e) {
+ protected function getOriginalMessage(Exception $e)
+ {
do {
$message = $e->getMessage();
} while ($e = $e->getPrevious());
<?php namespace BookStack\Exceptions;
-class ImageUploadException extends PrettyException {}
\ No newline at end of file
+class ImageUploadException extends PrettyException
+{
+
+}
<?php namespace BookStack\Exceptions;
-class LdapException extends PrettyException {}
\ No newline at end of file
+class LdapException extends PrettyException
+{
+
+}
<?php namespace BookStack\Exceptions;
-
-class NotFoundException extends PrettyException {
+class NotFoundException extends PrettyException
+{
/**
* NotFoundException constructor.
{
parent::__construct($message, 404);
}
-}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
-
class NotifyException extends \Exception
{
$this->redirectLocation = $redirectLocation;
parent::__construct();
}
-}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
-
use Exception;
-class PermissionsException extends Exception {}
\ No newline at end of file
+class PermissionsException extends Exception
+{
+
+}
<?php namespace BookStack\Exceptions;
-class PrettyException extends \Exception {}
\ No newline at end of file
+class PrettyException extends \Exception
+{
+
+}
<?php namespace BookStack\Exceptions;
+class SocialDriverNotConfigured extends PrettyException
+{
-class SocialDriverNotConfigured extends PrettyException {}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
+class SocialSignInException extends NotifyException
+{
-class SocialSignInException extends NotifyException {}
\ No newline at end of file
+}
<?php namespace BookStack\Exceptions;
+class UserRegistrationException extends NotifyException
+{
-class UserRegistrationException extends NotifyException {}
\ No newline at end of file
+}
['email' => trans($response)]
);
}
-
-}
\ No newline at end of file
+}
protected function authenticated(Request $request, Authenticatable $user)
{
// Explicitly log them out for now if they do no exist.
- if (!$user->exists) auth()->logout($user);
+ if (!$user->exists) {
+ auth()->logout($user);
+ }
if (!$user->exists && $user->email === null && !$request->filled('email')) {
$request->flash();
}
if (!$user->exists) {
-
// Check for users with same email already
$alreadyUser = $user->newQuery()->where('email', '=', $user->email)->count() > 0;
if ($alreadyUser) {
session()->put('social-callback', 'login');
return $this->socialAuthService->startLogIn($socialDriver);
}
-}
\ No newline at end of file
+}
if ($validator->fails()) {
$this->throwValidationException(
- $request, $validator
+ $request,
+ $validator
);
}
}
$action = session()->pull('social-callback');
- if ($action == 'login') return $this->socialAuthService->handleLoginCallback($socialDriver);
- if ($action == 'register') return $this->socialRegisterCallback($socialDriver);
+ if ($action == 'login') {
+ return $this->socialAuthService->handleLoginCallback($socialDriver);
+ }
+ if ($action == 'register') {
+ return $this->socialRegisterCallback($socialDriver);
+ }
return redirect()->back();
}
];
return $this->registerUser($userData, $socialAccount);
}
-
-}
\ No newline at end of file
+}
return redirect($this->redirectPath())
->with('status', trans($response));
}
-}
\ No newline at end of file
+}
{
$book = $this->entityRepo->getBySlug('book', $slug);
$this->checkOwnablePermission('book-update', $book);
- $this->setPageTitle(trans('entities.books_edit_named',['bookName'=>$book->getShortName()]));
+ $this->setPageTitle(trans('entities.books_edit_named', ['bookName'=>$book->getShortName()]));
return view('books/edit', ['book' => $book, 'current' => $book]);
}
$bookIdsInvolved = collect([$book->id]);
// Load models into map
- $sortMap->each(function($mapItem) use ($bookIdsInvolved) {
+ $sortMap->each(function ($mapItem) use ($bookIdsInvolved) {
$mapItem->type = ($mapItem->type === 'page' ? 'page' : 'chapter');
$mapItem->model = $this->entityRepo->getById($mapItem->type, $mapItem->id);
// Store source and target books
$this->showPermissionError();
}
// Check permissions of involved books
- $booksInvolved->each(function(Book $book) {
+ $booksInvolved->each(function (Book $book) {
$this->checkOwnablePermission('book-update', $book);
});
// Perform the sort
- $sortMap->each(function($mapItem) {
+ $sortMap->each(function ($mapItem) {
$model = $mapItem->model;
$priorityChanged = intval($model->priority) !== intval($mapItem->sort);
});
// Rebuild permissions and add activity for involved books.
- $booksInvolved->each(function(Book $book) {
+ $booksInvolved->each(function (Book $book) {
$this->entityRepo->buildJointPermissionsForBook($book);
Activity::add($book, 'book_sort', $book->id);
});
* @return mixed
* @throws \BookStack\Exceptions\NotFoundException
*/
- public function showMove($bookSlug, $chapterSlug) {
+ public function showMove($bookSlug, $chapterSlug)
+ {
$chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->setPageTitle(trans('entities.chapters_move_named', ['chapterName' => $chapter->getShortName()]));
$this->checkOwnablePermission('chapter-update', $chapter);
* @return mixed
* @throws \BookStack\Exceptions\NotFoundException
*/
- public function move($bookSlug, $chapterSlug, Request $request) {
+ public function move($bookSlug, $chapterSlug, Request $request)
+ {
$chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
$this->checkOwnablePermission('chapter-update', $chapter);
*/
protected function preventAccessForDemoUsers()
{
- if (config('app.env') === 'demo') $this->showPermissionError();
+ if (config('app.env') === 'demo') {
+ $this->showPermissionError();
+ }
}
/**
*/
protected function checkOwnablePermission($permission, Ownable $ownable)
{
- if (userCan($permission, $ownable)) return true;
+ if (userCan($permission, $ownable)) {
+ return true;
+ }
return $this->showPermissionError();
}
protected function checkPermissionOr($permissionName, $callback)
{
$callbackResult = $callback();
- if ($callbackResult === false) $this->checkPermission($permissionName);
+ if ($callbackResult === false) {
+ $this->checkPermission($permissionName);
+ }
return true;
}
->withInput($request->input())
->withErrors($errors, $this->errorBag());
}
-
}
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
* @throws \Exception
*/
- public function getTranslations() {
+ public function getTranslations()
+ {
$locale = app()->getLocale();
$cacheKey = 'GLOBAL_TRANSLATIONS_' . $locale;
if (cache()->has($cacheKey) && config('app.env') !== 'development') {
{
return view('partials/custom-head-content');
}
-
}
* @param Request $request
* @return mixed
*/
- public function searchByType($type, $page = 0, Request $request)
+ public function searchByType(Request $request, $type, $page = 0)
{
$this->validate($request, [
'term' => 'required|string'
]);
$searchTerm = $request->get('term');
- $imgData = $this->imageRepo->searchPaginatedByType($type, $page, 24, $searchTerm);
+ $imgData = $this->imageRepo->searchPaginatedByType($type, $searchTerm, $page, 24);
return response()->json($imgData);
}
* @param Request $request
* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
*/
- public function getGalleryFiltered($filter, $page = 0, Request $request)
+ public function getGalleryFiltered(Request $request, $filter, $page = 0)
{
$this->validate($request, [
'page_id' => 'required|integer'
]);
$validFilters = collect(['page', 'book']);
- if (!$validFilters->contains($filter)) return response('Invalid filter', 500);
+ if (!$validFilters->contains($filter)) {
+ return response('Invalid filter', 500);
+ }
$pageId = $request->get('page_id');
- $imgData = $this->imageRepo->getGalleryFiltered($page, 24, strtolower($filter), $pageId);
+ $imgData = $this->imageRepo->getGalleryFiltered(strtolower($filter), $pageId, $page, 24);
return response()->json($imgData);
}
$this->imageRepo->destroyImage($image);
return response()->json(trans('components.images_deleted'));
}
-
-
}
$page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
} catch (NotFoundException $e) {
$page = $this->entityRepo->getPageByOldSlug($pageSlug, $bookSlug);
- if ($page === null) throw $e;
+ if ($page === null) {
+ throw $e;
+ }
return redirect($page->getUrl());
}
$warnings [] = $this->entityRepo->getUserPageDraftMessage($draft);
}
- if (count($warnings) > 0) session()->flash('warning', implode("\n", $warnings));
+ if (count($warnings) > 0) {
+ session()->flash('warning', implode("\n", $warnings));
+ }
$draftsEnabled = $this->signedIn;
return view('pages/edit', [
session()->flash('success', trans('entities.pages_permissions_success'));
return redirect($page->getUrl());
}
-
}
{
$this->checkPermission('user-roles-manage');
$role = $this->permissionsRepo->getRoleById($id);
- if ($role->hidden) throw new PermissionsException(trans('errors.role_cannot_be_edited'));
+ if ($role->hidden) {
+ throw new PermissionsException(trans('errors.role_cannot_be_edited'));
+ }
return view('settings/roles/edit', ['role' => $role]);
}
return view('search/entity-ajax-list', ['entities' => $entities]);
}
-
}
-
-
// Cycles through posted settings and update them
foreach ($request->all() as $name => $value) {
- if (strpos($name, 'setting-') !== 0) continue;
+ if (strpos($name, 'setting-') !== 0) {
+ continue;
+ }
$key = str_replace('setting-', '', trim($name));
Setting::put($key, $value);
}
session()->flash('success', trans('settings.settings_save_success'));
return redirect('/settings');
}
-
}
$suggestions = $this->tagRepo->getValueSuggestions($searchTerm, $tagName);
return response()->json($suggestions);
}
-
}
} catch (Exception $e) {
\Log::error('Failed to save user gravatar image');
}
-
}
return redirect('/settings/users');
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
*/
- public function switchBookView($id, Request $request) {
+ public function switchBookView($id, Request $request)
+ {
$this->checkPermissionOr('users-manage', function () use ($id) {
return $this->currentUser->id == $id;
});
return redirect()->back(302, [], "/settings/users/$id");
}
-
}
$locale = $defaultLang;
$availableLocales = config('app.locales');
foreach ($request->getLanguages() as $lang) {
- if (!in_array($lang, $availableLocales)) continue;
+ if (!in_array($lang, $availableLocales)) {
+ continue;
+ }
$locale = $lang;
break;
}
{
return parent::getAttributeFromArray($key);
}
-
-}
\ No newline at end of file
+}
->line(trans('auth.email_confirm_text'))
->action(trans('auth.email_confirm_action'), baseUrl('/register/confirm/' . $this->token));
}
-
}
<?php namespace BookStack;
-
abstract class Ownable extends Model
{
/**
{
return strtolower(array_slice(explode('\\', static::class), -1, 1)[0]);
}
-
-}
\ No newline at end of file
+}
<?php namespace BookStack;
-
class Page extends Entity
{
protected $fillable = ['name', 'html', 'priority', 'markdown'];
* @return string
*/
public function entityRawQuery($withContent = false)
- { $htmlQuery = $withContent ? 'html' : "'' as html";
+ {
+ $htmlQuery = $withContent ? 'html' : "'' as html";
return "'BookStack\\\\Page' as entity_type, id, id as entity_id, slug, name, {$this->textField} as text, {$htmlQuery}, book_id, priority, chapter_id, draft, created_by, updated_by, updated_at, created_at";
}
-
}
<?php namespace BookStack;
-
class PageRevision extends Model
{
protected $fillable = ['name', 'html', 'text', 'markdown', 'summary'];
public function getUrl($path = null)
{
$url = $this->page->getUrl() . '/revisions/' . $this->id;
- if ($path) return $url . '/' . trim($path, '/');
+ if ($path) {
+ return $url . '/' . trim($path, '/');
+ }
return $url;
}
{
return $type === 'revision';
}
-
}
public function boot()
{
// Custom validation methods
- Validator::extend('is_image', function($attribute, $value, $parameters, $validator) {
+ Validator::extend('is_image', function ($attribute, $value, $parameters, $validator) {
$imageMimes = ['image/png', 'image/bmp', 'image/gif', 'image/jpeg', 'image/jpg', 'image/tiff', 'image/webp'];
return in_array($value->getMimeType(), $imageMimes);
});
- \Blade::directive('icon', function($expression) {
+ \Blade::directive('icon', function ($expression) {
return "<?php echo icon($expression); ?>";
});
*/
public function register()
{
- $this->app->singleton(SettingService::class, function($app) {
+ $this->app->singleton(SettingService::class, function ($app) {
return new SettingService($app->make(Setting::class), $app->make('Illuminate\Contracts\Cache\Repository'));
});
}
*/
public function register()
{
- Auth::provider('ldap', function($app, array $config) {
+ Auth::provider('ldap', function ($app, array $config) {
return new LdapUserProvider($config['model'], $app[LdapService::class]);
});
}
*/
public function register()
{
- $this->app->bind('activity', function() {
+ $this->app->bind('activity', function () {
return new ActivityService(
$this->app->make(Activity::class),
$this->app->make(PermissionService::class)
);
});
- $this->app->bind('views', function() {
+ $this->app->bind('views', function () {
return new ViewService(
$this->app->make(View::class),
$this->app->make(PermissionService::class)
);
});
- $this->app->bind('setting', function() {
+ $this->app->bind('setting', function () {
return new SettingService(
$this->app->make(Setting::class),
$this->app->make(Repository::class)
);
});
- $this->app->bind('images', function() {
+ $this->app->bind('images', function () {
return new ImageService(
$this->app->make(ImageManager::class),
$this->app->make(Factory::class),
namespace BookStack\Providers;
-
use BookStack\Role;
use BookStack\Services\LdapService;
use BookStack\User;
{
// Get user via LDAP
$userDetails = $this->ldapService->getUserDetails($credentials['username']);
- if ($userDetails === null) return null;
+ if ($userDetails === null) {
+ return null;
+ }
// Search current user base by looking up a uid
$model = $this->createModel();
->where('external_auth_id', $userDetails['uid'])
->first();
- if ($currentUser !== null) return $currentUser;
+ if ($currentUser !== null) {
+ return $currentUser;
+ }
$model->name = $userDetails['name'];
$model->external_auth_id = $userDetails['uid'];
<?php namespace BookStack\Providers;
-
use Illuminate\Pagination\PaginationServiceProvider as IlluminatePaginationServiceProvider;
use Illuminate\Pagination\Paginator;
return 1;
});
}
-}
\ No newline at end of file
+}
* Class CommentRepo
* @package BookStack\Repos
*/
-class CommentRepo {
+class CommentRepo
+{
/**
* @var Comment $comment
* @param array $data
* @return Comment
*/
- public function create (Entity $entity, $data = [])
+ public function create(Entity $entity, $data = [])
{
$userId = user()->id;
$comment = $this->comment->newInstance($data);
protected function getNextLocalId(Entity $entity)
{
$comments = $entity->comments(false)->orderBy('local_id', 'desc')->first();
- if ($comments === null) return 1;
+ if ($comments === null) {
+ return 1;
+ }
return $comments->local_id + 1;
}
-}
\ No newline at end of file
+}
* @param SearchService $searchService
*/
public function __construct(
- Book $book, Chapter $chapter, Page $page, PageRevision $pageRevision,
- ViewService $viewService, PermissionService $permissionService,
- TagRepo $tagRepo, SearchService $searchService
- )
- {
+ Book $book,
+ Chapter $chapter,
+ Page $page,
+ PageRevision $pageRevision,
+ ViewService $viewService,
+ PermissionService $permissionService,
+ TagRepo $tagRepo,
+ SearchService $searchService
+ ) {
$this->book = $book;
$this->chapter = $chapter;
$this->page = $page;
$q = $this->entityQuery($type)->where('slug', '=', $slug);
if (strtolower($type) === 'chapter' || strtolower($type) === 'page') {
- $q = $q->where('book_id', '=', function($query) use ($bookSlug) {
+ $q = $q->where('book_id', '=', function ($query) use ($bookSlug) {
$query->select('id')
->from($this->book->getTable())
->where('slug', '=', $bookSlug)->limit(1);
});
}
$entity = $q->first();
- if ($entity === null) throw new NotFoundException(trans('errors.' . strtolower($type) . '_not_found'));
+ if ($entity === null) {
+ throw new NotFoundException(trans('errors.' . strtolower($type) . '_not_found'));
+ }
return $entity;
}
public function getAll($type, $count = 20, $permission = 'view')
{
$q = $this->entityQuery($type, false, $permission)->orderBy('name', 'asc');
- if ($count !== false) $q = $q->take($count);
+ if ($count !== false) {
+ $q = $q->take($count);
+ }
return $q->get();
}
{
$query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
->orderBy('created_at', 'desc');
- if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
+ if (strtolower($type) === 'page') {
+ $query = $query->where('draft', '=', false);
+ }
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
{
$query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
->orderBy('updated_at', 'desc');
- if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
+ if (strtolower($type) === 'page') {
+ $query = $query->where('draft', '=', false);
+ }
if ($additionalQuery !== false && is_callable($additionalQuery)) {
$additionalQuery($query);
}
$parents[$key] = $entities[$index];
$parents[$key]->setAttribute('pages', collect());
}
- if ($entities[$index]->chapter_id === 0 || $entities[$index]->chapter_id === '0') $tree[] = $entities[$index];
+ if ($entities[$index]->chapter_id === 0 || $entities[$index]->chapter_id === '0') {
+ $tree[] = $entities[$index];
+ }
$entities[$index]->book = $book;
}
foreach ($entities as $entity) {
- if ($entity->chapter_id === 0 || $entity->chapter_id === '0') continue;
+ if ($entity->chapter_id === 0 || $entity->chapter_id === '0') {
+ continue;
+ }
$parentKey = 'BookStack\\Chapter:' . $entity->chapter_id;
if (!isset($parents[$parentKey])) {
$tree[] = $entity;
if (strtolower($type) === 'page' || strtolower($type) === 'chapter') {
$query = $query->where('book_id', '=', $bookId);
}
- if ($currentId) $query = $query->where('id', '!=', $currentId);
+ if ($currentId) {
+ $query = $query->where('id', '!=', $currentId);
+ }
return $query->count() > 0;
}
$slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', mb_strtolower($name));
$slug = preg_replace('/\s{2,}/', ' ', $slug);
$slug = str_replace(' ', '-', $slug);
- if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5);
+ if ($slug === "") {
+ $slug = substr(md5(rand(1, 500)), 0, 5);
+ }
return $slug;
}
public function savePageRevision(Page $page, $summary = null)
{
$revision = $this->pageRevision->newInstance($page->toArray());
- if (setting('app-editor') !== 'markdown') $revision->markdown = '';
+ if (setting('app-editor') !== 'markdown') {
+ $revision->markdown = '';
+ }
$revision->page_id = $page->id;
$revision->slug = $page->slug;
$revision->book_slug = $page->book->slug;
*/
protected function formatHtml($htmlText)
{
- if ($htmlText == '') return $htmlText;
+ if ($htmlText == '') {
+ return $htmlText;
+ }
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($htmlText, 'HTML-ENTITIES', 'UTF-8'));
foreach ($childNodes as $index => $childNode) {
/** @var \DOMElement $childNode */
- if (get_class($childNode) !== 'DOMElement') continue;
+ if (get_class($childNode) !== 'DOMElement') {
+ continue;
+ }
// Overwrite id if not a BookStack custom id
if ($childNode->hasAttribute('id')) {
$content = $page->html;
$matches = [];
preg_match_all("/{{@\s?([0-9].*?)}}/", $content, $matches);
- if (count($matches[0]) === 0) return $content;
+ if (count($matches[0]) === 0) {
+ return $content;
+ }
$topLevelTags = ['table', 'ul', 'ol'];
foreach ($matches[1] as $index => $includeId) {
$splitInclude = explode('#', $includeId, 2);
$pageId = intval($splitInclude[0]);
- if (is_nan($pageId)) continue;
+ if (is_nan($pageId)) {
+ continue;
+ }
$matchedPage = $this->getById('page', $pageId, false, $ignorePermissions);
if ($matchedPage === null) {
$page->updated_by = user()->id;
$page->draft = true;
- if ($chapter) $page->chapter_id = $chapter->id;
+ if ($chapter) {
+ $page->chapter_id = $chapter->id;
+ }
$book->pages()->save($page);
$page = $this->page->find($page->id);
*/
public function getPageNav($pageContent)
{
- if ($pageContent == '') return [];
+ if ($pageContent == '') {
+ return [];
+ }
libxml_use_internal_errors(true);
$doc = new DOMDocument();
$doc->loadHTML(mb_convert_encoding($pageContent, 'HTML-ENTITIES', 'UTF-8'));
$xPath = new DOMXPath($doc);
$headers = $xPath->query("//h1|//h2|//h3|//h4|//h5|//h6");
- if (is_null($headers)) return [];
+ if (is_null($headers)) {
+ return [];
+ }
$tree = collect([]);
foreach ($headers as $header) {
// Normalise headers if only smaller headers have been used
if (count($tree) > 0) {
$minLevel = $tree->pluck('level')->min();
- $tree = $tree->map(function($header) use ($minLevel) {
+ $tree = $tree->map(function ($header) use ($minLevel) {
$header['level'] -= ($minLevel - 2);
return $header;
});
$page->fill($input);
$page->html = $this->formatHtml($input['html']);
$page->text = $this->pageToPlainText($page);
- if (setting('app-editor') !== 'markdown') $page->markdown = '';
+ if (setting('app-editor') !== 'markdown') {
+ $page->markdown = '';
+ }
$page->updated_by = $userId;
$page->revision_count++;
$page->save();
public function getUserPageDraftMessage(PageRevision $draft)
{
$message = trans('entities.pages_editing_draft_notification', ['timeDiff' => $draft->updated_at->diffForHumans()]);
- if ($draft->page->updated_at->timestamp <= $draft->updated_at->timestamp) return $message;
+ if ($draft->page->updated_at->timestamp <= $draft->updated_at->timestamp) {
+ return $message;
+ }
return $message . "\n" . trans('entities.pages_draft_edited_notification');
}
}
$draft->fill($data);
- if (setting('app-editor') !== 'markdown') $draft->markdown = '';
+ if (setting('app-editor') !== 'markdown') {
+ $draft->markdown = '';
+ }
$draft->save();
return $draft;
$page->delete();
}
-
}
-
-
-
-
-
-
-
-
-
-
-
-
* @param string $searchTerm
* @return array
*/
- public function searchPaginatedByType($type, $page = 0, $pageSize = 24, $searchTerm)
+ public function searchPaginatedByType($type, $searchTerm, $page = 0, $pageSize = 24)
{
$images = $this->image->where('type', '=', strtolower($type))->where('name', 'LIKE', '%' . $searchTerm . '%');
return $this->returnPaginated($images, $page, $pageSize);
/**
* Get gallery images with a particular filter criteria such as
* being within the current book or page.
- * @param int $pagination
- * @param int $pageSize
* @param $filter
* @param $pageId
+ * @param int $pageNum
+ * @param int $pageSize
* @return array
*/
- public function getGalleryFiltered($pagination = 0, $pageSize = 24, $filter, $pageId)
+ public function getGalleryFiltered($filter, $pageId, $pageNum = 0, $pageSize = 24)
{
$images = $this->image->where('type', '=', 'gallery');
$images = $images->whereIn('uploaded_to', $validPageIds);
}
- return $this->returnPaginated($images, $pagination, $pageSize);
+ return $this->returnPaginated($images, $pageNum, $pageSize);
}
/**
$validTypes = ['drawing', 'gallery', 'cover', 'system', 'user'];
return in_array($type, $validTypes);
}
-
-}
\ No newline at end of file
+}
<?php namespace BookStack\Repos;
-
use BookStack\Exceptions\PermissionsException;
use BookStack\RolePermission;
use BookStack\Role;
$this->permissionService->deleteJointPermissionsForRole($role);
$role->delete();
}
-
-}
\ No newline at end of file
+}
public function getForEntity($entityType, $entityId)
{
$entity = $this->getEntity($entityType, $entityId);
- if ($entity === null) return collect();
+ if ($entity === null) {
+ return collect();
+ }
return $entity->tags;
}
$query = $query->orderBy('count', 'desc')->take(50);
}
- if ($tagName !== false) $query = $query->where('name', '=', $tagName);
+ if ($tagName !== false) {
+ $query = $query->where('name', '=', $tagName);
+ }
$query = $this->permissionService->filterRestrictedEntityRelations($query, 'tags', 'entity_id', 'entity_type');
return $query->get(['value'])->pluck('value');
$entity->tags()->delete();
$newTags = [];
foreach ($tags as $tag) {
- if (trim($tag['name']) === '') continue;
+ if (trim($tag['name']) === '') {
+ continue;
+ }
$newTags[] = $this->newInstanceFromInput($tag);
}
$values = ['name' => $name, 'value' => $value];
return $this->tag->newInstance($values);
}
-
-}
\ No newline at end of file
+}
* @param $sortData
* @return \Illuminate\Database\Eloquent\Builder|static
*/
- public function getAllUsersPaginatedAndSorted($count = 20, $sortData)
+ public function getAllUsersPaginatedAndSorted($count, $sortData)
{
$query = $this->user->with('roles', 'avatar')->orderBy($sortData['sort'], $sortData['order']);
if ($sortData['search']) {
$term = '%' . $sortData['search'] . '%';
- $query->where(function($query) use ($term) {
+ $query->where(function ($query) use ($term) {
$query->where('name', 'like', $term)
->orWhere('email', 'like', $term);
});
public function attachDefaultRole($user)
{
$roleId = setting('registration-role');
- if ($roleId === false) $roleId = $this->role->first()->id;
+ if ($roleId === false) {
+ $roleId = $this->role->first()->id;
+ }
$user->attachRoleId($roleId);
}
*/
public function isOnlyAdmin(User $user)
{
- if (!$user->hasSystemRole('admin')) return false;
+ if (!$user->hasSystemRole('admin')) {
+ return false;
+ }
$adminRole = $this->role->getSystemRole('admin');
- if ($adminRole->users->count() > 1) return false;
+ if ($adminRole->users->count() > 1) {
+ return false;
+ }
return true;
}
{
return $this->role->where('system_name', '!=', 'admin')->get();
}
-
-}
\ No newline at end of file
+}
<?php namespace BookStack;
-
class Role extends Model
{
{
$permissions = $this->getRelationValue('permissions');
foreach ($permissions as $permission) {
- if ($permission->getRawAttribute('name') === $permissionName) return true;
+ if ($permission->getRawAttribute('name') === $permissionName) {
+ return true;
+ }
}
return false;
}
{
return static::where('hidden', '=', false)->orderBy('name')->get();
}
-
}
<?php namespace BookStack;
-
class RolePermission extends Model
{
/**
*/
public function roles()
{
- return $this->belongsToMany(Role::class, 'permission_role','permission_id', 'role_id');
+ return $this->belongsToMany(Role::class, 'permission_role', 'permission_id', 'role_id');
}
/**
{
return $this->morphTo('entity');
}
-
}
Session::flash('success', $message);
}
}
-
-}
\ No newline at end of file
+}
*/
protected function getStorage()
{
- if ($this->storageInstance !== null) return $this->storageInstance;
+ if ($this->storageInstance !== null) {
+ return $this->storageInstance;
+ }
$storageType = config('filesystems.default');
return $attachmentPath;
}
-
-}
\ No newline at end of file
+}
}
return $token;
}
-
-
-}
\ No newline at end of file
+}
public function chapterToContainedHtml(Chapter $chapter)
{
$pages = $this->entityRepo->getChapterChildren($chapter);
- $pages->each(function($page) {
+ $pages->each(function ($page) {
$page->html = $this->entityRepo->renderPage($page);
});
$html = view('chapters/export', [
public function chapterToPdf(Chapter $chapter)
{
$pages = $this->entityRepo->getChapterChildren($chapter);
- $pages->each(function($page) {
+ $pages->each(function ($page) {
$page->html = $this->entityRepo->renderPage($page);
});
$html = view('chapters/export', [
$pathString = public_path(trim($relString, '/'));
}
- if ($isLocal && !file_exists($pathString)) continue;
+ if ($isLocal && !file_exists($pathString)) {
+ continue;
+ }
try {
if ($isLocal) {
$imageContent = file_get_contents($pathString);
$imageContent = curl_exec($ch);
$err = curl_error($ch);
curl_close($ch);
- if ($err) throw new \Exception("Image fetch failed, Received error: " . $err);
+ if ($err) {
+ throw new \Exception("Image fetch failed, Received error: " . $err);
+ }
}
$imageEncoded = 'data:image/' . pathinfo($pathString, PATHINFO_EXTENSION) . ';base64,' . base64_encode($imageContent);
$newImageString = str_replace($srcString, $imageEncoded, $oldImgString);
}
return $text;
}
-
}
-
-
-
-
-
-
-
-
-
-
-
-
<?php namespace BookStack\Services\Facades;
-
use Illuminate\Support\Facades\Facade;
class Activity extends Facade
*
* @return string
*/
- protected static function getFacadeAccessor() { return 'activity'; }
-}
\ No newline at end of file
+ protected static function getFacadeAccessor()
+ {
+ return 'activity';
+ }
+}
<?php namespace BookStack\Services\Facades;
-
use Illuminate\Support\Facades\Facade;
class Images extends Facade
*
* @return string
*/
- protected static function getFacadeAccessor() { return 'images'; }
-}
\ No newline at end of file
+ protected static function getFacadeAccessor()
+ {
+ return 'images';
+ }
+}
<?php namespace BookStack\Services\Facades;
-
use Illuminate\Support\Facades\Facade;
class Setting extends Facade
*
* @return string
*/
- protected static function getFacadeAccessor() { return 'setting'; }
-}
\ No newline at end of file
+ protected static function getFacadeAccessor()
+ {
+ return 'setting';
+ }
+}
*
* @return string
*/
- protected static function getFacadeAccessor() { return 'views'; }
-}
\ No newline at end of file
+ protected static function getFacadeAccessor()
+ {
+ return 'views';
+ }
+}
{
$imageName = $imageName ? $imageName : basename($url);
$imageData = file_get_contents($url);
- if($imageData === false) throw new \Exception(trans('errors.cannot_get_image_from_url', ['url' => $url]));
+ if ($imageData === false) {
+ throw new \Exception(trans('errors.cannot_get_image_from_url', ['url' => $url]));
+ }
return $this->saveNew($imageName, $imageData, $type);
}
$secureUploads = setting('app-secure-images');
$imageName = str_replace(' ', '-', $imageName);
- if ($secureUploads) $imageName = str_random(16) . '-' . $imageName;
+ if ($secureUploads) {
+ $imageName = str_random(16) . '-' . $imageName;
+ }
$imagePath = '/uploads/images/' . $type . '/' . Date('Y-m-M') . '/';
// Cleanup of empty folders
foreach ($storage->directories($imageFolder) as $directory) {
- if ($this->isFolderEmpty($directory)) $storage->deleteDirectory($directory);
+ if ($this->isFolderEmpty($directory)) {
+ $storage->deleteDirectory($directory);
+ }
+ }
+ if ($this->isFolderEmpty($imageFolder)) {
+ $storage->deleteDirectory($imageFolder);
}
- if ($this->isFolderEmpty($imageFolder)) $storage->deleteDirectory($imageFolder);
$image->delete();
return true;
$basePath = ($this->storageUrl == false) ? baseUrl('/') : $this->storageUrl;
return rtrim($basePath, '/') . $filePath;
}
-
-
}
<?php namespace BookStack\Services;
-
/**
* Class Ldap
* An object-orientated thin abstraction wrapper for common PHP LDAP functions.
{
return ldap_bind($ldapConnection, $bindRdn, $bindPassword);
}
-
}
<?php namespace BookStack\Services;
-
use BookStack\Exceptions\LdapException;
use Illuminate\Contracts\Auth\Authenticatable;
$followReferrals = $this->config['follow_referrals'] ? 1 : 0;
$this->ldap->setOption($ldapConnection, LDAP_OPT_REFERRALS, $followReferrals);
$users = $this->ldap->searchAndGetEntries($ldapConnection, $baseDn, $userFilter, ['cn', 'uid', 'dn', $emailAttr]);
- if ($users['count'] === 0) return null;
+ if ($users['count'] === 0) {
+ return null;
+ }
$user = $users[0];
return [
public function validateUserCredentials(Authenticatable $user, $username, $password)
{
$ldapUser = $this->getUserDetails($username);
- if ($ldapUser === null) return false;
- if ($ldapUser['uid'] !== $user->external_auth_id) return false;
+ if ($ldapUser === null) {
+ return false;
+ }
+ if ($ldapUser['uid'] !== $user->external_auth_id) {
+ return false;
+ }
$ldapConnection = $this->getConnection();
try {
$ldapBind = $this->ldap->bind($connection, $ldapDn, $ldapPass);
}
- if (!$ldapBind) throw new LdapException(($isAnonymous ? trans('errors.ldap_fail_anonymous') : trans('errors.ldap_fail_authed')));
+ if (!$ldapBind) {
+ throw new LdapException(($isAnonymous ? trans('errors.ldap_fail_anonymous') : trans('errors.ldap_fail_authed')));
+ }
}
/**
*/
protected function getConnection()
{
- if ($this->ldapConnection !== null) return $this->ldapConnection;
+ if ($this->ldapConnection !== null) {
+ return $this->ldapConnection;
+ }
// Check LDAP extension in installed
if (!function_exists('ldap_connect') && config('app.env') !== 'testing') {
// Get port from server string and protocol if specified.
$ldapServer = explode(':', $this->config['server']);
$hasProtocol = preg_match('/^ldaps{0,1}\:\/\//', $this->config['server']) === 1;
- if (!$hasProtocol) array_unshift($ldapServer, '');
+ if (!$hasProtocol) {
+ array_unshift($ldapServer, '');
+ }
$hostName = $ldapServer[0] . ($hasProtocol?':':'') . $ldapServer[1];
$defaultPort = $ldapServer[0] === 'ldaps' ? 636 : 389;
$ldapConnection = $this->ldap->connect($hostName, count($ldapServer) > 2 ? intval($ldapServer[2]) : $defaultPort);
}
return strtr($filterString, $newAttrs);
}
-
-}
\ No newline at end of file
+}
}
$book = $this->book->find($bookId);
- if ($book === null) $book = false;
+ if ($book === null) {
+ $book = false;
+ }
if (isset($this->entityCache['books'])) {
$this->entityCache['books']->put($bookId, $book);
}
}
$chapter = $this->chapter->find($chapterId);
- if ($chapter === null) $chapter = false;
+ if ($chapter === null) {
+ $chapter = false;
+ }
if (isset($this->entityCache['chapters'])) {
$this->entityCache['chapters']->put($chapterId, $chapter);
}
*/
protected function getRoles()
{
- if ($this->userRoles !== false) return $this->userRoles;
+ if ($this->userRoles !== false) {
+ return $this->userRoles;
+ }
$roles = [];
*/
protected function bookFetchQuery()
{
- return $this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function($query) {
+ return $this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function ($query) {
$query->select(['id', 'restricted', 'created_by', 'book_id']);
- }, 'pages' => function($query) {
+ }, 'pages' => function ($query) {
$query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
}]);
}
* @param array $roles
* @param bool $deleteOld
*/
- protected function buildJointPermissionsForBooks($books, $roles, $deleteOld = false) {
+ protected function buildJointPermissionsForBooks($books, $roles, $deleteOld = false)
+ {
$entities = clone $books;
/** @var Book $book */
}
}
- if ($deleteOld) $this->deleteManyJointPermissionsForEntities($entities->all());
+ if ($deleteOld) {
+ $this->deleteManyJointPermissionsForEntities($entities->all());
+ }
$this->createManyJointPermissions($entities, $roles);
}
*/
protected function deleteManyJointPermissionsForRoles($roles)
{
- $roleIds = array_map(function($role) {
+ $roleIds = array_map(function ($role) {
return $role->id;
}, $roles);
$this->jointPermission->newQuery()->whereIn('role_id', $roleIds)->delete();
*/
protected function deleteManyJointPermissionsForEntities($entities)
{
- if (count($entities) === 0) return;
+ if (count($entities) === 0) {
+ return;
+ }
- $this->db->transaction(function() use ($entities) {
+ $this->db->transaction(function () use ($entities) {
foreach (array_chunk($entities, 1000) as $entityChunk) {
$query = $this->db->table('joint_permissions');
foreach ($entityChunk as $entity) {
- $query->orWhere(function(QueryBuilder $query) use ($entity) {
+ $query->orWhere(function (QueryBuilder $query) use ($entity) {
$query->where('entity_id', '=', $entity->id)
->where('entity_type', '=', $entity->getMorphClass());
});
}
$query->delete();
}
-
});
}
$permissionFetch = $this->entityPermission->newQuery();
foreach ($entities as $entity) {
$entityRestrictedMap[$entity->getMorphClass() . ':' . $entity->id] = boolval($entity->getRawAttribute('restricted'));
- $permissionFetch->orWhere(function($query) use ($entity) {
+ $permissionFetch->orWhere(function ($query) use ($entity) {
$query->where('restrictable_id', '=', $entity->id)->where('restrictable_type', '=', $entity->getMorphClass());
});
}
}
}
- $this->db->transaction(function() use ($jointPermissions) {
+ $this->db->transaction(function () use ($jointPermissions) {
foreach (array_chunk($jointPermissions, 1000) as $jointPermissionChunk) {
$this->db->table('joint_permissions')->insert($jointPermissionChunk);
}
protected function getActions(Entity $entity)
{
$baseActions = ['view', 'update', 'delete'];
- if ($entity->isA('chapter') || $entity->isA('book')) $baseActions[] = 'page-create';
- if ($entity->isA('book')) $baseActions[] = 'chapter-create';
+ if ($entity->isA('chapter') || $entity->isA('book')) {
+ $baseActions[] = 'page-create';
+ }
+ if ($entity->isA('book')) {
+ $baseActions[] = 'chapter-create';
+ }
return $baseActions;
}
}
}
- return $this->createJointPermissionDataArray($entity, $role, $action,
+ return $this->createJointPermissionDataArray(
+ $entity,
+ $role,
+ $action,
($hasExplicitAccessToParents || ($roleHasPermission && $hasPermissiveAccessToParents)),
($hasExplicitAccessToParents || ($roleHasPermissionOwn && $hasPermissiveAccessToParents))
);
* @param $action
* @return bool
*/
- protected function mapHasActiveRestriction($entityMap, Entity $entity, Role $role, $action) {
+ protected function mapHasActiveRestriction($entityMap, Entity $entity, Role $role, $action)
+ {
$key = $entity->getMorphClass() . ':' . $entity->getRawAttribute('id') . ':' . $role->getRawAttribute('id') . ':' . $action;
return isset($entityMap[$key]) ? $entityMap[$key] : false;
}
* @param bool $fetchPageContent
* @return QueryBuilder
*/
- public function bookChildrenQuery($book_id, $filterDrafts = false, $fetchPageContent = false) {
- $pageSelect = $this->db->table('pages')->selectRaw($this->page->entityRawQuery($fetchPageContent))->where('book_id', '=', $book_id)->where(function($query) use ($filterDrafts) {
+ public function bookChildrenQuery($book_id, $filterDrafts = false, $fetchPageContent = false)
+ {
+ $pageSelect = $this->db->table('pages')->selectRaw($this->page->entityRawQuery($fetchPageContent))->where('book_id', '=', $book_id)->where(function ($query) use ($filterDrafts) {
$query->where('draft', '=', 0);
if (!$filterDrafts) {
- $query->orWhere(function($query) {
+ $query->orWhere(function ($query) {
$query->where('draft', '=', 1)->where('created_by', '=', $this->currentUser()->id);
});
}
$whereQuery = $this->db->table('joint_permissions as jp')->selectRaw('COUNT(*)')
->whereRaw('jp.entity_id=U.id')->whereRaw('jp.entity_type=U.entity_type')
->where('jp.action', '=', 'view')->whereIn('jp.role_id', $this->getRoles())
- ->where(function($query) {
- $query->where('jp.has_permission', '=', 1)->orWhere(function($query) {
+ ->where(function ($query) {
+ $query->where('jp.has_permission', '=', 1)->orWhere(function ($query) {
$query->where('jp.has_permission_own', '=', 1)->where('jp.created_by', '=', $this->currentUser()->id);
});
});
$this->userRoles = false;
$this->isAdminUser = null;
}
-
-}
\ No newline at end of file
+}
$total = 0;
foreach ($entityTypesToSearch as $entityType) {
- if (!in_array($entityType, $entityTypes)) continue;
+ if (!in_array($entityType, $entityTypes)) {
+ continue;
+ }
$search = $this->searchEntityTable($terms, $entityType, $page, $count);
$total += $this->searchEntityTable($terms, $entityType, $page, $count, true);
$results = $results->merge($search);
$results = collect();
foreach ($entityTypesToSearch as $entityType) {
- if (!in_array($entityType, $entityTypes)) continue;
+ if (!in_array($entityType, $entityTypes)) {
+ continue;
+ }
$search = $this->buildEntitySearchQuery($terms, $entityType)->where('book_id', '=', $bookId)->take(20)->get();
$results = $results->merge($search);
}
public function searchEntityTable($terms, $entityType = 'page', $page = 1, $count = 20, $getCount = false)
{
$query = $this->buildEntitySearchQuery($terms, $entityType);
- if ($getCount) return $query->count();
+ if ($getCount) {
+ return $query->count();
+ }
$query = $query->skip(($page-1) * $count)->take($count);
return $query->get();
if (count($terms['search']) > 0) {
$subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score'));
$subQuery->where('entity_type', '=', 'BookStack\\' . ucfirst($entityType));
- $subQuery->where(function(Builder $query) use ($terms) {
+ $subQuery->where(function (Builder $query) use ($terms) {
foreach ($terms['search'] as $inputTerm) {
$query->orWhere('term', 'like', $inputTerm .'%');
}
})->groupBy('entity_type', 'entity_id');
- $entitySelect->join(\DB::raw('(' . $subQuery->toSql() . ') as s'), function(JoinClause $join) {
+ $entitySelect->join(\DB::raw('(' . $subQuery->toSql() . ') as s'), function (JoinClause $join) {
$join->on('id', '=', 'entity_id');
})->selectRaw($entity->getTable().'.*, s.score')->orderBy('score', 'desc');
$entitySelect->mergeBindings($subQuery);
// Handle exact term matching
if (count($terms['exact']) > 0) {
- $entitySelect->where(function(\Illuminate\Database\Eloquent\Builder $query) use ($terms, $entity) {
+ $entitySelect->where(function (\Illuminate\Database\Eloquent\Builder $query) use ($terms, $entity) {
foreach ($terms['exact'] as $inputTerm) {
$query->where(function (\Illuminate\Database\Eloquent\Builder $query) use ($inputTerm, $entity) {
$query->where('name', 'like', '%'.$inputTerm .'%')
// Handle filters
foreach ($terms['filters'] as $filterTerm => $filterValue) {
$functionName = camel_case('filter_' . $filterTerm);
- if (method_exists($this, $functionName)) $this->$functionName($entitySelect, $entity, $filterValue);
+ if (method_exists($this, $functionName)) {
+ $this->$functionName($entitySelect, $entity, $filterValue);
+ }
}
return $this->permissionService->enforceEntityRestrictions($entityType, $entitySelect, 'view');
// Parse standard terms
foreach (explode(' ', trim($searchString)) as $searchTerm) {
- if ($searchTerm !== '') $terms['search'][] = $searchTerm;
+ if ($searchTerm !== '') {
+ $terms['search'][] = $searchTerm;
+ }
}
// Split filter values out
* @param string $tagTerm
* @return mixed
*/
- protected function applyTagSearch(\Illuminate\Database\Eloquent\Builder $query, $tagTerm) {
+ protected function applyTagSearch(\Illuminate\Database\Eloquent\Builder $query, $tagTerm)
+ {
preg_match("/^(.*?)((".$this->getRegexEscapedOperators().")(.*?))?$/", $tagTerm, $tagSplit);
- $query->whereHas('tags', function(\Illuminate\Database\Eloquent\Builder $query) use ($tagSplit) {
+ $query->whereHas('tags', function (\Illuminate\Database\Eloquent\Builder $query) use ($tagSplit) {
$tagName = $tagSplit[1];
$tagOperator = count($tagSplit) > 2 ? $tagSplit[3] : '';
$tagValue = count($tagSplit) > 3 ? $tagSplit[4] : '';
$validOperator = in_array($tagOperator, $this->queryOperators);
if (!empty($tagOperator) && !empty($tagValue) && $validOperator) {
- if (!empty($tagName)) $query->where('name', '=', $tagName);
+ if (!empty($tagName)) {
+ $query->where('name', '=', $tagName);
+ }
if (is_numeric($tagValue) && $tagOperator !== 'like') {
// We have to do a raw sql query for this since otherwise PDO will quote the value and MySQL will
// search the value as a string which prevents being able to do number-based operations
* Index multiple Entities at once
* @param Entity[] $entities
*/
- protected function indexEntities($entities) {
+ protected function indexEntities($entities)
+ {
$terms = [];
foreach ($entities as $entity) {
$nameTerms = $this->generateTermArrayFromText($entity->name, 5);
$token = strtok($text, $splitChars);
while ($token !== false) {
- if (!isset($tokenMap[$token])) $tokenMap[$token] = 0;
+ if (!isset($tokenMap[$token])) {
+ $tokenMap[$token] = 0;
+ }
$tokenMap[$token]++;
$token = strtok($splitChars);
}
protected function filterUpdatedAfter(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- try { $date = date_create($input);
- } catch (\Exception $e) {return;}
+ try {
+ $date = date_create($input);
+ } catch (\Exception $e) {
+ return;
+ }
$query->where('updated_at', '>=', $date);
}
protected function filterUpdatedBefore(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- try { $date = date_create($input);
- } catch (\Exception $e) {return;}
+ try {
+ $date = date_create($input);
+ } catch (\Exception $e) {
+ return;
+ }
$query->where('updated_at', '<', $date);
}
protected function filterCreatedAfter(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- try { $date = date_create($input);
- } catch (\Exception $e) {return;}
+ try {
+ $date = date_create($input);
+ } catch (\Exception $e) {
+ return;
+ }
$query->where('created_at', '>=', $date);
}
protected function filterCreatedBefore(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- try { $date = date_create($input);
- } catch (\Exception $e) {return;}
+ try {
+ $date = date_create($input);
+ } catch (\Exception $e) {
+ return;
+ }
$query->where('created_at', '<', $date);
}
protected function filterCreatedBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- if (!is_numeric($input) && $input !== 'me') return;
- if ($input === 'me') $input = user()->id;
+ if (!is_numeric($input) && $input !== 'me') {
+ return;
+ }
+ if ($input === 'me') {
+ $input = user()->id;
+ }
$query->where('created_by', '=', $input);
}
protected function filterUpdatedBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- if (!is_numeric($input) && $input !== 'me') return;
- if ($input === 'me') $input = user()->id;
+ if (!is_numeric($input) && $input !== 'me') {
+ return;
+ }
+ if ($input === 'me') {
+ $input = user()->id;
+ }
$query->where('updated_by', '=', $input);
}
$query->where('name', 'like', '%' .$input. '%');
}
- protected function filterInTitle(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input) {$this->filterInName($query, $model, $input);}
+ protected function filterInTitle(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+ {
+ $this->filterInName($query, $model, $input);
+ }
protected function filterInBody(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
protected function filterViewedByMe(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- $query->whereHas('views', function($query) {
+ $query->whereHas('views', function ($query) {
$query->where('user_id', '=', user()->id);
});
}
protected function filterNotViewedByMe(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
- $query->whereDoesntHave('views', function($query) {
+ $query->whereDoesntHave('views', function ($query) {
$query->where('user_id', '=', user()->id);
});
}
protected function filterSortBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
{
$functionName = camel_case('sort_by_' . $input);
- if (method_exists($this, $functionName)) $this->$functionName($query, $model);
+ if (method_exists($this, $functionName)) {
+ $this->$functionName($query, $model);
+ }
}
$query->join($commentQuery, $model->getTable() . '.id', '=', 'comments.entity_id')->orderBy('last_commented', 'desc');
}
-}
\ No newline at end of file
+}
*/
public function get($key, $default = false)
{
- if ($default === false) $default = config('setting-defaults.' . $key, false);
- if (isset($this->localCache[$key])) return $this->localCache[$key];
+ if ($default === false) {
+ $default = config('setting-defaults.' . $key, false);
+ }
+ if (isset($this->localCache[$key])) {
+ return $this->localCache[$key];
+ }
$value = $this->getValueFromStore($key, $default);
$formatted = $this->formatValue($value, $default);
{
// Check for an overriding value
$overrideValue = $this->getOverrideValue($key);
- if ($overrideValue !== null) return $overrideValue;
+ if ($overrideValue !== null) {
+ return $overrideValue;
+ }
// Check the cache
$cacheKey = $this->cachePrefix . $key;
$cacheVal = $this->cache->get($cacheKey, null);
- if ($cacheVal !== null) return $cacheVal;
+ if ($cacheVal !== null) {
+ return $cacheVal;
+ }
// Check the database
$settingObject = $this->getSettingObjectByKey($key);
protected function formatValue($value, $default)
{
// Change string booleans to actual booleans
- if ($value === 'true') $value = true;
- if ($value === 'false') $value = false;
+ if ($value === 'true') {
+ $value = true;
+ }
+ if ($value === 'false') {
+ $value = false;
+ }
// Set to default if empty
- if ($value === '') $value = $default;
+ if ($value === '') {
+ $value = $default;
+ }
return $value;
}
*/
protected function getOverrideValue($key)
{
- if ($key === 'registration-enabled' && config('auth.method') === 'ldap') return false;
+ if ($key === 'registration-enabled' && config('auth.method') === 'ldap') {
+ return false;
+ }
return null;
}
-
-}
\ No newline at end of file
+}
{
$driver = trim(strtolower($socialDriver));
- if (!in_array($driver, $this->validSocialDrivers)) abort(404, trans('errors.social_driver_not_found'));
- if (!$this->checkDriverConfigured($driver)) throw new SocialDriverNotConfigured(trans('errors.social_driver_not_configured', ['socialAccount' => title_case($socialDriver)]));
+ if (!in_array($driver, $this->validSocialDrivers)) {
+ abort(404, trans('errors.social_driver_not_found'));
+ }
+ if (!$this->checkDriverConfigured($driver)) {
+ throw new SocialDriverNotConfigured(trans('errors.social_driver_not_configured', ['socialAccount' => title_case($socialDriver)]));
+ }
return $driver;
}
session()->flash('success', trans('settings.users_social_disconnected', ['socialAccount' => title_case($socialDriver)]));
return redirect(user()->getEditUrl());
}
-
-}
\ No newline at end of file
+}
*/
protected function getStorage()
{
- if ($this->storageInstance !== null) return $this->storageInstance;
+ if ($this->storageInstance !== null) {
+ return $this->storageInstance;
+ }
$storageType = config('filesystems.default');
$this->storageInstance = $this->fileSystem->disk($storageType);
{
return strtolower(config('filesystems.default')) === 'local';
}
-}
\ No newline at end of file
+}
public function add(Entity $entity)
{
$user = user();
- if ($user === null || $user->isDefault()) return 0;
+ if ($user === null || $user->isDefault()) {
+ return 0;
+ }
$view = $entity->views()->where('user_id', '=', $user->id)->first();
// Add view if model exists
if ($view) {
public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
{
$user = user();
- if ($user === null || $user->isDefault()) return collect();
+ if ($user === null || $user->isDefault()) {
+ return collect();
+ }
$query = $this->permissionService
->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
- if ($filterModel) $query = $query->where('viewable_type', '=', get_class($filterModel));
+ if ($filterModel) {
+ $query = $query->where('viewable_type', '=', get_class($filterModel));
+ }
$query = $query->where('user_id', '=', $user->id);
$viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
{
$this->view->truncate();
}
-
-}
\ No newline at end of file
+}
<?php namespace BookStack;
-
class SocialAccount extends Model
{
{
return $this->morphTo('entity');
}
-}
\ No newline at end of file
+}
*/
public function roles()
{
- if ($this->id === 0) return ;
+ if ($this->id === 0) {
+ return ;
+ }
return $this->belongsToMany(Role::class);
}
*/
public function permissions($cache = true)
{
- if(isset($this->permissions) && $cache) return $this->permissions;
+ if (isset($this->permissions) && $cache) {
+ return $this->permissions;
+ }
$this->load('roles.permissions');
- $permissions = $this->roles->map(function($role) {
+ $permissions = $this->roles->map(function ($role) {
return $role->permissions;
})->flatten()->unique();
$this->permissions = $permissions;
*/
public function can($permissionName)
{
- if ($this->email === 'guest') return false;
+ if ($this->email === 'guest') {
+ return false;
+ }
return $this->permissions()->pluck('name')->contains($permissionName);
}
{
$default = baseUrl('/user_avatar.png');
$imageId = $this->image_id;
- if ($imageId === 0 || $imageId === '0' || $imageId === null) return $default;
+ if ($imageId === 0 || $imageId === '0' || $imageId === null) {
+ return $default;
+ }
try {
$avatar = $this->avatar ? baseUrl($this->avatar->getThumb($size, $size, false)) : $default;
*/
public function getShortName($chars = 8)
{
- if (strlen($this->name) <= $chars) return $this->name;
+ if (strlen($this->name) <= $chars) {
+ return $this->name;
+ }
$splitName = explode(' ', $this->name);
- if (strlen($splitName[0]) <= $chars) return $splitName[0];
+ if (strlen($splitName[0]) <= $chars) {
+ return $splitName[0];
+ }
return '';
}
function setting($key = null, $default = false)
{
$settingService = resolve(\BookStack\Services\SettingService::class);
- if (is_null($key)) return $settingService;
+ if (is_null($key)) {
+ return $settingService;
+ }
return $settingService->get($key, $default);
}
function baseUrl($path, $forceAppDomain = false)
{
$isFullUrl = strpos($path, 'http') === 0;
- if ($isFullUrl && !$forceAppDomain) return $path;
+ if ($isFullUrl && !$forceAppDomain) {
+ return $path;
+ }
$path = trim($path, '/');
// Remove non-specified domain if forced and we have a domain
return app('redirect')->to($to, $status, $headers, $secure);
}
-function icon($name, $attrs = []) {
+function icon($name, $attrs = [])
+{
$iconPath = resource_path('assets/icons/' . $name . '.svg');
$attrString = ' ';
foreach ($attrs as $attrName => $attr) {
foreach ($queryData as $name => $value) {
$trimmedVal = trim($value);
- if ($trimmedVal === '') continue;
+ if ($trimmedVal === '') {
+ continue;
+ }
$queryStringSections[] = urlencode($name) . '=' . urlencode($trimmedVal);
}
- if (count($queryStringSections) === 0) return $path;
+ if (count($queryStringSections) === 0) {
+ return $path;
+ }
return baseUrl($path . '?' . implode('&', $queryStringSections));
-}
\ No newline at end of file
+}
"symfony/dom-crawler": "3.1.*",
"laravel/browser-kit-testing": "^2.0",
"barryvdh/laravel-ide-helper": "^2.4.1",
- "barryvdh/laravel-debugbar": "^3.1.0"
+ "barryvdh/laravel-debugbar": "^3.1.0",
+ "squizlabs/php_codesniffer": "^3.2"
},
"autoload": {
"classmap": [
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "content-hash": "7d60f09393b99551e9ffdb6622ed7ade",
+ "content-hash": "8ad5cb7acc1115a77404d1be899984ac",
"packages": [
{
"name": "aws/aws-sdk-php",
"homepage": "https://github.com/sebastianbergmann/version",
"time": "2016-10-03T07:35:21+00:00"
},
+ {
+ "name": "squizlabs/php_codesniffer",
+ "version": "3.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/squizlabs/PHP_CodeSniffer.git",
+ "reference": "d7c00c3000ac0ce79c96fcbfef86b49a71158cd1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/d7c00c3000ac0ce79c96fcbfef86b49a71158cd1",
+ "reference": "d7c00c3000ac0ce79c96fcbfef86b49a71158cd1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-simplexml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0"
+ },
+ "bin": [
+ "bin/phpcs",
+ "bin/phpcbf"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Greg Sherwood",
+ "role": "lead"
+ }
+ ],
+ "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.",
+ "homepage": "http://www.squizlabs.com/php-codesniffer",
+ "keywords": [
+ "phpcs",
+ "standards"
+ ],
+ "time": "2017-12-19T21:44:46+00:00"
+ },
{
"name": "symfony/class-loader",
"version": "v3.3.6",
--- /dev/null
+<?xml version="1.0"?>
+<ruleset name="PHP_CodeSniffer">
+ <description>The coding standard for BookStack.</description>
+ <file>app</file>
+ <exclude-pattern>*/migrations/*</exclude-pattern>
+ <arg value="np"/>
+ <rule ref="PSR2"/>
+</ruleset>
\ No newline at end of file
Feel free to create issues to request new features or to report bugs and problems. Just please follow the template given when creating the issue.
-### Pull Request
+### Standards
+
+PHP code within BookStack is generally to [PSR-2](http://www.php-fig.org/psr/psr-2/) standards. From the BookStack root folder you can run `./vendor/bin/phpcs` to check code is formatted correctly and `./vendor/bin/phpcbf` to auto-fix non-PSR-2 code.
+
+### Pull Requests
Pull requests are very welcome. If the scope of your pull request is large it may be best to open the pull request early or create an issue for it to discuss how it will fit in to the project and plan out the merge.
* [Snappy (WKHTML2PDF)](https://github.com/barryvdh/laravel-snappy)
* [Laravel IDE helper](https://github.com/barryvdh/laravel-ide-helper)
* [WKHTMLtoPDF](http://wkhtmltopdf.org/index.html)
+* [Draw.io](https://github.com/jgraph/drawio)