mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-08-26 20:22:18 +00:00
Merge pull request #1 from BookStackApp/master
Getting the latest changes.
This commit is contained in:
commit
10dc851697
@ -53,7 +53,7 @@ class RegisterController extends Controller
|
||||
*/
|
||||
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->emailConfirmationService = $emailConfirmationService;
|
||||
$this->userRepo = $userRepo;
|
||||
|
@ -30,8 +30,11 @@ class Authenticate
|
||||
*/
|
||||
public function handle($request, Closure $next)
|
||||
{
|
||||
if ($this->auth->check() && setting('registration-confirmation') && !$this->auth->user()->email_confirmed) {
|
||||
return redirect(baseUrl('/register/confirm/awaiting'));
|
||||
if ($this->auth->check()) {
|
||||
$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')) {
|
||||
|
@ -553,8 +553,9 @@ class EntityRepo
|
||||
*/
|
||||
protected function nameToSlug($name)
|
||||
{
|
||||
$slug = str_replace(' ', '-', strtolower($name));
|
||||
$slug = preg_replace('/[\+\/\\\?\@\}\{\.\,\=\[\]\#\&\!\*\'\;\:\$\%]/', '', $slug);
|
||||
$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);
|
||||
return $slug;
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'lifetime' => 120,
|
||||
'lifetime' => env('SESSION_LIFETIME', 120),
|
||||
|
||||
'expire_on_close' => false,
|
||||
|
||||
|
5977
package-lock.json
generated
Normal file
5977
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@ -125,6 +125,4 @@ const methods = {
|
||||
|
||||
};
|
||||
|
||||
const computed = [];
|
||||
|
||||
module.exports = {template, data, props, methods, computed};
|
||||
module.exports = {template, data, props, methods};
|
@ -9,8 +9,6 @@ let data = {
|
||||
const components = {draggable, autosuggest};
|
||||
const directives = {};
|
||||
|
||||
let computed = {};
|
||||
|
||||
let methods = {
|
||||
|
||||
addEmptyTag() {
|
||||
@ -64,5 +62,5 @@ function mounted() {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
data, computed, methods, mounted, components, directives
|
||||
data, methods, mounted, components, directives
|
||||
};
|
@ -36,5 +36,7 @@ return [
|
||||
'book_delete_notification' => 'Livro excluído com sucesso',
|
||||
'book_sort' => 'livro classificado',
|
||||
'book_sort_notification' => 'Livro reclassificado com sucesso',
|
||||
|
||||
|
||||
// Other
|
||||
'commented_on' => 'comentou em',
|
||||
];
|
||||
|
@ -18,6 +18,8 @@ return [
|
||||
*/
|
||||
'sign_up' => 'Registrar-se',
|
||||
'log_in' => 'Entrar',
|
||||
'log_in_with' => 'Entrar com :socialDriver',
|
||||
'sign_up_with' => 'Registrar com :socialDriver',
|
||||
'logout' => 'Sair',
|
||||
|
||||
'name' => 'Nome',
|
||||
|
@ -10,6 +10,7 @@ return [
|
||||
'save' => 'Salvar',
|
||||
'continue' => 'Continuar',
|
||||
'select' => 'Selecionar',
|
||||
'more' => 'Mais',
|
||||
|
||||
/**
|
||||
* Form Labels
|
||||
@ -28,12 +29,13 @@ return [
|
||||
'edit' => 'Editar',
|
||||
'sort' => 'Ordenar',
|
||||
'move' => 'Mover',
|
||||
'reply' => 'Responder',
|
||||
'delete' => 'Excluir',
|
||||
'search' => 'Pesquisar',
|
||||
'search_clear' => 'Limpar Pesquisa',
|
||||
'reset' => 'Resetar',
|
||||
'remove' => 'Remover',
|
||||
|
||||
'add' => 'Adicionar',
|
||||
|
||||
/**
|
||||
* Misc
|
||||
@ -43,6 +45,7 @@ return [
|
||||
'no_items' => 'Nenhum item disponível',
|
||||
'back_to_top' => 'Voltar ao topo',
|
||||
'toggle_details' => 'Alternar Detalhes',
|
||||
'details' => 'Detalhes',
|
||||
|
||||
/**
|
||||
* Header
|
||||
|
@ -20,5 +20,13 @@ return [
|
||||
'image_preview' => 'Virtualização de Imagem',
|
||||
'image_upload_success' => 'Upload de 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',
|
||||
];
|
@ -14,11 +14,11 @@ return [
|
||||
'recent_activity' => 'Atividade recente',
|
||||
'create_now' => 'Criar um agora',
|
||||
'revisions' => 'Revisões',
|
||||
'meta_revision' => 'Revisão #:revisionCount',
|
||||
'meta_created' => 'Criado em :timeLength',
|
||||
'meta_created_name' => 'Criado em :timeLength por :user',
|
||||
'meta_updated' => 'Atualizado em :timeLength',
|
||||
'meta_updated_name' => 'Atualizado em :timeLength por :user',
|
||||
'x_pages' => ':count Páginas',
|
||||
'entity_select' => 'Seleção de Entidade',
|
||||
'images' => 'Imagens',
|
||||
'my_recent_drafts' => 'Meus rascunhos recentes',
|
||||
@ -43,19 +43,39 @@ return [
|
||||
* Search
|
||||
*/
|
||||
'search_results' => 'Resultado(s) da Pesquisa',
|
||||
'search_total_results_found' => ':count resultado encontrado|:count resultados encontrados',
|
||||
'search_clear' => 'Limpar Pesquisa',
|
||||
'search_no_pages' => 'Nenhuma página corresponde à pesquisa',
|
||||
'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
|
||||
*/
|
||||
'book' => 'Livro',
|
||||
'books' => 'Livros',
|
||||
'x_books' => ':count Livro|:count Livros',
|
||||
'books_empty' => 'Nenhum livro foi criado',
|
||||
'books_popular' => 'Livros populares',
|
||||
'books_recent' => 'Livros recentes',
|
||||
'books_new' => 'Livros novos',
|
||||
'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_delete' => 'Excluir Livro',
|
||||
'books_delete_named' => 'Excluir Livro :bookName',
|
||||
@ -83,18 +103,18 @@ return [
|
||||
/**
|
||||
* Chapters
|
||||
*/
|
||||
'chapter' => 'Capitulo',
|
||||
'chapter' => 'Capítulo',
|
||||
'chapters' => 'Capítulos',
|
||||
'x_chapters' => ':count Capítulo|:count Capítulos',
|
||||
'chapters_popular' => 'Capítulos Populares',
|
||||
'chapters_new' => 'Novo Capítulo',
|
||||
'chapters_create' => 'Criar novo Capítulo',
|
||||
'chapters_delete' => 'Excluír Capítulo',
|
||||
'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
|
||||
e adicionadas diretamente ao livro pai.',
|
||||
'chapters_delete_confirm' => 'Tem certeza que deseja excluír o capitulo?',
|
||||
'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.',
|
||||
'chapters_delete_confirm' => 'Tem certeza que deseja excluír o 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_move' => 'Mover Capítulo',
|
||||
'chapters_move_named' => 'Mover Capítulo :chapterName',
|
||||
@ -103,12 +123,14 @@ return [
|
||||
'chapters_empty' => 'Nenhuma página existente nesse capítulo.',
|
||||
'chapters_permissions_active' => 'Permissões de Capítulo ativadas',
|
||||
'chapters_permissions_success' => 'Permissões de Capítulo atualizadas',
|
||||
'chapters_search_this' => 'Pesquisar este Capítulo',
|
||||
|
||||
/**
|
||||
* Pages
|
||||
*/
|
||||
'page' => 'Página',
|
||||
'pages' => 'Páginas',
|
||||
'x_pages' => ':count Página|:count Páginas',
|
||||
'pages_popular' => 'Páginas Popular',
|
||||
'pages_new' => 'Nova Página',
|
||||
'pages_attachments' => 'Anexos',
|
||||
@ -145,11 +167,13 @@ return [
|
||||
'pages_move_success' => 'Pagina movida para ":parentName"',
|
||||
'pages_permissions' => 'Permissões de Página',
|
||||
'pages_permissions_success' => 'Permissões de Página atualizadas',
|
||||
'pages_revision' => 'Revisão',
|
||||
'pages_revisions' => 'Revisões de Página',
|
||||
'pages_revisions_named' => 'Revisões de Página para :pageName',
|
||||
'pages_revision_named' => 'Revisão de Página para :pageName',
|
||||
'pages_revisions_created_by' => 'Criado por',
|
||||
'pages_revisions_date' => 'Data da Revisão',
|
||||
'pages_revisions_number' => '#',
|
||||
'pages_revisions_changelog' => 'Changelog',
|
||||
'pages_revisions_changes' => 'Mudanças',
|
||||
'pages_revisions_current' => 'Versão atual',
|
||||
@ -218,8 +242,19 @@ return [
|
||||
/**
|
||||
* Comments
|
||||
*/
|
||||
'comentário' => 'Comentário',
|
||||
'comentários' => 'Comentários',
|
||||
'comment' => 'Comentário',
|
||||
'comments' => 'Comentários',
|
||||
'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_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',
|
||||
];
|
@ -41,6 +41,7 @@ return [
|
||||
|
||||
// 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_custom_home_deletion' => 'Não pode deletar uma página que está definida como página inicial',
|
||||
|
||||
// Entities
|
||||
'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_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
|
||||
'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.',
|
||||
@ -67,11 +75,4 @@ return [
|
||||
'error_occurred' => 'Um erro ocorreu',
|
||||
'app_down' => ':appName está fora do ar no momento',
|
||||
'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.',
|
||||
];
|
@ -1,13 +1,13 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
|
||||
/**
|
||||
* Settings text strings
|
||||
* Contains all text strings used in the general settings sections of BookStack
|
||||
* including users and roles.
|
||||
*/
|
||||
|
||||
|
||||
'settings' => 'Configurações',
|
||||
'settings_save' => 'Salvar Configurações',
|
||||
'settings_save_success' => 'Configurações Salvas',
|
||||
@ -31,6 +31,9 @@ return [
|
||||
'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_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
|
||||
@ -101,6 +104,7 @@ return [
|
||||
'users_edit_success' => 'Usuário atualizado com sucesso',
|
||||
'users_avatar' => 'Imagem de Usuário',
|
||||
'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_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',
|
||||
|
@ -19,11 +19,11 @@
|
||||
<div v-for="(tag, i) in tags" :key="tag.key" class="card drag-card">
|
||||
<div class="handle" ><i class="zmdi zmdi-menu"></i></div>
|
||||
<div>
|
||||
<autosuggest url="/ajax/tags/suggest/names" type="name" class="outline" :name="getTagFieldName(i, 'name')"
|
||||
<autosuggest url="{{ baseUrl('/ajax/tags/suggest/names') }}" type="name" class="outline" :name="getTagFieldName(i, 'name')"
|
||||
v-model="tag.name" @input="tagChange(tag)" @blur="tagBlur(tag)" placeholder="{{ trans('entities.tag') }}"/>
|
||||
</div>
|
||||
<div>
|
||||
<autosuggest url="/ajax/tags/suggest/values" type="value" class="outline" :name="getTagFieldName(i, 'value')"
|
||||
<autosuggest url="{{ baseUrl('/ajax/tags/suggest/values') }}" type="value" class="outline" :name="getTagFieldName(i, 'value')"
|
||||
v-model="tag.value" @change="tagChange(tag)" @blur="tagBlur(tag)" placeholder="{{ trans('entities.tag_value') }}"/>
|
||||
</div>
|
||||
<div v-show="tags.length !== 1" class="text-center drag-card-action text-neg" @click="removeTag(tag)"><i class="zmdi zmdi-close"></i></div>
|
||||
@ -126,4 +126,4 @@
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
@ -124,6 +124,45 @@ class AuthTest extends BrowserKitTest
|
||||
->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_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()
|
||||
|
@ -11,7 +11,6 @@ class EntityTest extends BrowserKitTest
|
||||
|
||||
public function test_entity_creation()
|
||||
{
|
||||
|
||||
// Test Creation
|
||||
$book = $this->bookCreation();
|
||||
$chapter = $this->chapterCreation($book);
|
||||
@ -257,4 +256,25 @@ class EntityTest extends BrowserKitTest
|
||||
->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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user