Skip to content

Commit fdb11a1

Browse files
committed
Fix adding data files in crypto containers
1 parent cab5d3c commit fdb11a1

14 files changed

Lines changed: 235 additions & 79 deletions

File tree

Modules/CryptoLib/Sources/CryptoObjC/include/Decrypt.mm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ @implementation Addressee (label)
3232

3333
- (instancetype)initWithLabel:(const std::string &)label pub:(NSData*)pub concatKDFAlgorithmURI:(NSString *)concatKDFAlgorithmURI {
3434
std::map<std::string, std::string> info = libcdoc::Recipient::parseLabel(label);
35-
id cn = info.contains("cn") ? [NSString stringWithStdString:info["cn"]] : nil;
35+
id cn = info.contains("cn") ? [NSString stringWithStdString:info["cn"]] : [NSString stringWithStdString:label];
3636
id type = info.contains("type") ? [NSString stringWithStdString:info["type"]] : nil;
3737
id serial = info.contains("serial_number") ? [NSString stringWithStdString:info["serial_number"]] : nil;
3838
CertType certType = CertTypeUnknownType;

Modules/CryptoLib/Sources/CryptoSwift/CryptoContainer.swift

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,74 @@ public actor CryptoContainer: CryptoContainerProtocol, Loggable {
7575
return containerFile
7676
}
7777

78-
public func addDataFiles(_ filesToAdd: [URL]) async {
79-
dataFiles?.append(contentsOf: filesToAdd)
78+
public func addDataFiles(_ filesToAdd: [URL]) async throws {
79+
let cryptoContainersDirectory = try Directories.getCacheDirectory(
80+
subfolders: [Constants.Folder.ContainerFolder, Constants.Folder.Temp],
81+
fileManager: fileManager
82+
)
83+
84+
var movedFiles: [URL] = []
85+
var duplicateFileCount = 0
86+
var failedFileCount = 0
87+
let totalFileCount = filesToAdd.count
88+
89+
let existingDataFiles = Set(dataFiles?.compactMap { $0?.lastPathComponent } ?? [])
90+
91+
var duplicateFileName: String?
92+
93+
for fileToAdd in filesToAdd {
94+
let fileName = fileToAdd.lastPathComponent
95+
let destinationURL = cryptoContainersDirectory.appendingPathComponent(fileName)
96+
97+
if existingDataFiles.contains(fileName) ||
98+
movedFiles.contains(where: { $0.lastPathComponent == fileName }) {
99+
100+
duplicateFileCount += 1
101+
102+
if duplicateFileCount == 1 {
103+
duplicateFileName = fileName
104+
}
105+
106+
continue
107+
}
108+
109+
do {
110+
if fileManager.fileExists(atPath: destinationURL.path) {
111+
try fileManager.removeItem(at: destinationURL)
112+
}
113+
114+
try fileManager.copyItem(at: fileToAdd, to: destinationURL)
115+
movedFiles.append(destinationURL)
116+
117+
} catch {
118+
failedFileCount += 1
119+
}
120+
}
121+
122+
if dataFiles == nil {
123+
dataFiles = movedFiles
124+
} else {
125+
dataFiles?.append(contentsOf: movedFiles)
126+
}
127+
128+
if duplicateFileCount > 0 || failedFileCount > 0 {
129+
var userInfo: [String: String] = [
130+
"totalFileCount": String(totalFileCount),
131+
"failedFileCount": String(failedFileCount),
132+
"duplicateFileCount": String(duplicateFileCount)
133+
]
134+
135+
if duplicateFileCount == 1, let name = duplicateFileName {
136+
userInfo["fileName"] = name
137+
}
138+
139+
throw CryptoError.addingFilesToContainerFailed(
140+
CryptoErrorDetail(
141+
message: "Unable to add files to container",
142+
userInfo: userInfo
143+
)
144+
)
145+
}
80146
}
81147

82148
public func addRecipients(_ recipientsToAdd: [Addressee]) async {
@@ -216,7 +282,6 @@ extension CryptoContainer {
216282
CryptoContainer.logger().info("Is single file: \(isSingleFile, privacy: .public)")
217283
CryptoContainer.logger().info("Is crypto container: \(isCryptoContainer, privacy: .public)")
218284

219-
220285
guard isSingleFile && isCryptoContainer else {
221286
var defaultExtension = CommonsLib.Constants.Extension.DefaultCrypto
222287
if CDoc2Setting.isEncryptionEnabled {
@@ -362,17 +427,25 @@ extension CryptoContainer {
362427
fileManager: fileManager
363428
)
364429

365-
let isFileInTempCryptoContainersDirectory = containerFile.absoluteString.hasPrefix(
366-
cryptoContainersDirectory.appending(path: Constants.Folder.Temp, directoryHint: .isDirectory).absoluteString
430+
let savedContainersDirectory = try Directories.getCacheDirectory(
431+
subfolders: [Constants.Folder.SavedFiles],
432+
fileManager: fileManager
433+
)
434+
435+
// Do not rename when nested container opened
436+
let isFileInSavedContainersDirectory = containerFile.absoluteString.hasPrefix(
437+
savedContainersDirectory.absoluteString
367438
)
368439

369440
let isFileInRecentDocuments = containerFile.absoluteString.hasPrefix(
370441
cryptoContainersDirectory.absoluteString
371-
) && !isFileInTempCryptoContainersDirectory
442+
)
443+
444+
let shouldRenameContainer = isFileInRecentDocuments && !isFileInSavedContainersDirectory
372445

373446
var renamedContainerFile = containerFile
374447

375-
if !isFileInRecentDocuments {
448+
if shouldRenameContainer {
376449
renamedContainerFile = Container.shared.containerUtil().getContainerFile(
377450
for: containerFile,
378451
in: isFileInRecentDocuments ? containerFile.deletingLastPathComponent() :

Modules/CryptoLib/Sources/CryptoSwift/CryptoContainerProtocol.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public protocol CryptoContainerProtocol: GeneralContainer, Sendable {
2828
func getContainerName() async -> String
2929
func getContainerMimetype() async -> String
3030
func getRawContainerFile() async -> URL?
31-
func addDataFiles(_ filesToAdd: [URL]) async
31+
func addDataFiles(_ filesToAdd: [URL]) async throws
3232
func addRecipients(_ recipientsToAdd: [Addressee]) async
3333

3434
func getDataFiles() async -> [URL]

Modules/LibdigidocLib/Sources/LibdigidocSwift/SignedContainer.swift

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,6 @@ extension SignedContainer {
298298
@MainActor
299299
public static func openOrCreate(
300300
dataFiles: [URL],
301-
containerUtil: ContainerUtilProtocol = Container.shared.containerUtil(),
302301
isSivaConfirmed: Bool
303302
) async throws -> SignedContainerProtocol {
304303
logger().info("Opening or creating container. Found \(dataFiles.count) datafile(s)")

Modules/UtilsLib/Sources/UtilsLib/Mimetype/Parser/XMLParserHandler.swift

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@ final class XMLParserHandler: NSObject, XMLParserDelegate {
3838
) {
3939
let formatAttribute = attributeDict["format"]
4040
let nameAttribute = attributeDict["Name"]
41-
if elementName == "SignedDoc", (
42-
formatAttribute == "DIGIDOC-XML" || formatAttribute == "SK-XML"
43-
) {
41+
if elementName == "SignedDoc",
42+
formatAttribute == "DIGIDOC-XML" || formatAttribute == "SK-XML" {
4443
foundElement = .ddoc
4544
parser.abortParsing()
4645
} else if elementName == "denc:EncryptionProperty" &&

RIADigiDoc/UI/Component/Container/Crypto/CryptoDataFilesSection.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ struct CryptoDataFilesSection: View {
8282
showRemoveDataFileModal = true
8383
}
8484
)
85+
.alert(sivaMessage, isPresented: $showSivaMessage, actions: alertActions)
8586
.background(fileSaverBackground)
8687
.quickLookPreview($viewModel.previewFile)
8788
}

RIADigiDoc/UI/Component/Container/Crypto/EncryptView.swift

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ struct EncryptView: View {
202202
isEditContainerButtonShown: viewModel.isEditButtonShown,
203203
isSaveButtonShown: viewModel.isContainerEncrypted || viewModel.isContainerDecrypted,
204204
isSignButtonShown: viewModel.isSignButtonShown,
205-
isEncryptButtonShown: viewModel.isEncryptButtonShown,
205+
isEncryptButtonShown: false,
206206
showLeftActionButton: false,
207207
showRightActionButton: viewModel.isEncryptButtonShown ||
208208
viewModel.isDecryptButtonShown,
@@ -324,7 +324,8 @@ struct EncryptView: View {
324324
viewModel: viewModel,
325325
showOpenFileButton: viewModel.isContainerUnlocked,
326326
showSaveFileButton: viewModel.isContainerUnlocked,
327-
showRemoveFileButton: viewModel.isContainerWithoutRecipients,
327+
showRemoveFileButton: !viewModel.isContainerEncrypted &&
328+
!viewModel.isContainerDecrypted,
328329
isNestedContainer: isNestedContainer,
329330
selectedDataFile: $selectedDataFile,
330331
showSivaMessage: $showSivaMessage,
@@ -353,6 +354,7 @@ struct EncryptView: View {
353354
}
354355
}
355356
.padding(Dimensions.Padding.SPadding)
357+
356358
if viewModel.isShareButtonShown {
357359
if let containerFile = viewModel.containerURL {
358360
ShareButtonBottomBar(
@@ -362,25 +364,25 @@ struct EncryptView: View {
362364
containerUrl: containerFile
363365
)
364366
}
365-
} else if !viewModel.isContainerEncrypted && !viewModel.isContainerDecrypted {
366-
let rightButtonLabel = viewModel.isContainerWithoutRecipients ? nextLabel : encryptLabel
367-
let rightButtonIconName = viewModel.isContainerWithoutRecipients
368-
? "ic_m3_arrow_forward_48pt_wght400"
369-
: "ic_m3_encrypted_48pt_wght400"
367+
} else if viewModel.isContainerUnencrypted {
368+
let rightButtonLabel = viewModel.isContainerUnencrypted ? nextLabel : encryptLabel
369+
let rightButtonIconName = viewModel.isContainerUnencrypted
370+
? "ic_m3_arrow_forward_48pt_wght400"
371+
: "ic_m3_encrypted_48pt_wght400"
370372
UnsignedBottomBarView(
371-
showLeftButton: viewModel.isContainerWithoutRecipients,
373+
showLeftButton: viewModel.isContainerUnencrypted,
372374
leftButtonIconName: "ic_m3_add_48pt_wght400",
373375
leftButtonLabel: addMoreFilesLabel,
374376
leftButtonAccessibilityLabel: addMoreFilesLabel.lowercased(),
375377
leftButtonAction: {
376378
isImportingAddedFiles = true
377379
},
378-
rightButtonEnabled: viewModel.isContainerWithoutRecipients || encryptionButtonEnabled,
380+
rightButtonEnabled: viewModel.isContainerUnencrypted || encryptionButtonEnabled,
379381
rightButtonIconName: rightButtonIconName,
380382
rightButtonLabel: rightButtonLabel,
381383
rightButtonAccessibilityLabel: rightButtonLabel.lowercased(),
382384
rightButtonAction: {
383-
if viewModel.isContainerWithoutRecipients {
385+
if viewModel.isContainerUnencrypted {
384386
pathManager.replaceLast(to: .encryptRecipientView)
385387
} else {
386388
if encryptionButtonEnabled {

RIADigiDoc/UI/Component/Container/Crypto/Recipient/EncryptRecipientView.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,11 @@ struct EncryptRecipientView: View {
6868

6969
var body: some View {
7070
TopBarContainer(
71-
isTopBarHidden: isSearchExpanded,
7271
title: nil,
7372
onLeftClick: {
7473
pathManager.replaceLast(to: .encryptView(isWithEncryption: false))
7574
},
76-
showRightIcons: true,
75+
showRightIcons: !isSearchExpanded,
7776
content: {
7877
ZStack {
7978
VStack(alignment: .leading, spacing: Dimensions.Padding.ZeroPadding) {

RIADigiDoc/UI/Component/Container/Crypto/RecipientView.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,13 +147,15 @@ struct RecipientView: View {
147147
)
148148

149149
let certType = recipientUtil.getRecipientCertTypeText(certType: recipient.certType)
150-
Text(verbatim:
151-
"\(languageSettings.localized(certType)) " +
152-
"\(languageSettings.localized("Valid to", [validToDate]))")
153-
.font(typography.bodyMedium)
154-
.foregroundStyle(theme.onSurfaceVariant)
155-
.fixedSize(horizontal: false, vertical: true)
156-
.multilineTextAlignment(.leading)
150+
let validPart = validToDate.isEmpty
151+
? ""
152+
: " " + languageSettings.localized("Valid to", [validToDate])
153+
154+
Text(verbatim: languageSettings.localized(certType) + validPart)
155+
.font(typography.bodyMedium)
156+
.foregroundStyle(theme.onSurfaceVariant)
157+
.fixedSize(horizontal: false, vertical: true)
158+
.multilineTextAlignment(.leading)
157159
}
158160
.accessibilityElement(children: .combine)
159161

RIADigiDoc/UI/Component/Container/UnsignedBottomBarView.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ struct UnsignedBottomBarView: View {
8484
.disabled(!rightButtonEnabled)
8585
.foregroundStyle(theme.surfaceContainer)
8686
}
87-
.padding(.vertical,Dimensions.Padding.SPadding)
88-
.padding(.horizontal,Dimensions.Padding.MPadding)
87+
.padding(.vertical, Dimensions.Padding.SPadding)
88+
.padding(.horizontal, Dimensions.Padding.MPadding)
8989
.background(theme.surfaceContainer)
9090
}
9191
}

0 commit comments

Comments
 (0)