This commit is contained in:
Abijeet 2017-11-15 00:01:48 +05:30
commit 7b5edb4d62
17 changed files with 6127 additions and 36 deletions

View File

@ -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;

View File

@ -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')) {

View File

@ -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;
}

View File

@ -29,7 +29,7 @@ return [
|
*/
'lifetime' => 120,
'lifetime' => env('SESSION_LIFETIME', 120),
'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, computed};
module.exports = {template, data, props, methods};

View File

@ -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
};

View File

@ -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',
];

View File

@ -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',

View File

@ -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

View File

@ -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',
];

View File

@ -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',
];

View File

@ -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.',
];

View File

@ -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',

View File

@ -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>

View File

@ -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()

View File

@ -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);
}
}