[Revisión] 2022-01-20

This commit is contained in:
Ricardo García Jiménez 2022-01-20 02:58:26 -06:00
parent 3c35d1c52b
commit ef49dd4594
130 changed files with 2477 additions and 2246 deletions

3
.gitignore vendored
View File

@ -1,4 +1,3 @@
database-config.json
email-config.json
config/
logs/
storage/

View File

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

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

View File

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

0
assets/icons/articles-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 435 B

After

Width:  |  Height:  |  Size: 435 B

0
assets/icons/buho-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

0
assets/icons/burger-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 914 B

After

Width:  |  Height:  |  Size: 914 B

0
assets/icons/close-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

0
assets/icons/comment-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

0
assets/icons/heart-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

0
assets/icons/login-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 630 B

After

Width:  |  Height:  |  Size: 630 B

0
assets/icons/profile-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

0
assets/icons/write-icon.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

0
assets/images/buho.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

0
assets/images/nabu-logo.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 47 KiB

0
assets/images/paper-plane.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 915 B

After

Width:  |  Height:  |  Size: 915 B

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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/>.
*/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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/>.
*/

View File

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

View File

@ -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/>.
*/

View File

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

View File

@ -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/>.
*/

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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() {
//
}
}

View File

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

View File

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

View File

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

View File

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

View File

@ -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');
*/

57
core/messages.php Normal file
View File

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

View File

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

View File

@ -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&section=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&section=delete', 'controller' => 'adminController', 'view' => 'delete_article'),
'edit-article' => array('route' => 'admin&section=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&section=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&section=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'),
);

44
core/utils.php Normal file
View File

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

View File

@ -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! &#x1F61E;, ' . $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;
}
}

88
db/connection.php Normal file
View File

@ -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! &#x1F61E;, ' . $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;
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

4
libs/php-smtp-2.0.4/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/.idea/
/vendor/
composer.lock

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Some files were not shown because too many files have changed in this diff Show More