Skip to content

Commit f70d253

Browse files
committed
password protected file support
1 parent 0a706a1 commit f70d253

File tree

3 files changed

+30
-19
lines changed

3 files changed

+30
-19
lines changed

Django Files/API/Files.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -262,12 +262,17 @@ extension DFAPI {
262262
return nil
263263
}
264264

265-
public func getFileDetails(fileID: Int, selectedServer: DjangoFilesSession? = nil) async -> DFFile? {
265+
public func getFileDetails(fileID: Int, password: String? = nil, selectedServer: DjangoFilesSession? = nil) async -> DFFile? {
266266
do {
267+
var parameters: [String: String] = [:]
268+
if let password = password {
269+
parameters["password"] = password
270+
}
271+
267272
let responseBody = try await makeAPIRequest(
268273
body: Data(),
269274
path: getAPIPath(.file) + "\(fileID)",
270-
parameters: [:],
275+
parameters: parameters,
271276
method: .get,
272277
selectedServer: selectedServer
273278
)

Django Files/Django_FilesApp.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class PreviewStateManager: ObservableObject {
1515
@Published var deepLinkFile: DFFile?
1616
@Published var showingDeepLinkPreview = false
1717
@Published var deepLinkTargetFileID: Int? = nil
18+
@Published var deepLinkFilePassword: String? = nil
1819
}
1920

2021
class AppDelegate: NSObject, UIApplicationDelegate {

Django Files/Utils/DeepLinks.swift

Lines changed: 22 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class DeepLinks {
2020
print("Invalid deep link URL")
2121
return
2222
}
23-
23+
2424
switch components.host {
2525
case "authorize":
2626
deepLinkAuth(components, context: context, sessionManager: sessionManager, hasExistingSessions: hasExistingSessions, showingServerConfirmation: showingServerConfirmation, pendingAuthURL: pendingAuthURL, pendingAuthSignature: pendingAuthSignature)
@@ -38,7 +38,7 @@ class DeepLinks {
3838

3939
private func handlePreviewLink(_ components: URLComponents, context: ModelContext, sessionManager: SessionManager, previewStateManager: PreviewStateManager, selectedTab: Binding<TabViewWindow.Tab>) {
4040
print("🔍 Handling preview deep link with components: \(components)")
41-
41+
4242
guard let urlString = components.queryItems?.first(where: { $0.name == "url" })?.value?.removingPercentEncoding,
4343
let serverURL = URL(string: urlString),
4444
let fileIDString = components.queryItems?.first(where: { $0.name == "file_id" })?.value,
@@ -47,11 +47,13 @@ class DeepLinks {
4747
print("❌ Invalid preview deep link parameters")
4848
return
4949
}
50-
51-
print("📡 Parsed deep link - Server: \(serverURL), FileID: \(fileID), FileName: \(fileName)")
52-
50+
51+
let filePassword = components.queryItems?.first(where: { $0.name == "file_password" })?.value?.removingPercentEncoding
52+
53+
print("📡 Parsed deep link - Server: \(serverURL), FileID: \(fileID), FileName: \(fileName), HasPassword: \(filePassword != nil)")
54+
5355
let descriptor = FetchDescriptor<DjangoFilesSession>()
54-
56+
5557
Task {
5658
do {
5759
let existingSessions = try context.fetch(descriptor)
@@ -66,24 +68,26 @@ class DeepLinks {
6668
}
6769
return
6870
}
69-
71+
7072
let api = DFAPI(url: serverURL, token: session.token)
7173

72-
if let fileDetails = await api.getFileDetails(fileID: fileID) {
74+
if let fileDetails = await api.getFileDetails(fileID: fileID, password: filePassword) {
7375
if fileDetails.user != session.userID {
7476
print("❌ File does not belong to current user")
7577
await MainActor.run {
7678
selectedTab.wrappedValue = .files
7779
previewStateManager.deepLinkFile = fileDetails
7880
previewStateManager.showingDeepLinkPreview = true
81+
previewStateManager.deepLinkFilePassword = filePassword
7982
}
8083
return
8184
}
82-
85+
8386
await MainActor.run {
8487
sessionManager.selectedSession = session
8588
selectedTab.wrappedValue = .files
8689
previewStateManager.deepLinkTargetFileID = fileID
90+
previewStateManager.deepLinkFilePassword = filePassword
8791
}
8892
} else {
8993
print("❌ Failed to fetch file details")
@@ -93,18 +97,19 @@ class DeepLinks {
9397
}
9498
} else {
9599
print("🔑 Preview link for unknown server: \(serverURL.absoluteString)")
96-
100+
97101
let api = DFAPI(url: serverURL, token: "")
98102
print("🌐 Created API instance for server: \(serverURL)")
99-
103+
100104
print("📥 Attempting to fetch file details for ID: \(fileID)")
101-
if let fileDetails = await api.getFileDetails(fileID: fileID) {
105+
if let fileDetails = await api.getFileDetails(fileID: fileID, password: filePassword) {
102106
print("✅ Successfully fetched file details: \(fileDetails.name)")
103107
await MainActor.run {
104108
print("🎯 Setting up preview view")
105109
selectedTab.wrappedValue = .files
106110
previewStateManager.deepLinkFile = fileDetails
107111
previewStateManager.showingDeepLinkPreview = true
112+
previewStateManager.deepLinkFilePassword = filePassword
108113
print("🎯 Preview view setup complete")
109114
}
110115
} else {
@@ -129,9 +134,9 @@ class DeepLinks {
129134
print("Invalid server URL in filelist deep link")
130135
return
131136
}
132-
137+
133138
let descriptor = FetchDescriptor<DjangoFilesSession>()
134-
139+
135140
Task {
136141
do {
137142
let existingSessions = try context.fetch(descriptor)
@@ -157,7 +162,7 @@ class DeepLinks {
157162
}
158163

159164
let descriptor = FetchDescriptor<DjangoFilesSession>()
160-
165+
161166
Task {
162167
do {
163168
let existingSessions = try context.fetch(descriptor)
@@ -180,7 +185,7 @@ class DeepLinks {
180185
}
181186
}
182187
}
183-
188+
184189
@MainActor func handleServerConfirmation(confirmed: Bool, setAsDefault: Bool, pendingAuthURL: Binding<URL?>, pendingAuthSignature: Binding<String?>, context: ModelContext, sessionManager: SessionManager, hasExistingSessions: Binding<Bool>, selectedTab: Binding<TabViewWindow.Tab>) async {
185190
guard let serverURL = pendingAuthURL.wrappedValue,
186191
let signature = pendingAuthSignature.wrappedValue else {
@@ -220,7 +225,7 @@ class DeepLinks {
220225
ToastManager.shared.showToast(message: "Problem signing into server \(error)")
221226
print("Error creating new session: \(error)")
222227
}
223-
228+
224229
pendingAuthURL.wrappedValue = nil
225230
pendingAuthSignature.wrappedValue = nil
226231
}

0 commit comments

Comments
 (0)