summaryrefslogtreecommitdiffstats
path: root/lib/public/AppFramework/AuthPublicShareController.php
blob: 0ee8e7a75705d49c887a98c764bcd017613a2cab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
<?php
/**
 * @copyright 2018, Roeland Jago Douma <roeland@famdouma.nl>
 *
 * @author Joas Schilling <coding@schilljs.com>
 * @author Roeland Jago Douma <roeland@famdouma.nl>
 * @author Tim Obert <tobert@w-commerce.de>
 * @author TimObert <tobert@w-commerce.de>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * 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 (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 */
declare(strict_types=1);

namespace OCP\AppFramework;

use OCP\AppFramework\Http\RedirectResponse;
use OCP\AppFramework\Http\TemplateResponse;
use OCP\IRequest;
use OCP\ISession;
use OCP\IURLGenerator;

/**
 * Base controller for interactive public shares
 *
 * It will verify if the user is properly authenticated to the share. If not the
 * user will be redirected to an authentication page.
 *
 * Use this for a controller that is to be called directly by a user. So the
 * normal public share page for files/calendars etc.
 *
 * @since 14.0.0
 */
abstract class AuthPublicShareController extends PublicShareController {

	/** @var IURLGenerator */
	protected $urlGenerator;

	/**
	 * @since 14.0.0
	 */
	public function __construct(string $appName,
								IRequest $request,
								ISession $session,
								IURLGenerator $urlGenerator) {
		parent::__construct($appName, $request, $session);

		$this->urlGenerator = $urlGenerator;
	}

	/**
	 * @PublicPage
	 * @NoCSRFRequired
	 *
	 * Show the authentication page
	 * The form has to submit to the authenticate method route
	 *
	 * @since 14.0.0
	 */
	public function showAuthenticate(): TemplateResponse {
		return new TemplateResponse('core', 'publicshareauth', [], 'guest');
	}

	/**
	 * The template to show when authentication failed
	 *
	 * @since 14.0.0
	 */
	protected function showAuthFailed(): TemplateResponse {
		return new TemplateResponse('core', 'publicshareauth', ['wrongpw' => true], 'guest');
	}

	/**
	 * Verify the password
	 *
	 * @since 14.0.0
	 */
	abstract protected function verifyPassword(string $password): bool;

	/**
	 * Function called after failed authentication
	 *
	 * You can use this to do some logging for example
	 *
	 * @since 14.0.0
	 */
	protected function authFailed() {
	}

	/**
	 * Function called after successfull authentication
	 *
	 * You can use this to do some logging for example
	 *
	 * @since 14.0.0
	 */
	protected function authSucceeded() {
	}

	/**
	 * @UseSession
	 * @PublicPage
	 * @BruteForceProtection(action=publicLinkAuth)
	 *
	 * Authenticate the share
	 *
	 * @since 14.0.0
	 */
	final public function authenticate(string $password = '') {
		// Already authenticated
		if ($this->isAuthenticated()) {
			return $this->getRedirect();
		}

		if (!$this->verifyPassword($password)) {
			$this->authFailed();
			$response = $this->showAuthFailed();
			$response->throttle();
			return $response;
		}

		$this->session->regenerateId(true, true);
		$response = $this->getRedirect();

		$this->session->set('public_link_authenticated_token', $this->getToken());
		$this->session->set('public_link_authenticated_password_hash', $this->getPasswordHash());

		$this->authSucceeded();

		return $response;
	}

	/**
	 * Default landing page
	 *
	 * @since 14.0.0
	 */
	abstract public function showShare(): TemplateResponse;

	/**
	 * @since 14.0.0
	 */
	final public function getAuthenticationRedirect(string $redirect): RedirectResponse {
		return new RedirectResponse(
			$this->urlGenerator->linkToRoute($this->getRoute('showAuthenticate'), ['token' => $this->getToken(), 'redirect' => $redirect])
		);
	}


	/**
	 * @since 14.0.0
	 */
	private function getRoute(string $function): string {
		$app = strtolower($this->appName);
		$class = (new \ReflectionClass($this))->getShortName();
		if (substr($class, -10) === 'Controller') {
			$class = substr($class, 0, -10);
		}
		return $app .'.'. $class .'.'. $function;
	}

	/**
	 * @since 14.0.0
	 */
	private function getRedirect(): RedirectResponse {
		//Get all the stored redirect parameters:
		$params = $this->session->get('public_link_authenticate_redirect');

		$route = $this->getRoute('showShare');

		if ($params === null) {
			$params = [
				'token' => $this->getToken(),
			];
		} else {
			$params = json_decode($params, true);
			if (isset($params['_route'])) {
				$route = $params['_route'];
				unset($params['_route']);
			}

			// If the token doesn't match the rest of the arguments can't be trusted either
			if (isset($params['token']) && $params['token'] !== $this->getToken()) {
				$params = [
					'token' => $this->getToken(),
				];
			}

			// We need a token
			if (!isset($params['token'])) {
				$params = [
					'token' => $this->getToken(),
				];
			}
		}

		return new RedirectResponse($this->urlGenerator->linkToRoute($route, $params));
	}
}
="s2">"Your email address on %s was changed by an administrator." : "Tu dirección de correo electrónico en %s fue cambiada por un adminsitrador. ", "Email address for %1$s changed on %2$s" : "La dirección de correo electrónico de %1$s ha cambiado en %2$s", "Email address changed for %s" : "La dirección de correo electrónico fue cambiada para %s", "The new email address is %s" : "La nueva dirección de correo electrónico es %s", "Your %s account was created" : "Tu cuenta %s ha sido creada", "Welcome aboard" : "Bienvenido a bordo", "Welcome aboard %s" : "Bienvenido a bordo %s", "Welcome to your %s account, you can add, protect, and share your data." : "Bienvenido a tu cuenta %s, puedes agregar, proteger y compartir tus datos.", "Your username is: %s" : "Tu Usuario es: %s", "Set your password" : "Establece tu contraseña", "Go to %s" : "Ir a %s", "Install Client" : "Instalar el cliente", "Logged in user must be a subadmin" : "El usuario firmado debe ser un subadministrador ", "Settings" : "Configuraciones ", "Personal" : "Personal", "Administration" : "Administración", "Additional settings" : "Configuraciones adicionales", "Overview" : "Generalidades", "Basic settings" : "Configuraciones básicas", "Sharing" : "Compartiendo", "Calendar" : "Calendario", "Personal info" : "Información Personal", "Mobile & desktop" : "Móvil & escritorio", "Email server" : "Servidor de correo electrónico", "Security & setup warnings" : "Advertencias de seguridad y configuración", "Background jobs" : "Trabajos en segundo plano", "Create" : "Crear", "Change" : "Cambiar", "Delete" : "Borrar", "Unlimited" : "Ilimitado", "Verifying" : "Verificando", "None" : "Ninguno", "Limit to groups" : "Limitar a grupos", "Save changes" : "Guardar cambios", "All" : "Todos", "No results" : "Sin resultados", "Update to {version}" : "Actualizar a {version}", "Remove" : "Eliminar", "Disable" : "Deshabilitar", "This app has no minimum Nextcloud version assigned. This will be an error in the future." : "Esta aplicación no cuenta con una versión mínima de Nextcloud asignada. Esto será un error en el futuro.", "This app has no maximum Nextcloud version assigned. This will be an error in the future." : "Esta aplicación no cuenta con una versión máxima de Nextcloud asignada. Esto será un error en el futuro.", "This app cannot be installed because the following dependencies are not fulfilled:" : "Esta aplicación no puede ser instalada porque las siguientes dependencias no están satisfechas:", "View in store" : "Ver en la tienda", "Visit website" : "Visita el sitio web", "Report a bug" : "Reporta un detalle", "Admin documentation" : "Documentación del administrador", "Developer documentation" : "Documentación del desarrollador", "Featured" : "Destacado", "No apps found for your version" : "No se encontraron aplicaciones para tu versión", "Enable all" : "Habilitar todo", "Allow filesystem access" : "Permitir acceso al sistema de archivos", "Rename" : "Renombrar", "Revoke" : "Revocar", "Internet Explorer" : "Internet Explorer", "Edge" : "Edge", "Firefox" : "Firefox", "Google Chrome" : "Google Chrome", "Safari" : "Safari", "Google Chrome for Android" : "Google Chrome para Android", "Sync client - {os}" : "Sync client - {os}", "This session" : "Esta sesión", "Device" : "Dispositivo", "Last activity" : "Última actividad", "Devices & sessions" : "Dispositivos y sesiones", "Web, desktop and mobile clients currently logged in to your account." : "Clientes web, de escritorio y móviles han iniciado sesión en tu cuenta. ", "Error while creating device token" : "Se presentó un error al crear la ficha en el dispositivo", "Error while deleting the token" : "Se presentó un error al borrar la ficha", "App name" : "Nombre de la aplicación", "Create new app password" : "Crear una nueva contraseña de aplicación", "Use the credentials below to configure your app or device." : "Usa las siguientes credenciales para configurar tu aplicación o dispositivo. ", "For security reasons this password will only be shown once." : "Por razones de seguridad esta contraseña sólo se mostrará una vez. ", "Username" : "Usuario", "Password" : "Contraseña", "Done" : "Terminado", "Copied!" : "¡Copiado!", "Copy" : "Copiar", "To run this you need the PHP POSIX extension. See {linkstart}PHP documentation{linkend} for more details." : "Para correr esto necesitas la extensión POSIX de PHP. Por favor ve la {linkstart}documentación de PHP{linkend} para más detalles. ", "Enable" : "Habilitar", "Server-side encryption" : "Encripción del lado del servidor", "Server-side encryption makes it possible to encrypt files which are uploaded to this server. This comes with limitations like a performance penalty, so enable this only if needed." : "La encripción del lado del servidor hace posible encriptar archivos que serán cargados a este servidor. Esto trae consigo algunas limitaciónes como penalizaciones en el desemeño, asi que habilítalo sólo si es necesario. ", "Enable server-side encryption" : "Habilitar encripción del lado del servidor", "Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Una vez que la encripción se encuentre habilitada, todos lo archivos cargados al servidor desde ese momento en tiempo, se encriptarán en el servidor. Sólo será posible deshabilitar la encripción en una fecha posterior si el modulo de encripción activo soporta esa funcionalidad y si todas las preciondiciones están satisfechas (ejem. establecer una llave de recuperación).", "Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "La encripción por sí sola no garantiza la seguridad del sistema. Por favor consulta la documentación para mayores informes de cómo funciona la aplicación de encripción y de los casos de uso soportados. ", "Be aware that encryption always increases the file size." : "Por favor considera que la encripción siempre aumenta el tamaño de los archivos. ", "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Siempre es una buena idea generar respaldos de tus datos, en caso de tener encripción asegúrate de respaldar las llaves de encripción junto con tus datos. ", "This is the final warning: Do you really want to enable encryption?" : "Esta es la advertencia final: ¿Realmente deseas habilitar la encripción?", "No encryption module loaded, please enable an encryption module in the app menu." : "No se ha cargado un módulo de encripción, por favor habilita un módulo de encripción en el menú de la aplicación. ", "Select default encryption module:" : "Selecciona el modulo de encripción predeterminado:", "Remove group" : "Eliminar grupo", "You are about to remove the group {group}. The users will NOT be deleted." : "Estás a punto de eliminar el grupo {group}. Los usuarios NO serán borrados.", "Please confirm the group removal " : "Por favor confirma la eliminación del grupo", "Current password" : "Contraseña actual", "New password" : "Nueva contraseña", "Change password" : "Cambiar contraseña", "Picture provided by original account" : "Imagen proporcionada por la cuenta original ", "Cancel" : "Cancelar", "Details" : "Detalles", "Your email address" : "Tu dirección de correo electrónico", "No email address set" : "No se ha establecido la dirección de correo electrónico", "Language" : "Idioma", "Help translate" : "Ayuda a traducir", "Your phone number" : "Su número telefónico", "Your Twitter handle" : "Tu cuenta de Twitter", "Your website" : "Tu sitio web", "Add" : "Agregar", "You do not have permissions to see the details of this user" : "No tienes los permisos para ver los detalles de este usuario", "Delete user" : "Borrar usuario", "Disable user" : "Deshabilitar usuario", "Enable user" : "Habilitar usuario", "{size} used" : "{size} usado", "New user" : "Nuevo usuario", "Display name" : "Nombre a desplegar", "Email" : "Correo electrónico", "Default language" : "Idioma predeterminado", "Group admin for" : "Administrador del grupo para", "Quota" : "Cuota", "User backend" : "Backend del usuario", "Storage location" : "Úbicación del almacenamiento", "Last login" : "Último inicio de sesión", "Default quota" : "Cuota predeterminada", "Common languages" : "Idiomas comunes", "Password change is disabled because the master key is disabled" : "El cambio de contraseña está deshabilitado porque la llave maestra está deshabilitada", "Unnamed device" : "Dispositivo sin nombre", "Your apps" : "Tus aplicaciones", "Changelog" : "Bitácora de cambios", "Add group" : "Agregar grupo", "Active users" : "Usuarios activos", "Admins" : "Administradores", "Disabled users" : "Usuarios deshabilitados", "Show last login" : "Mostrar último inicio de sesión", "Show user backend" : "Mostrar backend del usuario", "Send email to new user" : "Enviar un correo electrónico al usuario nuevo", "Not saved" : "No guardado", "Sending…" : "Enviando...", "Email sent" : "Correo electrónico enviado", "Location" : "Ubicación", "Profile picture" : "Foto de perfil", "About" : "Acerca de", "Full name" : "Nombre completo", "Phone number" : "Número de teléfono", "Twitter" : "Twitter", "Website" : "Sitio web", "Disabled apps" : "Aplicaciones deshabilitadas", "Updates" : "Actualizaciones", "App bundles" : "Paquetes de aplicación", "Hide" : "Ocultar", "Never" : "Nunca", "The app has been enabled but needs to be updated. You will be redirected to the update page in 5 seconds." : "La aplicación ha sido habilitada pero necesita ser actualizada. Serás redireccionado a la página de actualización en 5 segundos. ", "Documentation" : "Documentación", "Forum" : "Foro", "Login" : "Iniciar sesión", "SSL" : "SSL", "Open documentation" : "Abrir documentación", "It is important to set up this server to be able to send emails, like for password reset and notifications." : "Es importante preparar este servidor para poder enviar correos electrónicos, como para restablecer contraseñas y notificaciones. ", "Send mode" : "Modo de envío", "Encryption" : "Encripción", "From address" : "De la dirección", "Server address" : "Dirección del servidor", "Port" : "Puerto", "Authentication" : "Autenticación", "Authentication required" : "Autenticación requerida", "Credentials" : "Credenciales", "SMTP Username" : "Usuario SMTP", "SMTP Password" : "Contraseña SMTP", "Save" : "Guardar", "Send email" : "Enviar correo electrónico", "All checks passed." : "Pasaron todas las verificaciones. ", "Version" : "Versión", "As admin you can fine-tune the sharing behavior. Please see the documentation for more information." : "Como administrador, puedes hacer ajustes finos al comportamiento de compartir. Por favor consulta la documentación para más información. ", "Allow apps to use the Share API" : "Permitir que las aplicaciones usen el API para Compartir", "Enforce expiration date" : "Forzar fecha de expiración", "Allow public uploads" : "Permitir cargas públicas", "Always ask for a password" : "Siempre pedir una contraseña", "Enforce password protection" : "Forzar protección de contraseñas", "Set default expiration date" : "Establecer la fecha de expiración predeterminada", "Allow resharing" : "Permitir volver a compartir", "Allow sharing with groups" : "Permitir compartir con grupos", "Restrict users to only share with users in their groups" : "Limitar a los usuarios a sólo compartir con otros usuarios en sus grupos", "Exclude groups from sharing" : "Evitar que los grupos compartan", "These groups will still be able to receive shares, but not to initiate them." : "Estos grupos aún podrán recibir elementos compartidos, pero no los podrán iniciar.", "This text will be shown on the public link upload page when the file list is hidden." : "Este texto se mostrará en la página de carga de la liga pública cuando la lista de archivos esté oculta. ", "Default share permissions" : "Permisos predeterminados para compartir", "Developed by the {communityopen}Nextcloud community{linkclose}, the {githubopen}source code{linkclose} is licensed under the {licenseopen}AGPL{linkclose}." : "Desarrollado por la {communityopen}comunidad Nextcloud {linkclose}, el {githubopen}código fuente {linkclose} está licenciado bajo {licenseopen}AGPL{linkclose}.", "Like our Facebook page" : "Da un Like a nuestra página de Facebook", "Follow us on Twitter" : "Síguenos en Twitter", "Check out our blog" : "Visita nuestro blog", "Subscribe to our newsletter" : "Suscribete a nuestro boletín", "This community release of Nextcloud is unsupported and instant notifications are unavailable." : "El lanzamiento de esta versión para la comunidad de Nextcloud no cuenta con soporte y las notificaciones instantáneas no están disponibles.", "png or jpg, max. 20 MB" : "png o jpg max. 20 MB", "Plain" : "Plano", "NT LAN Manager" : "Administrador de LAN NT", "SSL/TLS" : "SSL/TLS", "STARTTLS" : "STARTTLS", "Authentication method" : "Método de autenticación" }, "nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");