From 68ae1bf0f685e7e3a9c546fdde73089cf00991fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 15 Sep 2026 05:34:56 +0000 Subject: [PATCH] feat: sync Nextcloud capabilities: add public link expire_date default_days Upstream apps/files_sharing/lib/Capabilities.php now exposes an additional optional field default_days within the public.expire_date capability, representing the server-suggested default expiry (which may be lower than the enforced maximum days). Add PublicLink.expireDateDefaultDays, defaulting to expireDateDays when the field is absent for backward compatibility with older servers. Compared nextcloud/server e99db582af5fa540e09947512fc75eaed811745a to fd847a4894db652a15b3312701aca3bcc8f453e7. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- Automation/capability-sync-state.json | 2 +- .../Shares/Share Type/PublicLink.swift | 4 +++ .../Shares/Share Type/PublicLinkTests.swift | 27 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Automation/capability-sync-state.json b/Automation/capability-sync-state.json index d3427e0..c2311e5 100644 --- a/Automation/capability-sync-state.json +++ b/Automation/capability-sync-state.json @@ -4,7 +4,7 @@ "schemaVersion": 1, "upstreams": { "nextcloud/server": { - "revision": "e99db582af5fa540e09947512fc75eaed811745a" + "revision": "fd847a4894db652a15b3312701aca3bcc8f453e7" } } } diff --git a/Sources/NextcloudCapabilitiesKit/Shares/Share Type/PublicLink.swift b/Sources/NextcloudCapabilitiesKit/Shares/Share Type/PublicLink.swift index c045cfc..9ff02f6 100644 --- a/Sources/NextcloudCapabilitiesKit/Shares/Share Type/PublicLink.swift +++ b/Sources/NextcloudCapabilitiesKit/Shares/Share Type/PublicLink.swift @@ -14,6 +14,7 @@ public struct PublicLink: Equatable, Sendable { public let expireDateEnabled: Bool public let expireDateEnforced: Bool public let expireDateDays: Int + public let expireDateDefaultDays: Int public let internalExpireDateEnabled: Bool public let internalExpireDateEnforced: Bool public let internalExpireDateDays: Int @@ -50,10 +51,13 @@ public struct PublicLink: Equatable, Sendable { if let expireDateCapabilities = publicLinkCaps["expire_date"] as? [String: Any] { expireDateEnabled = expireDateCapabilities["enabled"] as? Bool ?? false expireDateDays = expireDateCapabilities["days"] as? Int ?? 1 + // Servers without this field default the suggested expiry to the max allowed days. + expireDateDefaultDays = expireDateCapabilities["default_days"] as? Int ?? expireDateDays expireDateEnforced = expireDateCapabilities["enforced"] as? Bool ?? false } else { expireDateEnabled = false expireDateDays = 1 + expireDateDefaultDays = 1 expireDateEnforced = false } diff --git a/Tests/NextcloudCapabilitiesKitTests/Shares/Share Type/PublicLinkTests.swift b/Tests/NextcloudCapabilitiesKitTests/Shares/Share Type/PublicLinkTests.swift index 25c001c..40dac0c 100644 --- a/Tests/NextcloudCapabilitiesKitTests/Shares/Share Type/PublicLinkTests.swift +++ b/Tests/NextcloudCapabilitiesKitTests/Shares/Share Type/PublicLinkTests.swift @@ -21,6 +21,7 @@ final class PublicLinkTests: XCTestCase { "expire_date": [ "enabled": true, "days": 10, + "default_days": 7, "enforced": true ], "expire_date_internal": [ @@ -49,6 +50,7 @@ final class PublicLinkTests: XCTestCase { XCTAssertEqual(publicLink?.expireDateEnforced, true, "ExpireDateEnforced should be true") XCTAssertEqual(publicLink?.expireDateEnabled, true, "ExpireDateEnabled should be true") XCTAssertEqual(publicLink?.expireDateDays, 10, "ExpireDateDays should be 10") + XCTAssertEqual(publicLink?.expireDateDefaultDays, 7, "ExpireDateDefaultDays should be 7") XCTAssertEqual(publicLink?.internalExpireDateEnforced, true, "InternalExpireDateEnforced should be true") XCTAssertEqual(publicLink?.internalExpireDateEnabled, true, "InternalExpireDateEnabled should be true") XCTAssertEqual(publicLink?.internalExpireDateDays, 5, "InternalExpireDateDays should be 5") @@ -58,6 +60,30 @@ final class PublicLinkTests: XCTestCase { XCTAssertEqual(publicLink?.multipleAllowed, false, "MultipleAllowed should be false") } + func testPublicLinkInitializationWithoutDefaultDays() { + // Older servers do not send `default_days`; it should fall back to `days`. + let filesSharingCapabilities: [String: Any] = [ + "public": [ + "enabled": true, + "expire_date": [ + "enabled": true, + "days": 10, + "enforced": true + ] + ] + ] + + let publicLink = PublicLink(filesSharingCapabilities: filesSharingCapabilities) + + XCTAssertNotNil(publicLink, "PublicLink instance should not be nil") + XCTAssertEqual(publicLink?.expireDateDays, 10, "ExpireDateDays should be 10") + XCTAssertEqual( + publicLink?.expireDateDefaultDays, + 10, + "ExpireDateDefaultDays should default to ExpireDateDays when absent" + ) + } + func testInvalidPublicLinkInitialization() { let invalidFilesSharingCapabilities: [String: Any] = [ "invalid_key": [ @@ -87,6 +113,7 @@ final class PublicLinkTests: XCTestCase { XCTAssertEqual(publicLink?.passwordEnforced, false, "PasswordEnforced should default to false") XCTAssertEqual(publicLink?.expireDateEnforced, false, "ExpireDateEnforced should default to false") XCTAssertEqual(publicLink?.expireDateDays, 1, "ExpireDateDays should default to 1") + XCTAssertEqual(publicLink?.expireDateDefaultDays, 1, "ExpireDateDefaultDays should default to expireDateDays (1)") XCTAssertEqual(publicLink?.internalExpireDateEnforced, false, "InternalExpireDateEnforced should default to false") XCTAssertEqual(publicLink?.internalExpireDateDays, 1, "InternalExpireDateDays should default to 1") XCTAssertEqual(publicLink?.remoteExpireDateEnforced, false, "RemoteExpireDateEnforced should default to false")