2015-08-17 21:40:03 +03:00
< ? php
/**
2016-07-21 17:49:16 +03:00
* @ copyright Copyright ( c ) 2016 , ownCloud , Inc .
*
2019-12-03 21:57:53 +03:00
* @ author Morris Jobke < hey @ morrisjobke . de >
* @ author Roeland Jago Douma < roeland @ famdouma . nl >
2015-08-17 21:40:03 +03:00
* @ author Victor Dubiniuk < dubiniuk @ owncloud . com >
*
* @ license AGPL - 3.0
*
* This code is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License , version 3 ,
* as published by the Free Software Foundation .
*
* 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 , version 3 ,
2019-12-03 21:57:53 +03:00
* along with this program . If not , see < http :// www . gnu . org / licenses />
2015-08-17 21:40:03 +03:00
*
*/
namespace OCA\Files_Versions ;
2019-11-22 22:52:10 +03:00
use OCP\AppFramework\Utility\ITimeFactory ;
use OCP\IConfig ;
2015-08-17 21:40:03 +03:00
class Expiration {
// how long do we keep files a version if no other value is defined in the config file (unit: days)
2020-04-10 17:54:27 +03:00
public const NO_OBLIGATION = - 1 ;
2015-08-17 21:40:03 +03:00
/** @var ITimeFactory */
private $timeFactory ;
/** @var string */
private $retentionObligation ;
/** @var int */
private $minAge ;
/** @var int */
private $maxAge ;
/** @var bool */
private $canPurgeToSaveSpace ;
2020-04-09 14:53:40 +03:00
public function __construct ( IConfig $config , ITimeFactory $timeFactory ) {
2015-08-17 21:40:03 +03:00
$this -> timeFactory = $timeFactory ;
$this -> retentionObligation = $config -> getSystemValue ( 'versions_retention_obligation' , 'auto' );
if ( $this -> retentionObligation !== 'disabled' ) {
$this -> parseRetentionObligation ();
}
}
/**
* Is versions expiration enabled
* @ return bool
*/
2020-04-09 14:53:40 +03:00
public function isEnabled () {
2015-08-17 21:40:03 +03:00
return $this -> retentionObligation !== 'disabled' ;
}
/**
* Is default expiration active
*/
2020-04-09 14:53:40 +03:00
public function shouldAutoExpire () {
2015-08-17 21:40:03 +03:00
return $this -> minAge === self :: NO_OBLIGATION
|| $this -> maxAge === self :: NO_OBLIGATION ;
}
/**
* Check if given timestamp in expiration range
* @ param int $timestamp
* @ param bool $quotaExceeded
* @ return bool
*/
2020-04-09 14:53:40 +03:00
public function isExpired ( $timestamp , $quotaExceeded = false ) {
2015-08-17 21:40:03 +03:00
// No expiration if disabled
if ( ! $this -> isEnabled ()) {
return false ;
}
// Purge to save space (if allowed)
if ( $quotaExceeded && $this -> canPurgeToSaveSpace ) {
return true ;
}
$time = $this -> timeFactory -> getTime ();
// Never expire dates in future e.g. misconfiguration or negative time
// adjustment
if ( $time < $timestamp ) {
return false ;
}
// Purge as too old
if ( $this -> maxAge !== self :: NO_OBLIGATION ) {
$maxTimestamp = $time - ( $this -> maxAge * 86400 );
$isOlderThanMax = $timestamp < $maxTimestamp ;
} else {
$isOlderThanMax = false ;
}
if ( $this -> minAge !== self :: NO_OBLIGATION ) {
// older than Min obligation and we are running out of quota?
$minTimestamp = $time - ( $this -> minAge * 86400 );
$isMinReached = ( $timestamp < $minTimestamp ) && $quotaExceeded ;
} else {
$isMinReached = false ;
}
return $isOlderThanMax || $isMinReached ;
}
2015-08-31 23:52:00 +03:00
/**
* Get maximal retention obligation as a timestamp
* @ return int
*/
2020-04-09 14:53:40 +03:00
public function getMaxAgeAsTimestamp () {
2015-08-31 23:52:00 +03:00
$maxAge = false ;
if ( $this -> isEnabled () && $this -> maxAge !== self :: NO_OBLIGATION ) {
$time = $this -> timeFactory -> getTime ();
$maxAge = $time - ( $this -> maxAge * 86400 );
}
return $maxAge ;
}
2015-09-11 18:17:24 +03:00
/**
2020-04-09 17:09:23 +03:00
* Read versions_retention_obligation , validate it
2020-04-08 23:24:54 +03:00
* and set private members accordingly
*/
2020-04-09 14:53:40 +03:00
private function parseRetentionObligation () {
2015-08-17 21:40:03 +03:00
$splitValues = explode ( ',' , $this -> retentionObligation );
if ( ! isset ( $splitValues [ 0 ])) {
2015-08-20 18:32:41 +03:00
$minValue = 'auto' ;
2015-08-17 21:40:03 +03:00
} else {
$minValue = trim ( $splitValues [ 0 ]);
}
2015-08-20 18:32:41 +03:00
if ( ! isset ( $splitValues [ 1 ])) {
2015-10-05 20:52:25 +03:00
$maxValue = 'auto' ;
2015-08-17 21:40:03 +03:00
} else {
$maxValue = trim ( $splitValues [ 1 ]);
}
2015-08-20 18:32:41 +03:00
$isValid = true ;
// Validate
if ( ! ctype_digit ( $minValue ) && $minValue !== 'auto' ) {
$isValid = false ;
\OC :: $server -> getLogger () -> warning (
$minValue . ' is not a valid value for minimal versions retention obligation. Check versions_retention_obligation in your config.php. Falling back to auto.' ,
[ 'app' => 'files_versions' ]
);
}
if ( ! ctype_digit ( $maxValue ) && $maxValue !== 'auto' ) {
$isValid = false ;
\OC :: $server -> getLogger () -> warning (
$maxValue . ' is not a valid value for maximal versions retention obligation. Check versions_retention_obligation in your config.php. Falling back to auto.' ,
[ 'app' => 'files_versions' ]
);
}
2020-04-10 15:19:56 +03:00
if ( ! $isValid ) {
2015-08-20 18:32:41 +03:00
$minValue = 'auto' ;
$maxValue = 'auto' ;
}
2015-08-17 21:40:03 +03:00
if ( $minValue === 'auto' && $maxValue === 'auto' ) {
2015-08-20 18:32:41 +03:00
// Default: Delete anytime if space needed
$this -> minAge = self :: NO_OBLIGATION ;
2015-08-17 21:40:03 +03:00
$this -> maxAge = self :: NO_OBLIGATION ;
$this -> canPurgeToSaveSpace = true ;
} elseif ( $minValue !== 'auto' && $maxValue === 'auto' ) {
// Keep for X days but delete anytime if space needed
2018-01-26 01:06:53 +03:00
$this -> minAge = ( int ) $minValue ;
2015-08-17 21:40:03 +03:00
$this -> maxAge = self :: NO_OBLIGATION ;
$this -> canPurgeToSaveSpace = true ;
} elseif ( $minValue === 'auto' && $maxValue !== 'auto' ) {
// Delete anytime if space needed, Delete all older than max automatically
$this -> minAge = self :: NO_OBLIGATION ;
2018-01-26 01:06:53 +03:00
$this -> maxAge = ( int ) $maxValue ;
2015-08-17 21:40:03 +03:00
$this -> canPurgeToSaveSpace = true ;
} elseif ( $minValue !== 'auto' && $maxValue !== 'auto' ) {
// Delete all older than max OR older than min if space needed
// Max < Min as per https://github.com/owncloud/core/issues/16301
if ( $maxValue < $minValue ) {
$maxValue = $minValue ;
}
2018-01-26 01:06:53 +03:00
$this -> minAge = ( int ) $minValue ;
$this -> maxAge = ( int ) $maxValue ;
2015-08-17 21:40:03 +03:00
$this -> canPurgeToSaveSpace = false ;
}
}
}