Merge pull request #2 from BookStackApp/master

Getting the latest code.
This commit is contained in:
Abijeet Patro 2017-11-15 08:05:20 +05:30 committed by GitHub
commit 0b967d84ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 6124 additions and 33 deletions

View File

@ -53,7 +53,7 @@ class RegisterController extends Controller
*/ */
public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo) public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
{ {
$this->middleware('guest')->except(['socialCallback', 'detachSocialAccount']); $this->middleware('guest')->only(['getRegister', 'postRegister', 'socialRegister']);
$this->socialAuthService = $socialAuthService; $this->socialAuthService = $socialAuthService;
$this->emailConfirmationService = $emailConfirmationService; $this->emailConfirmationService = $emailConfirmationService;
$this->userRepo = $userRepo; $this->userRepo = $userRepo;

View File

@ -30,8 +30,11 @@ class Authenticate
*/ */
public function handle($request, Closure $next) public function handle($request, Closure $next)
{ {
if ($this->auth->check() && setting('registration-confirmation') && !$this->auth->user()->email_confirmed) { if ($this->auth->check()) {
return redirect(baseUrl('/register/confirm/awaiting')); $requireConfirmation = (setting('registration-confirmation') || setting('registration-restrict'));
if ($requireConfirmation && !$this->auth->user()->email_confirmed) {
return redirect('/register/confirm/awaiting');
}
} }
if ($this->auth->guest() && !setting('app-public')) { if ($this->auth->guest() && !setting('app-public')) {

View File

@ -553,8 +553,9 @@ class EntityRepo
*/ */
protected function nameToSlug($name) protected function nameToSlug($name)
{ {
$slug = str_replace(' ', '-', strtolower($name)); $slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', mb_strtolower($name));
$slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', $slug); $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; return $slug;
} }

View File

@ -29,7 +29,7 @@ return [
| |
*/ */
'lifetime' => 120, 'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false, 'expire_on_close' => false,

5977
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -125,6 +125,4 @@ const methods = {
}; };
const computed = []; module.exports = {template, data, props, methods};
module.exports = {template, data, props, methods, computed};

View File

@ -9,8 +9,6 @@ let data = {
const components = {draggable, autosuggest}; const components = {draggable, autosuggest};
const directives = {}; const directives = {};
let computed = {};
let methods = { let methods = {
addEmptyTag() { addEmptyTag() {
@ -64,5 +62,5 @@ function mounted() {
} }
module.exports = { module.exports = {
data, computed, methods, mounted, components, directives data, methods, mounted, components, directives
}; };

View File

@ -37,4 +37,6 @@ return [
'book_sort' => 'livro classificado', 'book_sort' => 'livro classificado',
'book_sort_notification' => 'Livro reclassificado com sucesso', 'book_sort_notification' => 'Livro reclassificado com sucesso',
// Other
'commented_on' => 'comentou em',
]; ];

View File

@ -18,6 +18,8 @@ return [
*/ */
'sign_up' => 'Registrar-se', 'sign_up' => 'Registrar-se',
'log_in' => 'Entrar', 'log_in' => 'Entrar',
'log_in_with' => 'Entrar com :socialDriver',
'sign_up_with' => 'Registrar com :socialDriver',
'logout' => 'Sair', 'logout' => 'Sair',
'name' => 'Nome', 'name' => 'Nome',

View File

@ -10,6 +10,7 @@ return [
'save' => 'Salvar', 'save' => 'Salvar',
'continue' => 'Continuar', 'continue' => 'Continuar',
'select' => 'Selecionar', 'select' => 'Selecionar',
'more' => 'Mais',
/** /**
* Form Labels * Form Labels
@ -28,12 +29,13 @@ return [
'edit' => 'Editar', 'edit' => 'Editar',
'sort' => 'Ordenar', 'sort' => 'Ordenar',
'move' => 'Mover', 'move' => 'Mover',
'reply' => 'Responder',
'delete' => 'Excluir', 'delete' => 'Excluir',
'search' => 'Pesquisar', 'search' => 'Pesquisar',
'search_clear' => 'Limpar Pesquisa', 'search_clear' => 'Limpar Pesquisa',
'reset' => 'Resetar', 'reset' => 'Resetar',
'remove' => 'Remover', 'remove' => 'Remover',
'add' => 'Adicionar',
/** /**
* Misc * Misc
@ -43,6 +45,7 @@ return [
'no_items' => 'Nenhum item disponível', 'no_items' => 'Nenhum item disponível',
'back_to_top' => 'Voltar ao topo', 'back_to_top' => 'Voltar ao topo',
'toggle_details' => 'Alternar Detalhes', 'toggle_details' => 'Alternar Detalhes',
'details' => 'Detalhes',
/** /**
* Header * Header

View File

@ -20,5 +20,13 @@ return [
'image_preview' => 'Virtualização de Imagem', 'image_preview' => 'Virtualização de Imagem',
'image_upload_success' => 'Upload de imagem efetuado com sucesso', 'image_upload_success' => 'Upload de imagem efetuado com sucesso',
'image_update_success' => 'Upload de detalhes da imagem efetuado com sucesso', 'image_update_success' => 'Upload de detalhes da imagem efetuado com sucesso',
'image_delete_success' => 'Imagem excluída com sucesso' 'image_delete_success' => 'Imagem excluída com sucesso',
/**
* Code editor
*/
'code_editor' => 'Editar Código',
'code_language' => 'Linguagem do Código',
'code_content' => 'Código',
'code_save' => 'Salvar Código',
]; ];

View File

@ -14,11 +14,11 @@ return [
'recent_activity' => 'Atividade recente', 'recent_activity' => 'Atividade recente',
'create_now' => 'Criar um agora', 'create_now' => 'Criar um agora',
'revisions' => 'Revisões', 'revisions' => 'Revisões',
'meta_revision' => 'Revisão #:revisionCount',
'meta_created' => 'Criado em :timeLength', 'meta_created' => 'Criado em :timeLength',
'meta_created_name' => 'Criado em :timeLength por :user', 'meta_created_name' => 'Criado em :timeLength por :user',
'meta_updated' => 'Atualizado em :timeLength', 'meta_updated' => 'Atualizado em :timeLength',
'meta_updated_name' => 'Atualizado em :timeLength por :user', 'meta_updated_name' => 'Atualizado em :timeLength por :user',
'x_pages' => ':count Páginas',
'entity_select' => 'Seleção de Entidade', 'entity_select' => 'Seleção de Entidade',
'images' => 'Imagens', 'images' => 'Imagens',
'my_recent_drafts' => 'Meus rascunhos recentes', 'my_recent_drafts' => 'Meus rascunhos recentes',
@ -43,19 +43,39 @@ return [
* Search * Search
*/ */
'search_results' => 'Resultado(s) da Pesquisa', 'search_results' => 'Resultado(s) da Pesquisa',
'search_total_results_found' => ':count resultado encontrado|:count resultados encontrados',
'search_clear' => 'Limpar Pesquisa', 'search_clear' => 'Limpar Pesquisa',
'search_no_pages' => 'Nenhuma página corresponde à pesquisa', 'search_no_pages' => 'Nenhuma página corresponde à pesquisa',
'search_for_term' => 'Pesquisar por :term', 'search_for_term' => 'Pesquisar por :term',
'search_more' => 'Mais Resultados',
'search_filters' => 'Filtros de Pesquisa',
'search_content_type' => 'Tipo de Conteúdo',
'search_exact_matches' => 'Correspondências Exatas',
'search_tags' => 'Tags',
'search_viewed_by_me' => 'Visto por mim',
'search_not_viewed_by_me' => 'Não visto por mim',
'search_permissions_set' => 'Permissão definida',
'search_created_by_me' => 'Criado por mim',
'search_updated_by_me' => 'Atualizado por mim',
'search_updated_before' => 'Atualizado antes de',
'search_updated_after' => 'Atualizado depois de',
'search_created_before' => 'Criado antes de',
'search_created_after' => 'Criado depois de',
'search_set_date' => 'Definir data',
'search_update' => 'Refazer Pesquisa',
/** /**
* Books * Books
*/ */
'book' => 'Livro', 'book' => 'Livro',
'books' => 'Livros', 'books' => 'Livros',
'x_books' => ':count Livro|:count Livros',
'books_empty' => 'Nenhum livro foi criado', 'books_empty' => 'Nenhum livro foi criado',
'books_popular' => 'Livros populares', 'books_popular' => 'Livros populares',
'books_recent' => 'Livros recentes', 'books_recent' => 'Livros recentes',
'books_new' => 'Livros novos',
'books_popular_empty' => 'Os livros mais populares aparecerão aqui.', 'books_popular_empty' => 'Os livros mais populares aparecerão aqui.',
'books_new_empty' => 'Os livros criados mais recentemente aparecerão aqui.',
'books_create' => 'Criar novo Livro', 'books_create' => 'Criar novo Livro',
'books_delete' => 'Excluir Livro', 'books_delete' => 'Excluir Livro',
'books_delete_named' => 'Excluir Livro :bookName', 'books_delete_named' => 'Excluir Livro :bookName',
@ -83,18 +103,18 @@ return [
/** /**
* Chapters * Chapters
*/ */
'chapter' => 'Capitulo', 'chapter' => 'Capítulo',
'chapters' => 'Capítulos', 'chapters' => 'Capítulos',
'x_chapters' => ':count Capítulo|:count Capítulos',
'chapters_popular' => 'Capítulos Populares', 'chapters_popular' => 'Capítulos Populares',
'chapters_new' => 'Novo Capítulo', 'chapters_new' => 'Novo Capítulo',
'chapters_create' => 'Criar novo Capítulo', 'chapters_create' => 'Criar novo Capítulo',
'chapters_delete' => 'Excluír Capítulo', 'chapters_delete' => 'Excluír Capítulo',
'chapters_delete_named' => 'Excluir Capítulo :chapterName', 'chapters_delete_named' => 'Excluir Capítulo :chapterName',
'chapters_delete_explain' => 'A ação vai excluír o capítulo de nome \':chapterName\'. Todas as páginas do capítulo serão removidas 'chapters_delete_explain' => 'A ação vai excluír o capítulo de nome \':chapterName\'. Todas as páginas do capítulo serão removidas e adicionadas diretamente ao livro pai.',
e adicionadas diretamente ao livro pai.', 'chapters_delete_confirm' => 'Tem certeza que deseja excluír o capítulo?',
'chapters_delete_confirm' => 'Tem certeza que deseja excluír o capitulo?',
'chapters_edit' => 'Editar Capítulo', 'chapters_edit' => 'Editar Capítulo',
'chapters_edit_named' => 'Editar capitulo :chapterName', 'chapters_edit_named' => 'Editar capítulo :chapterName',
'chapters_save' => 'Salvar Capítulo', 'chapters_save' => 'Salvar Capítulo',
'chapters_move' => 'Mover Capítulo', 'chapters_move' => 'Mover Capítulo',
'chapters_move_named' => 'Mover Capítulo :chapterName', 'chapters_move_named' => 'Mover Capítulo :chapterName',
@ -103,12 +123,14 @@ return [
'chapters_empty' => 'Nenhuma página existente nesse capítulo.', 'chapters_empty' => 'Nenhuma página existente nesse capítulo.',
'chapters_permissions_active' => 'Permissões de Capítulo ativadas', 'chapters_permissions_active' => 'Permissões de Capítulo ativadas',
'chapters_permissions_success' => 'Permissões de Capítulo atualizadas', 'chapters_permissions_success' => 'Permissões de Capítulo atualizadas',
'chapters_search_this' => 'Pesquisar este Capítulo',
/** /**
* Pages * Pages
*/ */
'page' => 'Página', 'page' => 'Página',
'pages' => 'Páginas', 'pages' => 'Páginas',
'x_pages' => ':count Página|:count Páginas',
'pages_popular' => 'Páginas Popular', 'pages_popular' => 'Páginas Popular',
'pages_new' => 'Nova Página', 'pages_new' => 'Nova Página',
'pages_attachments' => 'Anexos', 'pages_attachments' => 'Anexos',
@ -145,11 +167,13 @@ return [
'pages_move_success' => 'Pagina movida para ":parentName"', 'pages_move_success' => 'Pagina movida para ":parentName"',
'pages_permissions' => 'Permissões de Página', 'pages_permissions' => 'Permissões de Página',
'pages_permissions_success' => 'Permissões de Página atualizadas', 'pages_permissions_success' => 'Permissões de Página atualizadas',
'pages_revision' => 'Revisão',
'pages_revisions' => 'Revisões de Página', 'pages_revisions' => 'Revisões de Página',
'pages_revisions_named' => 'Revisões de Página para :pageName', 'pages_revisions_named' => 'Revisões de Página para :pageName',
'pages_revision_named' => 'Revisão de Página para :pageName', 'pages_revision_named' => 'Revisão de Página para :pageName',
'pages_revisions_created_by' => 'Criado por', 'pages_revisions_created_by' => 'Criado por',
'pages_revisions_date' => 'Data da Revisão', 'pages_revisions_date' => 'Data da Revisão',
'pages_revisions_number' => '#',
'pages_revisions_changelog' => 'Changelog', 'pages_revisions_changelog' => 'Changelog',
'pages_revisions_changes' => 'Mudanças', 'pages_revisions_changes' => 'Mudanças',
'pages_revisions_current' => 'Versão atual', 'pages_revisions_current' => 'Versão atual',
@ -218,8 +242,19 @@ return [
/** /**
* Comments * Comments
*/ */
'comentário' => 'Comentário', 'comment' => 'Comentário',
'comentários' => 'Comentários', 'comments' => 'Comentários',
'comment_placeholder' => 'Digite seus comentários aqui', 'comment_placeholder' => 'Digite seus comentários aqui',
'comment_count' => '{0} Nenhum comentário|{1} 1 Comentário|[2,*] :count Comentários',
'comment_save' => 'Salvar comentário', 'comment_save' => 'Salvar comentário',
'comment_saving' => 'Salvando comentário...',
'comment_deleting' => 'Removendo comentário...',
'comment_new' => 'Novo comentário',
'comment_created' => 'comentado :createDiff',
'comment_updated' => 'Editado :updateDiff por :username',
'comment_deleted_success' => 'Comentário removido',
'comment_created_success' => 'Comentário adicionado',
'comment_updated_success' => 'Comentário editado',
'comment_delete_confirm' => 'Você tem certeza de que quer deletar este comentário?',
'comment_in_reply_to' => 'Em resposta à :commentId',
]; ];

View File

@ -41,6 +41,7 @@ return [
// Pages // Pages
'page_draft_autosave_fail' => 'Falou ao tentar salvar o rascunho. Certifique-se que a conexão de internet está funcional antes de tentar salvar essa página', 'page_draft_autosave_fail' => 'Falou ao tentar salvar o rascunho. Certifique-se que a conexão de internet está funcional antes de tentar salvar essa página',
'page_custom_home_deletion' => 'Não pode deletar uma página que está definida como página inicial',
// Entities // Entities
'entity_not_found' => 'Entidade não encontrada', 'entity_not_found' => 'Entidade não encontrada',
@ -60,6 +61,13 @@ return [
'role_system_cannot_be_deleted' => 'Esse perfil é um perfil de sistema e não pode ser excluído', 'role_system_cannot_be_deleted' => 'Esse perfil é um perfil de sistema e não pode ser excluído',
'role_registration_default_cannot_delete' => 'Esse perfil não poderá se excluído enquando estiver registrado como o perfil padrão', 'role_registration_default_cannot_delete' => 'Esse perfil não poderá se excluído enquando estiver registrado como o perfil padrão',
// comments
'comment_list' => 'Ocorreu um erro ao buscar os comentários.',
'cannot_add_comment_to_draft' => 'Você não pode adicionar comentários a um rascunho.',
'comment_add' => 'Ocorreu um erro ao adicionar o comentário.',
'comment_delete' => 'Ocorreu um erro ao excluir o comentário.',
'empty_comment' => 'Não é possível adicionar um comentário vazio.',
// Error pages // Error pages
'404_page_not_found' => 'Página não encontrada', '404_page_not_found' => 'Página não encontrada',
'sorry_page_not_found' => 'Desculpe, a página que você está procurando não pôde ser encontrada.', 'sorry_page_not_found' => 'Desculpe, a página que você está procurando não pôde ser encontrada.',
@ -67,11 +75,4 @@ return [
'error_occurred' => 'Um erro ocorreu', 'error_occurred' => 'Um erro ocorreu',
'app_down' => ':appName está fora do ar no momento', 'app_down' => ':appName está fora do ar no momento',
'back_soon' => 'Voltaremos em seguida.', 'back_soon' => 'Voltaremos em seguida.',
// comments
'comment_list' => 'Ocorreu um erro ao buscar os comentários.',
'cannot_add_comment_to_draft' => 'Você não pode adicionar comentários a um rascunho.',
'comment_add' => 'Ocorreu um erro ao adicionar o comentário.',
'comment_delete' => 'Ocorreu um erro ao excluir o comentário.',
'empty_comment' => 'Não é possível adicionar um comentário vazio.',
]; ];

View File

@ -31,6 +31,9 @@ return [
'app_logo_desc' => 'A imagem deve ter 43px de altura. <br>Imagens mais largas devem ser reduzidas.', 'app_logo_desc' => 'A imagem deve ter 43px de altura. <br>Imagens mais largas devem ser reduzidas.',
'app_primary_color' => 'Cor primária da Aplicação', 'app_primary_color' => 'Cor primária da Aplicação',
'app_primary_color_desc' => 'Esse valor deverá ser Hexadecimal. <br>Deixe em branco para que o Bookstack assuma a cor padrão.', 'app_primary_color_desc' => 'Esse valor deverá ser Hexadecimal. <br>Deixe em branco para que o Bookstack assuma a cor padrão.',
'app_homepage' => 'Página incial',
'app_homepage_desc' => 'Selecione a página para ser usada como página inicial em vez da padrão. Permissões da página serão ignoradas.',
'app_homepage_default' => 'Escolhida página inicial padrão',
/** /**
* Registration settings * Registration settings
@ -101,6 +104,7 @@ return [
'users_edit_success' => 'Usuário atualizado com sucesso', 'users_edit_success' => 'Usuário atualizado com sucesso',
'users_avatar' => 'Imagem de Usuário', 'users_avatar' => 'Imagem de Usuário',
'users_avatar_desc' => 'Essa imagem deve ser um quadrado com aproximadamente 256px de altura e largura.', 'users_avatar_desc' => 'Essa imagem deve ser um quadrado com aproximadamente 256px de altura e largura.',
'users_preferred_language' => 'Linguagem de Preferência',
'users_social_accounts' => 'Contas Sociais', 'users_social_accounts' => 'Contas Sociais',
'users_social_accounts_info' => 'Aqui você pode conectar outras contas para acesso mais rápido. Desconectar uma conta não retira a possibilidade de acesso usando-a. Para revogar o acesso ao perfil através da conta social, você deverá fazê-lo na sua conta social.', 'users_social_accounts_info' => 'Aqui você pode conectar outras contas para acesso mais rápido. Desconectar uma conta não retira a possibilidade de acesso usando-a. Para revogar o acesso ao perfil através da conta social, você deverá fazê-lo na sua conta social.',
'users_social_connect' => 'Contas conectadas', 'users_social_connect' => 'Contas conectadas',

View File

@ -124,6 +124,45 @@ class AuthTest extends BrowserKitTest
->press('Create Account') ->press('Create Account')
->seePageIs('/register/confirm') ->seePageIs('/register/confirm')
->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]); ->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
$this->visit('/')->seePageIs('/login')
->type($user->email, '#email')
->type($user->password, '#password')
->press('Log In')
->seePageIs('/register/confirm/awaiting')
->seeText('Email Address Not Confirmed');
}
public function test_restricted_registration_with_confirmation_disabled()
{
$this->setSettings(['registration-enabled' => 'true', 'registration-confirmation' => 'false', 'registration-restrict' => 'example.com']);
$user = factory(\BookStack\User::class)->make();
// Go through registration process
$this->visit('/register')
->type($user->name, '#name')
->type($user->email, '#email')
->type($user->password, '#password')
->press('Create Account')
->seePageIs('/register')
->dontSeeInDatabase('users', ['email' => $user->email])
->see('That email domain does not have access to this application');
$user->email = 'barry@example.com';
$this->visit('/register')
->type($user->name, '#name')
->type($user->email, '#email')
->type($user->password, '#password')
->press('Create Account')
->seePageIs('/register/confirm')
->seeInDatabase('users', ['name' => $user->name, 'email' => $user->email, 'email_confirmed' => false]);
$this->visit('/')->seePageIs('/login')
->type($user->email, '#email')
->type($user->password, '#password')
->press('Log In')
->seePageIs('/register/confirm/awaiting')
->seeText('Email Address Not Confirmed');
} }
public function test_user_creation() public function test_user_creation()

View File

@ -11,7 +11,6 @@ class EntityTest extends BrowserKitTest
public function test_entity_creation() public function test_entity_creation()
{ {
// Test Creation // Test Creation
$book = $this->bookCreation(); $book = $this->bookCreation();
$chapter = $this->chapterCreation($book); $chapter = $this->chapterCreation($book);
@ -257,4 +256,25 @@ class EntityTest extends BrowserKitTest
->seeInElement('#recently-updated-pages', $page->name); ->seeInElement('#recently-updated-pages', $page->name);
} }
public function test_slug_multi_byte_lower_casing()
{
$entityRepo = app(EntityRepo::class);
$book = $entityRepo->createFromInput('book', [
'name' => 'КНИГА'
]);
$this->assertEquals('книга', $book->slug);
}
public function test_slug_format()
{
$entityRepo = app(EntityRepo::class);
$book = $entityRepo->createFromInput('book', [
'name' => 'PartA / PartB / PartC'
]);
$this->assertEquals('parta-partb-partc', $book->slug);
}
} }