summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/ajax/share.php2
-rw-r--r--core/js/config.php10
-rw-r--r--core/js/share.js43
-rw-r--r--lib/private/share/helper.php12
-rw-r--r--lib/private/share/share.php103
-rw-r--r--tests/lib/share/share.php77
6 files changed, 136 insertions, 111 deletions
diff --git a/core/ajax/share.php b/core/ajax/share.php
index feb64490b4e..be72e36541a 100644
--- a/core/ajax/share.php
+++ b/core/ajax/share.php
@@ -84,6 +84,8 @@ if (isset($_POST['action']) && isset($_POST['itemType']) && isset($_POST['itemSo
$date = new \DateTime($_POST['date']);
$today = new \DateTime('now');
+
+
if ($date < $today) {
OC_JSON::error(array('data' => array('message' => $l->t('Expiration date is in the past.'))));
return;
diff --git a/core/js/config.php b/core/js/config.php
index 80b1b6d242d..2f423111bda 100644
--- a/core/js/config.php
+++ b/core/js/config.php
@@ -25,11 +25,13 @@ foreach(OC_App::getEnabledApps() as $app) {
$apps_paths[$app] = OC_App::getAppWebPath($app);
}
-$defaultExpireDateEnabled = \OCP\Config::getAppValue('core', 'shareapi_default_expire_date', 'no');
+$value = \OCP\Config::getAppValue('core', 'shareapi_default_expire_date', 'no');
+$defaultExpireDateEnabled = ($value === 'yes') ? true :false;
$defaultExpireDate = $enforceDefaultExpireDate = null;
-if ($defaultExpireDateEnabled === 'yes') {
- $defaultExpireDate = \OCP\Config::getAppValue('core', 'shareapi_expire_after_n_days', '7');
- $enforceDefaultExpireDate = \OCP\Config::getAppValue('core', 'shareapi_enforce_expire_date', 'no');
+if ($defaultExpireDateEnabled) {
+ $defaultExpireDate = (int)\OCP\Config::getAppValue('core', 'shareapi_expire_after_n_days', '7');
+ $value = \OCP\Config::getAppValue('core', 'shareapi_enforce_expire_date', 'no');
+ $enforceDefaultExpireDate = ($value === 'yes') ? true : false;
}
$array = array(
diff --git a/core/js/share.js b/core/js/share.js
index 7e3b0d8c65d..dc808c295b9 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -335,8 +335,8 @@ OC.Share={
html += '<br />';
var defaultExpireMessage = '';
- if ((itemType === 'folder' || itemType === 'file') && oc_appconfig.core.defaultExpireDateEnabled === 'yes') {
- if (oc_appconfig.core.defaultExpireDateEnforced === 'yes') {
+ if ((itemType === 'folder' || itemType === 'file') && oc_appconfig.core.defaultExpireDateEnabled) {
+ if (oc_appconfig.core.defaultExpireDateEnforced) {
defaultExpireMessage = t('core', 'The public link will expire no later than {days} days after it is created', {'days': oc_appconfig.core.defaultExpireDate}) + '<br/>';
} else {
defaultExpireMessage = t('core', 'By default the public link will expire after {days} days', {'days': oc_appconfig.core.defaultExpireDate}) + '<br/>';
@@ -597,7 +597,6 @@ OC.Share={
else{
html.find('.cruds').before(showCrudsButton);
}
- $('#expiration').show();
if (!OC.Share.currentShares[shareType]) {
OC.Share.currentShares[shareType] = [];
}
@@ -647,7 +646,6 @@ OC.Share={
$('#linkPassText').attr('placeholder', '**********');
}
$('#expiration').show();
- $('#defaultExpireMessage').show();
$('#emailPrivateLink #email').show();
$('#emailPrivateLink #emailButton').show();
$('#allowPublicUploadWrapper').show();
@@ -673,6 +671,15 @@ OC.Share={
$('#expirationDate').datepicker({
dateFormat : 'dd-mm-yy'
});
+ if (oc_appconfig.core.defaultExpireDateEnforced) {
+ $('#expirationCheckbox').attr('disabled', true);
+ $.datepicker.setDefaults({
+ maxDate : new Date(date.replace(' 00:00:00', ''))
+ });
+ }
+ if(oc_appconfig.core.defaultExpireDateEnabled) {
+ $('#defaultExpireMessage').show('blind');
+ }
}
};
@@ -685,7 +692,8 @@ $(document).ready(function() {
dayNames: dayNames,
dayNamesMin: $.map(dayNames, function(v) { return v.slice(0,2); }),
dayNamesShort: $.map(dayNames, function(v) { return v.slice(0,3)+'.'; }),
- firstDay: firstDay
+ firstDay: firstDay,
+ minDate : new Date()
});
}
$(document).on('click', 'a.share', function(event) {
@@ -789,14 +797,21 @@ $(document).ready(function() {
var itemType = $('#dropdown').data('item-type');
var itemSource = $('#dropdown').data('item-source');
var itemSourceName = $('#dropdown').data('item-source-name');
- var expirationDate = '';
- if ($('#expirationCheckbox').is(':checked') === true) {
- expirationDate = $( "#expirationDate" ).val();
- }
+
if (this.checked) {
+ var expireDateString = '';
+ if (oc_appconfig.core.defaultExpireDateEnabled) {
+ var date = new Date().getTime();
+ var expireAfterMs = oc_appconfig.core.defaultExpireDate * 24 * 60 * 60 * 1000;
+ var expireDate = new Date(date + expireAfterMs);
+ var month = expireDate.getMonth() + 1;
+ var year = expireDate.getFullYear();
+ var day = expireDate.getDate();
+ expireDateString = year + "-" + month + '-' + day + ' 00:00:00';
+ }
// Create a link
if (oc_appconfig.core.enforcePasswordForPublicLink === false) {
- OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', OC.PERMISSION_READ, itemSourceName, expirationDate, function(data) {
+ OC.Share.share(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', OC.PERMISSION_READ, itemSourceName, expireDateString, function(data) {
OC.Share.showLink(data.token, null, itemSource);
$('#dropdown').trigger(new $.Event('sharesChanged', {shares: OC.Share.currentShares}));
OC.Share.updateIcon(itemType, itemSource);
@@ -805,9 +820,13 @@ $(document).ready(function() {
$('#linkPass').toggle('blind');
$('#linkPassText').focus();
}
+ if (expireDateString !== '') {
+ OC.Share.showExpirationDate(expireDateString);
+ }
} else {
// Delete private link
OC.Share.hideLink();
+ $('#expiration').hide('blind');
if ($('#linkText').val() !== '') {
OC.Share.unshare(itemType, itemSource, OC.Share.SHARE_TYPE_LINK, '', function() {
OC.Share.itemShares[OC.Share.SHARE_TYPE_LINK] = false;
@@ -917,8 +936,8 @@ $(document).ready(function() {
OC.dialogs.alert(t('core', 'Error unsetting expiration date'), t('core', 'Error'));
}
$('#expirationDate').hide('blind');
- if (oc_appconfig.core.defaultExpireDateEnforced === 'no') {
- $('#defaultExpireMessage'). show('blind');
+ if (oc_appconfig.core.defaultExpireDateEnforced === false) {
+ $('#defaultExpireMessage').show('blind');
}
});
}
diff --git a/lib/private/share/helper.php b/lib/private/share/helper.php
index c92aa15b4bf..71c6d8517a9 100644
--- a/lib/private/share/helper.php
+++ b/lib/private/share/helper.php
@@ -200,6 +200,18 @@ class Helper extends \OC\Share\Constants {
return $defaultExpireSettings;
}
+ public static function calcExpireDate() {
+ $expireAfter = \OC\Share\Share::getExpireInterval() * 24 * 60 * 60;
+ $expireAt = time() + $expireAfter;
+ $date = new \DateTime();
+ $date->setTimestamp($expireAt);
+ $date->setTime(0, 0, 0);
+ //$dateString = $date->format('Y-m-d') . ' 00:00:00';
+
+ return $date;
+
+ }
+
/**
* calculate expire date
* @param array $defaultExpireSettings contains 'defaultExpireDateSet', 'enforceExpireDate', 'expireAfterDays'
diff --git a/lib/private/share/share.php b/lib/private/share/share.php
index f02eacfed74..883fbd1b298 100644
--- a/lib/private/share/share.php
+++ b/lib/private/share/share.php
@@ -606,6 +606,7 @@ class Share extends \OC\Share\Constants {
$oldPermissions = $checkExists['permissions'];
//delete the old share
Helper::delete($checkExists['id']);
+ $updateExistingShare = true;
}
// Generate hash of password - same method as user passwords
@@ -628,6 +629,12 @@ class Share extends \OC\Share\Constants {
throw new \Exception($message_t);
}
+ if (!empty($updateExistingShare) &&
+ self::isDefaultExpireDateEnabled() &&
+ empty($expirationDate)) {
+ $expirationDate = Helper::calcExpireDate();
+ }
+
// Generate token
if (isset($oldToken)) {
$token = $oldToken;
@@ -886,28 +893,33 @@ class Share extends \OC\Share\Constants {
*/
public static function setExpirationDate($itemType, $itemSource, $date) {
$user = \OC_User::getUser();
- $items = self::getItems($itemType, $itemSource, null, null, $user, self::FORMAT_NONE, null, -1, false);
- if (!empty($items)) {
- if ($date == '') {
- $date = null;
- } else {
- $date = new \DateTime($date);
- }
- $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `id` = ?');
- $query->bindValue(1, $date, 'datetime');
- foreach ($items as $item) {
- $query->bindValue(2, (int) $item['id']);
- $query->execute();
- \OC_Hook::emit('OCP\Share', 'post_set_expiration_date', array(
- 'itemType' => $itemType,
- 'itemSource' => $itemSource,
- 'date' => $date,
- 'uidOwner' => $user
- ));
- }
- return true;
+
+ if ($date == '') {
+ $date = null;
+ } else {
+ $date = new \DateTime($date);
}
- return false;
+ $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `expiration` = ? WHERE `item_type` = ? AND `item_source` = ? AND `uid_owner` = ? AND `share_type` = ?');
+ $query->bindValue(1, $date, 'datetime');
+ $query->bindValue(2, $itemType);
+ $query->bindValue(3, $itemSource);
+ $query->bindValue(4, $user);
+ $query->bindValue(5, \OCP\Share::SHARE_TYPE_LINK);
+
+ $result = $query->execute();
+
+ if ($result === 1) {
+ \OC_Hook::emit('OCP\Share', 'post_set_expiration_date', array(
+ 'itemType' => $itemType,
+ 'itemSource' => $itemSource,
+ 'date' => $date,
+ 'uidOwner' => $user
+ ));
+ } else {
+ \OCP\Util::writeLog('sharing', "Couldn't set expire date'", \OCP\Util::ERROR);
+ }
+
+ return ($result === 1) ? true : false;
}
/**
@@ -917,29 +929,34 @@ class Share extends \OC\Share\Constants {
*/
protected static function expireItem(array $item) {
- // calculate expire date
- if (!empty($item['expiration'])) {
- $userDefinedExpire = new \DateTime($item['expiration']);
- $expires = $userDefinedExpire->getTimestamp();
- } else {
- $expires = null;
- }
+ $result = false;
// only use default expire date for link shares
- if((int)$item['share_type'] === self::SHARE_TYPE_LINK) {
+ if ((int) $item['share_type'] === self::SHARE_TYPE_LINK) {
+
+ // calculate expire date
+ if (!empty($item['expiration'])) {
+ $userDefinedExpire = new \DateTime($item['expiration']);
+ $expires = $userDefinedExpire->getTimestamp();
+ } else {
+ $expires = null;
+ }
+
+
// get default expire settings
$defaultSettings = Helper::getDefaultExpireSetting();
$expires = Helper::calculateExpireDate($defaultSettings, $item['stime'], $expires);
- }
- if (is_int($expires)) {
- $now = time();
- if ($now > $expires) {
- self::unshareItem($item);
- return true;
+
+ if (is_int($expires)) {
+ $now = time();
+ if ($now > $expires) {
+ self::unshareItem($item);
+ $result = true;
+ }
}
}
- return false;
+ return $result;
}
/**
@@ -1865,4 +1882,18 @@ class Share extends \OC\Share\Constants {
return ($value === 'yes') ? true : false;
}
+ public static function isDefaultExpireDateEnabled() {
+ $defaultExpireDateEnabled = \OCP\Config::getAppValue('core', 'shareapi_default_expire_date', 'no');
+ return ($defaultExpireDateEnabled === "yes") ? true : false;
+ }
+
+ public static function enforceDefaultExpireDate() {
+ $enforceDefaultExpireDate = \OCP\Config::getAppValue('core', 'shareapi_enforce_expire_date', 'no');
+ return ($enforceDefaultExpireDate === "yes") ? true : false;
+ }
+
+ public static function getExpireInterval() {
+ return (int)\OCP\Config::getAppValue('core', 'shareapi_expire_after_n_days', '7');
+ }
+
}
diff --git a/tests/lib/share/share.php b/tests/lib/share/share.php
index 95983ee70e6..5920b44a8e0 100644
--- a/tests/lib/share/share.php
+++ b/tests/lib/share/share.php
@@ -151,6 +151,12 @@ class Test_Share extends PHPUnit_Framework_TestCase {
);
}
+ protected function shareUserTestFileAsLink() {
+ OC_User::setUserId($this->user1);
+ $result = OCP\Share::shareItem('test', 'test.txt', OCP\Share::SHARE_TYPE_LINK, null, OCP\PERMISSION_READ);
+ $this->assertTrue(is_string($result));
+ }
+
/**
* @param string $sharer
* @param string $receiver
@@ -316,36 +322,35 @@ class Test_Share extends PHPUnit_Framework_TestCase {
}
public function testShareWithUserExpirationExpired() {
+ OC_User::setUserId($this->user1);
$this->shareUserOneTestFileWithUserTwo();
+ $this->shareUserTestFileAsLink();
- OC_User::setUserId($this->user1);
$this->assertTrue(
OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInPast),
'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
);
- OC_User::setUserId($this->user2);
- $this->assertSame(array(),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 2 no longer has access to test.txt after expiration.'
- );
+ $shares = OCP\Share::getItemsShared('test');
+ $this->assertSame(1, count($shares));
+ $share = reset($shares);
+ $this->assertSame(\OCP\Share::SHARE_TYPE_USER, $share['share_type']);
}
public function testShareWithUserExpirationValid() {
+ OC_User::setUserId($this->user1);
$this->shareUserOneTestFileWithUserTwo();
+ $this->shareUserTestFileAsLink();
+
- OC_User::setUserId($this->user1);
$this->assertTrue(
OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture),
'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
);
- OC_User::setUserId($this->user2);
- $this->assertEquals(
- array('test.txt'),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 2 still has access to test.txt after expiration date has been set.'
- );
+ $shares = OCP\Share::getItemsShared('test');
+ $this->assertSame(2, count($shares));
+
}
protected function shareUserOneTestFileWithGroupOne() {
@@ -516,52 +521,6 @@ class Test_Share extends PHPUnit_Framework_TestCase {
$this->assertEquals(array(), OCP\Share::getItemsShared('test'));
}
- public function testShareWithGroupExpirationExpired() {
- $this->shareUserOneTestFileWithGroupOne();
-
- OC_User::setUserId($this->user1);
- $this->assertTrue(
- OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInPast),
- 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
- );
-
- OC_User::setUserId($this->user2);
- $this->assertSame(array(),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 2 no longer has access to test.txt after expiration.'
- );
-
- OC_User::setUserId($this->user3);
- $this->assertSame(array(),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 3 no longer has access to test.txt after expiration.'
- );
- }
-
- public function testShareWithGroupExpirationValid() {
- $this->shareUserOneTestFileWithGroupOne();
-
- OC_User::setUserId($this->user1);
- $this->assertTrue(
- OCP\Share::setExpirationDate('test', 'test.txt', $this->dateInFuture),
- 'Failed asserting that user 1 successfully set an expiration date for the test.txt share.'
- );
-
- OC_User::setUserId($this->user2);
- $this->assertEquals(
- array('test.txt'),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 2 still has access to test.txt after expiration date has been set.'
- );
-
- OC_User::setUserId($this->user3);
- $this->assertEquals(
- array('test.txt'),
- OCP\Share::getItemSharedWith('test', 'test.txt', Test_Share_Backend::FORMAT_SOURCE),
- 'Failed asserting that user 3 still has access to test.txt after expiration date has been set.'
- );
- }
-
/**
* @param boolean|string $token
*/