Merge pull request #10755 from owncloud/shorter_sharing_links
Shorter sharing links
This commit is contained in:
commit
c79c894dbb
10 changed files with 74 additions and 17 deletions
|
@ -13,8 +13,12 @@ if ($appConfig->getValue('core', 'shareapi_allow_links', 'yes') !== 'yes') {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Legacy sharing links via public.php have the token in $GET['t']
|
||||||
if (isset($_GET['t'])) {
|
if (isset($_GET['t'])) {
|
||||||
$token = $_GET['t'];
|
$token = $_GET['t'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($token)) {
|
||||||
$linkItem = OCP\Share::getShareByToken($token, false);
|
$linkItem = OCP\Share::getShareByToken($token, false);
|
||||||
if (is_array($linkItem) && isset($linkItem['uid_owner'])) {
|
if (is_array($linkItem) && isset($linkItem['uid_owner'])) {
|
||||||
// seems to be a valid share
|
// seems to be a valid share
|
||||||
|
|
|
@ -246,6 +246,7 @@ var OC={
|
||||||
url = '/' + url;
|
url = '/' + url;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
// TODO save somewhere whether the webserver is able to skip the index.php to have shorter links (e.g. for sharing)
|
||||||
return OC.webroot + '/index.php' + _build(url, params);
|
return OC.webroot + '/index.php' + _build(url, params);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -672,8 +672,11 @@ OC.Share={
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: use oc webroot ?
|
// TODO: use oc webroot ?
|
||||||
var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service='+service+'&t='+token;
|
if (service !== 'files') {
|
||||||
|
var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service='+service+'&t='+token;
|
||||||
|
} else {
|
||||||
|
var link = parent.location.protocol+'//'+location.host+OC.generateUrl('/s/')+token;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
$('#linkText').val(link);
|
$('#linkText').val(link);
|
||||||
$('#linkText').show('blind');
|
$('#linkText').show('blind');
|
||||||
|
|
|
@ -151,7 +151,7 @@ describe('OC.Share tests', function() {
|
||||||
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
||||||
// this is how the OC.Share class does it...
|
// this is how the OC.Share class does it...
|
||||||
var link = parent.location.protocol + '//' + location.host +
|
var link = parent.location.protocol + '//' + location.host +
|
||||||
OC.linkTo('', 'public.php')+'?service=files&t=tehtoken';
|
OC.generateUrl('/s/') + 'tehtoken';
|
||||||
expect($('#dropdown #linkText').val()).toEqual(link);
|
expect($('#dropdown #linkText').val()).toEqual(link);
|
||||||
});
|
});
|
||||||
it('does not show populated link share when a link share exists for a different file', function() {
|
it('does not show populated link share when a link share exists for a different file', function() {
|
||||||
|
@ -243,7 +243,7 @@ describe('OC.Share tests', function() {
|
||||||
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
||||||
// this is how the OC.Share class does it...
|
// this is how the OC.Share class does it...
|
||||||
var link = parent.location.protocol + '//' + location.host +
|
var link = parent.location.protocol + '//' + location.host +
|
||||||
OC.linkTo('', 'public.php')+'?service=files&t=tehtoken';
|
OC.generateUrl('/s/') + 'tehtoken';
|
||||||
expect($('#dropdown #linkText').val()).toEqual(link);
|
expect($('#dropdown #linkText').val()).toEqual(link);
|
||||||
|
|
||||||
// nested one
|
// nested one
|
||||||
|
@ -258,7 +258,7 @@ describe('OC.Share tests', function() {
|
||||||
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
expect($('#dropdown #linkCheckbox').prop('checked')).toEqual(true);
|
||||||
// this is how the OC.Share class does it...
|
// this is how the OC.Share class does it...
|
||||||
link = parent.location.protocol + '//' + location.host +
|
link = parent.location.protocol + '//' + location.host +
|
||||||
OC.linkTo('', 'public.php')+'?service=files&t=anothertoken';
|
OC.generateUrl('/s/') + 'anothertoken';
|
||||||
expect($('#dropdown #linkText').val()).toEqual(link);
|
expect($('#dropdown #linkText').val()).toEqual(link);
|
||||||
});
|
});
|
||||||
describe('expiration date', function() {
|
describe('expiration date', function() {
|
||||||
|
|
|
@ -100,6 +100,11 @@ $this->create('core_avatar_post_cropped', '/avatar/cropped')
|
||||||
->post()
|
->post()
|
||||||
->action('OC\Core\Avatar\Controller', 'postCroppedAvatar');
|
->action('OC\Core\Avatar\Controller', 'postCroppedAvatar');
|
||||||
|
|
||||||
|
// Sharing routes
|
||||||
|
$this->create('core_share_show_share', '/s/{token}')
|
||||||
|
->get()
|
||||||
|
->action('OC\Core\Share\Controller', 'showShare');
|
||||||
|
|
||||||
// used for heartbeat
|
// used for heartbeat
|
||||||
$this->create('heartbeat', '/heartbeat')->action(function(){
|
$this->create('heartbeat', '/heartbeat')->action(function(){
|
||||||
// do nothing
|
// do nothing
|
||||||
|
|
23
core/share/controller.php
Normal file
23
core/share/controller.php
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2014 Christopher Schäpers <christopher@schaepers.it>
|
||||||
|
* This file is licensed under the Affero General Public License version 3 or
|
||||||
|
* later.
|
||||||
|
* See the COPYING-README file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace OC\Core\Share;
|
||||||
|
|
||||||
|
class Controller {
|
||||||
|
public static function showShare($args) {
|
||||||
|
\OC_Util::checkAppEnabled('files_sharing');
|
||||||
|
|
||||||
|
$token = $args['token'];
|
||||||
|
|
||||||
|
\OC_App::loadApp('files_sharing');
|
||||||
|
\OC_User::setIncognitoMode(true);
|
||||||
|
|
||||||
|
require_once \OC_App::getAppPath('files_sharing') .'/public.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
|
@ -129,12 +129,12 @@ class OC_Helper {
|
||||||
* Returns a absolute url to the given service.
|
* Returns a absolute url to the given service.
|
||||||
*/
|
*/
|
||||||
public static function linkToPublic($service, $add_slash = false) {
|
public static function linkToPublic($service, $add_slash = false) {
|
||||||
return OC::$server->getURLGenerator()->getAbsoluteURL(
|
if ($service === 'files') {
|
||||||
self::linkTo(
|
$url = OC::$server->getURLGenerator()->getAbsoluteURL('/s');
|
||||||
'', 'public.php') . '?service=' . $service
|
} else {
|
||||||
. (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : ''
|
$url = OC::$server->getURLGenerator()->getAbsoluteURL(self::linkTo('', 'public.php').'?service='.$service);
|
||||||
)
|
}
|
||||||
);
|
return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -34,7 +34,7 @@ class Constants {
|
||||||
const FORMAT_STATUSES = -2;
|
const FORMAT_STATUSES = -2;
|
||||||
const FORMAT_SOURCES = -3; // ToDo Check if it is still in use otherwise remove it
|
const FORMAT_SOURCES = -3; // ToDo Check if it is still in use otherwise remove it
|
||||||
|
|
||||||
const TOKEN_LENGTH = 32; // see db_structure.xml
|
const TOKEN_LENGTH = 15; // old (oc7) length is 32, keep token length in db at least that for compatibility
|
||||||
|
|
||||||
protected static $shareTypeUserAndGroups = -1;
|
protected static $shareTypeUserAndGroups = -1;
|
||||||
protected static $shareTypeGroupUserUnique = 2;
|
protected static $shareTypeGroupUserUnique = 2;
|
||||||
|
|
|
@ -640,7 +640,10 @@ class Share extends \OC\Share\Constants {
|
||||||
if (isset($oldToken)) {
|
if (isset($oldToken)) {
|
||||||
$token = $oldToken;
|
$token = $oldToken;
|
||||||
} else {
|
} else {
|
||||||
$token = \OC_Util::generateRandomBytes(self::TOKEN_LENGTH);
|
$token = \OC::$server->getSecureRandom()->getMediumStrengthGenerator()->generate(self::TOKEN_LENGTH,
|
||||||
|
\OCP\Security\ISecureRandom::CHAR_LOWER.\OCP\Security\ISecureRandom::CHAR_UPPER.
|
||||||
|
\OCP\Security\ISecureRandom::CHAR_DIGITS
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$result = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions,
|
$result = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions,
|
||||||
null, $token, $itemSourceName, $expirationDate);
|
null, $token, $itemSourceName, $expirationDate);
|
||||||
|
|
|
@ -443,15 +443,33 @@ class Test_Helper extends PHPUnit_Framework_TestCase {
|
||||||
public function testLinkToPublic() {
|
public function testLinkToPublic() {
|
||||||
\OC::$WEBROOT = '';
|
\OC::$WEBROOT = '';
|
||||||
$result = \OC_Helper::linkToPublic('files');
|
$result = \OC_Helper::linkToPublic('files');
|
||||||
$this->assertEquals('http://localhost/public.php?service=files', $result);
|
$this->assertEquals('http://localhost/s', $result);
|
||||||
$result = \OC_Helper::linkToPublic('files', false);
|
$result = \OC_Helper::linkToPublic('files', false);
|
||||||
$this->assertEquals('http://localhost/public.php?service=files', $result);
|
$this->assertEquals('http://localhost/s', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('files', true);
|
||||||
|
$this->assertEquals('http://localhost/s/', $result);
|
||||||
|
|
||||||
|
$result = \OC_Helper::linkToPublic('other');
|
||||||
|
$this->assertEquals('http://localhost/public.php?service=other', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('other', false);
|
||||||
|
$this->assertEquals('http://localhost/public.php?service=other', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('other', true);
|
||||||
|
$this->assertEquals('http://localhost/public.php?service=other/', $result);
|
||||||
|
|
||||||
\OC::$WEBROOT = '/owncloud';
|
\OC::$WEBROOT = '/owncloud';
|
||||||
$result = \OC_Helper::linkToPublic('files');
|
$result = \OC_Helper::linkToPublic('files');
|
||||||
$this->assertEquals('http://localhost/owncloud/public.php?service=files', $result);
|
$this->assertEquals('http://localhost/owncloud/s', $result);
|
||||||
$result = \OC_Helper::linkToPublic('files', false);
|
$result = \OC_Helper::linkToPublic('files', false);
|
||||||
$this->assertEquals('http://localhost/owncloud/public.php?service=files', $result);
|
$this->assertEquals('http://localhost/owncloud/s', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('files', true);
|
||||||
|
$this->assertEquals('http://localhost/owncloud/s/', $result);
|
||||||
|
|
||||||
|
$result = \OC_Helper::linkToPublic('other');
|
||||||
|
$this->assertEquals('http://localhost/owncloud/public.php?service=other', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('other', false);
|
||||||
|
$this->assertEquals('http://localhost/owncloud/public.php?service=other', $result);
|
||||||
|
$result = \OC_Helper::linkToPublic('other', true);
|
||||||
|
$this->assertEquals('http://localhost/owncloud/public.php?service=other/', $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue