|
|
|
|
@ -656,13 +656,43 @@ class Manager implements IManager {
|
|
|
|
|
$this->linkCreateChecks($share);
|
|
|
|
|
$this->setLinkParent($share);
|
|
|
|
|
|
|
|
|
|
// For now ignore a set token.
|
|
|
|
|
$share->setToken(
|
|
|
|
|
$this->secureRandom->generate(
|
|
|
|
|
\OC\Share\Constants::TOKEN_LENGTH,
|
|
|
|
|
\OCP\Security\ISecureRandom::CHAR_HUMAN_READABLE
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
// Initial token length
|
|
|
|
|
$tokenLength = \OC\Share\Helper::getTokenLength();
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
$tokenExists = false;
|
|
|
|
|
|
|
|
|
|
for ($i = 0; $i <= 2; $i++) {
|
|
|
|
|
// Generate a new token
|
|
|
|
|
$token = $this->secureRandom->generate(
|
|
|
|
|
$tokenLength,
|
|
|
|
|
\OCP\Security\ISecureRandom::CHAR_HUMAN_READABLE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Try to fetch a share with the generated token
|
|
|
|
|
$this->getShareByToken($token);
|
|
|
|
|
$tokenExists = true; // Token exists, we need to try again
|
|
|
|
|
} catch (\OCP\Share\Exceptions\ShareNotFound $e) {
|
|
|
|
|
// Token is unique, exit the loop
|
|
|
|
|
$tokenExists = false;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If we've reached the maximum attempts and the token still exists, increase the token length
|
|
|
|
|
if ($tokenExists) {
|
|
|
|
|
$tokenLength++;
|
|
|
|
|
|
|
|
|
|
// Check if the token length exceeds the maximum allowed length
|
|
|
|
|
if ($tokenLength > \OC\Share\Constants::MAX_TOKEN_LENGTH) {
|
|
|
|
|
throw new \Exception('Unable to generate a unique share token. Maximum token length exceeded.');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} while ($tokenExists);
|
|
|
|
|
|
|
|
|
|
// Set the unique token
|
|
|
|
|
$share->setToken($token);
|
|
|
|
|
|
|
|
|
|
// Verify the expiration date
|
|
|
|
|
$share = $this->validateExpirationDateLink($share);
|
|
|
|
|
|