[Revisión] 2022-01-20
|
@ -1,4 +1,3 @@
|
|||
database-config.json
|
||||
email-config.json
|
||||
config/
|
||||
logs/
|
||||
storage/
|
||||
|
|
4
COPYING
|
@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
|
|
15
NOTICE
|
@ -1,13 +1,14 @@
|
|||
Nabu - A content management system (CMS) for Markdown articles, written in HTML, CSS, JavaScript and PHP.
|
||||
Nabu - A content management system (CMS) for Markdown articles
|
||||
for the University of Guanajuato written in HTML, CSS, JavaScript and PHP.
|
||||
|
||||
Copyright (C) 2021 Ricardo García Jiménez <ricardogj08@riseup.net>,
|
||||
Juan José Ramírez López <juan.ramirez.j99@gmail.com>,
|
||||
Francisco Solís Martínez <franciscosolism08@gmail.com>,
|
||||
Fernando Andrés Chávez Gavaldón <fernandochg26@gmail.com>
|
||||
Copyright (C) 2021 - Ricardo García Jiménez <ricardogj08@riseup.net>,
|
||||
Juan José Ramírez López <juan.ramirez.j99@gmail.com>,
|
||||
Francisco Solís Martínez <franciscosolism08@gmail.com>,
|
||||
Fernando Andrés Chávez Gavaldón <fernandochg26@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published
|
||||
by the Free Software Foundation, either version 3 of the License, or
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
|
|
47
README.md
|
@ -1,48 +1,49 @@
|
|||
# Nabu
|
||||
|
||||
Un sistema gestor de contenido (CMS) para artículos en `Markdown`, escrito en `HTML`, `CSS`, `JavaScript` y `PHP`.
|
||||
Un sistema gestor de contenido (CMS) de artículos en `Markdown` para la [Universidad de Guanajuato](https://www.ugto.mx/) escrito en `HTML`, `CSS`, `JavaScript` y `PHP`.
|
||||
|
||||
## Archivo de configuración de la base de datos
|
||||
## Dependencias
|
||||
|
||||
Por defecto, `Nabu` escanea el archivo `database-config.json` dentro de la carpeta raíz del proyecto.
|
||||
## Estructura del proyecto
|
||||
|
||||
Estructura del archivo de configuración:
|
||||
## Configuración de la base de datos
|
||||
|
||||
Por defecto, `Nabu` escanea desde la raíz de la carpeta del programa, el archivo de configuración `config/db.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"dbms": "mysql",
|
||||
"host": "localhost",
|
||||
"database": "nabu",
|
||||
"user": "root",
|
||||
"password": "root",
|
||||
"charset": "utf8mb4"
|
||||
"dbms": "mysql",
|
||||
"host": "localhost",
|
||||
"database": "nabu",
|
||||
"user": "root",
|
||||
"password": "root",
|
||||
"charset": "utf8mb4"
|
||||
}
|
||||
```
|
||||
|
||||
## Archivo de configuración del cliente de correo electrónico
|
||||
## Configuración del cliente de correo electrónico
|
||||
|
||||
Por defecto, `Nabu` escanea el archivo `email-config.json` dentro de la carpeta raíz del proyecto.
|
||||
|
||||
Estructura del archivo de configuración:
|
||||
Por defecto, `Nabu` escanea desde la raíz de la carpeta del programa, el archivo de configuración `config/email.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"smtp": "smtp.gmail.com",
|
||||
"port": 587,
|
||||
"address": "foo@gmail.com",
|
||||
"password": "xxxxx"
|
||||
"smtp": "smtp.example.com",
|
||||
"port": 587,
|
||||
"address": "foo@example.com",
|
||||
"password": "xxxxx"
|
||||
}
|
||||
```
|
||||
|
||||
## Licencia
|
||||
|
||||
```text
|
||||
Nabu - Un sistema gestor de contenido (CMS) para artículos en Markdown, escrito en HTML, CSS, JavaScript y PHP.
|
||||
Nabu - Un sistema gestor de contenido (CMS) de artículos en Markdown para
|
||||
la Universidad de Guanajuato escrito en HTML, CSS, JavaScript y PHP.
|
||||
|
||||
Copyright (C) 2021 Ricardo García Jiménez <ricardogj08@riseup.net>,
|
||||
Juan José Ramírez López <juan.ramirez.j99@gmail.com>,
|
||||
Francisco Solís Martínez <franciscosolism08@gmail.com>,
|
||||
Fernando Andrés Chávez Gavaldón <fernandochg26@gmail.com>
|
||||
Copyright (C) 2021 - Ricardo García Jiménez <ricardogj08@riseup.net>,
|
||||
Juan José Ramírez López <juan.ramirez.j99@gmail.com>,
|
||||
Francisco Solís Martínez <franciscosolism08@gmail.com>,
|
||||
Fernando Andrés Chávez Gavaldón <fernandochg26@gmail.com>
|
||||
|
||||
Este programa es software libre: puedes redistribuirlo y/o modificarlo
|
||||
bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
|
|
Before Width: | Height: | Size: 435 B After Width: | Height: | Size: 435 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 914 B After Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 630 B After Width: | Height: | Size: 630 B |
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 47 KiB |
Before Width: | Height: | Size: 915 B After Width: | Height: | Size: 915 B |
|
@ -1,3 +1,20 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
const post = document.querySelector('.post__copy');
|
||||
const heart = document.querySelector('.icon');
|
||||
|
||||
|
|
|
@ -1,9 +1,25 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
const controlMenu = document.querySelector('#control-menu');
|
||||
const menu = document.querySelector('#menu');
|
||||
const overlay = document.querySelector('.overlay');
|
||||
|
||||
|
||||
controlMenu.addEventListener('click', () => {
|
||||
menu.classList.add('nav__menu-isactive');
|
||||
overlay.classList.add('overlay__is-active');
|
||||
|
@ -17,7 +33,6 @@ overlay.addEventListener('click', () => {
|
|||
})
|
||||
|
||||
/*
|
||||
|
||||
Home
|
||||
head.php
|
||||
home.php
|
||||
|
@ -33,6 +48,4 @@ overlay.addEventListener('click', () => {
|
|||
articles.css
|
||||
articles-desktop.css
|
||||
articles.js
|
||||
|
||||
|
||||
*/
|
||||
*/
|
||||
|
|
|
@ -1,23 +1,42 @@
|
|||
/* Orden de los estilos
|
||||
1. Posicionamineto
|
||||
2. Modelo de caja
|
||||
3. Tipografia
|
||||
4. Visuales
|
||||
5. Otros
|
||||
Metodologia => BEM
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
.skeleton {
|
||||
opacity: 0.8;
|
||||
animation: skeleton-loading 1s linear infinite alternate;
|
||||
}
|
||||
|
||||
@keyframes skeleton-loading {
|
||||
0%{
|
||||
background-color: hsl(200, 20%, 70%);
|
||||
@keyframes skeleton-loading {
|
||||
0% {
|
||||
background-color: hsl(200, 20%, 70%);
|
||||
}
|
||||
|
||||
|
||||
100% {
|
||||
background-color: hsl(200, 20%, 95%);
|
||||
background-color: hsl(200, 20%, 95%);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -71,7 +90,6 @@ Metodologia => BEM
|
|||
margin-bottom: 8px;
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
|
||||
}
|
||||
|
||||
.card__copy {
|
||||
|
@ -85,7 +103,7 @@ Metodologia => BEM
|
|||
justify-content: space-between;
|
||||
}
|
||||
|
||||
/*Imagen de perfil*/
|
||||
/* Imagen de perfil */
|
||||
.profile {
|
||||
display: block;
|
||||
min-width: 25px;
|
||||
|
@ -142,4 +160,4 @@ Metodologia => BEM
|
|||
.card__stats-numcom {
|
||||
font-size: 1.2rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,8 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.rights {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 8px;
|
||||
}
|
||||
|
||||
.rights__info {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
@ -10,4 +28,4 @@
|
|||
.media__icon svg{
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,10 +1,28 @@
|
|||
/* Orden de los estilos
|
||||
1. Posicionamineto
|
||||
2. Modelo de caja
|
||||
3. Tipografia
|
||||
4. Visuales
|
||||
5. Otros
|
||||
Metodologia => BEM
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
.footer {
|
||||
|
@ -38,4 +56,4 @@ Metodologia => BEM
|
|||
align-items: center;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,20 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.overlay,
|
||||
.nav__item-logo,
|
||||
.nav__burger-icon {
|
||||
|
@ -32,7 +49,6 @@
|
|||
order: 2;
|
||||
}
|
||||
|
||||
|
||||
.nav__item a {
|
||||
padding: 10px 15px;
|
||||
border-radius: 40px;
|
||||
|
@ -66,5 +82,3 @@
|
|||
.nav__item span {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,21 @@
|
|||
/* Estilos al menu */
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Estilos para el menú */
|
||||
.nav {
|
||||
width: 100%;
|
||||
display: flex;
|
||||
|
@ -34,7 +51,7 @@
|
|||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Estilos para menú */
|
||||
/* Estilos para el menú */
|
||||
.nav__menu {
|
||||
width: 65%;
|
||||
display: flex;
|
||||
|
@ -65,10 +82,6 @@
|
|||
display: block;
|
||||
}
|
||||
|
||||
.nav__logo-menu{
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.nav__item {
|
||||
/* background-color: hsla(237, 58%, 69%, 0.4); */
|
||||
display: flex;
|
||||
|
@ -129,7 +142,7 @@
|
|||
background-image: url('../../../icons/write-icon.svg');
|
||||
}
|
||||
|
||||
/* Estilos para la visualizacion del menu */
|
||||
/* Estilos para la visualización del menú */
|
||||
.overlay {
|
||||
opacity: 0;
|
||||
position: fixed;
|
||||
|
|
|
@ -1,3 +1,20 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.search__content {
|
||||
width: 50em;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,25 @@
|
|||
/* .search__container {
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
.search__container {
|
||||
text-align: center;
|
||||
} */
|
||||
}
|
||||
*/
|
||||
|
||||
.search__content {
|
||||
position: relative;
|
||||
|
@ -31,4 +50,4 @@
|
|||
background-image: url(../../../icons/glass-icon.svg);
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,8 +8,7 @@
|
|||
* 2. Prevent adjustments of font size after orientation changes in iOS.
|
||||
*/
|
||||
|
||||
/* Base Styles to nabu project */
|
||||
/* Estilos base */
|
||||
/* Estilos base para Nabu */
|
||||
:root {
|
||||
--color-background: hsl(197, 24%, 94%);
|
||||
--color-primary-red: hsl(355, 83%, 71%);
|
||||
|
@ -19,351 +18,350 @@
|
|||
--color-secundary-background: hsl(0, 0%, 91%);
|
||||
}
|
||||
|
||||
* {
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 62.5%;
|
||||
line-height: 1.15; /* 1 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
html {
|
||||
font-size: 62.5%;
|
||||
line-height: 1.15; /* 1 */
|
||||
-webkit-text-size-adjust: 100%; /* 2 */
|
||||
}
|
||||
|
||||
/* Sections
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the margin in all browsers.
|
||||
*/
|
||||
|
||||
body {
|
||||
font-family: 'Poppins', sans-serif;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the `main` element consistently in IE.
|
||||
*/
|
||||
|
||||
main {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the font size and margin on `h1` elements within `section` and
|
||||
* `article` contexts in Chrome, Firefox, and Safari.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in Firefox.
|
||||
* 2. Show the overflow in Edge and IE.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box; /* 1 */
|
||||
height: 0; /* 1 */
|
||||
overflow: visible; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background on active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove the bottom border in Chrome 57-
|
||||
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none; /* 1 */
|
||||
text-decoration: underline; /* 2 */
|
||||
text-decoration: underline dotted; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` elements from affecting the line height in
|
||||
* all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the border on images inside links in IE 10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Change the font styles in all browsers.
|
||||
* 2. Remove the margin in Firefox and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 1 */
|
||||
line-height: 1.15; /* 1 */
|
||||
margin: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the overflow in IE.
|
||||
* 1. Show the overflow in Edge.
|
||||
*/
|
||||
|
||||
button,
|
||||
input { /* 1 */
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inheritance of text transform in Edge, Firefox, and IE.
|
||||
* 1. Remove the inheritance of text transform in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select { /* 1 */
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the inability to style clickable types in iOS and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner border and padding in Firefox.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the focus styles unset by the previous rule.
|
||||
*/
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the padding in Firefox.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
padding: 0.35em 0.75em 0.625em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the text wrapping in Edge and IE.
|
||||
* 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||
* 3. Remove the padding so developers are not caught out when they zero out
|
||||
* `fieldset` elements in all browsers.
|
||||
*/
|
||||
|
||||
legend {
|
||||
box-sizing: border-box; /* 1 */
|
||||
color: inherit; /* 2 */
|
||||
display: table; /* 1 */
|
||||
max-width: 100%; /* 1 */
|
||||
padding: 0; /* 3 */
|
||||
white-space: normal; /* 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the default vertical scrollbar in IE 10+.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in IE 10.
|
||||
* 2. Remove the padding in IE 10.
|
||||
*/
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the cursor style of increment and decrement buttons in Chrome.
|
||||
*/
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the odd appearance in Chrome and Safari.
|
||||
* 2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
outline-offset: -2px; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||
* 2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
}
|
||||
|
||||
/* Interactive
|
||||
========================================================================== */
|
||||
|
||||
/*
|
||||
* Add the correct display in Edge, IE 10+, and Firefox.
|
||||
*/
|
||||
|
||||
details {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the correct display in all browsers.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* Misc
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10+.
|
||||
*/
|
||||
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10.
|
||||
*/
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
/* Sections
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the margin in all browsers.
|
||||
*/
|
||||
|
||||
body {
|
||||
font-family: 'Poppins', sans-serif;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the `main` element consistently in IE.
|
||||
*/
|
||||
|
||||
main {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the font size and margin on `h1` elements within `section` and
|
||||
* `article` contexts in Chrome, Firefox, and Safari.
|
||||
*/
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
margin: 0.67em 0;
|
||||
}
|
||||
|
||||
/* Grouping content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in Firefox.
|
||||
* 2. Show the overflow in Edge and IE.
|
||||
*/
|
||||
|
||||
hr {
|
||||
box-sizing: content-box; /* 1 */
|
||||
height: 0; /* 1 */
|
||||
overflow: visible; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
pre {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/* Text-level semantics
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the gray background on active links in IE 10.
|
||||
*/
|
||||
|
||||
a {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Remove the bottom border in Chrome 57-
|
||||
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
|
||||
*/
|
||||
|
||||
abbr[title] {
|
||||
border-bottom: none; /* 1 */
|
||||
text-decoration: underline; /* 2 */
|
||||
text-decoration: underline dotted; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font weight in Chrome, Edge, and Safari.
|
||||
*/
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inheritance and scaling of font size in all browsers.
|
||||
* 2. Correct the odd `em` font sizing in all browsers.
|
||||
*/
|
||||
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: monospace, monospace; /* 1 */
|
||||
font-size: 1em; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct font size in all browsers.
|
||||
*/
|
||||
|
||||
small {
|
||||
font-size: 80%;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevent `sub` and `sup` elements from affecting the line height in
|
||||
* all browsers.
|
||||
*/
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
/* Embedded content
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Remove the border on images inside links in IE 10.
|
||||
*/
|
||||
|
||||
img {
|
||||
border-style: none;
|
||||
}
|
||||
|
||||
/* Forms
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* 1. Change the font styles in all browsers.
|
||||
* 2. Remove the margin in Firefox and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
input,
|
||||
optgroup,
|
||||
select,
|
||||
textarea {
|
||||
font-family: inherit; /* 1 */
|
||||
font-size: 100%; /* 1 */
|
||||
line-height: 1.15; /* 1 */
|
||||
margin: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the overflow in IE.
|
||||
* 1. Show the overflow in Edge.
|
||||
*/
|
||||
|
||||
button,
|
||||
input { /* 1 */
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inheritance of text transform in Edge, Firefox, and IE.
|
||||
* 1. Remove the inheritance of text transform in Firefox.
|
||||
*/
|
||||
|
||||
button,
|
||||
select { /* 1 */
|
||||
text-transform: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the inability to style clickable types in iOS and Safari.
|
||||
*/
|
||||
|
||||
button,
|
||||
[type="button"],
|
||||
[type="reset"],
|
||||
[type="submit"] {
|
||||
-webkit-appearance: button;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner border and padding in Firefox.
|
||||
*/
|
||||
|
||||
button::-moz-focus-inner,
|
||||
[type="button"]::-moz-focus-inner,
|
||||
[type="reset"]::-moz-focus-inner,
|
||||
[type="submit"]::-moz-focus-inner {
|
||||
border-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the focus styles unset by the previous rule.
|
||||
*/
|
||||
|
||||
button:-moz-focusring,
|
||||
[type="button"]:-moz-focusring,
|
||||
[type="reset"]:-moz-focusring,
|
||||
[type="submit"]:-moz-focusring {
|
||||
outline: 1px dotted ButtonText;
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the padding in Firefox.
|
||||
*/
|
||||
|
||||
fieldset {
|
||||
padding: 0.35em 0.75em 0.625em;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the text wrapping in Edge and IE.
|
||||
* 2. Correct the color inheritance from `fieldset` elements in IE.
|
||||
* 3. Remove the padding so developers are not caught out when they zero out
|
||||
* `fieldset` elements in all browsers.
|
||||
*/
|
||||
|
||||
legend {
|
||||
box-sizing: border-box; /* 1 */
|
||||
color: inherit; /* 2 */
|
||||
display: table; /* 1 */
|
||||
max-width: 100%; /* 1 */
|
||||
padding: 0; /* 3 */
|
||||
white-space: normal; /* 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
|
||||
*/
|
||||
|
||||
progress {
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the default vertical scrollbar in IE 10+.
|
||||
*/
|
||||
|
||||
textarea {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Add the correct box sizing in IE 10.
|
||||
* 2. Remove the padding in IE 10.
|
||||
*/
|
||||
|
||||
[type="checkbox"],
|
||||
[type="radio"] {
|
||||
box-sizing: border-box; /* 1 */
|
||||
padding: 0; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Correct the cursor style of increment and decrement buttons in Chrome.
|
||||
*/
|
||||
|
||||
[type="number"]::-webkit-inner-spin-button,
|
||||
[type="number"]::-webkit-outer-spin-button {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the odd appearance in Chrome and Safari.
|
||||
* 2. Correct the outline style in Safari.
|
||||
*/
|
||||
|
||||
[type="search"] {
|
||||
-webkit-appearance: textfield; /* 1 */
|
||||
outline-offset: -2px; /* 2 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the inner padding in Chrome and Safari on macOS.
|
||||
*/
|
||||
|
||||
[type="search"]::-webkit-search-decoration {
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* 1. Correct the inability to style clickable types in iOS and Safari.
|
||||
* 2. Change font properties to `inherit` in Safari.
|
||||
*/
|
||||
|
||||
::-webkit-file-upload-button {
|
||||
-webkit-appearance: button; /* 1 */
|
||||
font: inherit; /* 2 */
|
||||
}
|
||||
|
||||
/* Interactive
|
||||
========================================================================== */
|
||||
|
||||
/*
|
||||
* Add the correct display in Edge, IE 10+, and Firefox.
|
||||
*/
|
||||
|
||||
details {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add the correct display in all browsers.
|
||||
*/
|
||||
|
||||
summary {
|
||||
display: list-item;
|
||||
}
|
||||
|
||||
/* Misc
|
||||
========================================================================== */
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10+.
|
||||
*/
|
||||
|
||||
template {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct display in IE 10.
|
||||
*/
|
||||
|
||||
[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,21 @@
|
|||
/* Estilos para el CTA desktop*/
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Estilos para el CTA desktop */
|
||||
|
||||
.CTA {
|
||||
min-height: 340px;
|
||||
|
|
|
@ -1,4 +1,22 @@
|
|||
/* Estilos desktop para el buscador*/
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Estilos desktop para el buscador */
|
||||
|
||||
.searcher__content {
|
||||
width: 95%;
|
||||
display: flex;
|
||||
|
@ -6,7 +24,6 @@
|
|||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 10%;
|
||||
|
||||
}
|
||||
|
||||
.searcher__image {
|
||||
|
@ -19,8 +36,7 @@
|
|||
background-size: cover;
|
||||
}
|
||||
|
||||
|
||||
/*Estilos desktop para los artículos*/
|
||||
/* Estilos desktop para los artículos */
|
||||
|
||||
.articles {
|
||||
margin: 0 auto;
|
||||
|
@ -59,6 +75,7 @@
|
|||
}
|
||||
|
||||
/* Texto del CTA */
|
||||
|
||||
.CTA__title {
|
||||
font-size: 2.6rem;
|
||||
line-height: 5.4rem;
|
||||
|
@ -67,4 +84,4 @@
|
|||
.CTA__description {
|
||||
font-size: 1.6rem;
|
||||
line-height: 2.2rem;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,16 +1,36 @@
|
|||
/* Orden de los estilos
|
||||
1. Posicionamineto
|
||||
2. Modelo de caja
|
||||
3. Tipografia
|
||||
4. Visuales
|
||||
5. Otros
|
||||
Metodologia => BEM
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
body {
|
||||
background-color: var(--color-background);
|
||||
}
|
||||
|
||||
/* Estilos al header */
|
||||
/* Estilos del header */
|
||||
|
||||
.header {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
|
@ -18,7 +38,7 @@ body {
|
|||
background-color: var(--color-background);
|
||||
}
|
||||
|
||||
/*Estilos para la seccion de los artículos*/
|
||||
/* Estilos para la sección de artículos */
|
||||
|
||||
.articles__data {
|
||||
display: flex;
|
||||
|
@ -54,7 +74,6 @@ body {
|
|||
width: 90%;
|
||||
padding: 20px 0;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
|
||||
.CTA__title {
|
||||
|
@ -104,4 +123,4 @@ body {
|
|||
background-color: var(--color-primary-red);
|
||||
color: #fff;
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,22 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Fix the width to se in a tablet and desktop */
|
||||
|
||||
.nav,
|
||||
.post__head,
|
||||
.post__copy,
|
||||
|
@ -7,7 +25,8 @@
|
|||
width: 80%;
|
||||
}
|
||||
|
||||
/* Estilso al header */
|
||||
/* Estilos del header */
|
||||
|
||||
header {
|
||||
box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.4);
|
||||
}
|
||||
|
@ -16,7 +35,7 @@ header:hover {
|
|||
box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
/* Estilos al nav bar */
|
||||
/* Estilos para el navbar */
|
||||
.nav__logo-wrapper{
|
||||
width: 100px;
|
||||
}
|
||||
|
@ -34,8 +53,8 @@ header:hover {
|
|||
color: #FFF;
|
||||
}
|
||||
|
||||
/* Estilos de la sección de otros posts */
|
||||
|
||||
/* Estilos a la seccion de otros posts */
|
||||
.popular-posts {
|
||||
width: 100%;
|
||||
background-color: initial;
|
||||
|
@ -52,7 +71,8 @@ header:hover {
|
|||
scroll-snap-type: initial;
|
||||
}
|
||||
|
||||
/* Estilos para la seccion del autor */
|
||||
/* Estilos de la sección del autor */
|
||||
|
||||
.author-info__title {
|
||||
font-size: 2.4rem;
|
||||
}
|
||||
|
@ -61,7 +81,7 @@ header:hover {
|
|||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
/* Seccion de comentarios */
|
||||
/* Sección de comentarios */
|
||||
|
||||
.comments__form {
|
||||
max-width: 660px;
|
||||
|
@ -72,11 +92,13 @@ header:hover {
|
|||
}
|
||||
|
||||
/* Text area */
|
||||
|
||||
.comments__textarea {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
/* Boton mandar comentario */
|
||||
/* Botón para enviar un comentario */
|
||||
|
||||
.comments__button {
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
|
|
@ -1,16 +1,36 @@
|
|||
/* Orden de los estilos
|
||||
1. Posicionamineto
|
||||
2. Modelo de caja
|
||||
3. Tipografia
|
||||
4. Visuales
|
||||
5. Otros
|
||||
Metodologia => BEM
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
body {
|
||||
background-color: var(--color-background);
|
||||
}
|
||||
/* Estilos al header */
|
||||
|
||||
/* Estilos del header */
|
||||
|
||||
header {
|
||||
min-width: 320px;
|
||||
width: 100%;
|
||||
|
@ -22,19 +42,19 @@ header {
|
|||
box-shadow: inset 0 0 0 100vh rgba(0,0,0,0.2);
|
||||
}
|
||||
|
||||
|
||||
header::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
content: "";
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
left: 0;
|
||||
right: 0;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
background: rgba(0, 0, 0, .5);
|
||||
}
|
||||
|
||||
/* Sobreescribiendo estilos del componente nav */
|
||||
/* Sobrescribe los estilos del componente nav */
|
||||
|
||||
.nav {
|
||||
background-color: initial;
|
||||
padding-bottom: 50px;
|
||||
|
@ -48,7 +68,8 @@ header::before {
|
|||
z-index: 2;
|
||||
}
|
||||
|
||||
/* Liston del navbar */
|
||||
/* Listón del navbar */
|
||||
|
||||
.nav__polygon {
|
||||
display: initial;
|
||||
width: 80px;
|
||||
|
@ -74,7 +95,8 @@ header::before {
|
|||
width: 100%;
|
||||
}
|
||||
|
||||
/* Estilos al texto del post */
|
||||
/* Estilos del texto del post */
|
||||
|
||||
.post__head {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
|
@ -126,6 +148,7 @@ header::before {
|
|||
}
|
||||
|
||||
/* Post text */
|
||||
|
||||
.post__body {
|
||||
width: 100%;
|
||||
padding-top: 10px;
|
||||
|
@ -147,6 +170,7 @@ header::before {
|
|||
}
|
||||
|
||||
/* Estilos para el like */
|
||||
|
||||
.icon {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
|
@ -184,6 +208,7 @@ header::before {
|
|||
}
|
||||
|
||||
/* Estilos generales de las etiquetas */
|
||||
|
||||
.post__copy > p:not(p:first-child) {
|
||||
margin-top: 2.8rem;
|
||||
}
|
||||
|
@ -208,7 +233,8 @@ header::before {
|
|||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
/* Estilos para la seccion de otros post para mostrar */
|
||||
/* Estilos de la sección de otros post para mostrar */
|
||||
|
||||
.popular-posts {
|
||||
width: 100%;
|
||||
min-width: 320px;
|
||||
|
@ -232,21 +258,23 @@ header::before {
|
|||
gap: 0 20px;
|
||||
padding: 15px 20px;
|
||||
overflow-x: scroll;
|
||||
margin-left:auto;
|
||||
margin-left: auto;
|
||||
scroll-snap-type: x mandatory;
|
||||
}
|
||||
|
||||
/* Estilos a la barra del scroll */
|
||||
/* Estilos de la barra de scroll */
|
||||
|
||||
.pupular-cards__container::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
.popular-cards__container::-webkit-scrollbar-thumb {
|
||||
background-color: var(--color-secondary-purple);
|
||||
background-color: var(--color-secondary-purple);
|
||||
}
|
||||
|
||||
/* Estilos para la seccion del autor */
|
||||
/* Estilos de la sección del autor */
|
||||
|
||||
.author-info__container {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
|
@ -287,7 +315,8 @@ header::before {
|
|||
line-height: 1.4rem;
|
||||
}
|
||||
|
||||
/* Estilos para la caja de comentarios */
|
||||
/* Estilos de la caja de comentarios */
|
||||
|
||||
.comments {
|
||||
width: 100%;
|
||||
padding: 40px 0;
|
||||
|
@ -355,7 +384,8 @@ header::before {
|
|||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
/* Estilos para el footer */
|
||||
/* Estilos del footer */
|
||||
|
||||
.footer {
|
||||
background-color: var(--color-black);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
|
@ -1,9 +1,27 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.hero__img-wrapper {
|
||||
flex-basis: 50%;
|
||||
max-width: 450px;
|
||||
}
|
||||
|
||||
/* Estilos para la seccion de los post mas populares */
|
||||
/* Estilos de la sección de los post más populares */
|
||||
|
||||
.popular-posts {
|
||||
width: 90%;
|
||||
display: flex;
|
||||
|
@ -37,7 +55,6 @@
|
|||
min-width: initial;
|
||||
width: 80px;
|
||||
transition: all ease-in-out 400ms;
|
||||
|
||||
}
|
||||
|
||||
.popular-cards__container .card:hover:not(.card:last-child) {
|
||||
|
@ -53,6 +70,8 @@
|
|||
opacity: 1;
|
||||
}
|
||||
|
||||
/* .popular-cards__container .card:hover:not(.card:last-child) ~ .card:last-child {
|
||||
/*
|
||||
.popular-cards__container .card:hover:not(.card:last-child) ~ .card:last-child {
|
||||
right: -200px;
|
||||
} */
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -1,4 +1,21 @@
|
|||
/* Estilos para el header */
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* Estilos del header */
|
||||
|
||||
.hero {
|
||||
flex-direction: row-reverse;
|
||||
|
@ -16,10 +33,9 @@
|
|||
flex-basis: 50%;
|
||||
}
|
||||
|
||||
|
||||
.hero__CTA {
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
margin: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.hero__secundary-CTA {
|
||||
|
@ -30,7 +46,7 @@
|
|||
margin: 0;
|
||||
}
|
||||
|
||||
/* Estilos para la seccion de posts mas recientes */
|
||||
/* Estilos de la sección de los posts más recientes */
|
||||
|
||||
.recent__posts {
|
||||
width: 90%;
|
||||
|
@ -46,6 +62,3 @@
|
|||
.CTA__button {
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1,16 +1,36 @@
|
|||
/* Orden de los estilos
|
||||
1. Posicionamineto
|
||||
2. Modelo de caja
|
||||
3. Tipografia
|
||||
4. Visuales
|
||||
5. Otros
|
||||
Metodologia => BEM
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
body {
|
||||
background-color: var(--color-background);
|
||||
}
|
||||
|
||||
/* Estilos al header */
|
||||
/* Estilos del header */
|
||||
|
||||
.header {
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
|
@ -20,7 +40,8 @@ body {
|
|||
background-color: var(--color-background);
|
||||
}
|
||||
|
||||
/* Estilos para el hero */
|
||||
/* Estilos del hero */
|
||||
|
||||
.hero {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
@ -66,7 +87,7 @@ body {
|
|||
color: #FFF;
|
||||
}
|
||||
|
||||
/* Estilos a la seccion de posts populares */
|
||||
/* Estilos de la sección de los posts más populares */
|
||||
|
||||
.popular-posts {
|
||||
width: 100%;
|
||||
|
@ -91,21 +112,21 @@ body {
|
|||
gap: 0 20px;
|
||||
padding: 15px 20px;
|
||||
overflow-x: scroll;
|
||||
margin-left:auto;
|
||||
margin-left: auto;
|
||||
scroll-snap-type: x mandatory;
|
||||
}
|
||||
|
||||
/* Estilos a la barra del scroll */
|
||||
/* Estilos de la barra de scroll */
|
||||
.cards__container::-webkit-scrollbar {
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
}
|
||||
|
||||
|
||||
.cards__container::-webkit-scrollbar-thumb {
|
||||
background-color: var(--color-secondary-purple);
|
||||
background-color: var(--color-secondary-purple);
|
||||
}
|
||||
|
||||
/* Estilos para la seccion de posts mas recientes */
|
||||
/* Estilos de la sección de los posts más recientes */
|
||||
|
||||
.recent__posts {
|
||||
width: 100%;
|
||||
|
@ -116,7 +137,7 @@ body {
|
|||
}
|
||||
|
||||
.recent-posts__title {
|
||||
margin-bottom: 15px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.recent-cards__container {
|
||||
|
@ -126,7 +147,7 @@ body {
|
|||
gap: 30px 0;
|
||||
}
|
||||
|
||||
/* Estilos para el CTA del final de la pagina*/
|
||||
/* Estilos para el CTA del final de la página */
|
||||
|
||||
.CTA {
|
||||
position: relative;
|
||||
|
@ -149,7 +170,6 @@ body {
|
|||
height: 63px;
|
||||
background-image: url(../../../images/paper-plane.svg);
|
||||
background-position: center;
|
||||
|
||||
}
|
||||
|
||||
.CTA__container {
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
|
@ -1,3 +1,30 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
.sign-up__text {
|
||||
max-width: 310px;
|
||||
}
|
||||
|
@ -16,4 +43,4 @@
|
|||
.login-plane {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
|
@ -0,0 +1,16 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
|
@ -0,0 +1,26 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
|
@ -1,3 +1,20 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
.wrapper {
|
||||
display: flex;
|
||||
max-width: 900px;
|
||||
|
@ -62,4 +79,4 @@
|
|||
|
||||
.sign-up__container:hover > .sign-up__button {
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,30 @@
|
|||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Orden de los estilos
|
||||
* 1. Posicionamiento
|
||||
* 2. Modelo de caja
|
||||
* 3. Tipografía
|
||||
* 4. Visuales
|
||||
* 5. Otros
|
||||
* Metodología => BEM
|
||||
*/
|
||||
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
|
@ -22,7 +49,7 @@ body {
|
|||
margin: 30px auto;
|
||||
}
|
||||
|
||||
/* Section del header */
|
||||
/* Sección del header */
|
||||
|
||||
.header__logo-container {
|
||||
display: inline-block;
|
||||
|
@ -66,8 +93,7 @@ body {
|
|||
background-size: cover;
|
||||
}
|
||||
|
||||
|
||||
/* Section del form */
|
||||
/* Sección del form */
|
||||
|
||||
.form__container {
|
||||
margin: 15px 0;
|
||||
|
@ -145,12 +171,13 @@ body {
|
|||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Oculatar imagen */
|
||||
/* Oculta la imagen */
|
||||
|
||||
.form__image-container {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Cambios a los estilos del footer */
|
||||
/* Cambia los estilos del footer */
|
||||
|
||||
.footer {
|
||||
position: absolute;
|
||||
|
@ -165,4 +192,4 @@ body {
|
|||
|
||||
.footer .media svg path {
|
||||
fill: var(--color-background);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,58 +1,23 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/adminModel.php';
|
||||
|
||||
class adminController {
|
||||
static public function admin() {
|
||||
if (empty($_GET['section'])) {
|
||||
self::dashboard();
|
||||
}
|
||||
else {
|
||||
switch ($_GET['section']) {
|
||||
case 'authorize':
|
||||
self::authorize_article();
|
||||
break;
|
||||
case 'delete':
|
||||
self::delete_article();
|
||||
break;
|
||||
case 'edit':
|
||||
self::edit_article();
|
||||
break;
|
||||
case 'published':
|
||||
self::published_articles();
|
||||
break;
|
||||
case 'users':
|
||||
self::users();
|
||||
break;
|
||||
default:
|
||||
utils::redirect(NABU_ROUTES['admin']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static private function dashboard() {
|
||||
require_once 'views/admin/dashboard.php';
|
||||
}
|
||||
|
||||
static private function authorize_article() {
|
||||
require_once 'views/pages/confirm-password.php';
|
||||
}
|
||||
|
||||
static private function delete_article() {
|
||||
require_once 'views/pages/confirm-password.php';
|
||||
}
|
||||
|
||||
static private function edit_article() {
|
||||
require_once 'views/admin/edit-article.php';
|
||||
}
|
||||
|
||||
static private function published_articles() {
|
||||
require_once 'views/admin/published-articles.php';
|
||||
}
|
||||
|
||||
static private function users() {
|
||||
require_once 'views/admin/users.php';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,23 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/articlesModel.php';
|
||||
|
||||
class articlesController {
|
||||
static public function all_articles() {
|
||||
require_once 'views/pages/all-articles.php';
|
||||
|
@ -12,16 +26,4 @@ class articlesController {
|
|||
static public function article() {
|
||||
require_once 'views/pages/article.php';
|
||||
}
|
||||
|
||||
static public function category() {
|
||||
require_once 'views/pages/category.php';
|
||||
}
|
||||
|
||||
static public function post_article() {
|
||||
require_once 'views/pages/post-article.php';
|
||||
}
|
||||
|
||||
static public function sent_articles() {
|
||||
require_once 'views/pages/sent-articles.php';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,63 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/authenticationModel.php';
|
||||
|
||||
class authenticationController {
|
||||
public static function authentication() {
|
||||
if (empty($_GET['user']) || empty($_GET['key']))
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
|
||||
$authenticationModel = new authenticationModel();
|
||||
|
||||
// Busca los datos de autenticación de e-mail de un usuario.
|
||||
$user = $authenticationModel -> get($_GET['user']);
|
||||
|
||||
if (empty($user['hash']) || empty($user['expiration']) || !empty($user['activated']))
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
|
||||
// Reconstruye el hash con la llave de autenticación de la URL.
|
||||
$hash = hash_hmac('sha256', $user['email'], $_GET['key']);
|
||||
|
||||
if (!hash_equals($user['hash'], $hash))
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
|
||||
// Valida si el hash de autenticación de e-mail está expirado.
|
||||
if (time() > $user['expiration']) {
|
||||
unset($authenticationModel);
|
||||
|
||||
require_once 'models/usersModel.php';
|
||||
|
||||
$usersModel = new usersModel();
|
||||
$usersModel -> delete($user['id']);
|
||||
|
||||
messages::add('Tu cuenta ha expirado, por favor vuelve a registrarte');
|
||||
|
||||
utils::redirect(NABU_ROUTES['signup']);
|
||||
}
|
||||
|
||||
// Activa la cuenta del usuario y crea su perfil.
|
||||
$authenticationModel -> activate($user['id']);
|
||||
|
||||
messages::add('Tu dirección de correo electrónico se ha verificado correctamente');
|
||||
|
||||
utils::redirect(NABU_ROUTES['login']);
|
||||
}
|
||||
}
|
|
@ -1,31 +1,50 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/blogModel.php';
|
||||
|
||||
class blogController {
|
||||
// Renderiza la página de errores.
|
||||
static public function errors() {
|
||||
/*
|
||||
if (empty($_SESSION['errors'])) {
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
*/
|
||||
// Renderiza la página principal del sitio web.
|
||||
static public function home() {
|
||||
require_once 'models/blogModel.php';
|
||||
|
||||
// Define el código HTTP de respuesta.
|
||||
http_response_code($_SESSION['errors']['code']);
|
||||
$blogModel = new blogModel();
|
||||
|
||||
$error = $_SESSION['errors']['message'];
|
||||
$articles = array();
|
||||
$recent_articles = array();
|
||||
|
||||
unset($_SESSION['errors']);
|
||||
require_once 'views/pages/home.php';
|
||||
}
|
||||
|
||||
messages::get();
|
||||
// Renderiza la página de errores.
|
||||
static public function errors() {
|
||||
if (empty($_SESSION['errors']))
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
|
||||
require_once 'views/pages/errors.php';
|
||||
}
|
||||
// Define el código HTTP de respuesta.
|
||||
http_response_code($_SESSION['errors']['code']);
|
||||
|
||||
static public function home() {
|
||||
require_once 'views/pages/home.php';
|
||||
}
|
||||
$error = $_SESSION['errors']['message'];
|
||||
|
||||
unset($_SESSION['errors']);
|
||||
|
||||
messages::get();
|
||||
|
||||
require_once 'views/pages/errors.php';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/communityModel.php';
|
||||
|
||||
class communityController {
|
||||
static public function comment() {
|
||||
//
|
||||
}
|
||||
|
||||
static public function favorites() {
|
||||
require_once 'views/pages/favorites.php';
|
||||
}
|
||||
|
||||
static public function like() {
|
||||
//
|
||||
}
|
||||
}
|
|
@ -1,37 +1,23 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/profilesModel.php';
|
||||
|
||||
class profilesController {
|
||||
static public function profile() {
|
||||
if (empty($_GET['page'])) {
|
||||
self::view();
|
||||
}
|
||||
else {
|
||||
switch ($_GET['page']) {
|
||||
case 'delete':
|
||||
self::delete_profile();
|
||||
break;
|
||||
case 'edit':
|
||||
self::edit_profile();
|
||||
break;
|
||||
default:
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static private function view() {
|
||||
require_once 'views/pages/profile.php';
|
||||
}
|
||||
|
||||
static private function delete_profile() {
|
||||
require_once 'views/pages/confirm-password.php';
|
||||
}
|
||||
|
||||
static private function edit_profile() {
|
||||
require_once 'views/pages/edit-profile.php';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,11 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/searchModel.php';
|
||||
|
||||
class searchController {
|
||||
static public function search() {
|
||||
require_once 'views/pages/search.php';
|
||||
}
|
||||
}
|
|
@ -1,225 +1,228 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/usersModel.php';
|
||||
|
||||
// Registra, define credenciales de acceso y cierra sesiones de usuario.
|
||||
class usersController {
|
||||
// Renderiza la página de registro de usuarios
|
||||
// y registra un usuario con el método POST.
|
||||
static public function signup() {
|
||||
// Renderiza la página de registro de usuarios.
|
||||
if (empty($_POST['signup-submit'])) {
|
||||
// Redirecciona a home si existe una sesión de usuario.
|
||||
utils::session_exists(NABU_ROUTES['home']);
|
||||
// Renderiza la página de registro de usuarios
|
||||
// y registra usuarios con el método POST.
|
||||
static public function signup() {
|
||||
if (empty($_POST['signup-form'])) {
|
||||
// Redirecciona a "home" si existe una sesión de usuario.
|
||||
utils::session_exists(NABU_ROUTES['home']);
|
||||
|
||||
$token = csrf::generate();
|
||||
$messages = messages::get();
|
||||
$token = csrf::generate();
|
||||
$messages = messages::get();
|
||||
|
||||
require_once 'views/pages/signup.php';
|
||||
require_once 'views/pages/signup.php';
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
csrf::validate($_POST['csrf']);
|
||||
|
||||
$validations = new validations(NABU_ROUTES['signup']);
|
||||
|
||||
// Valida el formulario de registro de usuarios.
|
||||
$data = $validations -> validate_form($_POST, array(
|
||||
array('name', 'exists' => true, 'trim_all' => true, 'min_lenght' => 5, 'max_lenght' => 255),
|
||||
array('username', 'exists' => true, 'trim' => true, 'min_lenght' => 1, 'max_lenght' => 255, 'not_spaces' => true),
|
||||
array('email', 'exists' => true, 'is_email' => true, 'trim' => true, 'min_lenght' => 5, 'max_lenght' => 255, 'not_spaces' => true),
|
||||
array('password', 'exists' => true, 'min_lenght' => 6, 'max_lenght' => 255, 'not_spaces' => true, 'equal' => $_POST['confirm-password'])
|
||||
));
|
||||
|
||||
// Formatea en minúsculas la dirección de e-mail.
|
||||
$data['email'] = strtolower($data['email']);
|
||||
|
||||
$usersModel = new usersModel();
|
||||
|
||||
$users = $usersModel -> find($data['username'], $data['email']);
|
||||
|
||||
$msg = 'Existe una cuenta registrada con el mismo apodo o dirección de correo electrónico, por favor inténtalo de nuevo';
|
||||
$route = NABU_ROUTES['signup'];
|
||||
|
||||
// Valida si la cuenta es única y elimina cuentas con hash expirado.
|
||||
foreach ($users as $user) {
|
||||
// Valida si es una cuenta inactiva.
|
||||
if (empty($user['activated']) && !empty($user['hash_expiration'])) {
|
||||
// Valida si es una cuenta con hash expirado.
|
||||
if (time() > $user['hash_expiration']) {
|
||||
$usersModel -> delete($user['id']);
|
||||
}
|
||||
else {
|
||||
messages::add($msg);
|
||||
messages::exist($route);
|
||||
}
|
||||
}
|
||||
else {
|
||||
messages::add($msg);
|
||||
messages::exist($route);
|
||||
}
|
||||
}
|
||||
|
||||
// Genera una llave aleatoria de verificación de e-mail.
|
||||
$key = bin2hex(random_bytes(32));
|
||||
|
||||
// Genera un hash de verificación de e-mail.
|
||||
$hash = hash_hmac('sha256', $data['email'], $key);
|
||||
|
||||
require_once 'libs/emails.php';
|
||||
|
||||
$emails = new emails();
|
||||
$emails -> prepare($data['email'], $data['name']);
|
||||
|
||||
// Genera una URL de verificación de e-mail.
|
||||
$url = NABU_ROUTES['verifications'] . '&user=' . urlencode($data['username']) . '&key=' . $key;
|
||||
|
||||
$username = utils::escape($data['username']);
|
||||
|
||||
$body = require_once 'views/emails/verifications.php';
|
||||
|
||||
// Envía primero la URL de verificación de e-mail antes de registrar un usuario.
|
||||
if (!$emails -> send('¡Ya casi está listo!', $body)) {
|
||||
messages::errors('tuvimos un problema al enviar tu mensaje de verificación de e-mail', 500);
|
||||
}
|
||||
|
||||
// Cifra la contraseña.
|
||||
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT, array('cost' => 12));
|
||||
|
||||
// Establece la fecha de registro.
|
||||
$data['creation_date'] = utils::current_date();
|
||||
|
||||
// Registra el nuevo usuario.
|
||||
$usersModel -> save($data);
|
||||
|
||||
// Consulta el id del nuevo usuario.
|
||||
$user = $usersModel -> get('username', $data['username']);
|
||||
|
||||
unset($usersModel);
|
||||
|
||||
// Establece la fecha de expiración del hash
|
||||
// de verificación de e-mail (1 hora).
|
||||
$verification = array(
|
||||
'id' => $user['id'],
|
||||
'hash' => $hash,
|
||||
'expiration' => time() + 60 * 60
|
||||
);
|
||||
|
||||
require_once 'models/verificationsModel.php';
|
||||
|
||||
$verificationsModel = new verificationsModel();
|
||||
|
||||
// Registra el hash de verificación de e-mail.
|
||||
$verificationsModel -> save($verification);
|
||||
|
||||
messages::add('Su cuenta se ha registrado correctamente, por favor verifica tu dirección de correo electrónico');
|
||||
|
||||
utils::redirect(NABU_ROUTES['signup']);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Renderiza la página de inicio de sesión y asigna credeciales
|
||||
// de acceso a los usuarios con el método POST.
|
||||
static public function login() {
|
||||
// Renderiza la página de inicio de sesión.
|
||||
if (empty($_POST['login-submit'])) {
|
||||
// Redirecciona a home si existe una sesión de usuario.
|
||||
utils::session_exists(NABU_ROUTES['home']);
|
||||
csrf::validate($_POST['csrf']);
|
||||
|
||||
$token = csrf::generate();
|
||||
$messages = messages::get();
|
||||
$validations = new validations(NABU_ROUTES['signup']);
|
||||
|
||||
require_once 'views/pages/login.php';
|
||||
// Valida el formulario de registro de usuarios.
|
||||
$data = $validations -> validate($_POST, array(
|
||||
array('field' => 'name', 'trim_all' => true, 'min_length' => 5, 'max_length' => 255),
|
||||
array('field' => 'username', 'trim' => true, 'min_length' => 1, 'max_length' => 255, 'not_spaces' => true),
|
||||
array('field' => 'email', 'trim' => true, 'min_length' => 5, 'max_length' => 255, 'not_spaces' => true, 'type' => 'email'),
|
||||
array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true, 'equal' => $_POST['confirm-password']),
|
||||
));
|
||||
|
||||
exit();
|
||||
}
|
||||
// Formatea en minúsculas la dirección de e-mail.
|
||||
$data['email'] = strtolower($data['email']);
|
||||
|
||||
csrf::validate($_POST['csrf']);
|
||||
$usersModel = new usersModel();
|
||||
|
||||
$validations = new validations(NABU_ROUTES['login']);
|
||||
$users = $usersModel -> find($data['username'], $data['email']);
|
||||
|
||||
// Valida el formulario de inicio de sesión.
|
||||
$data = $validations -> validate_form($_POST, array(
|
||||
array('identity', 'exists' => true, 'trim' => true, 'min_lenght' => 1, 'max_lenght' => 255, 'not_spaces' => true),
|
||||
array('password', 'exists' => true, 'min_lenght' => 6, 'max_lenght' => 255, 'not_spaces' => true)
|
||||
));
|
||||
$msg = 'Existe un cuenta registrada con el mismo apodo o dirección de correo electrónico, por favor inténtelo de nuevo';
|
||||
$route = NABU_ROUTES['signup'];
|
||||
|
||||
$column = 'username';
|
||||
|
||||
// Selecciona el tipo de identificación (por apodo o e-mail).
|
||||
if (filter_var($data['identity'], FILTER_VALIDATE_EMAIL)) {
|
||||
$column = 'email';
|
||||
$data['identity'] = strtolower($data['identity']);
|
||||
}
|
||||
|
||||
$usersModel = new usersModel();
|
||||
|
||||
// Busca el usuario de acceso.
|
||||
$user = $usersModel -> get($column, $data['identity']);
|
||||
|
||||
$msg = 'La identificación de sesión o la contraseña es incorrecta';
|
||||
$route = NABU_ROUTES['login'];
|
||||
|
||||
// Valida si existe el usuario.
|
||||
if (empty($user)) {
|
||||
messages::add($msg);
|
||||
messages::exist($route);
|
||||
}
|
||||
|
||||
// Valida la contraseña del usuario.
|
||||
if (password_verify($data['password'], $user['password'])) {
|
||||
// Valida si el usuario tiene fecha de expiración del hash de verificación de e-mail.
|
||||
if (empty($user['hash_expiration'])) {
|
||||
// Define las credenciales de acceso si es una cuenta activa.
|
||||
if (empty($user['activated'])) {
|
||||
messages::add($msg);
|
||||
}
|
||||
else {
|
||||
$_SESSION['user'] = array(
|
||||
'id' => $user['id'],
|
||||
'username' => $user['username'],
|
||||
'role' => $user['role']
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Valida si es una cuenta inactiva.
|
||||
if (empty($user['activated'])) {
|
||||
// Valida si es una cuenta con hash expirado.
|
||||
if (time() > $user['hash_expiration']) {
|
||||
$userModel -> delete($user['id']);
|
||||
messages::add('Tu cuenta a expirado, por favor vuelva a registrarse');
|
||||
}
|
||||
else {
|
||||
messages::add('Por favor confirma tu dirección de correo electrónico');
|
||||
}
|
||||
}
|
||||
else {
|
||||
messages::add($msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Valida si la cuenta es única y elimina cuentas con autenticación expirada.
|
||||
foreach ($users as $user) {
|
||||
// Valida si es una cuenta inactiva.
|
||||
if (empty($user['activated']) && !empty($user['expiration'])) {
|
||||
// Valida si la autenticación está expirada.
|
||||
if (time() > $user['expiration'])
|
||||
$usersModel -> delete($user['id']);
|
||||
else {
|
||||
messages::add($msg);
|
||||
messages::add($msg);
|
||||
messages::check($route);
|
||||
}
|
||||
|
||||
messages::exist($route);
|
||||
|
||||
// Redirecciona al panel de administración en base al rol.
|
||||
if ($user['role'] == 'admin') {
|
||||
utils::redirect(NABU_ROUTES['admin']);
|
||||
}
|
||||
|
||||
// Redirecciona al perfil del usuario.
|
||||
utils::redirect(NABU_ROUTES['profile'] . '&user=' . urlencode($user['username']));
|
||||
}
|
||||
else {
|
||||
messages::add($msg);
|
||||
messages::check($route);
|
||||
}
|
||||
}
|
||||
|
||||
// Cierra una sesión de usuario.
|
||||
static public function logout() {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
// Genera una llave aleatoria de autenticación de e-mail.
|
||||
$key = bin2hex(random_bytes(32));
|
||||
|
||||
// Genera un hash de autenticación de e-mail.
|
||||
$hash = hash_hmac('sha256', $data['email'], $key);
|
||||
|
||||
require_once 'libs/emails.php';
|
||||
|
||||
$emails = new emails();
|
||||
$emails -> prepare($data['email'], $data['name']);
|
||||
|
||||
// Genera una URL de autenticación de e-mail.
|
||||
$url = NABU_ROUTES['authentication'] . '&user=' . urlencode($data['username']) . '&key=' . $key;
|
||||
|
||||
$username = utils::escape($data['username']);
|
||||
|
||||
$body = require_once 'views/emails/authentication.php';
|
||||
|
||||
// Envía primero la URL de autenticación de e-mail antes de registrar al usuario.
|
||||
if (!$emails -> send('¡Ya casi está listo!', $body))
|
||||
messages::errors('Tuvimos un problema al enviar tu mensaje de autenticación de e-mail', 500);
|
||||
|
||||
// Cifra la contraseña.
|
||||
$data['password'] = password_hash($data['password'], PASSWORD_DEFAULT, array('cost' => 12));
|
||||
|
||||
$data['registration_date'] = utils::current_date();
|
||||
|
||||
// Registra el nuevo usuario.
|
||||
$usersModel -> save($data);
|
||||
|
||||
// Consulta el id del nuevo usuario.
|
||||
$user = $usersModel -> get('username', $data['username']);
|
||||
|
||||
unset($usersModel);
|
||||
|
||||
// Define la fecha de expiración de la autenticación de e-mail.
|
||||
$authentication = array(
|
||||
'id' => $user['id'],
|
||||
'hash' => $hash,
|
||||
'expiration' => time() + 60 * 60
|
||||
);
|
||||
|
||||
require_once 'models/authenticationModel.php';
|
||||
|
||||
$authenticationModel = new authenticationModel();
|
||||
|
||||
// Registra el hash de autenticación de e-mail.
|
||||
$authenticationModel -> save($authentication);
|
||||
|
||||
messages::add('Su cuenta se ha registrado correctamente, por favor verifica tu dirección de correo electrónico');
|
||||
|
||||
utils::redirect(NABU_ROUTES['signup']);
|
||||
}
|
||||
|
||||
// Renderiza la página de inicio de sesión
|
||||
// y asigna credenciales de acceso con el método POST.
|
||||
static public function login() {
|
||||
if (empty($_POST['login-form'])) {
|
||||
utils::session_exists(NABU_ROUTES['home']);
|
||||
|
||||
$token = csrf::generate();
|
||||
$messages = messages::get();
|
||||
|
||||
require_once 'views/pages/login.php';
|
||||
|
||||
exit();
|
||||
}
|
||||
|
||||
csrf::validate($_POST['csrf']);
|
||||
|
||||
$validations = new validations(NABU_ROUTES['login']);
|
||||
|
||||
// Valida el formulario de inicio de sesión.
|
||||
$data = $validations -> validate($_POST, array(
|
||||
array('field' => 'identity', 'trim' => true, 'min_length' => 1, 'max_length' => 255, 'not_spaces' => true),
|
||||
array('field' => 'password', 'min_length' => 6, 'max_length' => 255, 'not_spaces' => true),
|
||||
));
|
||||
|
||||
$column = 'username';
|
||||
|
||||
// Selecciona el tipo de identificación (por apodo o e-mail).
|
||||
if (filter_var($data['identity'], FILTER_VALIDATE_EMAIL)) {
|
||||
$column = 'email';
|
||||
$data['identity'] = strtolower($data['identity']);
|
||||
}
|
||||
|
||||
$usersModel = new usersModel();
|
||||
|
||||
// Busca el usuario de acceso.
|
||||
$user = $usersModel -> get($column, $data['identity']);
|
||||
|
||||
$msg = 'La identificación de sesión o la contraseña son incorrectas';
|
||||
$route = NABU_ROUTES['login'];
|
||||
|
||||
// Valida si existe el usuario.
|
||||
if (empty($user)) {
|
||||
messages::add($msg);
|
||||
utils::redirect($route);
|
||||
}
|
||||
|
||||
// Valida la contraseña del usuario.
|
||||
if (!password_verify($data['password'], $user['password'])) {
|
||||
messages::add($msg);
|
||||
utils::redirect($route);
|
||||
}
|
||||
|
||||
// Valida si el usuario tiene fecha de expiración del hash de autenticación de e-mail.
|
||||
if (empty($user['expiration'])) {
|
||||
// Define las credenciales de acceso si es una cuenta activa.
|
||||
if (empty($user['activated']))
|
||||
messages::add($msg);
|
||||
else
|
||||
$_SESSION['user'] = array(
|
||||
'id' => $user['id'],
|
||||
'username' => $user['username'],
|
||||
'role' => $user['role']
|
||||
);
|
||||
}
|
||||
else {
|
||||
// Valida si es una cuenta inactiva.
|
||||
if (empty($user['activated'])) {
|
||||
// Valida si es una cuenta con hash expirado.
|
||||
if (time() > $user['expiration']) {
|
||||
$usersModel -> delete($user['id']);
|
||||
messages::add('Tu cuenta ha expirado, por favor vuelve a registrarte');
|
||||
}
|
||||
else
|
||||
messages::add('Por favor confirma tu dirección de correo electrónico');
|
||||
}
|
||||
else
|
||||
messages:add($msg);
|
||||
}
|
||||
|
||||
messages::check($route);
|
||||
|
||||
// Redireccion al panel de administración en base al role.
|
||||
if ($user['role'] == 'admin')
|
||||
utils::redirect(NABU_ROUTES['admin']);
|
||||
|
||||
// Redirecciona al perfil del usuario.
|
||||
utils::redirect(NABU_ROUTES['profile'] . '&user=' . urlencode($user['username']));
|
||||
}
|
||||
|
||||
// Cierra una sesión de usuario.
|
||||
static public function logout() {
|
||||
session_unset();
|
||||
session_destroy();
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
require_once 'models/verificationsModel.php';
|
||||
|
||||
// Activa la cuenta de un usuario desde una URL
|
||||
// de verificación de dirección de e-mail.
|
||||
class verificationsController {
|
||||
public static function verifications() {
|
||||
if (empty($_GET['user']) || empty($_GET['key'])) {
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
|
||||
$verificationsModel = new verificationsModel();
|
||||
|
||||
// Busca los datos de verificación de e-mail del usuario.
|
||||
$user = $verificationsModel -> get($_GET['user']);
|
||||
|
||||
if (empty($user['hash']) || empty($user['hash_expiration']) ||
|
||||
!empty($user['activated'])) {
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
|
||||
// Reconstruye el hash con la llave de verificación de la URL.
|
||||
$hash = hash_hmac('sha256', $user['email'], $_GET['key']);
|
||||
|
||||
// Valida la autentificación del hash.
|
||||
if (!hash_equals($user['hash'], $hash)) {
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
|
||||
// Valida si el hash de verificación de e-mail está expirado
|
||||
// y elimina el usuario.
|
||||
if (time() > $user['hash_expiration']) {
|
||||
unset($verificationsModel);
|
||||
|
||||
require_once 'models/usersModel.php';
|
||||
|
||||
$usersModel = new usersModel();
|
||||
$usersModel -> delete($user['id']);
|
||||
|
||||
messages::add('Tu cuenta ha expirado, por favor vuelva a registrarse');
|
||||
|
||||
utils::redirect(NABU_ROUTES['signup']);
|
||||
}
|
||||
|
||||
// Activa la cuenta del usuario y crea su perfil.
|
||||
$verificationsModel -> activate($user['id']);
|
||||
|
||||
messages::add('Tu dirección de correo electrónico se ha verificado correctamente');
|
||||
|
||||
utils::redirect(NABU_ROUTES['login']);
|
||||
}
|
||||
}
|
|
@ -1,4 +1,20 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
|
@ -8,13 +24,13 @@ define('NABU_DIRECTORY', array(
|
|||
'avatars' => NABU_URL . '/storage/avatars',
|
||||
'backgrounds' => NABU_URL . '/storage/backgrounds',
|
||||
'covers' => NABU_URL . '/storage/covers',
|
||||
'database' => './database-config.json',
|
||||
'email' => './email-config.json',
|
||||
'db' => 'config/db.json',
|
||||
'email' => 'config/email.json',
|
||||
'icons' => NABU_URL . '/assets/icons',
|
||||
'images' => NABU_URL . '/assets/images',
|
||||
'storage-avatars' => './storage/avatars',
|
||||
'storage-backgrounds' => './storage/backgrounds',
|
||||
'storage-covers' => './storage/covers',
|
||||
'storage-avatars' => 'storage/avatars',
|
||||
'storage-backgrounds' => 'storage/backgrounds',
|
||||
'storage-covers' => 'storage/covers',
|
||||
'scripts' => NABU_URL . '/assets/scripts',
|
||||
'styles' => NABU_URL . '/assets/styles',
|
||||
));
|
||||
|
@ -33,21 +49,21 @@ define('NABU_DEFAULT', array(
|
|||
date_default_timezone_set('America/Mexico_City');
|
||||
|
||||
/*
|
||||
// Nivel de reporte de errores (todos los errores).
|
||||
// Establece el nivel de reporte de errores "todos los errores".
|
||||
ini_set('error_reporting', E_ALL);
|
||||
|
||||
// No muestra en pantalla todos los errores.
|
||||
// Desactiva en pantalla todos los errores.
|
||||
ini_set('display_errors', 'Off');
|
||||
|
||||
// No muestra en pantalla todos los errores de inicio de ejecución de PHP.
|
||||
// Desactiva en pantalla todos los errores de inicio de ejecución de PHP.
|
||||
ini_set('display_startup_errors', false);
|
||||
|
||||
// No registra mensajes repetidos.
|
||||
// Desactiva el registro de mensajes repetidos sobre la última línea.
|
||||
ini_set('ignore_repeated_errros', true);
|
||||
|
||||
// Selecciona el manejador de errores de PHP 'error_log'.
|
||||
// Habilita el registro de errores desde un archivo externo.
|
||||
ini_set('log_errors', true);
|
||||
|
||||
// Define la ruta del archivo de registro de errores para 'error_log'.
|
||||
// Define la ruta del archivo de registro de errores.
|
||||
ini_set('error_log', 'logs/errors.log');
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Administra mensajes sobre advertencias, avisos y errores.
|
||||
class messages {
|
||||
// Agrega nuevos mensajes.
|
||||
static public function add(string $message) {
|
||||
if (empty($_SESSION['messages']))
|
||||
$_SESSION['messages'] = array();
|
||||
|
||||
array_push($_SESSION['messages'], $message);
|
||||
}
|
||||
|
||||
// @return un array de mensajes.
|
||||
static public function get() {
|
||||
if (empty($_SESSION['messages']))
|
||||
return array();
|
||||
|
||||
$messages = $_SESSION['messages'];
|
||||
|
||||
unset($_SESSION['messages']);
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
// Muestra los mensajes almacenados en una página.
|
||||
static public function check(string $route) {
|
||||
if (isset($_SESSION['messages']))
|
||||
utils::redirect($route);
|
||||
}
|
||||
|
||||
// Define un mensaje de error y redirecciona a la página de errores.
|
||||
static public function errors(string $message, int $code) {
|
||||
$_SESSION['errors'] = array(
|
||||
'message' => $message,
|
||||
'code' => $code
|
||||
);
|
||||
utils::redirect(NABU_ROUTES['errors']);
|
||||
}
|
||||
}
|
|
@ -1,41 +1,53 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
session_start();
|
||||
|
||||
require_once 'core/config.php';
|
||||
require_once 'libs/utils.php';
|
||||
require_once 'libs/messages.php';
|
||||
require_once 'core/utils.php';
|
||||
require_once 'core/messages.php';
|
||||
require_once 'db/connection.php';
|
||||
require_once 'libs/csrf.php';
|
||||
require_once 'libs/validations.php';
|
||||
require_once 'database/connection.php';
|
||||
|
||||
$components = require 'core/routes.php';
|
||||
|
||||
$routes = array();
|
||||
|
||||
// Genera la URL completa de todas las rutas.
|
||||
foreach ($components as $alias => $component) {
|
||||
$routes[$alias] = NABU_URL . '/index.php?view=' . $component['route'];
|
||||
}
|
||||
foreach ($components as $alias => $component)
|
||||
$routes[$alias] = NABU_URL . '/index.php?view=' . $component['route'];
|
||||
|
||||
define('NABU_ROUTES', $routes);
|
||||
|
||||
// Selecciona el controlador y la vista de una ruta solicitada.
|
||||
if (!empty($_GET['view'])) {
|
||||
foreach ($components as $alias => $component) {
|
||||
if ($component['route'] == $_GET['view']) {
|
||||
$controller = $component['controller'];
|
||||
$view = $component['view'];
|
||||
break;
|
||||
}
|
||||
if (isset($_GET['view']))
|
||||
foreach ($components as $alias => $component)
|
||||
if ($component['route'] == $_GET['view']) {
|
||||
$controller = $component['controller'];
|
||||
$view = $component['view'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($controller) || empty($view)) {
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
}
|
||||
if (empty($controller) || empty($view))
|
||||
utils::redirect(NABU_ROUTES['home']);
|
||||
|
||||
unset($components, $routes);
|
||||
|
||||
|
|
|
@ -1,30 +1,37 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
return array(
|
||||
'admin' => array('route' => 'admin', 'controller' => 'adminController', 'view' => 'admin'),
|
||||
'all-articles' => array('route' => 'all-articles', 'controller' => 'articlesController', 'view' => 'all_articles'),
|
||||
'article' => array('route' => 'article', 'controller' => 'articlesController', 'view' => 'article'),
|
||||
'authorize-article' => array('route' => 'admin§ion=authorize', 'controller' => 'adminController', 'view' => 'admin'),
|
||||
'category' => array('route' => 'category', 'controller' => 'articlesController', 'view' => 'category'),
|
||||
'comment' => array('route' => 'comment', 'controller' => 'communityController', 'view' => 'comment'),
|
||||
'delete-profile' => array('route' => 'profile&page=delete', 'controller' => 'profilesController', 'view' => 'profile'),
|
||||
'delete-article' => array('route' => 'admin§ion=delete', 'controller' => 'adminController', 'view' => 'delete_article'),
|
||||
'edit-article' => array('route' => 'admin§ion=edit', 'controller' => 'adminController', 'view' => 'edit_article'),
|
||||
'edit-profile' => array('route' => 'profile&page=edit', 'controller' => 'profilesController', 'view' => 'edit_profile'),
|
||||
'errors' => array('route' => 'errors', 'controller' => 'blogController', 'view' => 'errors'),
|
||||
'home' => array('route' => 'home', 'controller' => 'blogController', 'view' => 'home'),
|
||||
'favorites' => array('route' => 'favorites', 'controller' => 'communityController', 'view' => 'favorites'),
|
||||
'like' => array('route' => 'like', 'controller' => 'communityController', 'view' => 'like'),
|
||||
'login' => array('route' => 'login', 'controller' => 'usersController', 'view' => 'login'),
|
||||
'logout' => array('route' => 'logout', 'controller' => 'usersController', 'view' => 'logout'),
|
||||
'post-article' => array('route' => 'post-article', 'controller' => 'articlesController', 'view' => 'post_article'),
|
||||
'profile' => array('route' => 'profile', 'controller' => 'profilesController', 'view' => 'profile'),
|
||||
'published-articles' => array('route' => 'admin§ion=published', 'controller' => 'adminController', 'view' => 'admin'),
|
||||
'search' => array('route' => 'search', 'controller' => 'searchController', 'view' => 'search'),
|
||||
'sent-articles' => array('route' => 'sent-articles', 'controller' => 'articlesController', 'view' => 'sent_articles'),
|
||||
'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'),
|
||||
'users' => array('route' => 'admin§ion=users', 'controller' => 'adminController', 'view' => 'admin'),
|
||||
'verifications' => array('route' => 'verifications', 'controller' => 'verificationsController', 'view' => 'verifications'),
|
||||
'authentication' => array('route' => 'authentication', 'controller' => 'authenticationController', 'view' => 'authentication'),
|
||||
'all-articles' => array('route' => 'all-articles', 'controller' => 'articlesController', 'view' => 'all_articles'),
|
||||
'article' => array('route' => 'article', 'controller' => 'articlesController', 'view' => 'article'),
|
||||
'delete-profile' => array('route' => 'delete-profile', 'controller' => 'profilesController', 'view' => 'delete'),
|
||||
'edit-profile' => array('route' => 'edit-profile', 'controller' => 'profilesController', 'view' => 'edit'),
|
||||
'errors' => array('route' => 'errors', 'controller' => 'blogController', 'view' => 'errors'),
|
||||
'favorites' => array('route' => 'favorites', 'controller' => 'profilesController', 'view' => 'favorites'),
|
||||
'home' => array('route' => 'home', 'controller' => 'blogController', 'view' => 'home'),
|
||||
'login' => array('route' => 'login', 'controller' => 'usersController', 'view' => 'login'),
|
||||
'logout' => array('route' => 'logout', 'controller' => 'usersController', 'view' => 'logout'),
|
||||
'post-article' => array('route' => 'post-article', 'controller' => 'articlesController', 'view' => 'post_article'),
|
||||
'profile' => array('route' => 'profile', 'controller' => 'profilesController', 'view' => 'profile'),
|
||||
'search' => array('route' => 'search', 'controller' => 'articlesController', 'view' => 'search'),
|
||||
'sent-articles' => array('route' => 'sent-articles', 'controller' => 'profilesController', 'view' => 'sent_articles'),
|
||||
'signup' => array('route' => 'signup', 'controller' => 'usersController', 'view' => 'signup'),
|
||||
);
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Colección de herramientas propias para Nabu.
|
||||
class utils {
|
||||
// Redirecciona a una ruta y termina la ejecución de todos los scripts de PHP.
|
||||
static public function redirect(string $route) {
|
||||
header('Location: ' . $route);
|
||||
exit();
|
||||
}
|
||||
|
||||
// Redirecciona a una ruta si existe una sesión de usuario.
|
||||
static public function session_exists(string $route) {
|
||||
if (isset($_SESSION['user']))
|
||||
self::redirect($route);
|
||||
}
|
||||
|
||||
// @return un string escapado para HTML.
|
||||
static public function escape(string $str) {
|
||||
return htmlentities($str, ENT_COMPAT | ENT_HTML5, 'UTF-8');
|
||||
}
|
||||
|
||||
// @return la fecha actual.
|
||||
static public function current_date() {
|
||||
return date('Y-m-d H:i:s');
|
||||
}
|
||||
}
|
|
@ -1,83 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Realiza la conexión con la base de datos.
|
||||
class connection {
|
||||
protected $pdo;
|
||||
|
||||
public function __construct() {
|
||||
if (!file_exists(NABU_DIRECTORY['database'])) {
|
||||
exit('Create a database config file.');
|
||||
}
|
||||
|
||||
// Carga el archivo de configuración de la base de datos.
|
||||
$config = file_get_contents(NABU_DIRECTORY['database']);
|
||||
|
||||
if ($config === false) {
|
||||
exit('The database config file is invalid.');
|
||||
}
|
||||
|
||||
$config = json_decode($config, true);
|
||||
|
||||
$keys = array('dbms', 'host', 'database', 'user', 'password', 'charset');
|
||||
|
||||
foreach ($keys as $key) {
|
||||
if (empty($config[$key])) {
|
||||
exit('Set "' . $key . '" in the database config file.');
|
||||
}
|
||||
}
|
||||
|
||||
// Parámetros de configuración de la conexión de la base de datos.
|
||||
$options = array(
|
||||
// Mantiene el nombre de las columnas como en la base de datos.
|
||||
PDO::ATTR_CASE => PDO::CASE_NATURAL,
|
||||
// Define el manejador de errores de 'PDO' por excepciones, utiliza el objeto 'PDOException'.
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
// Deshabilita las consultas preparadas de 'PDO' y utiliza el sistema nativo del SGBD.
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
// Define por defecto los resultados de las consultas como arrays asociativos.
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
|
||||
);
|
||||
|
||||
// Origen de la base de datos.
|
||||
$dsn = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database'];
|
||||
|
||||
try {
|
||||
// Configuración y conexión de la base de datos.
|
||||
$this -> pdo = new PDO($dsn, $config['user'], $config['password'], $options);
|
||||
|
||||
// Define la codificación de caracteres para el cliente del SGBD y los resultados de las consultas.
|
||||
$this -> pdo -> exec('SET CHARSET ' . $config['charset']);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
exit($e -> getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
protected function errors(string $exception, string $error) {
|
||||
// error_log($exception);
|
||||
|
||||
messages::errors('¡Lo sentimos mucho! 😞, ' . $error . ', por favor inténtalo más tarde', 500);
|
||||
}
|
||||
|
||||
// @return el alias de un id de role.
|
||||
protected function role_format($id) {
|
||||
$role = 'user';
|
||||
|
||||
if ($id == 1) {
|
||||
$role = 'admin';
|
||||
}
|
||||
|
||||
if ($id == 2) {
|
||||
$role = 'moderator';
|
||||
}
|
||||
|
||||
return $role;
|
||||
}
|
||||
|
||||
// Finaliza la conexión con la base de datos.
|
||||
public function __destruct() {
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,88 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Realiza la conexión con la base de datos.
|
||||
class dbconnection {
|
||||
protected $pdo;
|
||||
|
||||
public function __construct() {
|
||||
if (!file_exists(NABU_DIRECTORY['db']))
|
||||
messages::errors('No se encontró el archivo de configuración de la base de datos ' . NABU_DIRECTORY['db'], 500);
|
||||
|
||||
// Lee el archivo de configuración de la base de datos.
|
||||
$config = file_get_contents(NABU_DIRECTORY['db']);
|
||||
$config = json_decode($config, true);
|
||||
|
||||
$params = array('dbms', 'host', 'database', 'user', 'password', 'charset');
|
||||
|
||||
foreach ($params as $param)
|
||||
if (empty($config[$param]))
|
||||
messages::errors('Define el parámetro "' . $param . '" en el archivo de configuración de la base de datos', 500);
|
||||
|
||||
// Parámetros de configuración para la conexión de la base de datos.
|
||||
$options = array(
|
||||
// Mantiene el nombre de las columnas como en la base de datos.
|
||||
PDO::ATTR_CASE => PDO::CASE_NATURAL,
|
||||
// Define los errores de "PDO" por excepciones, utiliza el objeto "PDOException".
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
// Desactiva las consultas preparadas por PDO y utiliza el sistema nativo del SGBD.
|
||||
PDO::ATTR_EMULATE_PREPARES => false,
|
||||
// Por defecto, retorna los resultados de las consultas como arrays asociativos.
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
|
||||
);
|
||||
|
||||
// Origen de la base de datos.
|
||||
$dsn = $config['dbms'] . ':host=' . $config['host'] . ';dbname=' . $config['database'];
|
||||
|
||||
try {
|
||||
// Realiza la conexión con la base de datos.
|
||||
$this -> pdo = new PDO($dsn, $config['user'], $config['password'], $options);
|
||||
|
||||
// Establece la codificación de caracteres para el cliente del SGBD y los resultados de las consultas.
|
||||
$this -> pdo -> exec('SET CHARSET ' . $config['charset']);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
messages::errors($e -> getMessage(), 500);
|
||||
}
|
||||
}
|
||||
|
||||
protected function errors(string $exception, string $error) {
|
||||
error_log($exception);
|
||||
|
||||
messages::errors('¡Lo sentimos mucho! 😞, ' . $error . ', por favor inténtelo más tarde', 500);
|
||||
}
|
||||
|
||||
// @return el alias de un id de role.
|
||||
protected function role(int $id) {
|
||||
$role = 'user';
|
||||
|
||||
if ($id == 1)
|
||||
$role = 'admin';
|
||||
if ($id == 2)
|
||||
$role = 'moderator';
|
||||
|
||||
return $role;
|
||||
}
|
||||
|
||||
// Finaliza la conexión con la base de datos.
|
||||
public function __destruct() {
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -16,26 +16,26 @@ CREATE TABLE IF NOT EXISTS `roles` (
|
|||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `users` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`role_id` TINYINT UNSIGNED NOT NULL DEFAULT 3,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`email` VARCHAR(255),
|
||||
`password` VARCHAR(255) NOT NULL,
|
||||
`activated` TINYINT(1) NOT NULL DEFAULT FALSE,
|
||||
`creation_date` DATETIME(0) NOT NULL,
|
||||
CONSTRAINT users_id_pk PRIMARY KEY(id),
|
||||
CONSTRAINT users_username_uk UNIQUE(username),
|
||||
CONSTRAINT users_email_uk UNIQUE(email),
|
||||
CONSTRAINT users_role_id_fk FOREIGN KEY(role_id) REFERENCES roles(id) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`role_id` TINYINT UNSIGNED NOT NULL DEFAULT 3,
|
||||
`name` VARCHAR(255) NOT NULL,
|
||||
`username` VARCHAR(255) NOT NULL,
|
||||
`email` VARCHAR(255),
|
||||
`password` VARCHAR(255) NOT NULL,
|
||||
`activated` TINYINT(1) NOT NULL DEFAULT FALSE,
|
||||
`registration_date` DATETIME(0) NOT NULL,
|
||||
CONSTRAINT users_id_pk PRIMARY KEY(id),
|
||||
CONSTRAINT users_username_uk UNIQUE(username),
|
||||
CONSTRAINT users_email_uk UNIQUE(email),
|
||||
CONSTRAINT users_role_id_fk FOREIGN KEY(role_id) REFERENCES roles(id) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `verifications` (
|
||||
CREATE TABLE IF NOT EXISTS `authentications` (
|
||||
`id` INT UNSIGNED NOT NULL,
|
||||
`hash` VARCHAR(255) NOT NULL,
|
||||
`expiration` INT UNSIGNED NOT NULL,
|
||||
CONSTRAINT verifications_id_pk PRIMARY KEY(id),
|
||||
CONSTRAINT verifications_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE
|
||||
CONSTRAINT authentications_id_pk PRIMARY KEY(id),
|
||||
CONSTRAINT authentications_id_fk FOREIGN KEY(id) REFERENCES users(id) ON UPDATE CASCADE ON DELETE CASCADE
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `profiles` (
|
||||
|
@ -66,21 +66,6 @@ CREATE TABLE IF NOT EXISTS `articles` (
|
|||
CONSTRAINT articles_cover_uk UNIQUE(cover)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `categories` (
|
||||
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
`name` VARCHAR(50) NOT NULL,
|
||||
CONSTRAINT categories_id_pk PRIMARY KEY(id),
|
||||
CONSTRAINT categories_name_uk UNIQUE(name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `categories_article` (
|
||||
`article_id` INT UNSIGNED NOT NULL,
|
||||
`categorie_id` INT UNSIGNED NOT NULL,
|
||||
CONSTRAINT categories_article_pk PRIMARY KEY(article_id, categorie_id),
|
||||
CONSTRAINT categories_article_article_id_fk FOREIGN KEY(article_id) REFERENCES articles(id) ON UPDATE RESTRICT ON DELETE RESTRICT,
|
||||
CONSTRAINT categories_categorie_id_fk FOREIGN KEY(categorie_id) REFERENCES categories(id) ON UPDATE RESTRICT ON DELETE RESTRICT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `authorizations` (
|
||||
`article_id` INT UNSIGNED NOT NULL,
|
||||
`user_id` INT UNSIGNED NOT NULL,
|
16
index.php
|
@ -1,4 +1,20 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
define('NABU', true);
|
||||
|
||||
|
|
|
@ -1,50 +1,63 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Valida formularios contra ataques CSRF.
|
||||
// Valida formularios contra ataques CSRF,
|
||||
class csrf {
|
||||
private const size = 32;
|
||||
private const hash = 'sha256';
|
||||
private const secret = 'rWO!KJ9&*Wk@';
|
||||
private const expiration = 4; // Horas.
|
||||
private const size = 32;
|
||||
private const hash = 'sha256';
|
||||
private const secret = 'YyL$62x*qXtl';
|
||||
private const expiration = 4; // Horas.
|
||||
|
||||
// Elimina la variable de sesión.
|
||||
private static function destroy() {
|
||||
unset($_SESSION['csrf']);
|
||||
}
|
||||
// Genera un token en base a bytes aleatorios.
|
||||
public static function generate() {
|
||||
$key = bin2hex(random_bytes(self::size));
|
||||
|
||||
private static function errors(string $error) {
|
||||
self::destroy();
|
||||
messages::errors($error, 400);
|
||||
}
|
||||
$_SESSION['csrf'] = array(
|
||||
'token' => hash_hmac(self::hash, self::secret, $key),
|
||||
'expiration' => time() + (60 * 60 * self::expiration)
|
||||
);
|
||||
|
||||
// Genera un token en base a bytes aleatorios.
|
||||
public static function generate() {
|
||||
$key = bin2hex(random_bytes(self::size));
|
||||
return $_SESSION['csrf']['token'];
|
||||
}
|
||||
|
||||
$_SESSION['csrf'] = array(
|
||||
'token' => hash_hmac(self::hash, self::secret, $key),
|
||||
'expiration' => time() + (60 * 60 * self::expiration)
|
||||
);
|
||||
// Elimina la variable de sesión.
|
||||
private static function destroy() {
|
||||
unset($_SESSION['csrf']);
|
||||
}
|
||||
|
||||
return $_SESSION['csrf']['token'];
|
||||
}
|
||||
private static function errors(string $error) {
|
||||
self::destroy();
|
||||
messages::errors($error, 400);
|
||||
}
|
||||
|
||||
// Valida si un token no está expirado y es igual al generado.
|
||||
public static function validate($token2) {
|
||||
if (empty($_SESSION['csrf']) || empty($token2)) {
|
||||
self::errors('El token del formulario es inválido');
|
||||
}
|
||||
// Valida si un token no está expirado y es igual al generado.
|
||||
public static function validate($token2) {
|
||||
if (empty($_SESSION['csrf']) || empty($token2))
|
||||
self::errors('El token del formulario no es válido');
|
||||
|
||||
if (time() > $_SESSION['csrf']['expiration']) {
|
||||
self::errors('El formulario ha expirado, por favor recargue la página web');
|
||||
}
|
||||
if (time() > $_SESSION['csrf']['expiration'])
|
||||
self::errors('El formulario ha expirado');
|
||||
|
||||
if (!hash_equals($_SESSION['csrf']['token'], $token2)) {
|
||||
self::errors('Los tokens del formulario no coinciden');
|
||||
}
|
||||
if (!hash_equals($_SESSION['csrf']['token'], $token2))
|
||||
self::errors('Los tokens del formulario no coinciden');
|
||||
|
||||
self::destroy();
|
||||
}
|
||||
self::destroy();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,20 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
|
@ -8,50 +24,43 @@ use Snipworks\Smtp\Email;
|
|||
|
||||
// Envía mensajes de e-mail en formato HTML.
|
||||
class emails {
|
||||
private $mail;
|
||||
private $mail;
|
||||
|
||||
private function errors(string $error) {
|
||||
messages::errors($error, 400);
|
||||
}
|
||||
private function errors(string $error) {
|
||||
messages::errors($error, 500);
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
if (!file_exists(NABU_DIRECTORY['email'])) {
|
||||
$this -> errors('Create a e-mail config file');
|
||||
}
|
||||
public function __construct() {
|
||||
if (!file_exists(NABU_DIRECTORY['email']))
|
||||
$this -> errors('No se encontró el archivo de configuración del cliente de correo electrónico ' . NABU_DIRECTORY['email']);
|
||||
|
||||
// Carga el archivo de configuración del cliente de e-mail.
|
||||
$config = file_get_contents(NABU_DIRECTORY['email']);
|
||||
// Carga el archivo de configuración del cliente de e-mail.
|
||||
$config = file_get_contents(NABU_DIRECTORY['email']);
|
||||
$config = json_decode($config, true);
|
||||
|
||||
if ($config === false) {
|
||||
$this -> errors('The e-mail config file is invalid');
|
||||
}
|
||||
$params = array('smtp', 'port', 'address', 'password');
|
||||
|
||||
$config = json_decode($config, true);
|
||||
foreach ($params as $param)
|
||||
if (empty($config[$param]))
|
||||
messages::errors('Define el parámetro "' . $param . '" en el archivo de configuración del cliente correo electrónico', 500);
|
||||
|
||||
$keys = array('smtp', 'port', 'address', 'password');
|
||||
// Configura el cliente de e-mail.
|
||||
$this -> mail = new Email($config['smtp'], $config['port']);
|
||||
$this -> mail -> setProtocol(Email::TLS);
|
||||
$this -> mail -> setLogin($config['address'], $config['password']);
|
||||
$this -> mail -> setFrom($config['address'], NABU_DEFAULT['website-name']);
|
||||
}
|
||||
|
||||
foreach ($keys as $key) {
|
||||
if (empty($config[$key])) {
|
||||
$this -> errors('Set "' . $key . '" in e-mail config file');
|
||||
}
|
||||
}
|
||||
// Define el destinatario del mensaje,
|
||||
public function prepare(string $destinatary, string $name) {
|
||||
$this -> mail -> addTo($destinatary, $name);
|
||||
}
|
||||
|
||||
// Configura el cliente del e-mail.
|
||||
$this -> mail = new Email($config['smtp'], $config['port']);
|
||||
$this -> mail -> setProtocol(Email::TLS);
|
||||
$this -> mail -> setLogin($config['address'], $config['password']);
|
||||
$this -> mail -> setFrom($config['address'], NABU_DEFAULT['website-name']);
|
||||
}
|
||||
// Envía un mensaje de e-mail HTML.
|
||||
public function send(string $subject, string $body) {
|
||||
$this -> mail -> setSubject($subject);
|
||||
$this -> mail -> setHtmlMessage($body);
|
||||
|
||||
// Define el destinatario del mensaje.
|
||||
public function prepare(string $destinatary, string $name) {
|
||||
$this -> mail -> addTo($destinatary, $name);
|
||||
}
|
||||
|
||||
// Envía un mensaje de e-mail HTML.
|
||||
public function send(string $subject, string $body) {
|
||||
$this -> mail -> setSubject($subject);
|
||||
$this -> mail -> setHtmlMessage($body);
|
||||
return $this -> mail -> send();
|
||||
}
|
||||
return $this -> mail -> send();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,45 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Administra mensajes sobre advertencias, avisos y errores en las páginas.
|
||||
class messages {
|
||||
// Agrega mensajes sobre advertencias o avisos.
|
||||
static public function add(string $message) {
|
||||
if (empty($_SESSION['messages'])) {
|
||||
$_SESSION['messages'] = array();
|
||||
}
|
||||
|
||||
array_push($_SESSION['messages'], $message);
|
||||
}
|
||||
|
||||
// @return un array de mensajes.
|
||||
static public function get() {
|
||||
if (empty($_SESSION['messages'])) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$messages = $_SESSION['messages'];
|
||||
|
||||
unset($_SESSION['messages']);
|
||||
|
||||
return $messages;
|
||||
}
|
||||
|
||||
// Muestra los mensajes almacenados en una página.
|
||||
static public function exist(string $route) {
|
||||
if (!empty($_SESSION['messages'])) {
|
||||
utils::redirect($route);
|
||||
}
|
||||
}
|
||||
|
||||
// Define un mensaje de error y los muestra en la página de errores.
|
||||
static public function errors(string $message, int $code) {
|
||||
$_SESSION['errors'] = array(
|
||||
'message' => $message,
|
||||
'code' => $code
|
||||
);
|
||||
|
||||
utils::redirect(NABU_ROUTES['errors']);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,4 @@
|
|||
/.idea/
|
||||
/vendor/
|
||||
|
||||
composer.lock
|
|
@ -1,29 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Colección de herramientas propias de Nabu.
|
||||
class utils {
|
||||
// Redirecciona a una página web y termina la ejecución de todos los scripts de PHP.
|
||||
static public function redirect(string $route) {
|
||||
header('Location: ' . $route);
|
||||
exit();
|
||||
}
|
||||
|
||||
// @return la fecha actual.
|
||||
static public function current_date() {
|
||||
return date('Y-m-d H:i:s');
|
||||
}
|
||||
|
||||
// @return un string escapado para HTML.
|
||||
static public function escape($str) {
|
||||
return htmlentities($str, ENT_COMPAT | ENT_HTML5, 'UTF-8');
|
||||
}
|
||||
|
||||
// Redirecciona a 'route' si existe una sesión de usuario.
|
||||
static public function session_exists(string $route) {
|
||||
if (!empty($_SESSION['user'])) {
|
||||
self::redirect($route);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,176 +1,132 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Valida los campos de un formulario.
|
||||
class validations {
|
||||
private $route;
|
||||
private $field;
|
||||
private $value;
|
||||
private $route;
|
||||
private $field;
|
||||
private $value;
|
||||
|
||||
// Define la ruta de redirección para mostrar mensajes sobre campos inválidos.
|
||||
public function __construct(string $route) {
|
||||
$this -> route = $route;
|
||||
public function __construct(string $route) {
|
||||
$this -> route = $route;
|
||||
}
|
||||
|
||||
// Muestra errores fatales.
|
||||
private function errors(string $error) {
|
||||
messages::errors($error, 500);
|
||||
}
|
||||
|
||||
// Elimina espacios sobrantes y de principio y fin de un string.
|
||||
private function trim_all() {
|
||||
$this -> value = trim(preg_replace('/\s+/', ' ', $this -> value));
|
||||
}
|
||||
|
||||
// Valida la longitud de un string.
|
||||
private function validate_length(int $min, int $max) {
|
||||
$length = strlen($this -> value);
|
||||
|
||||
if ($length < $min || $length > $max)
|
||||
messages::add('El campo "' . $this -> field . '" no respeta los límites establecidos');
|
||||
}
|
||||
|
||||
// Valida si un string contiene espacios.
|
||||
private function is_space() {
|
||||
$str = $this -> value;
|
||||
|
||||
if (preg_replace('/\s+/', '', $str) !== $str)
|
||||
messages::add('El campo "' . $this -> field . '" contiene espacios');
|
||||
}
|
||||
|
||||
// Valida si una dirección de correo electrónico pertenece a la Universidad de Guanajuato.
|
||||
private function is_email() {
|
||||
$email = $this -> value;
|
||||
|
||||
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
if (!str_ends_with($email, '@ugto.mx'))
|
||||
messages::add('Registrate con tu dirección de correo electrónico institucional de la Universidad de Guanajuato');
|
||||
}
|
||||
else
|
||||
messages::add('El campo "' . $this -> field . '" contiene una dirección de correo electrónico no válido');
|
||||
}
|
||||
|
||||
// Valida si dos datos son iguales.
|
||||
private function equal($foo) {
|
||||
if ($this -> value !== $foo)
|
||||
messages::add('El campo "' . $this -> field . '" no coincide');
|
||||
}
|
||||
|
||||
// Valida y selecciona los campos de un formulario,
|
||||
// @return un array asociativo con los valores de los campos que son válidos.
|
||||
public function validate(array $form, array $params) {
|
||||
$data = array();
|
||||
|
||||
foreach ($params as $param) {
|
||||
if (empty($param['field']))
|
||||
$this -> errors('Define el nombre del campo del formulario en la validación');
|
||||
|
||||
// Nombre del campo.
|
||||
$this -> field = $param['field'];
|
||||
|
||||
// Valida si el campo es obligatorio u opcional (default: obligatorio).
|
||||
if (empty($form[$this -> field])) {
|
||||
if (empty($param['optional']))
|
||||
messages::add('El campo "' . $this -> field . '" es obligatorio');
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Define el tipo de dato del campo (default: string).
|
||||
$type = empty($param['type']) ? 'string' : $param['type'];
|
||||
|
||||
// Dato del campo.
|
||||
$this -> value = $form[$this -> field];
|
||||
|
||||
// Realiza acciones en base a "$type".
|
||||
if ($type == 'string' || $type == 'email') {
|
||||
// Selecciona el tipo de limpieza de espacios.
|
||||
if (isset($param['trim']))
|
||||
$this -> value = trim($this -> value);
|
||||
elseif (isset($param['trim_all']))
|
||||
$this -> trim_all();
|
||||
|
||||
if (isset($param['min_length']) && isset($param['max_length']))
|
||||
$this -> validate_length($param['min_length'], $param['max_length']);
|
||||
|
||||
if (isset($param['not_spaces']))
|
||||
$this -> is_space();
|
||||
|
||||
if ($type == 'email')
|
||||
$this -> is_email();
|
||||
}
|
||||
elseif ($type == 'image') {
|
||||
//
|
||||
}
|
||||
|
||||
if (isset($param['equal']))
|
||||
$this -> equal($param['equal']);
|
||||
|
||||
$data[$this -> field] = $this -> value;
|
||||
}
|
||||
|
||||
// Muestra errores fatales.
|
||||
private function errors(string $error) {
|
||||
messages::errors($error, 400);
|
||||
}
|
||||
messages::check($this -> route);
|
||||
|
||||
// Valida si la información de un archivo proviene
|
||||
// de la variable global '$_FILE'.
|
||||
private function is_file() {
|
||||
$file = $this -> value;
|
||||
return is_array($file) && !empty($file['tmp_name']);
|
||||
}
|
||||
|
||||
// Elimina espacios sobrantes y de principio y fin de un string.
|
||||
private function trim_all() {
|
||||
return trim(preg_replace('/\s+/', ' ', $this -> value));
|
||||
}
|
||||
|
||||
// Valida la longitud de un string.
|
||||
private function string_lenght(int $min, int $max) {
|
||||
$length = strlen($this -> value);
|
||||
|
||||
if ($length < $min || $length > $max) {
|
||||
messages::add('El campo "' . $this -> field . '" no respeta los límites establecidos');
|
||||
}
|
||||
}
|
||||
|
||||
// Valida si un string contiene espacios.
|
||||
private function is_space() {
|
||||
$str = $this -> value;
|
||||
|
||||
if (preg_replace('/\s+/', '', $str) !== $str) {
|
||||
messages::add('El campo "' . $this -> field . '" contiene espacios');
|
||||
}
|
||||
}
|
||||
|
||||
// Valida si una dirección de correo electrónico es de la Universidad de Guanajuato.
|
||||
private function is_email() {
|
||||
$email = $this -> value;
|
||||
|
||||
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
if (!str_ends_with($email, '@ugto.mx')) {
|
||||
messages::add('Registrate con tu dirección de correo electrónico institucional de la Universidad de Guanajuato');
|
||||
}
|
||||
}
|
||||
else {
|
||||
messages::add('El campo "' . $this -> field . '" contiene una dirección de correo electrónico no válido');
|
||||
}
|
||||
}
|
||||
|
||||
// Valida el tamaño y el formato de una imagen.
|
||||
private function is_image() {
|
||||
$size = $this -> value['size'];
|
||||
|
||||
if ($size > NABU_DEFAULT['image-size']) {
|
||||
messages::add('Por favor elija una imagen de diferente peso');
|
||||
}
|
||||
|
||||
$formats = explode(',', NABU_DEFAULT['image-formats']);
|
||||
|
||||
foreach ($formats as $format) {
|
||||
if (trim($format) == $this -> value['type']) {
|
||||
$extension = $format;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($extension)) {
|
||||
messages::add('Formato de imagen inválido');
|
||||
}
|
||||
}
|
||||
|
||||
// Valida si dos datos son iguales.
|
||||
private function equal($foo) {
|
||||
if ($this -> value !== $foo) {
|
||||
messages::add('El campo "' . $this -> field . '" no coincide');
|
||||
}
|
||||
}
|
||||
|
||||
// Valida y selecciona los campos de un formulario;
|
||||
// @return un array asociativo con los valores de los campos que son válidos.
|
||||
public function validate_form(array $form, array $options) {
|
||||
$data = array();
|
||||
|
||||
foreach ($options as $option) {
|
||||
if (empty($option[0]) || !is_string($option[0])) {
|
||||
$this -> errors('Not found field name');
|
||||
}
|
||||
|
||||
$type = 'string';
|
||||
|
||||
// Define el tipo de dato del campo (dafault: string).
|
||||
if (!empty($option['is_email'])) {
|
||||
$type = 'is_email';
|
||||
}
|
||||
elseif (!empty($option['is_image'])) {
|
||||
$type = 'is_image';
|
||||
}
|
||||
|
||||
// Nombre del campo.
|
||||
$this -> field = $option[0];
|
||||
|
||||
// Valida si un campo es obligatorio u opcional.
|
||||
if (empty($form[$this -> field])) {
|
||||
if (!empty($option['exists'])) {
|
||||
messages::add('El campo "' . $this -> field . '" es obligatorio');
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// Dato del campo.
|
||||
$this -> value = $form[$this -> field];
|
||||
|
||||
// Valida si un campo es un archivo y si es obligatorio u opcional.
|
||||
if ($type == 'is_image') {
|
||||
if (!$this -> is_file()) {
|
||||
if (!empty($option['exists'])) {
|
||||
messages::add('El campo "' . $this -> field . '" require obligatoriamente de un archivo de imagen');
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// Realiza acciones en base a '$type'.
|
||||
if ($type == 'string' || $type == 'is_email') {
|
||||
// Selecciona el tipo de limpieza de espacios.
|
||||
if (!empty($option['trim_all'])) {
|
||||
$this -> value = $this -> trim_all();
|
||||
}
|
||||
elseif (!empty($option['trim'])) {
|
||||
$this -> value = trim($this -> value);
|
||||
}
|
||||
|
||||
if (!empty($option['min_lenght']) && !empty($option['max_lenght'])) {
|
||||
$this -> string_lenght($option['min_lenght'], $option['max_lenght']);
|
||||
}
|
||||
|
||||
if (!empty($option['not_spaces'])) {
|
||||
$this -> is_space();
|
||||
}
|
||||
}
|
||||
|
||||
if ($type == 'is_email') {
|
||||
$this -> is_email();
|
||||
}
|
||||
|
||||
if ($type == 'is_image') {
|
||||
$this -> is_image();
|
||||
}
|
||||
|
||||
if (array_key_exists('equal', $option)) {
|
||||
$this -> equal($option['equal']);
|
||||
}
|
||||
|
||||
$data[$this -> field] = $this -> value;
|
||||
}
|
||||
|
||||
messages::exist($this -> route);
|
||||
|
||||
return $data;
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class adminModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class articlesModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class authenticationModel extends dbConnection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
// Registra el hash de autenticación de e-mail con tiempo de expiración.
|
||||
public function save(array $authentication) {
|
||||
$query = 'INSERT INTO authentications(id, hash, expiration) VALUES(:id, :hash, :expiration)';
|
||||
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute($authentication);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu clave de verificación de dirección de correo electrónico');
|
||||
}
|
||||
}
|
||||
|
||||
// @return un array asociativo con los datos de autenticación de e-mail de un usuario.
|
||||
public function get(string $username) {
|
||||
$query = 'SELECT u.id, u.email, u.activated, a.hash, a.expiration ' .
|
||||
'FROM users AS u LEFT JOIN authentications AS a ON u.id = a.id ' .
|
||||
'WHERE u.username = ? LIMIT 1';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($username));
|
||||
|
||||
$user = $prepare -> fetch();
|
||||
|
||||
if (empty($user))
|
||||
$user = array();
|
||||
|
||||
return $user;
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para validar tu dirección de correo electrónico');
|
||||
}
|
||||
}
|
||||
|
||||
// Activa la cuenta, elimina la autenticación y crea el perfil de un usuario.
|
||||
public function activate(int $id) {
|
||||
$query_activate = 'UPDATE users SET activated = TRUE WHERE id = ?';
|
||||
$query_delete = 'DELETE FROM authentications WHERE id = ?';
|
||||
$query_profile = 'INSERT INTO profiles(id) VALUES(?)';
|
||||
|
||||
$id = array($id);
|
||||
|
||||
try {
|
||||
$this -> pdo -> prepare($query_activate) -> execute($id);
|
||||
$this -> pdo -> prepare($query_delete) -> execute($id);
|
||||
$this -> pdo -> prepare($query_profile) -> execute($id);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para activar tu cuenta de usuario');
|
||||
}
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -1,14 +1,30 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class blogModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
class blogModel extends dbConnection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class communityModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class profilesModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -1,14 +0,0 @@
|
|||
<?php
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
class searchModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
|
@ -1,92 +1,105 @@
|
|||
<?php
|
||||
/*
|
||||
* Este archivo es parte de Nabu.
|
||||
*
|
||||
* Nabu es software libre: puedes redistribuirlo y/o modificarlo
|
||||
* bajo los términos de la Licencia Pública General de GNU Affero publicada por
|
||||
* la Free Software Foundation, ya sea la versión 3 de la Licencia, o
|
||||
* (a su elección) cualquier versión posterior.
|
||||
*
|
||||
* Nabu se distribuye con la esperanza de que sea de utilidad,
|
||||
* pero SIN NINGUNA GARANTÍA; incluso sin la garantía implícita de
|
||||
* COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. Consulte la
|
||||
* Licencia Pública General de GNU Affero para obtener más detalles.
|
||||
*
|
||||
* Debería haber recibido una copia de la Licencia Pública General de GNU Affero
|
||||
* junto con este programa. De lo contrario, consulte <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
defined('NABU') || exit();
|
||||
|
||||
// Manipula los datos de los usuarios.
|
||||
class usersModel extends connection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
class usersModel extends dbConnection {
|
||||
public function __construct() {
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
// @return una lista de arrays asociativos con los datos de los usuarios.
|
||||
public function find(string $username, string $email) {
|
||||
$query = 'SELECT u.id, u.username, u.email, u.password, u.activated, u.registration_date,' .
|
||||
'a.hash, a.expiration FROM users AS u ' .
|
||||
'LEFT JOIN authentications AS a ON u.id = a.id ' .
|
||||
'WHERE u.username = ? OR u.email = ? LIMIT 2';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($username, $email));
|
||||
|
||||
$users = $prepare -> fetchAll();
|
||||
|
||||
if (empty($users))
|
||||
$users = array();
|
||||
|
||||
return $users;
|
||||
}
|
||||
|
||||
// @return un lista de arrays asociativos con los datos de los usuarios.
|
||||
public function find(string $username, string $email) {
|
||||
$query = 'SELECT u.id, u.username, u.email, u.password, u.activated, u.creation_date,' .
|
||||
'v.hash, v.expiration AS hash_expiration FROM users AS u ' .
|
||||
'LEFT JOIN verifications AS v on u.id = v.id ' .
|
||||
'WHERE u.username = ? OR u.email = ? LIMIT 2';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($username, $email));
|
||||
|
||||
$users = $prepare -> fetchAll();
|
||||
|
||||
if (empty($users)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
return $users;
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos');
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos');
|
||||
}
|
||||
}
|
||||
|
||||
// Registra un nuevo usuario.
|
||||
public function save(array $data) {
|
||||
$query = 'INSERT INTO users(name, username, email, password, creation_date) ' .
|
||||
'VALUES(:name, :username, :email, :password, :creation_date)';
|
||||
// Elimina un usuario.
|
||||
public function delete(int $id) {
|
||||
$query = 'DELETE FROM users WHERE id = ?';
|
||||
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute($data);
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu cuenta de usuario');
|
||||
}
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute(array($id));
|
||||
}
|
||||
|
||||
// @return un array asociativo con los datos de un solo usuario.
|
||||
public function get(string $column, $pattern) {
|
||||
$query = 'SELECT u.id, u.role_id AS role, u.username, u.email, u.password, u.activated, u.creation_date,' .
|
||||
'v.hash, v.expiration AS hash_expiration FROM users AS u ' .
|
||||
'LEFT JOIN verifications AS v on u.id = v.id ' .
|
||||
'WHERE u.' . $column . ' = ? LIMIT 1';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($pattern));
|
||||
|
||||
$user = $prepare -> fetch();
|
||||
|
||||
if (empty($user)) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$user['role'] = $this -> role_format($user['role']);
|
||||
|
||||
return $user;
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para buscar tu cuenta de usuario');
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para eliminar una cuenta de usuario');
|
||||
}
|
||||
}
|
||||
|
||||
// Elimina un usuario.
|
||||
public function delete(int $id) {
|
||||
$query = 'DELETE FROM users WHERE id = ?';
|
||||
// Registra un nuevo usuario.
|
||||
public function save(array $data) {
|
||||
$query = 'INSERT INTO users(name, username, email, password, registration_date) ' .
|
||||
'VALUES(:name, :username, :email, :password, :registration_date)';
|
||||
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute(array($id));
|
||||
}
|
||||
catch (PDOException) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para eliminar una cuenta de usuario');
|
||||
}
|
||||
try {
|
||||
$this -> pdo -> prepare($query) -> execute($data);
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para registrar tu cuenta de usuario');
|
||||
}
|
||||
}
|
||||
|
||||
// @return un array asociativo con los datos de un solo usuario.
|
||||
public function get(string $column, $pattern) {
|
||||
$query = 'SELECT u.id, u.role_id AS role, u.username, u.email, u.password, u.activated, u.registration_date,' .
|
||||
'a.hash, a.expiration FROM users AS u ' .
|
||||
'LEFT JOIN authentications AS a ON u.id = a.id ' .
|
||||
'WHERE u.' . $column . ' = ? LIMIT 1';
|
||||
|
||||
try {
|
||||
$prepare = $this -> pdo -> prepare($query);
|
||||
|
||||
$prepare -> execute(array($pattern));
|
||||
|
||||
$user = $prepare -> fetch();
|
||||
|
||||
if (empty($user))
|
||||
return array();
|
||||
|
||||
$user['role'] = $this -> role($user['role']);
|
||||
|
||||
return $user;
|
||||
}
|
||||
catch (PDOException $e) {
|
||||
$this -> errors($e -> getMessage(), 'tuvimos un problema para validar si tu apodo y dirección de correo electrónico son únicos');
|
||||
}
|
||||
}
|
||||
|
||||
public function __destruct() {
|
||||
parent::__destruct();
|
||||
$this -> pdo = null;
|
||||
}
|
||||
}
|
||||
|
|