summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/private/share/helper.php60
-rw-r--r--lib/private/share/share.php9
-rw-r--r--tests/lib/share/helper.php80
3 files changed, 75 insertions, 74 deletions
diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php
index d88c4bcbfc2..5081a517db7 100644
--- a/lib/private/share/helper.php
+++ b/lib/private/share/helper.php
@@ -218,33 +218,25 @@ class Helper extends \OC\Share\Constants {
}
/**
- * Extracts the necessary remote name from a given link
+ * Strips away a potential file names and trailing slashes:
+ * - http://localhost
+ * - http://localhost/
+ * - http://localhost/index.php
+ * - http://localhost/index.php/s/{shareToken}
*
- * Strips away a potential file name, to allow
- * - user
- * - user@localhost
- * - user@http://localhost
- * - user@http://localhost/
- * - user@http://localhost/index.php
- * - user@http://localhost/index.php/s/{shareToken}
+ * all return: http://localhost
*
* @param string $shareWith
* @return string
*/
- public static function fixRemoteURLInShareWith($shareWith) {
- if (strpos($shareWith, '@')) {
- list($user, $remote) = explode('@', $shareWith, 2);
-
- $remote = str_replace('\\', '/', $remote);
- if ($fileNamePosition = strpos($remote, '/index.php')) {
- $remote = substr($remote, 0, $fileNamePosition);
- }
- $remote = rtrim($remote, '/');
-
- $shareWith = $user . '@' . $remote;
+ protected static function fixRemoteURL($remote) {
+ $remote = str_replace('\\', '/', $remote);
+ if ($fileNamePosition = strpos($remote, '/index.php')) {
+ $remote = substr($remote, 0, $fileNamePosition);
}
+ $remote = rtrim($remote, '/');
- return rtrim($shareWith, '/');
+ return $remote;
}
/**
@@ -255,10 +247,36 @@ class Helper extends \OC\Share\Constants {
* @throws InvalidFederatedCloudIdException
*/
public static function splitUserRemote($id) {
- $pos = strrpos($id, '@');
+ if (strpos($id, '@') === false) {
+ throw new InvalidFederatedCloudIdException('invalid Federated Cloud ID');
+ }
+
+ // Find the first character that is not allowed in user names
+ $id = str_replace('\\', '/', $id);
+ $posSlash = strpos($id, '/');
+ $posColon = strpos($id, ':');
+
+ if ($posSlash === false && $posColon === false) {
+ $invalidPos = strlen($id);
+ } else if ($posSlash === false) {
+ $invalidPos = $posColon;
+ } else if ($posColon === false) {
+ $invalidPos = $posSlash;
+ } else {
+ $invalidPos = min($posSlash, $posColon);
+ }
+
+ // Find the last @ before $invalidPos
+ $pos = $lastAtPos = 0;
+ while ($lastAtPos !== false && $lastAtPos <= $invalidPos) {
+ $pos = $lastAtPos;
+ $lastAtPos = strpos($id, '@', $pos + 1);
+ }
+
if ($pos !== false) {
$user = substr($id, 0, $pos);
$remote = substr($id, $pos + 1);
+ $remote = self::fixRemoteURL($remote);
if (!empty($user) && !empty($remote)) {
return array($user, $remote);
}
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index 3c4b6863afd..6fcb020eeb3 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -749,7 +749,8 @@ class Share extends Constants {
$token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER .
\OCP\Security\ISecureRandom::CHAR_DIGITS);
- $shareWith = Helper::fixRemoteURLInShareWith($shareWith);
+ list($user, $remote) = Helper::splitUserRemote($shareWith);
+ $shareWith = $user . '@' . $remote;
$shareId = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, $token, $itemSourceName);
$send = false;
@@ -1300,8 +1301,8 @@ class Share extends Constants {
$hookParams['deletedShares'] = $deletedShares;
\OC_Hook::emit('OCP\Share', 'post_unshare', $hookParams);
if ((int)$item['share_type'] === \OCP\Share::SHARE_TYPE_REMOTE && \OC::$server->getUserSession()->getUser()) {
- $urlParts = explode('@', $item['share_with'], 2);
- self::sendRemoteUnshare($urlParts[1], $item['id'], $item['token']);
+ list(, $remote) = Helper::splitUserRemote($item['share_with']);
+ self::sendRemoteUnshare($remote, $item['id'], $item['token']);
}
}
@@ -2430,7 +2431,7 @@ class Share extends Constants {
list($user, $remote) = Helper::splitUserRemote($shareWith);
if ($user && $remote) {
- $url = rtrim($remote, '/') . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
+ $url = $remote . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
$local = \OC::$server->getURLGenerator()->getAbsoluteURL('/');
diff --git a/tests/lib/share/helper.php b/tests/lib/share/helper.php
index 0dfb85856c2..c91d0bdde30 100644
--- a/tests/lib/share/helper.php
+++ b/tests/lib/share/helper.php
@@ -50,44 +50,31 @@ class Test_Share_Helper extends \Test\TestCase {
$this->assertSame($expected, $result);
}
- public function fixRemoteURLInShareWithData() {
- $userPrefix = ['test@', 'na/me@'];
+ public function dataTestSplitUserRemote() {
+ $userPrefix = ['user@name', 'username'];
$protocols = ['', 'http://', 'https://'];
$remotes = [
'localhost',
- 'test:foobar@localhost',
'local.host',
'dev.local.host',
'dev.local.host/path',
+ 'dev.local.host/at@inpath',
'127.0.0.1',
'::1',
'::192.0.2.128',
+ '::192.0.2.128/at@inpath',
];
- $testCases = [
- ['test', 'test'],
- ['na/me', 'na/me'],
- ['na/me/', 'na/me'],
- ['na/index.php', 'na/index.php'],
- ['http://localhost', 'http://localhost'],
- ['http://localhost/', 'http://localhost'],
- ['http://localhost/index.php', 'http://localhost/index.php'],
- ['http://localhost/index.php/s/token', 'http://localhost/index.php/s/token'],
- ['http://test:foobar@localhost', 'http://test:foobar@localhost'],
- ['http://test:foobar@localhost/', 'http://test:foobar@localhost'],
- ['http://test:foobar@localhost/index.php', 'http://test:foobar@localhost'],
- ['http://test:foobar@localhost/index.php/s/token', 'http://test:foobar@localhost'],
- ];
-
+ $testCases = [];
foreach ($userPrefix as $user) {
foreach ($remotes as $remote) {
foreach ($protocols as $protocol) {
- $baseUrl = $user . $protocol . $remote;
+ $baseUrl = $user . '@' . $protocol . $remote;
- $testCases[] = [$baseUrl, $baseUrl];
- $testCases[] = [$baseUrl . '/', $baseUrl];
- $testCases[] = [$baseUrl . '/index.php', $baseUrl];
- $testCases[] = [$baseUrl . '/index.php/s/token', $baseUrl];
+ $testCases[] = [$baseUrl, $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/', $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/index.php', $user, $protocol . $remote];
+ $testCases[] = [$baseUrl . '/index.php/s/token', $user, $protocol . $remote];
}
}
}
@@ -95,29 +82,33 @@ class Test_Share_Helper extends \Test\TestCase {
}
/**
- * @dataProvider fixRemoteURLInShareWithData
- */
- public function testFixRemoteURLInShareWith($remote, $expected) {
- $this->assertSame($expected, \OC\Share\Helper::fixRemoteURLInShareWith($remote));
- }
-
- /**
- * @dataProvider dataTestSplitUserRemoteSuccess
+ * @dataProvider dataTestSplitUserRemote
*
- * @param string $id
+ * @param string $remote
* @param string $expectedUser
- * @param string $expectedRemote
+ * @param string $expectedUrl
*/
- public function testSplitUserRemoteSuccess($id, $expectedUser, $expectedRemote) {
- list($user, $remote) = \OC\Share\Helper::splitUserRemote($id);
- $this->assertSame($expectedUser, $user);
- $this->assertSame($expectedRemote, $remote);
+ public function testSplitUserRemote($remote, $expectedUser, $expectedUrl) {
+ list($remoteUser, $remoteUrl) = \OC\Share\Helper::splitUserRemote($remote);
+ $this->assertSame($expectedUser, $remoteUser);
+ $this->assertSame($expectedUrl, $remoteUrl);
}
- public function dataTestSplitUserRemoteSuccess() {
+ public function dataTestSplitUserRemoteError() {
return array(
- array('user@server', 'user', 'server'),
- array('user@name@server', 'user@name', 'server')
+ // Invalid path
+ array('user@'),
+
+ // Invalid user
+ array('@server'),
+ array('us/er@server'),
+ array('us:er@server'),
+
+ // Invalid splitting
+ array('user'),
+ array(''),
+ array('us/erserver'),
+ array('us:erserver'),
);
}
@@ -130,13 +121,4 @@ class Test_Share_Helper extends \Test\TestCase {
public function testSplitUserRemoteError($id) {
\OC\Share\Helper::splitUserRemote($id);
}
-
- public function dataTestSplitUserRemoteError() {
- return array(
- array('user@'),
- array('@server'),
- array('user'),
- array(''),
- );
- }
}
ble decriptar este archivo, posiblemente sea un archivo compartido. Por favor solicita al dueño del archivo que lo vuelva a compartir contigo.", "Can not read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es posible leer este archivo, posiblemente sea un archivo compartido. Por favor solicita al dueño que vuelva a compartirlo contigo.", "Hey there,\n\nthe admin enabled server-side-encryption. Your files were encrypted using the password '%s'.\n\nPlease login to the web interface, go to the section 'basic encryption module' of your personal settings and update your encryption password by entering this password into the 'old log-in password' field and your current login-password.\n\n" : "Hola,\n\nel administrador ha habilitado la encripción de lado del servidor. Tus archivos fueron encriptados usando la contraseña '%s'\n\nPor favor inicia sesión en la interface web, ve a la sección \"módulo de encripción básica\" de tus configuraciones personales y actualiza su contraseña de encripción ingresando esta contraseña en el campo 'contraseña de inicio de sesión anterior' y tu contraseña de inicio de sesión actual. \n", "The share will expire on %s." : "El elemento compartido expirará el %s.", "Cheers!" : "¡Saludos!", "Hey there,<br><br>the admin enabled server-side-encryption. Your files were encrypted using the password <strong>%s</strong>.<br><br>Please login to the web interface, go to the section \"basic encryption module\" of your personal settings and update your encryption password by entering this password into the \"old log-in password\" field and your current login-password.<br><br>" : "Hola, <br><br>el administrador ha habilitado la encripción del lado del servidor. Tus archivos fueron encriptados usando la contraseña <strong>%s</strong>.<br><br> Por favor inicia sesisón en la interface web, ve a la sección \"módulo de encripción básica\" de tus configuraciones personales y actualiza tu contraseña de encripción ingresando esta contraseña en el campo \"contraseña de inicio de sesión anterior\" y tu contraseña de inicio de sesión actual. <br><br>", "Default encryption module" : "Módulo de encripción predeterminado", "Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción esta habilitada pero tus llaves no han sido inicializadas, por favor sal y vuelve a entrar a tu sesión", "Encrypt the home storage" : "Encriptar el almacenamiento de inicio", "Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Habilitar esta opción encripta todos los archivos almacenados en el almacenamiento principal, de otro modo, sólo los archivos en el almacenamiento externo serán encriptados", "Enable recovery key" : "Habilitar llave de recuperación", "Disable recovery key" : "Deshabilitar llave de recuperación", "The recovery key is an extra encryption key that is used to encrypt files. It allows recovery of a user's files if the user forgets his or her password." : "La llave de recuperación es una llave de encripción que se usa para encriptar archivos. Permite la recuperación de los archivos del usuario si este olvida su contraseña. ", "Recovery key password" : "Contraseña de llave de recuperación", "Repeat recovery key password" : "Repetir la contraseña de la llave de recuperación", "Change recovery key password:" : "Cambiar la contraseña de la llave de recuperación:", "Old recovery key password" : "Anterior contraseña de llave de recuperación", "New recovery key password" : "Nueva contraseña de llave de recuperación", "Repeat new recovery key password" : "Reingresar la nueva contraseña de llave de recuperación", "Change Password" : "Cambiar contraseña", "Basic encryption module" : "Módulo de encripción básica", "Your private key password no longer matches your log-in password." : "Tu contraseña de llave privada ya no corresónde con tu contraseña de inicio de sesión. ", "Set your old private key password to your current log-in password:" : "Establece tu contraseña de llave privada a tu contraseña actual de inicio de seisón:", " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerdas tu contraseña anterior le puedes pedir a tu administrador que recupere tus archivos.", "Old log-in password" : "Contraseña anterior", "Current log-in password" : "Contraseña actual", "Update Private Key Password" : "Actualizar Contraseña de Llave Privada", "Enable password recovery:" : "Habilitar la recuperación de contraseña:", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Habilitar esta opción te permitirá volver a tener acceso a tus archivos encriptados en caso de que pierdas la contraseña", "Enabled" : "Habilitado", "Disabled" : "Deshabilitado", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encripción está habilitada pero tus llaves no han sido establecidas, por favor cierra la sesión y vuelve a iniciarla." },"pluralForm" :"nplurals=2; plural=(n != 1);" }